/**
 * Field validators - field validators designed for allianz project
 *
 * Utilities to validate some users controls
 *
 *
 * @version		1.0
 *
 * @author		Eutech SSII 
 */

/**
* checkPattern : function called by each validator
*
* @parameters element : DOM element to be valitaded
* @pattern : regexp pattern to be validated
*/
checkPattern = function(element, pattern) {
	return pattern.test($(element).value);
};

/**
* isNumericField : validate whole numeric value
*
* @parameters element : DOM element to be valitaded
* @size : length of a valid numeric value (-1 means unlimited size)
* @displayError : bool, display or not an error message
*/
isNumericField = function(element, size, displayError) {
	var repLength;
	if (size == -1) {
		repLength = "+";
	} else {
		repLength = "{"+size+"}";
	}
	var test = checkPattern(element,new RegExp("^\\d"+repLength+"$"));
	if (!test && displayError) {
		var errorMessage = "Veuillez saisir un nombre ";
		if (size > 0) {
			errorMessage += "("+size+" chiffre(s))";
		}
		displayValidatorError(element,errorMessage)
	} else if (test) {
		clearElementErrors(element);
		/*
		if ($("validationErrorMessageSpan_"+element)) {
			$("validationErrorMessageSpan_"+element).remove();	
		}*/
	}
	return test;
}

/**
* isTextField : validate whole alphabetic value
*
* @parameters element : DOM element to be valitaded
* @size : length of a valid alphabetic value (-1 means unlimited size)
* @displayError : bool, display or not an error message
* @errorDivID : string identifying the div where to put the message
*/
isTextField = function(element, size, displayError, errorDivID) {
	var repLength;
	if (size == -1) {
		repLength = "+";
	} else {
		repLength = "{"+size+"}";
	}
	test = checkPattern(element, new RegExp("^[A-Za-z]"+repLength+"$"));
	
	if (!test && displayError) {
		var errorMessage = "Veuillez saisir uniquement du texte ";
		if (size > 0) {
			errorMessage += "("+size+" lettre(s))";
		}
		displayValidatorError(element, errorMessage, errorDivID);
	} else if ((test)) { // && ($("validationErrorMessageSpan_"+element))) {
		clearElementErrors(element);
		//$("validationErrorMessageSpan_"+element).remove();	
	}
	
	return test;
}

/**
* isTextField : validate whole alphabetic value with spaces
*
* @parameters element : DOM element to be valitaded
* @size : length of a valid alphabetic value (-1 means unlimited size)
* @displayError : bool, display or not an error message
* @errorDivID : string identifying the div where to put the message
*/ 
isTextFieldWithSpace = function(element, size, displayError, errorDivID) {
	var repLength = '';
	if (size == -1) {
		repLength = "+";
	} else {
		repLength = "{"+size+"}";
	}
	test = checkPattern(element, new RegExp("^[A-Za-z\\s\\-]"+repLength+"$"));
	
	if (!test && displayError) {
		var errorMessage = "Veuillez saisir uniquement du texte ";
		if (size > 0) {
			errorMessage += "("+size+" lettre(s))";
		}
		displayValidatorError(element,errorMessage, errorDivID);
	} else if ((test)) { // && ($("validationErrorMessageSpan_"+element))) {
		clearElementErrors(element);
		//$("validationErrorMessageSpan_"+element).remove();	
	}
	
	return test;
}

/**
* isTextField : validate whole alphabetic value with spaces
* @parameters element : DOM element to be valitaded
* @size : length of a valid alphabetic value (-1 means unlimited size)
* @displayError : bool, display or not an error message
* @errorDivID : string identifying the div where to put the message
*/ 
isTextFieldWithSpaceAndSpecialChar = function(element, size, displayError, errorDivID) {
	var repLength = '';
	if (size == -1) {
		repLength = "+";
	} else {
		repLength = "{"+size+"}";
	}
	test = checkPattern(element, new RegExp("^[A-Za-z\\u00C0-\\u00FD\\u0027\\s\\-]"+repLength+"$"));
	
	if (!test && displayError) {
		var errorMessage = "Veuillez saisir uniquement du texte ";
		if (size > 0) {
			errorMessage += "("+size+" lettre(s))";
		}
		displayValidatorError(element,errorMessage, errorDivID);
	} else if ((test) ) { //&& ($("validationErrorMessageSpan_"+element))) {
		clearElementErrors(element);
		//$("validationErrorMessageSpan_"+element).remove();	
	}
	
	return test;
}
/**
* isTextField : validate whole alphabetic value with spaces and numbers
* @parameters element : DOM element to be valitaded
* @size : length of a valid alphabetic value (-1 means unlimited size)
* @displayError : bool, display or not an error message
* @errorDivID : string identifying the div where to put the message
*/ 
isTextFieldWithSpaceAndSpecialCharAndNumbers = function(element, size, displayError, errorDivID) {
	var repLength = '';
	if (size == -1) {
		repLength = "+";
	} else {
		repLength = "{"+size+"}";
	}
	test = checkPattern(element, new RegExp("^[A-Za-z0-9\\u00C0-\\u00FD\\u0027\\s\\-]"+repLength+"$"));
	
	if (!test && displayError) {
		var errorMessage = "Veuillez saisir uniquement des caract\u00E8res alphab\u00E9tiques et/ou num\u00E9riques ";
		if (size > 0) {
			errorMessage += "("+size+" lettre(s))";
		}
		displayValidatorError(element,errorMessage, errorDivID);
	} else if ((test) ) { //&& ($("validationErrorMessageSpan_"+element))) {
		clearElementErrors(element);
		//$("validationErrorMessageSpan_"+element).remove();	
	}
	
	return test;
}


/**
* isAlphaNumericField : validate whole alphanumeric value
*
* @parameters element : DOM element to be valitaded
* @size : length of a valid alphanumeric value (-1 means unlimited size)
* @displayError : bool, display or not an error message
* @errorMessageDiv : string identifying the div where to put the message
*/
isAlphaNumericField = function( element, size, displayError, errorMessageDiv ) {
	var repLength;
	if (size == -1) {
		repLength = "+";
	} else {
		repLength = "{" + size + "}";
	}
	test = checkPattern(element, new RegExp("^[A-Za-z0-9]"+repLength+"$"));
	
	if (!test && displayError) {
		var errorMessage = "Veuillez saisir uniquement du texte et des chiffres ";
		if (size > 0) {
			errorMessage += "("+size+" caract&egrave;re(s))";
		}
		displayValidatorError(element,errorMessage,errorMessageDiv);
	} else if ((test)) { // && ($("validationErrorMessageSpan_"+element))) {
		clearElementErrors(element);
		//$("validationErrorMessageSpan_"+element).remove();	
	//} else if ((test) && ($(errorMessageDiv))) {
		//$(errorMessageDiv).remove();
	}
	
	return test;
}

/**
* isPostalCodeField : validate a french postal code
*
* @parameters element : DOM element to be valitaded
* @displayError : bool, display or not an error message
*/
isPostalCodeField = function(element, displayError) {
	var test = checkPattern(element, new RegExp("^(?:0[1-9]|[13-9][0-9]|2[0-9aAbB])\\d{3}$"));
	if ( element.value == "" ) {
		displayValidatorError(element,"Veuillez bien compl\u00E9ter le champ ci-dessus");
		return test;
	}
	else { 
		if (!test && displayError) {
			displayValidatorError(element,"Veuillez saisir un format de code postal correct (5 chiffres)");
		} else if (test) { // if ((test) && ($("validationErrorMessageSpan_"+element))) {
			clearElementErrors(element);
			//$("validationErrorMessageSpan_"+element).remove();	
		}
	}
	return test;
}


/**
* isPlateNumber: validate a french palte number
*
* @parameters element : DOM element to be valitaded
* @displayError : bool, display or not an error message
*/
isPlateNumber = function(element, displayError) {
	var test = true;
	
	test = checkPattern(element, new RegExp("^|^(([1-9][0-9]{0,2}\-?[a-z])|([1-9][0-9]{0,3}\-?[a-z]{2})|([1-9][0-9]{1,2}\-?[a-z]{3}))\-?(2(a|b)|[0-9]{2})|([a-z]{2}\-?[0-9]{3}\-?[a-z]{2})$",'i'));
	if (!test && displayError) {
		displayValidatorError(element,"Veuillez saisir un format de plaque d'immatriculation");
	} else if (test) { // if ((test) && ($("validationErrorMessageSpan_"+element))) {
		clearElementErrors(element);
		//$("validationErrorMessageSpan_"+element).remove();	
	}
	
	return test;
}

/**
* isNumberOfKmField: validate a french number of km
*
* @parameters element : DOM element to be validated
* @parameters displayError : boolean, display or not an error message
*/
function isNumberOfKmField(element, displayError){
	
	var value = $(element).value;
	var valid = true;
	
	valid = checkPattern(element, new RegExp("^|^[0-9]{1,3}|[0-9]{1,3}\.[0-9]{3}|[0-9]{1,3}\.[0-9]{3}\.[0-9]{3}|([0-9]*[^\.])$"));
	
	if(!valid && displayError){
		var errorMessage = 'Veuillez saisir un format de Kilom\u00E9trage correct: ex 20.000';
		displayValidatorError($(element),errorMessage);
	}else if ((valid)) { 
		clearElementErrors(element);
	}
	
	return valid;
}
	
	
/**
* isDateField : validate date value
*
* @parameters element : DOM element to be valitaded
* @longFormat : bool, validate long date format JJ/MM/AAAA or short one MM/AAAA
* @displayError : bool, display or not an error message
* @range : Object, contain the min and max range of the date
*/
isDateField = function(element, longFormat, displayError, range, message) {
	
	
	if ($(element).value.length == 0 || ( $(element).hasClass('hasDefaultText') && !$(element)._error )) {		
		return isNotBlankField($(element), displayError);
	}
	
	var test = false;
	var errorMessage = message || '';
	var test1;
	if (longFormat) {
		test1 = checkPattern(element, new RegExp("^\\d\\d[/]\\d\\d[/]\\d\\d\\d\\d$"));
	} else {
		test1 = checkPattern(element, new RegExp("^\\d\\d[/]\\d\\d\\d\\d$"));
	}
	if (test1) {
		var test2;
		if (longFormat) {
			var RegExPattern = /^((((0?[1-9]|[12]\d|3[01])[\/](0?[13578]|1[02])[\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|[12]\d|30)[\/](0?[13456789]|1[012])[\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|1\d|2[0-8])[\/]0?2[\/]((1[6-9]|[2-9]\d)?\d{2}))|(29[\/]0?2[\/]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00)))|(((0[1-9]|[12]\d|3[01])(0[13578]|1[02])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|[12]\d|30)(0[13456789]|1[012])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|1\d|2[0-8])02((1[6-9]|[2-9]\d)?\d{2}))|(2902((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00))))$/;
	    	test2 = $(element).value.test(RegExPattern);
		} else {
			test2 = checkPattern(element, new RegExp("^(?:0[1-9]|1[012])[/](?:19|20)\\d\\d$"));
		}
		
		var test3 = true;
		if (test2) {
			if (range) {
				var explodedDate = $(element).value.split("/");
				var inputDate;
			
				if (longFormat){ 
					inputDate = new Date(explodedDate[2], parseInt(explodedDate[1],10) -1 ,explodedDate[0]);
				} else {
					inputDate = new Date(explodedDate[1], parseInt(explodedDate[0],10) -1 ,1);
				}
			
				if (range.min) {
					if (inputDate < range.min) {
						test3 = false;
					}
				}
				
				if (range.max) {
					if (inputDate >= range.max) { 
						test3 = false;
					}
				}
				
			}
			
			if ((!range) || (test3 == true)) {
				test = true;
				clearElementErrors(element);
				//if ($("validationErrorMessageSpan_"+element)) $("validationErrorMessageSpan_"+element).remove();
			}	
		} 

		
		if (((!test2) || (!test3)) && (displayError)) {
			errorMessage = errorMessage.length != 0 ? errorMessage : "La date entr\u00E9e ne semble pas correcte";
			displayValidatorError(element,errorMessage);
		}
		
	} else  if (displayError){
		errorMessage = "Veuillez saisir un format de date correct : ";
		if (longFormat) {
			errorMessage += "JJ/MM/AAAA";
		} else {
			errorMessage += "MM/AAAA";
		}
		displayValidatorError(element,errorMessage);
	} 
	return test;
}

/**
* isBonusMalusField : validate bonus/malus insurance value
*
* @param element : DOM element id to be valitaded
* @param dsiplayError :bool, display or not an error message
* @param focusElement : DOM element which grab focus on 0.5 
* @param focusElementAlternative : DOM element which grab focus on other values than 0.5
*/
isBonusMalusField = function(element, displayError, focusElement, focusElementAlternative) 
{
	var val = isNaN(parseFloat( $(element).value.replace(',','.') ))?0:parseFloat( $(element).value.replace(',','.') );
	
	if (isNaN(parseFloat( $(element).value.replace(',','.') )) || ( $(element).hasClass('hasDefaultText') && !$(element)._error ) )
		return isNotBlankField(element, displayError);
	
	var test = false;
	if ((/^(?:\d+|\d+\.\d+)$/.test(val)) && (val <= 3.5) && (val >= 0.5)) {
		test = true;
	}
	if (!test && displayError) {
		displayValidatorError(element,"Le bonus/malus doit \u00EAtre compris entre 0,5 et 3,5");
	} else if (test) {
	
		// Valid only for main driver
		if ($(element+'_bonusMalusMessage')) {
			if (val == 0.5) {
				$(element+'_bonusMalusMessage').setStyle('display','block');
				if ($('mainBMYearsErrorMessages'))
					$('mainBMYearsErrorMessages').setStyle('display','block');
				if (focusElement && $(element).value.length == 4)
					$(focusElement).focus();
			} else {
				$(element+'_bonusMalusMessage').setStyle('display','none');
				if ($('mainBMYearsErrorMessages'))
					$('mainBMYearsErrorMessages').setStyle('display','none');
				if (focusElementAlternative && $(element).value.length == 4)
					$(focusElementAlternative).focus();
			}	
		}
	
		clearElementErrors(element);
	}
	
	return test;
}

/**
* isEmailField : validate an email address
*
* @parameters element : DOM element to be valitaded
* @displayError : bool, display or not an error message
*/
isEmailField = function(element, displayError) {
	var test = checkPattern(element, new RegExp("^.+@.+[.].+"));
	if (!test && displayError) {
		displayValidatorError(element,"Veuillez saisir un email correct");
	} else if ((test)) { // && ($("validationErrorMessageSpan_"+element))) {
		clearElementErrors(element);
		//$("validationErrorMessageSpan_"+element).remove();	
	}
	
	return test;
}

isNotBlankField = function(element, displayError, valueDefault) {
	
	var test = false;
	valueDefault=valueDefault?valueDefault:"";
	
	var value = $(element).value;
	if(((value.length > 0 && valueDefault!=value) || $(element).hasClass('hasDefaultText')))
		test = true;
	if (!test && displayError) {
		var errorMessage = "Veuillez bien compl\u00E9ter le champ ci-dessus";
		displayValidatorError(element,errorMessage);
	} else if (test) {
		clearElementErrors(element);
	}
	return test;
}

checkConfirmPassword = function( el_password, el_confirmPassword, displayError) {
	
	var password = $(el_password).value;
	var confirmPassword = $(el_confirmPassword).value;
	if( password != confirmPassword ){
		
		if (displayError) 
			displayValidatorError(el_confirmPassword,"Les mots de passe ne sont pas identiques.");
		return false;
		
	} else if ( /^.*\s$/.test(password) ){ // If passwords ends with space...
		if (displayError) 
			displayValidatorError(el_confirmPassword,"Les mots de passe ne peuvent pas se terminer avec un espace.");
		return false;
	} else if (/^.{0,4}$/.test(password)) {
		if (displayError)
			displayValidatorError(el_password, "Votre mot de passe doit \u00EAtre compris entre 5 et 9 caract\u00E8res.");
		return false
	} else { // if( $("validationErrorMessageSpan_"+el_confirmPassword) ){
		clearElementErrors(el_password);
		//$("validationErrorMessageSpan_"+el_confirmPassword).remove();
	}
	return true;
};

checkConfirmEmail = function( el_email, el_confirmEmail, displayError)
{
	var email = $(el_email).value;
	var confirmEmail = $(el_confirmEmail).value;
	if( email != confirmEmail ){
		
		if (displayError) 
			displayValidatorError(el_confirmEmail,"Les identifiant ne sont pas identiques.");
		return false;
		
	} else if ( /^.*\s$/.test(confirmEmail) ){ // If passwords ends with space...
		if (displayError) 
			displayValidatorError(el_confirmEmail,"Les identifiant ne peuvent pas se terminer avec un espace.");
		return false;
		
	} else { // if( $("validationErrorMessageSpan_"+el_confirmPassword) ){
		
		clearElementErrors(el_confirmEmail);
		//$("validationErrorMessageSpan_"+el_confirmPassword).remove();
	}
	return true;
}
	
/**
* emptyField: valid a required field
*
* @params: element: DOM element to be valitaded
*/
isEmptyField = function( element, displayError )
{
	if( $(element) ){
		if( $(element).value == '' ){
			if (displayError) displayValidatorError(element,"Ce champ est obligatoire.");
			return true;
		}
		else {//if( $("validationErrorMessageSpan_"+element) ){
			clearElementErrors(element);
			//$("validationErrorMessageSpan_"+element).remove();
		}
		return false;
	}
	return true;
}

isPhoneNumber = function( element, displayError, errorDiv) {
	var test = checkPattern(element, new RegExp("^0[1-58-9][0-9]{8}$"));  
	
	if (!test && displayError) {
		var errorMessage = "Veuillez saisir un format de num\u00E9ro de t\u00E9l\u00E9phone correct: ex 0987654321 ";
		displayValidatorError(element,errorMessage,errorDiv);
	} else if ((test) ) { //&& ($("validationErrorMessageSpan_"+element))) {
		clearElementErrors(element);
		//$("validationErrorMessageSpan_"+element).remove();	
	}
	
	return test;
}

isMobilePhoneNumber = function( element, displayError, errorDiv) {
	var test = checkPattern(element, new RegExp("^0[6-7][0-9]{8}$"));  
	
	if (!test && displayError) {
		var errorMessage = "Veuillez saisir un format de num\u00E9ro de t\u00E9l\u00E9phone correct: ex 0698765432 ";
		displayValidatorError(element,errorMessage,errorDiv);
	} else if ((test)) { //&& ($("validationErrorMessageSpan_"+element))) {
		clearElementErrors(element);
		//$("validationErrorMessageSpan_"+element).remove();	
	}
	
	return test; 
}


function clearElementErrors(element) {
	element = $(element);
	if (element._error && $(element._error) ) {
		element._error.addClass("hidden");
	}
}

/**
* displayValidateError
* called when an error message is shown
*/
displayValidatorError = function(element, errorMessage, errorMessageDivID) {
	
	element = $(element);
	errorMessage = errorMessage || "Veuillez bien compl\u00E9ter le champ ci-dessus";
	
	if (!element._error) {
		var _elementID = '';
		if (!window.firefox) {
			_elementId = element.name.replace( new RegExp( "\\.", "gi" ), '_').replace( new RegExp( "\\[", "gi" ), '_').replace( new RegExp( "\\]", "gi" ) , '');
			_elementId = _elementId.replace( new RegExp( "\\(", "gi" ), "_");
			_elementId = _elementId.replace( new RegExp( "\\)", "gi" ), "");
		} else {
			_elementId = element.name.replace( '.' , '_' , 'g' ).replace( '[' , '_' , 'g' ).replace( ']' , '' , 'g' );
			_elementId = _elementId.replace( "(" , "_" , "g" );
			_elementId = _elementId.replace( ")" , "" , "g" );
		}
		
		element._error =  $( 'error_' + _elementId );
	}

	
	element._error.empty();
	//BUG FIX ie6 ( mah!! )
	/*if (window.ie6)
		ie6_error_validation_bug_fix.delay( 1 , this ,[ element , errorMessage ]);
	else
		element._error.setHTML( errorMessage );
	*/
	element._error.appendText( errorMessage );
	//element._error.removeClass('hidden');
		
};

function ie6_error_validation_bug_fix(element, errorMessage){
	element._error.setHTML( errorMessage );
}
