
String.prototype.trim = function () {
	var	str = this.replace(/^\s\s*/, ''), ws = /\s/, i = str.length;
	while (ws.test(str.charAt(--i)));
	return str.slice(0, i + 1);
}




function JsChecker (oFormElement, oOptions) {

	var _oFormElement = (typeof (oFormElement) == 'object') ? oFormElement : document.getElementById (oFormElement);
	

	var _oOptions = {
		onError: (oOptions != null && typeof (oOptions.onError) == 'string') ? oOptions.onError : 'alert',
		onValid: (oOptions != null && typeof (oOptions.onValid) == 'string') ? oOptions.onValid : 'toString',
		parse: (oOptions != null && typeof (oOptions.parse) == 'boolean') ? oOptions.parse : 'false',
		focusOnError: true
	}
	

	var _oRules = new Array ();
	

	 var _oValidity = new Array ();
	

	_oFormElement.onsubmit = function () { return _onSubmit ()};


	var _addRule = function (eltName, oRule) {
		if (_oRules[eltName] == null) {
			_oFormElement.elements[eltName].onblur = function (oEvent) {_onBlur (oEvent)};
			_oRules[eltName] = new Array ();
		}
		
		_oRules[eltName].push ({
									rule: (oRule.rule != null) ? oRule.rule : '',
									value: (oRule.value != null) ? oRule.value : '',
									message: (oRule.message != null) ? oRule.message : ''});
		
		_oValidity[eltName] = false;
	}
	

	this.addRule = function (eltName, oRules) {
		if (typeof (_oFormElement.elements[eltName]) == 'object') {
			// If we have more than one rule
			if (oRules.length > 0) {
				var size = oRules.length;
				for (var i = 0; i < size; i++) {
					_addRule (eltName, oRules[i]);
				}
			}
			else
				_addRule (eltName, oRules);
			
			return true;
		}
		return false;
	}
	

	var _checkRules = function (eltName) {
		if (_oRules[eltName] != null) {
			var checkResult = true;
			for (var i=0; i < _oRules[eltName].length; i++) {
				if (typeof (_oRules[eltName][i].value) == 'string' && _oRules[eltName][i].value.substring (0, 1) == '=' && _oFormElement.elements[_oRules[eltName][i].value.substring (1)] != null)
					_oRules[eltName][i].value = _oFormElement.elements[_oRules[eltName][i].value.substring (1)].value;

				if (_oRules[eltName][i].rule == 'isRequired')
					checkResult = (_oFormElement.elements[eltName].value.trim () != '') ? true : false;
				else if (_oFormElement.elements[eltName].value.trim () != '') {
					switch (_oRules[eltName][i].rule) {
						case 'isEqual': // isEq
							checkResult = (_oFormElement.elements[eltName].value == _oRules[eltName][i].value) ? true : false;
							break;
						case 'isNotEqual': // isNeq
							checkResult = (_oFormElement.elements[eltName].value != _oRules[eltName][i].value) ? true : false;
							break;
						case 'maxLength': // maxLen, lt, lessThan, lowerThan
							if (typeof (_oFormElement.elements[eltName].value) == 'string')
								checkResult = (_oFormElement.elements[eltName].value.length <= _oRules[eltName][i].value) ? true : false;
							else
								checkResult = (_oFormElement.elements[eltName].value <= _oRules[eltName][i].value) ? true : false;
							break;
						case 'minLength': // minLen, gt, greaterThan
							if (typeof (_oFormElement.elements[eltName].value) == 'string')
								checkResult = (_oFormElement.elements[eltName].value.length >= _oRules[eltName][i].value) ? true : false;
							else
								checkResult = (_oFormElement.elements[eltName].value >= _oRules[eltName][i].value) ? true : false;
							break;
						case 'rangeLength': // rangeLen
							if (typeof (_oFormElement.elements[eltName].value) == 'string')
								checkResult = (_oFormElement.elements[eltName].value.length >= _oRules[eltName][i].value.min && _oFormElement.elements[eltName].value.length <= _oRules[eltName][i].value.max) ? true : false;
							else
								checkResult = (_oFormElement.elements[eltName].value >= _oRules[eltName][i].value.min && _oFormElement.elements[eltName].value <= _oRules[eltName][i].value.max) ? true : false;
							break;
						case 'regExp':
							var expReg = new RegExp (_oRules[eltName][i].value);
							checkResult = expReg.test (_oFormElement.elements[eltName].value);
							break;
						case 'regExp1':
							var expReg1 = new RegExp (_oRules[eltName][i].value);
							checkResult = expReg1.test (_oFormElement.elements[eltName].value);
							break;
						case 'regExp2':
							var expReg2 = new RegExp (_oRules[eltName][i].value);
							checkResult = expReg2.test (_oFormElement.elements[eltName].value);
							break;
						case 'isEmpty':
							checkResult = (_oFormElement.elements[eltName].value.trim () == '') ? true : false;
							break;
						case 'isAlphabetic': // isAlpha
							// Test if the value contain only a to z and A to Z chars
							checkResult = /^[a-zA-Z]+$/.test(_oFormElement.elements[eltName].value);
							break;
						case 'isAdresse': // isAlpha + ' + ,
							// Test if the value contain only a to z and A to Z chars ou ' ou ,
							checkResult = /^[-. ,'a-zA-Z0-9\u00E9\u00E9\u00E8\u00EB\u00EE\u00E7\u00E0\u00F9\u00F4\u00EA\u00E2\u00EF\u00FB]+$/.test(_oFormElement.elements[eltName].value);
							break;
						case 'isAdresse1': // isAlpha + ' + ,
							// Test if the value contain only a to z and A to Z chars ou ' ou ,
							checkResult = /^[-. ,'a-zA-Z0-9\u00E9\u00E8\u00EB\u00EE\u00E7\u00E0\u00F9\u00F4\u00EA\u00E2\u00EF\u00FB]+$/.test(_oFormElement.elements[eltName].value);
							break;
						case 'isCommune': // isCommune
							// Test if the value contain only a to z and A to Z chars ou - ou '
							checkResult = /^[- 'a-zA-Z\u00E9\u00E8\u00EB\u00EE\u00E7\u00E0\u00F9\u00F4\u00EA\u00E2\u00EF\u00FB]+$/.test(_oFormElement.elements[eltName].value);
							break;
						case 'isNumeric': // isNum
							// Test if the value contain only 0 to 9 chars
							checkResult = /^[0-9]+$/.test(_oFormElement.elements[eltName].value);
							break;
						case 'isAlphaNumeric': // isAlphaNumeric
							// Test if the value contain only a to z, A to Z and 0 to 9 chars
							checkResult = /^[-. a-zA-Z0-9]+$/.test(_oFormElement.elements[eltName].value);
							break;
						case 'isAlphaNumeric1': // isAlphaNumeric1
							// Test if the value contain only a to z, A to Z and 0 to 9 chars
							checkResult = /^[-. a-zA-Z0-9]+$/.test(_oFormElement.elements[eltName].value);
							break;
						case 'isAlphaNumeric2': // isAlphaNumeric2
							// Test if the value contain only a to z, A to Z and 0 to 9 chars
							checkResult = /^[-. a-zA-Z0-9]+$/.test(_oFormElement.elements[eltName].value);
							break;
						case 'isPostal':
							// Test if the value contain only five numbers
							checkResult = /^([- 0-9])+$/.test (_oFormElement.elements[eltName].value);
							break;
						case 'isEmail':
							// Test if the value contain a to z, A to Z, _, -, ., +, {, } followed by an @ and by a to z, A to Z, ., - and followed by a . and a to z, A to Z on 2 to 4 chars
							checkResult = (/^[a-zA-Z0-9_}{+\-_]+(\.[a-zA-Z0-9_}{+\-_]+)*@[a-zA-Z0-9\-\.]*[a-zA-Z0-9](\.[a-zA-Z0-9\.\-]*[a-zA-Z0-9\.])*[\.][a-zA-Z]{2,4}$/.test (_oFormElement.elements[eltName].value));
							break;
						case 'isIpv4':
							// Test if the number is between 0 and 1 for the first, if yes, test if the two seconds are between 0 and 9. If the number is not between 0 and 1, test if the number is 2, if yes, test if the second number is between 0 and 4 and the third between 0 and 9 OR the second number equals 5 and the third between 0 and 5, and repeat it fourth times
							checkResult = /^((([0-1]{1}[0-9]{0,2})|([2]{1}(([0-4]{1}[0-9]{1})|([5]{1}[0-5]{1}))))\.(([0-1]{1}[0-9]{0,2})|([2]{1}(([0-4]{1}[0-9]{1})|([5]{1}[0-5]{1}))))\.(([0-1]{1}[0-9]{0,2})|([2]{1}(([0-4]{1}[0-9]{1})|([5]{1}[0-5]{1}))))\.(([0-1]{1}[0-9]{0,2})|([2]{1}(([0-4]{1}[0-9]{1})|([5]{1}[0-5]{1})))))$/.test (_oFormElement.elements[eltName].value);
							break;
						case 'isUrl':
							// Test if the value start with ftp, ftps, http, https, mailto, followed by ://, a to z, A to Z, 0 to 9, :, .
							checkResult = (/^(((ht|f)tp(s?)|(mailto))\:\/\/)([0-9a-zA-Z\-]+\.)+[a-zA-Z]+(\:[0-9]+)?(\/\S*)?$/gi.test(_oFormElement.elements[eltName].value.toLowerCase()));
							break;
						case 'isHexadecimal': // isHexa
							// Test if the value has 0 to 9 and a to f or A to F
							checkResult = /^[a-fA-F0-9]+$/.test (_oFormElement.elements[eltName].value);
							break;
						case 'isPhone':
							// Test if the value is a number and contain eventually (), +, -, .
							checkResult = /^[\d\s ().+-]+$/.test (_oFormElement.elements[eltName].value);
							break;
						case 'isFax':
							// Test if the value is a number and contain eventually (), +, -, .
							checkResult = /^[\d\s ().+-]+$/.test (_oFormElement.elements[eltName].value);
							break;
						case 'isDate':
							// Test if the value is date between 0 and 31 / 0 and 12 / 0 and 9999
							checkResult = /^((0[1-9]{1})|([1-2]{1}[0-9]{1})|([3]{1}[0-1]{1}))[\/]((0[1-9]{1})|([1]{1}[0-2]{1}))[\/]([0-9]{4})$/.test (_oFormElement.elements[eltName].value);
							break;
							case 'isDate1':
							// Test if the value is date between 0 and 31 / 0 and 12 / 0 and 9999
							checkResult = /^((0[1-9]{1})|([1-2]{1}[0-9]{1})|([3]{1}[0-1]{1}))[\/]((0[1-9]{1})|([1]{1}[0-2]{1}))[\/]([0-9]{4})$/.test (_oFormElement.elements[eltName].value);
							break;
						case 'isTime':
							// Test if the value is between 0 and 24 : 0 and 59 : 0 and 59
							checkResult = /^(((0[0-9]{0,1})|([1]{1}[0-9]{1})|([2]{1}[0-3]{1}))[:]((0[0-9]{1})|([1-5]{1}[0-9]{1}))[:]((0[0-9]{1})|([1-5]{1}[0-9]{1}))([ ]?(((am)?)|((pm)?))))$/.test (_oFormElement.elements[eltName].value);
							break;
					}
				}
				
				if (!checkResult) {
					window[_oOptions.onError] (_oRules[eltName][i].message, {element: eltName, rule: _oRules[eltName][i].rule, value: _oRules[eltName][i].value});
					return false;
				}
				
				_oValidity[eltName] = true;
				window[_oOptions.onValid] (_oRules[eltName][i].message, {element: eltName, rule: _oRules[eltName][i].rule, value: _oRules[eltName][i].value});
			}
			return true;
		}
		return true;
	}
	

	 
	var _onSubmit = function ()
	{
		
		for (elementName in _oValidity)
		{

			if (!_oValidity[elementName])
			{
				 
				if (!_checkRules (elementName)) { return false; }
				else { return true; }
			}
				if (!_checkRules (elementName)) { return false; }
				
		}
return true;
		
	}
	

	var _onBlur = function (oEvent) {
		if (window.event)
			var target = window.event.srcElement;
		else if (oEvent)
			var target = oEvent.target
		else
			return;
		
		_checkRules (target.name);
	}


	var _parseForm = function () {
		var countElt = _oFormElement.elements.length;
		for (var i = 0; i < countElt; i++) {
			if (_oFormElement.elements[i] != null && _oFormElement.elements[i].alt != null && _oFormElement.elements[i].alt != '') {
				try {
					var oRule = eval (_oFormElement.elements[i].alt);
					if (oRule.length > 0) {
						for (var j = 0; j < oRule.length; j++) {
							_addRule (_oFormElement.elements[i].name, oRule[j]);
						}
					}
				}
				catch (oE) {};
			}
		}
	}
	
	if (_oOptions.parse) {
		_parseForm ();
	}
}



  window.onload = function () {
   // document.form[0] ou document.forms[formName] ou document.formName (ou formName = name="ici") ou byId
   var jsChecker = new JsChecker ('formChecker', {onError: 'displayError', onValid: 'deleteDisplay'});

   jsChecker.addRule ('isEqual', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isEqual', {rule: 'isEqual', value: 'hello', message : 'erreur'});

   jsChecker.addRule ('isNotEqual', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isNotEqual', {rule: 'isNotEqual', value: 'hello', message : 'erreur'});

   jsChecker.addRule ('isEqualTo', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isEqualTo', {rule: 'isEqual', value: '=disabled', message : 'erreur'});

   jsChecker.addRule ('maxLength', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('maxLength', {rule: 'maxLength', value: 5, message : 'erreur'});

   jsChecker.addRule ('minLength', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('minLength', {rule: 'minLength', value: 5, message : 'erreur'});

   jsChecker.addRule ('rangeLength', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('rangeLength', {rule: 'rangeLength', value: {min:5, max:10}, message : 'erreur'});

   jsChecker.addRule ('hasExtension', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('hasExtension', {rule: 'hasExtension', value: 'jpg', message : 'erreur'});

   jsChecker.addRule ('regExp', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('regExp', {rule: 'regExp', value: '^[- A-Z]+$', message : 'erreur'});

   jsChecker.addRule ('regExp1', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('regExp1', {rule: 'regExp1', value: '^[-A-Z0-9]+$', message : 'erreur'});

   jsChecker.addRule ('regExp2', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('regExp2', {rule: 'regExp2', value: '^[A-Z0-9 /]+$', message : 'erreur'});

//   jsChecker.addRule ('regExp3', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('regExp3', {rule: 'regExp3', value: '^[A-Z0-9 /]+$', message : 'erreur'});
   
   jsChecker.addRule ('isAlphabetic', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isAlphabetic', {rule: 'isAlphabetic', message : 'erreur'});
   
   jsChecker.addRule ('isCommune', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isCommune', {rule: 'isCommune', message : 'erreur'});
      
   jsChecker.addRule ('isPays', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isPays', {rule: 'isPays', message : 'erreur'});
   
   jsChecker.addRule ('isNumeric', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isNumeric', {rule: 'isNumeric', message : 'erreur'});

   jsChecker.addRule ('isAdresse', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isAdresse', {rule: 'isAdresse', message : 'erreur'});
   
//   jsChecker.addRule ('isAdresse1', {rule: 'isRequired', message : '* Renseignement obligatoire !'});
   jsChecker.addRule ('isAdresse1', {rule: 'isAdresse1', message : 'erreur'});

//   jsChecker.addRule ('isAlphaNumeric', {rule: 'isRequired', message : '* Renseignement obligatoire !'});
   jsChecker.addRule ('isAlphaNumeric', {rule: 'isAlphaNumeric', message : 'erreur'});

//   jsChecker.addRule ('isAlphaNumeric1', {rule: 'isRequired', message : '* Renseignement obligatoire !'});
   jsChecker.addRule ('isAlphaNumeric1', {rule: 'isAlphaNumeric1', message : 'erreur'});

//   jsChecker.addRule ('isAlphaNumeric2', {rule: 'isRequired', message : '* Renseignement obligatoire !'});
   jsChecker.addRule ('isAlphaNumeric2', {rule: 'isAlphaNumeric2', message : 'erreur'});

   jsChecker.addRule ('isAlphaNumeric3', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isAlphaNumeric3', {rule: 'isAlphaNumeric3', message : 'erreur'});

   jsChecker.addRule ('isPostal', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isPostal', {rule: 'isPostal', message : 'erreur'});

   jsChecker.addRule ('isEmail', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isEmail', {rule: 'isEmail', message : 'erreur'});

   jsChecker.addRule ('isUrl', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isUrl', {rule: 'isUrl', message : 'erreur'});

   jsChecker.addRule ('isIpv4', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isIpv4', {rule: 'isIpv4', message : 'erreur'});

   jsChecker.addRule ('isChecked', {rule: 'isRequired', message : '* obligatoire !'});

   jsChecker.addRule ('isHexadecimal', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isHexadecimal', {rule: 'isHexadecimal', message : 'erreur'});

   jsChecker.addRule ('isPhone', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isPhone', {rule: 'isPhone', message : 'erreur'});

//   jsChecker.addRule ('isFax', {rule: 'isRequired', message : '* Renseignement obligatoire !'});
   jsChecker.addRule ('isFax', {rule: 'isFax', message : 'erreur'});

//   jsChecker.addRule ('isDate', {rule: 'isRequired', message : '* Renseignement obligatoire !'});
   jsChecker.addRule ('isDate', {rule: 'isDate', message : 'erreur'});
   
   jsChecker.addRule ('isDate1', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isDate1', {rule: 'isDate1', message : 'erreur'});

   jsChecker.addRule ('isTime', {rule: 'isRequired', message : '* obligatoire !'});
   jsChecker.addRule ('isTime', {rule: 'isTime', message : 'erreur'});
   }

   function displayError (msg, oArgs) {
   document.getElementById ("msg_" + oArgs.element).style.color = 'red';
   //document.getElementById ("msg_" + oArgs.element).style.fontWeight = 'bold';
   document.getElementById ("msg_" + oArgs.element).innerHTML = msg;
   }

   function deleteDisplay (msg, oArgs) {
   document.getElementById ("msg_" + oArgs.element).style.color = 'green';
   //document.getElementById ("msg_" + oArgs.element).style.fontWeight = 'inherit';
   document.getElementById ("msg_" + oArgs.element).innerHTML = 'OK';
   }

