/**
* Fonction qui va mettre à jour les differentes combo du formulaire en fonction des criteres déja choisi et des criteres disponible sur arkiane
* Parametres :
* form -> Id du formulaire à mettre à jour
* ordre -> tableau contenant les id des champs a prendre en compte.
*   Attention ces id doivent correspondre au nom des parametre des flux arkiane et doivent etre entrés dans le tableau dans l'ordre ou ils apparaisent dans le formulaire
* input -> Id de l'input qui a déclenché la mise à jour
* session -> booleen qui indique si l'on souhaite prépositionner les champs sur les données en session
*/

/**
 *
 * @access public
 * @return void
 **/
 function update_after(form,ordre,input,session,input_array){
	  for(var j=0; j<ordre.length; j++){
	    if(input == ordre[j]){
	      var start = j;
	    }
	  }
	  if (start>2) {
	  	start = 3
	  }

	  $('#current').html(start);

 	update(form,ordre,ordre[start],session,input_array);
 }

function update(form,ordre,input,session,input_array){

	var valeur,reset;
	  var params = new Array();
	  var flag = false;
	  for(var j=0; j<ordre.length; j++){
	    if(input == ordre[j]){
	      var start = j;
	    }
	  }
	  var actu = start;
	  for(var i=start; i<ordre.length; i++){
	    params = new Array();
	    valeur = getValues(form,input_array);

	    for(var y=0; y<=i; y++){
	      if(valeur[y] != null && valeur[y] != ""){
	        params[ordre[y]] = valeur[y];
	      }
	    }
	}

	langue = valeur[0];

	updateCombo(form,params,ordre,start,session,langue,input_array);

}


function updateCombo(form,params,ordre,input,session,langue,input_array,current){

	if (ordre[2] != 'lr') {
		$('#'+form+' :checkbox, #'+form+' :input').attr("disabled", true);
	}

    i=input;
    input = ordre[i+1];

    if(input != "dd" && input != "lg" && input != "nbrow" && input != "no_appel" && input !== undefined){

      		if (langue == "en") {
				if (input == "ctxt" || input == "ct[]") {
					$("#ctxt_input").append("<span class=\"loader_input\"><img src='/media/images/loader_combo.gif'/ height='13'> Loading</span>");
					$("#ctxt").hide();
				}else{
					$("#"+input+"_input").append("<span class=\"loader_input\"><img src='/media/images/loader_combo.gif' height='13'/> Loading</span>");
					$("#"+input+"_input select").hide();
				}
			}else{
				if (input == "ctxt" || input == "ct[]") {
					$("#ctxt_input").append("<span class=\"loader_input\"><img src='/media/images/loader_combo.gif' height='13'/> Mise &agrave; jour</span>");
					$("#ctxt").hide();
				}else{
					$("#"+input+"_input").append("<span class=\"loader_input\"><img src='/media/images/loader_combo.gif' height='13'/> Mise &agrave; jour</span>");
					$("#"+input+"_input select").hide();
				}
			}
      if(input == "df"){
        var async = false;
				var url = "/fr/vacances/updateFin";
			}else if((input == "ctxt" || input == "ct[]") && form == "moteur"){
        var async = true;
				var url = "/fr/vacances/updateTxt/2";
			}else if((input == "ctxt" || input == "ct[]")){
        var async = true;
				var url = "/fr/vacances/updateTxt/4";
			}else {
        var async = true;
				var url = "/fr/vacances/updateCombo";
			}


      $.ajax({
        type: "POST",
        url: url,
        async: async,
        data: "params="+params.to_json()+"&query="+input+"&session="+session+"&reset="+0,
        success: function(retour){
        	var current = $('#current').html();
			current++;
			$('#current').html(current);

			if(i == $('#current').html()){
				$('#'+form+' :checkbox, #'+form+' :input').removeAttr("disabled");
			}
			if (input == "ctxt" || input == "ct[]") {
				$("#ctxt_input .loader_input").detach();
				$("#ctxt").html(retour);
				$("#ctxt").fadeIn();
			}else{
				$("#"+input+"_input .loader_input").detach();
				$("#"+input).html(retour);
				$("#"+input+"_input select").fadeIn();
			}
        }
      });
      if(input == "df"){
        params["df"] = $("#df").val();
      }

      update(form,ordre,input,session,input_array,current);
    }

}

/**
* Fonction qui recupère toutes les valeurs d'un formulaire donné
* Paramètres :
* form -> Id du formulaire dont on souhaite récupérer les valeurs
*/
function getValues(form,input_array){
  var values = new Array();
  var values_array = '';
  $.each($("#"+form +" :input"), function(){

  if($(this).attr('type')!='button' && $(this).attr('type')!='submit'){

	  if($(this).attr('name')==input_array && $(this).attr('checked')){

	  	  values_array+=$(this).val()+'|';
	  }else if($(this).attr('name')!=input_array){
		  values.push($(this).val());
	  }
	}
  });
	var exp_reg = /\|$/m;
	values_array = values_array.replace(exp_reg,"");
	values_array = values.push(values_array);
  return values;
}

/**
* Extention de l'objet Array
* Cette fonction retourne le JSON du tableau
*/
if (!Array.prototype.to_json) {
	Array.prototype.to_json = function() {
	    var parts = [];
	    var is_list = (Object.prototype.toString.apply(this) === '[object Array]');
	    for(var key in this) {
	    	var value = this[key];
	        if(typeof value == "object") { //Custom handling for arrays
	            if(is_list) parts.push(value.to_json()); /* :RECURSION: */
	            else parts[key] = value.to_json(); /* :RECURSION: */
	        }else if(typeof value != "function") {
	            var str = "";
	            if(is_list) str = '"' + key + '":';

	            //Custom handling for multiple data types
	            if(typeof value == "number") str += value; //Numbers
	            else if(value === false) str += 'false'; //The booleans
	            else if(value === true) str += 'true';
	            else str += '"' + value + '"'; //All other things
	            // :TODO: Is there any more datatype we should be in the lookout for? (Functions?)
	            parts.push(str);
	        }
	    }
	    var json = parts.join(",");
	    if(!is_list) return '[' + json + ']';//Return numerical JSON
	    return '{' + json + '}';//Return associative JSON
	}
}
