var formLastCheck = {};
var formEmptyCheckResult = false;

jQuery(document).ready(function() {
	setFormLastChecks();
});

/**
 * Set formLastCheck values to avoid removing already set information
 * when the page loaded
 * 
 */
function setFormLastChecks()
{
	var forms = jQuery('.form_test');
	if (forms.length == 0) {
		return;
	}
	
	var form = forms[0];
	for (var i = 0; i < form.elements.length; i++) {
		var e = form.elements[i];
		formLastCheck[e.name] = e.value;
	}
}

function cpverif(cp,insee)
{
	document.getElementById("loading_test").style.display="block";
	var url 	=	'/ajax/cpverif/cp/'+cp+'/insee/'+insee;

	jQuery.ajax({type: "POST",
        url: url, 
	    cache: false, 
	    success: function(data) {
			elemResultat = document.getElementById("comune_typevoie");
			elemResultat.innerHTML = data;
			elemResultat.style.display = "block";
			document.getElementById("adresse").innerHTML = "";
			document.getElementById("adresse_numero").innerHTML = "";
			document.getElementById("adresse").style.display = "none";
			document.getElementById("adresse_numero").style.display = "none";
			document.getElementById("adresse_rivoli").style.display = "none";
									
			document.getElementById("loading_test").style.display = "none";
		}
	});
}

/**
 * Hide all input elements after e
 * 
 * @param <input> e
 */
function preAlterAddressForm(e)
{
	var form = e.form;
	
	if (!form) {
		return;
	}
	
	var hide = false;
	for (input in form) {
		// "for" processes lots of unwanted "properties"
		if (!form[input] || !form[input].name) {
			continue;
		}

		var idsToCheck = ["mediapostCodeInsee",
		                    "mediapostTypeVoie",
		                    "mediapostMatriculeVoie",
		                    "mediapostCleGeo",
		                    "numeroManuel"];
		
		if (!in_array(form[input].id, idsToCheck)) {
			continue;
		}
		
		if (input == e.name) {
			hide = true;
			continue;
		}
		
		if (hide === true) {
			if (!form[input].parentNode || form[input].type == 'hidden') {
				continue;
			}
			form[input].parentNode.style.display = 'none';
		}
	}
}

function in_array(needle, haystack)
{
	var key = '';
	 
    for (key in haystack) {
    	if (haystack[key] == needle) {
            return true;
        }
    } 
    return false;
}

/**
 * Alter address form options, values, shown inputs
 * depending on received data.
 * 
 */
function alterAddressForm(values, form)
{
	if (!values || !form) {
		return;
	}
	
	for (var i = 0; i < form.elements.length; i++) {
		var container = form.elements[i];
		var name = container.name;
		var data = values[name];
		
		if (!container || !data) {
			continue;
		}
		
		if (data.display == 1) {
			removeOptions(container);
			var sortedOptions = [];
			var unsortedOptions = [];
			var optionsToSort = [];
			var squizzSelectItem = false;
			var c=0;
			
			for (var optK in data.options) {
				var option = [];
				
				if(data.options[optK].substring(0,12) == 'Sélectionnez') {
					squizzSelectItem = c;
				}
				option.push(data.options[optK]);
				
				if (optK == data.selected) {
					option.push(new Option(data.options[optK], optK, false, true));
				} else {
					option.push(new Option(data.options[optK], optK, false, false));
				}
				
				unsortedOptions.push(option);
				c++;
			}
			
			// Retrait de l'option "Selectionnez..." avant le tri du tableau
			if(squizzSelectItem !== false) {
				sortedOptions.push(unsortedOptions[squizzSelectItem]);
				for(x=0; x<unsortedOptions.length; x++) {
					if(x !== squizzSelectItem) {
						optionsToSort.push(unsortedOptions[x]);
					}
				}
			} else {
				optionsToSort = unsortedOptions;
			}
			
			// Tri du tableau
			optionsToSort.sort(function(a,b){
				if(a[0]*1 > 0 &&  b[0]*1 > 0) {
					// tri de type numerique (numeros de voie)
					return ((a[0]*1 < b[0]*1) ? -1 : ((a[0]*1 > b[0]*1) ? 1 : 0));
				} else {
					// tri de type alphabetique
					return ((a[0] < b[0]) ? -1 : ((a[0] > b[0]) ? 1 : 0));
				}
			});
			
			// On remet l'option "Sélectionnez au début...
			for(x=0; x<optionsToSort.length; x++) {
				sortedOptions.push(optionsToSort[x]);
			}
			
			for(x=0; x<sortedOptions.length; x++) {
				try {
					container.add(sortedOptions[x][1], null);
				} catch (e) {
					container.add(sortedOptions[x][1]);
				}
			}
			container.parentNode.style.display = 'block';
		} else {
			container.parentNode.style.display = 'none';
			removeOptions(container);
		}
	}
}

/**
 * Hide or show manual address input depending on street number value
 * 
 * @param e
 */
function toggleAddressManual(e)
{
	var manualInput = e.form.numeroManuel;
	var manual = manualInput.parentNode;

	if (e.value == 'autre_numero') {
		manual.style.display = 'block';
	} else {
		manual.style.display = 'none';
		manualInput.value = '';
	}
}

/**
 * Remove all options from a select input
 * 
 * @param <input> s
 */
function removeOptions(s)
{
	for (opt in s.options) {
		s.remove(0);
	}
}

/**
 * Specific checkElement for postCode, since we need to be able to
 * call it from elsewhere than itself. 
 * 
 * @param url
 * @returns
 */
function checkPostCode(url, formId)
{
	var form = document.getElementById(formId);
	if (!form || !form.codePostal) {
		// @todo
		return;
	}
	
	var e = form.codePostal;
	if (e.value.length == 5) {
		return checkElement(url, e, false);
	} else {
		if (formEmptyCheckResult === false) {
			formEmptyCheckResult = true;
			return checkElement(url, e, true);
		} else {
			formLastCheck['codePostal'] = null;
			return alterAddressForm(formEmptyCheckResult, form);
		}
	}
}

/**
 * Check form on server and change it depending on the new values 
 * 
 * @param url check URL
 * @param e
 */
function checkElement(url, e, setEmptyCheckResult)
{
	/*
	 * Avoid multiple checks of the same value.
	 */
	if (formLastCheck[e.name] && formLastCheck[e.name] != '') {
		if (formLastCheck[e.name] == e.value) {
			return;
		} else {
			/* @todo: interrupt ajax call */
		}
	}
	
	formLastCheck[e.name] = e.value;
	var localPostValue = e.value;
	
	var params = {};
	for (var eId in e.form) {
		elt = e.form[eId]
		
		if (typeof(elt) == 'undefined' || !elt || typeof(elt.name) == 'undefined' || !elt.name) {
			continue;
		}
		
		if (elt && elt.value) {
			params[elt.name] = elt.value;
		}
		
		// we dont want old values
		if (elt.name == e.name) {
			break;
		}
	}
	
	preAlterAddressForm(e);
	
	var loader = jQuery(e.form.parentNode).find('.loading_test');
	if (loader && loader.length != 0) {
		loader = loader[0];
	}
	loader.style.display = 'block';
	jQuery.ajax({type: "POST",
        url: url, 
        data: params,
	    cache: false, 
	    success: function(data) {
			if (localPostValue == formLastCheck[e.name]) {
				loader.style.display = 'none';
				if (data != null) {
					if (setEmptyCheckResult && setEmptyCheckResult === true) {
						formEmptyCheckResult = data;
					}
					alterAddressForm(data, e.form);
				}
			}
			return;
		}
	});
}

function adresseverif(insee,typevoie)
{
	document.getElementById("loading_test").style.display = "block";
	var url = '/ajax/adresseverif/insee/'+insee+'/typevoie/'+typevoie;
	
	jQuery.ajax({type: "POST",
        url: url, 
	    cache: false, 
	    success: function(data) {
			elemResultat = document.getElementById("adresse");
			elemResultat.innerHTML = data;
			elemResultat.style.display = "block";
			document.getElementById("adresse_numero").innerHTML = "";
			document.getElementById("adresse_numero").style.display = "none";
			document.getElementById("adresse_rivoli").style.display = "none";
									
			document.getElementById("loading_test").style.display = "none";
		}
	});
}

function adressenumero(insee,voie)
{
	document.getElementById("loading_test").style.display="block";
	var url = '/ajax/adressenumero/insee/'+insee+'/voie/'+voie;
	
	jQuery.ajax({type: "POST",
        url: url, 
	    cache: false, 
	    success: function(data) {
			elemResultat = document.getElementById("adresse_numero");
			elemResultat.innerHTML = data;
			elemResultat.style.display = "block";
									
			document.getElementById("adresse_rivoli").style.display = "none";
			document.getElementById("loading_test").style.display = "none";
		}
	});
}

function adressenumeromanuel()
{
	document.getElementById("loading_test").style.display="block";
	var url 	=	'/ajax/adressenumeromanuel';
	
	jQuery.ajax({type: "POST",
        url: url, 
	    cache: false, 
	    success: function(data) {
			elemResultat = document.getElementById("adresse_numero");
			elemResultat.innerHTML = data;
			elemResultat.style.display="block";
									
			document.getElementById("adresse_rivoli").style.display = "none";
			document.getElementById("loading_test").style.display = "none";
		}
	});
}

function validateadresse()
{
	cp = insee = type_voie = voie = numero = numeromanuel = null;
	document.getElementById("loading_test").style.display = "block";
	if(document.getElementById("code_postal")) { cp = document.getElementById("code_postal").value; }
	if(document.getElementById("want_insee")) { insee = document.getElementById("want_insee").value; }
	if(document.getElementById("want_type_voie")) { type_voie = document.getElementById("want_type_voie").value;}
	if(document.getElementById("want_voie")) { voie = document.getElementById("want_voie").value; }
	if(document.getElementById("want_numero") ) { numero = document.getElementById("want_numero").value; }
	if(document.getElementById("numeroVoie_manuel")) { numeromanuel = document.getElementById("numeroVoie_manuel").value; }
	
	
	var url = '/ajax/validateadresse/cp/'+cp+'/insee/'+insee+'/typevoie/'+type_voie+'/voie/'+voie+'/numero/'+numero+'/nman/'+numeromanuel;
	
	jQuery.ajax({type: "POST",
        url: url, 
	    cache: false, 
	    success: function(data) {
			elemResultat = document.getElementById("adresse_rivoli");
			elemResultat.innerHTML = data;
			document.getElementById("adresse_rivoli").style.display = "none";
			document.getElementById("loading_test").style.display = "none";
		}
	});
}

function click_champ(id_recherche,txt_defaut){
	if( document.getElementById(id_recherche).value== txt_defaut){
		document.getElementById(id_recherche).value= "";
	}
}
function giveUp_champ(id_recherche,txt_defaut){
	if( document.getElementById(id_recherche).value== ""){
		//document.getElementById(id_recherche).value= txt_defaut;
	}
}

function lance_submit(formAction)
{
	jQuery("#form_test").animate({ opacity: 0 }, 500 );
	setTimeout(function(){
		   jQuery("#bloc_transition").fadeIn(600);
	},350);
	
	// On verifie que le numero teste n'est pas un numero VoIP
	var tel = document.getElementById('tel_fix').value;
	if (tel == '') {
		var tel = 'none';
	}
	
	jQuery.ajax({type: "GET",
        url: '/ajax/verifvoip/tel/' + tel, 
	    cache: false, 
	    success: function(data) {
			if (dataTest != '') {
				javascript:openDialogJQ('boxVoIP');
				document.getElementById('boxVoIP').innerHTML = data;
				return false;
			} else {
				// Recuperation des variables necessaires au test
				var profilId    = document.getElementById('profile').value;
				var code_postal = document.getElementById('code_postal').value;
				if (code_postal != '' && code_postal.length == 5) {
					var want_insee     = document.getElementById('want_insee').value;
					var want_type_voie = document.getElementById('want_type_voie').value;
					var want_voie      = document.getElementById('want_voie').value;
					var want_numero    = document.getElementById('want_numero').value;
					var want_rivoli    = document.getElementById('want_rivoli').value;
				} else {
					var want_insee     = '';
					var want_type_voie = '';
					var want_voie      = '';
					var want_numero    = '';
					var want_rivoli    = '';
				}
				
				
				var parameters = 'profilId=' + profilId + '&tel=' + tel + '&code_postal=' + code_postal + '&want_insee=' + 
				                  want_insee + '&want_rivoli=' + want_rivoli + '&want_type_voie=' + want_type_voie + '&want_voie=' + want_voie + 
				                  '&want_numero=' + want_numero;
				
				jQuery.ajax({type: "POST",
			        url: formAction, 
			        data: parameters,
				    cache: false, 
				    success: function(data) {
						//return true;
					}
				});
				
				if (code_postal != '' && code_postal.length == 5) {
					var urlRedirect = formAction + "/profilId/" + profilId + "/tel/" + tel + "/code_postal/" + code_postal + "/want_insee/" +
					                want_insee + "/want_rivoli/" + want_rivoli + "/want_type_voie/" + want_type_voie + "/want_voie/" + 
					                want_voie + "/want_numero/" + want_numero;
				} else {
					var urlRedirect = formAction + "/profilId/" + profilId + "/tel/" + tel;
				}

				timedProg(urlRedirect, false);
			}
		}
	});
}

function timedProg(urlRedirect, redirected) {
	setTimeout("window.location.replace('" + urlRedirect + "')", 8000);
}	

function saveCall()
{
	document.getElementById('errorMsg').style.display = 'none';
	var horaires = document.getElementById('horaires').value;
	var callLine = document.getElementById('callLine').value;
	var callName = document.getElementById('callName').value;

	if (horaires == 'now' && callLine != '') {
		wcbCallTo(callLine, 'WCB-NUMIP');
		return;
	}
	
	if (horaires == '' || horaires == '0') {
		document.getElementById('errorMsg').style.display = 'block';
		document.getElementById('errorMsg').innerHTML = "<br/>Merci d'indiquer l'horaire de rappel.<br/><br/>";
		return;
	}
	
	if (callLine == '' || callLine == 'none') {
		document.getElementById('errorMsg').style.display = 'block';
		document.getElementById('errorMsg').innerHTML = "<br/>Merci d'indiquer le numéro sur lequel vous contacter.<br/><br/>";
		return;
	}
	
	if (callName == '') {
		document.getElementById('errorMsg').style.display = 'block';
		document.getElementById('errorMsg').innerHTML = "<br/>Merci d'indiquer le nom de la personne à demander.<br/><br/>";
		return;
	}
	
	var url = '/ajax/savecall/callLine/' + callLine + '/horaires/' + horaires + '/callName/' + callName;
	jQuery.ajax({type: "GET",
        url: url, 
	    cache: false, 
	    success: function(data) {
			document.getElementById('confirmCall').style.display = 'block';
			document.getElementById('confirmCall').innerHTML = "Rendez-vous téléphonique enregistré !<br/><br/>";
		}
	});
}

function saveRappel(telRap, horaireRap)
{
	if (telRap.length == 10) {
		var url = '/ajax/savecall/callLine/' + telRap + '/horaires/' + horaireRap;
		
		jQuery.ajax({type: "GET",
	        url: url, 
		    cache: false, 
		    success: function(data) {
				document.getElementById('rappelResult').style.display = 'block';
				document.getElementById('rappelResult').innerHTML = "<span style='color: green'>Rendez-vous téléphonique enregistré !</span>";
			}
		});
	} else {
		document.getElementById('rappelResult').style.display = 'block';
		document.getElementById('rappelResult').innerHTML = "<span style='color: #CC0000'>Merci d'indiquer votre numéro de téléphone.</span>";
	}
	
	setTimeout('maskResultRappel();', 3000);
}

function maskResultRappel()
{
	document.getElementById('rappelResult').innerHTML = '';
	document.getElementById('rappelResult').style.display = 'none';
}

function confirmCallBack( checkElement )
{
	if (checkElement.checked == true) {
		if ( jQuery( "#dialog-confirm" ).length == 0 ) {
			div_content = '<div id="dialog-confirm" title="Demande de rappel">';
			div_content += '<p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span>Vous demandez &ecirc;tre &agrave; rappell&eacute; par un t&eacute;l&eacute;conseiller, en &ecirc;tes-vous sur ?</p>';
			div_content += '</div>';
			jQuery('body').append(div_content);
		}
		
		jQuery( "#dialog-confirm" ).dialog({
			resizable: false,
			width:460,
			height:160,
			modal: true,
			buttons: {
				"Oui": function() {
					jQuery( this ).dialog( "close" );
				},
				"Non, je teste seulement ma ligne": function() {
					checkElement.checked = false;
					jQuery( this ).dialog( "close" );
				}
			}
		});
	}
}

