//Form serialiser / deserializer
//Require Prototype.js
//Require Url.js

var FormSerializer = {


  /**
   * Liste des noms d'objets à utiliser.
   */
	getBeans: function() {        
      return "";
  },

  /**
   * Initialisation de la variable JSON
   */
  initJSON: function() {
  },
                
  /**
   * méthode appelée sur le onload de la page.      
   */
  rewrite: function() {         		
		this.toSerialize("toSerialize");
		this.toDeserialize("toDeserialize");
	},
	
	//Lie la fonction serialize aux liens hypertextes qui possedent la classe toSerialize
	toSerialize: function(className){
		var linksToSerialize = $$("."+className);
		if(linksToSerialize.length>0){
			linksToSerialize.each(
        function(elem) 
        {
        	if(elem.up('form'))
        		Event.observe(elem, "click", function(event){elem.href = elem.href.split("#")[0]+"#"+FormSerializer.serializeForm(elem.up('form'));});
        }
      );			
		}
	},

	//Lie la fonction deserialize aux formulaires qui possedent la classe toDeserialize
	toDeserialize: function(className){
		var formsToDeserialize = $$("."+className);
		if(formsToDeserialize.length>0){
			formsToDeserialize.each(
        function(formular) 
        {
        	FormSerializer.deserializeForm(formular);
        }
      );			
		}		
	},
	
	//Serialisation de formulaire
	//On ne serialise que les types : text, textarea, radio, checkbox, select-one
	//Et qui sont valorises
	serializeForm: function(formularToSerialize){
		var formElementsToSerialize = Array();;		
		var elements = formularToSerialize.getElements();
		
		
		for(var i=0; i<elements.length; i++){
			var elm = elements[i];
				if(elm.value && elm.value!="" && (elm.type=="text" || elm.type=="textarea") || 
						elm.type=="radio" || elm.type=="checkbox" || elm.type=="select-one" ||
						elm.name=="jour_arrivee" || elm.name=="mois_arrivee" || elm.name=="annee_arrivee")
					formElementsToSerialize.push(elm);
					
		}
		
		return Form.serializeElements(formElementsToSerialize);
	},	

	//Deserialisation de formulaire
	//On ne serialise que sur des champs types : text, textarea, radio, checkbox, select-one
	deserializeForm: function(formular){
		var formElements = formular.elements;
		for(var i=0; i<formElements.length; i++){		  
			var formElement = formElements[i];
			if(formElement.name && getUrlParameter(formElement.name)!=""){
				if(formElement.type=="text" || formElement.type=="textarea"){
					formElement.value = Url.decode(getUrlParameter(formElement.name));
					fireEvent(formElement, 'change');
				}	else if(formElement.type=="radio" && formElement.value == getUrlParameter(formElement.name)){
					 formElement.checked = true;
					 fireEvent(formElement, 'change');
					 fireEvent(formElement, 'click');
				} else if(formElement.type=="checkbox" && getUrlParameter(formElement.name)!=""){
					 formElement.checked = true;
					 fireEvent(formElement, 'change');
					 fireEvent(formElement, 'click');
				} else if(formElement.type=="select-one"){
				   selectOptionByElement(formElement,getUrlParameter(formElement.name));
          	
				} else if(formElement.name=="jour_arrivee" || formElement.name=="mois_arrivee" || formElement.name=="annee_arrivee"){
					 formElement.value = Url.decode(getUrlParameter(formElement.name));
					 fireEvent(formElement, 'change');
				}
			}						
		}			
	}
}
core.push(FormSerializer);


//Recupere un parametre de l URL
function getUrlParameter( paramName ){  
		if(paramName){
			paramName = paramName.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");  
			var regexS = "[\\?&#]"+paramName+"=([^&#]*)";  
			var regex = new RegExp( regexS );  
			var results = regex.exec( window.location.href );  
			if( results == null )    
				return "";  
			else
				return results[1];
		} else
				return "";
	}

//Declanche un evenement
function fireEvent(element,event){
  if (document.createEventObject){
      // dispatch for IE
      var evt = document.createEventObject();
      element.fireEvent('on'+event,evt);
  }
  else{
      // dispatch for firefox + others
      var evt = document.createEvent("HTMLEvents");
      evt.initEvent(event, true, true ); // event type,bubbling,cancelable
       !element.dispatchEvent(evt);
  }
}	

// positionne un select sur une valeur
function selectOptionByElement(selectElement, selectedValue){
 if(selectElement && selectElement.options){
 for(var i=0; i<selectElement.options.length; i++){  
   if(selectElement.options[i].value==selectedValue){
    selectElement.selectedIndex=i;    
   }
 }
 fireEvent(selectElement, 'change');
 }
}
