/* ****************************************************************************************************************************************
++++ JS permettant de facilement créer un check form. 
++++ Check sur les mails, date, nombre, ... 
++++ Possibilité de lancer des fonctions personnalisées au onfocus & onblur

---- Script de Mathias Brunin, 72dpi
---- v1.0 - decembre 2008
---- V1.1 - decembre 2008
---- v1.2 - janvier 2009 	(création d'un alt qui apparait au onfocus)
---- v1.3 - Janvier 2009 	(récupèration des fonctions pré-existantes)
---- v1.4 - Février 2009 	(champs obligatoires selon que d'autres champs soient remplis ou non)
---- v1.5 - Février 2009 	(refonte importante => fin du jserror. Tous les inputs sont pris en compte => création de la class required
---- v1.6 - Mai 2009 	 	(refonte totale du code JS pour éviter les fonctions qui se bloquent l'une l'autre. 
							 Ajout des input files + test sur la class img (gif, jpg ou png) ou la class csv (csv, xsl, xslx) ou txt (txt, doc, docx, pdf) ) 
---- v1.7 - Septembre 2009	(gestion des multi formulaires, ajout de la fonction _getParent, meilleure gestion des radio/checkbox (dans un row), 
							 Ajout de class pour facilité CSS (row-actif, row-error, row-noerror, oEl-info, oEl-actif, oEl-error, oEl-noerror, oEl-load)	
******************************************************************************************************************************************* */

/* NEW METHODE */
var oCheckform = 
{
	
	/* *********************************** */
	/* FONCTIONS DE CHECK ET DE LOAD DU JS */
	/* *********************************** */	
	_Test: function(){ // check si le JS est bien compris par le navigateur
		var iI = arguments.length - 1;
		for(iI; iI >= 0; iI--) if(!arguments[iI]) return false;
		return true;
	},
	
	_Preload: function(){				
		var sCss = document.createElement('LINK');
		sCss.rel = 'stylesheet';
		sCss.media = 'screen';
		sCss.type = 'text/css';
		sCss.href = './checkform/checkform.css';
		var head = document.getElementsByTagName("HEAD")[0];
		head.appendChild(sCss); //Ajout CSS Spécifique
		
		var aForm = getElementsByClassName(document.body, 'oChkClass');
		for(nFm=0; nFm<aForm.length; nFm++){
			oCheckform._Load(aForm[nFm]);
		}
	},
	
	_Load: function(form){ // Cree le check sur les formulaires désignés			
		form.onsubmit = function(){ return (oCheckform._checkForm(form)); }
		return oCheckform._CreateJs(form);			
	},	
	
	_CreateJs: function(form){ // Crée les JS nécéssaire
		
		// Array & fonctions de récupération des actions onclick/onchange/onkeyup présente dans le code HTML
		var aReturnFn = new Array;
		var fnReturn   = function(el, action){ 
			/*var func = aReturnFn[el.name][action];
			var patt = new RegExp("this");
			if(patt.test(func)==true){ alert(func); func.replace(this, el); alert(func); }*/
			
			eval(aReturnFn[el.name][action]); 	
		} 
		
		// Array listant tous les champs à vérifier		
		var arrError = new Array();
		
		var arr  	= [];
		var tags 	= ["input", "textarea", "select"];
		var cpt 	= 0;
		for (var ti in tags) {
			var tag = tags[ti];
			
			var arr = form.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		
				aReturnFn[arr[a].name] = new Array();
				aReturnFn[arr[a].name]['onclick'] 	= (arr[a].getAttribute("onclick"))?arr[a].getAttribute("onclick"):'';
				aReturnFn[arr[a].name]['onkeyup'] 	= (arr[a].getAttribute("onkeyup"))?arr[a].getAttribute("onkeyup"):'';
				aReturnFn[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(){oCheckform._Checkin(this);  /*fnReturn(this, 'onfocus');*/ };
					Try:arr[a].onkeyup	= function(){oCheckform._CheckError(this); fnReturn(this, 'onkeyup'); };
					Try:arr[a].onblur	= function(){oCheckform._CheckError(this); oCheckform._Checkout(this); };
				}
				if(arr[a].type == 'select-one'){ // select-one = select
					Try:arr[a].onfocus	= function(){oCheckform._Checkin(this);};
					Try:arr[a].onchange = function(){oCheckform._CheckError(this); fnReturn(this, 'onchange'); };
					Try:arr[a].onblur	= function(){oCheckform._CheckError(this); oCheckform._Checkout(this); };
				}				
				if(arr[a].type == 'checkbox' || arr[a].type == 'radio'){				 
					Try:arr[a].onclick	= function(){ fnReturn(this, 'onclick'); };					 
				}			
				
				var patt = new RegExp("required");
				if(arr[a].type == 'text' || arr[a].type == 'file' || 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'))){
					arrError[cpt] = arr[a];				
					cpt++;					
				}
				
				/*var patt = new RegExp("required");
				if(patt.test(arr[a].className)==true){
					var row = oCheckform._getParent(arr[a]);
					row.className += ' row-required';	
				}*/
			}		
		}
		
		return arrError;
	},
	
	/* ****************************** */
	/* FONCTIONS DE CHECK DES ERREURS */
	/* ****************************** */
		
	// Choix de formulaire (0 = FR, 1 = NL, 2 = EN)
	Lng: 0,	
	
	// Labels
	TextAtt: ['Attention, le formulaire présente les erreurs suivantes:\t\t\t\t\t\n\n', 'Opgelet, in het formulier staan volgende fouten:\t\t\t\t\t\n\n', 'Attention, the forms contains following errors:\t\t\t\t\t\n\n'],
	TextPre: ['Veuillez préciser', 'Gelieve', 'Please'],
	TextInv: ['n\'est pas valide', 'is onvalid', 'is not valid'],
	
	_checkForm: function(form){
		var err = '';
		
		var arrError = new Array();
		arrError = oCheckform._Load(form);
				
		for(aEr=0; aEr<arrError.length; aEr++){
			if(oCheckform._CheckError(arrError[aEr])==1 || oCheckform._CheckError(arrError[aEr])==10){ err += '* '+oCheckform.TextPre[oCheckform.Lng]+' '+arrError[aEr].title+'\n'; } 	// champs obligatoire		
			if(oCheckform._CheckError(arrError[aEr])==2 || oCheckform._CheckError(arrError[aEr])==3 || oCheckform._CheckError(arrError[aEr])==4 || oCheckform._CheckError(arrError[aEr])==5 || oCheckform._CheckError(arrError[aEr])==6 || oCheckform._CheckError(arrError[aEr])==7 || oCheckform._CheckError(arrError[aEr])==8 || oCheckform._CheckError(arrError[aEr])==9){ err += '* '+arrError[aEr].title+' '+oCheckform.TextInv[oCheckform.Lng]+'\n'; } // champs non valide 
		}
				
		if(err != ''){
			alert(oCheckform.TextAtt[oCheckform.Lng]+err);
			return false;
		}else{
			return true;
		}
	},	
	
	_CheckError: function(oEl){
		// type de retour
		// 0  => OK
		// 1  => Vide
		// 2  => Mail érroné
		// 3  => Number érroné (accepte juste des chiffres et symbole .)
		// 4  => Tel érroné (accepte chiffres et symbole +-/.\)
		// 5  => Date érroné (format jj/mm/aaaa ou jj-mm-aaaa)
		// 6  => URL érroné
		// 7  => input file => pas une image
		// 8  => input file => pas un csv
		// 9  => input file => pas un txt
		// 10 => Radio obligatoire
		var ret = 0;
				
		var req = new RegExp("required");					
		if(req.test(oEl.className)==true && oEl.value==''){
			ret = 1;
		}		
		// Class 'mail'	
		var patt = new RegExp("mail");
		if(patt.test(oEl.className)==true && !oCheckform._IsanEmail(oEl.value) && ((req.test(oEl.className)==true && ret != 1) || req.test(oEl.className)==false && oEl.value != '')){
			ret = 2;
		}		
		// Class 'number'	
		var patt = new RegExp("number");
		if(patt.test(oEl.className)==true && !oCheckform._IsaNumber(oEl.value) && ((req.test(oEl.className)==true && ret != 1) || req.test(oEl.className)==false && oEl.value != '')){
			ret = 3;
		}		
		// Class 'phone'	
		var patt = new RegExp("phone");
		if(patt.test(oEl.className)==true && !oCheckform._IsaPhone(oEl.value) && ((req.test(oEl.className)==true && ret != 1) || req.test(oEl.className)==false && oEl.value != '')){
			ret = 4;
		}		
		// Class 'date'	
		var patt = new RegExp("date");
		if(patt.test(oEl.className)==true && !oCheckform._IsaDate(oEl.value) && ((req.test(oEl.className)==true && ret != 1) || req.test(oEl.className)==false && oEl.value != '')){
			 ret = 5; 
		}		
		// Class 'url'	
		var patt = new RegExp("url");
		if(patt.test(oEl.className)==true && !oCheckform._IsaUrl(oEl.value) && ((req.test(oEl.className)==true && ret != 1) || req.test(oEl.className)==false && oEl.value != '')){
			 ret = 6; 
		}		
		// class 'img'
		var patt = new RegExp("img");		
		if(patt.test(oEl.className)==true && !oCheckform._IsanImg(oEl.value) && ((req.test(oEl.className)==true && ret != 1) || req.test(oEl.className)==false && oEl.value != '') && oEl.type == 'file'){
			 ret = 7; 
		}		
		// class 'csv'
		var patt = new RegExp("csv");		
		if(patt.test(oEl.className)==true && !oCheckform._IsanCsv(oEl.value) && ((req.test(oEl.className)==true && ret != 1) || req.test(oEl.className)==false && oEl.value != '') && oEl.type == 'file'){
			 ret = 8; 
		}		
		// class 'txt'
		var patt = new RegExp("txt");		
		if(patt.test(oEl.className)==true && !oCheckform._IsanTxt(oEl.value) && ((req.test(oEl.className)==true && ret != 1) || req.test(oEl.className)==false && oEl.value != '') && oEl.type == 'file'){
			 ret = 9; 
		}		
				
		// type radio ou checkbox
		if(oEl.type == 'radio' || oEl.type == 'checkbox'){
			var div = oCheckform._getParent(oEl); // cherche le row le plus proche
			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(oEl.className)==true){
				if(cpt>=3){ ret = 0; }
			}else if(min5.test(oEl.className)==true){
				if(cpt>=5){ ret = 0; }
			}else{	// si un minimum requis
				if(cpt>0){ ret = 0; }
			}
			oCheckform._HideError(oEl);
		}
		
		// IF ERROR, COLORIE EN ROUGE ELSE EN VERT
		if(ret!=0){ oCheckform._ShowError(oEl);	}else{ oCheckform._ShowNoerror(oEl); }
		
		return ret;
	},
	
	/* ****************** */
	/* FONCTIONS DIVERSES */
	/* ****************** */	
	_Checkin: function(oEl){
		var row = oCheckform._getParent(oEl);
		oCheckform._AddClass(row, 'row-actif');
		oCheckform._AddClass(oEl, 'oEl-actif');
		
		//if(oCheckform._CheckError(oEl)!=0){ oCheckform._ShowError(oEl); }else{ oCheckform._HideError(oEl); }
		oCheckform._HideError(oEl);
		oCheckform._ShowAlt(oEl);					
	},	
	_Checkout: function(oEl){
		var row = oCheckform._getParent(oEl);
		oCheckform._RemoveClass(row, 'row-actif');
		oCheckform._RemoveClass(oEl, 'oEl-actif');						
		
		oCheckform._HideAlt(oEl);	
		//oCheckform._HideError(oEl);		
	},	
	_ShowError: function(oEl){
		oCheckform._RemoveClass(oEl, 'oEl-noerror');
		oCheckform._AddClass(oEl, 'oEl-error');
		
		var row = oCheckform._getParent(oEl);
		oCheckform._RemoveClass(row, 'row-noerror');
		oCheckform._AddClass(row, 'row-error');
	},	
	_ShowNoerror: function(oEl){
		oCheckform._RemoveClass(oEl, 'oEl-error');
		oCheckform._AddClass(oEl, 'oEl-noerror');
		
		var row = oCheckform._getParent(oEl);
		oCheckform._AddClass(row, 'row-noerror');
		oCheckform._RemoveClass(row, 'row-error');
	},	
	_HideError: function(oEl){
		oCheckform._RemoveClass(oEl, 'oEl-error');
		oCheckform._RemoveClass(oEl, 'oEl-noerror');
		
		var row = oCheckform._getParent(oEl);
		oCheckform._RemoveClass(row, 'row-noerror');
		oCheckform._RemoveClass(row, 'row-error');
	},		
	_ShowAlt: function(oEl){		
		var alt = oEl.getAttribute('alt');
		if( alt && alt!=''){
			var altern_div 	= document.createElement('DIV');		
			altern_div.className = 'alt';
			altern_div.id = 'alt_'+oEl.name;
			altern_div.style.left = (getElementLeft(oEl)+oEl.offsetWidth-18)+'px';
			altern_div.style.top = (getElementTop(oEl)+oEl.offsetHeight-6)+'px';
			
			altern 		= document.createElement('SPAN');		
			altern.innerHTML = alt;
			
			altern_div.appendChild(altern);
			document.body.appendChild(altern_div);
			oCheckform._AddClass(oEl, 'oEl-info');
		}
	},	
	_HideAlt: function(oEl){
		var alt = oEl.getAttribute('alt');
		var altern_div = document.getElementById('alt_'+oEl.name);
		if(alt && alt!='' && altern_div){
			document.body.removeChild(altern_div);
			oCheckform._RemoveClass(oEl, 'oEl-info');			
		}
	},	
	_AddClass: function(oEl, newclass){		
		var sNewclass = '';		
		
		var sClass  = (oEl.className)?oEl.className:'';
		var aClass  = sClass.split(' ');
		var iNum	= aClass.length;		
		for(a=0; a< iNum; a++){
			if(aClass[a] == newclass){
				sNewclass = 'exist';
			}
		}
		
		if(sNewclass != 'exist'){					
			if (oEl.className) {
				oEl.className += ' '+newclass;
			}else{
				oEl.className = newclass;
			}
		}
	},	
	_RemoveClass: function(oEl, oldclass){
		var sClass  = (oEl.className)?oEl.className:'';
		var aClass  = sClass.split(' ');
		var iNum	= aClass.length;
		var sNewclass = '';
		for(a=0; a< iNum; a++){
			if(aClass[a]!= '' && aClass[a]!=oldclass){	
				if(sNewclass == ''){
					sNewclass = aClass[a];
				}else{
					sNewclass += ' '+aClass[a];
				}
			}
		}
		oEl.className = sNewclass;
	},	
	_getParent: function(oEl){
		var parent = oEl.parentNode;
		if(!parent || parent == null){
			return false;	
		}else{
			var patt = new RegExp("row");
			if(patt.test(parent.className)==true){						
				return parent;
			}else{
				return oCheckform._getParent(parent);
			}
		}
	},
	_doRequired: function(idoEl, id){
		var div = document.getElementById(id);		
		var oEl = document.getElementById(idoEl);		
		var arr  	= new Array();
		var tags 	= ["input", "textarea", "select"];
		for (var ti in tags) {
			var tag = tags[ti];		
			var arr = div.getElementsByTagName(tag);
			for(dor=0; dor<arr.length; dor++){							
				if(oEl == 'on' || oEl.checked == true){		
					oCheckform._AddClass(arr[dor],'required');
				}else{
					oCheckform._RemoveClass(arr[dor],'required');
				}				
			}
		}	
		oCheckform._Load();		
	},	
	
	/* ****************** */
	/* FONCTIONS DE TESTS */
	/* ****************** */
	_IsanEmail: function(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;
	},
	_IsaNumber: function(str){
		var filter = /^([0-9_\.\-])+$/;
		if (filter.test(str)) return true; else false;
	},
	_IsaPhone: function(str){
		var filter = /^([0-9_\.\-\+\\\/ ])+$/;
		if (filter.test(str)) return true; else false;
	},
	_IsaDate: function(str){
		var filter = /^(0|1|2)?[0-9]{1}([\/\-]{1})((0|1)?(0|1|2)([\/\-]{1})([0-9]{4}))+$/;
		if (filter.test(str)) return true; else false;
	},
	_IsaUrl: function(str){
		var filter = /(((ftp|http|https):\/\/)|www)(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
		if (filter.test(str)) return true; else false;
	},
	_IsanImg: function(str){
		var aExt = str.split('.');
		var sExt = aExt[aExt.length-1];
		var aOk  = ["gif", "jpg", "png", "jpeg"];
		var ret  = 0;
		for (var exs in aOk) {
			if(aOk[exs] == sExt.toLowerCase()){
				return true;
			}
		}	
		return false;
	},
	_IsanCsv: function(str){
		var aExt = str.split('.');
		var sExt = aExt[aExt.length-1];
		var aOk  = ["csv", "xsl", "xslx"];
		var ret  = 0;
		for (var exs in aOk) {
			if(aOk[exs] == sExt.toLowerCase()){
				return true;
			}
		}	
		return false;
	},
	_IsanTxt: function(str){
		var aExt = str.split('.');
		var sExt = aExt[aExt.length-1];
		var aOk  = ["txt", "doc", "docx", "pdf"];
		var ret  = 0;
		for (var exs in aOk) {
			if(aOk[exs] == sExt.toLowerCase()){
				return true;
			}
		}	
		return false;
	}
}

// LOAD LE CHECKFORM
if(oCheckform._Test(document.getElementById, document.createElement, document.createTextNode)){	
	if (window.addEventListener) {
      	window.addEventListener("load", oCheckform._Preload, false);
    } else if (document.addEventListener) {
      	document.addEventListener("load", oCheckform._Preload, false);
    } else if (window.attachEvent) {
      	window.attachEvent("onload", oCheckform._Preload);
    }
}

// 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;
}
function getElementsByClassName(node, classname){
	var a = [];
	var re = new RegExp('\\b' + classname + '\\b');
	var els = node.getElementsByTagName("*");
	for(var i=0,j=els.length; i<j; i++)
	 if(re.test(els[i].className))a.push(els[i]);
	return a;
}
