/**
 * ctlm_solution.js
 * 
 * Cross browser implementation.
 * Calculate monthly payement for each vehicle and show interactif financing calculator.
 * 
 * Features:
 *	 - Easy to implement
 *   - No dependency on external libraries
 *   - Compatible with Prototype.js 
 * 
 * Tested browsers (Windows):
 *   - IE 8
 *   - IE 7
 *   - IE 6
 *   - Firefox 3.5.8
 *   - Google Chrome 4.1.249
 * 
 *
 * Copyright (c) 2010 CETELEM.
 *
 * Author : CARIOU Pierre-Yves
 *
 */

// Partner informations variables
var	_vend_code;
var	_vehicle_price;
var	_category;
var	_brand				= 'RENAULT';
var	_body_work			= '';
var	_energy				= '';
var	_model				= '';
var	_type				= '';
var	_mile_age			= 1;
var	_is_new_vehicle;
var _nb_month;
var _first_deposit;
var	_circulation_first_date = '2403210';
var _div_ctlm_mensu		= 'ctlm_mensu';
var _div_ctlm_simu		= 'ctlm_simu';
var	_btn_enable			= 0;
var	_engine_rating		= 4;
var	_capacity			= 125;
var	_simu_color			= 0;
var	_simu_struc			= 0;
var	_assurance_enable	= true;
var	_wm_name			= 'cetelem';
var	_wm_email			= '';
var	_wm_phone			= '';

// Interne variable class
var	_initialiaze		= false;
var	_url_server			= 'http://www.cetelem-automobile.fr';
var	_pwd_solution		= '/part/forex/ctlm_integration/';
var	_mode				= 'no_debug';
var _mention_visible	= 'false';
var	_mentions			= new Array;

/*
 * Fill legal mentions in li block
 */
function	CreateMidleFrame()
{
	var frame_m		= document.createElement('div');
	var h3			= document.createElement('h3');
	var ul			= document.createElement('ul');
	var li			= document.createElement('li');
	var span_l		= document.createElement('span');
	var span_r		= document.createElement('span');

	span_l.className = 'left';
	span_r.className = 'right';
	
	li.appendChild(span_l);
	li.appendChild(span_r);

	var tmp;
	for (key in _mentions)
	{
		span_l.innerHTML = key;
		span_r.innerHTML = _mentions[key];

		tmp = li.cloneNode(true);
		ul.appendChild(tmp);
	}

	h3.innerHTML = 'Mentions légales :';
	frame_m.appendChild(h3);
	frame_m.appendChild(ul);
	
	return frame_m;
}

/*
 * Insert dynamique frame with legal Mention
 */
function	CreateMentionFrame()
{
	var	cetelem		= document.getElementById('CETELEM');
	var frame		= document.createElement('div');
	var frame_tl	= document.createElement('div');
	var frame_tc	= document.createElement('div');
	var frame_tr	= document.createElement('div');
	var frame_m		= CreateMidleFrame();
	var frame_bl	= document.createElement('div');
	var frame_bc	= document.createElement('div');
	var frame_br	= document.createElement('div');
	
	frame.id = 'frame';
	frame_tl.id = 'frame_tl';
	frame_tc.id = 'frame_tc';
	frame_tr.id = 'frame_tr';
	frame_m.id = 'frame_m';
	frame_bl.id = 'frame_bl';
	frame_bc.id = 'frame_bc';
	frame_br.id = 'frame_br';

	if (cetelem != null)
	{
		cetelem.appendChild(frame);
		frame.appendChild(frame_tl);
		frame.appendChild(frame_tc);
		frame.appendChild(frame_tr);
		frame.appendChild(frame_m);
		frame.appendChild(frame_bl);
		frame.appendChild(frame_bc);
		frame.appendChild(frame_br);
	}
}

/*
 * Create close button for the calculator
 */
function	CreateSimuCloseBtn()
{
	var	button		= document.createElement('div');
	var	button_text	= document.createElement('div');

	button.id = 'calc_but';
	button.style.left = ((GetWindowsWidth() - 570) / 2) + 473 + 'px',
	button.onmousedown = function ()
	{
		document.getElementById('filter').style.display = 'none';
		document.getElementById('calc_but').style.display = 'none';
		document.getElementById('calculator').style.display = 'none';
	}

	button_text.id = 'calc_but_txt';
	button_text.innerHTML = 'Fermer';
	if (_simu_color == 0)
		button_text.style.color = '#00B6E8';
	else if (_simu_color == 2)
		button_text.style.color = '#FF9933';
	else if (_simu_color == 4)
		button_text.style.color = '#FF3333';
	else if (_simu_color == 6)
		button_text.style.color = '#339933';
	else if (_simu_color == 8)
		button_text.style.color = '#000099';
	else if (_simu_color == 10)
		button_text.style.color = '#FF0099';

	button.appendChild(button_text);

	return button;
}

/*
 * Insert dynamique frame with the calculator
 */
function	CreateSimulationFrame()
{
	var	cetelem		= document.getElementById('CETELEM');

	if (cetelem == null)
		return false;

	var filter		= document.createElement('div');
	var	button		= CreateSimuCloseBtn();
	var iframe		= document.createElement('iframe');
	
	filter.id = 'filter';
	
	iframe_src = _url_server+'/part/forex/index.php?proposalFormat=simu';
    iframe_src += '&proposalInitialShare=' + _first_deposit;
    iframe_src += '&proposalMonth=' + _nb_month;
    iframe_src += '&proposalPrice=' + _vehicle_price;
    iframe_src += '&proposalProductType=MOD';
    iframe_src += '&proposalScore=' + _btn_enable;
    iframe_src += '&proposalDemande=' + _btn_enable;
    iframe_src += '&proposalStructure=' + _simu_struc;
    iframe_src += '&proposalStyle=' + _simu_color;
    iframe_src += '&vdrNumberSiteWm=' + _vend_code;
    iframe_src += '&vdrNumberWm=' + _vend_code;
    iframe_src += '&vehicleBrand=' + _brand;
    iframe_src += '&vehicleCategory=' + _category;
    iframe_src += '&vehicleIsNewBo=' + _is_new_vehicle;
	if (_is_new_vehicle == 0)
	{
    	iframe_src += '&vehicleCirculationFirstDt=' + _circulation_first_date;
	   	iframe_src += '&vehicleMileAge=' + _mile_age;
	}
	if (_category == 'MOTO')
   		iframe_src += '&vehicleCapacity=' + _capacity;
   	else
   		iframe_src += '&vehicleEngineRating=' + _engine_rating;
	if (_body_work != '')
    	iframe_src += '&vehicleBodyWork=' + _body_work;
	if (_energy != '')
		iframe_src += '&vehicleEnergy=' + _energy;
	if (_model != '')
		iframe_src += '&vehicleModel=' + _model;
	if (_type != '')
		iframe_src += '&vehicleDescription=' + _type;
	if (_wm_phone != '')
		iframe_src += '&vdrPhoneNumberWm=' + _wm_phone;
	if (_wm_email != '')
		iframe_src += '&vdrEmailSiteWm=' + _wm_email;
	iframe_src += '&wmName=' + _wm_name;
    
    if (_assurance_enable == true)
    {
    	iframe_src += '&insuranceHealthDisplay=1&insuranceCapitalDisplay=1';
    	if (_btn_enable == false)
    		iframe_src += '&insuranceAssistanceDisplay=1&insuranceExtensionDisplay=1'
    }
    
	iframe.id = 'calculator';
	iframe.style.left = (GetWindowsWidth() - 570) / 2 + 'px',
	iframe.setAttribute('height', 560); 
	iframe.setAttribute('width', 570);
	iframe.setAttribute('scrolling', 'no');
	iframe.setAttribute('frameborder', 0);
	iframe.setAttribute('src', iframe_src);
	
	cetelem.appendChild(filter);
	cetelem.appendChild(button);
	cetelem.appendChild(iframe);		

	return true;
}

/*
 *  Insert loading image meanwhile getting monthly price
 */
function	CreateLoadingImg()
{
	var		img_loading = document.createElement('img');
	
	img_loading.setAttribute('src', 'images/icons/loading3.gif');
	document.getElementById(_div_ctlm_mensu).appendChild(img_loading);
}

function	SimulationError(error)
{
	if (_mode == 'debug')
		alert(error);
		
	if (document.getElementById(_div_ctlm_mensu))
	{
		var	element = document.getElementById(_div_ctlm_mensu);
		element.parentNode.removeChild(element);
	}
		
	if (document.getElementById(_div_ctlm_simu))
	{
		var	element = document.getElementById(_div_ctlm_simu);
		element.parentNode.removeChild(element);
	}
}

/*
 *  Check if xml response has errors
 *	@responseXML : xml tree response
 */
function	CheckXmlResponse(responseXML)
{
	if (responseXML.getElementsByTagName('errorCode').length == 0)
	{
		SimulationError('Un problème est survenu lors de la récupération du XML');
		return false;
	}

	// For all browser except Internet Explorer
	if (navigator.appName != 'Microsoft Internet Explorer')
	{
		if (responseXML.getElementsByTagName('errorCode')[0].textContent != '0000')
		{
			SimulationError('Error : '+responseXML.getElementsByTagName('errorDescription')[0].textContent);
			return false;
		}
	}
	// For Internet Explorer
	else
	{
		if (responseXML.getElementsByTagName('errorCode')[0].text != '0000')
		{
			SimulationError('Error : '+responseXML.getElementsByTagName('errorDescription')[0].text);
			return false;
		}
	}
	
	return true;
}

/*
 *  Read xml answer and fill mention's array
 */
function	GetLegalMention(responseXML)
{
	if (navigator.appName == 'Microsoft Internet Explorer')
	{
		_mentions["Crédit affecté pour un véhicule de :"] = responseXML.getElementsByTagName('vehicleprice')[0].text + ' €';
		_mentions["Apport :"] = responseXML.getElementsByTagName('proposalInitialShare')[0].text + ' €';
		_mentions["Montant emprunté :"] = responseXML.getElementsByTagName('proposalOverdraft')[0].text + ' €';
		_mentions["Durée :"] = responseXML.getElementsByTagName('proposalMonth')[0].text + ' mois';
		_mentions["Nombre de mensualités :"] = responseXML.getElementsByTagName('proposalMonth')[0].text + ' mois';
		_mentions["Frais de dossiers :"] = responseXML.getElementsByTagName('fixedExpense')[0].text + ' €';
		_mentions["Coût des mensualités :"] = responseXML.getElementsByTagName('monthlyPayementWithInsurance')[0].text + ' €';
		_mentions["Coût total du crédit :"] = responseXML.getElementsByTagName('totalCost')[0].text + ' €';
		_mentions["Coût total de l’achat à crédit :"] = responseXML.getElementsByTagName('purchaseCostWithInsurance')[0].text + ' €';
		_mentions["TEG fixe :"] = responseXML.getElementsByTagName('proposalTaegRt')[0].text + ' %';
		_mentions["Offre soumise à conditions et sous réserve d’étude et d’acceptation par l’organisme prêteur"] = responseXML.getElementsByTagName('legalMentions')[0].text;
	}
	else
	{
		_mentions["Crédit affecté pour un véhicule de :"] = responseXML.getElementsByTagName('vehicleprice')[0].textContent + ' €';
		_mentions["Apport :"] = responseXML.getElementsByTagName('proposalInitialShare')[0].textContent + ' €';
		_mentions["Montant emprunté :"] = responseXML.getElementsByTagName('proposalOverdraft')[0].textContent + ' €';
		_mentions["Durée :"] = responseXML.getElementsByTagName('proposalMonth')[0].textContent + ' mois';
		_mentions["Nombre de mensualités :"] = responseXML.getElementsByTagName('proposalMonth')[0].textContent + ' mois';
		_mentions["Frais de dossiers :"] = responseXML.getElementsByTagName('fixedExpense')[0].textContent + ' €';
		_mentions["Coût des mensualités :"] = responseXML.getElementsByTagName('monthlyPayementWithInsurance')[0].textContent + ' €';
		_mentions["Coût total du crédit :"] = responseXML.getElementsByTagName('totalCost')[0].textContent + ' €';
		_mentions["Coût total de l’achat à crédit :"] = responseXML.getElementsByTagName('purchaseCostWithInsurance')[0].textContent + ' €';
		_mentions["TEG fixe :"] = responseXML.getElementsByTagName('proposalTaegRt')[0].textContent + ' %';		
		_mentions["Offre soumise à conditions et sous réserve d’étude et d’acceptation par l’organisme prêteur"] = responseXML.getElementsByTagName('legalMentions')[0].textContent;
	}
	
	return true;
}


function	XmlResponse(response_text)
{
	if (window.DOMParser)
	{
		parser = new DOMParser();
		response_xml = parser.parseFromString(response_text, "text/xml");
	}
	else // Internet Explorer
	{
		response_xml = new ActiveXObject("Microsoft.XMLDOM");
		response_xml.async = "false";
		response_xml.loadXML(response_text); 
	}
	
	if (CheckXmlResponse(response_xml) == false)
		return false;

	// Fill mentions tab with xml response
	GetLegalMention(response_xml);

	// Insert monthly price in html code
	document.getElementById(_div_ctlm_mensu).innerHTML = _mentions["Coût des mensualités :"] + ' / mois';
	
	// Create dynamique frame with legal mention
	CreateMentionFrame();				

	return true;
}

/*
 *	Get monthly instalment and insert it in html code, this fonction ask to a webService for get this informations
 */
function	GetMonthlyPrice()
{
	var	cetelem		= document.getElementById('CETELEM');
	var script		= document.createElement('script');
	
	if (cetelem == null)
		return false;

	script.src = _url_server + _pwd_solution + 'ctlm_solution.php?';
    script.src += 'proposalFormat=xml';
    script.src += '&proposalInitialShare=' + _first_deposit;
    script.src += '&proposalMonth=' + _nb_month;
    script.src += '&proposalPrice=' + _vehicle_price;
    script.src += '&proposalProductType=MOD';
    script.src += '&proposalScore=' + _btn_enable;
    script.src += '&proposalDemande=' + _btn_enable;
    script.src += '&proposalStructure=0';
    script.src += '&proposalStyle=0';
    script.src += '&vdrNumberSiteWm=' + _vend_code;
    script.src += '&vdrNumberWm=' + _vend_code;
    script.src += '&vehicleBrand=' + _brand;
    script.src += '&vehicleCategory=' + _category;
    script.src += '&vehicleIsNewBo=' + _is_new_vehicle;
	if (_is_new_vehicle == 0)
	{
		script.src += '&vehicleCirculationFirstDt=' + _circulation_first_date;
		script.src += '&vehicleMileAge=' + _mile_age;
	}
	if (_category == 'MOTO')
   		script.src += '&vehicleCapacity=' + _capacity;
   	else
		script.src += '&vehicleEngineRating=' + _engine_rating;
    script.src += '&wmName=cetelem';
    script.type = 'text/javascript';

	cetelem.appendChild(script);
	
	return true;
}

/*
 *  Get width of browser web.
 */
function	GetWindowsWidth()
{
    if (window.innerWidth)
    	return (window.innerWidth);
    if (document.documentElement && document.documentElement.clientWidth) 
         return (document.documentElement.clientWidth);
    if (document.body && document.body.clientWidth)
    	return (document.body.clientWidth); 
    return 50;
}

/*
 *  Set opacity of one element by his id
 */
function	Fader(id, level)
{
	var fader = document.getElementById(id);

	fader.style.opacity = level;
	fader.style.MozOpacity = level;
	fader.style.KhtmlOpacity = level;
	fader.style.filter = "alpha(opacity=" + level * 100 + ")";
}

/*
 *  Initialiaze the application (variables, events)
 *	@vend_code : Merchant code giving by CETELEM
 *	@vehicle_price : vehicle price in euros
 *  @category : AUTO, MOTO, CARAVANE, MOBILHOME, CAMPINGCAR
 *  @is_new_vehicle : 1 for new vehicle, 0 for second-hand vehicle
 */
function	InitCetelmSimulation(var_vend_code, var_vehicle_price, var_category, var_is_new_vehicle)
{
	_vend_code		= var_vend_code;
	_vehicle_price	= var_vehicle_price;
	_category		= var_category;
	_is_new_vehicle	= var_is_new_vehicle;
	
	if (var_category == 'CAMPINGCAR' || var_category == 'MOBILHOME')
		_nb_month = _is_new_vehicle == 1 ? '144' : '120';
	else
		_nb_month = _is_new_vehicle == 1 ? '72' : '48';
	
	_first_deposit = (_vehicle_price * 20) / 100;

	InitialiazeEvents();
	
	_initialiaze = true;
}

/*
 *  Launch the application
 */
function	RunCetelemSimulation()
{
	if (_initialiaze == false)
	{
		SimulationError('vous devez appeler la foction "InitCetelmSimulation" avant la fonction "RunCetelemSimulation"');
		return false;
	}
	
	var cetelem		= document.createElement('div');
	cetelem.id		= 'CETELEM';
	
	if (document.body != null)
		document.body.appendChild(cetelem);
	
	if (document.getElementById(_div_ctlm_mensu) != null)
	{
		CreateLoadingImg();
		GetMonthlyPrice();
	}
	
	if (document.getElementById(_div_ctlm_simu) != null)
		CreateSimulationFrame();
	document.getElementById("CETELEM").style.display = 'none';
	return true;
}

/*
 *  Set the vehicule circulation first date (mandotory only for second-hand vehicle)
 *  @circulation_first_date : mandatory for second-hand vehicle, format 'JJMMAAAA'
 */
function	SetCirculationFirstDate(var_circulation_first_date)
{
	_circulation_first_date = var_circulation_first_date;
}

function	SetMileAge(var_mile_age)
{
	_mile_age = var_mile_age;
}

/*
 * Activate debug mode : javascript popup when error occur
 */
function	SetDebugMode()
{
	_mode = 'debug';
}

/*
 *	Set serveur URL
 *	@mode : possible values : dev, r7, prod
 */
function	SetServerUrl(mode)
{
	if (mode == 'dev')
		_url_server = 'http://devwebinter-lev1.sun.ctlmcof.fr:8072';
	else if (mode == 'r7')
		_url_server = 'http://recette-7lmauto.neuges.org';
	else if (mode == 'prod')
		_url_server = 'http://www.cetelem-automobile.fr';
}

/*
 * Set element where monthly price was insert
 * @var_ctlm_mensu : element id
 */
function	SetElmCtlmMensu(var_ctlm_mensu)
{
	_div_ctlm_mensu	= var_ctlm_mensu;
}

/*
 * Set element where the calculator appear when the user click
 * @var_ctlm_mensu : element id
 */
function	SetElmCtlmSimu(var_ctlm_simu)
{
	_div_ctlm_simu	= var_ctlm_simu;
}

/*
 *	Show button for acces to credit form 
 */
function	EnableBtnCredit()
{
	_btn_enable = 1;
}

/*
 *	Disable assurance on the calculator
 */
function	DisableAssurance()
{
	_assurance_enable = false;
}

/*
 * Set vehicle brand
 * @var_brand : vehicle brand (RENAULT, PEUGEOT, SUZUKI, ...)
 */
function	SetBrand(var_brand)
{
	_brand =	var_brand;
}

/*
 *	Set number of monthly payments
 *	@var_nb_month : number of month
 */
function	SetNbMonth(var_nb_month)
{
	_nb_month	= var_nb_month;
}

/*
 *	Set the first deposit of the credit
 *	@var_first_deposit : amount of first deposit
 */
function	SetFirstDeposit(var_first_deposit)
{
	_first_deposit	= var_first_deposit;
}

/*
 *	Set the vehicule engine rating
 *	@var_engine_rating : engine rating
 */
function	SetEngineRating(var_engine_rating)
{
	_engine_rating = var_engine_rating;
}

/*
 *	Set the vehicule capacity only for motorbike
 *	@var_capacity : motorbike's capacity
 */
function	SetCapacity(var_capacity)
{
	_capacity = var_capacity;
}

/*
 *	Set the vehicule bodywork
 *	@var_bodywork : bodywork's vehicle
 */
function	SetBodyWork(var_bodywork)
{
	_body_work = var_bodywork;
}

function	SetEnergy(var_energy)
{
	_energy = var_energy;
}

function	SetModel(var_model)
{
	_model = var_model;
}

function	SetType(var_type)
{
	_type = var_type;
}

/*
 *	Set the simulation structure
 *	@var_simu_struc : simulation structure, possible value : cetelem, loisir_finance, without_logo, without_header
 */
function	SetSimuStruc(var_simu_struc)
{
	if (var_simu_struc == 'cetelem')
		_simu_struc = 0;
	else if ((_category == 'CAMPINGCAR' || _category == 'MOBILHOME' || _category == 'CARAVANE') && var_simu_struc == 'loisir_finance')
		_simu_struc = 1;
	else if (var_simu_struc == 'without_logo')
		_simu_struc = 2;
	else if (_category == 'AUTO' && var_simu_struc == 'without_header')
		_simu_struc = 4;
}

/*
 *	Set the simulation color
 *	@var_simu_color : simulation color, possible value : light_blue, orange, red, green, dark_blue, pink
 */
function	SetSimuColor(var_simu_color)
{
	if (var_simu_color == 'light_blue')
		_simu_color = 0;
	else if (var_simu_color == 'orange')
		_simu_color = 2;
	else if (var_simu_color == 'red')
		_simu_color = 4;
	else if (var_simu_color == 'green')
		_simu_color = 6;
	else if (var_simu_color == 'dark_blue')
		_simu_color = 8;
	else if (var_simu_color == 'pink')
		_simu_color = 10;
	else
		SimulationError('La couleur "' + var_simu_color + '" n\'est pas autorisée.\nCouleurs autorisées : light_blue, orange, red, green, dark_blue, pink');
}

/*
 *	Set the webmarchand name
 *	@var_name : webmarchand's name
 */
function	SetWmName(var_name)
{
	_wm_name = var_name;
}

/*
 *	Set the webmarchand phone number
 *	@var_phone : webmarchand's phone number
 */
function	SetWmPhoneNumber(var_phone)
{
	_wm_phone = var_phone;
}


/*
 *	Set the webmarchand e-mail
 *	@var_email : webmarchand's e-mail
 */
function	SetWmEmail(var_email)
{
	_wm_email =  var_email;
}

/*
 * Show legal mention when the mouse is over the monthly price
 */
function	MoveMouse(e)
{
	if (_mention_visible == true)
	{
		// For all browser except Internet Explorer
		if (navigator.appName != "Microsoft Internet Explorer" && document.getElementById("frame"))
		{
			document.getElementById("frame").style.left = e.pageX + 5 + "px";
			document.getElementById("frame").style.top = e.pageY + 10 + "px";
	    }
	    // For Internet explorer
	    else if (document.getElementById("frame"))
	    {
			document.getElementById("frame").style.left = event.clientX + 5 + "px";
			document.getElementById("frame").style.top = event.clientY + 10 + "px";
		}
	}
}

/*
 * Initialize events
 */
function	InitialiazeEvents()
{
	if (document.getElementById(_div_ctlm_mensu) != null)
	{
		document.onmousemove = MoveMouse;
		document.getElementById(_div_ctlm_mensu).onmouseover = function ()
		{
			if (document.getElementById("frame") != null)
			{
				document.getElementById("frame").style.visibility = "visible";
				_mention_visible = true;
			}
		};
		document.getElementById(_div_ctlm_mensu).onmouseout = function ()
		{
			if (document.getElementById("frame") != null)
			{
				document.getElementById("frame").style.visibility = "hidden";
				_mention_visible = false;
			}
		};
	}
	
	if (document.getElementById(_div_ctlm_simu) != null)
	{
		document.getElementById(_div_ctlm_simu).onmousedown = function ()
		{
			Fader('filter', 0);
			Fader('calc_but', 0);
			Fader('calculator', 0);
			
			document.getElementById('filter').style.display='block';
			document.getElementById('calc_but').style.display='block';
			document.getElementById('calculator').style.display='block';
			
			for (var level = 0; level < 1.01; level += 0.02)
			{
				if (level < 0.71)
					setTimeout( "Fader('filter'," + level + ")", level * 1000);
				setTimeout( "Fader('calc_but'," + level + ")", level * 1000);
				setTimeout( "Fader('calculator'," + level + ")", level * 1000);
			}
		}
	}
}

