// ------------------------------------------------------------------------------------------
// Form Validation Behavior
// ------------------------------------------------------------------------------------------
  
   if(wFORMS) {
		// Component properties 
		// wFORMS.functionName_formValidation  is defined at the bottom of this file
		// Those should be moved inside wFORMS.behaviors['validation']. Stays here for now for backward compatibility
       	wFORMS.preventSubmissionOnEnter   		= false; 			// prevents submission when pressing the 'enter' key. Set to true if pagination behavior is used.
	   	wFORMS.showAlertOnError 			  	= true; 			// sets to false to not show the alert when a validation error occurs.
		wFORMS.className_required 			 	= "required";
		wFORMS.className_validationError_msg 	= "errMsg";		 
		wFORMS.className_validationError_fld	= "errFld";  
		wFORMS.classNamePrefix_validation 		= "validate";	
		wFORMS.idSuffix_fieldError				= "-E";

		wFORMS.behaviors['validation'] = {
			
			// Error messages. This may be overwritten in a separate js file for localization or customization purposes.			
			errMsg_required 	: "Ce champ est requis. ",
			errMsg_alpha 		: "The text must use alphabetic characters only (a-z, A-Z). Numbers are not allowed.",
			errMsg_email 		: "Ce champ n'est pas une adresse email.",
			errMsg_integer 		: "Ce champ doit contenir uniquement des chiffres",
			errMsg_float 		: "Please enter a number (ex. 1.9).",
			errMsg_password 	: "Unsafe password. Your password should be between 4 and 12 characters long and use a combinaison of upper-case and lower-case letters.",
			errMsg_alphanum 	: "Ce champ doit contenir uniquement des chiffres ou des lettres.",
			errMsg_date 		: "Ce champ doit contenir un format de date valide.",
			errMsg_notification : "Votre formulaire n'a pas encore été soumis.\nVeuillez vérifier les informations.",  // %% will be replaced by the actual number of errors.
			errMsg_custom		: "Veuillez saisir une valeur correcte.",
			errMsg_numsecu	: "Veuillez saisir un numéro de sécurité sociale correct.",
			
			// Class Names
			className_allRequired : "allrequired",
			
			// first page w/ error in a multi-page form
			jumpToErrorOnPage : null,
			currentPageIndex  : -1,
			
			// do not submit fields turned off by switch behavior
			submitSwitchedOffFields : false,
			switchedOffFields : [],
			
		   // ------------------------------------------------------------------------------------------
		   // evaluate: check if the behavior applies to the given node. Adds event handlers if appropriate
		   // ------------------------------------------------------------------------------------------
			evaluate: function(node) {
               if(node.tagName.toUpperCase()=="FORM") {
				   // functionName_formValidation can be a reference to a function, or a string with the name of the function.
				   // avoid using typeof
				   if(wFORMS.functionName_formValidation.toString()==wFORMS.functionName_formValidation) {
					   // this is a string, not a function
					   wFORMS.functionName_formValidation = eval(wFORMS.functionName_formValidation);
				   }
                   wFORMS.helpers.addEvent(node,'submit',wFORMS.functionName_formValidation);
				   //wFORMS.debug('validation/evaluate: FORM '+ node.id,3);
               }
           },
		   // ------------------------------------------------------------------------------------------
           // init: executed once evaluate has been applied to all elements
		   // ------------------------------------------------------------------------------------------	   
		   init: function() {
		   },
		   
		   // ------------------------------------------------------------------------------------------
           // run: executed when the behavior is activated
		   // ------------------------------------------------------------------------------------------	   		   
           run: function(e) {
				var element  = wFORMS.helpers.getSourceElement(e);
				if(!element) element = e;
				//wFORMS.debug('validation/run: ' + element.id , 5);	
				
				var currentPageOnly = arguments.length>1 ? arguments[1]:false;
				// arguments[1] : (wFORMS.hasBehavior('paging') && wFORMS.behaviors['paging'].behaviorInUse);

				wFORMS.behaviors['validation'].switchedOffFields = [];
				wFORMS.behaviors['validation'].jumpToErrorOnPage = null;

				// on multi-page forms we need to prevent the submission when the 'enter' key is pressed
				// (doesn't work in Opera. Further tests needed in IE and Safari)
				if(wFORMS.preventSubmissionOnEnter) { 
					if(element.type && element.type.toLowerCase()=='text') 
						// source element is a text field, the form was submitted with the 'enter' key.
						return wFORMS.preventEvent(e); 
				}
				// make sure we have the form element
				while (element && element.tagName.toUpperCase() != 'FORM') {
					element = element.parentNode;
				}		
				
				var nbErrors = wFORMS.behaviors['validation'].validateElement(element, currentPageOnly, true);
				
				// save the value in a property if someone else needs it.
				wFORMS.behaviors['validation'].errorCount = nbErrors;
				
				if (nbErrors > 0) {					
					if(wFORMS.behaviors['validation'].jumpToErrorOnPage) {					
						wFORMS.behaviors['paging'].gotoPage(wFORMS.behaviors['validation'].jumpToErrorOnPage);
					}
					if(wFORMS.showAlertOnError){ wFORMS.behaviors['validation'].showAlert(nbErrors); }
					return wFORMS.helpers.preventEvent(e); 
				}

				// Remove switched-off content if any
				// Note: in multi-page behavior the validation is run on "page next" without submitting the form.
				//       In this situation (currentPageOnly==true) switched-off conditionals should not be removed. 
				if(!wFORMS.behaviors['validation'].submitSwitchedOffFields && !currentPageOnly) {
					for(var i=0; i < wFORMS.behaviors['validation'].switchedOffFields.length; i++) {
						var element = wFORMS.behaviors['validation'].switchedOffFields[i];
						while(element.childNodes[0]) 
							element.removeChild(element.childNodes[0]);
					}
				}				
				return true;
			},
		   
			// ------------------------------------------------------------------------------------------
			// remove: executed if the behavior should not be applied anymore
			// ------------------------------------------------------------------------------------------
			remove: function() {
			},
		   
		   
			// ------------------------------------------------------------------------------------------
			// validation functions
			// ------------------------------------------------------------------------------------------
			validateElement: function(element /*, currentPageOnly, deep */) {

				var deep = arguments.length>2 ? arguments[2] : true;
				
				// used in multi-page forms
				var currentPageOnly = arguments[1] ? arguments[1] : false;				
				
				var wBehavior = wFORMS.behaviors['validation'];		// shortcut
				
				// do not validate elements that are in a OFF-Switch
				// Note: what happens if an element is the target of 2+ switches, some ON and some OFF ?
				if(wFORMS.hasBehavior('switch') && wFORMS.helpers.hasClassPrefix(element,wFORMS.classNamePrefix_offState)) {
					if(!wBehavior.submitSwitchedOffFields) {
						wBehavior.switchedOffFields.push(element);
					}
					return 0;
				}
				// do not validate elements that are not in the current page (Paging Behavior)
				if(wFORMS.hasBehavior('paging') && wFORMS.helpers.hasClass(element,wFORMS.className_paging)) {
					if(!wFORMS.helpers.hasClass(element,wFORMS.className_pagingCurrent) && currentPageOnly)
						return 0;
					wBehavior.currentPageIndex = wFORMS.behaviors['paging'].getPageIndex(element);
				}
				
				var nbErrors = 0;
				
				// check if required
				if(!wBehavior.checkRequired(element)) {
					wBehavior.showError(element, wBehavior.errMsg_required);
					nbErrors++;
					//wFORMS.debug('validation/error: [required]' + element.id + '('+nbErrors+')' , 5);
				} else {
				
					// input format validation
					if (wFORMS.helpers.hasClassPrefix(element,wFORMS.classNamePrefix_validation)) {
		
						var arrClasses = element.className.split(" ");
						for (j=0;j<arrClasses.length;j++) {

							switch(arrClasses[j]) {
								case "validate-alpha":
									if(!wBehavior.isAlpha(element.value)) {
										wBehavior.showError(element, wBehavior.errMsg_alpha);
										nbErrors++;
									}
									break;
								case "validate-num-secu":
									if (!wBehavior.isNumSecu(element.value)) {
										wBehavior.showError(element, wBehavior.errMsg_numsecu);
										nbErrors++;
									}
									break;
								case "validate-alphanum":
									if(!wBehavior.isAlphaNum(element.value)) {
										wBehavior.showError(element, wBehavior.errMsg_alphanum);
										nbErrors++;
									}
									break;
								case "validate-date":
									if(!wBehavior.isDate(element.value)) {
										wBehavior.showError(element, wBehavior.errMsg_date);
										nbErrors++;
									}
									break;
								case "validate-time":
									/* NOT IMPLEMENTED */
									break;
								case "validate-email":
									if(blacklistEmails(element.value)) {
										wBehavior.showError(element, wBehavior.errMsg_custom);
										nbErrors++;	
										break;
									}
									if(!wBehavior.isEmail(element.value)) {
										wBehavior.showError(element, wBehavior.errMsg_email);
										nbErrors++;
									}
									break;
								case "validate-integer":
									if(!wBehavior.isInteger(element.value)) {
										wBehavior.showError(element, wBehavior.errMsg_integer);
										nbErrors++;
									}					
									break;
								case "validate-float":
									if(!wBehavior.isFloat(element.value)) {
										wBehavior.showError(element,wBehavior.errMsg_float);
										nbErrors++;
									}
									break;
								case "validate-strongpassword": // NOT IMPLEMENTED
									if(!wBehavior.isPassword(element.value)) {
										wBehavior.showError(element, wBehavior.errMsg_password);
										nbErrors++;
									}
									break;
								case "validate-custom": 
									var pattern = new RegExp("\/([^\/]*)\/([gi]*)");
									var matches = element.className.match(pattern);
									if(matches[0]) {										
										var validationPattern = new RegExp(matches[1],matches[2]);
										if(!element.value.match(validationPattern)) {
											wBehavior.showError(element, wBehavior.errMsg_custom);
											nbErrors++;											
										}
									}													
									break;		
								case "validate-name": 
									if(recurence3lettres(element.value)) {
										wBehavior.showError(element, wBehavior.errMsg_custom);
										nbErrors++;	
										break;
									}
									if(!auMoinsUneVoyelle(element.value)) {
										wBehavior.showError(element, wBehavior.errMsg_custom);
										nbErrors++;	
										break;
									}
									if(blacklisted(element.value)) {
										wBehavior.showError(element, wBehavior.errMsg_custom);
										nbErrors++;	
										break;
									}
									if(element.value.length > 0 && element.value.length == 1) {
										wBehavior.showError(element, wBehavior.errMsg_custom);
										nbErrors++;	
										break;
									}
									break;
								case "validate-phone":
									//if(!isPhone(element.value) || !isPhoneByRegion(element.value)) {
									if(!isPhone(element.value)) {
										wBehavior.showError(element, wBehavior.errMsg_custom);
										nbErrors++;	
										break;
									}
									break;
							} // end switch
						} // end for
					}
				} // end validation check
				
				// remove previous error flags if any.
				if(nbErrors==0) {
					wBehavior.removeErrorMessage(element);
				} else {
					// flag the first page with an error (if multi-page form)
					if(wBehavior.currentPageIndex>0 && !wBehavior.jumpToErrorOnPage) {
						wBehavior.jumpToErrorOnPage = wBehavior.currentPageIndex;
					}
				}
					
				// recursive loop					
				if(deep) {
					for(var i=0; i < element.childNodes.length; i++) {
						if(element.childNodes[i].nodeType==1) { // Element Nodes only
							nbErrors += wBehavior.validateElement(element.childNodes[i], currentPageOnly, deep);
						}
					}
				}
				
				return nbErrors;
			},
			
			// ------------------------------------------------------------------------------------------
			checkRequired: function(element) {
				var wBehavior = wFORMS.behaviors['validation'];		// shortcut				

				if(wFORMS.helpers.hasClass(element,wFORMS.className_required)) {
					switch(element.tagName.toUpperCase()) {
						case "INPUT":
							var inputType = element.getAttribute("type");
							if(!inputType) inputType = 'text'; // handles lame markup
							switch(inputType.toLowerCase()) {
								case "checkbox":
									return element.checked; 
									break;
								case "radio":
									return element.checked; 
									break;
								default:
									return !wBehavior.isEmpty(element.value);
							}
							break;
						case "SELECT":							
							if(element.selectedIndex==-1) {
								// multiple select with no selection
								return false;
							} else 												
								return !wBehavior.isEmpty(element.options[element.selectedIndex].value);
							break;
						case "TEXTAREA":
							return !wBehavior.isEmpty(element.value);
							break;
						default:
							return wBehavior.checkOneRequired(element);
							break;
					} 	
				} else if(wFORMS.helpers.hasClass(element,wBehavior.className_allRequired)) {
					return wBehavior.checkAllRequired(element);
				}
				return true;
			},
			checkOneRequired: function(element) {	
				if(element.nodeType != 1) return false;
				var tagName = element.tagName.toUpperCase();
				var wBehavior = wFORMS.behaviors['validation'];
				
				if(tagName == "INPUT" || tagName == "SELECT" || tagName == "TEXTAREA" ) {
					var value = wBehavior.getFieldValue(element);	
					if(!wBehavior.isEmpty(value)) {					
						return true;
					}			
				}
				for(var i=0; i<element.childNodes.length;i++) {
					if(wBehavior.checkOneRequired(element.childNodes[i])) return true;
				}
				return false;
			},
			checkAllRequired: function(element)	{

				if(element.nodeType != 1) return true;
				var tagName = element.tagName.toUpperCase();
				var wBehavior = wFORMS.behaviors['validation'];

				if(tagName == "INPUT" || tagName == "SELECT" || tagName == "TEXTAREA" ) {
					var value = wBehavior.getFieldValue(element);	
					if(wBehavior.isEmpty(value)) {					
						return false;
					}			
				}
				for(var i=0; i<element.childNodes.length;i++) {
					if(!wBehavior.checkAllRequired(element.childNodes[i])) return false;
				}
				return true;
			},
			getFieldValue: function(element) {
				var value = null;
				if(element && element.tagName) {
					if(element.tagName.toUpperCase() == "INPUT") {
						var inputType = element.getAttribute("type");
						if(!inputType) inputType = 'text'; // handles lame markup
					
						switch(inputType.toLowerCase()) {
							case "checkbox": 
								value = element.checked?element.value:null; 
								break;
							case "radio":								
								var radioGroup = element.form[element.name]; 							
								for (var i = 0; i< radioGroup.length; i++) {
								    if (radioGroup[i].checked) {
								    	if(!value) value = new Array();
										value[value.length] = radioGroup[i].value;
								    }
								} 								
								break;
							default:
								value = element.value;
						}
					} else if(element.tagName.toUpperCase() == "SELECT") {	
						if(element.selectedIndex!=-1)																
							value = element.options[element.selectedIndex].value						
						else
							value = null; // multiple select with no selection
					} else if(element.tagName.toUpperCase() == "TEXTAREA") {
						value = element.value;
					}
				}
				return value;
			},
			// ------------------------------------------------------------------------------------------
			isEmpty: function(s) {				
				var regexpWhitespace = /^\s+$/;
				return  ((s == null) || (s.length == 0) || regexpWhitespace.test(s));
			},
			isAlpha: function(s) {
				var regexpAlphabetic = /^[a-zA-Z\s]+$/; // Add ' and - ?
				return wFORMS.behaviors['validation'].isEmpty(s) || regexpAlphabetic.test(s);
			},
			isNumSecu: function(s) {
				var regexpNumsecu = /^[12][0-9]{2}[0-1][0-9](2[AB]|[0-9]{2})[0-9]{3}[0-9]{3}[0-9]{2}$/;
				return wFORMS.behaviors['validation'].isEmpty(s) || regexpNumsecu.test(s);
			},
			isAlphaNum: function(s) {
				var validChars = /^[\w\s]+$/;
				return wFORMS.behaviors['validation'].isEmpty(s) || validChars.test(s);
			},
			isDate: function(s) {
				var testDate = new Date(s);
				return wFORMS.behaviors['validation'].isEmpty(s) || !isNaN(testDate);
			},
			isEmail: function(s) {
				var regexpEmail = /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/;
				return wFORMS.behaviors['validation'].isEmpty(s) || regexpEmail.test(s);
			},
			isInteger: function(s) {
				var regexp = /^[+]?\d+$/;
				return wFORMS.behaviors['validation'].isEmpty(s) || regexp.test(s);
			},
			isFloat: function(s) {		
				return wFORMS.behaviors['validation'].isEmpty(s) || !isNaN(parseFloat(s));
			},
			// NOT IMPLEMENTED
			isPassword: function(s) {
				// Matches strong password : at least 1 upper case letter, one lower case letter. 4 characters minimum. 12 max.
				//var regexp = /^(?=.*[a-z])(?=.*[A-Z])(?!.*\s).{4,12}$/;  // <= breaks in IE5/Mac
				return wFORMS.behaviors['validation'].isEmpty(s);
			},
			
			// ------------------------------------------------------------------------------------------		
			// Error Alert Functions
			// ------------------------------------------------------------------------------------------		
			showError: function (element,errorMsg) {		
				// remove existing error message if any.
				wFORMS.behaviors['validation'].removeErrorMessage(element);
				
				if (!element.id) element.id = wFORMS.helpers.randomId(); // we'll need an id here.		
				// Add error flag to the field
				element.className += " " + wFORMS.className_validationError_fld;
				// Prepare error message
				var msgNode = document.createTextNode(" " + errorMsg);
				// Find error message placeholder.
				var fe = document.getElementById(element.id +  wFORMS.idSuffix_fieldError);
				if(!fe) { // create placeholder.
					fe = document.createElement("div"); 
					fe.setAttribute('id', element.id +  wFORMS.idSuffix_fieldError);			
					// attach the error message after the field label if possible
					var fl = document.getElementById(element.id +  wFORMS.idSuffix_fieldLabel);
					if(fl)
						fl.parentNode.insertBefore(fe,fl.nextSibling);
					else
						// otherwise, attach it after the field tag.
						element.parentNode.insertBefore(fe,element.nextSibling);
				}
				// Finish the error message.
				fe.appendChild(msgNode);  	
				fe.className += " " + wFORMS.className_validationError_msg;
			},
			
			showAlert: function (nbTotalErrors) {
			   alert(wFORMS.behaviors['validation'].errMsg_notification.replace('%%',nbTotalErrors));
			},
			
			removeErrorMessage: function(element) {
				if(wFORMS.helpers.hasClass(element,wFORMS.className_validationError_fld)) {
					var rErrClass     = new RegExp(wFORMS.className_validationError_fld,"gi");
					element.className = element.className.replace(rErrClass,"");
					var errorMessage  = document.getElementById(element.id + wFORMS.idSuffix_fieldError);
					if(errorMessage)  {				
						errorMessage.innerHTML=""; 
					}
				}
			}
					
       } // End wFORMS.behaviors['validation']
	   
		wFORMS.functionName_formValidation = wFORMS.behaviors['validation'].run;


		// ----------------------------------------------------------------------
		// wForms 1.0 backward compatibility
		// ----------------------------------------------------------------------
		wFORMS.formValidation = wFORMS.behaviors['validation'].run;
		
		// Error messages. 
		wFORMS.arrErrorMsg = new Array(); 
		wFORMS.arrErrorMsg[0] = wFORMS.behaviors['validation'].errMsg_required;	
		wFORMS.arrErrorMsg[1] = wFORMS.behaviors['validation'].errMsg_alpha; 			
		wFORMS.arrErrorMsg[2] = wFORMS.behaviors['validation'].errMsg_email;		
		wFORMS.arrErrorMsg[3] = wFORMS.behaviors['validation'].errMsg_integer;		
		wFORMS.arrErrorMsg[4] = wFORMS.behaviors['validation'].errMsg_float;
		wFORMS.arrErrorMsg[5] = wFORMS.behaviors['validation'].errMsg_password;
		wFORMS.arrErrorMsg[6] = wFORMS.behaviors['validation'].errMsg_alphanum;
		wFORMS.arrErrorMsg[7] = wFORMS.behaviors['validation'].errMsg_date;
		wFORMS.arrErrorMsg[8] = wFORMS.behaviors['validation'].errMsg_notification;
		
   }
   
   function recurence3lettres(chaine)
   {
		chaine = chaine.toLowerCase();
		if(chaine.indexOf('aaa')>=0) { return true; }
		else if(chaine.indexOf('bbb')>=0) { return true; }
		else if(chaine.indexOf('ccc')>=0) { return true; }
		else if(chaine.indexOf('ddd')>=0) { return true; }
		else if(chaine.indexOf('eee')>=0) { return true; }
		else if(chaine.indexOf('fff')>=0) { return true; }
		else if(chaine.indexOf('ggg')>=0) { return true; }
		else if(chaine.indexOf('hhh')>=0) { return true; }
		else if(chaine.indexOf('iii')>=0) { return true; }
		else if(chaine.indexOf('jjj')>=0) { return true; }
		else if(chaine.indexOf('kkk')>=0) { return true; }
		else if(chaine.indexOf('lll')>=0) { return true; }
		else if(chaine.indexOf('mmm')>=0) { return true; }
		else if(chaine.indexOf('nnn')>=0) { return true; }
		else if(chaine.indexOf('ooo')>=0) { return true; }
		else if(chaine.indexOf('ppp')>=0) { return true; }
		else if(chaine.indexOf('qqq')>=0) { return true; }
		else if(chaine.indexOf('rrr')>=0) { return true; }
		else if(chaine.indexOf('sss')>=0) { return true; }
		else if(chaine.indexOf('ttt')>=0) { return true; }
		else if(chaine.indexOf('uuu')>=0) { return true; }
		else if(chaine.indexOf('vvv')>=0) { return true; }
		else if(chaine.indexOf('www')>=0) { return true; }
		else if(chaine.indexOf('xxx')>=0) { return true; }
		else if(chaine.indexOf('yyy')>=0) { return true; }
		else if(chaine.indexOf('zzz')>=0) { return true; }
		else if(chaine.indexOf('Ãƒ Ãƒ Ãƒ ')>=0) { return true; }
		else if(chaine.indexOf('ÃƒÂ©ÃƒÂ©ÃƒÂ©')>=0) { return true; }
		else if(chaine.indexOf('ÃƒÂ¨ÃƒÂ¨ÃƒÂ¨')>=0) { return true; }
		else if(chaine.indexOf('ÃƒÂ¹ÃƒÂ¹ÃƒÂ¹')>=0) { return true; }
		else { return false; }
   }
   
   function auMoinsUneVoyelle(chaine)
   {
		chaine = chaine.toLowerCase();
		if(chaine.indexOf('a')>=0) 		{ return true; }
		else if(chaine.indexOf('e')>=0) { return true; }
		else if(chaine.indexOf('i')>=0) { return true; }
		else if(chaine.indexOf('o')>=0) { return true; }
		else if(chaine.indexOf('u')>=0) { return true; }
		else if(chaine.indexOf('y')>=0) { return true; }
		else { return false; }
   }
   
   function blacklisted(chaine)
   {
		chaine = chaine.toLowerCase();
		if(chaine == "test") 			{ return true; }
		else if(chaine == "exemple") 	{ return true; }
		else if(chaine == "example") 	{ return true; }
		else if(chaine == "toto") 		{ return true; }
		else if(chaine == "tata") 		{ return true; }
		else if(chaine == "tutu") 		{ return true; }
		else if(chaine == "titi") 		{ return true; }
		else if(chaine == "batard") 		{ return true; }
		else if(chaine == "encule") 		{ return true; }
		else if(chaine == "fils de pute") 	{ return true; }
		else if(chaine == "con") 			{ return true; }
		else if(chaine == "connard") 		{ return true; }
		else if(chaine == "merde") 		{ return true; }
		else if(chaine == "je sais pas") 		{ return true; }
		else if(chaine == "pute") 		{ return true; }
		else if(chaine == "enfoire") 		{ return true; }
		else if(chaine.indexOf('@')>=0) { return true; }
		else { return false; }
   }
   
   function blacklistEmails(chaine)
   {
		var needle = /^[^aiueoyAIUEOY]+@[a-zA-Z0-9-]{2,}[.][a-zA-Z]{2,3}$/;
		if(needle.test(chaine))								{ return true; }
		var needle = /^[a-zA-Z\-_0-9\.]{3,}@[a-zA-Z0-9-]{2,}[.][a-zA-Z]{2,3}$/;
		if(!needle.test(chaine))							{ return true; }
		else if(chaine.indexOf('@test')>=0)					{ return true; }
		else if(chaine.indexOf('test@')>=0) 				{ return true; }
		else if(chaine.indexOf('@exemple')>=0) 				{ return true; }
		else if(chaine.indexOf('exemple@')>=0) 				{ return true; }
		else if(chaine.indexOf('@example')>=0) 				{ return true; }
		else if(chaine.indexOf('example')>=0) 				{ return true; }
		else if(chaine.indexOf('@toto')>=0) 				{ return true; }
		else if(chaine.indexOf('toto@')>=0) 				{ return true; }
		else if(chaine.indexOf('@tata')>=0) 				{ return true; }
		else if(chaine.indexOf('tata@')>=0) 				{ return true; }
		else if(chaine.indexOf('@tutu')>=0) 				{ return true; }
		else if(chaine.indexOf('tutu@')>=0) 				{ return true; }
		else if(chaine.indexOf('@titi')>=0) 				{ return true; }
		else if(chaine.indexOf('titi@')>=0) 				{ return true; }
		else if(chaine.indexOf('@tyty')>=0) 				{ return true; }
		else if(chaine.indexOf('.ap-hop-paris.fr')>=0)	 	{ return true; }
		else if(chaine.indexOf('@adecco.fr')>=0)	 		{ return true; }
		else if(chaine.indexOf('justice.fr')>=0)	 		{ return true; }
		else if(chaine.indexOf('notaires.fr')>=0)	 		{ return true; }
		else if(chaine.indexOf('@paris.fr')>=0)	 			{ return true; }
		else if(chaine.indexOf('@adia.fr')>=0)	 			{ return true; }
		else if(chaine.indexOf('gouv.fr')>=0)	 			{ return true; }
		else if(chaine.indexOf('ratp.fr')>=0)	 			{ return true; }
		else if(chaine.indexOf('@chu-')>=0)	 				{ return true; }
		else if(chaine.indexOf('@ch-')>=0)	 				{ return true; }
		else if(InvalidDomain(chaine))		 				{ return true; }
		else 												{ return false; }
   }
   
   function InvalidDomain(chaine){
   
		result = true;
		if(chaine.indexOf('.af')>=0) { result = false; }
		else if(chaine.indexOf('.ax')>=0) { result = false; }
		else if(chaine.indexOf('.al')>=0) { result = false; }
		else if(chaine.indexOf('.ad')>=0) { result = false; }
		else if(chaine.indexOf('.ao')>=0) { result = false; }
		else if(chaine.indexOf('.ai')>=0) { result = false; }
		else if(chaine.indexOf('.aq')>=0) { result = false; }
		else if(chaine.indexOf('.ag')>=0) { result = false; }
		else if(chaine.indexOf('.an')>=0) { result = false; }
		else if(chaine.indexOf('.ar')>=0) { result = false; }
		else if(chaine.indexOf('.am')>=0) { result = false; }
		else if(chaine.indexOf('.aw')>=0) { result = false; }
		else if(chaine.indexOf('.ac')>=0) { result = false; }
		else if(chaine.indexOf('.au')>=0) { result = false; }
		else if(chaine.indexOf('.at')>=0) { result = false; }
		else if(chaine.indexOf('.az')>=0) { result = false; }
		else if(chaine.indexOf('.as')>=0) { result = false; }
		else if(chaine.indexOf('.ae')>=0) { result = false; }
		else if(chaine.indexOf('.asia')>=0) { result = false; }
		else if(chaine.indexOf('.bs')>=0) { result = false; }
		else if(chaine.indexOf('.bh')>=0) { result = false; }
		else if(chaine.indexOf('.bd')>=0) { result = false; }
		else if(chaine.indexOf('.bb')>=0) { result = false; }
		else if(chaine.indexOf('.be')>=0) { result = false; }
		else if(chaine.indexOf('.bz')>=0) { result = false; }
		else if(chaine.indexOf('.biz')>=0) { result = false; }
		else if(chaine.indexOf('.bj')>=0) { result = false; }
		else if(chaine.indexOf('.bm')>=0) { result = false; }
		else if(chaine.indexOf('.by')>=0) { result = false; }
		else if(chaine.indexOf('.bo')>=0) { result = false; }
		else if(chaine.indexOf('.ba')>=0) { result = false; }
		else if(chaine.indexOf('.bw')>=0) { result = false; }
		else if(chaine.indexOf('.br')>=0) { result = false; }
		else if(chaine.indexOf('.bn')>=0) { result = false; }
		else if(chaine.indexOf('.bg')>=0) { result = false; }
		else if(chaine.indexOf('.bf')>=0) { result = false; }
		else if(chaine.indexOf('.bi')>=0) { result = false; }
		else if(chaine.indexOf('.bt')>=0) { result = false; }
		else if(chaine.indexOf('.bu')>=0) { result = false; }
		else if(chaine.indexOf('.ch')>=0) { result = false; }
		else if(chaine.indexOf('.cv')>=0) { result = false; }
		else if(chaine.indexOf('.cm')>=0) { result = false; }
		else if(chaine.indexOf('.ca')>=0) { result = false; }
		else if(chaine.indexOf('.cat')>=0) { result = false; }
		else if(chaine.indexOf('.cr')>=0) { result = false; }
		else if(chaine.indexOf('.cl')>=0) { result = false; }
		else if(chaine.indexOf('.cn')>=0) { result = false; }
		else if(chaine.indexOf('.cy')>=0) { result = false; }
		else if(chaine.indexOf('.cc')>=0) { result = false; }
		else if(chaine.indexOf('.co')>=0) { result = false; }
		else if(chaine.indexOf('.com')>=0) { result = false; }
		else if(chaine.indexOf('.cg')>=0) { result = false; }
		else if(chaine.indexOf('.cd')>=0) { result = false; }
		else if(chaine.indexOf('.ck')>=0) { result = false; }
		else if(chaine.indexOf('.ci')>=0) { result = false; }
		else if(chaine.indexOf('.cr')>=0) { result = false; }
		else if(chaine.indexOf('.cu')>=0) { result = false; }
		else if(chaine.indexOf('.cx')>=0) { result = false; }
		else if(chaine.indexOf('.cf')>=0) { result = false; }
		else if(chaine.indexOf('.cz')>=0) { result = false; }
		else if(chaine.indexOf('.de')>=0) { result = false; }
		else if(chaine.indexOf('.dk')>=0) { result = false; }
		else if(chaine.indexOf('.dm')>=0) { result = false; }
		else if(chaine.indexOf('.do')>=0) { result = false; }
		else if(chaine.indexOf('.dz')>=0) { result = false; }
		else if(chaine.indexOf('.dj')>=0) { result = false; }
		else if(chaine.indexOf('.ec')>=0) { result = false; }
		else if(chaine.indexOf('.edu')>=0) { result = false; }
		else if(chaine.indexOf('.eg')>=0) { result = false; }
		else if(chaine.indexOf('.er')>=0) { result = false; }
		else if(chaine.indexOf('.es')>=0) { result = false; }
		else if(chaine.indexOf('.ee')>=0) { result = false; }
		else if(chaine.indexOf('.et')>=0) { result = false; }
		else if(chaine.indexOf('.eu')>=0) { result = false; }
		else if(chaine.indexOf('.eh')>=0) { result = false; }
		else if(chaine.indexOf('.fo')>=0) { result = false; }
		else if(chaine.indexOf('.fi')>=0) { result = false; }
		else if(chaine.indexOf('.fj')>=0) { result = false; }
		else if(chaine.indexOf('.fr')>=0) { result = false; }
		else if(chaine.indexOf('.fk')>=0) { result = false; }
		else if(chaine.indexOf('.fm')>=0) { result = false; }
		else if(chaine.indexOf('.ga')>=0) { result = false; }
		else if(chaine.indexOf('.gm')>=0) { result = false; }
		else if(chaine.indexOf('.ge')>=0) { result = false; }
		else if(chaine.indexOf('.gs')>=0) { result = false; }
		else if(chaine.indexOf('.gh')>=0) { result = false; }
		else if(chaine.indexOf('.gi')>=0) { result = false; }
		else if(chaine.indexOf('.gd')>=0) { result = false; }
		else if(chaine.indexOf('.gr')>=0) { result = false; }
		else if(chaine.indexOf('.gl')>=0) { result = false; }
		else if(chaine.indexOf('.gov')>=0) { result = false; }
		else if(chaine.indexOf('.gob')>=0) { result = false; }
		else if(chaine.indexOf('.gu')>=0) { result = false; }
		else if(chaine.indexOf('.gt')>=0) { result = false; }
		else if(chaine.indexOf('.gg')>=0) { result = false; }
		else if(chaine.indexOf('.gn')>=0) { result = false; }
		else if(chaine.indexOf('.gq')>=0) { result = false; }
		else if(chaine.indexOf('.gw')>=0) { result = false; }
		else if(chaine.indexOf('.gy')>=0) { result = false; }
		else if(chaine.indexOf('.gb')>=0) { result = false; }
		else if(chaine.indexOf('.ht')>=0) { result = false; }
		else if(chaine.indexOf('.hn')>=0) { result = false; }
		else if(chaine.indexOf('.hk')>=0) { result = false; }
		else if(chaine.indexOf('.hu')>=0) { result = false; }
		else if(chaine.indexOf('.hr')>=0) { result = false; }
		else if(chaine.indexOf('.id')>=0) { result = false; }
		else if(chaine.indexOf('.ie')>=0) { result = false; }
		else if(chaine.indexOf('.il')>=0) { result = false; }
		else if(chaine.indexOf('.im')>=0) { result = false; }
		else if(chaine.indexOf('.in')>=0) { result = false; }
		else if(chaine.indexOf('.info')>=0) { result = false; }
		else if(chaine.indexOf('.int')>=0) { result = false; }
		else if(chaine.indexOf('.io')>=0) { result = false; }
		else if(chaine.indexOf('.iq')>=0) { result = false; }
		else if(chaine.indexOf('.ir')>=0) { result = false; }
		else if(chaine.indexOf('.is')>=0) { result = false; }
		else if(chaine.indexOf('.it')>=0) { result = false; }
		else if(chaine.indexOf('.jm')>=0) { result = false; }
		else if(chaine.indexOf('.jp')>=0) { result = false; }
		else if(chaine.indexOf('.je')>=0) { result = false; }
		else if(chaine.indexOf('.jo')>=0) { result = false; }
		else if(chaine.indexOf('.jobs')>=0) { result = false; }
		else if(chaine.indexOf('.jh')>=0) { result = false; }
		else if(chaine.indexOf('.kz')>=0) { result = false; }
		else if(chaine.indexOf('.ke')>=0) { result = false; }
		else if(chaine.indexOf('.kg')>=0) { result = false; }
		else if(chaine.indexOf('.ki')>=0) { result = false; }
		else if(chaine.indexOf('.kw')>=0) { result = false; }
		else if(chaine.indexOf('.ky')>=0) { result = false; }
		else if(chaine.indexOf('.kh')>=0) { result = false; }
		else if(chaine.indexOf('.km')>=0) { result = false; }
		else if(chaine.indexOf('.kp')>=0) { result = false; }
		else if(chaine.indexOf('.kr')>=0) { result = false; }
		else if(chaine.indexOf('.kn')>=0) { result = false; }
		else if(chaine.indexOf('.la')>=0) { result = false; }
		else if(chaine.indexOf('.lat')>=0) { result = false; }
		else if(chaine.indexOf('.ls')>=0) { result = false; }
		else if(chaine.indexOf('.lv')>=0) { result = false; }
		else if(chaine.indexOf('.lb')>=0) { result = false; }
		else if(chaine.indexOf('.lr')>=0) { result = false; }
		else if(chaine.indexOf('.ly')>=0) { result = false; }
		else if(chaine.indexOf('.li')>=0) { result = false; }
		else if(chaine.indexOf('.lt')>=0) { result = false; }
		else if(chaine.indexOf('.lu')>=0) { result = false; }
		else if(chaine.indexOf('.lc')>=0) { result = false; }
		else if(chaine.indexOf('.lk')>=0) { result = false; }
		else if(chaine.indexOf('.mo')>=0) { result = false; }
		else if(chaine.indexOf('.mk')>=0) { result = false; }
		else if(chaine.indexOf('.mg')>=0) { result = false; }
		else if(chaine.indexOf('.my')>=0) { result = false; }
		else if(chaine.indexOf('.mw')>=0) { result = false; }
		else if(chaine.indexOf('.mv')>=0) { result = false; }
		else if(chaine.indexOf('.ml')>=0) { result = false; }
		else if(chaine.indexOf('.mt')>=0) { result = false; }
		else if(chaine.indexOf('.mp')>=0) { result = false; }
		else if(chaine.indexOf('.mobi')>=0) { result = false; }
		else if(chaine.indexOf('.ma')>=0) { result = false; }
		else if(chaine.indexOf('.mh')>=0) { result = false; }
		else if(chaine.indexOf('.mil')>=0) { result = false; }
		else if(chaine.indexOf('.mu')>=0) { result = false; }
		else if(chaine.indexOf('.museum')>=0) { result = false; }
		else if(chaine.indexOf('.mr')>=0) { result = false; }
		else if(chaine.indexOf('.mx')>=0) { result = false; }
		else if(chaine.indexOf('.md')>=0) { result = false; }
		else if(chaine.indexOf('.mc')>=0) { result = false; }
		else if(chaine.indexOf('.mn')>=0) { result = false; }
		else if(chaine.indexOf('.me')>=0) { result = false; }
		else if(chaine.indexOf('.ms')>=0) { result = false; }
		else if(chaine.indexOf('.mz')>=0) { result = false; }
		else if(chaine.indexOf('.mm')>=0) { result = false; }
		else if(chaine.indexOf('.na')>=0) { result = false; }
		else if(chaine.indexOf('.name')>=0) { result = false; }
		else if(chaine.indexOf('.net')>=0) { result = false; }
		else if(chaine.indexOf('.nr')>=0) { result = false; }
		else if(chaine.indexOf('.np')>=0) { result = false; }
		else if(chaine.indexOf('.ni')>=0) { result = false; }
		else if(chaine.indexOf('.ne')>=0) { result = false; }
		else if(chaine.indexOf('.ng')>=0) { result = false; }
		else if(chaine.indexOf('.nu')>=0) { result = false; }
		else if(chaine.indexOf('.nf')>=0) { result = false; }
		else if(chaine.indexOf('.no')>=0) { result = false; }
		else if(chaine.indexOf('.nc')>=0) { result = false; }
		else if(chaine.indexOf('.nz')>=0) { result = false; }
		else if(chaine.indexOf('.nl')>=0) { result = false; }
		else if(chaine.indexOf('.om')>=0) { result = false; }
		else if(chaine.indexOf('.org')>=0) { result = false; }
		else if(chaine.indexOf('.pk')>=0) { result = false; }
		else if(chaine.indexOf('.pw')>=0) { result = false; }
		else if(chaine.indexOf('.ps')>=0) { result = false; }
		else if(chaine.indexOf('.pa')>=0) { result = false; }
		else if(chaine.indexOf('.pg')>=0) { result = false; }
		else if(chaine.indexOf('.py')>=0) { result = false; }
		else if(chaine.indexOf('.pe')>=0) { result = false; }
		else if(chaine.indexOf('.pn')>=0) { result = false; }
		else if(chaine.indexOf('.pf')>=0) { result = false; }
		else if(chaine.indexOf('.pl')>=0) { result = false; }
		else if(chaine.indexOf('.pt')>=0) { result = false; }
		else if(chaine.indexOf('.pr')>=0) { result = false; }
		else if(chaine.indexOf('.pro')>=0) { result = false; }
		else if(chaine.indexOf('.pm')>=0) { result = false; }
		else if(chaine.indexOf('.ph')>=0) { result = false; }
		else if(chaine.indexOf('.qa')>=0) { result = false; }
		else if(chaine.indexOf('.rw')>=0) { result = false; }
		else if(chaine.indexOf('.ro')>=0) { result = false; }
		else if(chaine.indexOf('.ru')>=0) { result = false; }
		else if(chaine.indexOf('.rs')>=0) { result = false; }
		else if(chaine.indexOf('.re')>=0) { result = false; }
		else if(chaine.indexOf('.sb')>=0) { result = false; }
		else if(chaine.indexOf('.sm')>=0) { result = false; }
		else if(chaine.indexOf('.sh')>=0) { result = false; }
		else if(chaine.indexOf('.st')>=0) { result = false; }
		else if(chaine.indexOf('.sn')>=0) { result = false; }
		else if(chaine.indexOf('.sc')>=0) { result = false; }
		else if(chaine.indexOf('.sl')>=0) { result = false; }
		else if(chaine.indexOf('.sg')>=0) { result = false; }
		else if(chaine.indexOf('.sy')>=0) { result = false; }
		else if(chaine.indexOf('.so')>=0) { result = false; }
		else if(chaine.indexOf('.sz')>=0) { result = false; }
		else if(chaine.indexOf('.sd')>=0) { result = false; }
		else if(chaine.indexOf('.se')>=0) { result = false; }
		else if(chaine.indexOf('.sr')>=0) { result = false; }
		else if(chaine.indexOf('.sj')>=0) { result = false; }
		else if(chaine.indexOf('.sv')>=0) { result = false; }
		else if(chaine.indexOf('.sa')>=0) { result = false; }
		else if(chaine.indexOf('.sk')>=0) { result = false; }
		else if(chaine.indexOf('.si')>=0) { result = false; }
		else if(chaine.indexOf('.su')>=0) { result = false; }
		else if(chaine.indexOf('.th')>=0) { result = false; }
		else if(chaine.indexOf('.tz')>=0) { result = false; }
		else if(chaine.indexOf('.tj')>=0) { result = false; }
		else if(chaine.indexOf('.tf')>=0) { result = false; }
		else if(chaine.indexOf('.tl')>=0) { result = false; }
		else if(chaine.indexOf('.tel')>=0) { result = false; }
		else if(chaine.indexOf('.tg')>=0) { result = false; }
		else if(chaine.indexOf('.tk')>=0) { result = false; }
		else if(chaine.indexOf('.to')>=0) { result = false; }
		else if(chaine.indexOf('.tt')>=0) { result = false; }
		else if(chaine.indexOf('.tn')>=0) { result = false; }
		else if(chaine.indexOf('.tc')>=0) { result = false; }
		else if(chaine.indexOf('.tm')>=0) { result = false; }
		else if(chaine.indexOf('.tr')>=0) { result = false; }
		else if(chaine.indexOf('.tv')>=0) { result = false; }
		else if(chaine.indexOf('.td')>=0) { result = false; }
		else if(chaine.indexOf('.tw')>=0) { result = false; }
		else if(chaine.indexOf('.travel')>=0) { result = false; }
		else if(chaine.indexOf('.ua')>=0) { result = false; }
		else if(chaine.indexOf('.ug')>=0) { result = false; }
		else if(chaine.indexOf('.um')>=0) { result = false; }
		else if(chaine.indexOf('.uy')>=0) { result = false; }
		else if(chaine.indexOf('.uz')>=0) { result = false; }
		else if(chaine.indexOf('.us')>=0) { result = false; }
		else if(chaine.indexOf('.uk')>=0) { result = false; }
		else if(chaine.indexOf('.vu')>=0) { result = false; }
		else if(chaine.indexOf('.va')>=0) { result = false; }
		else if(chaine.indexOf('.ve')>=0) { result = false; }
		else if(chaine.indexOf('.vn')>=0) { result = false; }
		else if(chaine.indexOf('.vg')>=0) { result = false; }
		else if(chaine.indexOf('.vi')>=0) { result = false; }
		else if(chaine.indexOf('.vc')>=0) { result = false; }
		else if(chaine.indexOf('.wf')>=0) { result = false; }
		else if(chaine.indexOf('.ws')>=0) { result = false; }
		else if(chaine.indexOf('.ye')>=0) { result = false; }
		else if(chaine.indexOf('.yu')>=0) { result = false; }
		else if(chaine.indexOf('.zm')>=0) { result = false; }
		else if(chaine.indexOf('.zw')>=0) { result = false; }
		else if(chaine.indexOf('.za')>=0) { result = false; }

   
		return result
	}
      
   
	function isPhone(phoneNumber) {
		
		if(phoneNumber.substr(0,1)!='0') 			{ return false; }

		else if(phoneNumber.length != 10)			{ return false; }

		else if(phoneNumber.indexOf(' ')>=0)		{ return false; }
		else if(phoneNumber.indexOf(" ")>=0)		{ return false; }
		
		else if(phoneNumber.substr(1,1)=='0')  		{ return false; }
		else if(phoneNumber.indexOf('00000')>=0) 	{ return false; }
		else if(phoneNumber.indexOf('11111')>=0) 	{ return false; }
		else if(phoneNumber.indexOf('22222')>=0) 	{ return false; }
		else if(phoneNumber.indexOf('33333')>=0)	{ return false; }
		else if(phoneNumber.indexOf('44444')>=0) 	{ return false; }
		else if(phoneNumber.indexOf('55555')>=0) 	{ return false; }
		else if(phoneNumber.indexOf('66666')>=0) 	{ return false; }
		else if(phoneNumber.indexOf('77777')>=0) 	{ return false; }
		else if(phoneNumber.indexOf('88888')>=0) 	{ return false; }
		else if(phoneNumber.indexOf('99999')>=0) 	{ return false; }
		else if(phoneNumber.indexOf('012345')>=0) 	{ return false; }
		else if(countDistinctCharacters(phoneNumber) < 4) { return false; }
		else { return true;    }
	}
	
	function countDistinctCharacters(chaine) {
    var tmp = '';
    for (var i=0; i<chaine.length; i++) {
        var charEnCours = chaine.charAt(i);
        if(tmp.indexOf(charEnCours) < 0) { tmp = tmp + charEnCours; }
    }
    return tmp.length;
}



