/*************************************************************************************************************************************
|																									|
|	 HTML Form fields validation functions																		|
|	Source : http://actuel.fr.selfhtml.org/articles/javascript/controle_formulaire/index.ht										|
|																									|
|	How to use :																							|
|																									|
|	- Create an object (e.g. "var myFormValidator = new FormValidator();")													|
|	- Add check to the checklist (e.g. "myFormValidator.addCheck("myelementid", "email", "you have to enter a valide e-mail adress");)				|
|	- Then validate your form (e.g. on the onSubmit event: "return (myFormValidator.validate());")										|
|																									|
|	METHOD PARAMETERS :																				|
|																									|
|		- 	CONSTRUCTOR :																				|
|			FormValidator (aryCheckList, sErrorMessage)															|	
|																									|
|			aryCheckList :	 	optional Check list array.														|
|			sErrorMessage :		optional Error message.															|	
|																									|
|		- 	ADDCHECK :																				|
|			addCheck(elementid, mask, errormessage, defaultvalue, regexvalue)												|
|																									|
|			elementid :	 			Id of Element to check.														|	
|			mask :				check mask. can be :														|
|																									|
|								"empty" :		check for empty value.											|
|								"default" :		check a default value.											|
|								"email" :		check for email format.											|
|								"numeric" :		check for numeric value (like this : 5187.521 or 5187,521 or 5187).				|
|								"round" :		check for round numeric value (only 5187).								|
|								"regex" :		check for custom regex (requierd extra-parameter).						|
|								"price" :		check for price format (like this: 5187.52 or 5187,52) and update if cents part not set	|
|								"capitalize" :	check for Name value and update.									|
|								"spam" :		check if '@' set.												|
|								"clean" :		check for default value and replace.									|
|																									|
|			errormessage :			error message for this case.													|
|			extraparam, extraparam2 :	extra parameters, can be :													|
|																									|	
|									for extraparameter :													|																								
|									defaultvalue :		default value for 'default' and 'clean' mask.					|
|									regexvalue :		custom regex value for 'regex' mask.						|
|																									|
|									forextraparameter2 :													|
|									replacevalue		replace value for 'clean' mask								|
|																									|
**************************************************************************************************************************************/
																									
// Form Validator object constructor
function FormValidator (aryCheckList, sErrorMessage)
{
	// public member property "checkList" (Array)
	if (aryCheckList)
		this.checkList = aryCheckList;
	else
		this.checkList = new Array();

	// public member property "errorMessage" (String)
	if (sErrorMessage)
		this.errorMessage = sErrorMessage;
	else
		this.errorMessage = "Certains champs du formulaire sont manquants ou incorrectement formatés :";
	
	// public member function "addCheck"
	this.addCheck = function(elementid, mask, errormessage, extraparam, extraparam2) { FormValidator_addCheck(this, elementid, mask, errormessage, extraparam, extraparam2); };	

	// public member function "validate"
	this.validate = function() { return(FormValidator_validate(this.checkList, this.errorMessage)); };
}

// Form Validator object addCheck function
function FormValidator_addCheck(object, elementid, mask, errormessage, extraparam, extraparam2)
{
	var myCheck = new Array();
	myCheck["elementid"]	= elementid;
	myCheck["mask"] 		= mask;
	myCheck["errormessage"] = errormessage;
	myCheck["extraparam"] 	= extraparam;
	myCheck["extraparam2"] 	= extraparam2;	
	object.checkList.push(myCheck);
}

// Form Validator objec validate function
function FormValidator_validate(aryFields, sCustomErrorMessage) 
{
	// Create error message(s) array
	var aryErrorMessage = new Array();
	if (sCustomErrorMessage)
		aryErrorMessage.push(sCustomErrorMessage + "\n");
	else
		aryErrorMessage.push("Les erreurs suivantes sont survenues :\n");
	
	var bError = false;

	// For each fields...
	for (var i = 0 ; i < aryFields.length ; i++)
	{
		currentField = aryFields[i];
		currentElement = document.getElementById(currentField["elementid"]);

		/* Check for empty fields (mask: "empty") */
		if (currentField["mask"].indexOf("empty") != -1)
		{
			if (currentElement.value == "")
			{
				bError = true;
				aryErrorMessage.push(currentField["errormessage"]);
			}
		}

		/* Check for default value (mask: "default") */
		else if (currentField["mask"].indexOf("default") != -1)
		{
			if (currentElement.value)
			{
				if (currentElement.value == currentField["extraparam"])
				{
					bError = true;
					aryErrorMessage.push(currentField["errormessage"]);
				}
			}
		}

		/* Check for email format (mask: "email") */
		else if (currentField["mask"].indexOf("email") != -1) 
		{
			if (currentElement.value)
			{
				var sUser = "([a-zA-Z0-9][a-zA-Z0-9_.-]*|\"([^\\\\\x80-\xff\015\012\"]|\\\\[^\x80-\xff])+\")";
				var sDomain = "([a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,5}";
				var regex = "^" + sUser + "\@" + sDomain + "$";
				var myrxp = new RegExp(regex);
				if (!myrxp.test(currentElement.value)) 
				{
					bError = true;
					aryErrorMessage.push(currentField["errormessage"]);
				}
			}
		}

		/* Check for numeric value (mask: "numeric") (float) */
		else if (currentField["mask"].indexOf("numeric") != -1) 
		{
			var bNumError = false;
			if (currentElement.value)
			{
				var myvalue = currentElement.value;
				var num = myvalue.match(/[^0-9,\.]/gi);
				var dot = myvalue.match(/\./g);
				var com = myvalue.match(/,/g);
				if (num != null) 
				{
					bNumError = true;
				}
				else if ((dot != null) && (dot.length > 1)) 
				{
					bNumError = true;
				}
				else if ((com != null) && (com.length > 1))
				{
					bNumError = true;
				}
				else if ((com != null) && (dot!=null))
				{
					bNumError = true;
				}
			}
			if (bNumError == true) 
			{
				bError = true;
				aryErrorMessage.push(currentField["errormessage"]);
			}
		}

		/* Check for round numeric value (mask: "round") */ /* TO OPTIMIZE */
		else if (currentField["mask"].indexOf("round") != -1) 
		{
			var bNumError = false;
			if (currentElement.value)
			{
				var myvalue = currentElement.value;
				var num = myvalue.match(/[^0-9,\.]/gi);
				var dot = myvalue.match(/\./g);
				var com = myvalue.match(/,/g);
				if (num != null) 
				{
					bNumError = true;
				}
				else if (dot != null)
				{
					bNumError = true;
				}
			}
			if (bNumError == true)
			{
				bError = true;
				aryErrorMessage.push(currentField["errormessage"]);
			}
		}

		/* Check with defined regex (mask: "regex")  */
		else if (currentField["mask"].indexOf("regex") != -1) 
		{
			var regexp = currentField["extraparam"];
			if (currentElement.value)
			{
				if (!regexp.test(currentElement.value))
				{
					bError = true;
					aryErrorMessage.push(currentField["errormessage"]);
				}
			}
		}

		/* Check for price format and update if necessary (mask: "price") */
		else if (currentField["mask"].indexOf("price") != -1)
		{
			var myvalue = currentElement.value;
			var reg = /,-{1,}|\.-{1,}/;
			var nantest_value = myvalue.replace(reg, "");
			var num = nantest_value.match(/[^0-9,\.]/gi);
			sep = myarray[i][1].substr(1,1) ? myarray[i][1].substr(1,1) : ',';
			if (currentElement.value)
			{
				var myvalue = currentElement.value.replace(/\./,',');
				if (myvalue.indexOf(',')==-1) 
				{
					currentElement.value = myvalue + sep + '00';
				}
				else if (myvalue.indexOf(",--")>-1)
				{
					currentElement.value = myvalue.replace(/,--/, sep+'00');
				}
				else if (myvalue.indexOf(",-")>-1) 
				{
					currentElement.value = myvalue.replace(/,-/, sep+'00');
				}
				else if (!myvalue.substring(myvalue.indexOf(',') + 2)) 
				{
					bError=true;
					aryErrorMessage.push(currentField["errormessage"]);
				}
				else if (myvalue.substring(myvalue.indexOf(',') + 3)!='') 
				{
					bError=true;
					aryErrorMessage.push(currentField["errormessage"]);
				}
				else if (num!=null) 
				{
					bError=true;
					aryErrorMessage.push(currentField["errormessage"]);
				}
			}
		}

		/* Check for Name fields and update if necessary (mask: "capitalize") */
		else if (currentField["mask"].indexOf("capitalize") != -1)
		{
			var noble = new Array(" d\'", "de","von","van","der","d","la","da","of");
			var newvalue='';
			var myvalue = currentElement.value.split(/\b/);
			for (k = 0 ; k < myvalue.length ; k++)
			{
				newvalue += myvalue[k].substr(0,1).toUpperCase() + myvalue[k].substring(1);
			}
			for (k = 0 ; k < noble.length ; k++)
			{
				var reg = new RegExp ("\\b" + noble[k] + "\\b", "gi");
				newvalue = newvalue.replace(reg, noble[k]);
			}
			currentElement.value = newvalue;
		}

		/* Check for spam (mask: "spam") */
		else if (currentField["mask"].indexOf("spam") != -1)	
		{
			var myvalue = currentElement.value;
			if (myvalue.indexOf("@") != -1)
			{
				bError=true;
				aryErrorMessage.push(currentField["errormessage"]);
			}
		}

		/* Check default value and replace (mask: "clean") */
		else if (currentField["mask"].indexOf("clean") != -1)	
		{
			var myvalue = currentElement.value;
			if (trim(myvalue) == "" || myvalue == currentField["extraparam"])
			{
				currentElement.value = currentField["extraparam2"];
			}
		}
		
		/* Check value length (mask: "length") */
		else if (currentField["mask"].indexOf("length") != -1)	
		{
			var myvalue = currentElement.value;
			if (myvalue.length > currentField["extraparam"])
			{
				bError=true;
				aryErrorMessage.push(currentField["errormessage"]);
			}
		}
	}

	/* if errors, display alert and return false else send return true */
	if (bError) 
	{
		aryErrorMessage = aryErrorMessage.join('\n\xB7 ');
		alert(aryErrorMessage);
		return false;
	}
	else 
	{
		return true;
	}
}