﻿/** Valider le champ de saisie de la recherche
	input : l'ID de l'element, l'ID de la forme contient cet element 
			et l'action de la forme à executer 
	output: false si aucun mot à envoyer, true .
**/

function searchIsValid(objId, formId, action){
	str = document.getElementById(objId).value;
	tab = str.split(' ');
	str = '';
	for(i=0; i<tab.length; i++){
		if (tab[i].length >= 3)
			str = tab[i]+' '+str;
	}
	if (str == ''){
		document.getElementById(objId).focus(); 
		return false;
	} 
	else {
		document.getElementById(formId).action = action; 
		return true;
	}
}

/** Vider un champ de saisie à l'entrée du curseur
	input : l'ID de l'element et la valeur à comparrer à cet element avant le vidage 
	output: rien.
**/


function isFocused(objId, val){
	str = document.getElementById(objId).value;
	if (str == val)
		document.getElementById(objId).value = '';
	return true;
}

/** Initialiser un champ de saisie à la sortie du curseur
	input : l'ID de l'element et la valeur à affecter à cet element 
	output: rien.
**/

function isBlured(objId, val){
	str = document.getElementById(objId).value;
	if (str == '')
		document.getElementById(objId).value = val;
	return true;
}

/** Récupérer un nombre déterminé de mots à partir d'une phrase
	input : une phrase comme chaine de caractère word 
			et un entier nbr represente le nombre du mots à extraire.
	output: une chaine de caractère contien nbr mots.
**/

function xWords(word, nbr){
	tab = word.split(' ');
	len = tab.length;
	str = '';
	cnt = 0;
	i = 0;
	while(i < len && cnt < nbr){
		if (tab[i].length > 1){
			str = tab[i]+' '+str;
			cnt++;
		}
		i++;
	}
	return str;
}

/** Obtenir le numéro équivalent à un mois donné
	input : nom du mois comme chaine de caractère
	output: un entier entre 1 et 12 ou une chaine vide.
**/

function monthToNum(mois)
{
	if (mois == "Janvier")  return 1;
	if (mois == "Février")  return 2;
	if (mois == "Mars")  return 3;
	if (mois == "Avril")  return 4;
	if (mois == "Mai")  return 5;
	if (mois == "Juin")  return 6;
	if (mois == "Juillet")  return 7;
	if (mois == "Août")  return 8;
	if (mois == "Septembre")  return 9;	
	if (mois == "Octobre")  return 10;
	if (mois == "Novembre")  return 11;
	if (mois == "Décembre")  return 12;
    if (mois == "")  return ""; 
} 

/** Obtenir le nom du mois équivalent à un numéro donné 
	input : un entier
	output: le nom du mois comme chaine de caractère 
**/

function numToMonth(num)
{
	if (num == 1)  return "Janvier";
	if (num == 2)  return "Février";
	if (num == 3)  return "Mars";
	if (num == 4)  return "Avril";
	if (num == 5)  return "Mai";
	if (num == 6)  return "Juin";
	if (num == 7)  return"Juillet" ;
	if (num == 8)  return "Août";
	if (num == 9)  return"Septembre" ;	
	if (num == 10)  return "Octobre";
	if (num == 11)  return "Novembre";
	if (num == 12)  return "Décembre";
    if (num == "")  return "";
} 

/** Validation d'un email
	input : objet text (element d'une forme)
	output: true ou false avec un message d'erreur
**/

function emailIsValid(objId){
   var o, errors = '';
   o = document.getElementById(objId).value;
   ok = true;
   //re = /([a-zA-Z0-9]+(([\.\-\_]?[a-zA-Z0-9]+)+)?)\@(([a-zA-Z0-9]+[\.\-\_])+[a-zA-Z]{2,4})/;
   re = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.(\w{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$/;
   if (o != '') {
        if (! re.test(o)){
	       errors += '- L\'e-mail paraît invalide.\n';
	    }
   }
   if (errors) alert('Erreur(s) :\n' + errors);
}

/** Validation universelle d'une forme 
	input : tableau double ou triple dimensions contient les elements à valider.
			Chaque element envoyé avec son ID, son type, et ses paramètres de validation.
			Les types utilisés sont : isText, isNumber, isEmail, isPassword, isPhone et isSelect.
			Les paramètres se représentent par une valeur unique ou un tableau selon le type :
			I-  pour isText, 2 cas se présentent :
				1- aucun paramètre (c'est la valeur par défaut) : signifie que la zone de texte 
					ne doit pas être vide.
				2- un tableau de chaînes de caractères : sont les valeurs à échapper.
			II- pour isNumbre, 2 cas se présentent :
				1- aucun paramètre (c'est la valeur par défaut) : signifie la zone de texte 
					ne doit pas être vide.
				2- un tableau de deux valeurs : ces deux valeurs indiquent les limites 
					d'un intervalle de validité :
					[NEGATIVE_INFINITY, POSITIVE_INFINITY] = tous les valeurs numérique 
															 (c'est la valeur par défaut)
					[NEGATIVE_INFINITY, val] = tous les valeurs inférieurs à val
					[val1, val2] = si val1 est inférieur à val2 donc on prend tous les valeurs 
									comprise entre les deux
								   si val1 est supérieur à val2 on prend les valeurs inférieurs 
								   à val2 et celles superieur à val1
					[val, POSITIVE_INFINITY] = tous les valeurs superieurs à val
					[val, val] = tous les valeurs differentes à val
			III- pour isEmail, aucun paramètre
			IV- pour isPassword, un entier qui désigne le minimum de caractères valide
			V- pour isPhone, aucun paramètre
			VI- pour isSelect, 2 cas se présentent :
				1- aucun paramètre (c'est la valeur par défaut) : signifie l'obligation 
					de sélectionner une option.
				2- un entier : désigne le minimum d'options à sélectionner pour la validation 
					(Necessite que l'attribut multiple de l'objet SELECT doit être actif)
	output: true ou false avec un message d'erreur
**/

function isValid(toValidate){
   var d = document, errors = '', ok = true;
   var count = toValidate.length;
   
   for (i = 0; i < count; i++){
	   	switch (toValidate[i][1]) {
			case "isText": 
						if (d.getElementById(toValidate[i][0]).type != "text" &&
							d.getElementById(toValidate[i][0]).type != "textarea"){
							errors += '- Attention: il y a un champ mal typé !.\n';
							ok = false;
						}
						else{
							if (d.getElementById("lbl_" + toValidate[i][0])){
								label = d.getElementById("lbl_" + toValidate[i][0]).innerHTML;
								if (d.getElementById(toValidate[i][0]).value == "") {
									errors += '- أدخل ' + label + '.\n';
								}
								else{
									if (toValidate[i][2] != undefined){
										for (j = 0; j < toValidate[i][2].length; j++){
											if (d.getElementById(toValidate[i][0]).value == toValidate[i][2][j]){ 
												errors += '- Entrez une valeur pour ' + label + ' déférente à ' + toValidate[i][2][j] + '.\n';
												break;
											}
										}
									}
								}
							}
							else{
								errors += '- Attention: aucun correspondance pour un label !.\n';
								ok = false;
							}
						}
						break;
			case "isNumber": 
						/*if (d.getElementById(toValidate[i][0]).type != "text"){
							errors += '- Attention: il y a un champ mal typé !.\n';
							ok = false;
						}
						else{*/
							if (d.getElementById("lbl_" + toValidate[i][0])){
								label = d.getElementById("lbl_" + toValidate[i][0]).innerHTML;
								val = d.getElementById(toValidate[i][0]).value;
								if (val == '' || isNaN(val)) {
									errors += '- Entrez une valeur numérique pour ' + label + '.\n';
								}
								else{
									if (toValidate[i][2] != undefined){
										if (isFinite(toValidate[i][2][0]) && isFinite(toValidate[i][2][1])){
											if (toValidate[i][2][0] == toValidate[i][2][1])
												str = " déférente à " + toValidate[i][2][0];
											else
												if (toValidate[i][2][0] > toValidate[i][2][1])
													str = " inferieur à " + toValidate[i][2][1] + " ou superieur à " + toValidate[i][2][0];
												else
													str = " superieur à " + toValidate[i][2][0] + " et inferieur à " + toValidate[i][2][1];
										}
										else{
											if (isFinite(toValidate[i][2][0]))
												str = " superieur à " + toValidate[i][2][0];
											else
												if (isFinite(toValidate[i][2][1]))
													str = " inferieur à " + toValidate[i][2][1];
										}
										
										if (isFinite(toValidate[i][2][0]) && isFinite(toValidate[i][2][1]) && 
											(toValidate[i][2][0] > toValidate[i][2][1])){
											if(val <= toValidate[i][2][0] && val >= toValidate[i][2][1])
												errors += '- Entrez une valeur pour ' + label + str + '.\n';
										}
										else
											if (val <= toValidate[i][2][0] || val >= toValidate[i][2][1])
												errors += '- Entrez une valeur pour ' + label + str + '.\n';
									}
								}
							}
							else{
								errors += '- Attention: aucun correspondance pour un label !.\n';
								ok = false;
							}
						/*}*/
						break;
			case "isEmail": 
						if (d.getElementById(toValidate[i][0]).type != "text"){
							errors += '- Attention: il y a un champ mal typé !.\n';
							ok = false;
						}
						else{
							if (d.getElementById("lbl_" + toValidate[i][0])){
								o = d.getElementById(toValidate[i][0]).value;
								label = d.getElementById("lbl_" + toValidate[i][0]).innerHTML;
								if (o != '') {
									/*re = /([a-zA-Z0-9]+(([\.\-_]?[a-zA-Z0-9]+)+)?)@(([a-zA-Z0-9]+[\.\-_])+[a-zA-Z]{2,4})/;*/
									re = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.(\w{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$/;
									if (! re.test(o)){
										errors += '- أدخل ' + label + '.\n';
									}
								}
								else{
									errors += '- أدخل ' + label + '.\n';
								}
							}
							else{
								errors += '- Attention: aucun correspondance pour un label !.\n';
								ok = false;
							}
						}
						break;
			case "isPassword": 
						if (d.getElementById(toValidate[i][0]).type != "password"){
							errors += '- Attention: il y a un champ mal typé !.\n';
							ok = false;
						}
						else{
							if (d.getElementById("lbl_" + toValidate[i][0])){
								str = d.getElementById(toValidate[i][0]).value;
								minval = Number(toValidate[i][2]);
								if (str == '' || str.length < minval) {
									label = d.getElementById("lbl_" + toValidate[i][0]).innerHTML;
									errors += '- Entrez une valeur pour ' + label + ' (Plus ou égale à ' + minval + ' caractères).\n';
								}
							}
							else{
								errors += '- Attention: aucun correspondance pour un label !.\n';
								ok = false;
							}
						}
						break;
			case "isPhone": 
						if (d.getElementById(toValidate[i][0]).type != "text"){
							errors += '- Attention: il y a un champ mal typé !.\n';
							ok = false;
						}
						else{
							if (d.getElementById("lbl_" + toValidate[i][0])){
								label = d.getElementById("lbl_" + toValidate[i][0]).innerHTML;
								if (d.getElementById(toValidate[i][0]).value == '') {
									errors += '- Entrez une valeur pour ' + label + '.\n';
								}
								else{
									re = /\s/g;
									str = d.getElementById(toValidate[i][0]).value;
									str = str.replace(re, "");
									re = /^((\+|00)?\d{1,3}(-\/)?)?(\(?0\)?)?(\d{8,9}|[-\/\d]+)$/;
									if (! re.test(str)) {
										errors += '- Entrez une valeur valide pour ' + label + '.\n';
									}
								}
							}
							else{
								errors += '- Attention: aucun correspondance pour un label !.\n';
								ok = false;
							}
						}
						break;
			case "isSelect": 
						if (d.getElementById(toValidate[i][0]).type != "select-one" && 
							d.getElementById(toValidate[i][0]).type != "select-multiple"){
							errors += '- Attention: il y a un champ mal typé !.\n';
							ok = false;
						}
						else{
							if (d.getElementById("lbl_" + toValidate[i][0])){
								label = d.getElementById("lbl_" + toValidate[i][0]).innerHTML;
								if (toValidate[i][2] == undefined || Number(toValidate[i][2]) == 1){
									if (d.getElementById(toValidate[i][0]).selectedIndex == -1 ||
										d.getElementById(toValidate[i][0]).options[d.getElementById(toValidate[i][0]).selectedIndex].value == '') {										
										errors += '- Selectionnez une valeur pour ' + label + '.\n';
									}
								}
								else{
									if (! d.getElementById(toValidate[i][0]).multiple){
										errors += '- Attention: l\'element SELECT (' + label + ') doit être multiple !.\n';
										ok = false;
									}
									else{
										countsel = 0;
										for (j = 0; j < d.getElementById(toValidate[i][0]).length; j++)
											if (d.getElementById(toValidate[i][0]).options[j].selected)
												countsel++;
										if (countsel < Number(toValidate[i][2]))
											errors += '- Selectionnez au moins ' + toValidate[i][2] + ' valeurs pour ' + label + '.\n';
									}
								}
							}
							else{
								errors += '- Attention: aucun correspondance pour un label !.\n';
								ok = false;
							}
						}
						break;
		}
		if (! ok)
			break;
	}
	if (errors){
	   //alert('Erreur(s) :\n' + errors);
	   $('#dialog').show();
	   $('#dialog p').html(errors.replace(/\n/g, "<br />"));
	   $('#dialog').dialog('open');
	   return false;
	}
	else
   		return true;
}

/** Creer le div qui sera utilisé en cas d'erreur comme support du message
	Important ! appeler la fonction après le chargement du document.
	input : rien
	output: rien
**/

function errorsCarry(){
	
	// recherche du noeud parent
	var Parent = document.body;
	
	// création des nouveaux noeuds
	var nouveauDiv = document.createElement('div');
	var nouveauP = document.createElement('p');
	
	// paramétrage des nouveaux noeuds
	nouveauDiv.id = 'dialog';
	nouveauDiv.title = 'الأخطاء! ';
	nouveauDiv.style.display = 'none';
	// raccord des noeuds
	nouveauP.appendChild(document.createTextNode("Notre message d'erreur sera ecrite ici ..."));
	nouveauDiv.appendChild(nouveauP);
	Parent.appendChild(nouveauDiv);
	
	$(function(){

		// Dialog			
		$('#dialog').dialog({
			autoOpen: false,
			width: 370,
			modal: true,
			buttons: {
				"Ok": function() { 
					$(this).dialog("close"); 
				}/*, 
				"Cancel": function() { 
					$(this).dialog("close"); 
				}*/ 
			}
		});
		
		// Dialog Link
		/*$('#dialog_link').click(function(){
			$('#dialog').dialog('open');
			return false;
		});*/
	});
}

/** Regénérer nbr fois l'elément objId et les disposer selon params (horizontal ou vertical)
	input : container c'est l'id de l'élément dans le quel on génère les éléments <div ...>
			l'identifiant de l'élément à regénérer objId
			combien de fois nbr
			et selon quels noms, quelle disposition, et quels sont les attributs affectés 
			pour objId sous form d'une chaine de caractères, dans un tableau params ["name",
			"dispo", 'type="..." class="..." ...']
	output: rien.
**/

function cloneIt(containerId, objId, nbr, params)
{
	 var newcontent = '';
	 var name = params[0];
	 var dispo = params[1];
	 var attrib = params[2];
	 
	 switch (dispo){
		 case "horiz": between = " "; break;
		 case "horiz": between = "<br />"; break;
	 }
	 
	 for (i=1; i<=nbr; i++){
	 	newcontent += '<input id="' + ibjId + String(i) + '" name="' + name + String(i) + '" ' + attrib + '>' + between + "\n";
	 }
	 //document.getElementById('scatable').insertAdjacentHTML("AfterEnd", newtr);
	 document.getElementById('container').innerHTML = newcontent;
}

/** Pour l'iniàtialisation des variables et le mchargement des images au préalable
	Déclarer dedans toutes les fonctions à éxécuter avant toute autre chose
	input : rien.
	output: rien.
**/

/*window.onload = function() { 
	preloadImages();	// voir la description du fonction dans images.js
	errorsCarry();		// Initialiser la boite à message d'erreur
	sortModules();		// Ordonner les modules de la barre droite (pages internes)
	init_dw_Scroll();	// Initialiser le module du Scrolling Div
}*/
