/*
	VALIDATOR
	
	Sert à valider un objet selon les règles passées en paramètre.
	
	S'utilise facile dans le HTML. Prend en paramètre l'objet à valider, 
	les règles et le libellé de l'élément à valider (pour l'affichage de
	messages)
	
	obj  : référence directe à l'objet (utiliser this)
	rule : ensemble de règles (nom_de_regle[->attribut+nom_de_regle ...])
	       Il n'y a aucune limite de règles. Utiliser le '+' pour séparer
		   les règles. La '->' sert uniquement pour identifier un attribut
		   précis pour une règle.
	node : libellé désirer pour l'élément à valider ('nom d'utilisateur')
	
	Retourne aucun résultats.	
*/
function validator(obj, rule, node)
{
	// Extraire les règles 
	var rules = rule.split("+");
	
	// Effectuer toutes les règles selon le 'dispatcher'
	var e = 0;
	for(var i=0; i<rules.length; i++)
	{
		var a = rules[i].split("->");
		
		// Traitement asynchrone
		if(a[0] == "rocket")
		{		
			rocketValidation(a[1], obj, rules, node);
			return;
		}
		else
		{
			if(!validatorDispatch(obj, rules[i], node))
				e++;
		}
	}
	
	// Afficher les erreurs et les succès
	if(e != 0)
		showErrorMarker(obj.id.substr(obj.id.indexOf("id_", 0) + 3), obj.className);
	else
		showSuccessMarker(obj.id.substr(obj.id.indexOf("id_", 0) + 3), obj.className);	
}

/*
	VALIDATOR DISPATCH
	
	Sert à distribuer l'élément à valider vers la bonne fonction de validation
	selon la règle utilisée.
	
	S'utilise à l'interne par la fonction VALIDATOR. Cette fonction défini la 
	règle à utiliser et prépare les attributs (s'il y en a). Dans le SWITCH, nous
	pouvons ajouter des règles de validations. 
	
	obj  : référence directe à l'objet. Proviens de la fonction VALIDATOR
	rule : La règle à valider (nom_de_regle[->attribut])
	node : libellé désirer pour l'élément à valider qui proviens de VALIDATOR
	
	Retourne 'TRUE' ou 'FALSE'.	
*/
function validatorDispatch(obj, rule, node)
{
	// Extraire une règle en détails
	var r = rule.split("->");
	
	// Attribution de l'action et de son paramètre
	var action = r[0];
	var attribute = null;
	
	if(r[1] != null)		
		attribute = r[1];	
	
	// Dispatch d'actions
	var err = "";
	
	switch(action)
	{
		// Traitement de REGEX
		case "lach": return lachValidation(attribute, obj.value, node);
		
		// Traitement pour champ identique
		case "sameAs": 
		{
			err = "Le champ '" + node + "' doit \352tre identique au champ \340 confirmer.";
			if(document.getElementById(attribute).value == obj.value)
			{
				removeMessage('id_messenger', err);
			    return true;
			}
			else
			{
				showMessage('id_messenger', err, 'error');
				return false;				
			}
		}
		
		// Traitement pour champs avec plus de x caractères
		case "lengthOver":
		{
			err = "Le champ '" + node + "' doit contenir plus de " + parseInt(attribute) + " caract\350res.";
		    if(obj.value.length > parseInt(attribute))
			{
				removeMessage('id_messenger', err);
			    return true;
			}
			else
			{
				showMessage('id_messenger', err, 'error');
			    return false;
			}
		}
	}
}

/*
	LACH VALIDATION
	
	Sert à valider des éléments plus textuelle selon l'attribut passé
	en paramètre.
	
	S'utilise à l'interne à partir de VALIDATOR DISPATCH. Si la règle
	est 'lach'. Le dispatch va envoyer l'attribut ici et le traiter.
	
	attribute : attribut à vérifier.
	value     : valeur de l'élément à valider.
	node      : libellé désirer pour l'élément à valider. 
	
	Retourne 'TRUE' ou 'FALSE'.
*/
function lachValidation(attribute, value, node)
{
	var err = "";
	
	switch(attribute)
	{
		// Validation alphanumérique
		case "alphanum": 
		{
		    var reg = /\W/g;
			err = "Le champ '" + node + "' ne doit contenir que les caract\350res autoris\351s, soit les lettres [a-Z], les chiffres [0-9] et les caract\350re de soulignement [_].";
			if(value.match(reg) != null)
			{
				showMessage('id_messenger', err, 'error');
			    return false;
			}
			else
			{
				removeMessage('id_messenger', err);
			    return true;
			}
		}
		
		// Validation d'une année
		case "validyear": 
		{
			var d = new Date();			

		    var max_year = d.getFullYear() + 10;
			var min_year = 1850;
			
			err = "Le champ '" + node + "' doit contenir une ann\351e valide.";
			
			if(value == "")
			{
				removeMessage('id_messenger', err);
			    return true;			
			}
			else
			{
				if(isNaN(value))
				{
					showMessage('id_messenger', err, 'error');
					return false;
				}
				else 
				{
					if(value > min_year && value < max_year)
					{
						removeMessage('id_messenger', err);
						return true;					
					}
					else
					{
						showMessage('id_messenger', err, 'error');
						return false;					
					}
				}
			}
		}		
		
		// Validation d'un champ non-vide
		case "notempty": 
		{
			err = "Le champ '" + node + "' ne doit pas \352tre vide.";
			if(value == "")
			{
				showMessage('id_messenger', err, 'error');
			    return false;
			}
			else
			{
				removeMessage('id_messenger', err);
			    return true;
			}
		}	
		
		// Validation d'une date
		case "date": 
		{
			err = "Le champ '" + node + "' ne contient pas une date valide.";
			
			var r = value.split("-");			
			var date = new Date(r[0], r[1] - 1, r[2]);			
			
			if(value == "")
			{
				removeMessage('id_messenger', err);
			    return true;
			}
			else
			{
				var r = value.split("-");			
				var date = new Date(r[0], r[1] - 1, r[2]);			
				if((r[2] == date.getDate()) && ((r[1] - 1) == date.getMonth()) && (r[0] == date.getFullYear()))
				{
					removeMessage('id_messenger', err);
					return true;				
				}
				else
				{
					showMessage('id_messenger', err, 'error');
					return false;				
				}
			}
		}		
		
		// Validation d'extension d'image
		case "imgext": 
		{
			err = "Le champ '" + node + "' doit contenir une image valide (JPG, JPEG, GIF, PNG, WBMP).";
			
			var ext = value.substr(value.lastIndexOf(".") + 1);
			
			if(value == "")
			{
				removeMessage('id_messenger', err);
			    return true;
			}
			else
			{
				if(ext.toUpperCase() == "JPG" || ext.toUpperCase() == "JPEG" || ext.toUpperCase() == "GIF" || 
				   ext.toUpperCase() == "PNG" || ext.toUpperCase() == "WBMP")
				{
					removeMessage('id_messenger', err);
					return true;				
				}
				else
				{
					showMessage('id_messenger', err, 'error');
					return false;				
				}
			}
		}		
	}
}


















function validateEntireForm()
{    
	var e = document.getElementsByTagName("td");
   
	for(var i=0; i<e.length; i++)   
	if(e[i].id != null)	   
		if(e[i].id.indexOf("id_validMarker", 0) != -1)		   
			if(e[i].className != "ico-success")
			{
				alert("Veillez remplir les champs correctement.");
				return false;
			}		   	     
	
	// S'il y a une boite à cocher d'acceptation, vérifier son état
	if(document.getElementById('id_iagree') != null)			
		if(!document.getElementById('id_iagree').checked)
		{
			alert("Vous devez comprendre l'implication du processus pour continuer.");
			return false;
		}			
	
	return true;
}





// c = id du container qui va avoir le response
// f = filename php
// p = param a envoyer
// r = reload links
function rocketChangeContainer(c, f, p, r)
{
	if(typeof(r) == 'undefined')
		r = false;
		
	// Obtenir l'object XML
	xmlhttp = rocket();
	
	if (xmlhttp == null)
		return;
	
	var url = "js/rocketlach/requests/" + f + ".php";
		
	url = url + "?param=" + p;
	url = url + "&sid=" + Math.random();
	
	xmlhttp.onreadystatechange = function() 
	{ 
		// Si chargement terminé
		if(xmlhttp.readyState == 4) 
		{
			if(exist(c))							
				document.getElementById(c).innerHTML = xmlhttp.responseText;
			
			if(r)
				InitCalendarLinks();
		}
	}	

	xmlhttp.open("GET", url, true);
	xmlhttp.send(null);
}




		












/*

	ROCKET VALIDATION FUNCTIONS
	- rocketValidation(action, attribut)
      Permet de valider avec un traitement asyncrone PHP. L'attribut est le fichier
	  PHP qui doit retourner un booléan.

*/
function rocketValidation(attribute, obj, rules, node)
{
	// Attribution du chemin
	var filename = "js/rocketlach/requests/" + attribute + ".php";
	
	// Attribution d'un objet XML et validation
	var e = 0;
	var xml = null;
	xml = rocket();
	if(xml == null)
	    return;
		
	// Effectuer toutes les règles selon le 'dispatcher'
	for(var i=0; i<rules.length; i++)
	{
		var a = rules[i].split("->");
		
		if(a[0] != "rocket")					
			if(!validatorDispatch(obj, rules[i], node))
				e++;				
	}		
	
	if(e == 0)
	{		
		// Ouverture de la connexion
		xml.open("POST", filename, true);
		
		// Afficher le chargement
		if(document.getElementById("id_validMarker_" + obj.name) != null)
			if(document.getElementById("id_validMarker_" + obj.name).className != "ico-loading")
				document.getElementById("id_validMarker_" + obj.name).className = "ico-loading";
		
		// Traitement
		xml.onreadystatechange = function() 
		{ 
			// Si chargement terminé
			if(xml.readyState == 4) 
			{ 
				// Charge le texte			
				var temp = xml.responseText;	
				var results = temp.split("%");	

				if(results[0] == "true")
				{
					if(results[1] != null)
						removeMessage('id_messenger', results[1]);	
				}
				else
				{
					if(results[1] != null)
						showMessage('id_messenger', results[1], 'error');
						
					e++;
				}
				
				// Afficher les erreurs et les succès
				if(e != 0)
					showErrorMarker(obj.id.substr(obj.id.indexOf("id_", 0) + 3), obj.className);
				else
					showSuccessMarker(obj.id.substr(obj.id.indexOf("id_", 0) + 3), obj.className);			
				
			}		    
		}

		var data = obj.name + "=" + obj.value; 

		xml.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xml.send(data);
	}
	else	
		showErrorMarker(obj.id.substr(obj.id.indexOf("id_", 0) + 3), obj.className);	
}

function rocket()
{
	// code for IE7+, Firefox, Chrome, Opera, Safari
	if(window.XMLHttpRequest)
		return new XMLHttpRequest(); 

	// code for IE6, IE5   
	else if(window.ActiveXObject) 
		return new ActiveXObject("Microsoft.XMLHTTP"); 
	else 
	{ 
		alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
		return null; 
	} 
}
