/**
 * Validation de formulaire via Ajax
 * afin d'eviter de doubler les controles
 * formulaires
 *
 * Inspire par http://tetlaw.id.au/view/javascript/really-easy-field-validation
 * et http://particletree.com/features/degradable-ajax-form-validation/
 *
 * @author atissier@altima.fr
 * @author jnoel@altima.fr
 */
 
// Cette classe va permettre d'etendre le comportement dans une page
// a de la simple verification de type. Cela permettra par 
// exemple de controler qu'une methode d'identification et une seule
// a ete renseignee, ou que deux mots de passe sont identiques.
// Ancienne methode : on associe a une classe CSS une fonction cote client.
var AjaxValidator = Class.create();
AjaxValidator.prototype = {
	// Constructeur
	initialize : function(className, test) {
		this.className  = className;
		this._test      = test;
	},
	// Controle a effectuer sur le champ
	test : function(v, elm, action,codeLangue) {
		return this._test(v,elm,action,codeLangue);
	}
}

// Nouvelle methode : on associe a une classe CSS un ensemble de champs a envoyer
// au serveur. des options permettent de specifier le comportement attendu.
var AjaxControl = Class.create();
AjaxControl.prototype = {
	// Constructeur
	initialize : function(className, fields, option) {
		this.className  = className;
		this.fields     = fields;
		this.option     = option;
	}
}
// Classe principale appelee depuis la page
var AjaxValidation = Class.create();
var global_form = "";
//Constructeur
AjaxValidation.prototype = {
	// Constructeur
 	initialize : function(form, options){
 		this.options = Object.extend({
			onSubmit : true,
			immediate : false,
			onBlurMsg : true,
			codeLangue : 'fr'
		}, options || {});
		this.form = $(form);
		global_form = this.form;
		Form.enable(this.form);
		
		
		// Formulaire: Nous contacter 
		// On désactive les champs nom utilisateur et email pour les clients connectés
		if(document.getElementById('id-form-client-online_idNomUtilisateur')){
			document.getElementById('id-form-client-online_idNomUtilisateur').disabled = "disabled";
		}
		if(document.getElementById('id-form-client-online_idEmail')){
			document.getElementById('id-form-client-online_idEmail').disabled = "disabled";
		}			

		// Si on demande une validation ajax lors de la soumission formulaire
		// on observe l'evenement
		if(this.options.onSubmit) {
			var toto = $(this.form.id+"-submit");
			var toto2 = this;
			Event.observe(this.form.id+"-submit",'click',this.onSubmit.bind(this),false);

			
			Event.observe(this.form.id,'keypress', function(evKeyCode) {
				if(evKeyCode.keyCode == 13 ) {
					var target =  evKeyCode.target || evKeyCode.srcElement;
					if(target.type) {
					if(target.type!="textarea") {
						toto2.onSubmit();
					}}
				}
			}
			,false);
			//Event.observe(this.form,'submit',this.onSubmit.bind(this),false);
		}
		// Si on demande une validation immediate a chaque sortie de champs
		// on observe l'evements onblur
 		if(this.options.immediate) {
			var action = this.form.readAttribute('action');
			var codeLangue = this.options.codeLangue;
			var onBlurMsg = this.options.onBlurMsg;
			Form.getElements(this.form).each(function(input) { 
				Event.observe(input, 'load', function(ev) { 
					AjaxValidation.validate(
						Event.element(ev),
						{},
						action,
						codeLangue,
						onBlurMsg
					);
				});
				
				
				Event.observe(input, 'blur', function(ev) { 
					AjaxValidation.validate(
						Event.element(ev),
						{},
						action,
						codeLangue,
						onBlurMsg
					);
				});
			});
						
		}
 	},
 	
 	// Methode appelee lors de la soumission d'un formulaire
 	onSubmit :  function(ev){
 		//Sauvegarde du formulaire actif
 		AjaxValidation.activeForm = this.form;
 		// On empeche le double click en desactivant le formulaire
 		Form.disable(this.form);
 		// Initialisation des parametres POST a envoyer au serveur
 		var parameters = {};		
		parameters ['ajaxRequestCodeLangue'] = this.options.codeLangue;
		parameters ['ajaxRequestMode'] = 'onSubmit'; 
		parameters ['ajaxRequestOnBlurMsg'] = this.options.onBlurMsg; 
 		
 		// Expression reguliere permettant de n'observer que les classes de controles
 		var filtre = /^checkAjax/;
 		// Construction des parametres a envoyer pour chacun des inputs
 		Form.getElements(this.form).each(function(element){
 			parameters = AjaxValidation.generateParameters(element,parameters, filtre);
 		});
 		 
 		// Envoi de la requete AJAX
 		
	 	// gestion de la couleur de l'ensemble des champs par defaut
//	 	if((this.form).getElementsByClassName('label_rouge')) {
		if((this.form).getElementsByTagName('label_rouge')) {
			var tabLabel = (this.form).getElementsByTagName('label_rouge');
		}
		  
 		new Ajax.Request(this.form.readAttribute('action'),
			{								    
			    parameters: parameters,
			    onSuccess: function(transport){	
					
			     
		 
				  //Initalisation du message d'erreurs
				  var messageErreur = '';				  
				  var titleErreur = '';				  
				  var introErreur = '';
				 // alert(this.options.onSubmit+"oiopi");
				  // Initialisation du compteur d'erreurs
				  var nbErreurs = 0;
				  
				  // Recuperation des reponses
					  if (transport.responseText != "") {
					  
					  	var reponsesJson = transport.responseText.evalJSON();
					  	
					  	//Traitement de chacune des reponses
						reponsesJson.each(function(reponse){
							if (reponse.response == "title" && nbErreurs > 0) {
								titleErreur = reponse.message;
							}
							if (reponse.response == "intro" && nbErreurs > 0) {
								introErreur = reponse.message;
							}
							
							if (tabLabel.size>0) {
									tabLabel.each(function(elmtLabel){
										$(elmtLabel).removeClassName("label_rouge");
										$(elmtLabel).addClassName("label_noir");
									});
							}
													
							/** ajout */
							if (reponse.response <= 0) {
								nbErreurs++;
								if (reponse.message != "") {
									messageErreur += '<li>' + reponse.message + '</li>;';
								}
								// gestion de la couleur de l'ensemble des champs errones
								
								var inputsData = reponse.inputs;
								inputsData.each(function(inputData){
									if ($(inputData + "_label")) {
										$(inputData + "_label").removeClassName("AjaxValidationPassed_label");
										$(inputData + "_label").addClassName("AjaxValidationFailed_label");
									}
								});
								
							}
							var buttonFalse = "<img src='/images/img-picto04-true.gif' />";
							var buttonTrue = "<img src='/images/img-picto04-bis.gif' />";
							
							if (reponse.response > 0) {
								var inputsData = reponse.inputs;
								inputsData.each(function(inputData){
								
									if ($(inputData + 'Message')) {
										$(inputData + 'Message').innerHTML = buttonTrue;
									}
								});
							}
							else {
								if (reponse.response <= 0)   // Si ca n'a pas marche
								{
									var inputsData = reponse.inputs;
									inputsData.each(function(inputData){

										if ($(inputData + 'Message')) {
											$(inputData + 'Message').innerHTML = buttonFalse;
											if (parameters['ajaxRequestOnBlurMsg']) {
												$(inputData + 'Message').innerHTML = buttonFalse + " " + reponse.messageOnBlur;
											}
										}
									});
								}
							}
						});
						
					}
				  // S'il y a eu des erreurs
				  		      		
				  if (nbErreurs>0){
				  	 // Filtre des msg en doublons
				  	 var reg=new RegExp(";", "g");
				  	 var tab_msgErreur = messageErreur.split(reg);
				  	 tab_msgErreur = tab_msgErreur.uniq();
				  	 messageErreur = "<ul>"+tab_msgErreur.join(" ")+"</ul>";
				  	 
				  	 // On affiche une popup
					 // Reactivation du formulaire
			      	 Form.enable(AjaxValidation.activeForm);
				 	 return overlib_erreur(titleErreur,introErreur+messageErreur,2);
				  }	else {
				  	// Sinon on soumet le formulaire
				  	Form.enable(AjaxValidation.activeForm);
				 	showFiltre(true);
			      	return $(AjaxValidation.activeForm).submit();
				  }		
				  
			    }

		});
 		
 		// On fait un return false quoi qu'il arrive en attendant la reponse du serveur
 		Event.stop(ev);
 		
	}
	
 }

//Surdefinition de la classe AjaxValidation
Object.extend(AjaxValidation, {
	// Declaraction de la propriete activeForm qui determine le formulaire actif
	activeForm : '',
	// Methode generant les parametres AJAX a envoyer pour un element donne
	generateParameters : function(element,parameters, filtre){
		// Objet control
		var aControl = undefined;
		// Iterateur de classe de controle
		var iClass = 0;
		// Pour chacune des classes de l element
 		element.classNames().each(function(className) {
 			// Si il s'agit d'une classe CSS de controle...
			if (filtre.test(className)){
				// Specification de la classe en cours
				parameters ['ajaxRequestTests[' + element.id + '][' + iClass + ']']  = className;
			
				//Recuperation d'une eventuelle definition de controle (via addControl)
				aControl = AjaxValidation.getControl(className);

				// Si rien n'a ete defini via addControl
				if (aControl === undefined){						 					
					parameters ['ajaxRequestTestsParametersIds['    + element.id + '][' + iClass + '][' + 0 + ']'] = element.id;					
					parameters ['ajaxRequestTestsParametersValues[' + element.id + '][' + iClass + '][' + 0 + ']'] = element.value;				
					parameters ['ajaxRequestTestsParametersName[' + element.id + '][' + iClass + '][' + 0 + ']'] = element.name;
				} else {					
					// On precise les valeurs et les ids des parametres du controle
					// specifie via addControl
					for (var j=0;j<aControl.fields.size();j++){
						parameters ['ajaxRequestTestsParametersIds['    + element.id + '][' + iClass + '][' + j + ']'] = aControl.fields[j];					
						parameters ['ajaxRequestTestsParametersValues[' + element.id + '][' + iClass + '][' + j + ']'] = $F(aControl.fields[j]);				
						parameters ['ajaxRequestTestsParametersName[' + element.id + '][' + iClass + '][' + j + ']'] = $(aControl.fields[j]).name;
					}
				}
				
				// Incrementation du compteur de classe de controle
				iClass ++;									
 			}
 		});

 		// On retourne les parametres mis a jour de la requete Ajax
 		return parameters;
 		
	},
	//Validation d'un element de formulaire (lors d'un evt onblur)
	validate : function(elm, options,action,codeLangue,onBlurMsg){
		// Initialisation des parametres Ajax a envoyer
		var parameters = {};
		parameters ['ajaxRequestCodeLangue'] = codeLangue;
		parameters ['ajaxRequestMode'] = 'immediate';
		
		//Definition du filtre permettant de determiner si une classe CSS est une classe d'apparence ou de controle
		var filtre = /^checkAjax/;
		// Generation des parametres Ajax pour l'element en cours	
		parameters = AjaxValidation.generateParameters(elm,parameters, filtre);
		
		//TODO : gerer egalement les AjaxValidator => implique l'utilisation de la requete ci-dessous
		//AjaxValidation.get(value).test(value, elm, action,codeLangue);
		
						
		// Envoi de la requete Ajax
			  
		new Ajax.Request(action,
			{				    
			    parameters: parameters,
				onSuccess: function(transport){	   
					var json = transport.responseText.evalJSON();
					AjaxValidation.displayResult(elm, json[0].response, json[0].messageOnBlur, {optionBlur : onBlurMsg});		
					//alert(transport.responseText);			  
				}
		});
	},
	
	// Permet d'enrichir le controle avec des tests
	// propre a la page, avec des tests metiers 
	// qui ne se limitent pas a la verification d'un type....
	add : function(className, test) {
		var nv = {};
		nv[className] = new AjaxValidator(className, test);
		Object.extend(AjaxValidation.methods, nv);
	},
	
	// Permet de lie une classe CSS a un ensemble de champs
	addControl : function (className, fields, options){
		var nv={};
		nv[className] = new AjaxControl(className, fields, options);		
		Object.extend(AjaxValidation.controls,nv);
	},
	// Retourne la methode a appliquer pour la classe donnee en parametre
	get : function(name) {
		return  AjaxValidation.methods[name] ? AjaxValidation.methods[name] : AjaxValidation.methods['_LikeNoIDIEverSaw_'];
	},
	// Retourne un element AjaxValidationControls d'apres le nom de la CSS
	getControl : function(name) {
		return AjaxValidation.controls[name] ? AjaxValidation.controls[name] : undefined;
	},
	// Affichage du resultat : utilise lors des tests immediat lie a l'evt onblur
	displayResult : function (elm, response, message, options){
		// Les options permettront de determiner comment le message doit etre affiche
		// (popup...)
		
		/**
		if ($(elm.id + 'Message')){
			$(elm.id + 'Message').innerHTML = ;
		}*/
		
		/** bouton radio affichage 
		var idElmt = elm.id;
		if($(elm.id).type=="radio") {
			var name = $(elm).id;
			var long = name.length;
			idElmt = name.substring(0,long-2);
		}
		bouton radio affichage */

		var buttonFalse = "<img src='/images/img-picto04-true.gif' />";
		var buttonTrue = "<img src='/images/img-picto04-bis.gif' />";
		if (response==1){
		   	elm.removeClassName ('AjaxValidationFailed');
		   	elm.addClassName    ('AjaxValidationPassed');
			if($(elm.id +"_label")){
				$(elm.id +"_label").removeClassName("AjaxValidationFailed_label");
		   		$(elm.id +"_label").addClassName("AjaxValidationPassed_label");	
			}
			if ($(elm.id + 'Message')){
				$(elm.id+ 'Message').innerHTML = buttonTrue+" "+message;
			}
		} else 
		// Si ca n'a pas marche
		{
		   	elm.removeClassName ('AjaxValidationPassed');			      						      	
		   	elm.addClassName    ('AjaxValidationFailed');;
		   	if($(elm.id +"_label")) {
		   		$(elm.id +"_label").removeClassName("AjaxValidationPassed_label");
				$(elm.id +"_label").addClassName("AjaxValidationFailed_label");
			}
			if ($(elm.id + 'Message')){
				$(elm.id + 'Message').innerHTML = buttonFalse;
				if(options.optionBlur) {
					$(elm.id + 'Message').innerHTML = buttonFalse+" "+message;
				}
			}
		}
	},
	//Liste des methodes gerees via Ajax. La methode a par defaut un nom barbare qui ne se recontrera jamais
	//Cette methode n'est actuellement plus utilisee tout comme la methode get et add
	methods : {
		'_LikeNoIDIEverSaw_' : new AjaxValidator(
			'_LikeNoIDIEverSaw_',
			function (v, elm, action,codeLangue) {
				
				var parameters = Object.extend({ajaxRequestCodeLangue: codeLangue, mode: 'immediate'},
					{
						'ajaxRequestTests[0]' : v,
						'ajaxRequestTestsParametersIds[0][0]' : elm.id,
						'ajaxRequestTestsParametersValues[0][0]' : elm.value
					}				
				);
				
				new Ajax.Request(action,
				{				    
				    parameters: parameters,
				    onSuccess: function(transport){				    
					  var json = transport.responseText.evalJSON();					  
					  AjaxValidation.displayResult(elm, json[0].response, json[0].message, {});					  
				    },
				    onFailure: function(){
				    }
				});
			}
		)
		
		
		
	},
	// initialisation des controles
	controls : {
		
			
	},
	
	autoFill_formTreatment : function (json_response) {
		/** remplissage automatique  */
			var nameForm = (global_form.id);
			if($('treatment_handle')){
				Event.observe($('treatment_handle'),'change',function(e) {
					var elt = Event.element(e);
					var id = elt.value;
					preremplir_formTreatment(id,nameForm,json_response);
				});
			}
			preremplir_formTreatment(0,nameForm,json_response);
			
			
	}
});

/** Specifique a calendanet / Nordnet */

/** Fonction qui permet de rendre inactif ou non le champs societe */
function TestClientType(formId) {

	/** Champs Type de client */	
	if(document.getElementsByName('ClientType') && document.getElementsByName('Company')) {
	
		ClientTypes = document.getElementsByName('ClientType');
		ClientType = ClientTypes[0];
		
		/** Champs Societe pour Firefox (indice 0 ) */
		Companys = document.getElementsByName('Company');
		Company = Companys[0];
	
		/** Champs Societe pour Internet Explorer (indice 1 ) */
		if(Companys[1])
			Company2 = Companys[1];
			
		if(ClientType && Company) {
			myClientType = $(ClientType.id);
			myCompany = $(Company.id);

			if(Companys[1])
				myCompany2 = $(Company2.id);
			/** Si Type de client == soc */
			if(Company.type != "hidden"){
				if(myClientType.options[myClientType.options.selectedIndex].value=="soc") {

					myCompany.disabled="";
					myCompany.className = "checkAjaxRequired checkAjaxData0 champ" ;
					
					if(Companys[1]){
						myCompany2.disabled="";
						myCompany2.className = "checkAjaxRequired checkAjaxData0 champ" ;
					}
					
					$("asterique_societe").innerHTML  = "*" ;
					if($('Company_label')) {
						myLabel = $('Company_label').firstDescendant();
						myLabel.style.color = "#333333";
					}
				/** Si Type de client != soc */
				} else {
					if(myCompany || myCompany2) {
						myCompany.value = "";
						myCompany.disabled="disabled" ;
						myCompany.className = "checkAjaxData0 champ" ;

						if(Companys[1]){
							myCompany2.value = "";
							myCompany2.disabled="disabled" ;
							myCompany2.className = "checkAjaxData0 champ" ;
						}
						
						$("asterique_societe").innerHTML  = "" ;
						$("asterique_societe").style.color  = "" ;
					
						if($(formId+"_idCompanyMessage"))
							$(formId+"_idCompanyMessage").innerHTML  = "" ;
						if($('Company_label')) {
							myLabel = $("Company_label").firstDescendant() ;
							myLabel.style.color = "#aaaaaa" ;
	                    }
					}
				}
			}
		}
	}
}

/** fonction qui permet de cacher l icone warning sur la page preRequis.php */
function hideIcon(){
	if($('warning_icon')){
		$('warning_icon').style.display = "none" ;
	}
}

function preremplir_formTreatment(id,nameForm,json_response) {
	var personnes = json_response;
	var personne = personnes[id];
	/** civilite */
	if ($(nameForm + "_idCivility_1")) {
		switch (personne.civility) {
			case 'Mrs.':
				$(nameForm + "_idCivility_1").checked = true;
				break;
			case 'Miss':
				$(nameForm + "_idCivility_2").checked = true;
				break;
			case 'Mr.':
				$(nameForm + "_idCivility_3").checked = true;
				break;
		}
	}
	listenCheckRedBox(false);
		
	/** statut*/
	if ($(nameForm + "_idStatut")) {
		for (i = 0; i < $(nameForm + "_idStatut").length; i++) {
			if (personne.clienttype == $(nameForm + "_idStatut").options[i].value) {
				$(nameForm + "_idStatut").options[i].selected = true;
			}
		}
	}
	
	/** country*/
	if ($(nameForm + "_idCountry")) {
		for (i = 0; i < $(nameForm + "_idCountry").length; i++) {
			if (personne.country == $(nameForm + "_idCountry").options[i].value) {
				$(nameForm + "_idCountry").options[i].selected = true;
			}
		}
	}
	/** name */			if($(nameForm+"_idName")) $(nameForm+"_idName").value=personne.name;
	/** Firstname */	if($(nameForm+"_idFirstname")) $(nameForm+"_idFirstname").value=personne.firstname;
	/** Company */		if($(nameForm+"_idCompany")) $(nameForm+"_idCompany").value=personne.company;
	/** Adress1 */		if($(nameForm+"_idAdress1")) $(nameForm+"_idAdress1").value=personne.adress1;
	/** Adress2 */		if($(nameForm+"_idAdress2")) $(nameForm+"_idAdress2").value=personne.adress2;
	/** City */			if($(nameForm+"_idCity")) $(nameForm+"_idCity").value=personne.city;
	/** Tel */			if($(nameForm+"_idTel")) $(nameForm+"_idTel").value=personne.tel;
	/** GSM */			if($(nameForm+"_idGsm")) $(nameForm+"_idGsm").value=personne.gsm;
	/** Fax */			if($(nameForm+"_idFax")) $(nameForm+"_idFax").value=personne.fax;
	/** Email */		if($(nameForm+"_idEmail")) $(nameForm+"_idEmail").value=personne.email;
	/** Postalcode */	if($(nameForm+"_idPostalcode")) $(nameForm+"_idPostalcode").value=personne.postalcode;
	/** Siren */		if($(nameForm+"_idSiren")) $(nameForm+"_idSiren").value=personne.siren;
	/** TvaIntra */		if($(nameForm+"_idTvaintra")) $(nameForm+"_idTvaintra").value=personne.tvaintra;
}
/** fin : remplissage automatique */

/** Evenements */
Event.observe(window,'load',TestClientType);
