////////////////////////////
// Class "Forms"
////////
<!--
function Forms( input_verif )
{
	this.forms = new Array();
	this.class_verif_input = input_verif;

	//////////////////////////////////
	// M�thode FormsGet()
	// > R�cup�re la liste des <forms> du document, v�rifie s'ils ont un �l�ment avec une classe 'obligatoire' et attache une fonction de v�rification
	//////////////////////////////////
	function FormsGet()
	{
		var formulaires = document.getElementsByTagName( 'form' );
		if( formulaires.length === 0 ){ return; }
		
		//on se fait les formulaires un par un
		for(i = 0; i < formulaires.length; i++)
		{
			form = document.forms[i].elements;
			var j = 0;
			if( form.length === 0 ){ continue; }

			//on v�rifie chaque �l�ment pour savoir s'il ne contient pas une v�rification obligatoire
			for(k = 0; k < form.length; k++)
			{
				//on encapsule une fonction de v�rification d�s qu'on trouve le moindre �l�ment obligatoire
				if( form[k].className.match(new RegExp( this.class_verif_input )) )
				{
					
					formulaires[i].onsubmit = FormCheck;
					continue;
				}
			}
		}
	}
	
	//////////////////////////////////
	// M�thode FormCheck()
	// > Rattach�e � un formulaire, elle v�rifie si tous les �l�ments obligatoires sont bien remplis
	//////////////////////////////////
	function FormCheck()
	{
		var inputs = this.elements;
		var inputs_missing = 0;
		var inputs_missing_multi_name = Array;

		//on v�rifie tous les �l�ments un par un
		for(i = 0; i < inputs.length; i++)
		{
			/*alert('passe : '+inputs[i].name);*/
			if( !inputs[i].className.match(new RegExp( 'obligatoire' )) )
			{
				continue;
			}
			//type d'�l�ment
			else{
				classNameRemove(inputs[i], 'form_check_hightlight' );
				
				switch( inputs[i].nodeName )
				{
					//champs basiques
					case 'INPUT':
					switch( inputs[i].type )
					{
						//champs avec 'name' unique
						case 'hidden':
						case 'text':
						case 'password':
							if( !inputs[i].value )
							{
								inputs_missing++;
								classNameAdd(inputs[i], 'form_check_hightlight' );
							}
						break;
						
						//bo�te � cocher : y'a toujours une valeur mais faut bien qu'elle soit coch�e ;D
						case 'checkbox':
							if( inputs[i].checked == false )
							{
								inputs_missing++;
								classNameAdd(inputs[i], 'form_check_hightlight' );
							}
						break;
						
						//champs avec 'name' multiples mais 1 seule valeur transmise
						case 'radio':
							if( !inputs_missing_multi_name[inputs[i].name] && inputs_missing_multi_name[inputs[i].name] !== 0 )
							{
								inputs_missing_multi_name[inputs[i].name] = 0;
								
								//on parcourt une fois tous les �l�ments du m�me nom
								j = 0;
								elements = document.getElementsByName( inputs[i].name );
								while( j < elements.length && inputs_missing_multi_name[inputs[i].name] == 0 )
								{
									if( elements[j].className.match(new RegExp('obligatoire')) && elements[j].checked == true )
									{
										inputs_missing_multi_name[inputs[i].name] = 1;
									}
									j++;
								}
								
								if( inputs_missing_multi_name[inputs[i].name] === 0 )
								{
									inputs_missing++;
								}
							}
							else{
								continue;
							}
							
							if( inputs[i].checked === true )
							{
								//alert(1);
								inputs_missing_multi_name[inputs[i].name] = 'undefined';
								alert(inputs_missing_multi_name.length);
								break;
							}
						break;
					}
					break;
					
					//zone de saisie
					case 'TEXTAREA':
						if( !inputs[i].value )
						{
							inputs_missing++;
							classNameAdd(inputs[i], 'form_check_hightlight' );
						}
					break;
					
					//liste d�roulante
					case 'SELECT':
						if( inputs[i].length === 0 || inputs[i].selectedIndex == 'undefined' || inputs[i].options[ inputs[i].selectedIndex ].value == '' )
						{
							inputs_missing++;
							classNameAdd(inputs[i], 'form_check_hightlight' );
						}
					break;
				}
			}
		}
		
		//s�lection du retour
		if( inputs_missing > 0 )
		{
			if( this.title.length > 0 )
			{
				alert(this.title);
			}
			else if( inputs_missing == 1 )
			{
				alert("Un champ est manquant.\r\nMerci de compl�ter votre saisie avant de valider de nouveau.");
			}
			else{
				alert(inputs_missing + " champs sont manquants.\r\nMerci de compl�ter votre saisie avant de valider de nouveau.");
			}
			return false;
		}
		this.submit.disabled = true;
	}
	
	function classNameAdd( class_id, class_name )
	{
		var prefix = ' ';
		if( class_id.className.length === 0 )
		{
			prefix = '';
		}
		class_id.className += prefix+class_name;
	}
	
	function classNameRemove( class_id, match_class )
	{
		if( match_class == ''){ return false; }
		//
		class_id.className = class_id.className.replace(new RegExp("(^| )"+match_class, "g"), '');
	}
	
	//INIT
	this.FormsGet = FormsGet;
	this.classNameRemove = classNameRemove;
	this.classNameAdd = classNameAdd;
	this.FormsGet();
}

function Form_AutreAdresse(){
	var test = true
	if($('com_livraison_autre').checked){
		if ($('com_livraison_destinataire').value==""){
			$('com_livraison_destinataire').className = 'form_check_hightlight';
			test = false;
		}
		if ($('com_livraison_adresse').value == ""){
			$('com_livraison_adresse').className = 'form_check_hightlight';
			test = false;
		}
		
		if ( ($('com_livraison_codepostal').value == "") || ( $('com_livraison_codepostal').value.length != 5 ) ){
			$('com_livraison_codepostal').className = 'form_check_hightlight';
			test = false;
		}
		
		if ($('com_livraison_ville').value == ""){
			$('com_livraison_ville').className = 'form_check_hightlight';
			test = false;
		}
		
		if (test === false){
			$('DivInfo').style.visibility = 'visible';
			$('DivInfo').innerHTML = "<p>Un ou plusieurs champs sont manquants ou mal renseign&eacute;s, veuillez rectifier.</p>";
		}
		return test;
	}
}

////////////////////////////
// Fonction autoclear
////////
function Forms_autoclear()
{
	$$('input.autoclear').each(function(input){
		input.autoclear = input.value;
		input.onfocus = function(){ if( this.value == this.autoclear ){ this.value = ''; } }
		input.onblur = function(){ if(this.value.length === 0){ this.value = this.autoclear; } }
	});
}

////////////////////////////
// Classe articles_multilignes
////////
function articles_multilignes( params )
{
	this.row_number = 0;
	
	//assignation automatique des param�tres
	var params = params || {};
	params.css_id = params.css_id || 'ajout_multi_articles';
	params.css_row_class = params.css_row_class || 'article';
	params.check_inputs = params.check_inputs || 'input,select,textarea';
	
	/////////////////////////////////////
	// M�thode init()
	// Initialise le tableau de donn�es et les m�thodes dynamiques
	/////////////////////////////////////
	this.init = function(){
		//aucun ID d�tect�, pas la peine de continuer plus loin
		if( !$(params.css_id) )
		{
			return false;
		}
		
		//on r�cup�re les lignes, on enl�ve la premi�re du tableau et on supprime les autres
		var rows = $(params.css_id).getElements('tr.'+params.css_row_class);
		var row_first = rows.shift();
		rows.removeElements();
		rows = null;
		
		//on assigne les �v�nements aux champs
		$ES(params.check_inputs, row_first).addEvent('blur', row_check);
		$(row_first).getElement('input').focus();
		row_number = 1;
		
		//on �crit un petit message sympathique indiquant le fonctionnement du bazar
		//on le fait via JavaScript car un utilisateur sans JS ne pourrait justement pas suivre les infos
		new Element('p',{
					'class' : 'message'
					}).setHTML("D&egrave;s qu'un code article et une quantit&eacute; sont saisis ci-dessous, <strong>une nouvelle ligne s'ajoute automatiquement</strong>.<br />Afin d'acc&eacute;l&eacute;rer votre saisie, <em>utilisez la touche de tabulation de votre clavier</em> pour passer d'un champ &agrave; l'autre. Vous verrez, c'est facile et surtout efficace !").injectBefore(params.css_id);
	}
	
	/////////////////////////////////////
	// M�thode row_check()
	// Assign�e � un �l�ment de type input, select ou autre : v�rifie que tous ses comp�res de la ligne sont compl�t�s pour ins�rer une nouvelle ligne
	/////////////////////////////////////
	this.row_check = function(){
		var row = { 'inputs' : 0, 'completed' : 0, 'dom' : $(this).getParent().getParent() };

		$ES(params.check_inputs, row.dom).each(function(input){
			//Un �l�ment de plus ...
			++row.inputs;
			
			//... dont on v�rifie s'il est bien compl�t�
			switch( input.getTag() )
			{
				case 'input':
				case 'textarea':
					if( input.value.clean() )
					{
						++row.completed;
					}
				break;
				
				case 'select':
					if( input.selectedIndex >= 0 && input.selectedIndex < input.length )
					{
						++row.completed;
					}
				break;
			}
		});
		
		//Pour ins�rer une nouvelle ligne, on doit avoir :
		//- autant de champs compl�t�s que de champs existants
		//- aucun �l�ment suivant
		if( row.inputs === row.completed && !row.dom.getNext() )
		{
			row_insert( row.dom );
		}
	}
	
	/////////////////////////////////////
	// M�thode row_insert()
	// On ins�re une nouvelle ligne en clonant l'actuelle, c'est beau le progr�s
	/////////////////////////////////////
	this.row_insert = function( row ){
		//On incr�mente le nombre de lignes dispo
		//Ce num�ro sert � changer les masques de nom de champ
		++row_number;
		var row_clone = row.clone();
		
		//Clonage de la ligne
		$ES('input[type=text],input[type=password],input[type=hidden],textarea', row_clone).setProperty('value', '');
		$ES(params.check_inputs, row_clone).removeEvents('blur'); /* oblig� car IE5+ clone aussi les �v�nements ... alors qu'il ne le devrait pas */
		$ES(params.check_inputs, row_clone).addEvent('blur', row_check); /* oui oui, IE5+ ne rassignait pas cet �v�nement comme il fallait malgr� �a */
		//On remplace les noms des champs pour que permettre une utilisation des r�sultats $_POST
		$ES(params.check_inputs, row_clone).each(function(input){
		input.name = input.name.replace(new RegExp('^'+params.css_row_class+'\[[0-9]+\]'), params.css_row_class+'['+row_number+']');

			if(input.name=='article['+row_number+'][qte]') {
				input.value=1;
			}
	
		});
		
		//Injection de la ligne, une fois tout le travail termin�
		row_clone.injectAfter( row );
		
		//Nettoyage, le clonage, �a salit
		row_clone = null;
		row = null;
	}

	//initilisation de la classe au premier appel
	this.init();
}

 ////////////////////////////////////////////////////////
 // plutot que de contr�ler � posteriori le contenu d'un champ de    //
 //  saisie pour voir s'il ne contient que les caract�res autoris�s,    //
 //  pourquoi ne pas faire ce contr�le au f�r et � mesure en           //
 //  rejetant imm�diatement les caract�res interdits.                    //
 // un ch'tit exemple on l'on n'autorise que la saisie de Chiffres //
 ////////////////////////////////////////////////////



/*~~~~~~~~~~~~~~~~~~~~~~~~~~ #        #                             #
function SUC(champ) //~~ initialisation ~~ Saisir Uniquement des Chiffres
//~~~~~~~~~~~~~~~~~~~~~~~~~~ #        #                             */
function SUC(champ){
 this.champ=champ;
 var Lui=this;
 var ie = false; /*@cc_on ie = true; @*/
 if ( ie ) {
     this.champ.onkeypress = Lui.IE;
    }
 else  { 
     this.champ.onkeyup = function(e)
      {
       Lui.FF(this, e);
      }
    }
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SUC.prototype.IE=function() //~~ pour Internet Explorer ~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{
 if ( event.keyCode<0x30 || event.keyCode>0x39 )
 {
  event.returnValue= false;
 }
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SUC.prototype.FF=function(zone,evt) //~~ pour FireFox ~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{
 if ( evt.which<0x30 || evt.which>0x39 )
 {
  zone.value=zone.value.replace(/[^0-9]/g,"");
 }
}

/*
  //////////////////////////////////////
  // Exemple d'utilisation              
  // <form  name="frm">                 
  //  <input name="txt"                 
  //    type="text" />                  
  // </form>                            
  // <script type="text/javascript">    
  //  new SUC( document.frm.txt );      
  // </script>                                            
  ///////////////////////////////
*/  
  
/* Fonctions charg�es lorsque le DOM du document est pr�t */
/* Utilise mootools.addEvent */
window.addEvent('domready', function(){ var forms = new Forms('obligatoire'); });
window.addEvent('domready', Forms_autoclear);
window.addEvent('domready', articles_multilignes);