/**
 * Fonction : Event Handlers
 * Description : Fonction permettant d'attacher des actions (fonctions Javascript) à des évènements.
 * Cette fonction a été créée à partir de celles de Scott Andrew LePera (http://www.scottandrew.com/weblog/articles/cbs-events),
 * Simon Willison (http://simon.incutio.com/archive/2004/05/26/addLoadEvent) et du commentaire 
 * de Mark Wubben (http://simon.incutio.com/archive/2004/05/26/addLoadEvent#comment2)
 * Les techniques de chacun des auteurs ont été adaptées afin de fonctionner de façon homogène et d'assurer la compatibilité
 * avec un maximum de navigateur (style W3C / netscape mozilla, Internet Explorer, et autres).
*/
function addEvent(obj, evType, fn, useCapture)
{
	/* Attachement d'évènements standard w3c dom (netscape / mozilla / safari 1.2) */
	if (obj.addEventListener)
	{
		obj.addEventListener(evType, fn, useCapture);
		return true;
	}
	else 
	{
		/* Attachement d'évènements Internet Explorer */
		if (obj.attachEvent)
		{
			var r = obj.attachEvent("on" + evType, fn);
			return r;
		}
		else 
		{
			/* Attachement d'évènements navigateurs non compatibles (safari 1.0, etc.) */
			var buffer = obj["on" + evType];
			if (typeof buffer != "function") {
				obj["on" +evType] = fn;
			}
			else
			{
				obj["on" +evType] = function() {
										buffer();
										fn();
									}
			}
		}
	}
};

function backToTop() {
    var x1 = x2 = x3 = 0;
    var y1 = y2 = y3 = 0;

    if (document.documentElement) {
        x1 = document.documentElement.scrollLeft || 0;
        y1 = document.documentElement.scrollTop || 0;
    }

    if (document.body) {
        x2 = document.body.scrollLeft || 0;
        y2 = document.body.scrollTop || 0;
    }

    x3 = window.scrollX || 0;
    y3 = window.scrollY || 0;

    var x = Math.max(x1, Math.max(x2, x3));
    var y = Math.max(y1, Math.max(y2, y3));

    window.scrollTo(Math.floor(x / 2), Math.floor(y / 2));

    if (x > 0 || y > 0) {
        window.setTimeout("backToTop()", 25);
    }
};

function egalize(element1, element2)
{
	if ($(element1) && $(element2))
	{
		var iElem1Height	=	Element.getHeight(element1);
		var iElem2Height	=	Element.getHeight(element2);

		// Ie et le min-height ... un vrai bonheure.
	
   		if (iElem1Height > iElem2Height)
   		{
   			$(element2).style.minHeight	=	iElem1Height + "px";
   			$(element1).style.minHeight	=	iElem1Height + "px";
   		}	
   		else
   		{
   			$(element1).style.minHeight	=	iElem2Height + "px";
   			$(element2).style.minHeight	=	iElem2Height + "px";
   		}
	}
};

/**
 * ----------------------------------------------------------------------
 * Fonction de validation de formulaire.
 */
var FormValidatorElements	=	new Array();

var FormValidator = {
	
	// Initialisation du système.
	init:
	function()
	{
		var formsList		=	document.getElementsByTagName("form");
		for (var i = 0; i < formsList.length; i ++) {
    		if (Element.hasClassName(formsList.item(i), "FormValidator"))
			{
				formsList.item(i).onsubmit  =   function() { return FormValidator.validate(this); };
			}
		}
	},
	
	// Vérification des champs.
	validate:
	function(oForm)
	{
		// Booléen à false si aucune erreur n'a été trouvée dans le formulaire.
		var isError		=	false;

		// Booléen à false si aucun champ n'a pris le focus.
		var isFocus		=	false;

		// Champs du formulaire déjà traités.
        var fieldsDone  =   '';
		
		// Recherche de tous les champs cachés dont le nom est "FormValidator[]".
		var elementsList  =   oForm.getElementsByTagName("input");
		for(var i = 0; i < elementsList.length; i ++)
		{
            if (elementsList.item(i).getAttribute("type") == "hidden" && elementsList.item(i).getAttribute("name") == 'FormValidator[]')
			{
                var oValidator          =    eval('(' + $F(elementsList.item(i)) + ')');    // JSON roxor
                var validatorFunction   =    eval('this.' + oValidator.check_type);

                if (fieldsDone.indexOf('{' + oValidator.field + '}') > -1) {
                    continue;   
                }
                
                try {
				FormValidator.cleanError(oValidator);
				
				if (! validatorFunction(oValidator)) 
   				{
   				    fieldsDone              =   fieldsDone + '{' + oValidator.field + '}';
   					isError				=	true;
   					if (! isFocus) {
   						isFocus			=	true;
   						new Field.focus(oValidator.field);	
   						new Field.select(oValidator.field);
   					}
   					FormValidator.showError(oValidator);
   				}
                }
                catch(error) {
                    continue;
                };
			}
		}
		document.location.hash	=	"#";     // On se position en haut de page.
		return ! isError;
	},
	
	cleanError: function(oValidator)
	{
		// ----------------------------------------------------------------------
		// Remise à "blanc" de l'affichage.
		// ----------------------------------------------------------------------
		// Recherche du conteneur parent pour la suppression du style "error".
		var oParagrapheParent	=	$(oValidator.field).parentNode;
		/*
		while (oParagrapheParent && oParagrapheParent.tagName != 'P') {
			oParagrapheParent	=	oParagrapheParent.parentNode;
		}
		*/
		Element.removeClassName(oParagrapheParent, 'error');
		
		// Suppression du message d'erreur si celui-ci existe.
		if (oErrorElement = $("FormValidatorError_" + oValidator.field)) {
			Element.remove(oErrorElement);
		}
	},
	
	// execute
	showError: function(oValidator)
	{
		// Message d'erreur par défault. (deprecated)
		if (oValidator.error_msg == undefined)
		{
			oValidator.error_msg =   "Attention, ce champ est obligatoire et n'a pas été renseigné correctement.";
		}
				
		// ----------------------------------------------------------------------
		// Mise en avant des erreurs de sasie.
		// Le paragraphe sera mis en avant avec la classe CSS error.
		// Un message d'erreur apparaitra sous le champs.
		// ----------------------------------------------------------------------
		var oParagrapheParent	=	$(oValidator.field).parentNode;
		/*
		while (oParagrapheParent && oParagrapheParent.tagName != 'P') {
			oParagrapheParent	=	oParagrapheParent.parentNode;
		}
		*/
		if (oValidator.error_msg != "")
		{
			new Insertion.Bottom(oParagrapheParent, "<div id=\"FormValidatorError_" + oValidator.field + "\" class=\"error\">" + oValidator.error_msg + "</div>");
 			new Element.addClassName(oParagrapheParent, 'error');
		}
	},
	
	
	// ----------------------------------------------------------------------
	// Fonctions "plug-ins"
	// ----------------------------------------------------------------------
	
	// Validation d'une adresse email.
	isEmail: function(oValidator)
	{
		var fieldValue    =   $F(oValidator.field);
		var oRegExp       =   /^[-_A-Za-z0-9]+(\.[-_A-Za-z0-9]+)*@[-A-Za-z0-9]+(\.[-A-Za-z0-9]+)+$/;
		return oRegExp.test(fieldValue);
	},
	
	// Validation d'un texte.
	isText: function(oValidator)
	{
		fieldValue    =   $F(oValidator.field);
		if (fieldValue != "") {
            return true;
		}
		return false;
	},

	// Validation d'un texte.
	isIdem: function(oValidator)
	{
        field1Value     =   $F(oValidator.field);
        field2Value     =   $F(oValidator.field_comparison);
        if (field1Value != '' && field1Value == field2Value) {
            return true;
        }
		return false;
	},
	
	// Validation d'une date : format français.
	isDateFr: function(oValidator)
	{
        var fieldValue  =   $F(oValidator.field);
        var oRegExp     =   /^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/;
	    return oRegExp.test(fieldValue);
	},
	
	// Validation d'un alpha numérique.
	isAlphaNum: function(oValidator)
	{
        var fieldValue  =   $F(oValidator.field);
        var oRegExp     =   /^[0-9a-zA-Z_-]+$/;
        return oRegExp.test(fieldValue);
	},
	
	// Validation d'un entier.
	isInteger: function(oValidator)
	{
        var fieldValue  =   $F(oValidator.field);
        var oRegExp     =   /^[0-9]+$/;
	    return oRegExp.test(fieldValue);
	}
}

addEvent(window, "load", FormValidator.init);




/**
 * Positionne le libellé d'un champ de formulaire dans le champ en question.
 * Cette fonction ne prend en charge que les champs "input text" et les "textarea".
 * Nécessite la bibliothèque Prototype.
 */
function labelInField(labelId)
{
    // Récupération du libellé et de sa valeur.
    var oLabel  =   $(labelId);
    var sLabel  =   oLabel.firstChild.nodeValue;

    // Récupération du champ de formulaire grace à l'attribut "for" du libellé.
    if (oLabel.getAttribute('for') != null) {
        var oField  =   $(oLabel.getAttribute('for'));
    }
    else if (oLabel.getAttribute('htmlFor') != null) {  
        var oField  =   $(oLabel.getAttribute('htmlFor'));  // Bidouille pour IE ... comme d'hab.
    }
    else {
        return false;
    }

    // Initialisation de la valeur par défaut du champ (c'est le contenu de la l'élément label associé).
    if ($F(oField) == '') {
        oField.value    =   sLabel;
        new Element.addClassName(oField, 'labelIn');
    }

    // L'élément "label" est masqué maintenant que son contenu est dans le champ.
    new Element.hide(oLabel);

    // Sur le focus du champs, on supprime la sélection si c'est le texte initilialisé plus haut.
    oField.onfocus      =   (function(sLabel) { return function() {
        if (this.value == sLabel)    {
            this.value = '';
            new Element.removeClassName(oField, 'labelIn');
        }
    }})(sLabel);

    // Sur la perte du focus, on affiche le label si il n'y a rien de saisi.
    oField.onblur   =   (function(sLabel) { return function() {
        if (this.value == '')    {
            this.value = sLabel;
            new Element.addClassName(oField, 'labelIn');
        }
    }})(sLabel);
};

function onlyJavascript() {
	var aElements	=	document.getElementsByClassName('onlyJavascript');
	
	for(var i = 0; i < aElements.length; i ++)
	{
		aElements[i].className	=	aElements[i].className.replace('onlyJavascript',"");
		new Element.show(aElements[i]);
	}
};
addEvent(window, 'load', onlyJavascript);

/**
 * Fonction d'ouverture d'un popup centré sur la fenêtre du navigateur (et non par rapport à l'écran !)
 * @author : Julien Fredon @ imaginance
 */
function popupThis(link, iWidth, iHeight, sOptions)
{	
	// Récupération de l'url spécifié dans le href du lien.
	sUrl	=	link.href;
	
	
    // Calcul de la position du popup (centré)
    var screenX;
    var screenY;
    var popupWidth      =   iWidth;
    var popupHeight     =   iHeight;
    if (sOptions == undefined || sOptions == "")
    {
    	sOptions	=	"resizable=yes,scrollbars=yes";
    }
    var options         =   sOptions;
            		   
	// Calcul de la position de la fenêtre du navigateur.
    if (window.screenX)	// Pour Mozilla & Co.
    {
        screenX =   window.screenX;
        screenY =   window.screenY;
        screenY =   screenY + 80;
    }
    else // Pour IE & Co.
    {
        screenX =   window.screenLeft;
        screenY =   window.screenTop;
    }
            			 
	// Calcul de la position du popup.
    popupTop    =   parseInt((document.documentElement.clientHeight / 2) - (popupHeight / 2) + screenY);
    popupLeft   =   parseInt((document.documentElement.clientWidth / 2) - (popupWidth / 2) + screenX);

	// Spécial Opéra qui considère clientHeight comme la hauteur total du document et non de la fenêtre.
	if (navigator.userAgent.indexOf("Opera") > -1)
	{
		popupTop    =   50 + screenY;
	    popupLeft   =   parseInt((document.documentElement.offsetWidth / 2) - (popupWidth / 2) + screenX);
	}
	
	// Ajout du parametre renderMode=plopup à l'url
	sUrl		=	sUrl + ((sUrl.indexOf("?") > -1) ? '&' : '?') + "renderMode=popup";
	

    // Ouverture du popup.
    oPopup      =   window.open(sUrl, "_blank", "top=" + popupTop + ",left=" + popupLeft + ",width=" + popupWidth + ",height=" + popupHeight + "," + options);
    return false;
};

/**
 * Fonction de mise en place du comportement des liens :
 * - liens internes -> ouverture dans la même fenêtre de navigation ;
 * - liens externes -> ouverture dans une nouveau fenêtre.
 */
function setLinksBehavior() {
	
	var sSiteLocal	=	document.location.protocol + "//" + document.location.host;

	// Les navigateurs sous os Apple ne semblent pas très réceptifs à ce script.
	if(navigator.userAgent.indexOf('Mac') != -1)
	{
		return false;
	}
		   
	// Parcours des liens du site pour modifier le comportement (ouverture d'un nouveau navigateur)
	// de ceux pointant vers des sites externes.
	var aLinks 	= 	document.getElementsByTagName('a');
	for (var i = 0 ; i < aLinks.length ; i ++) {
		if (aLinks.item(i).href.substr(0, 7) == "http://" && aLinks.item(i).href.substr(0, sSiteLocal.length) != sSiteLocal)
		{
			aLinks.item(i).target	=	"_blank";
		}
		if (aLinks.item(i).className.indexOf('externalLink') != -1)
		{
			aLinks.item(i).target	=	"_blank";
		}
	}
}
addEvent(window, 'load', setLinksBehavior);


