if(window.addEventListener){
	window.addEventListener("load", loadForm, false);
}else if(window.attachEvent){
	window.attachEvent("onload", loadForm);
}else{
	window.onload = loadForm;
}


// Array & fonctions de récupération des actions onclick/onchange/onkeyup présente dans le code HTML
var returnArray = new Array;
var returnFct   = function(el, action){ 
	eval(returnArray[el.name][action]); 	
} 

// Array listant tous les champs à vérifier
var arrError = new Array();

/* ******************************************************************************************** */
/* Liste tous les input/textarea/select de la page et leur applique une fonction onfocus/onblur */
/* Si la class de ces objets est jserror, on ajoute une fonction de checkerror au onblur        */
/* ******************************************************************************************** */
function loadForm(){
	
	if(document.form){
		var form = document.form;
		form.onsubmit = function(){ return (chekForm()); }
	}
	
	// CREATION DU JS
	var arr  	= [];
	var tags 	= ["input", "textarea", "select"];
	var cpt 	= 0;
	for (var ti in tags) {
		var tag = tags[ti];
		
		var arr = document.getElementsByTagName(tag);		
		for(a=0; a<arr.length; a++){
			
			// Si il y a déjà une fonction sur le onclick, onkeyup etc. on la récupère dans un tableau global et on la réinjecte dans la redéfinition de l'appel		
			returnArray[arr[a].name] = new Array();
			returnArray[arr[a].name]['onclick'] 	= (arr[a].getAttribute("onclick"))?arr[a].getAttribute("onclick"):'';
			returnArray[arr[a].name]['onkeyup'] 	= (arr[a].getAttribute("onkeyup"))?arr[a].getAttribute("onkeyup"):'';
			returnArray[arr[a].name]['onchange'] 	= (arr[a].getAttribute("onchange"))?arr[a].getAttribute("onchange"):'';
			
			if(arr[a].type == 'text' || arr[a].type == 'password' || arr[a].type == 'textarea'){
				Try:arr[a].onfocus	= function(){focusInput(this);};
				Try:arr[a].onkeyup	= function(){checkError(this); returnFct(this, 'onkeyup'); };
				Try:arr[a].onblur	= function(){checkError(this); blurInput(this); };
			}
			/*if(arr[a].type == 'select-one'){ // select-one = select
				Try:arr[a].onfocus	= function(){focusInput(this);};
				Try:arr[a].onchange = function(){checkError(this); returnFct(this, 'onchange'); };
				Try:arr[a].onblur	= function(){checkError(this); blurInput(this); };
			}				
			if(arr[a].type == 'checkbox' || arr[a].type == 'radio'){				 
				Try:arr[a].onclick	= function(){ returnFct(this, 'onclick'); };					 
			}*/
			
			var patt = new RegExp("required");
			if(arr[a].type == 'text' || arr[a].type == 'password' || arr[a].type == 'textarea' || arr[a].type == 'select-one' || (patt.test(arr[a].className)==true && (arr[a].type == 'checkbox' || arr[a].type == 'radio'))){
				//alert(arr[a].name);
				arrError[cpt] = arr[a];				
				cpt++;
			}
		}		
	}
}

/* ********************************************************************** */
/* Au focus sur l'élement on peut définir les modifications de layout ici */
/* S'il existe un alt, on crée une bulle qui apparaitra au onfocus        */
/* ********************************************************************** */
function focusInput(el){
	el.style.border 	= '1px solid #ccc';
	if(checkError(el)!=0){ showError(el); }else{ showNoError(el); }
	showAlt(el);	
}

/* ************************************************************************* */
/* Au onblur, on remet à défaut le layout de l'élément et on supprime le alt */
/* ************************************************************************* */
function blurInput(el){
	el.style.border 	= '1px solid #ccc';
	hideError(el);
	hideAlt(el);	
}

/* *************************************************** */
/* En cas d'erreur, changements graphiques a effectuer */
/* *************************************************** */
function showError(el){
	el.style.background	= '#FFE8E8';
}

/* ************************ */
/* S'il n'y a pas d'erreurs */
/* ************************ */
function showNoError(el){
	//el.style.background	= '#F4FFE8';
	el.style.background	= '#fff';
}

/* **************************** */
/* Reset le layout de l'élément */
/* **************************** */
function hideError(el){
	el.style.background	= '#fff';
}

/* ***************************************************** */
/* Récupère le alt de l'élément et l'affiche s'il existe */
/* ***************************************************** */
var altern_div;
function showAlt(el){
	var alt = el.getAttribute('alt');
	if(alt && alt!=''){
		altern_div 	= document.createElement('DIV');		
		altern_div.className = 'alt';
		altern_div.style.left = (getElementLeft(el)+20)+'px';
		altern_div.style.top = (getElementTop(el)+el.offsetHeight-8)+'px';
		
		altern 		= document.createElement('SPAN');		
		altern.innerHTML = alt;
		
		altern_div.appendChild(altern);
		document.body.appendChild(altern_div);
	}
}

/* ***************************** */
/* Cache le alt s'il est affiché */
/* ***************************** */
function hideAlt(el){
	var alt = el.getAttribute('alt');
	if(alt && alt!='' && altern_div){
		document.body.removeChild(altern_div);
	}
}
/* ********************************** */
/* Fonctions utiles à divers endroits */
/* ********************************** */

// pour positionner en top/left le alt
function getElementLeft(elem) {	
	xPos = elem.offsetLeft;
	tempEl = elem.offsetParent;
	while (tempEl != null) {
		xPos += tempEl.offsetLeft;
		tempEl = tempEl.offsetParent;
	}
	return xPos;
}
function getElementTop(elem) {
	yPos = elem.offsetTop;
	tempEl = elem.offsetParent;
	while (tempEl != null) {
		yPos += tempEl.offsetTop;
		tempEl = tempEl.offsetParent;
	}
	return yPos;
}

// Fonctions particulières
function IsanEmail(str){
	var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if (filter.test(str)) return true; else false;
}
function IsaNumber(str){
	var filter = /^([0-9_\.\-])+$/;
	if (filter.test(str)) return true; else false;
}
function IsaPhone(str){
	var filter = /^([0-9_\.\-\+\\\/ ])+$/;
	if (filter.test(str)) return true; else false;
}
function IsaDate(str){
	var filter = /^(0|1|2)?[0-9]{1}([\/\-]{1})((0|1)?(0|1|2)([\/\-]{1})([0-9]{2,4}))+$/;
	if (filter.test(str)) return true; else false;
}

/* ********************************************************************************* */
/* Check si le contenu de l'input/texatera/select correspond à ce qu'il devrait être */
/* ********************************************************************************* */
function checkError(el){
	
	// type de retour
	// 0  => OK
	// 1  => Vide
	// 2  => Mail érroné
	// 3  => Number érroné (accepte juste des chiffres)
	// 4  => Tel érroné (accepte chiffres et symbole +-/.\)
	// 5  => Date érroné (format jj/mm/aaaa)
	// 10 => Radio obligatoire
	
	var ret = 0;
	
	/* class 'required' */	
	var req = new RegExp("required");
		
	// vide
	if(req.test(el.className)==true && el.value==''){
		ret = 1;
	}
	
	// Class 'mail'	
	var patt = new RegExp("mail");
	if(patt.test(el.className)==true && !IsanEmail(el.value) && ((req.test(el.className)==true && ret != 1) || req.test(el.className)==false && el.value != '')){
		ret = 2;
	}
	
	// Class 'number'	
	var patt = new RegExp("number");
	if(patt.test(el.className)==true && !IsaNumber(el.value) && ((req.test(el.className)==true && ret != 1) || req.test(el.className)==false && el.value != '')){
		ret = 3;
	}
	
	// Class 'phone'	
	var patt = new RegExp("phone");
	if(patt.test(el.className)==true && !IsaPhone(el.value) && ((req.test(el.className)==true && ret != 1) || req.test(el.className)==false && el.value != '')){
		ret = 4;
	}
	
	// Class 'date'	
	var patt = new RegExp("date");
	if(patt.test(el.className)==true && !IsaDate(el.value) && ((req.test(el.className)==true && ret != 1) || req.test(el.className)==false && el.value != '')){
		 ret = 5; 
	}
	
	// IF ERROR, COLORIE EN ROUGE ELSE EN VERT
	if(ret!=0){ showError(el); }else{ showNoError(el); }
	
	// type radio ou checkbox
	if(el.type == 'radio' || el.type == 'checkbox'){
		var div = el.parentNode;
		var arr = div.getElementsByTagName("input");
		var cpt = 0;
		ret = 10; // si erreur
		
		for(b=0; b<arr.length; b++){
			if(arr[b].checked == true){
				cpt++;	
			}
		}
		
		var min3 = new RegExp("min3");
		var min5 = new RegExp("min5");
		if(min3.test(el.className)==true){
			if(cpt>=3){ ret = 0; }
		}else if(min5.test(el.className)==true){
			if(cpt>=5){ ret = 0; }
		}else{	// si un minimum requis
			if(cpt>0){ ret = 0; }
		}
		hideError(el);		
	}
		
	return ret;
}

/* *********************************************************** */
/* Rend obligatoire tous les input/textarea/select dans un div */
/* *********************************************************** */
function doRequired(id, act){
	var div = document.getElementById(id);
	
	var arr  	= new Array();
	var tags 	= ["input", "textarea", "select"];
	var cpt 	= 0;
	for (var ti in tags) {
		var tag = tags[ti];		
		var arr = div.getElementsByTagName(tag);		
		for(a=0; a<arr.length; a++){
			
			var class_tmp = arr[a].className;
			
			if(act == 'on' || act == true){		
				arr[a].className = 'required '+class_tmp;
			}else{
				arr[a].className = class_tmp.replace('required ','');
				arr[a].className = class_tmp.replace('required','');
			}
			
		}
	}	
	loadForm();
	
}

/* *********************************** */
/* ***** FUNCTION DE CHECK FINALE **** */
/* *********************************** */
function chekForm(){
	var err = '';
		
	for(a=0; a<arrError.length; a++){
		if(checkError(arrError[a])==1 || checkError(arrError[a])==10){ err += '* Please insert '+arrError[a].title+'\n'; } 	// champs obligatoire		
		if(checkError(arrError[a])==2 || checkError(arrError[a])==3 || checkError(arrError[a])==4 || checkError(arrError[a])==5){ err += '* '+arrError[a].title+' isn\'t valid\n'; arrError[a].style.background = '#FFE8E8'; } // champs non valide 
	}
	
	if(err != ''){
		alert('There is some errors into the request form:\t\t\t\t\t\n\n'+err);
		return false;
    }else{
		return true;
    }  
}
