/****************************
 * demandeContact.js : traitements JavaScript du formulaire de demande de contact Ariase
 ****************************/

// variables globales
var timeout1 = null;
var alertZone;
var codeToucheEntree = 13;
var ndLength = 10;
var ndLengthWithSep = 14;
var divFormLinkeo;
var inputLinkeoPhone;
var divFormContact;
var inputNom;
var inputPhone;
var inputPhoneTest;
var inputMail;
var comment;
var selectJour;
var spanHeure;

/**
 * fonction onload
 * => correspond au "body onload=..."
 **/
/*window.onload = function() {
	
}*/

/**
 * fonction loadPageDefault()
 * => code devant être exécuté au chargement de la page
 **/
function loadPageDefault()
{
	divFormLinkeo = findObject('formLinkeo'); // formulaire pour le webcallback
	inputLinkeoPhone = findObject('TELEPHONE'); // champ telephone pour le webcallback
	divRappelPlusTard = findObject('rappelerPlusTard'); // div contenant le bouton d'affichage du formulaire de contact
	divFormContact = findObject('formContact'); // formulaire de rappel ulterieur 
	alertZone = findObject('alert_zone'); // champ telephone pour le webcallback
	inputNom = findObject('contact_nom'); // champ nom du client a demander par le teleconseiller
	inputPhone = findObject('contact_phone'); // champ telephone pour contacter le client
	inputPhoneTest = findObject('contact_phone_test_adsl'); // champ telephone de la ligne a tester
	inputMail = findObject('contact_mail'); // champ mail
	comment = findObject('contact_commentaire'); // champ commentaire
	selectJour = findObject('contact_date'); // select du jour de rappel
	spanHeure = findObject('select_heure'); // span contenant le select de l heure de rappel
	
	//n'affiche le bouton "rappeler moi plus tard" qui declenche l'ouverture du formulaire de contact que si javascript est activé, sinon le formulaire de contact est deja visible.
	var boutonRappelPlusTard =	document.createElement('a');
	boutonRappelPlusTard.setAttribute("href",'#');
	boutonRappelPlusTard.setAttribute("title",'');
	boutonRappelPlusTard.onclick = function(){afficheContact();return false;} 
	var imageBoutonRappelPlusTard =	document.createElement('img');
	imageBoutonRappelPlusTard.setAttribute("src",'/fr/media/boutons/big/appelez-moi-plus-tard.png');
	imageBoutonRappelPlusTard.setAttribute("alt",'Appelez-moi plus tard');
	boutonRappelPlusTard.appendChild(imageBoutonRappelPlusTard);
	divRappelPlusTard.appendChild(boutonRappelPlusTard);
	changeHeureRappel(selectJour);
}

/**
 * fonction afficheLinkeo()
 * => affiche le formulaire linkeo et masque le formulaire de contact
 * 
 **/
function afficheLinkeo(elem)
{
	if (divFormLinkeo) divFormLinkeo.className = "afficher";
	if (divFormContact) divFormContact.className = "masquer";
	setFocus('TELEPHONE'); // on place le curseur sur le tel linkeo
}

/**
 * fonction afficheContact()
 * => affiche le formulaire de contact et masque le formulaire linkeo
 * 
 **/
function afficheContact()
{
	if (divFormContact) divFormContact.className = "afficher";
	if (divFormLinkeo) divFormLinkeo.className = "masquer";
	setFocus('contact_nom'); // on place le curseur sur le nom
}


/**
 * fonction verifierFormulaireLinkeo()
 * => vérifie que le formulaire de demande de rappel immediat est correctement complété
 **/
function verifierFormulaireLinkeo()
{
	// vérif saisie numéro 
	if (!verifierLigne(inputLinkeoPhone,true,false)) return false;
	return true;
}


/**
 * fonction verifierFormulaireDeContact()
 * => vérifie que le formulaire de demande de contact est correctement complété
 **/
function verifierFormulaireDeContact()
{
	// vérif du nom
	if (!verifierNom(inputNom)) return false;
	// vérif saisie zone numéro contact
	if (!verifierLigne(inputPhone,true,false)) return false;
	// vérif saisie zone numéro de test
	if (inputPhoneTest.value != "" && !verifierLigne(inputPhoneTest,true,true)) return false;
	//verif de l'email
	if (!verifierMail(inputMail)) return false;
	return true;
}


/**
 * fonction dateOk(date)
 * => verifie le bon format de la date YYYYMMDD
 * date (string) = date 
 **/
function dateOk(date)
{
	if(date.value.length != 8)
		return false;
	var annee = date.value.substr(0, 4);
	var mois = date.value.substr(4, 2);
	var jour = date.value.substr(6, 2);

	var regJour = /^(0[1-9]|1[0-9]|2[0-9]|3[0-1])$/;
	var regMois = /^(0[1-9]|1[0-2])$/;
	var regAnnee = /^(20[0-1][0-9])$/;
	var jourOk = regJour.test(jour);
	var moisOk = regMois.test(mois);
	var anneeOk = regAnnee.test(annee);
	
	if(!jourOk || !moisOk || !anneeOk)
		return false;
	return true;
}

/**
 * fonction verifierMail(inputEmail)
 * => vérification sur le mail
 *  * nomDuChamp (string) = intitulé du champ tésté
 **/
function verifierMail(inputEmail)
{
	resetChamp(inputEmail);
	if(inputEmail.value=="" || !emailok(inputEmail)) /*inputEmail.value!="" &&*/
	{
		inputEmail.className = "saisieErreur";
		displayAlert("L'adresse e-mail saisie n'est pas valide.");
		return false;
	}
	return true;
}

/**
 * fonction verifierChampsTexte(inputTexte)
 * => vérification d'un champs texte qui ne doit pas etre vide
 * texte (string) = texte saisi dans le champ input
 * nomDuChamp (string) = intitulé du champ tésté
 **/
function verifierNom(inputTexte)
{
	resetChamp(inputTexte);
	if (inputTexte.value == "")
	{
		inputTexte.className = "saisieErreur";
		displayAlert("Merci de saisir un nom.");
		return false;
	}
	
	return true;
}

/**
 * fonction gererModifLigne(nd,evenement)
 * => en fonction de l'évènement intercepté sur le champ input du n° de ligne, décide quelle action effectuer
 * nd (string) = numéro de ligne saisi dans le champ input
 * evenement = évènement intercepté
 **/
function gererModifLigne(inputTelephone,evenement,phoneStrict)
{
	var codeTouche = window.event ? evenement.keyCode : evenement.which;

	// sauf pression sur la touche Entrée (validation formulaire), on vérifie la ligne saisie
	if(codeTouche != codeToucheEntree) verifierLigne(inputTelephone,false,phoneStrict);
}

/**
 * fonction verifierLigne(nd,termine)
 * => vérification dynamique du numéro de téléphone saisi
 * nd (string) = numéro de ligne saisi dans le champ input
 * termine (bool) = true si le formulaire a été validé (clic sur "tester"), auquel cas on ne tolère pas de numéro incomplet
 **/
function verifierLigne(inputTel,termine,phoneStrict)
{
	nd = inputTel.value;
	resetTelephone(inputTel);
	var erreurChampVide = "Merci de saisir un numéro de téléphone.";
	var erreurChampIncomplet = "Erreur : le numéro de téléphone saisi est incomplet, il doit comporter exactement 10 chiffres.";
	var erreurTypeNumLigne = "Erreur : seuls les numéros de ligne fixe à indicatif géographique (01 à 05) peuvent être testés.";
	var erreurFormatNumLigne = "Erreur : le numéro de téléphone doit comporter exactement 10 chiffres (format 0123456789).";

	// cas [A] : numéro de ligne pouvant être testé / rappelé
	if (isTelephone(nd,phoneStrict))
	{
		if (nd.length == ndLength) inputTel.maxLength = ndLength;
		return true;
	}

	// cas [B] : formulaire validé mais erreur
	if (termine)
	{
		if (nd == "") displayAlert(erreurChampVide); // champ vide
		else if (!isTelephoneComplete(nd)) displayAlert(erreurChampIncomplet); // saisie incomplète
		else if (phoneStrict && !startsLikeTelephone(nd,true)) displayAlert(erreurTypeNumLigne); // numéro fixe attendu
		else displayAlert(erreurFormatNumLigne); // saisie complète mais non valide
		inputTel.className = "saisieErreur";
	}

	// cas [C] : formulaire non validé mais numéro de ligne d'ores-et-déjà invalide
	else if (!startsLikeTelephone(nd,false) || (phoneStrict && !startsLikeTelephone(nd,true)))
	{
		startsLikeTelephone(nd,false) ?	displayAlert(erreurTypeNumLigne) : displayAlert(erreurFormatNumLigne);
		inputTel.className = "saisieErreur";
	}

	return false;
}

/**
 * fonction resetTelephone(inputTelephone)
 * => remise à zéro de la partie "numéro de téléphone" du formulaire
 **/
function resetTelephone(inputTelephone)
{
	inputTelephone.className = "saisie"; // style par défaut sur champ téléphone
	inputTelephone.maxLength = ndLengthWithSep; // maxlength large pour le champ téléphone
	//infoInputTelephone.className = "obligatoireInput"; // style par défaut
	resetMessageErreur();
}

/**
 * fonction resetChamp()
 * => remise à zéro d'un champ
 **/
function resetChamp(champ)
{
	champ.className = "saisie"; // style par défaut sur champ texte
	resetMessageErreur();
}

/**
 * fonction resetHeureRappel()
 * => efface le contenu du select de l'heure
 **/
function resetHeureRappel()
{
	// suppression option du select heure de rappel
	if(spanHeure.hasChildNodes())
	{
		while(spanHeure.hasChildNodes())
			spanHeure.removeChild(spanHeure.firstChild);
	}
}

/**
 * fonction resetMessageErreur()
 * => remise à zéro de la zone de messages d'erreur du formulaire
 **/
function resetMessageErreur()
{

	// suppression messages d'erreur
	alertZone.className = 'visible';
	if(alertZone.hasChildNodes())
	{
		while(alertZone.hasChildNodes())
			alertZone.removeChild(alertZone.firstChild);
	}
}

/**
 * fonction changeHeureRappel(date)
 * => change l'heure de rappel en fonction du jour
 * date (string) = date 
 **/
function changeHeureRappel(date)
{
	clearTimeout(timeout1);
	timeout1 = setTimeout(function()
	{
		if(dateOk(date))
		{
			var xhr;
			if (window.XMLHttpRequest) xhr = new XMLHttpRequest();
			else if (window.ActiveXObject) xhr = new ActiveXObject('Microsoft.XMLHTTP');
			else
			{
				alert('JavaScript : votre navigateur ne supporte pas les objets XMLHttpRequest...');
				return;
			}
			xhr.open('POST','/scripts/ajax/changeHeureRappel.php',true);
			xhr.onreadystatechange = function()
			{
				if (xhr.readyState == 4)
				{
					var reponse = xhr.responseXML;
					if(reponse != null)
					{
						var marker = reponse.getElementsByTagName("marker");
						modifSelectHeure(marker);
					}
				}
			}
			xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
			var data = 'date='+escape(date.value);
			xhr.send(data);
		}
	}
	,300);
}


/**
 * fonction modifspanHeure(marker)
 * => modifie le contenu du select affichant l'heure de rappel
 * marker = objet HTML 
 **/
function modifSelectHeure(marker)
{
	resetHeureRappel();
	var labelHeure = document.createElement("label");
	labelHeure.setAttribute("for", "contact_heure");
	labelHeure.appendChild(document.createTextNode("entre "));
	var selectHeure = document.createElement("select");
	selectHeure.setAttribute("name", "contact_heure");
	selectHeure.setAttribute("id", "contact_heure");
	for(i=0; i<marker.length; i++)
	{
		var option = document.createElement("option");
		var optValue = marker[i].getAttribute("option");
		var text = optValue + "h et " + (parseInt(optValue)+1) + "h";
		option.appendChild(document.createTextNode(text));
		if(i==0) option.setAttribute("selected", "selected");
		option.setAttribute("value", optValue);
		selectHeure.appendChild(option);
	}
	var input =	document.createElement('input');
	input.setAttribute("type",'hidden');
	input.setAttribute("name",'previous_dateRappel');
	input.setAttribute("value", selectJour.value);
	spanHeure.appendChild(labelHeure);
	spanHeure.appendChild(selectHeure);
	spanHeure.appendChild(input);
}

/**
 * fonction displayAlert(msg)
 * => afficher un message d'erreur au-dessus du formulaire
 * msg (string) = message contextuel à afficher
 **/
function displayAlert(msg)
{
	resetMessageErreur();
	var paragraphe = document.createElement("p");
	paragraphe.className = "erreur";
	paragraphe.appendChild(document.createTextNode(msg));
	alertZone.className = "alerte";
	alertZone.appendChild(paragraphe);
}
