/***********************************************************************************************************
*																				*
*	Programmeur:	Daniel Rioux														*
*																				*
*	Date de création:	30 Août 2009														*
*																				*
*	Objet du script:	Valider les informations des champs des formulaires avant envoi au serveur web.				*
*																				*
***********************************************************************************************************/

/* --------------------------Classe formValidator-----------------------------

Bon, en gros ce que fait cette classe c'est tout simplement valider les champs d'un formulaire.

- Les propriétés :
	
	- setFormObject			Définit l'objet formulaire dont nous voulons valider les champs.
	- setRegExArea			Définit l'expression régulière à rechercher dans un code régional d'un numéro de téléphone
	- setRegExRegion			Définit l'expression régulière à rechercher dans un code de région d'un numéro de téléphone (Ex.: Amérique => Trois premier chiffres d'un numéro de téléphone entre le code régional et le tiret.)
	- setRegExPhone			Définit l'expression régulière à rechercher dans un numéro de téléphone (Ex.: Amérique => Les quatres derniers chiffres du numéro de téléphone.)
	- setRegExExtension		Définit l'expression régulière à rechercher dans un numéro de poste.
	- setEmailSuffix			Définit l'expression régulière pour la recherche dans le id du champ pour l'indication du champ de saisie d'adresse courriel
	- setAreaCodeSuffix		Définit l'expression régulière pour la recherche dans le id du champ pour le code régional d'un numéro de téléphone
	- setRegionCodeSuffix		Définit l'expression régulière pour la recherche dans le id du champ pour le code à trois chiffres d'un numéro de téléphone
	- setPhoneCodeSuffix		Définit l'expression régulière pour la recherche dans le id du champ pour le code à quatre chiffres d'un numéro de téléphone
	- setExtensionCodeSuffix	Définit l'expression régulière pour la recherche dans le id du champ pour le numéro d'extension (poste) de la personne à rejoindre
	- setTelephoneSuffix		Définit l'expression réguilère pour la recherche dans le id du champ l'indication que ce champ est un numéro de téléphone
	- setRequiredFieldPrefix	Définit l'expression régulière pour la recherche dans le id du champ pour l'indication d'un champ obligatoire
	- setServerSideScript		Script server side pour les échanges AJAX
	- setAcceptedFileTypes		Définit la liste des extensions de fichiers acceptés pour le téléversement de fichiers sur le serveur.
	
- Les méthodes :
	- execute				Lorsqu'appelée, fait la vérification des champs du formulaire en fonction des règles définies par les les propiétés précédentes
- Comment l'utiliser  :

	1. Dans un script ou une fonction javascript, déclarer une variable en tant que nouvel objet formValidator. Ex.: var myVar = new formValidator();
	2. Définir les propriétés souhaitées pour la vérification
	3. Appeler la méthode execute()

- Note

	En guise d'exemple, vous pouvez vous inspirer de la fonction submitForm() à la toute fin du fichier. Cet exemple démontre bien la façon de s'en servir.

-------------------------------------------------------------------------------------*/

function formValidator()
{

	//-----------------------------------Propriétés publiques-------------------------------------
	this.setFormObject 				= setFormObject;			//Définit l'objet formulaire à valider
	var FormObject;
	
	this.setRegExArea 				= setRegExArea; 			//Définit le format du code régional d'un numéro de téléphone
	var RegExArea;
	
	this.setRegExRegion				= setRegExRegion; 			//Définit le format du code de région d'un numéro de téléphone
	var RegExRegion;
	
	this.setRegExPhone				= setRegExPhone; 			//Définit le format du code de téléphone(4 chiffres en amérique du nord)
	var RegExPhone;
	
	this.setRegExExtension			= setRegExExtension; 		//Définit le format du numéro d'extension de téléphone
	var RegExExtension;
	
	this.setEmailSuffix				= setEmailSuffix; 			//Définit l'expression régulière pour la recherche dans le id du champ pour l'indication du champ de saisie d'adresse courriel
	var EmailSuffix;
	
	this.setAreaCodeSuffix			= setAreaCodeSuffix; 		//Définit l'expression régulière pour la recherche dans le id du champ pour le code régional d'un numéro de téléphone
	var AreaCodeSuffix;
	
	this.setRegionCodeSuffix		= setRegionCodeSuffix; 		//Définit l'expression régulière pour la recherche dans le id du champ pour le code à trois chiffres d'un numéro de téléphone
	var RegionCodeSuffix;
	
	this.setPhoneCodeSuffix			= setPhoneCodeSuffix; 		//Définit l'expression régulière pour la recherche dans le id du champ pour le code à quatre chiffres d'un numéro de téléphone
	var PhoneCodeSuffix;
	
	this.setExtensionCodeSuffix		= setExtensionCodeSuffix; 	//Définit l'expression régulière pour la recherche dans le id du champ pour le numéro d'extension de la personne à rejoindre
	var ExtensionCodeSuffix;
	
	this.setTelephoneSuffix			= setTelephoneSuffix;		//Définit l'expression réguilère pour la recherche dans le id du champ l'indication que ce champ est un numéro de téléphone
	var TelephoneSuffix;
	
	this.setRequiredFieldPrefix		= setRequiredFieldPrefix; 	//Définit l'expression régulière pour la recherche dans le id du champ pour l'indication d'un champ obligatoire
	var RequiredFieldPrefix;
	
	this.setServerSideScript		= setServerSideScript; 		//Script server side pour les échanges AJAX
	var ServerSideScript;
	
	this.setAcceptedFileTypes		= setAcceptedFileTypes;		//Définit la liste des extensions de fichiers acceptés pour le téléversement de fichiers sur le serveur.
	var AcceptedFileTypes;
	
	this.execute = validateFields;
	
	//---------------------------------------------------------------------------------------------------
	
	//Format d'une adresse de courriel
	var RegExEmail = /^[a-zA-Z0-9]((\.)?(-|_)*[a-zA-Z0-9]+){1,63}[^.]@[a-zA-Z0-9]((\.)?(-|_)*[a-zA-Z0-9]+){1,253}[^.](\.){1}[a-zA-Z]{2,4}$/;
	
	var EmailField;												//Champ courriel
	
	var FileUploadField;										//Champ de téléversement de fichiers vers le serveur web
	
	var TelephoneFields = new Array();							//Champs numéro de telephone
	
	var RequiredFields = new Array();							//Champs obligatoires
	
	//-----------------------------------------Affectation des valeurs aux propriétés-------------------------------------------------
	
	function setFormObject(Form)
	{
		FormObject = Form;
	}
	
	function setRegExArea(Format)
	{
		RegExArea = Format;
	}
	
	function setRegExRegion(Format)
	{
		RegExRegion = Format;
	}
	
	function setRegExPhone(Format)
	{
		RegExPhone = Format;
	}
	
	function setRegExExtension(Format)
	{
		RegExExtension = Format;
	}
	
	function setEmailSuffix(Suffix)
	{
		EmailSuffix = Suffix;
	}
	
	function setAreaCodeSuffix(Suffix)
	{
		AreaCodeSuffix = Suffix;
	}
	
	function setRegionCodeSuffix(Suffix)
	{
		RegionCodeSuffix = Suffix;
	}
	
	function setPhoneCodeSuffix(Suffix)
	{
		PhoneCodeSuffix = Suffix;
	}
	
	function setExtensionCodeSuffix(Suffix)
	{
		ExtensionCodeSuffix = Suffix;
	}
	
	function setTelephoneSuffix(Suffix)
	{
		TelephoneSuffix = Suffix;
	}
	
	function setRequiredFieldPrefix(Prefix)
	{
		RequiredFieldPrefix = Prefix;
	}
	
	function setServerSideScript(ScriptPath)
	{
		ServerSideScript = ScriptPath;
	}
	
	function setAcceptedFileTypes(FileExtensionList)
	{
		AcceptedFileTypes = FileExtensionList;
	}
	
	//--------------------------------------------------------------------------------------------------------------------------------------------
	
	function validateFields()
	{
		var Ajax = new clsAJAX();
		var ServerResult;
		var FieldsAreValid = true;
		var Message = "";
		
		if (EmailSuffix != "")
		{
			getEmailField();
		}
		
		if (TelephoneSuffix != "")
		{
			getTelephoneFields();
		}
		
		getFileField();
		getRequiredFields();
		
		if (RequiredFields.length > 0)
		{
			if (requiredIsEmpty())
			{
				Message += " - Il y a des champs obligatoires non remplis. \n";
				FieldsAreValid = false;
			}
		}
		
		if (FieldsAreValid)
		{
			if (EmailField != undefined)
			{
				if (!validateEmailFormat())
				{
					Message += " - Le format de l'adresse de courrier électronique est incorrect.\n";
					FieldsAreValid = false;
				}
			}
		}
		
		if (FieldsAreValid)
		{
			if (TelephoneFields.length > 0)
			{
				if (!validatePhoneNumbers())
				{
					Message += " - Le format d'un numéro de téléphone est incorrect.";
					FieldsAreValid = false;
				}
			}
			
		}
		
		if (FieldsAreValid)
		{
			if (FileUploadField != undefined)
			{
				if(!validateFileType())
				{
					Message += " - Le type de fichier à téléverser est invalide. Types acceptés : " + AcceptedFileTypes;
					FieldsAreValid = false;
					FileUploadField.disabled = "";
				}
			}
		}
		
		if (FieldsAreValid)
		{
			if (FileUploadField != undefined)
			{
				//MaxFileSize = ;

				ServerResult = Ajax.Get(ServerSideScript,"upload_error",FileUploadField.value,false);
				
				if (ServerResult != UPLOAD_ERR_OK)
				{
					//alert(ServerResult);
					
					switch(ServerResult)
					{
						case UPLOAD_ERR_INI_SIZE:
							alert(MSG_UPLOAD_GENERIC_SYSTEM_ERR);
						break;
						
						case UPLOAD_ERR_FORM_SIZE:
							alert(MSG_UPLOAD_GENERIC_FILE_SIZE);
						break;
						
						case UPLOAD_ERR_PARTIAL:
							alert(MSG_UPLOAD_PARTIAL);
						break;
						
						case UPLOAD_ERR_NO_FILE:
							alert(MSG_UPLOAD_GENERIC_SYSTEM_ERR);
						break;
						
						case UPLOAD_ERR_NO_TMP_DIR:
							alert(MSG_UPLOAD_GENERIC_SYSTEM_ERR);
						break;
						
						case UPLOAD_ERR_CANT_WRITE:
							alert(MSG_UPLOAD_GENERIC_SYSTEM_ERR);
						break;
						
						case UPLOAD_ERR_EXTENSION:
							alert(MSG_UPLOAD_EXTENSION);
						break;
						
						default:
							alert(ServerResult);
						break;
					}
					
					FormObject.upload.disabled = "";
				}
				else
				{
					sendForm();
				}
			}
			else
			{
				sendForm();
			}
			
		}
		else
		{
			alert(Message);
		}
	}
	
	//Tester le format d'une adresse courriel
	function validateEmailFormat()
	{	
		if (RegExEmail.test(EmailField.value))
		{
			return true;
		}
		else
		{
			if (EmailField.value != "")
			{
				EmailField.style.background = "#FFFF00";
				return false;
			}
			else
			{
				return true;
			}
		}
	}
	
	//Tester le format d'un numéro de téléphone
	function validatePhoneNumbers()
	{
		var IsValid = true;
		
		for (x = 0; x < TelephoneFields.length; x++)
		{
			for (y = 0; y < TelephoneFields[x].length; y++)
			{
				if (TelephoneFields[x][y] == undefined)
				{
					break;
				}
				
				if (AreaCodeSuffix.test(TelephoneFields[x][y].id))
				{
					if (!RegExArea.test(TelephoneFields[x][y].value))
					{
						TelephoneFields[x][y].style.background = "#FFFF00";
						IsValid = false;
					}
				}
				else if (RegionCodeSuffix.test(TelephoneFields[x][y].id))
				{
					if (!RegExRegion.test(TelephoneFields[x][y].value))
					{
						TelephoneFields[x][y].style.background = "#FFFF00";
						IsValid = false;
					}
				}
				else if (PhoneCodeSuffix.test(TelephoneFields[x][y].id))
				{
					if (!RegExPhone.test(TelephoneFields[x][y].value))
					{
						TelephoneFields[x][y].style.background = "#FFFF00";
						IsValid = false;
					}
				}
				else if (ExtensionCodeSuffix.test(TelephoneFields[x][y].id))
				{
					if (!RegExExtension.test(TelephoneFields[x][y].value))
					{
						TelephoneFields[x][y].style.background = "#FFFF00";
						IsValid = false;
					}
				}
				else
				{
				
				}
			}
		}
		
		return IsValid;
	}

	//Tester l'insertion de balisage dans des champs textes/textarea.
	function validateNoTagsIsInserted(Field)
	{

	}

	//Tester l'injection de code SQL dans des champs textes/textarea.
	function validateNoSQLIsInserted(Field)
	{

	}

	
	function validateFileType()
	{
		var IsValid = false;
		var File = FileUploadField.value;
		var FileExtension = File.substring(File.indexOf("."),File.length);
		
		for (i = 0; i < AcceptedFileTypes.length; i++)
		{
			if (FileExtension == AcceptedFileTypes[i])
			{
				IsValid = true;
			}
		}
		
		if (!IsValid)
		{
			FileUploadField.style.background = "#FFFF00";
		}
		
		return IsValid;
	}
	
	//Trouver le champ courriel
	function getEmailField()
	{
		for (i = 0; i < FormObject.elements.length; i++)
		{
			if (EmailSuffix.test(FormObject.elements[i].id))
			{
				EmailField = FormObject.elements[i];
				break;
			}
		}
	}
	
	function getFileField()
	{
		for (i = 0; i < FormObject.elements.length; i++)
		{
			if (FormObject.elements[i].type == "file")
			{
				FileUploadField = FormObject.elements[i];
				break;
			}
		}
	}
	
	//Trouver les champs obligatoires du formulaire
	function getRequiredFields()
	{
		var x = 0;
		
		for (i = 0; i < FormObject.elements.length ; i++)
		{
			if (RequiredFieldPrefix.test(FormObject.elements[i].id))
			{
				RequiredFields[x] = FormObject.elements[i];
				x++;
			}
		}	
	}
	
	//Trouver les champs de numéro de téléphone
	function getTelephoneFields()
	{
		var x = 0;
		var y = 0;
		
		for (i = 0; i < FormObject.elements.length; i++)
		{
			if (TelephoneSuffix.test(FormObject.elements[i].id))
			{
				if (TelephoneFields[x] == undefined)
				{
					TelephoneFields[x] = new Array();
				}
				
				if (AreaCodeSuffix.test(FormObject.elements[i].id))
				{
					TelephoneFields[x][y] = FormObject.elements[i];
					y++;
				}
				else if (RegionCodeSuffix.test(FormObject.elements[i].id))
				{
					TelephoneFields[x][y] = FormObject.elements[i];
					y++;
				}
				else if (PhoneCodeSuffix.test(FormObject.elements[i].id))
				{
					TelephoneFields[x][y] = FormObject.elements[i];
					y++;
				}
				else
				{
					if (ExtensionCodeSuffix != "")
					{
						if (ExtensionCodeSuffix.test(FormObject.elements[i].id))
						{
							TelephoneFields[x][y] = FormObject.elements[i];
							y++;
						}
					}
				}
			}
			
			if (TelephoneFields[x] != undefined)
			{
				if ((TelephoneFields[x].length == 3) || (TelephoneFields[x].length == 4))
				{
					x++;
				}
			}
		}
	}
	//Vérifier si un champ obligatoire est vide (true si c'est le cas, false sinon)
	function requiredIsEmpty()
	{
		var IsEmpty = false;
		
		for (i = 0; i < RequiredFields.length;  i++)
		{
			//alert(RequiredFields[i].value);
			if (RequiredFields[i].value == "")
			{
				document.getElementById(RequiredFields[i].id).style.background = "#FA401F";
				IsEmpty = true;
			}
			else
			{
				document.getElementById(RequiredFields[i].id).style.background = "#FFFFFF";
			}
		}
		
		return IsEmpty;
	}
	
	function sendForm()
	{
		var Ajax = new clsAJAX();
		var ServerResult;
		var PostNames = new Array();
		var PostValues = new Array();
		
		for (var i = 0 ; i < FormObject.elements.length ; i++)
		{
			switch(FormObject.elements[i].type)
			{
				case "radio":
					if (FormObject.elements[i].checked)
					{
						PostNames[i] = PostNames[i] = FormObject.elements[i].name;
						PostValues[i] = FormObject.elements[i].value;
					}
				break;
				
				case "checkbox":
					if (FormObject.elements[i].checked)
					{
						
						PostNames[i] = PostNames[i] = FormObject.elements[i].name;
						PostValues[i] = FormObject.elements[i].value;
						
					}
				break;
				
				case "select":
					if (FormObject.elements[i].options.selected == "selected")
					{
						PostNames[i] = PostNames[i] = FormObject.elements[i].name;
						PostValues[i] = FormObject.elements[i].options.value;
					}
				break;
				
				default:
					PostNames[i] = FormObject.elements[i].name;
					PostValues[i] = FormObject.elements[i].value;
				break;
			}
			
		}
		
		ServerResult = Ajax.Post(ServerSideScript,PostNames,PostValues,false);
		alert (ServerResult);
		
		for (var i = 0 ; i < FormObject.elements.length ; i++)
		{
			if ((FormObject.elements[i].type != "button") && (FormObject.elements[i].type != "reset"))
			{
				FormObject.elements[i].value ="";
			}
			
			if ((FormObject.elements[i].type == "radio") || (FormObject.elements[i].type == "checkbox"))
			{
				FormObject.elements[i].checked = "";
			}
			
			if (FormObject.elements[i].disabled)
			{
				FormObject.elements[i].disabled = "";
			}
		}
		//FormObject.submit();
	}
}

//Envoyer le formulaire sur le serveur web pour traitement des informations
function submitForm(Form)
{
	validator = new formValidator();
	
	with (validator)
	{
		setFormObject(Form);
		setRequiredFieldPrefix(/req/);
		setAreaCodeSuffix(/Area/);
		setRegionCodeSuffix(/Region/);
		setPhoneCodeSuffix(/Phone/);
		setTelephoneSuffix(/Code/);
		setExtensionCodeSuffix(/Ext/);
		setEmailSuffix(/Email/);
		setRegExArea(/^[2-9]{1}[0-9]{2}$/);
		setRegExRegion(/^[2-9]{1}[0-9]{2}$/);
		setRegExPhone(/[0-9]{4}/);
		setRegExExtension(/[0-9]{1,}/);
		setServerSideScript("scripts/php/ajax.php");
		setAcceptedFileTypes(Array(".pdf",".doc",".docx"));
		execute();
	}
}
