/**
*file form_functions.js
*brief Fonctions javascript pour les traitements de formuaire.<br>
* Date derni&egrave;re modification : 08/08/08.
*/

var DEBUG = false;
/**
* VŽrifie que le formulaire et l'ŽlŽment de formulaire passŽs en paramtres existent.
*@param form_name(string) -> Nom du formulaire.
*@param elt_name(string) -> Element du formulaire.
*@return (bool) True si les deux existent, false sinon.
*/
function ca_checkFormData(form_name, elt_name)
	{
	if (!document.forms[form_name])
		{
		if (DEBUG) alert("error !\n[DEBUG] form "+form_name+" unknown");
		return false;
		}
	
	if (!document.forms[form_name].elements[elt_name])
		{
		if (DEBUG) alert("error !\n[DEBUG] element "+elt_name+" of form "+form_name+" unknown");
		return false;
		}
	return true;
	}
/**
* Renvoie le contenu d'un champ de formulaire.
*@param form_name(string) -> Nom du formulaire.
*@param  elt_name(string) -> Nom du champ.
*@return Contenu du champ. NULL si le champ n'existe pas.
*/
function ca_get_input_value(form_name, elt_name)
	{
	if (!ca_checkFormData(form_name, elt_name)) return;
	
	return document.forms[form_name].elements[elt_name].value;
	}
/** 
* Renvoie la valeur du dernier ŽlŽment d'un champ de type radio sŽlectionnŽ.
*@param form_name(string) -> Nom du formulaire.
*@param radiobutton_name(string) -> Nom du champ de type radio.
*@return Valeur du dernier ŽlŽment sŽlectionnŽ.
*/
function ca_get_radio_value (form_name, radiobutton_name)
	{
	if (!ca_checkFormData(form_name, radiobutton_name)) return;
	
	radiobutton = document.forms[form_name].elements[radiobutton_name];
	myradiovalue="";
	
	if (radiobutton.length == 1 || radiobutton.length == undefined) 
		{
		myradiovalue = radiobutton.value;
		}
	else
		{
		for (i=0;i<radiobutton.length;i++)
			{
			if (radiobutton[i].checked==true) myradiovalue = radiobutton[i].value;
			}
		}
	return myradiovalue;
	}
/**
* SŽlectionne tous les ŽlŽments d'un champ radio dont la valeur est Žgale ˆ celle passŽe en paramtre.
*@param form_name(string) -> NOm du formulaire.
*@param radiobutton_name(string) -> Nom du champ de type radio.
*@param value(string) -> Valeur pour laquelle l'ŽlŽment doit etre sŽlectionnŽ.
*@return void
*/
function ca_set_radio_value(form_name, radiobutton_name, value)
	{
	if (!ca_checkFormData(form_name, radiobutton_name)) return;
	
	radiobutton = document.forms[form_name].elements[radiobutton_name];
	myradiovalue="";
	
	for (i=0;i<radiobutton.length;i++) radiobutton[i].checked = false;
	
	if (radiobutton.length == 1 || radiobutton.length == undefined) 
		{
		if (radiobutton.value == value) radiobutton.checked = true;
		}
	else
		{
		for (i=0;i<radiobutton.length;i++)
			{
			if (radiobutton[i].value == value) radiobutton[i].checked = true;
			}
		}
	}
/**
* Renvoie la valeur de l'ŽlŽment sŽlectionnŽ dans une liste de choix.
*@param form_name(string) -> Nom du formulaire.
*@param select_name(string) -> Nom du champ.
*@return (string) Valeur de l'ŽlŽment sŽlectionnŽ. Chaine vide si aucun ŽlŽment n'est sŽlectionnŽ dans la liste.
*/
function ca_get_select_value(form_name, select_name)
	{
	if (!ca_checkFormData(form_name, select_name)) return;
	
	form_element = document.forms[form_name].elements[select_name];
	
	if (form_element.selectedIndex >= 0)
	return form_element.options[form_element.selectedIndex].value;
	else return "";
	}
/**
* Renvoie le libellŽ de l'ŽlŽment sŽlectionnŽ dans une liste de choix.
*@param form_name(string) -> Nom du formulaire.
*@param select_name(string) -> Nom du champ.
*@return (string) LibellŽ de l'ŽlŽment sŽlectionnŽ. Chaine vide si aucun ŽlŽment n'est sŽlectionnŽ dans la liste.
*/
function ca_get_select_label(form_name, select_name)
	{
	if (!ca_checkFormData(form_name, select_name)) return;
	
	form_element = document.forms[form_name].elements[select_name];
	
	if (form_element.selectedIndex >= 0)
	return form_element.options[form_element.selectedIndex].innerHTML;
	else return "";
	}

// fonctions gÃˆnÃˆralistes...
/**
* SŽlectionne les ŽlŽments d'un champ de type <select> dont la valeur ou le libellŽ correspondent ˆ la valeur passŽe en paramtre.
*@param form_name(string) -> Nom du formulaire.
*@param select_name(string) -> Nom du champ.
*@param to_select(string) -> Valeur cherchŽe.
*@return (bool) True si un ŽlŽment a ŽtŽ sŽlectionnŽ, false sinon.
*/
function ca_set_select_value(form_name, select_name, to_select)
	{
	if (!ca_checkFormData(form_name, select_name)) return;
	
	select_menu = document.forms[form_name].elements[select_name];
	if (!select_menu) alert('select '+select_name+' unknown...');
	
	return_value = false;
	for (i=0;i<select_menu.length;i++)
		{
		if (select_menu[i].value == to_select)
			{
			select_menu[i].selected = true;
			return_value = true;
			}
		else if (select_menu[i].innerHTML == to_select)
			{
			select_menu[i].selected = true;
			return_value = true;
			}
		else select_menu[i].selected = false;
		}
	
	return return_value;
	}
/**
* Valorise un champ texte.
*@param form_name(string) -> Nom du formulaire.
*@param input_name(string) -> Nom du champ.
*@param value(string) -> Valeur ˆ affecter.
*@return void
*/
function ca_set_input_value(form_name, input_name, value)
	{
	if (!ca_checkFormData(form_name, input_name)) return;		
	
	document.forms[form_name].elements[input_name].value = value;
	}
/**
* Grise les autres checkboxes si le nombre maximale de checkbox cochŽes est atteint.
*@param form_name(string) -> Nom du formulaire.
*@param checkbox_name(string) -> Nom du champ.
*@param number_max(int) -> Nombre maximal de checkoxes ˆ cocher.
*@return void
*/
function ca_block_checkbox(form_name, checkboxes_name, number_max)
	{
	if (!ca_checkFormData(form_name, checkboxes_name)) return;		
	
	if (!number_max) number_max = 1;
	
	cases = document.forms[form_name].elements[checkboxes_name];
	
	something_checked = 0;
	for (i=cases.length; i--;)
		if (cases[i].checked == true) something_checked++;
	
	if (something_checked >= number_max)
		{for (i=cases.length; i--;) if(!cases[i].checked) cases[i].disabled = true;}
	else 	for (i=cases.length; i--;) cases[i].disabled = false;
	}

//------------ select imbriquÃ©s ----------------

var end = -1;	

// ajoute une option dans la seconde liste
// pos defini la position, si une option existe deja a cette position
// la nouvelle est inserÃ©e en place de l'ancienne
function ca_depending_select_add(form_name, elt_name, texte, value, pos)
  {
  last_one = document.forms[form_name].elements[elt_name].length;
  if (pos == null)   pos = last_one;
  if (value == null) value = texte;
  
  toadd = new Option(texte,value,false,false);
  
  if (document.forms[form_name].elements[elt_name].options[pos] != null)
  	{
  	indice = document.forms[form_name].elements[elt_name].options[last_one-1];
  	temp = new Option(indice.text, indice.value);
  	document.forms[form_name].elements[elt_name].options[last_one] = temp;
  	
  	for (i = last_one-1; i > pos; i--)
  	  {
  	  indice = document.forms[form_name].elements[elt_name].options[i-1];
  	  temp = new Option(indice.text, indice.value);
  	  document.forms[form_name].elements[elt_name].options[i] = temp;
  	  }
  	}
  
  document.forms[form_name].elements[elt_name].options[pos] = toadd;
  }

/**
* Supprime une option spŽcifique dans la deuxime liste.
*@param form_name(string) -> Nom du formulaire.
*@param elt_name(string) -> Nom du champ.
*@param i(int) -> Indice de l'option ˆ supprimer.
*@return void
*/
// supprime une option spÃ©cifique dans la deuxieme liste  
function ca_depending_select_remove(form_name, elt_name, i)
  {
 // alert('remove : '+document.forms[form_name].elements[elt_name].options[i].value);
  document.forms[form_name].elements[elt_name].options[i] = null;
  }
  
/**
* Supprime un ensemble d'options dans la deuxime liste.
*@param form_name(string) -> Nom du formulaire.
*@param elt_name(string) -> Nom du champ.
*@param i(int) -> Premier indice (borne de dŽpart).
*@param j(int) -> Second indice (borne d'arrivŽe).
*@return void
*/
 // supprime un ensemble d'options de la seconde liste
function ca_depending_select_remfromto(form_name, elt_name, i, j)
  {
  if (j == end) j = document.forms[form_name].elements[elt_name].length;
  if (i > j) 
    {
    tmp = i;
    i = j;
    j = tmp;
    }
  else if (j > document.forms[form_name].elements[elt_name].length) j = document.forms[form_name].elements[elt_name].length;
  var indice = j-i;
  while (indice--) 	ca_depending_select_remove(form_name, elt_name, i);
  }
 /**
* Supprime toutes les options de la deuxime liste.
*@param form_name(string) -> Nom du formulaire.
*@param elt_name(string) -> Nom du champ.
*@return void
*/
// supprime toutes les options de la seconde liste
function ca_depending_select_removeall(form_name, elt_name)
  {
  while (document.forms[form_name].elements[elt_name].length) ca_depending_select_remove(0);
  }

//---------- end selects imbriques -----------------


function ca_getValue(form_name, elt_name)
	{
	var el = document.forms[form_name].elements[elt_name];
	if (el == undefined)
		{
		alert('ERROR : unable to access -> '+form_name+' : '+elt_name);
		return;
		}
	
	if (el.length)
		{
		if (el.name)			return ca_get_select_value(form_name, el.name);		
		else if (el[0].name)	return ca_get_radio_value(form_name, el[0].name);
		//alert(el.name+' is option');
		}
	if (el.type)
		{
		return ca_get_input_value(form_name, el.name);
		//alert(el.name+' is input');
		}
	/*
	var tmp_type = el.type;
	if (tmp_type == undefined) tmp_type = el[0].type;
	
	if (tmp_type)
		{
		var type = tmp_type.toLowerCase();
		
		if (type == 'hidden' || type == 'text' || type == 'textarea')
			{
			alert('text '+el.name+' -> '+ca_get_input_value(form_name, el.name));
			return ca_get_input_value(form_name, el.name);
			}
		else if (type == 'radio')
			{
			alert('radio '+el[0].name+' ->'+ca_get_radio_value(form_name, el[0].name));
			return ca_get_radio_value(form_name, el[0].name);
			}
		else if (type == 'select')
			{
			alert('select'+el[0].name+' ->'+ca_get_select_value(form_name, el[0].name));
			return ca_get_select_value(form_name, el[0].name);
			}
		}
	*/
	}

if( typeof Array().arrayUnique=='undefined' )
	Array.prototype.arrayUnique=function()
		{
		var noDuplicates=[];

		for( var i=0, k=0; i<this.length; i++ )
			{
			for( var j=0; j<noDuplicates.length && this[i]!=noDuplicates[j] ; j++ );
			if(j==noDuplicates.length)
				noDuplicates[k++]=this[i];
			}

		return noDuplicates;
		}
	
function ca_getFormValuesForAjax(form_name)
	{
	if (!document.forms[form_name]) return;
	
	var myform = document.forms[form_name];
	var myform_names  = new Array;
	var myform_values = new Array;
	
	for (i=myform.elements.length; i--;)
		{
		if (myform.elements[i].name != undefined && myform.elements[i].name != '')
			{
			myform_names.push(myform.elements[i].name);
			}
		}
	
	myform_names = myform_names.arrayUnique();
	
	for (k = myform_names.length; k--;)
		{
		myform_values.push(myform_names[k]);
		myform_values.push(ca_getValue(form_name, myform_names[k]));
		}
	
	return myform_values;
	}

function ca_submitAjax(form_name, url, submit_button, function_final)
	{
	if (submit_button)	var old_button_value = submit_button.value;
	
	ca_ajax_post_as
		(
		(url?url:document.forms[form_name].action),
		ca_getFormValuesForAjax(form_name),
		function()
			{
			if (submit_button)
				{
				submit_button.disable	= true;
				submit_button.value		= 'processing...';
				}
			},
		function(res)
			{
			if (submit_button)
				{
				submit_button.disable	= false;
				submit_button.value		= old_button_value;
				}
			
			if (function_final != undefined)
				{
				try {eval(function_final(res));}
				catch(e) {}
				}
			}
		)
	}


function ca_submit_form(form_name)
	{
	return document.forms[form_name].submit();
	}

