/* 2008 > Gaetan Langhade < Equallia - pour Amaguiz */


/* simulation financiere du gabarit 3 du tunnel de devis */
// GUR : l'event est géré dans surface
//if (window.addEventListener) window.addEventListener("load",lancerSimulation,false);
//else if (window.attachEvent) window.attachEvent("onload",lancerSimulation);


//Tarifs des formules
var formules = new Array(); //ici chiffre de remplissage
var formuleIndex = 0; //specification novembre 08

//Correlation au formulaire :
var listeTauxMajoration = new Array();
var listePacks = new Array();

//Tarifs des packs
var packsTab = new Array();
var packTabTauxMaj;
var lesFranchises = new Array();

//Tarifs des options
var optyonsTab = new Array();
var optyonsOffTab = new Array();
//Correlation au formulaire :
var lesOptions = new Array();

//Echeancier
var rythme = 1; //specification novembre 08
var auRythme = new Array("/mois","/an");
//Correlation au formulaire :
var leRythme = new Array();

//Correlation au formulaire :
var leTarifTotalMensuel;		/* champ select tarif mensuel */
var leTarifTotalAnnuel;		/* champ select tarif annuel */
var leTarifTotal1;					/* barre d'outils colonne de gauche TOTAL DE MA FORMULE */
var leTarifTotal2;					/* colonne de droite MON TARIF */
var leTarifTotal2Periodicite;					/* colonne de gauche bilan */
var leTarifTotal3;					/* colonne de droite bilan */
var leTarifFormule1;			/* colonne de gauche */
var leTarifFormule2;			/* colonne de droite */
//var lesOptionsSouscrites; /* colonne de droite : liste des options souscrites */
var optyons;

function optionOfferte(code) {
	if ( typeof(optyonsOffTab) != 'undefined' ) {
		var opt = code.split(/[;,]+/g);
		for (var o = 0; o < optyonsOffTab.length; ++o) {
			for (var i = 0; i < opt.length; ++i) {
				if (optyonsOffTab[o] == opt[i]) {
					return true;
				}
			}
		}
	}
	return false;
}


/**
 * Permet d'indiquer qu'une option est offerte (via la classe CSS "offerte").
 * Pour le moment, une seule option peut être offerte à la fois, donc toutes les
 * autres redeviennent payantes.
 * 
 * @param codeOptionOfferte
 *            Code de l'option à offrir.
 */
function offrirOption(codeOptionOfferte) {
	// Purge de la liste des options offertes
	optyonsOffTab = new Array();
	
	// Ajout de l'option offerte
	if (codeOptionOfferte != null) {
		optyonsOffTab.push(codeOptionOfferte);
		document.getElementById("step3Data").value = codeOptionOfferte;
	}
	
	// On lance le recalcul des totaux
	calculer();
}

//----------------------------------------------------------------------------
//HasClassName
//
//Description : returns boolean indicating whether the object has the class name
// built with the understanding that there may be multiple classes
//
//Arguments:
// objElement              - element to manipulate
// strClass                - class name to add
//
function HasClassName(objElement, strClass)
{

// if there is a class
if ( objElement.className )
   {

   // the classes are just a space separated list, so first get the list
   var arrList = objElement.className.split(' ');

   // get uppercase class for comparison purposes
   var strClassUpper = strClass.toUpperCase();

   // find all instances and remove them
   for ( var i = 0; i < arrList.length; i++ )
      {

      // if class found
      if ( arrList[i].toUpperCase() == strClassUpper )
         {

         // we found it
         return true;

         }

      }

   }

// if we got here then the class name is not there
return false;

}
//
//HasClassName
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
//AddClassName
//
//Description : adds a class to the class attribute of a DOM element
// built with the understanding that there may be multiple classes
//
//Arguments:
// objElement              - element to manipulate
// strClass                - class name to add
//
function AddClassName(objElement, strClass, blnMayAlreadyExist)
{

// if there is a class
if ( objElement.className )
   {

   // the classes are just a space separated list, so first get the list
   var arrList = objElement.className.split(' ');

   // if the new class name may already exist in list
   if ( blnMayAlreadyExist )
      {

      // get uppercase class for comparison purposes
      var strClassUpper = strClass.toUpperCase();

      // find all instances and remove them
      for ( var i = 0; i < arrList.length; i++ )
         {

         // if class found
         if ( arrList[i].toUpperCase() == strClassUpper )
            {

            // remove array item
            arrList.splice(i, 1);

            // decrement loop counter as we have adjusted the array's contents
            i--;

            }

         }

      }

   // add the new class to end of list
   arrList[arrList.length] = strClass;

   // add the new class to beginning of list
   //arrList.splice(0, 0, strClass);
   
   // assign modified class name attribute
   objElement.className = arrList.join(' ');

   }
// if there was no class
else
   {

   // assign modified class name attribute      
   objElement.className = strClass;

   }

}
//
//AddClassName
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
//RemoveClassName
//
//Description : removes a class from the class attribute of a DOM element
// built with the understanding that there may be multiple classes
//
//Arguments:
// objElement              - element to manipulate
// strClass                - class name to remove
//
function RemoveClassName(objElement, strClass)
{

// if there is a class
if ( objElement.className )
   {

   // the classes are just a space separated list, so first get the list
   var arrList = objElement.className.split(' ');

   // get uppercase class for comparison purposes
   var strClassUpper = strClass.toUpperCase();

   // find all instances and remove them
   for ( var i = 0; i < arrList.length; i++ )
      {

      // if class found
      if ( arrList[i].toUpperCase() == strClassUpper )
         {

         // remove array item
         arrList.splice(i, 1);

         // decrement loop counter as we have adjusted the array's contents
         i--;

         }

      }

   // assign modified class name attribute
   objElement.className = arrList.join(' ');

   }
// if there was no class
// there is nothing to remove

}

function attribuerTaxeAttentat(fractionnement){
	// Si annuel
	if(fractionnement == "0"){
		$j("div#taxeAttentatId").show();					
	// Sinon mensuel
	}else{
		$j("div#taxeAttentatId").hide();						
	}	
}

//
//RemoveClassName
//----------------------------------------------------------------------------

function lancerSimulation(){
	try{
		var majorationsElems = getElementsByClassName("valeurBiens",document);
		if (majorationsElems.length > 0){
			leTarifFormule1 = document.getElementById("tarifFormule1");
			leTarifFormule2 = document.getElementById("tarifFormule2");
			leTarifTotalMensuel = document.getElementById("tarifTotalMensuel");
			leTarifTotalAnnuel = document.getElementById("tarifTotalAnnuel");
			leTarifTotal1 = document.getElementById("tarifTotal1");
			leTarifTotal2 = document.getElementById("tarifTotal2");
			leTarifTotal2Periodicite = document.getElementById("tarifTotal2Periodicite");
			leTarifTotal3 = document.getElementById("tarifTotal3");
			
			var majorationElem = majorationsElems[0].getElementsByTagName("input");
			for (i=0;i<majorationElem.length;i++) {
				if (majorationElem[i].type == "radio") {
					listeTauxMajoration.push(majorationElem[i]); //attention aux champs caches
				}
			}
			// gestion des taux de majorations
			for (i=0;i<listeTauxMajoration.length;i++){
				if (listeTauxMajoration[i].checked) {
					formuleIndex = i;
					optyons = optyonsTab[i]; // on prend comme référenciel de tarifs les tarifs du taux de majoration courant;
					packTabTauxMaj = packsTab[i];
//					AddClassName(listeTauxMajoration[i].parentNode.getElementsByTagName("strong")[0], "selected", true);
				}
				listeTauxMajoration[i].onclick = function(){
					for (current=0;current<listeTauxMajoration.length;current++){
						if (this != listeTauxMajoration[current]) {
//							RemoveClassName(listeTauxMajoration[current].parentNode.getElementsByTagName("strong")[0], "selected");
						} else {
//							AddClassName(this.parentNode.getElementsByTagName("strong")[0], "selected", true);
							formuleIndex = current;
							optyons = optyonsTab[current];
							packTabTauxMaj = packsTab[current];
							calculer();
						}	
					}	
				};	
			}
			
			//MGS - gestion des packs - Boitier Prevention
			var packsElems = getElementsByClassName("tableauPrevention",document);
			if(typeof(packsElems) != 'undefined' && packsElems.length>0){
				var packsInput = packsElems[0].getElementsByTagName("input");
				for(i=0;i<packsInput.length;i++){
					if(packsInput[i].type== "checkbox"){
						listePacks.push(packsInput[i]);
					}
				}
			}
			// gestion bloc de droite - Boitier Prevention
			var lesPacksSouscrits = document.getElementById("articat2");
			for (i=listePacks.length-1; i>=0 ; i--){
				listePacks[i].onclick = onClickOption;
				var idPack = listePacks[i].id;
				ceerAvant("dd", packTabTauxMaj[idPack][rythme] + devise,lesPacksSouscrits,"id~" + idPack + "listeAz","class~desactif");
				var labelPack = listePacks[i].parentNode.parentNode.getElementsByTagName("td")[0].getElementsByTagName("strong")[0].innerHTML;
				ceerAvant("dt",labelPack,lesPacksSouscrits,"id~" + idPack + "listeAa","class~desactif");
			}
			//ceerAvant("h3", "Mon service Pr\u00E9vention",lesPacksSouscrits,"id~titrePack","class~desactif");
			
			// gestion des fractionnements
			var listeFractionnement = getElementsByClassName("reglement",document)[0].getElementsByTagName("input");
			for (i=0;i<listeFractionnement.length;i++) {
				if (listeFractionnement[i].type == "radio") {
					leRythme.push(listeFractionnement[i]); //attention aux champs caches
				}
			}
			for (i=0;i<leRythme.length;i++){
				if (leRythme[i].checked) {
					rythme = i;
				}
				if (navigator.userAgent.toLowerCase().indexOf("safari") > -1) {
					leRythme[i].parentNode.style.paddingBottom = "3px";
				}
				leRythme[i].onclick = function(){
					for (i=0;i<leRythme.length;i++){
						if (this != leRythme[i]) {
							RemoveClassName(leRythme[i].parentNode, "actif");
						} else{
							AddClassName(this.parentNode, "actif", true);
							rythme = i;
							calculer();							
						}	
					}	
				};
			}
			
			// gestion bloc de droite et calculs totaux
			var lesOptionsSouscrites = getElementsByClassName("coeur",document)[0].getElementsByTagName("dl")[1];
			//CCD : recherche des éléments input simplement pour affichage tarifs options (suite modification structure Html de la page devis_left )
			//	var listeOptions = getElementsByClassName("devis",document)[0].getElementsByTagName("table")[1].getElementsByTagName("input");
			var listeOptions = document.getElementsByTagName("input");			for (i=0;i<listeOptions.length;i++) { 
				if (listeOptions[i].type == "checkbox") {
					lesOptions.push(listeOptions[i]); //attention aux champs caches
				}
			}
			for (i=lesOptions.length-1; i>=0 ; i--){
				lesOptions[i].onclick = onClickOption;
				var idOption = lesOptions[i].id;
				if(idOption != 'PREV1' && idOption != 'PREV2' && idOption != 'PREV3'){
					ceerAvant("dd", amaguiz_tools.getValueFromFraction( optyons[idOption][rythme] , rythme ) + devise,lesOptionsSouscrites,"id~" + idOption + "listeAz","class~desactif");
					var labelOption = lesOptions[i].parentNode.parentNode.getElementsByTagName("td")[0].getElementsByTagName("strong")[0].innerHTML;
					ceerAvant("dt",labelOption,lesOptionsSouscrites,"id~" + idOption + "listeAa","class~desactif");
				}
			}

			calculer();
		}
	} catch(e){
		//alert(e); 
	}
}


var devise = "\u20AC";
function calculer(){
	
	attribuerTaxeAttentat(rythme);
	
	var total = formules[formuleIndex][rythme];
	var totalMensuel = formules[formuleIndex][0];
	var totalAnnuel = formules[formuleIndex][1];

	leTarifFormule1.innerHTML = amaguiz_tools.convertToComma( total ) + devise + auRythme[rythme];
	leTarifFormule2.innerHTML = amaguiz_tools.convertToComma( total ) + devise;

	OptionsMensuel = 0;
	var totalOptionsAnnuel = 0;
	var totalOptionsMensuel = 0;
	var totalOptions = 0;
	var totalPack = 0;
	var totalPackAnnuel = 0;
	var totalPackMensuel = 0;
	var packChecked = false;
	for (var z=0;z<lesOptions.length;z++){
		var idOption = lesOptions[z].id;
		if(idOption != 'PREV1' && idOption != 'PREV2' && idOption != 'PREV3'){
			if (optionOfferte(lesOptions[z].value) ) {
				// Maj de l'affichage du tarif à "Offert"
				document.getElementById(idOption + "tarif").innerHTML = 'Offert';
				document.getElementById(idOption + "listeAz").innerHTML = 'Offert';
			} else {
				// Maj de l'affichage du tarif
				var tarifOption =  amaguiz_tools.convertToComma( amaguiz_tools.getValueFromFraction( optyons[idOption][rythme], rythme ) ) + devise;
				document.getElementById(idOption + "tarif").innerHTML = tarifOption + auRythme[rythme];
				document.getElementById(idOption + "listeAz").innerHTML = tarifOption ;
				
				// Si l'option est cochée et non offerte, on met à jour le total
				if (lesOptions[z].checked){
					totalOptions += optyons[idOption][rythme];
					totalOptionsMensuel += optyons[idOption][0];
					totalOptionsAnnuel += optyons[idOption][1];
				}
			}
			// Affichage ou non de l'option dans le bloc "Mon tarif" (dépend simplement du cochage)
			if (lesOptions[z].checked){
				document.getElementById(idOption + "listeAa").className = "";
				document.getElementById(idOption + "listeAz").className = "";
				
				//FVD : surlignage de l'option sélectionnée
				$j(".optionsBody tr:eq("+z+") td").each(function(){
					  $j(this).addClass("selected");
				});
			} else{
				document.getElementById(idOption + "listeAa").className = "desactif";
				document.getElementById(idOption + "listeAz").className = "desactif";
				
				$j(".optionsBody tr:eq("+z+") td").each(function(){
					  $j(this).removeClass("selected");
				});
			}	
		}
	}
	
	//FVD : surlignage du pack éventuelement sélectionné
	//ce qui suit ne fonctionne pas avec IE6 :
	//l'accès à l'attribut 'checked' fait planter le javascript, ce qui empêche l'affichage du tarif
	if ($j.browser.msie && $j.browser.version == 6) {
		
	} else {
		var testPREV1 = $j("#PREV1").is(':checked');
		if (testPREV1) {
			$j(".tableauPrevention tr:eq(0) td").each(function(){
				$j(this).addClass("selected");
			});
		} else {
			$j(".tableauPrevention tr:eq(0) td").each(function(){
				$j(this).removeClass("selected");
			});
		}
		var testPREV2 = $j("#PREV2").is(':checked');
		if (testPREV2) {
			$j(".tableauPrevention tr:eq(1) td").each(function(){
				$j(this).addClass("selected");
			});
		} else {
			$j(".tableauPrevention tr:eq(1) td").each(function(){
				$j(this).removeClass("selected");
			});
		}
		var testPREV3 = $j("#PREV3").is(':checked');
		if (testPREV3) {
			$j(".tableauPrevention tr:eq(2) td").each(function(){
				$j(this).addClass("selected");
			});
		} else {
			$j(".tableauPrevention tr:eq(2) td").each(function(){
				$j(this).removeClass("selected");
			});
		}
	}
	
	//Boitier Prevention
	for (z=0;z<listePacks.length;z++){
		var idPack = listePacks[z].id;
		var tarifPack =  amaguiz_tools.convertToComma( amaguiz_tools.getValueFromFraction(packTabTauxMaj[idPack][rythme],rythme)) + devise;
		document.getElementById(idPack + "tarif").innerHTML = tarifPack + auRythme[rythme];
		document.getElementById(idPack + "listeAz").innerHTML = tarifPack ;
		if (listePacks[z].checked){
			packChecked = true;
			document.getElementById(idPack + "listeAa").className = "";
			document.getElementById(idPack + "listeAz").className = "";
			totalPackAnnuel = packTabTauxMaj[idPack][1];
			totalPackMensuel = packTabTauxMaj[idPack][0];
			totalPack = packTabTauxMaj[idPack][rythme];
		}else{
			document.getElementById(idPack + "listeAa").className = "desactif";
			document.getElementById(idPack + "listeAz").className = "desactif";
		}
	}
	if(packChecked){
		document.getElementById("titrePack").className = "";
		document.getElementById("INCH*franchise").innerHTML = "0";
		document.getElementById("VOLH*franchise").innerHTML = "0";//lesFranchises["VOLH*"]/2;
		document.getElementById("INCH*franchisebloc").className="franchisemodifiee";
		document.getElementById("VOLH*franchisebloc").className="franchisemodifiee";
	}else{
		document.getElementById("titrePack").className = "desactif";
		document.getElementById("INCH*franchise").innerHTML = lesFranchises["INCH*"];
		document.getElementById("VOLH*franchise").innerHTML = lesFranchises["VOLH*"];
		document.getElementById("INCH*franchisebloc").className="";
		document.getElementById("VOLH*franchisebloc").className="";
	}
	
	// le total des options est toujours en annuel, il faut lui appliquer un recalcul si on est en mensuel (divisé par 12) ;
	// par soucis d'arrondi, on applique le recalcul sur la somme des options
	total += amaguiz_tools.getValueFromFraction( totalOptions, rythme );
	totalMensuel += amaguiz_tools.getValueFromFraction( totalOptionsMensuel, 0 );
	totalAnnuel += amaguiz_tools.getValueFromFraction( totalOptionsAnnuel, 1 );
	
	//Boitier Prevention
	total += amaguiz_tools.getValueFromFraction(totalPack,rythme);
	totalMensuel +=  amaguiz_tools.getValueFromFraction(totalPackMensuel,0);
	totalAnnuel +=  amaguiz_tools.getValueFromFraction(totalPackAnnuel,1);
	
	if (total != Math.round(total)) {
		total = amaguiz_tools.roundNumber( total, amaguiz_tools.decimal);
	}
	
	
	totalMensuel = amaguiz_tools.roundNumber( totalMensuel, amaguiz_tools.decimal); 
	totalAnnuel = amaguiz_tools.roundNumber( totalAnnuel, amaguiz_tools.decimal);

	leTarifTotalMensuel.innerHTML = amaguiz_tools.convertToComma( totalMensuel) + devise + auRythme[0];
	leTarifTotalAnnuel.innerHTML = amaguiz_tools.convertToComma( totalAnnuel) + devise + auRythme[1];
	
	leTarifTotal1.innerHTML = amaguiz_tools.convertToComma( total ) + devise + "<span>" + auRythme[rythme] + "</span>";
	leTarifTotal2.innerHTML = amaguiz_tools.convertToComma( total ) + devise + auRythme[rythme];
	leTarifTotal2Periodicite.innerHTML = auRythme[rythme];
	leTarifTotal3.innerHTML = amaguiz_tools.convertToComma( total ) + devise ;
}


/**
 * Fonction effectuant un appel AJAX pour determiner quelle est l'option à offrir parmi celles selectionnées.
 */
function determinerEtOffrirOption() {

	// construction la liste des codes des options cochées et de la liste de leur tarif
	var listeCheckboxOptions = $j('div.devis table input[type="checkbox"]');
	var listeCodesOptions = new Array();
	var listeTarifsOptions = new Array();
	for ( var index = 0; index < listeCheckboxOptions.length; index++) {
		if (listeCheckboxOptions[index].checked) {
			listeCodesOptions.push(listeCheckboxOptions[index].value);
			// de façon arbitraire, on va utiliser les montants de la première formule pour la comparaison des montants.
			if (optyonsTab[0][listeCheckboxOptions[index].id] != null) {
				// il s'agit d'une option normale
				listeTarifsOptions.push(optyonsTab[0][listeCheckboxOptions[index].id][0]);
			} else {
				// il s'agit d'un pack
				listeTarifsOptions.push(packsTab[0][listeCheckboxOptions[index].id][0]);
			}
				
		}
	}
	
	// S'il n'y a pas assez de cases cochées, inutile d'aller plus loin
	if(($j("#type_promo").val() == 5 && listeCodesOptions.length < 2)
			|| ($j("#type_promo").val() == 6 && listeCodesOptions.length < 3)) {
		afficherErreurNbOptionsCochees();
		// On n'offre aucune option et maj affichage
		offrirOption(null);
	} else {
		//Appel Ajax à determinerOptionOfferte
		$j.getJSON(
				Surface.devisStep3.urlDetermineOptionOfferte,
				{
					produit: "MRH",
					codePromo : $j("#promo").val(),
					listeCodesOptions : listeCodesOptions.join(","),
					listeTarifsOptions : listeTarifsOptions.join(",")
				},
				function (data) {
					if (data.messageErreur != null) {
						// On affiche le message d'erreur
						afficherErreurNbOptionsCochees(); //FIXME (nb d'options cochées, c'est la seule erreur prévue...)
						// On n'offre aucune option et maj affichage
						offrirOption(null);
					} else {
						// On offre l'option determinée et maj affichage
						offrirOption(data.codeOptionOfferte);
					}
				}
		);
	}
}

/**
 * Fonction associée aux codes promo detype 5 et 6.
 * Permet de cacher le message d'erreur indiquant qu'il faut
 * cocher un minimum d'options pour pouvoir bénéficier de la promotion.
 */
function cacherErreurNbOptionsCochees() {
	$j("#erreurCodePromoNbOptionsCochees").hide();
}

/**
 * Fonction associée aux codes promo detype 5 et 6.
 * Permet d'afficher le message d'erreur indiquant qu'il faut
 * cocher un minimum d'options pour pouvoir bénéficier de la promotion.
 */
function afficherErreurNbOptionsCochees() {
	$j("#erreurCodePromoNbOptionsCochees").show();
}

/**
 * Fonction associée au clic sur une Option
 */
function onClickOption() {
	if ($j("#type_promo").val() == 5
			|| $j("#type_promo").val() == 6) {
		
		cacherErreurNbOptionsCochees();
		
		/*
		 * Si le type de code promo correspond à "une option offerte" alors il
		 * faut determiner en AJAX laquelle offrir puis mettre à jour les
		 * montants et totaux.
		 */
		determinerEtOffrirOption();
		
	} else {
		// Mise à jour de l'affichage des montants puis des totaux
		calculer();
	}
}

