/**
 * @author Yann Ponzoni
 * @author Estelle 
 */


function validateForm(sFormId) {

	var bIsValid = true;
	$('#'+sFormId+' .required').each(function(){ 
		
		// Initialisations
		var sTargetId	= $(this).attr('for');

		// Verifications
		if (sTargetId == '') {
			console.warn('validateForm('+sFormId+') - Attribut "for" introuvable sur un label possedant une classe "required" : Vérification du champ ignorée.');
			return;
		}

		// Récupération du node contenant la valeur
		var oNode 	= $('#'+sTargetId);
		var sBalise	= oNode.get(0).nodeName;
		var sId		= oNode.attr('id');
		

		// Nodes non vérifiés (uploadify)
		if (sBalise == 'INPUT' && oNode.attr('type') == 'file')
			return;
		
		// Verification des dates
		if (sBalise == 'INPUT' && oNode.hasClass('_date')) {
			bIsValid = isDate(sId) && bIsValid;
			return;
		}
		
		// Vérification des combobox
		if (sBalise == 'SELECT') {
			bIsValid = combo(sId) && bIsValid;
			return;
		}

		// Radios
		if (sBalise == 'INPUT' && oNode.attr('type') == 'radio')
			bIsValid = chkRadio(sTargetId) && bIsValid;
		
		// Vérification par défaut : Le champ ne doit pas être vide
		bIsValid = exists(sId) && bIsValid;
	});
	
	return bIsValid;
}


function myError(id) {
	
	// Si firefox
	if ($.browser.mozilla || $.browser.msie){		
	
		$('#'+id).css('background-color','#e13333');		
		$('#'+id).one('click', function(){
			$('#'+id).css('background-color','#FFFFFF');
		});
	}
	// Sinon
	else {
		
		$('#'+id).animate({'backgroundColor':'#e13333'},700);		
		$('#'+id).one('click', function(){
			$('#'+id).animate({'backgroundColor':'#FFFFFF'},300);
		});
	}
}


/**
 * Verifie que le contenu ne soit égal à une chaine vide
 * @param id
 * @return vrai si il existe
 */
function exists(id) {
	
	// Initialisations
	var oNode 	= $('#'+id);			// Récupération du node
	var bExist	= oNode.val() != '';	// Test : Le node est il vide (chaine vide)
	
	// Si besoin, on affiche l'erreur
	if (!bExist) 
		myError(id);
	
	return bExist;
}


function replaceAll(str, search, repl) {
	while (str.indexOf(search) != -1)
		str = str.replace(search, repl);
	return str;
}


function replaceAccentToNoAccent(str) {
	 var norm = new Array('À','Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë',
	'Ì','Í','Î','Ï', 'Ð','Ñ','Ò','Ó','Ô','Õ','Ö','Ø','Ù','Ú','Û','Ü','Ý',
	'Þ','ß', 'à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î',
	'ï','ð','ñ', 'ò','ó','ô','õ','ö','ø','ù','ú','û','ü','ý','ý','þ','ÿ');
	
	 var spec = new Array('A','A','A','A','A','A','A','C','E','E','E','E',
	'I','I','I','I', 'D','N','O','O','O','0','O','O','U','U','U','U','Y',
	'b','s', 'a','a','a','a','a','a','a','c','e','e','e','e','i','i','i',
	'i','d','n', 'o','o','o','o','o','o','u','u','u','u','y','y','b','y');
	 
	for (var i = 0; i < spec.length; i++){		
		str = replaceAll(str, norm[i], spec[i]);
	}
	return str;
}


/**
 * Vérifie que le contenu ne soit pas vide (égal a zero ou chaine vide)
 * @param id
 * @return vrai si vide
 *
function empty(id) {

	// Initialisations
	var oNode 	= $('#'+id);		// Récupération du node
	var bExist	= exists(id);		// Test : La valeur du node est elle vide (chaine vide)
	var bZero	= oNode.val() == 0;	// Test : La valeur du node est elle égale à zero
	var bEmpty	= bExist && !bZero;	// Si la valeur existe et différente de zero

	// Si besoin, on affiche l'erreur
	if (!bEmpty) 
		myError(id);
	
	return !bEmpty;
}

/**
 * Vérifie que la valeur est un nombre
 * @param id
 * @return vrai si la valeur est un nombre
 */
function isNum(id) {

	// Initialisations
	var oNode 	= $('#'+id);			// Récupération du node
	var bExist	= exists(id);			// Test : La valeur du node est elle vide (chaine vide)
	var bIsNum	= !isNaN(oNode.val());	// Test : La valeur est elle pas un "pas nombre"
	var bOk		= bExist && bIsNum;

	// Si besoin, on affiche l'erreur
	if (!bOk) 
		myError(id);
	
	return bOk;
}

/**
 * Vérifie si la valeur est bien au format date
 * @param id
 * @return vrai si la valeur est au format date
 * @todo Cette fonction n'est pas encore finalisée
 */
function isDate(id) {
	
	return exists(id);
}


function isHHMM(sHour) {	

	var hour = new RegExp("^[0-2][0-9]:[0-5][0-9]$");
	
	if(!hour.test(sHour))
		return false;
	
	return true;
	
}



/**
 * Vérifie si la valeur est bien une url 
 * @param string
 * @return vrai si la valeur est au format url
 */
function isUrl(sUrl) {
	
	var url = new RegExp("^([a-zA-Z0-9\-]+[.])+[a-zA-Z0-9\-]+(/.*)?$");

	if(!url.test(sUrl))
		return false;
	
	return true;
}

/**
 * Vérifie si la valeur est bien un mail 
 * @param string
 * @return vrai si la valeur est au format mail
 */
function isMail(sMail) {
	
	var mail = new RegExp("^([a-zA-Z0-9\-\.\_\+]+[@])([a-zA-Z0-9\-])+([.][a-zA-Z0-9\-]+)+?$");
	
	
	if(!mail.test(sMail))
		return false;
	
	return true;
}

/**
 * Vérifie si la valeur est bien alphanumérique
 * @param string
 * @return vrai si la valeur est alphanumérique
 */
function isAlphaNum(sVal) {
	
	sVal = replaceAccentToNoAccent(sVal);
	
	var alpha_num = new RegExp("^[a-zA-Z0-9]*$");
	
	if(!alpha_num.test(sVal))
		return false;
	
	return true;
}


/**
 * Vérifie si la valeur est bien un champ alphabétique
 * @param string
 * @return vrai si la valeur est alphabétique
 */
function isAlpha(sVal) {
	
	sVal = replaceAccentToNoAccent(sVal);
	
	var alpha = new RegExp("^[a-zA-Z]*$");
	
	if(!alpha.test(sVal))
		return false;
	
	return true;
}

/**
 * Vérifie si la valeur est bien un champ alphabétique avec éventuellement tiret et espace
 * @param string
 * @return vrai si la valeur est alphabétique
 */
function isAlphaEtendu(sVal) {
	
	sVal = replaceAccentToNoAccent(sVal);
	
	var alpha = new RegExp("^[a-zA-Z- ]*$");
	
	if(!alpha.test(sVal))
		return false;
	
	return true;
}

function isAlphaNumEtendu(sVal) {
	
	sVal = replaceAccentToNoAccent(sVal);
	
	var alpha_num = new RegExp("^[a-zA-Z0-9- ]*$");
	
	if(!alpha_num.test(sVal))
		return false;
	
	return true;
}

/**
 * Vérifie si la valeur est bien un champ numérique
 * @param string
 * @return vrai si la valeur est numérique
 */
function isNumeric(sVal){
	
	var num = new RegExp("^[0-9]*$");
	
	if(!num.test(sVal))
		return false;
	
	return true;
}

/**
 * Vérifie si la valeur est bien un numéro de téléphone "français"
 * @param string
 * @return vrai si la valeur est un numéro de téléphone "français"
 */
function isTelFr(sVal) {
	
	var caracteres_non_desires = new RegExp("[^0-9]", "g");  //Tout sauf chiffre
	var sVal = sVal.replace(caracteres_non_desires,'');
	
	var tel_fr = new RegExp("^[0-9]{2,}$");	
	
	if(!tel_fr.test(sVal))
		return false;
	
	if(sVal.length > 10)
		return false;

	return true;
}


/**
 * Vérifie si la valeur est bien un numéro de téléphone internationnal
 * @param string
 * @return vrai si la valeur est un numéro de téléphone internationnal
 */
function isTelInter(sVal) {
	
	var tel_inter = new RegExp("[0-9\+\(\)]");	
	
	if(!tel_inter.test(sVal))
		return false;
	
	return true;
	
}


/**
 * Vérifie si la valeur est bien un champ au format numéro SIREN
 * @param string
 * @return vrai si la valeur au format numéro SIREN
 */
function isSIREN(sVal) {
	
	var alpha = new RegExp("^[0-9]{9,}$");
	
	if(!alpha.test(sVal))
		return false;
	
	return true;
}



/**
 * Vérifie si la combobox contient un choix valide
 * @param id
 * @return Vrai si la cbx a une valeur différente de zero et qu'elle contient des éléments
 */
function combo(id) {

	// Initialisations
	var oNode 		= $('#'+id);					// Récupération du node
	var bZero		= oNode.val() == 0;				// Test : La valeur du node est elle égale à zero
	var bHaveChild	= oNode.children().size() != 1;	// Test : La combobox contient elle des éléments ?
	var bNOk		= bZero && bHaveChild;			// Si la valeur est a zéro et que la cbx contient des éléments

	// Si besoin, on affiche l'erreur
	if (bNOk)
		myError(id);
	
	return !bNOk;
}

function chkRadio(name) {
	
	return ($('input[name='+name+']:checked').length == 1);
}


