// ###### CAPTURES DES EVENEMENTS ######################################################################################################################################
function iniFunctions(e){
	form_bindFormulaires(); // Capture tous les évènement sur les éléments de formulaire qui respectent la syntaxe
	//funcExec();
}

function stopEvent(e){ // Stop la propagation de l'event e
	if(e.stopPropagation){
		e.stopPropagation();
		e.preventDefault();
	} else {
		e.cancelBubble=true;
		e.returnValue=false;
	}
}

// ###### AJAX #########################################################################################################################################################
function AJXcall(page,form,chmp){
	if($(chmp)){
		new Ajax.Request(page,{
			method: 'post',
			postBody: Form.serialize(form),
			onComplete:function(req){
				Element.update($(chmp),req.responseText);
//				Element.scrollTo($(chmp));
				form_bindFormulaires();
			}
		});
		Element.update(chmp,'<img src="./images/indicator.gif">');
	} else {
		alert("Pas trouvé l'élément : '"+chmp)+"' dans le DOM !";	
	}
}

function AJXhref(page,dest){
	if($(dest)){
		new Ajax.Request(page,{
			method: 'get',
			onComplete:function(req){
				Element.update($(dest),req.responseText);
				Element.scrollTo($(dest));
			}
		});
		Element.update(dest,'<img src="./images/indicator.gif">');
	}
}

// ###### FORMULAIRES D'INTERFACE (BOUTONS)  ###########################################################################################################################
var REGEX_field_VALUE=/^JS:(.*)$/;
var REGEX_field_COMMANDE=/^([VASLMCEKFXIP]{1})_([^']*)(_'?([^']*)'?)?$/;
var REGEX_field_IMAGE=/^([0-9]+)x([0-9]+)(\-(.*))?$/;

function form_bindElements(formIn){ // Surveille tous les éléments d'un formulaire en fonction de leur type
	var elts=Form.getElements(formIn); // On récupère tous les boutons image ---
	for(var index=0;index<elts.length;index++){
		var nom=elts[index].id;
		if(elts[index].id.match(REGEX_field_VALUE)){
			switch(elts[index].type){
				case "button":
				case "submit":
				case "image":
					var evt='click';
					break;
				case "text":
				case "select-one":
				case "checkbox":				
					var evt='change';
					break;
			}
			Event.observe(elts[index],evt,form_btnExec,false);
		}
	}
}

function form_bindFormulaires(){ // Capture tous les evenement de tous les éléments qui répondent au format de tous les formulaires de la page
	var forms=document.forms;
	for(var index=0;index<forms.length;++index){
//		alert("J'ai trouvé : "+forms.item(index).name);
		form_bindElements(forms.item(index));
	}
}

function form_btnExec(e){ // Execute les commandes des boutons des formulaires
	var elt=Event.element(e);
	if(str=elt.id.match(REGEX_field_VALUE)){
		str=strExplode(/[^\|]+/,str[1]);
		if(str.length<1){
			return 0;
		} else {
			var tst=1;
			for(var index=0;index<str.length;index++){
				if(tst){tst=form_func(str[index],elt,e);}
			}
		}
	}
}

function form_func(func,elt,e){ // Change la valeur du champ de form par valeur
	if(prm=$(func.match(REGEX_field_COMMANDE))){
		var form=elt.up('form');
		var valeur=getFieldValue(elt);
		if(!valeur && elt.value){valeur=elt.value;}
		if(prm){			
//	alert($A(prm).inspect());
			switch(prm[1]){
				case "V":  //Change la valeur du champ prm[2] par prm[4]
					var chmp=$(form.elements[prm[2]]);
					if($(prm[4])){prm[4]=$F($(prm[4]));}
					var val=(prm[4]=='this')?$F(elt):prm[4];
//	alert(chmp.name+"-->'"+val+"'");
					chmp.value=val;
					return 1;
					break;
				case "A": // Change le paramètre action du formulaire prm[2] sinon par defaut celui qui contient le champ
					var form=(prm[2]!='')?prm[2]:form;
					var val=(prm[4]=='this')?valeur:prm[4];
					$(form).action=val;
					return 1;
					break;
				case "S": // Soumet le formulaire prm[2] sinon par defaut celui qui contient le champ
					var form=prm[2]?prm[2]:form;
					$(form).submit();
					return 1;
					break;
				case "L": // Change de page (document.location)
					var val=(prm[2]=='this')?valeur:prm[2];
					document.location=val;
					return 1;
				case "M": // Boite d'alerte avec message
					alert(prm[4]);
					return 1;
				case "C": // Boite de confirmation avec message
					if(!confirm(prm[4])){
						stopEvent(e);
						return 0;
					} else {
						return 1;
					}
				case "E": // Evalue la validité du forlulaire avant de le soummettre
					return checkForm(form);
				case "F": // Fonction à exécuter avec paramètres
					var val=(prm[4]=='this')?valeur:prm[4];
					var str=prm[2]+"(\""+val+"\",\""+elt.id+"\")";
					eval(str);
					return 1;
				case "X": // Fonction Ajax soumets à prm[2] la valeur de tous les champs du formulaire courant en POST et met à jour le contenu prm[4]
					stopEvent(e);
					AJXcall(prm[2],form,prm[4]);
					return 1;
				case "I": // Ouvre une vignette (image dans une nouvelle fenêtre) à l'aide de la fonction vignette
					stopEvent(e);
					if(tx=$(prm[4].match(REGEX_field_IMAGE))){vignette(prm[2],tx[1],tx[2],tx[4]);}
					return 1;
				case "P": // Pop Up : ouvre l'url dans une nouvelle fenêtre
					popUp(prm[2]);
					return 1;
			}
		}
	}
}

// ###### CHAINES DE CARACTERES ########################################################################################################################################
function strExplode(token,texte){ // Similaire à la fonction PHP Explode
	var str=[];
	texte.scan(token,function(match) {str.push(match[0]);});
	return str;
}

// ###### NAVIGATEURS (from PHPBB) #####################################################################################################################################
var clientPC=navigator.userAgent.toLowerCase();
var clientVer=parseInt(navigator.appVersion);
var is_ie=((clientPC.indexOf("msie")!=-1) && (clientPC.indexOf("opera")==-1));
var is_nav=((clientPC.indexOf('mozilla')!=-1) && (clientPC.indexOf('spoofer')==-1) && (clientPC.indexOf('compatible')==-1) && (clientPC.indexOf('opera')==-1) && (clientPC.indexOf('webtv')==-1) && (clientPC.indexOf('hotjava')==-1));
var is_saf=((clientPC.indexOf('safari')!=-1));

var is_moz=0;
var is_win=((clientPC.indexOf("win")!=-1) || (clientPC.indexOf("16bit")!=-1));
var is_mac=(clientPC.indexOf("mac")!=-1);


// ###### FORMULAIRES ##################################################################################################################################################
// ## une partie du code est adaptée du livre : Bien développer pout le Web 2.0, de Christophe Courteneuve (Editions Eyrolles 2006)
// Être compatible avec MSIE...
if ('undefined'==typeof Node)
    Node={ELEMENT_NODE: 1, TEXT_NODE: 3 };

var REGEX_AUTO_FIELD=/^[^_]+(_Req)?(_([0-9]+|Txt|EMail|Int|Dbl|Date|Radio|Len)(_[0-9.]+){0,2})?$/;
var REGEX_BLANK=/^\s*$/;
var REGEX_TXT=/^[^%$<>]+$/;
var REGEX_EMAIL=/^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9_\.\-]+\.[a-zA-Z]{2,3}$/;
var REGEX_DAY=/^(0?[1-9]|[1-2][0-9]|3[01])$/;
var REGEX_MONTH=/^(0?[1-9]|1[0-2])$/;
var REGEX_TYPED_FIELD=/_(Txt|EMail|Int|Dbl|Date|Radio|Len)(_([0-9.]+))?(_([0-9.]+))?$/;
var REGEX_YEAR=/^[0-9]{2,4}$/;

var MSG_BLANK=' est vide.';
var MSG_UNCHECKED=' n\'est pas coché.';
var MSG_RADIO=' n\'est pas défini(e). ';
var MSG_BAD_CHARS=' comporte des caractères interdits.';
var MSG_BAD_EMAIL=' n\'est pas une adresse e-mail valide.';
var MSG_NOT_A_DATE=' n\'est pas une date.';
var MSG_NOT_A_DOUBLE=' n\'est pas un nombre.';
var MSG_NOT_AN_INTEGER=' n\'est pas un nombre entier.';
var MSG_TOO_LOW=' est trop petit(e).';
var MSG_TOO_HIGH=' est trop grand(e).';
var MSG_BAD_LENGTH=' n\'a pas le bon nombre de  caractères';

function checkForm(form){
	var errors='';
	var faulty=null;
//alert($A(form.elements).inspect());
	for(var index=0;index<form.elements.length;++index){
		var field=form.elements.item(index);
		if(!field.id.match(REGEX_AUTO_FIELD)){continue;}
		var value=getFieldValue(field);
		if(!value && field.value){value=field.value;}		
//alert(field.name+"=>"+field.value);
		if(field.id.match(/_Req/)){
			var mess=null;
			if(value.match(REGEX_BLANK)){mess=MSG_BLANK;}
			if(field.type=='checkbox' && !field.checked){mess=MSG_UNCHECKED}
			if(mess){
				errors+='"'+getFieldName(field)+'"'+mess+'\n';				
				faulty=faulty || field;
				continue;
			}			
		}
		var match=field.id.match(REGEX_TYPED_FIELD);
		if(match){			
//alert($A(match).inspect());
			var type=match[1];
			var min=match[3];
			var max=match[5];
			var error=checkTypedField(value,type,min,max);
			if(error){
				errors+='"'+getFieldName(field)+'"'+error+'\n';
				faulty=faulty || field;
			}
		}
	}
	if(!faulty){
		return 1;
	} else {
		alert(errors);
		faulty.focus();
		return 0;
	}
}

function checkTypedField(value,type,min,max) {
    // Valeurs par défaut pour les bornes
    min=min || Number.NEGATIVE_INFINITY;
    max=max || Number.POSITIVE_INFINITY;
    var val;
	 switch(type){
		case 'Txt':
			if(!value.match(REGEX_TXT)){return MSG_BAD_CHARS;}
			break;
		case 'EMail':
			if(!value.match(REGEX_EMAIL)){return MSG_BAD_EMAIL;}
			break;			
		case 'Date':
			var comps=value.split('/');
			if(3!=comps.length || !comps[0].match(REGEX_DAY) || !comps[1].match(REGEX_MONTH) || !comps[2].match(REGEX_YEAR)){return MSG_NOT_A_DATE;}
			break;
		case 'Radio':
			if(!getRadioVal(value)){return MSG_RADIO;}
			break;
		case 'Len':
			if(value.length<min || value.length>max){return MSG_BAD_LENGTH+" (min. : "+min+", max. : "+max+")";}
			break;	
		case 'Int':
			try{
				val=parseInt(value,10);
				if(String(val)!=value){throw val;}
			} catch(e) {return MSG_NOT_AN_INTEGER;}
		case 'Dbl':
			try{
				val=parseFloat(value);
				if(String(val) != value){throw val;}
			} catch(e) {return MSG_NOT_A_DOUBLE;}
	 }
    if('Int'==type || 'Dbl'==type){
        if(val<min){return MSG_TOO_LOW;}
        if(val>max){return MSG_TOO_HIGH;}
    }
    return null;
}

function getFieldName(field){
	var label=getLabelFor(field);
	if(!label){return field.name;}
	var text='';
	var node=label.firstChild;
	// Parcours en profondeur, dérécursifié, du fragment sous le libellé
	while(true){
		if(Node.ELEMENT_NODE==node.nodeType && node.hasChildNodes()){
			node=node.firstChild;
		} else { 
			if(Node.TEXT_NODE==node.nodeType){text+=node.nodeValue;}
			if(node.nextSibling){
				node=node.nextSibling;
			} else {
				node=node.parentNode;
				if(node==label){break;}
				node=node.nextSibling;
			}			
		}
	}
	return text;
}

function getFieldValue(field){
	var value='';
	switch(field.tagName){
		case 'INPUT':
			value=field.value;
			break;
		case 'select':
			if(-1<field.selectedIndex){
				var opt=field.options[field.selectedIndex];
				value=opt.value;
				if(!value && !('value' in opt)){value=opt.text;}
        }
	}
	return value;
}

function getLabelFor(field){
	var labels=document.getElementsByTagName('label');
	for(var index=0;index<labels.length;++index){
		var label=labels.item(index);
		if (label.htmlFor==field.id){return label;}
	}
	return null;
}

function getRadioVal(field){
	var val=null;
	var rad=document.getElementsByName(field);
	for(var index=0;index<rad.length;++index){
		if(rad.item(index).checked){val=rad.item(index).value;}
	}
	return val;
}

// ##### CASES A COCHER #####################################################
function checkAll(nom){
	var elts=document.getElementsByName(nom);
	for(var index=0;index<elts.length;++index){elts.item(index).checked=true;}
}

function uncheckAll(nom){
	var elts=document.getElementsByName(nom);
	for(var index=0;index<elts.length;++index){elts.item(index).checked=false;}
}

// ###### CALCULS SUR LES DATES ET HEURES #########################################################################################
function getSQLDate(){ // Retourne la date au format MySQL
	var args=getSQLDate.arguments;
	if(args.length){var now = new Date(args[0]);} else {var now = new Date();}
	return now.getFullYear()+"-"+now.getMonth()+"-"+now.getDate()+" "+now.getHours()+":"+now.getMinutes()+":"+now.getSeconds();
}

function calc_DT(nom,type){ // Calcul de la valeur du champ caché de date : nom à partir des ses champs de choix JJ/MM/AAAA HH:MM:SS
	var form=($(nom)).up('form');
	switch(type){
		case "DateTime":		
			var jour=form.elements[nom+'Jour'].value;
			var mois=form.elements[nom+'Mois'].value;
			var annee=form.elements[nom+'Annee'].value;
			var heure=form.elements[nom+'Heure'].value;
			var minutes=form.elements[nom+'Minutes'].value;
			var secondes=form.elements[nom+'Secondes'].value;
			var val=annee+"-"+mois+"-"+jour+" "+heure+":"+minutes+":"+secondes;		
			break;
		case "Date":
			var jour=form.elements[nom+'Jour'].value;
			var mois=form.elements[nom+'Mois'].value;
			var annee=form.elements[nom+'Annee'].value;
			var val=annee+"-"+mois+"-"+jour;
			break;
		case "Time":		
			var heure=form.elements[nom+'Heure'].value;
			var minutes=form.elements[nom+'Minutes'].value;
			var secondes=form.elements[nom+'Secondes'].value;
			var val=heure+":"+minutes+":"+secondes;		
			break;
		
	}
	($(nom)).value=val;
}

function dateCalc(nom){calc_DT(nom,"Date");} // Calcul de la valeur du champ caché de date : nom à partir des ses champs de choix de jour, mois et année

function timeCalc(nom){calc_DT(nom,"DateTime");} // Calcul de la valeur du champ caché de timestamp

function heureCalc(nom){calc_DT(nom,"Time");} // Calcul de la valeur du champ caché de timestamp

function refresh_DT(nom,type){ // Met les champs d'heure et de data à la date du moment
	var form=($(nom)).up('form');
	aujourdhui=new Date;
	var jour=aujourdhui.getDate();
	var mois=aujourdhui.getMonth()+1;
	var annee=aujourdhui.getFullYear();
	var heure=aujourdhui.getHours();
	var minutes=aujourdhui.getMinutes();
	var secondes=aujourdhui.getSeconds();
	if(jour<10){jour="0"+jour;}
	if(mois<10){mois="0"+mois;}
	if(heure<10){heure="0"+heure;}
	if(minutes<10){minutes="0"+minutes;}
	if(secondes<10){secondes="0"+secondes;}
	switch(type){
		case "Date":
			form.elements[nom+'Jour'].value=jour;
			form.elements[nom+'Mois'].value=mois;
			form.elements[nom+'Annee'].value=annee;
			break;
		case "DateTime":
			form.elements[nom+'Jour'].value=jour;
			form.elements[nom+'Mois'].value=mois;
			form.elements[nom+'Annee'].value=annee;
		case "Time":	
			form.elements[nom+'Heure'].value=heure;
			form.elements[nom+'Minutes'].value=minutes;
			form.elements[nom+'Secondes'].value=secondes;
			break;			
	}	
}

function dateRefresh(nom){return refresh_DT(nom,"Date");} 		// Met les champs de choix de date à la date du jour

function timeRefresh(nom){return refresh_DT(nom,"DateTime");}	// Met tous les champs de choix de timestamp à la date et heure du jour

function heureRefresh(nom){return refresh_DT(nom,"Time");} // Met tous les champs de choix de timestamp à l'heure du jour


// --- Check for Browser & Platform for PC & IE specific bits (from phpBB)
var clientPC=navigator.userAgent.toLowerCase();
var clientVer=parseInt(navigator.appVersion);
var is_ie=((clientPC.indexOf("msie")!=-1) && (clientPC.indexOf("opera")==-1));
var is_nav=((clientPC.indexOf('mozilla')!=-1) && (clientPC.indexOf('spoofer')==-1) && (clientPC.indexOf('compatible')==-1) && (clientPC.indexOf('opera')==-1) && (clientPC.indexOf('webtv')==-1) && (clientPC.indexOf('hotjava')==-1));
var is_moz=0;
var is_win=((clientPC.indexOf("win")!=-1) || (clientPC.indexOf("16bit")!=-1));
var is_mac=(clientPC.indexOf("mac")!=-1);

// ----- Déplacement auto du calque aux position relatives x0 et y0 -----
function moveMenu(name,x0,y0){
  	if (navigator.appName=="Microsoft Internet Explorer"){
		offsety=document.body.scrollTop;
		offsetx=document.body.scrollLeft;
	} else  {
		offsety=window.pageYOffset;
		offsetx=window.pageXOffset;
	}
	var div1=document.getElementById(name).style;
	div1.left=offsetx+x0;
	div1.top=offsety+y0;
	tempo=setTimeout("moveMenu('"+name+"',"+x0+","+y0+")",50);
}

function moveMenuY(name,y0){
  	if (navigator.appName=="Microsoft Internet Explorer"){
		offsety=document.body.scrollTop;
	} else  {
		offsety=window.pageYOffset;
	}
	var div1=document.getElementById(name).style;
	div1.top=offsety+y0;
	tempo=setTimeout("moveMenuY('"+name+"',"+y0+")",50);
}

// ----- Déplacement du layer à la position x0 et y0 -----
function moveLayerTo(name,x0,y0){
  	if (navigator.appName=="Microsoft Internet Explorer"){
		offsetx=document.body.scrollLeft;
		offsety=document.body.scrollTop;
	} else  {
		offsetx=window.pageXOffset;
		offsety=window.pageYOffset;
	}
	var div1=document.getElementById(name).style;
	div1.left=offsetx+x0;
	div1.top=offsety+y0;
}

// ----- Déplacement du layer de x0 et y0 pixels -----
function moveLayer(name,x0,y0){
	var obj=document.getElementById(name).style;
	var x=Number(obj.left.slice(0,obj.left.length-2));
	var y=Number(obj.top.slice(0,obj.top.length-2));
	obj.left=Number(x+x0)+"px";
	obj.top=Number(y+y0)+"px";
}

// ------ Scrolling Layer ---------------------------------------------------------------------------------------------------
// ------ Initialisation des calques ------
//scrollInit(lName, posX, posY, tX, tY, indZ, lStyle, stepX, delay, innerText)
// lName		: new layer namer
// posX		: absolute left position of the new layer
// posY		: absolute top position of the new layer
// tX		: new layer width
// tY		: new layer height
// indZ 		: z-idex of the new layer
// lStyle		: CSS style of the new layer
// stepX		: shift definition for the new layer

// delay		: time between two shifts
// innerText	: displayed html in the new layer

function scrollInit(lName,posX,posY,tX,tY,indZ,lStyle,stepX,delay,innerText){
	// ------ Création des calques ------
	document.write('<DIV ID="'+lName+'A" STYLE="position:absolute; left:'+posX+'px; top:'+posY+'px; width:'+tX+'px; height:'+tY+'px; z-index:'+indZ+'; visibility: visible;" CLASS="'+lStyle+'">');
	document.write(innerText);
	document.write('</DIV>');	
	document.write('<DIV ID="'+lName+'B" STYLE="position:absolute; left:'+(posX+tX)+'px; top:'+posY+'px; width:'+tX+'px; height:'+tY+'px; z-index:'+indZ+'; visibility: visible;" CLASS="'+lStyle+'">');
	document.write(innerText);
	document.write('</DIV>');
	// ------ Appel de la fonction de scrolling ------
	scrolLay(lName+"A", stepX, delay);
	scrolLay(lName+"B", stepX, delay);
}

// ------ Scrolling des calques ------
//scrollInit(lName, posX, posY, tX, tY, indZ, lStyle, stepX, delay, innerText)
// lName		: new layer namer
// stepX		: shift definition for the new layer
// delay		: time between two shifts
function scrolLay(Lname, stepX, delay){
	X=document.getElementById(Lname).style.left;
	X=Number(X.slice(0,X.length-2));
	maxX=document.getElementById(Lname).style.width;
	maxX=Number(maxX.slice(0,maxX.length-2));
	minX=-1*maxX;
	if(X-stepX>minX){
		X=X-stepX;
	} else {
		X=maxX;
	}
	document.getElementById(Lname).style.left=X;
	setTimeout("scrolLay('"+Lname+"',"+stepX+","+delay+")",delay);
}

//----- Outils pour Formulaire --------- ©Supernick 2004---------------------------------//
//----- Vérifie si les champs du formulaire on bien été remplis -----//
// syntaxe : veriForm(nomForm, messBase, typChamp0, noChamp0, messChamp0, typChamp1, noChamp1, messChamp1....... typChampX, noChampX, messChampX)

// nomForm : nom du formulaire à vérifier
// mesBase : base du message d'alerte 
// typ champ : "s" = champ simple alphanumérique
//			"d" = champ simple numérique
// 		"p" = champ numérique positif
//			"i|" = interval dans lequel une valeur au moins doit être cochée
//			"i&" = interval dans lequel toutes les valeurs doivent être cochées pour le même message d'erreur
//			"c" = conditionnel : si premier champ rempli alors verifie si deuxieme champ rempli
// noChamp :	si "s" alors simple n° du champ
//			si "i|" alors n°debut-n°fin interval ex. : 20-30
//			si "i&" alors n°debut-n°fin interval ex. : 11-17
//			si "c" : alors n°premmier champ, si validé verifie n° deuxieme champ ex. : 20-30
// messChamp : message d'alerte pour le champ simple ou l'interval

function veriForm(){
	var noError=true;
	var nomForm=veriForm.arguments[0];
	var mesBase=veriForm.arguments[1];
	form=document.forms[nomForm];
	for(i=2;i<veriForm.arguments.length-2;i=i+3){
		var typChamp=veriForm.arguments[i];
		var messChamp=veriForm.arguments[i+2];		
		var selected=true;
		if(typChamp=="s" || typChamp=="d" || typChamp=="p"){
			var noChamp=veriForm.arguments[i+1];
			if(!form.elements[noChamp]){
				var val=document.all[veriForm.arguments[i+1]].value;
			} else {
				var val=form.elements[noChamp].value;
			}			
		} else {
			noChamp=veriForm.arguments[i+1];
			cutpos=noChamp.lastIndexOf("-");
			indexDeb=parseInt(noChamp.slice(0,cutpos));
			indexFin=parseInt(noChamp.slice(cutpos+1,noChamp.length));			
		}
		switch(typChamp){
			case "s":
				if(val==""){selected=false;}
				break;
			case "d":
				if(!checkNum(val)){selected=false;}
				break;
			case "p":
				if(val<=0){selected=false;}
				break;
			case "i|":
				var good=false;
				for(j=indexDeb;j<=indexFin;j++){
					if (form.elements[j].value!=""){good=true;}
					selected=good;
				}
				break;
			case "i&":			
				for(j=indexDeb;j<=indexFin;j++){
					if(form.elements[j].value==""){selected=false;}
				}
				break;
			case "c":
				if(form.elements[indexDeb].value!=""){
					if(form.elements[indexFin].value==""){selected=false;}
				}
				break;
		}
		if(!selected){
			mesBase+=messChamp+"\n";
			noError=false;
		}
	}
	if(!noError){
		alert(mesBase);
		return(noError);		
	} else {
		form.submit();
	}
}

function validForm(nomForm){
	if(veriForm(nomForm,'Vous ne pouvez pas envoyer ce formulaire sans avoir indiqué :\n\n','s','0','Votre civilité','s','1','Votre nom','s','2','Votre prénom','i&','3-6','Votre adresse complète','s','8','Votre adresse e-mail','s','7','Votre n° de téléphone')){
	document.forms[nomForm].submit();
	}
}

// ---------------------------------------------------------------------------------
// ------ Calculs pour les formulaires de type bon de commande, factures etc. ------
// ---------------------------------------------------------------------------------
function calc_lignes(qte,pu,montant){ // Affiche dans montantXX le resultat de qteXX*puXX (si qte est numérique) 
	var tags=document.getElementsByTagName("input");
	var long=qte.length;
	for($i=0;$i<tags.length;$i++){
		var nom=tags[$i].name;
		var deb=nom.substring(0,long);
		var index=nom.substring(long,nom.length);
		if(deb==qte){
			if(!checkNum(tags[$i].value)){
				alert("ATTENTION, seules les valeurs numériques sont admises !");
				tags[$i].value=0;
			} else {
				document.all[montant+index].value=Number(document.all[qte+index].value*document.all[pu+index].value);
			}
		}
	}	
}

function calc_total(prefix,chmpTotal){	// Calcul le total de tous les champs dont le nom commence par prefix et affiche le resultat dans chmpTotal
	var tags=document.getElementsByTagName("input");
	var long=prefix.length;
	var total=0;
	for($i=0;$i<tags.length;$i++){
		var nom=tags[$i].name;
		var deb=nom.substring(0,long);
		if(nom==chmpTotal){champ=tags[$i];}
		if(deb==prefix){			
			if(!checkNum(tags[$i].value)){
				alert("ATTENTION, seules les valeurs numériques sont admises !");
				return false;
			} else {
				total+=Number(tags[$i].value);
			}
		}
	}
	champ.value=total;
}

function calc_limit(defaut,limite,valeur,dest){ //  Affiche dans dest defaut si valeur<limite sinon 0
	var taux=defaut;
	if(document.all[valeur].value>=limite){taux=0;}
	document.all[dest].value=taux;
}

function calc_add(dest,valeur){ // Affiche dans  dest, valeur additionnée de la valeur de tous les champs passés en paramètre à sa suite 
	var total=0;
	if(document.all[valeur].value>0){
		for($i=1;$i<calc_add.arguments.length;$i++){total=total+Number(document.all[calc_add.arguments[$i]].value);}
	}
	document.all[dest].value=total;
}

function checkNum(checkStr){ // Vérifie si une valeur est bien numérique
	var checkOK="0123456789-.";
	var allValid=true;
	for(k=0;k<checkStr.length;k++){
		ch=checkStr.charAt(k);
		for(j=0;j<checkOK.length;j++){if(ch==checkOK.charAt(j)){break;}}
		if(j==checkOK.length){
			allValid=false;
			break;
		}
	}
	return allValid;	
}


function checkReqOption(form,e){ // Vérifie que le champ optionel obligatoir est bien validé
	var frm=$(form);
	var option=$("opt_Req");
	if(!option){
		frm.submit();
	} else {
		if($F(option)!=""){
			frm.submit();
		} else {
			alert("Vous devez selectionner une valeur pour '"+ option.name+"'!");	
		}
	}
}


// ---------------------------------------------------------------------------------
// ------ Navigation  --------------------------------------------------------------
// ---------------------------------------------------------------------------------
function goTo(dest,target){ // Aller à (url et/ou ancre dans la page)
	if (!target){var target="pages";}
	if(window.top.frames[target]){
		var path=window.top.frames[target].location;
		path=path.toString();
		for (var i=0;i<path.length;i++){if(path.charAt(i)=="#"){path=path.slice(0,i);}}	
		if (dest.charAt(0)=="#"){path=path+dest;}	else {path=dest;}
		window.top.frames[target].location=path;
	} else {
		var path=document.location;
		path=path.toString();
		for (var i=0;i<path.length;i++){if(path.charAt(i)=="#"){path=path.slice(0,i);}}	
		if (dest.charAt(0)=="#"){path=path+dest;}	else {path=dest;}
		document.location=path;
	}
}
/*function vignette(nomimg,tx,ty){ // Ouvre une nouvelle fenètre au milieu de l'écran à la taille xy de l'image nomimg
	var largeurE=screen.width;
	var hauteurE=screen.height;
	var espL=(largeurE-tx)/2;
	var espH=(hauteurE-ty)/2;
	var taille="width="+tx+",height="+ty;
	var winPos=",left="+espL+",top="+espH;
	var params=taille+winPos+",directories=NO,location=NO,menubar=NO,resizable=NO,scrollbars=NO,status=NO,titlebar=NO,toolbar=NO";
	zoom=window.open('','',params);
	zoom.document.write('<HTML><BODY leftMARGIN=0 TOPMARGIN=0 MARGINWIDTH=0 MARGINHEIGHT=0 onblur=\"window.close()\">');
	zoom.document.write('<INPUT TYPE=IMAGE IMG SRC="'+nomimg+'" WIDTH='+tx+' HEIGHT='+ty+' BORDER=0 onmouseout=\"window.close()\" onmousedown=\"window.close()\">');
	zoom.document.write('</BODY></HTML>');	
}*/


// ###### INITIALISE LES FONCTIONS DE CAPTURE DES EVENEMENTS APRES LE CHARGEMENT DE LA PAGE ############################################################################

try {
	jQuery(document).ready(function(){
		jQuery.noConflict();
		iniFunctions();
	});
} catch(e) {
	Event.observe(window,"load",iniFunctions,false);
}