<!DOCTYPE HTML>
<html>
<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;
}

table#prices th {
    text-align: left;
    min-width: 100px;
    padding-right: 10px;
}
table#prices td {
    text-align: left;
}

.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;
}
.req:after{
     content:"*" ;
     color:red   
     }

	</style>

<script type="text/javascript">
	//var parameters = GetGlobalContext().getQueryStringParameters();
	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;
	
	//Global resources
	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 (Ann&#233;es)";
	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 = "Nouvel 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 Denouvellement";
	var lbl_EndDate ="Date de fin de Souscription";

	//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 loadPage()
{	

	step = Xrm.Page.getAttribute("ocl_quotecreationprocessstep").getValue();
	Xrm.Page.getAttribute("ocl_quotecreationprocessstep").fireOnChange();
	//var bpFlow = Xrm.Page.data.process.getActiveProcess();
	//Xrm.Page.data.process.setActiveStage(bpFlow.getStages().getByIndex(step).getId());
	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){		
		chooseOffer();
	}
	else if(step == 3){
		chooseServices();
	}
	else if(step == 4){
		listPrices();
		
	}
	else
		return;
}
function buttonsDisplay()
{
	if (step == 4)
		{
			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()
{
	
	if (step == 3) 
	{
		createServicesRecords();
		
		if (!checkedOneService) {
			document.getElementById("errorDiv").innerHTML = lbl_ErrorRequiredService;

			return;
		}
	}
	if (step == 1) 
	{
		debugger;
		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;

			return;
		}

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

	}
	if (step == 0) 
	{
		debugger;
		chosenOp = getChosenOperation();
	}
	
	document.getElementById("errorDiv").innerHTML = "";	
	var activeProcess = Xrm.Page.data.process.getActiveProcess();
	if (activeProcess != null) {
  	setTimeout(Xrm.Page.data.process.moveNext(null),4000);
	};

	Xrm.Page.getAttribute("ocl_quotecreationprocessstep").setValue(step+1);	
	Xrm.Page.data.entity.save();

	loadPage();
}

function prevStep()
{
	if (step == 0)
		return;

	checkedOneService = false;
	
	var activeProcess = Xrm.Page.data.process.getActiveProcess();
if (activeProcess != null) {
  setTimeout(Xrm.Page.data.process.movePrevious(null),4000);
};
	Xrm.Page.getAttribute("ocl_quotecreationprocessstep").setValue(step-1);	
	Xrm.Page.data.entity.save();
	if (step == 4)
	{
		debugger;
		deleteServicesRecords();
	}
	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 finishCreationProcess()
{
	savePricesInService();
	Xrm.Page.getAttribute("ocl_quotecreationprocessfinished").setValue(true);
	Xrm.Page.getAttribute("ocl_quotecreationprocessstep").setValue(step+1);
	Xrm.Page.getAttribute("ocl_quotecreationprocessfinished").setSubmitMode("always");
	
	Xrm.Page.data.entity.save();
	//window.parent.location.reload();
	Xrm.Utility.openEntityForm("quote", contextEntityId);

}

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

function getChosenOperation()
{
	return getRadioChecked(document.getElementById("operations"), "operation").value;
}

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;

	//. get service name
		var serviceName = input.name;
	//. get value from input
	// 	-> case null, get value from "Value" collumn
		if (input.value)
			overriddenPrice = input.value;
		else
			overriddenPrice = defaultPrice;
	//. 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"] = "{'"+fitlerCriteria+"':"+overriddenPrice+"}";
			XrmServiceToolkit.Soap.Update(be,null);
			break;
		}
		
	}

	}
}
function createServicesRecords()
{
	var form = document.getElementById("services");
	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' };

			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()
{	
	if (!chosenOp)
	{
		Xrm.Page.getAttribute("ocl_quotecreationprocessstep").setValue(0);
		loadPage();
		return;
	}
	var customer = Xrm.Page.getAttribute("customerid");
	var opportunity = Xrm.Page.getAttribute("opportunityid");
	if (chosenOp == "new") 
	{	
	var form = "<form id='details'>"

	+"<table><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='subStartDate' class='formlabel'>" + lbl_SubStartDate + "</label>"
		+"<input type='date' id='subStartDate' name='subStartDate' class='forminput' placeholder='"+datePlaceHolder+"' onchange='setValidityDate()'/>"
	+"</td></tr>"

	+"<tr><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='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></tr>"

	+"<tr><td>"
		+"<label for='quote' class='formlabel req'>" + lbl_QuoteName + "</label>"
		+"<input type='text' id='quotename' name='quote' class='forminput' onchange='setQuoteName()' required/>"
	+"</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='validity' class='formlabel req'>" + lbl_ValidityDate + "</label>"
		+"<input type='date' id='validitydate' name='validity' class='forminput' onchange='setValidityDate()' placeholder='"+datePlaceHolder+"' required />"
	+"</td><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")
	{
		var subs = getAccountSubscriptions(customer, opportunity);
		var options ="<option value=''>Select a Subscription</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'>"
	+"<br>"
	+"<label for='account' class='formlabel'>" + lbl_AccountName + "</label><input type='text' name='account' class='forminput' value='"+customer.getValue()[0].name+"' disabled/>"
	+"<label for='opportunity' class='formlabel'>" + lbl_OpportunityName + "</label><input type='text' name='opportunity' class='forminput'value='"+opportunity.getValue()[0].name+"' disabled/>"
	+"<label for='subscription' class='formlabel'>" + lbl_Subscription + "</label><select id='subscriptions' class='forminput' onchange='getSubscriptionData()'>"+options+"</select>"
	+"<label for='opportunity' class='formlabel'>" + lbl_SubsDate + "</label><input type='date' id='subsdate' name='subsdate' class='forminput' placeholder='mm/dd/yyyy' disabled />"
	+"<label for='renewdate' class='formlabel'>" + lbl_RenewDate + "</label><input type='date' id='renewdate' name='renewdate' class='forminput'value='"+parseDateForInput( startDate)+"' required onchange='calcEndDate()'/>"
	+"<label for='renewdur' class='formlabel'>" + lbl_RenewDur + "</label><input type='number' id='renewdur' name='renewdur' class='forminput'value='"+dur+"' required onchange='calcEndDate()'/>"
	+"<label for='enddate' class='formlabel'>" + lbl_EndDate + "</label><input type='date' id='enddate' name='enddate' class='forminput'value='' disabled/>"
	+"</form>";
document.getElementById("main").innerHTML = form;
calcEndDate();
	}
}
function calcEndDate()
{
	debugger;
	var startDate = document.getElementById("renewdate").value;
	var duration = document.getElementById("renewdur").value;
	var endDate = new Date(startDate);
	endDate.setMonth(endDate.getMonth()+parseInt(duration));
	document.getElementById("enddate").setAttribute("value",parseDateForInput(endDate));
	//document.getElementById("enddate").innerHTML = endDate;
}
function parseDateForInput(date)
{
	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();
	if (day<10)
		day="0"+day;
	return year+"-"+month+"-"+day;
}
function getSubscriptionData()
{

	debugger;
	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");
	if (sub && sub.length > 0) 
	{
		subDateField.value= parseDateForInput(sub[0].attributes["ocl_subscriptiondate"].value);
	}
	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' />"
+"    <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='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);
	Xrm.Page.data.entity.save();
}
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,'/')));
	Xrm.Page.data.entity.save();
}
function setDuration()
{
	var termInMonths = parseInt(document.getElementById("termInMonths").value);
	if(termInMonths > 0){
		Xrm.Page.getAttribute("ocl_contractduration").setValue();
		Xrm.Page.data.entity.save();
	}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()
{
	//alert("chooseOffer");
	getOffersFromWS();
}
function chooseServices()
{
	getServicesFromWS();
}

function listPrices()
{
	var serviceCode = "OFF_POST_GTR";
	getPricesFromWS(serviceCode);
	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='terminate'>" + 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
	var actionName = "ocl_getOffers";  
	var result = JSON.parse(InvokeAction(actionName, contextEntityLogicalName, contextEntityId, "OKMessage", "ErrorMessage"));
	var form = "<form id='offers'>";
	form += "<div style='float:left; width:200px; position:relative; display:block'>";
	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>";
	document.getElementById("main").innerHTML = form;
}
function getServicesFromWS()
{
	var actionName = "ocl_getServices";
	var 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'>";
		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>";

		form+="</form>";
		document.getElementById("main").innerHTML = form;

	}
	else
		document.getElementById("main").innerHTML = "No Service was found!";
}
function getServicePriceFromXMLString(xmlString)
{
	debugger;
	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[1].value;
	var servId = xmlDoc.getElementsByTagName("serviceTemplate")[0].attributes[0].value;
	var customFields = xmlDoc.getElementsByTagName("customField");
	var accountId = Xrm.Page.getAttribute("customerid").getValue()[0].id;
	var filterValues = getFilterValuesFromAccount(accountId);

	//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;
	  	var entries = customFields[i].getElementsByTagName("entry");
	  	var ignoreEntry = null;
	  	var filterKey;
		var valueCriteria = [];
		var skipfilter = true;

	  	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];

				}
				//debugger;
				var filterRule2;
				if (attName2 && filterValues[0].attributes[attName2.toLowerCase()] && entryKeys[1]) 
				{
					var entryKeysGreater2 = entryKeys[1].split("<");
					var entryKeysLower2 = entryKeys[1].split(">");
					if (entryKeysGreater2.length == 2)
						{
							filterRule2 = (entryKeysGreater2[0] <= filterValues[0].attributes[attName2.toLowerCase()].value && entryKeysGreater2[1] > filterValues[0].attributes[attName2.toLowerCase()].value);
						}
					else if (entryKeysGreater2.length == 1) 
						{
							filterRule2 = (entryKeysGreater2[0] < filterValues[0].attributes[attName2.toLowerCase()].value);
						}
					else if (entryKeysLower2.length == 2)
						{
							filterRule2 = (entryKeysLower2[0] > filterValues[0].attributes[attName2.toLowerCase()].value && entryKeysLower2[1] <= filterValues[0].attributes[attName2.toLowerCase()].value);
						}
					else if (entryKeysLower2.length == 1) 
						{
							filterRule2 = (entryKeysGreater2[0] > filterValues[0].attributes[attName2.toLowerCase()].value);
						}
						
					if(!filterRule2 && entryKeysGreater2.length == 1 && entryKeysLower2.length == 1)	  	
						{
							//debugger;
							filterRule2 = entryKeysGreater2[0].toLowerCase() == filterValues[0].attributes[attName2.toLowerCase()].formattedValue.toLowerCase();
						}					

				}
				//debugger;

				
				if (flagNoFilter || !attName2 || filterRule2 || entryKeys[1].toLowerCase() == "null") 
				{
					if (attName) {
						if (filterKeyArray[0].split("#{account.")[1].split("}")[0] == "typeSej") {
							valueCriteria.push("Type sejour=" + filterValues[0].attributes[attName.toLowerCase()].formattedValue);// = valueCriteria + "Type sejour=" + filterValues[0].attributes[attName.toLowerCase()].formattedValue;
						}
						/*else if(filterKeyArray[0].split("#{account.")[1].split("}")[0] == "nbLits" || filterKeyArray[0].split("#{account.")[1].split("}")[0] == "nbUsers") {
							valueCriteria.push(filterKeyArray[0].split("#{account.")[1].split("}")[0].replace("nb","#") + "=" + filterValues[0].attributes[attName.toLowerCase()].value)
						}*/
						else if(filterKeyArray[0].split("#{account.")[1].split("}")[0] == "nbLits") { //|| filterKeyArray[1].split("#{account.")[1].split("}")[0] == "nbUsers"
							valueCriteria.push(filterKeyArray[0].split("#{account.")[1].split("}")[0].replace("nb","Nombre de ") + "=" + filterValues[0].attributes[attName.toLowerCase()].value)
						}
						else if(filterKeyArray[0].split("#{account.")[1].split("}")[0] == "nbUsers") {
							valueCriteria.push(filterKeyArray[0].split("#{account.")[1].split("}")[0].replace("nb","Nombre d'") + "=" + filterValues[0].attributes[attName.toLowerCase()].value)
						}
					}
					
					if (attName2) {
						if (filterKeyArray[1].split("#{account.")[1].split("}")[0] == "typeSej") {
							valueCriteria.push("Type sejour=" + filterValues[0].attributes[attName2.toLowerCase()].formattedValue);// = valueCriteria + "Type sejour=" + filterValues[0].attributes[attName.toLowerCase()].formattedValue;
						}
						else if(filterKeyArray[1].split("#{account.")[1].split("}")[0] == "nbLits") { //|| filterKeyArray[1].split("#{account.")[1].split("}")[0] == "nbUsers"
							valueCriteria.push(filterKeyArray[1].split("#{account.")[1].split("}")[0].replace("nb","Nombre de ") + "=" + filterValues[0].attributes[attName2.toLowerCase()].value)
						}
						else if(filterKeyArray[1].split("#{account.")[1].split("}")[0] == "nbUsers") {
							valueCriteria.push(filterKeyArray[1].split("#{account.")[1].split("}")[0].replace("nb","Nombre d'") + "=" + filterValues[0].attributes[attName2.toLowerCase()].value)
						}
					}
					
					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 style='visibility:hidden'>"+customField+"</td><td style='visibility:hidden'>"+ f +"</td></tr>";
				}
			}
		}
	}
}
return result;
}

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();
		}
	}
	return filterRule;
}

function getPricesFromWS(serviceCode)
{
	debugger;
	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;
	 // 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;
}

function offerSelected()
{
	var val = getRadioChecked(document.getElementById("offers"), "offer");

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

}

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
}

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);
    }
}

</script>

</head>
<body onload="loadPage()" style="font-family: Segoe\000020UI; font-size: 12px;">
<div id="main" style="height:200px; overflow: auto;">
	
</div> 
<div id="buttonsBot" style="display: block;clear:left;">
	  	<input type="button" id="back" value="" onclick="prevStep()"/>
	  	<input type="submit" id="next" value="" onclick="nextStep()" style="display: inline-block"/>
	  	<input type="button" id="done" value="" onclick="finishCreationProcess()" style="display: none"/>
	  	<div id="errorDiv" style="display: inline-block; color: red;"></div>
	</div>
	
</body>

</html>