<!DOCTYPE HTML>
<html class='loading'>
<head>
	<!--<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">-->
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<title>OpenCell: Create Quotation</title>
	<!--<script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>-->
	<!-- XrmServiceToolkit libraries -->
	<script src="../scripts/xrmservicetoolkit.js" type="text/javascript"></script>
	<style type="text/css">

		.newClass{
			float: left;
		}

		.hidden{
			display:none;
		}

		table#detailsTable th
		{
			text-align: left;
			/* padding-bottom: 20px; */
			text-decoration: underline;
			/* padding-left: 25px; */
			padding-top: 10px;
		}

		table#prices th {
			text-align: left;
			/*min-width: 100px;*/
			padding-right: 10px;
		}
		table#prices td {
			text-align: left; 
		}
		table#prices tr
		{
			border-bottom: 1px solid gray;
		}
		table#prices 
		{
			border-collapse: collapse;
		}

		.formlabel{
			clear:left;
			display:block;
			/*float:left;*/
			/*text-align:right;*/
			/*margin:0 0 1em 0;*/
			padding:0 0.5em 0 0;
			/*width:10em;*/
		}

		.forminput{
			float:left;
			margin:0 0.5em 0.5em 0;
			width: 15em;
		}
		.req:after{
			content:"*" ;
			color:red   
		}

		input, select {
			font-family: "Segoe UI", "Helvetica Neue", Tahoma, "Microsoft Sans Serif", Verdana, sans-serif;
			font-size: 12px;
		}
		input[type="button"], input[type="submit"]
		{
			border: 1px solid gray;
			margin: 1px;
			text-align: center;
			display: inline-block;
			float: left;
			background: none;
		}
		input[type="checkbox"] 
		{
			width: auto;
		}
		/*loading animations*/
		html {
			font-family: "Segoe UI", "Helvetica Neue", Tahoma, "Microsoft Sans Serif", Verdana, sans-serif;
			font-size: 12px;
			-webkit-transition: background-color 1s;
			transition: background-color 1s;
		}
		html, body {
			/* For the loading indicator to be vertically centered ensure */
			/* the html and body elements take up the full viewport */
			min-height: 100%;
		}
		html.loading {
			/* Replace #333 with the background-color of your choice */
			/* Replace loading.gif with the loading image of your choice */
			background: rgba(93, 92, 92, 0.3) url('/_imgs/AdvFind/progress.gif') no-repeat 50% 50%;
			z-index: 9001;

			/* Ensures that the transition only runs in one direction */
			-webkit-transition: background-color 0;
			transition: background-color 0;
		}
		body {
			-webkit-transition: opacity 1s ease-in;
			transition: opacity 1s ease-in;
		}
		html.loading body {
			/* Make the contents of the body opaque during loading */
			opacity: 0.5;

			/* Ensures that the transition only runs in one direction */
			-webkit-transition: opacity 0.5;
			transition: opacity 0.5;
		}
		div
		{
			display: inline-flex;
			min-height: 100px;
		}

	</style>

	<script type="text/javascript">
	//var parameters = GetGlobalContext().getQueryStringParameters();

//Prototypes compatibility --------
	if (!String.prototype.endsWith) {
		String.prototype.endsWith = function(searchString, position) {
			var subjectString = this.toString();
			if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {
				position = subjectString.length;
			}
			position -= searchString.length;
			var lastIndex = subjectString.lastIndexOf(searchString, position);
			return lastIndex !== -1 && lastIndex === position;
		};
	}

	if (window.Element && !Element.prototype.closest) {
		Element.prototype.closest = 
		function(s) {
			var matches = (this.document || this.ownerDocument).querySelectorAll(s),
			i,
			el = this;
			do {
				i = matches.length;
				while (--i >= 0 && matches.item(i) !== el) {};
			} while ((i < 0) && (el = el.parentElement)); 
			return el;
		};
	}

	if (typeof Object.assign != 'function') {
  Object.assign = function(target, varArgs) { // .length of function is 2
    'use strict';
    if (target == null) { // TypeError if undefined or null
      throw new TypeError('Cannot convert undefined or null to object');
    }

    var to = Object(target);

    for (var index = 1; index < arguments.length; index++) {
      var nextSource = arguments[index];

      if (nextSource != null) { // Skip over if undefined or null
        for (var nextKey in nextSource) {
          // Avoid bugs when hasOwnProperty is shadowed
          if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
            to[nextKey] = nextSource[nextKey];
          }
        }
      }
    }
    return to;
  };
}
//End Prototypes compatibility --------


var Xrm = window.parent.Xrm;
var context = Xrm.context;
var url = Xrm.Page.context.getClientUrl();
var OrgServicePath = "/XRMServices/2011/Organization.svc/web";
url += OrgServicePath;
var contextEntityLogicalName = "quote";
var contextEntityId = Xrm.Page.data.entity.getId();
	//var contextEntityId = "8E693EA7-8DE0-E511-80EB-5065F38B9471";
	//var contextEntityId = "00000000-0000-0000-0000-000000000000";
	var step;
	var fieldQuoteName = "";
	var fieldValidityDate = "";
	var fieldDuration = "";
	var checkedOneService = false;
	var chosenOp;
	var subsServices;
	var offerJSON;
	var serviceJSON;	
	
	var lcid = Xrm.Page.context.getUserLcid();
	var filename = "../scripts/"+lcid+".js";
	var fileref=document.createElement('script');
	fileref.setAttribute("type","text/javascript");
	fileref.setAttribute("src", filename);
	document.getElementsByTagName("head")[0].appendChild(fileref)
	//Global resources
	var lbl_Quantity = "Quantity";
	var lbl_Total = "Total";
/*	var lbl_CreationQuote = "Creation Quote";
	var lbl_AccountName = "Nom Compte";
	var lbl_OpportunityName = "Nom Opportunit&#233;";
	var lbl_QuoteName = "Nom Devis";
	var lbl_ValidityDate = "Date de Validit&#233;";
	var lbl_Duration = "Dur&#233;e (Moins)";
	var lbl_Service = "Service";
	var lbl_Criteria = "Criteria";
	var lbl_Price = "Prix";
	var lbl_OverridePrice = "Prix Client";
	var btn_Back = "Retour";
	var btn_Next = "Suivant";
	var btn_Done = "Enregistrer";
	var rbtn_NewSubscription = "Nouvelle souscription";
	var rbtn_TerminateSubscription = "Mettre fin Ã  ma souscription existante";
	var rbtn_ChangeSubscription = "Changer la souscription  en cours";
	var rbtn_RenewSubscription = "Renouveler souscription";
	var lbl_ErrorRequiredFields = "S&#39;il vous pla&#238;t remplir tous les champs obligatoires.";
	var lbl_ErrorRequiredService = "S&#39;il vous pla&#238;t, choisissez au moins un service.";
	var lbl_Subscription = "Souscription";
	var lbl_SubsDate = "Date de Souscription";
	var lbl_RenewDate = "Date de Renouvellement";
	var lbl_RenewDur = "DurÃ©e de Renouvellement (Mois)";
	var lbl_EndDate ="Date de fin de Souscription";
	var optn_SelectSub = "SÃ©lectionnez un Souscription";

	//Luis Mance 4/7/2016 10:51 PM PHP TIME
	var lbl_SubStartDate="Date de dÃ©but"
	var lbl_EverTermed="Avec Date de Fin"
	var lbl_TermInMonths="DurÃ©e En Mois"
	var lbl_GenerateInvoice="GÃ©nÃ©rer Facture ImmÃ©diatement"; 

	var lbl_CreationQuote = "Quote Creation";
	var lbl_AccountName = "Account Name";
	var lbl_OpportunityName = "Opportunity Name";
	var lbl_QuoteName = "Quote Name";
	var lbl_ValidityDate = "Validity Date";
	var lbl_Duration = "Duration (Months)";
	var lbl_Service = "Service";
	var lbl_Criteria = "Criteria";
	var lbl_Price = "Price";
	var lbl_OverridePrice = "Client Price";
	var btn_Back = "Back";
	var btn_Next = "Next";
	var btn_Done = "Save";
	var rbtn_NewSubscription = "New Subscription";
	var rbtn_TerminateSubscription = "Terminate Subscription";
	var rbtn_ChangeSubscription = "Update Subscription";
	var rbtn_RenewSubscription = "Renew Subscription";
	var lbl_ErrorRequiredFields = "Please, fill in all the required fields";
	var lbl_ErrorRequiredService = "Please, select at least one Service";
	var lbl_Subscription = "Subscription";
	var lbl_SubsDate = "Subscription Date";
	var lbl_RenewDate = "Renewal Date";
	var lbl_RenewDur = "Renewal Duration (Months)";
	var lbl_EndDate ="Subscription End Date";
	var optn_SelectSub = "Select a Subscription";
	
	var lbl_quoteDetails = "Quote Details";
	var lbl_subscriptionDetails = "Subscription Details";
	var lbl_subsToRenew = "Subscription To Renew";
	var lbl_renewal = "Renewal";
	var lbl_Offers = "Offers";
	var lbl_Services = "Services";

	//Luis Mance 4/7/2016 10:51 PM PHP TIME
	var lbl_SubStartDate="Start Date";
	var lbl_EverTermed="Termed";
	var lbl_TermInMonths="Term in Months";
	var lbl_GenerateInvoice="Generate Invoice Immediately"; */
	
	var datePlaceHolder = "mm/dd/yyyy";
	
	var subscriptionEntity = new XrmServiceToolkit.Soap.BusinessEntity("ocl_subscription");
	//Luis Mance 4/7/2016 10:51 PM PHP TIME
	function validateAndSave()
	{
		getDirtyFields();
		Xrm.Page.data.entity.save();
	}
	function loadPage(){
		debugger;
		
		var creationProcessFinished = Xrm.Page.getAttribute("ocl_quotecreationprocessfinished").getValue();
		if (creationProcessFinished)
			return;

		loadStart();
		//loadLabels(); //Not needed anymore - Labels come from separate JS based on user chosen language

		var createProcessStep = Xrm.Page.getAttribute("ocl_quotecreationprocessstep");
		if (!chosenOp && createProcessStep.getValue() != 0)
		{
			var op = Xrm.Page.getAttribute("ocl_typedevis").getValue();
			if (op == 0){
				chosenOp = "new";
			}
			else if(op == 1){
				chosenOp = "renew";
			}
			else if(op == 2)
			{
				chosenOp = "close";
			}
			else
			{
				Xrm.Page.getAttribute("ocl_quotecreationprocessstep").setValue(0);
				Xrm.Page.getAttribute("ocl_quotecreationprocessstep").setSubmitMode("always");
				validateAndSave();
				//setProcessStep();

			}

			loadPage();
		}

		step = createProcessStep.getValue();

		document.getElementById("errorDiv").innerHTML = "";
		document.getElementById("back").value = btn_Back;
		document.getElementById("next").value = btn_Next;
		document.getElementById("done").value = btn_Done;
		buttonsDisplay();
		if (step == 0) {
			chooseOperation();
		}
		else if (step == 1) {
			fillDetails();
		}
		else if(step == 2){
			if (chosenOp == "new")
				chooseOffer();
			else if(chosenOp == "renew")
				chooseServices();
		}
		/*else if(step == 3){	
			if (serviceJSON && document.getElementById("services"))
				nextStep();
			else	
				chooseServices();
		}*/
		else if(step == 3){
			listPrices();		
		}
		else
		{
			chooseOperation();
		}

		validateAndSave();
		loadFinish();	
	}
	function loadLabels(){
		//DELETE function
		var userLang = navigator.language || navigator.userLanguage; 
		
		lbl_SubStartDate="Start Date";
		lbl_EverTermed="Termed";
		lbl_TermInMonths="Term In Months";
		lbl_GenerateInvoice="Generate Invoice Immediately";

//JR - 17/05/2016 - Commented following "if"
		/*if(userLang == "fr-FR"){
			lbl_SubStartDate="Date de début"
			lbl_EverTermed="Avec Date de Fin"
			lbl_TermInMonths="Durée en Mois"
			lbl_GenerateInvoice="Générer Facture Immédiatement";
		}*/
	}
	function loadStart(){
		var html = document.getElementsByTagName( "html" )[0];
		if (html.className != "loading"){
			html.className += "loading";
			html.getElementsByTagName("body")[0].style.disabled = true;
		}
	}
	function loadFinish(){
		var html = document.getElementsByTagName( "html" )[0];
		html.getElementsByTagName("body")[0].style.disabled = false;
		html.className = "";
	}

	function buttonsDisplay(){
		if (step == 3 || (step == 1 && (chosenOp == "close" || chosenOp == "renew")))
		{
			document.getElementById("done").style.display = "inline-block";
			document.getElementById("next").style.display = "none";
		}
		else
		{
			document.getElementById("done").style.display = "none";
			document.getElementById("next").style.display = "inline-block";
		}
	}

	function nextStep(){
		loadStart();

		if (step == 2) 
		{
			createServicesRecords();

			if (!checkedOneService) {
				document.getElementById("errorDiv").innerHTML = lbl_ErrorRequiredService;

				loadFinish();
				return;
			}
		}
		if (step == 1) 
		{

			var form = document.forms["details"];
			if(!form.checkValidity())
			{			
				var inputs = document.forms["details"].getElementsByTagName("input");
				for (var i = 0, len = inputs.length; i < len; i++) 
				{
					if (!inputs[i].checkValidity())
						inputs[i].style.border = "1px solid red";
					else
						inputs[i].style.border = "2px inset";

				}

				document.getElementById("errorDiv").innerHTML = lbl_ErrorRequiredFields;
				loadFinish();
				return;
			}

			if (chosenOp == "new") 
			{
				fieldQuoteName = document.getElementById("quotename").value;
				fieldValidityDate = document.getElementById("validitydate").value;
			//fieldDuration = document.getElementById("duration").value;
		}
	}
	if (step == 0) 
	{		
		chosenOp = getChosenOperation();
	}
	
	document.getElementById("errorDiv").innerHTML = "";	
	
	/* Move process
	var activeProcess = Xrm.Page.data.process.getActiveProcess();
	if (activeProcess != null) {
  	setTimeout(Xrm.Page.data.process.moveNext(null),4000);
	};
	*/
	/*if (step == 1 && chosenOp == "renew")
		Xrm.Page.getAttribute("ocl_quotecreationprocessstep").setValue(step+2);
		else
			return;
		*/
		var stepField = Xrm.Page.getAttribute("ocl_quotecreationprocessstep");
		stepField.setValue(step+1);
		stepField.setSubmitMode("always");
		//stepField.fireOnChange();
		validateAndSave();

	//setProcessStep();		
	moveNext(Xrm.Page.data.process.getActiveStage().getName());

	loadPage();
}

function prevStep(){
	loadStart();

	var stepField = Xrm.Page.getAttribute("ocl_quotecreationprocessstep");
	if (step != 0)
	{

		checkedOneService = false;
		
		//
		/* move process
		var activeProcess = Xrm.Page.data.process.getActiveProcess();
		if (activeProcess != null) {
		  setTimeout(Xrm.Page.data.process.movePrevious(null),4000);
		};
		*/

		/*if ((chosenOp=="renew" && step == 3) || (chosenOp=="renew" && step == 4))
			stepField.setValue(step-2);
			else*/
				stepField.setValue(step-1);	

			if (step == 3)
			{

				deleteServicesRecords();
			}
		}

	//setProcessStep();

	stepField.setSubmitMode("always");
	stepField.fireOnChange();
	validateAndSave();
	movePrev(Xrm.Page.data.process.getActiveStage().getName());
	loadPage();
}

function changeProcessStepResult(result) {
	if (result == "success") {
		var step = Xrm.Page.getAttribute("ocl_quotecreationprocessstep").getValue();
		var bpFlow = Xrm.Page.data.process.getActiveProcess();
		Xrm.Page.data.process.setActiveStage(bpFlow.getStages().getByIndex(step).getId());
	} 
	else 
	{
    // ** Code for failure goes here
    alert("Had an Issue");
}
}

function copyServicesFromOriginalSubscription()
{
	debugger;
	var drop = document.getElementById("subscriptions");
	var subId = drop.options[drop.options.selectedIndex].value;

	var fetch = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>"
	+"  <entity name='ocl_listofservices'>"
	+"    <all-attributes />"
	+"    <filter type='and'>"
	+"      <condition attribute='ocl_subscription' operator='eq' value='"+subId+"' />"
	+"    </filter>"
	+"  </entity>"
	+"</fetch>";
	
	var results = null

	try {
		results = XrmServiceToolkit.Soap.Fetch(fetch);

	} catch (e) {
		results = new Object();
	}

	if (results && results.length > 0) 
	{
		for (let i = 0; i < results.length; i++) {
			var newServ = new XrmServiceToolkit.Soap.BusinessEntity("ocl_listofservices");
			Object.assign(newServ.attributes, results[i].attributes);
			//remove unwanted info
			delete newServ.attributes["createdby"];
			delete newServ.attributes["createdon"];
			delete newServ.attributes["modifiedby"];
			delete newServ.attributes["modifiedon"];
			delete newServ.attributes["ownerid"];
			delete newServ.attributes["owningbusinessunit"];
			delete newServ.attributes["owninguser"];
			delete newServ.attributes["statecode"];
			delete newServ.attributes["statuscode"];
			delete newServ.attributes["ocl_listofservicesid"];
			delete newServ.attributes["ocl_subscription"];

			if (!newServ.attributes["ocl_quote"])			
				newServ.attributes["ocl_quote"] = { id : contextEntityId, logicalName : contextEntityLogicalName, type : 'EntityReference' };
			else
				newServ.attributes["ocl_quote"].id = Xrm.Page.data.entity.getId();

			XrmServiceToolkit.Soap.Create(newServ);
		}
	}

}
function validateDetailsForm()
{
	var form = document.forms["details"];
	if(!form.checkValidity())
	{			
		var inputs = document.forms["details"].getElementsByTagName("input");
		for (var i = 0, len = inputs.length; i < len; i++) 
		{
			if (!inputs[i].checkValidity())
				inputs[i].style.border = "1px solid red";
			else
				inputs[i].style.border = "2px inset";

		}

		document.getElementById("errorDiv").innerHTML = lbl_ErrorRequiredFields;
				//loadFinish();
				return false;
			}
			else
				return true;

		}
		function finishCreationProcess(){

	/*if (chosenOp != "close"){
		if (chosenOp != "renew")
			savePricesInService();

		Xrm.Page.getAttribute("ocl_quotecreationprocessfinished").setValue(true);
		Xrm.Page.getAttribute("ocl_quotecreationprocessstep").setValue(4);
	}
	else
	{
		Xrm.Page.getAttribute("ocl_endagreementdate").setValue(new Date(document.getElementById("termdate").value));
		Xrm.Page.getAttribute("ocl_endagreementdate").setSubmitMode("always");
		Xrm.Page.getAttribute("ocl_quotecreationprocessfinished").setValue(true);
		Xrm.Page.getAttribute("ocl_quotecreationprocessstep").setValue(4);
	}
	*/
	if (chosenOp == "close") {
		if (!validateDetailsForm())
			return;
		Xrm.Page.getAttribute("ocl_endagreementdate").setValue(new Date(document.getElementById("termdate").value));
		Xrm.Page.getAttribute("ocl_endagreementdate").setSubmitMode("always");
		copyServicesFromOriginalSubscription();		
	}
	else if (chosenOp == "renew")
	{
		if (!validateDetailsForm())
			return;
		copyServicesFromOriginalSubscription();
	}
	else if(chosenOp == "new")
	{
		savePricesInService();
	}

	Xrm.Page.getAttribute("ocl_quotecreationprocessfinished").setValue(true);
	Xrm.Page.getAttribute("ocl_quotecreationprocessstep").setValue(4);
	Xrm.Page.getAttribute("ocl_quotecreationprocessfinished").setSubmitMode("always");
	
	validateAndSave();
	//setProcessStep();
	//window.parent.location.reload();
	Xrm.Utility.openEntityForm("quote", contextEntityId);
}

function chooseOperation(){
	//alert("chooseOperation");
	drawOperationForm();
}

function getChosenOperation()
{
	debugger;
	var val = getRadioChecked(document.getElementById("operations"), "operation").value;
	var typeDevis = Xrm.Page.getAttribute("ocl_typedevis");
	var type;
	if (val == "new")
		type = 0;
	else if(val == "renew")
		type = 1;
	else if(val == "close")
		type = 2;

	typeDevis.setValue(type);
	typeDevis.setSubmitMode("always");
	validateAndSave();
	return val;
}

function savePricesInService(){
	//get prices table
	
	var table  = document.getElementById("prices");
	var rows = table.getElementsByTagName("tr");
	var services = getQuoteServices(contextEntityId);
	//for each row:
	for (var i = 1, len = rows.length; i < len; i++) {
		var input = rows[i].getElementsByTagName("input")[0];
		var overriddenPrice;
		var defaultPrice = rows[i].getElementsByTagName("td")[2].textContent;
		var matrice = rows[i].getElementsByTagName("td")[4].textContent;
		var fitlerCriteria = rows[i].getElementsByTagName("td")[5].textContent;
		var quantity = rows[i].getElementsByTagName("td")[6].childNodes[0].value;
		
		if (isNaN(parseFloat(quantity)))
			quantity = "1";

	//. get service name
	var serviceName = input.name.trim();
	//. get value from input
	// 	-> case null, get value from "Value" collumn
	if (input.value)
		overriddenPrice = input.value;
	else
		overriddenPrice = defaultPrice;

	var filterCriteriaFinal="";
	if (fitlerCriteria.trim() == "") {
		filterCriteriaFinal = overriddenPrice;
	}
	else{
		filterCriteriaFinal = "{'"+fitlerCriteria+"':"+overriddenPrice+"}";
	}

	//. save price in service record
	for (var j = 0, jlen = services.length; j<jlen; j++) 
	{
		if (services[j].attributes["ocl_name"].value == serviceName) 
		{
			var be = services[j];
			be.attributes["ocl_defaultprice"] = {value: parseFloat(defaultPrice), type:'Money'};
			be.attributes["ocl_overriddenprice"] = {value: parseFloat(overriddenPrice), type:'Money'};
			be.attributes["ocl_matrice"] = matrice;
			be.attributes["ocl_filtercriteria"] = filterCriteriaFinal;
			be.attributes["ocl_quantity"] = {value: parseFloat(quantity), type:'double'};
			XrmServiceToolkit.Soap.Update(be,null);
			break;
		}
		
	}

}
}

function createServicesRecords(){
	var form = document.getElementById("services");
	if (!form)
		return;
	var services = form.getElementsByTagName("input");
	for (var i = 0, len = services.length; i < len; i++) {
		if (services[i].checked)
		{			
			var entity = new XrmServiceToolkit.Soap.BusinessEntity("ocl_listofservices");
			entity.attributes["ocl_name"] = services[i].id;
			entity.attributes["ocl_description"] = services[i].value;
			entity.attributes["ocl_quote"] = { id : contextEntityId, logicalName : contextEntityLogicalName, type : 'EntityReference' };			

//JR - FIX: instantiate all fields with default values
entity.attributes["ocl_defaultprice"] = {value: parseFloat(0), type:'Money'};
entity.attributes["ocl_overriddenprice"] = {value: parseFloat(0), type:'Money'};
			//entity.attributes["ocl_matrice"] = "null";
			//entity.attributes["ocl_filtercriteria"] = "null";
			entity.attributes["ocl_quantity"] = {value: parseFloat(0), type:'decimal'};

			XrmServiceToolkit.Soap.Create(entity);
			
			checkedOneService = true;
		}
	}
}

function deleteServicesRecords(){
	//fetch all related services
	var services = getQuoteServices(contextEntityId);
	//delete all related services
	for (var i = 0, len = services.length; i < len; i++) 
	{
		XrmServiceToolkit.Soap.Delete(services[i].logicalName,services[i].id,null);
	}
}

function getQuoteServices(id){
	var fetch = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false' no-lock='true'>"
	+"  <entity name='ocl_listofservices'>"
	+"    <attribute name='ocl_listofservicesid' />"
	+"    <attribute name='ocl_name' />"
	+"    <attribute name='ocl_status' />"
	+"    <attribute name='ocl_quote' />"
	+"    <attribute name='ocl_quantity' />"
	+"    <attribute name='ocl_description' />"
	+"    <order attribute='ocl_name' descending='false' />"
	+"    <filter type='and'>"
	+"      <condition attribute='ocl_quote' operator='eq' value='"+id+"' />"
	+"    </filter>"
	+"  </entity>"
	+"</fetch>";


	var results = null

	try {
		results = XrmServiceToolkit.Soap.Fetch(fetch);

	} catch (e) {
		results = new Object();
	}

	return results;
}

function fillDetails(){
	
	var customer = Xrm.Page.getAttribute("customerid");
	var opportunity = Xrm.Page.getAttribute("opportunityid");
	if (!fieldQuoteName || fieldQuoteName == "") {fieldQuoteName = Xrm.Page.getAttribute("name").getValue();}
	if (chosenOp == "new") 
	{
		//Xrm.Page.getAttribute("ocl_typedevis").setValue(0);
		//Xrm.Page.getAttribute("ocl_typedevis").setSubmitMode("always");
		
		//validateAndSave();

		var form = "<form id='details'>"

		+"<table id='detailsTable'><tr>"
		+"<th>"+lbl_quoteDetails+":</th></tr><tr><td>"
		+"<label for='account' class='formlabel'>" + lbl_AccountName + "</label>"
		+"<input type='text' name='account' class='forminput' value='"+customer.getValue()[0].name+"' disabled/>"
		+"</td>"
		+"<td>"
		+"<label for='opportunity' class='formlabel'>" + lbl_OpportunityName + "</label>"
		+"<input type='text' name='opportunity' class='forminput'value='"+opportunity.getValue()[0].name+"' disabled/>"
		+"</td>"
		+"<td>"
		+"<label for='quote' class='formlabel req'>" + lbl_QuoteName + "</label>"
		+"<input type='text' id='quotename' name='quote' class='forminput' onchange='setQuoteName()' value='"+fieldQuoteName+"' required/>"
		+"</td>"
		+"</tr>"
		+"<tr>"		
		+"<td>"
		+"<label for='validity' class='formlabel req'>" + lbl_ValidityDate + "</label>"
		+"<input type='date' id='validitydate' name='validity' class='forminput' onchange='setValidityDate()' placeholder='"+datePlaceHolder+"' required />"
		+"</td>"
		+"</tr>"


		+"<tr><th>"+lbl_subscriptionDetails+":</th></tr><tr>"
		+"<td>"
		+"<label for='subStartDate' class='formlabel req'>" + lbl_SubStartDate + "</label>"
		+"<input type='date' id='subStartDate' name='subStartDate' class='forminput' placeholder='"+datePlaceHolder+"' onchange='setValidityDate()' required/>"
		+"</td>"

		+"<td>"
		+"<label for='isTermed' class='formlabel'>" + lbl_EverTermed + "</label>"
		+"<select id='isTermed' name='isTermed' class='forminput' value='' required onchange='setTermVisibility()'>"
		+"<option value='noterm'>No Term</option>"
		+"<option value='termed'>Termed</option>"
		+"</select>"
		+"</td>"

		+"<td>"
		+"<label id='termInMonthsLabel' for='termInMonths' class='formlabel req'>" + lbl_TermInMonths + "</label>"
		+"<input type='number' id='termInMonths' name='termInMonths' class='forminput' onchange='setDuration()' />"
		+"</td>"

		+"</tr><tr>"
		+"<td>"
		+"<label for='genInvImm' class='formlabel'>" + lbl_GenerateInvoice + "</label>"
		+"<input type='checkbox' id='genInvImm' name='genInvImm' class='forminput'/>"
		+"</td></tr></table>"
		//+"<label for='duration' class='formlabel req'>" + lbl_Duration + "</label>"+"<input type='number' id='duration' name='duration' class='forminput' onchange='setDuration()' required />
		+"</form>";

		document.getElementById("main").innerHTML = form;

		document.getElementById("quotename").value = fieldQuoteName;
		document.getElementById("validitydate").value = fieldValidityDate;
		document.getElementById("termInMonths").value = fieldDuration;

		document.getElementById("termInMonths").style.visibility = 'hidden';
		document.getElementById("termInMonthsLabel").style.visibility = 'hidden';
	}
	else if(chosenOp == "renew")
	{
		//Xrm.Page.getAttribute("ocl_typedevis").setValue(1);
		//Xrm.Page.getAttribute("ocl_typedevis").setSubmitMode("always");

		//validateAndSave();

		var subs = getAccountSubscriptions(customer, opportunity);
		var options ="<option value=''>"+optn_SelectSub+"</option>";
		for (var i = 0, len = subs.length; i < len; i++) {
			options+="<option value='"+subs[i].id+"'>"+subs[i].attributes["ocl_name"].value+"</option>";
		}

		var startDate = new Date();
		var dur = 0;
		var endDate = new Date(startDate);
		endDate.setMonth(endDate.getMonth()+dur);
		var form = "<form id='details'>"
		+"<table id='detailsTable'>"
		+"<tr>"	
		+"<th>"+lbl_quoteDetails+":</th>"
		+"</tr><tr>"
		+"<td>"
		+"<label for='account' class='formlabel'>" + lbl_AccountName + "</label><input type='text' name='account' class='forminput' value='"+customer.getValue()[0].name+"' disabled/>"
		+"</td>"
		+"<td>"
		+"<label for='opportunity' class='formlabel'>" + lbl_OpportunityName + "</label><input type='text' name='opportunity' class='forminput'value='"+opportunity.getValue()[0].name+"' disabled/>"
		+"</td>"
		+"<td>"
		+"<label for='quote' class='formlabel req'>" + lbl_QuoteName + "</label>"
		+"<input type='text' id='quotename' name='quote' class='forminput' onchange='setQuoteName()' value='"+fieldQuoteName+"' required/>"
		+"</td></tr>"
		+"<tr><th>"+lbl_subsToRenew+":</th>"
		+"</tr><tr>"	
		+"<td>"
		+"<label for='subscription' class='formlabel req'>" + lbl_Subscription + "</label><select id='subscriptions' class='forminput' onchange='getSubscriptionData()' required>"+options+"</select>"
		+"</td>"
		+"<td>"
		+"<label for='subsdate' class='formlabel'>" + lbl_SubsDate + "</label><input type='date' id='subsdate' name='subsdate' class='forminput' placeholder='mm/dd/yyyy' disabled />"
		+"</td>"
		+"<td>"
		+"<label for='subsenddate' class='formlabel'>" + lbl_EndDate + "</label><input type='date' id='subsenddate' name='subsenddate' class='forminput' placeholder='mm/dd/yyyy' disabled />"
		+"</td></tr>"
		+"<tr><th>"+lbl_renewal+":</th>"
		+"</tr><tr>"	
		+"<td>"
		+"<label for='renewdate' class='formlabel req'>" + lbl_RenewDate + "</label><input type='date' id='renewdate' name='renewdate' class='forminput'value='"+parseDateForInput( startDate)+"' required 	onchange='calcEndDate()'/> </td>"	
		+"<td><label for='renewdur' class='formlabel req'>" + lbl_RenewDur + "</label><input type='number' id='renewdur' name='renewdur' class='forminput'value='"+dur+"' required onchange='calcEndDate()' required/>"
		+"</td>"
		+"<td><label for='enddate' class='formlabel'>" + lbl_EndDate + "</label><input type='date' id='enddate' name='enddate' class='forminput'value='' disabled/>"
		+"</td>"
		+"</tr>"
		+"</table>"
		+"</form>";
		document.getElementById("main").innerHTML = form;
		calcEndDate();
	}
	else if (chosenOp == "close")
	{
		var subs = getAccountSubscriptions(customer, opportunity);
		var options ="<option value=''>"+optn_SelectSub+"</option>";
		for (var i = 0, len = subs.length; i < len; i++) {
			options+="<option value='"+subs[i].id+"'>"+subs[i].attributes["ocl_name"].value+"</option>";
		}

		var closeDate = new Date();
		var dur = 0;
		var endDate = new Date(startDate);
		endDate.setMonth(endDate.getMonth()+dur);
		var form = "<form id='details'>"
		+"<table id='detailsTable'>"
		+"<tr>"
		+"<th>"+lbl_quoteDetails+":</th>"
		+"</tr><tr>"
		+"<td>"
		+"<label for='account' class='formlabel'>" + lbl_AccountName + "</label><input type='text' name='account' class='forminput' value='"+customer.getValue()[0].name+"' disabled/>"
		+"</td>"
		+"<td>"
		+"<label for='opportunity' class='formlabel'>" + lbl_OpportunityName + "</label><input type='text' name='opportunity' class='forminput'value='"+opportunity.getValue()[0].name+"' disabled/>"
		+"</td>"
		+"<td>"
		+"<label for='quote' class='formlabel req'>" + lbl_QuoteName + "</label>"
		+"<input type='text' id='quotename' name='quote' class='forminput' onchange='setQuoteName()' value='"+fieldQuoteName+"' required/>"
		+"</td></tr>"
		+"<tr><th>"+lbl_subsToClose+":</th>"
		+"</tr><tr>"
		+"<td>"
		+"<label for='subscription' class='formlabel req'>" + lbl_Subscription + "</label><select id='subscriptions' class='forminput' onchange='getSubscriptionData()' required>"+options+"</select>"
		+"</td>"
		+"<td>"
		+"<label for='subsdate' class='formlabel'>" + lbl_SubsDate + "</label><input type='date' id='subsdate' name='subsdate' class='forminput' placeholder='mm/dd/yyyy' disabled />"
		+"</td>"
		+"<td>"
		+"<label for='subsenddate' class='formlabel'>" + lbl_EndDate + "</label><input type='date' id='subsenddate' name='subsenddate' class='forminput' placeholder='mm/dd/yyyy' disabled />"
		+"</td></tr>"
		+"<tr><th>"+lbl_Terminate+":</th>"
		+"</tr><tr>"
		+"<td>"
		+"<label for='renewdate' class='formlabel req'>" + lbl_TermDate + "</label><input type='date' id='termdate' name='termdate' class='forminput'value='"+parseDateForInput(closeDate)+"' required 	onchange='calcEndDate()'/> </td>"
		//+"<td><label for='renewdur' class='formlabel req'>" + lbl_RenewDur + "</label><input type='number' id='renewdur' name='renewdur' class='forminput'value='"+dur+"' required onchange='calcEndDate()' required/>"
		//+"</td>"
		+"<td><label for='enddate' class='formlabel'>" + lbl_TermReason + "</label><input type='text' id='termreason' name='termreason' class='forminput'value=''/>"
		+"</td>"
		+"</tr>"
		+"</table>"
		+"</form>";
		document.getElementById("main").innerHTML = form;

	}

	Xrm.Page.getAttribute("ocl_quotecreationprocessstep").setSubmitMode("always");
	validateAndSave();
}

function calcEndDate(){
	var startDate = document.getElementById("renewdate").value;
	var duration = document.getElementById("renewdur").value;
	var renewDate = document.getElementById("renewdate").value;
	var endDate = new Date(startDate);
	endDate.setMonth(endDate.getMonth()+parseInt(duration));
	document.getElementById("enddate").setAttribute("value",parseDateForInput(endDate));
	//document.getElementById("enddate").innerHTML = endDate;
	Xrm.Page.getAttribute("ocl_sub_startdate").setValue(new Date(startDate));
	Xrm.Page.getAttribute("ocl_renewaldate").setValue(new Date(renewDate));
	Xrm.Page.getAttribute("ocl_endagreementdate").setValue(endDate);

	Xrm.Page.getAttribute("ocl_sub_startdate").setSubmitMode("always");
	Xrm.Page.getAttribute("ocl_renewaldate").setSubmitMode("always");
	Xrm.Page.getAttribute("ocl_endagreementdate").setSubmitMode("always");	

}

function parseDateForInput(date){
	debugger;
	var dateStr ="";
	date = new Date(date);
	var year = date.getFullYear();
	var month = date.getMonth()+1;
	if (month<10)
		month = "0"+month;
	//var day = date.getUTCDate();
	var day = date.getDate();
	if (day<10)
		day="0"+day;
	return year+"-"+month+"-"+day;
}

function getSubscriptionData(){

	
	var drop = document.getElementById("subscriptions");
	var subId = drop.options[drop.options.selectedIndex].value;
	if (!subId)
	{
		document.getElementById("errorDiv").innerHTML = "Select a subscription!";
	}

	sub = getSubscriptionById(subId);

	var subDateField = document.getElementById("subsdate");
	var subEndDateField = document.getElementById("subsenddate");
	if (sub && sub.length > 0) 
	{
		subDateField.value= parseDateForInput(sub[0].attributes["ocl_subscriptiondate"].value);
		if (sub[0].attributes["ocl_terminationdate"])
			subEndDateField.value= parseDateForInput(sub[0].attributes["ocl_terminationdate"].value);

		Xrm.Page.getAttribute("ocl_offerid").setValue(sub[0].attributes["ocl_offerid"].value);
		Xrm.Page.getAttribute("ocl_offername").setValue(sub[0].attributes["ocl_offre"].value);		

		var subER = new Array();
		subER[0] = new Object();
		subER[0].id = sub[0].id;
		subER[0].name = sub[0].attributes["ocl_name"].value;
		subER[0].entityType = sub[0].logicalName;
		Xrm.Page.getAttribute("ocl_originalsubscription").setValue(subER);

		Xrm.Page.getAttribute("ocl_offerid").setSubmitMode("always");
		subsServices = getServices(subId);
		validateAndSave();
	}
	else
		subDateField.value = null;
}

function getSubscriptionById(subId){
	var fetch ="<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false' no-lock='true'>"
	+"  <entity name='ocl_subscription'>"
	+"    <attribute name='ocl_subscriptionid' />"
	+"    <attribute name='ocl_subscriptiondate' />"
	+"    <attribute name='ocl_terminationdate' />"
	+"    <attribute name='ocl_offerid' />"
	+"    <attribute name='ocl_offre' />"
	+"    <order attribute='ocl_name' descending='false' />"
	+"    <filter type='and'>"
	+"      <condition attribute='ocl_subscriptionid' operator='eq' value='"+subId+"' />"
	+"    </filter>"
	+"  </entity>"
	+"</fetch>";
	var results = null

	try {
		results = XrmServiceToolkit.Soap.Fetch(fetch);

	} catch (e) {
		results = new Object();
	}
	return results;
}

function getAccountSubscriptions(customer, opportunity){
	var fetch ="<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false' no-lock='true'>"
	+"  <entity name='ocl_subscription'>"
	+"    <attribute name='ocl_subscriptionid' />"
	+"    <attribute name='ocl_name' />"
	+"    <order attribute='ocl_name' descending='false' />"
	+"    <filter type='and'>"
	+"      <condition attribute='ocl_accountid' operator='eq' value='"+customer.getValue()[0].id+"' />"
	+"      <condition attribute='statecode' operator='ne' value='1' />"
	//+"      <condition attribute='ocl_opporunityid' operator='eq' value='"+opportunity.getValue()[0].id+"' />"
	+"    </filter>"
	+"  </entity>"
	+"</fetch>";

	var results = null

	try {
		results = XrmServiceToolkit.Soap.Fetch(fetch);

	} catch (e) {
		results = new Object();
	}

	return results;
}

function setQuoteName(){
	Xrm.Page.getAttribute("name").setValue(document.getElementById("quotename").value);
	validateAndSave();
}

function setValidityDate(){	
	Xrm.Page.getAttribute("ocl_sub_startdate").setValue(new Date(document.getElementById("subStartDate").value.replace(/-/g,'/')));
	Xrm.Page.getAttribute("ocl_validitydate").setValue(new Date(document.getElementById("validitydate").value.replace(/-/g,'/')));
	validateAndSave();
}

function setDuration(){
	var termInMonths = parseInt(document.getElementById("termInMonths").value);
	if(termInMonths > 0){
		Xrm.Page.getAttribute("ocl_contractduration").setValue(termInMonths);
		validateAndSave();
	}else{
		document.getElementById("termInMonths").value = 0;
	}
}

function setTermVisibility(){
	var isTermed = document.getElementById("isTermed");
	var termInMonths = document.getElementById("termInMonths");
	var termInMonthsLabel = document.getElementById("termInMonthsLabel");
	if(isTermed.value == 'termed'){
		termInMonths.style.visibility = 'visible';
		termInMonths.required = true;
		termInMonthsLabel.style.visibility = 'visible';
	}else{
		termInMonths.style.visibility = 'hidden';
		termInMonths.required = false;		
		termInMonthsLabel.style.visibility = 'hidden';
	}
}
//Luis Mance 4/7/2016 10:51 PM PHP TIME

function chooseOffer(){	
	getOffersFromWS();
}

function chooseServices(){
	getServicesFromWS();
	if (chosenOp == "renew")
		selectServicesFromSubscription();
}

function listPrices(){
	var serviceCode = "OFF_POST_GTR";
	getPricesFromWS(serviceCode);

	if (chosenOp == "renew")
		setPricesFromSubscription();

	pricesCalcTotalGlobal();
	return;
}

function drawOperationForm(){
	var form = "<form id='operations'>"
	+"<br>"
	+"<input type='radio' name='operation' value='new' checked>" + rbtn_NewSubscription + "<br>"
	+"<input type='radio' name='operation' value='close'>" + rbtn_TerminateSubscription + "<br>"
	//+"<input type='radio' name='operation' value='change'>" + rbtn_ChangeSubscription + "<br>	 "
	+"<input type='radio' name='operation' value='renew'>" + rbtn_RenewSubscription + "<br><br>	 "
	+"</form>";
	document.getElementById("main").innerHTML = form;
}

function getOffersFromWS() { //contextEntityLogicalName, contextEntityId
	debugger;
	var actionName = "ocl_getOffers";  
	var result = JSON.parse(InvokeAction(actionName, contextEntityLogicalName, contextEntityId, "OKMessage", "ErrorMessage"));
	offerJSON = result;
	var form = "<form id='offers'>";
	form += "<div style='float:left; width:300px; position:relative; display:block'>";
	form+="<label>"+lbl_Offers+"</label><hr />";
	for (var i = 0, len = result.length; i< len; i++){
		if (i> 0 && i%10 == 0)
			form+="</div><div style='position:relative; width:200px; float:left; display:block'>";

		form+="<input type='radio' name='offer' id='"+result[i].id+"' value='"+result[i].description+"' onchange='offerSelected()'>"+result[i].description+"<br>";		
	}
	form+="</div></form>";
	form+="<div id='servicesDiv' style='margin-left:10px;'></div>";
	document.getElementById("main").innerHTML = form;
	document.getElementById("main").style.display = "inline-flex";

}

function selectServicesFromSubscription(){
	
	var form = document.getElementById("services");
	var servs = form.getElementsByTagName("input");
	if (!subsServices){
		var subField = Xrm.Page.getAttribute("ocl_originalsubscription");

		if (subField.getValue()) 
		{
			subsServices = getServices(subField.getValue()[0].id);
		}
		else{
			Xrm.Page.getAttribute("ocl_quotecreationprocessstep").setValue(1);
			loadPage();
		}
	}

	for (var i = 0, len = servs.length; i < len; i++) {
		servs[i].checked = false;
		//SELECT SERVICES FROM SUBS;
		for (var j = 0, jlen = subsServices.length; j < jlen; j++) {
			if (servs[i].id == subsServices[j].attributes["ocl_name"].value)
				servs[i].checked = true;				
		}
	}
}

function setPricesFromSubscription(){
	debugger;	
	if (!subsServices)
		subsServices = getServices(Xrm.Page.getAttribute("ocl_originalsubscription").getValue()[0].id);
	var tab = document.getElementById("prices");
	var trs = tab.getElementsByTagName("tr");
	
	for (var i = 1, len = trs.length; i < len; i++) {
		var tds = trs[i].getElementsByTagName("td");
		var servCode = tds[3].getElementsByTagName("input")[0].name.trim();
		for (var j = 0, jlen = subsServices.length; j < jlen; j++) {
			if (servCode == subsServices[j].attributes["ocl_name"].value){
				tds[2].innerHTML = subsServices[j].attributes["ocl_overriddenprice"].value;
				tds[6].childNodes[0].value = subsServices[j].attributes["ocl_quantity"].value;
			}
		}
	}
}

function getServices(subId){
	var fetch = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>"
	+"  <entity name='ocl_listofservices'>"
	+"    <attribute name='ocl_listofservicesid' />"
	+"    <attribute name='ocl_name' />"
	+"    <attribute name='ocl_overriddenprice' />"
	+"    <attribute name='ocl_quantity' />"
	+"    <order attribute='ocl_name' descending='false' />"
	+"    <filter type='and'>"
	+"      <condition attribute='ocl_subscription' operator='eq' value='"+subId+"' />"
	+"    </filter>"
	+"  </entity>"
	+"</fetch>";
	
	var results = null

	try {
		results = XrmServiceToolkit.Soap.Fetch(fetch);

	} catch (e) {
		results = new Object();
	}

	return results;
}

function getServicesFromWS(){
	var actionName = "ocl_getServices";
	var services;
	debugger;
	if (serviceJSON)
		services = serviceJSON;
	else			
		services = JSON.parse(InvokeAction(actionName, contextEntityLogicalName, contextEntityId, "OKMessage", "ErrorMessage"));

	var productSpecChar = services.productSpecCharacteristic;
	var productSpecCharVal = productSpecChar[0].productSpecCharacteristicValue;


	var len;
	if (services)
	{
		var form = "<form id='services'>";
		form +="<label>"+lbl_Services+"</label><hr />";		
		
		if (productSpecCharVal.length) {
			for (var i = 0, len = productSpecCharVal.length; i< len; i++){
				form+="<input type='checkbox' name='service' id='"+productSpecCharVal[i].value+"' value='"+productSpecCharVal[i].value+"' >"+productSpecCharVal[i].value.replace("_REC","")+"<br>";
			}
		}
		else
			form+="<input type='checkbox' name='service' id='"+productSpecCharVal.value+"' value='"+productSpecCharVal.value+"' >"+productSpecCharVal.value.replace("_REC","")+"<br>";

		if (chosenOp == "renew")
			form += "<a href='#' onclick='selectServicesFromSubscription()'>reset</a>";

		form+="</form>";




		if (document.getElementById("servicesDiv"))
			document.getElementById("servicesDiv").innerHTML = form;
		else
			document.getElementById("main").innerHTML = form;

	}
	else
		document.getElementById("main").innerHTML = "No Service was found!";
}

function getServicePriceFromXMLString(xmlString){
	
	var result="";
	if (window.DOMParser)
	{
		parser=new DOMParser();
		xmlDoc=parser.parseFromString(xmlString,"text/xml");
	}
	else // Internet Explorer
	{
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async=false;
		xmlDoc.loadXML(xmlString);
	}

	if (xmlDoc.getElementsByTagName("serviceTemplate").length>0) 
	{
		var service = xmlDoc.getElementsByTagName("serviceTemplate")[0].attributes["description"].value;
		var servId = xmlDoc.getElementsByTagName("serviceTemplate")[0].attributes["code"].value;
		var customFields = xmlDoc.getElementsByTagName("customField");
		var accountId = Xrm.Page.getAttribute("customerid").getValue()[0].id;
		var filterValues = getFilterValuesFromAccount(accountId);
		var prevCustomField;
		//var table = "<table id='prices'><tr><th>Service</th><th>Custom Field</th><th>Value</th><th>Override Value</th></tr>";
		for (var i = 0, ilen = customFields.length; i < ilen; i++) 
		{

			var customField = customFields[i].attributes[0].value;

			if (prevCustomField && prevCustomField == customField) {
				continue; //Skip duplicated values
			}
			else{prevCustomField = customField;}

			if (!(customField.endsWith("_REC") || customField.endsWith("_OS") || customField.endsWith("_USG")))
				continue;

			var entries = customFields[i].getElementsByTagName("entry");
			var ignoreEntry = null;
			var filterKey;
			var valueCriteria = [];
			var skipfilter = true;

			var mapValues = customFields[i].getElementsByTagName("mapValue");
			if (mapValues.length && mapValues.length > 0) {
				continue; //Skip mapValue
			}

			if (entries.length == 0) {
				if (customFields[i].getElementsByTagName("doubleValue").length > 0) {
					var price = customFields[i].getElementsByTagName("doubleValue")[0].textContent;
					/*result+= "<tr><td>"+service+"</td><td> </td><td>"+price+"</td><td><input name='"+servId+"' type='number'></td><td style='visibility:hidden'>"+customField+"</td><td style='visibility:hidden'> </td></tr>";*/
					result+= "<tr><td>"+service+"</td><td> </td><td>"+price+"</td><td><input name='"+servId+"' type='number' onchange='pricesCalcTotal(this)'></td><td class='hidden'>"+customField+"</td><td class='hidden'> </td><td><input name='"+servId+"_quant' type='number' min='0' value='1' onchange='pricesCalcTotal(this)'></td><td><input name='"+servId+"_total' type='number' disabled></td></tr>";
				}
				else{
					continue;
				}
				break;
				//continue;
			}

			for (var e = 0, elen = entries.length; e < elen; e++) 
			{
				if (customFields[i].getElementsByTagName("entry")[e].childNodes[0].textContent == "key")
				{
					if(customFields[i].getElementsByTagName("entry")[e].childNodes[1].textContent.indexOf("#{account.") != -1) 
					{
						filterKey = customFields[i].getElementsByTagName("entry")[e].childNodes[1].textContent;
						skipfilter = false;
					}
					ignoreEntry = e;
				}
			}

			for (var j = 0, jlen = entries.length; j < jlen; j++) 
			{
				if (j == ignoreEntry)
					continue;

				var flagNoFilter = false;
				var filterKeyArray;
				var entryKeys;
				if (ignoreEntry == null || skipfilter)
					flagNoFilter = true;
				else
				{
					filterKeyArray = filterKey.split("/");
					entryKeys = entries[j].childNodes[0].textContent.split("|");

					var entryKeysGreater = entryKeys[0].split("<");
					var entryKeysLower = entryKeys[0].split(">");

					var attName = "ocl_"+filterKeyArray[0].split("#{account.")[1].split("}")[0];

					var filterRule = applyFilterRules(entryKeysGreater, entryKeysLower, filterValues, attName);

				}
				if (flagNoFilter || filterRule || entryKeys[0].toLowerCase() == "null") 
				{
					var attName2;
					if (filterKeyArray && filterKeyArray[1]) 
					{
						attName2 = "ocl_"+filterKeyArray[1].split("#{account.")[1].split("}")[0];

					}
					//
					var filterRule2;
					if (attName2 && filterValues[0].attributes[attName2.toLowerCase()] && entryKeys[1]) 
					{
						var entryKeysGreater2 = entryKeys[1].split("<");
						var entryKeysLower2 = entryKeys[1].split(">");
						filterRule2 = applyFilterRules(entryKeysGreater2, entryKeysLower2, filterValues, attName2);

					}
					//

					
					if (flagNoFilter || !attName2 || filterRule2 || entryKeys[1].toLowerCase() == "null") 
					{
						if (attName) {
							var attNameStr = getCustomFieldName(attName);
							var filterVal = getFilterVal(filterValues[0].attributes[attName.toLowerCase()]);
							valueCriteria.push(attNameStr+ "=" + filterVal);
							
						}	

						if (attName2) {

							var attNameStr2 = getCustomFieldName(attName2);
							var filterVal2 = getFilterVal(filterValues[0].attributes[attName2.toLowerCase()]);
							valueCriteria.push(attNameStr2+ "=" + filterVal2);

						}	

						var valueCriteriaFinal = "";	
						for (var w=0; w < valueCriteria.length; w++){	
							valueCriteriaFinal = valueCriteriaFinal + valueCriteria[w];	

							if (w< valueCriteria.length-1) {	
								valueCriteriaFinal = valueCriteriaFinal + "<br>";	
							}	
						};	
						var f = "";	
						if	(entryKeys)	
						{	
							f = entryKeys.join("|");	
						}	
						result+= "<tr><td>"+service+"</td><td>"+ valueCriteriaFinal +"</td><td>"+entries[j].childNodes[1].textContent+"</td><td><input name='"+servId+"' type='number'></td><td class='hidden'>"+customField+"</td><td class='hidden'>"+ f +"</td><td><input name='"+servId+"_quant' type='number' min='0' value='1' onchange='pricesCalcTotal(this)'></td><td><input name='"+servId+"_total' type='number' disabled></td></tr>";	
					}	
				}	
			}	
		}	
	}
	return result;
}
function pricesCalcTotalGlobal()
{
	var tab = document.getElementById("prices");
	var trs = tab.getElementsByTagName("tr");
	for (var i = 1; i < trs.length; i++) {
		pricesCalcTotal(trs[i]);
	}
}
function pricesCalcTotal(input)
{		
	var tr = input.closest('tr');
	var tds = tr.getElementsByTagName('td');
	var quantCol = tds[6];
	var quantInput = quantCol.childNodes[0];

	var dPriceCol = tds[2];
	var oPriceCol = tds[3];
	var oPriceInput = oPriceCol.childNodes[0];
	var calcPrice = 0;

	if (oPriceInput.value == "") {
		calcPrice = parseFloat(dPriceCol.textContent);
	}
	else{
		calcPrice = parseFloat(oPriceInput.value);
	}

	if (quantInput.value <= 0) {
		quantInput.value = 0;
	}
	var calcQuant = quantInput.value;
	var totalCol = tds[7];
	var totalInput = totalCol.childNodes[0];

	totalInput.value = calcPrice*calcQuant;

}

function getFilterVal(filterValObj)
{
	if (filterValObj.type == "OptionSetValue")
		return filterValObj.formattedValue;
	else
		return filterValObj.value;
}
function getCustomFieldName(schemaname)
{
	var retrieve = getCustomField(schemaname);

	if(retrieve && retrieve.length > 0)
	{
		return retrieve[0].attributes["ocl_name"].value;	
	}
	else 
		return "";
}

function getCustomField(schemaname)
{
	var fetch ="<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false' no-lock='true'>"
	+"  <entity name='ocl_customfield'>"
	+"    <attribute name='ocl_customfieldid' />"
	+"    <attribute name='ocl_name' />"
	+"    <attribute name='ocl_accounttype' />"
	+"    <order attribute='ocl_name' descending='false' />"
	+"    <filter type='and'>"
	+"      <condition attribute='ocl_schemaname' operator='eq' value='"+schemaname+"' />"
	+"    </filter>"
	+"  </entity>"
	+"</fetch>";

	var retrieve = XrmServiceToolkit.Soap.Fetch(fetch);

	if(retrieve.length > 0)
	{
		return retrieve;	
	}
	else 
		return null;
}
function applyFilterRules(entryKeysGreater, entryKeysLower, filterValues, attName){	
	var filterRule;

	if (filterValues[0].attributes[attName.toLowerCase()]) 
	{
		if (entryKeysGreater.length == 2)
		{
			if (!entryKeysGreater[1])
				filterRule = (entryKeysGreater[0] < filterValues[0].attributes[attName.toLowerCase()].value);
			else
				filterRule = (entryKeysGreater[0] <= filterValues[0].attributes[attName.toLowerCase()].value && entryKeysGreater[1] > filterValues[0].attributes[attName.toLowerCase()].value);
		}
		else if (entryKeysLower.length == 2)
		{
			if(!entryKeysLower[1])
				filterRule = (entryKeysLower[0] < filterValues[0].attributes[attName.toLowerCase()].value);
			else
				filterRule = (entryKeysLower[0] > filterValues[0].attributes[attName.toLowerCase()].value && entryKeysLower[1] <= filterValues[0].attributes[attName.toLowerCase()].value);
		}
		if(!filterRule && entryKeysGreater.length == 1 && entryKeysLower.length == 1)
		{
			filterRule = entryKeysGreater[0].toLowerCase() == filterValues[0].attributes[attName.toLowerCase()].formattedValue.toLowerCase();
		}
	}

	if (filterValues[0].attributes["ocl_accnttype"])
	{
		var accType = filterValues[0].attributes["ocl_accnttype"].value;
		var customField = getCustomField(attName);
		if (customField && customField.length > 0)
		{
			var customFieldAccType = customField[0].attributes["ocl_accounttype"].value;
			if (!(customFieldAccType == accType))
				return null;			
		}
	}
	else
		return null;

	return filterRule;
}

function getPricesFromWS(serviceCode){
	var table ="<table id='prices'><tr><th style='width:200px;'>" + lbl_Service + "</th><th>" + lbl_Criteria + "</th><th>" + lbl_Price + "</th><th>" + lbl_OverridePrice + "</th><th class='hidden'>customField</th><th class='hidden'>criteria</th><th>"+lbl_Quantity+"</th><th>"+lbl_Total+"</th></tr>";
	/*var table = "<table id='prices'><tr><th style='width:200px;'>" + lbl_Service + "</th><th>" + lbl_Criteria + "</th><th>" + lbl_Price + "</th><th>" + lbl_OverridePrice + "</th><th style='visibility:hidden;'>customField</th><th style='visibility:hidden;'>criteria</th></tr>";*/
	var count = 0;

	var actionName = "ocl_getPrices";
	var resultFromWS = InvokeAction(actionName, contextEntityLogicalName, contextEntityId, "OKMessage", "ErrorMessage");
	var resultsArray = resultFromWS.split("||");
	for (var r = 0, len = resultsArray.length; r < len; r++) 
	{
		if (resultsArray[r]) 
		{
			
			var x = getServicePriceFromXMLString(resultsArray[r]);
			if (x)
				table+=x;
			else
				count++;
		}
	}
	table+= "</table>";
	 // if (count>0)
	 document.getElementById("main").innerHTML = table;
	 document.getElementById("main").style.display = "block";

	 
	 // else
	  //	document.getElementById("main").innerHTML = "No Prices for the chosen services match the Parameters on the account.<br>Please make sure all the relevant information is filled in in the Account form.";
	}

	function getFilterValuesFromAccount(accountId){
		var fetch ="<fetch mapping='logical'>" +
		"<entity name='account'>" +
		"<all-attributes />" +
		"<filter>" +
		"<condition attribute='accountid' operator='eq' value='" + accountId + "' />" +
		"</filter>" +
		"</entity>" +
		"</fetch>";

		var retrieve = XrmServiceToolkit.Soap.Fetch(fetch);

		if(retrieve.length > 0)
		{
			return retrieve;	
		}
		else 
			return null;
	}

// Get values from Html forms
function offerSelected(){

	debugger;
	var val;//= getRadioChecked(document.getElementById("offers"), "offer");
	var index;

	// get list of radio buttons with specified name
	var radios = document.getElementById("offers").elements["offer"];

	if (radios) 
	{
		if (radios.length) 
		{
		    // loop through list of radio buttons
		    for (var i=0, len=radios.length; i<len; i++) {
		        if ( radios[i].checked ) { // radio checked?
		            val = radios[i]; // if so, hold its value in val
		            index = i;
		            break; // and break out of for loop
		        }
		    }
		}
		else
		{
			val = radios;
			index = 0;

		}
    //return val; // return value of checked radio or undefined if none checked

    Xrm.Page.getAttribute("ocl_offername").setValue(val.value);
    Xrm.Page.getAttribute("ocl_offerid").setValue(val.id);
    Xrm.Page.getAttribute("ocl_offerid").setSubmitMode("always");

    serviceJSON = offerJSON[index];
    chooseServices();
    validateAndSave();
}
}

function getRadioChecked(form, name) {
	var val;
    // get list of radio buttons with specified name
    var radios = form.elements[name];
    
    // loop through list of radio buttons
    for (var i=0, len=radios.length; i<len; i++) {
        if ( radios[i].checked ) { // radio checked?
            val = radios[i]; // if so, hold its value in val
            break; // and break out of for loop
        }
    }
    return val; // return value of checked radio or undefined if none checked
}

// Invoke Action
function InvokeAction(actionLogicalName, contextEntityLogicalName, contextEntityId, OKMessage, errorMessage) {
	var context = window.parent.Xrm.context;
	var rawError;
	var url = Xrm.Page.context.getClientUrl()
	var OrgServicePath = "/XRMServices/2011/Organization.svc/web";
	url += OrgServicePath;

	var request = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
	"<s:Body>" +
	"<Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">" +
	"<request xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">" +
	"<a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">" +
	"<a:KeyValuePairOfstringanyType>" +
	"<c:key>Target</c:key>" +
	"<c:value i:type=\"a:EntityReference\">" +
	"<a:Id>" + contextEntityId + "</a:Id>" +
	"<a:LogicalName>" + contextEntityLogicalName + "</a:LogicalName>" +
	"<a:Name i:nil=\"true\" />" +
	"</c:value>" +
	"</a:KeyValuePairOfstringanyType>" +
	"</a:Parameters>" +
	"<a:RequestId i:nil=\"true\" />" +
	"<a:RequestName>" + actionLogicalName + "</a:RequestName>" +
	"</request>" +
	"</Execute>" +
	"</s:Body>" +
	"</s:Envelope>";

	var req = new XMLHttpRequest();
	req.open("POST", url, false)

    // Responses will return XML.
    req.setRequestHeader("Accept", "application/xml, text/xml, */*");
    req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");

    req.send(request);
    req.responseXML;

    if (req.statusText == "OK" && OKMessage != null) {
    	
        //Xrm.Utility.alertDialog(OKMessage);
        var response = null;
        if (req.responseXML.getElementsByTagName("a:KeyValuePairOfstringanyType").length > 0)
        	response = req.responseXML.getElementsByTagName("a:KeyValuePairOfstringanyType")[0].childNodes[1].textContent;
        else
        	response = req.responseXML.getElementsByTagName("KeyValuePairOfstringanyType")[0].childNodes[1].textContent;    

       // Xrm.Page.getAttribute("ocl_webserviceresponse").setValue(response);
       return response;
        //Xrm.Page.data.refresh(false);
    }
    else if (errorMessage != null) {
    	if (req.responseXML.getElementsByTagName("Message").length > 0) {
    		rawError = req.responseXML.getElementsByTagName("Message")[0].textContent;
    	}

        //Xrm.Utility.alertDialog(errorMessage + "\n" + "Error Details: " + rawError);
        Xrm.Utility.alertDialog(rawError);
    }
}

//  Business Process Flow related functions
function moveNext(currentStage) {
	var pollingAttemptsRemaining = 10;
	var intervalId;
	
	intervalId = setInterval(function ()
	{
		pollingAttemptsRemaining -= 1;
		if (Xrm.Page.data.entity.getIsDirty()) {
			getDirtyFields();
		}
		if (Xrm.Page.data.process.getActiveStage().getName() != currentStage) 
		{
			clearInterval(intervalId);
		}
		if (!Xrm.Page.data.entity.getIsDirty() && Xrm.Page.data.process.getActiveStage().getName() == currentStage) 
		{
			console.log("attempting move");
			Xrm.Page.data.process.moveNext(null);
			pollingAttemptsRemaining = 0;
			clearInterval(intervalId);
			//Xrm.Page.getAttribute("traversedpath").setSubmitMode("always");
			//Xrm.Page.getAttribute("stageid").setSubmitMode("always");			
		}
		if (pollingAttemptsRemaining <= 0)
		{
			clearInterval(intervalId);
		}
	}, 200);
	Xrm.Page.data.entity.save();
}

function movePrev(currentStage){
	var pollingAttemptsRemaining = 10;
	var intervalId;

	intervalId = setInterval(function ()
	{
		pollingAttemptsRemaining -= 1;
		if (Xrm.Page.data.entity.getIsDirty()) {
			getDirtyFields();
		}
		if (Xrm.Page.data.process.getActiveStage().getName() != currentStage) 
		{
			clearInterval(intervalId);
		}
		if (!Xrm.Page.data.entity.getIsDirty() && Xrm.Page.data.process.getActiveStage().getName() == currentStage) 
		{
			console.log("attempting move");
			Xrm.Page.data.process.movePrevious(null);
			pollingAttemptsRemaining = 0;
			clearInterval(intervalId);
			//Xrm.Page.getAttribute("traversedpath").setSubmitMode("always");
			//Xrm.Page.getAttribute("stageid").setSubmitMode("always");			
		}
		if (pollingAttemptsRemaining <= 0)
		{
			clearInterval(intervalId);
		}
	}, 200);
	Xrm.Page.data.entity.save();
}

function setProcessStep()
{	
	validateAndSave();
	var bpf = Xrm.Page.data.process.getActiveProcess();
	var processName = bpf.getName();
	var processStage = bpf.getStages().getByIndex(Xrm.Page.getAttribute("ocl_quotecreationprocessstep").getValue()).getName();
	var actionName = "ocl_setBusinessProcessFlowStage";	
	var traversed = new Array();
	for (var i = 0; i <= step; i++) {
		traversed.push(bpf.getStages().getByIndex(i).getId());
	}
	var params = [{name:"BusinessProcessFlow", value: processName},{ name:"BusinessProcessFlowStage", value: processStage},{name:"TraversedPath", value:traversed.join(',')},{name:"Entity", value:"quote"},{name:"EntityId",value:Xrm.Page.data.entity.getId()}];
	InvokeGlobalAction(actionName, "OKMessage", "ErrorMessage", params);

}

function getDirtyFields()
{
	var attributes = Xrm.Page.getAttribute();
	for (var i in attributes)
	{
		var attribute = attributes[i];
		if (attribute.getIsDirty()){
			console.log("attribute dirty: " + attribute.getName());
			attribute.setSubmitMode("always");
		}
	}	
}

function InvokeGlobalAction(actionLogicalName, OKMessage, errorMessage, params) {
	var parameters ="";
	if (params) {
		if (typeof(params) == "object") 
		{
			if (params.id && params.logicalName) 
			{
				parameters +="<a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
				parameters += "          <a:KeyValuePairOfstringanyType>";
				parameters += "            <b:key>"+params.name+"</b:key>";
				parameters += "            <b:value i:type=\"a:EntityReference\">";
				parameters += "               <a:Id>" + params.id + "</a:Id>";
				parameters += "               <a:LogicalName>" + params.logicalName + "</a:LogicalName>";
				parameters += "               <a:Name i:nil=\"true\" />";
				parameters += "            </b:value>";
				parameters += "          </a:KeyValuePairOfstringanyType>";
				parameters += "        </a:Parameters>";
			}
			else if (params.length > 0) 
			{
				parameters +="<a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
				for (var i = 0, len = params.length; i < len; i++) {
					parameters += "          <a:KeyValuePairOfstringanyType>";
					parameters += "            <b:key>"+params[i].name+"</b:key>";
					parameters += "            <b:value i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">" + params[i].value + "</b:value>";
					parameters += "          </a:KeyValuePairOfstringanyType>";
				}	
				parameters += "        </a:Parameters>";		
			}
		}
		else if(typeof(params) == "string")
		{
			parameters +="<a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
			parameters += "          <a:KeyValuePairOfstringanyType>";
			parameters += "            <b:key>"+params.name+"</b:key>";
			parameters += "            <b:value i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">" + params.value + "</b:value>";
			parameters += "          </a:KeyValuePairOfstringanyType>";
			parameters += "        </a:Parameters>";
		}
	}

	var context = window.parent.Xrm.context;
	var rawError;
	var url = Xrm.Page.context.getClientUrl()
	var OrgServicePath = "/XRMServices/2011/Organization.svc/web";
	url += OrgServicePath;

	var request = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
	"<s:Body>" +
	"<Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">" +
	"<request xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">" + parameters+
	"<a:RequestId i:nil=\"true\" />" +
	"<a:RequestName>" + actionLogicalName + "</a:RequestName>" +
	"</request>" +
	"</Execute>" +
	"</s:Body>" +
	"</s:Envelope>";

	var req = new XMLHttpRequest();
	req.open("POST", url, false)

    // Responses will return XML.
    req.setRequestHeader("Accept", "application/xml, text/xml, */*");
    req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");

    req.send(request);
    req.responseXML;

    if (req.statusText == "OK" && OKMessage != null) {

        //Xrm.Utility.alertDialog(OKMessage);
        var response = null;
        if (req.responseXML.getElementsByTagName("a:KeyValuePairOfstringanyType").length > 0)
        	response = req.responseXML.getElementsByTagName("a:KeyValuePairOfstringanyType")[0].childNodes[1].textContent;
        else if(req.responseXML.getElementsByTagName("KeyValuePairOfstringanyType").length > 0)
        	response = req.responseXML.getElementsByTagName("KeyValuePairOfstringanyType")[0].childNodes[1].textContent;    

       // Xrm.Page.getAttribute("ocl_webserviceresponse").setValue(response);
       return response;
        //Xrm.Page.data.refresh(false);
    }
    else if (errorMessage != null) {
    	if (req.responseXML.getElementsByTagName("Message").length > 0) {
    		rawError = req.responseXML.getElementsByTagName("Message")[0].textContent;
    	}

        //Xrm.Utility.alertDialog(errorMessage + "\n" + "Error Details: " + rawError);
        Xrm.Utility.alertDialog(rawError);
    }
}




</script>

</head>
<body onload="loadPage()">
	<div id="main" style="overflow: auto;">

	</div> 
	<div id="buttonsBot" style="display: block;clear:left; min-height: 50px;">
		<input type="button" id="back" value="" onclick="prevStep()"/>
		<input type="submit" id="next" value="" onclick="nextStep()"/>
		<input type="button" id="done" value="" onclick="finishCreationProcess()"/>
		<div id="errorDiv" style="display: inline-block; color: red;"></div>
	</div>
	
</body>

</html>