/**
 * Fonction de débuggage à l'écran.
 * Mettre str='clear' pour effacer la zone de debug.
 * 
 * @param sting str
 */
function write(str) {
    myDiv = document.createElement('DIV');
    myDiv.innerHTML = str;
    
    debugBlock = document.getElementById('debug');
    
    if (!debugBlock ) {
        debugBlock = document.createElement('DIV');
        debugBlock.id = 'debug';
        
        with (debugBlock.style) {
            position = 'absolute';right = '5px';top = '5px';padding = '3px';
            width = "350px";minHeight = "150px";border = "1px solid #525D73";
            backgroundColor = "#DEEBF9";
        }
        
        document.getElementsByTagName('BODY')[0].appendChild(debugBlock);
    }
    
    nbDiv = debugBlock.getElementsByTagName('DIV').length;
    
    if (nbDiv % 2 == 0) myDiv.style.backgroundColor = '#BDD3EF';
    
    if (str == 'clear') debugBlock.innerHTML = '';
    else                debugBlock.appendChild(myDiv);
}



/* Gestion de la surbrillance de la ligne */

function mouseOverLigne(id)
{
	var elt = document.getElementById(id);	

	if (!findClass(elt, 'rowSelected') &&
		!findClass(elt, 'rowOver'))
	{
		removeClass(elt, 'row1');
		removeClass(elt, 'row2');
		addClass(elt, 'rowOver');
	}
}

function mouseOutLigne(id){
	var iIndexLigne;
	var elt = document.getElementById(id);
	iIndexLigne = document.getElementById(id).rowIndex % 2;

	if (!findClass(elt, 'rowSelected'))
	{
		if (iIndexLigne == 0)
		{
			removeClass(elt, 'rowOver');
			addClass(elt, 'row2');
		}
		else
		{
			removeClass(elt, 'rowOver');
			addClass(elt, 'row1');
		}
	}
}

function mouseClickSelection(idLigne, idTableau){
	var i;
	var iIndexLigne;
	
	var ligne = document.getElementById(idLigne);
	var tab   = document.getElementById(idTableau);

	for (i = 1 ; i < tab.rows.length ; i++) 
	{
    	if (!findClass(tab, 'rowSelected'))
    	{
			iIndexLigne = i % 2;
			if (iIndexLigne == 0) 
			{
				removeClass(tab.rows[i], 'row1');
				addClass(tab.rows[i], 'row2');
			} 
			else 
			{
				removeClass(tab.rows[i], 'row2');
				addClass(tab.rows[i], 'row1');
			}
		}
		else
			removeClass(ligne, 'rowSelected');
	}
	addClass(ligne, 'rowSelected');
}



/**
 * Problème Sous IE
 * Initialise l'objet calendar pour l'affichage d'un calendrier
 *
 * @param   string  id du conteneur
 * @return  void
 */
function initCal(nameOfInput){
    /*
        Attention les id's doivent respecter la casse et les régles suivant (cf exemple)
            Ex : <input ... id="dateEvt" />
                 <img   ... id="buttonDateEvt"/> ('button'
                                                + même id que le input (majuscule de la premier lettre de l'id de l'input)
    */
    var nameOfButton = "button";
    nameOfButton += nameOfInput[0].toUpperCase() + nameOfInput.substr(1, nameOfInput.length- 1);

    Calendar.setup({
        inputField : nameOfInput,  // id of the input field
        button     : nameOfButton  // trigger for the calendar (button ID)
    });
}



/**
 * test la validite d'une date
 * Vérifie qu'une date est bien saisie dans le format JJ/MM/AAAA
 * idDate   id du champs à tester
 * exmple d'appelle : <input type="text" id="myDate" onblur="checkDate(this);">
 */

function checkDate(idDate){

    //si chiffre < 10 passe un 0 devant
    function testChiffre(chiffre){
        if (chiffre < 10)
            return '0' + chiffre
        else
            return chiffre
    }

    var dDate;    // Utilisé pour générer un objet Date
    var nDate;    // Utilisé pour générer une référence temporelle numérique !

    var aDate;    // Tableau des éléments du champs de saisie séparés par de "/"


    // Messages d'erreur.
    var sErrFormat      = "La date doit être saisie dans le format JJ/MM/AAAA !";
    var sErrFormatJour  = "Le jour doit être compris entre 1 et 31 !";
    var sErrFormatMois  = "Le mois doit être compris entre 1 et 12!";
    var sErrFormatAnnee = "L'année doit être sur 4 chiffres !";

    // Suppression des espaces du début
    idDate.value = idDate.value.replace( /^s+/, "" );

    // Suppression des espaces de fin
    idDate.value = idDate.value.replace( /s+$/, "" );

    // Remplacement des espaces par des /
    idDate.value = idDate.value.replace( /s+/, "/" );
    idDate.value = idDate.value.replace( /s+/, "/" );
    idDate.value = idDate.value.replace( /s+/, "/" );

    idDate.ok = false;

    //cas d'une date vide
    if( idDate.value == "" ){
        idDate.ok = true;
        return true;
    }

    // Séparation des éléments de la date.
    aDate = idDate.value.split( "/" );

    // On vérifie qu'on a bien 3 éléments
    if( aDate.length != 3 ){
     // S'il n'y a pas de /, on découpe la chaine en 3 si sa longueur est 6 ou 8
        if( aDate.length == 1 ){
            if( idDate.value.length < 3 ){
                dDate = new Date();
                aDate[0] = idDate.value;
                aDate[1] = "" + ( dDate.getMonth() + 1 );
                aDate[2] = "" + dDate.getFullYear();
            }
            else
                if( idDate.value.length == 6 ){
                    aDate[0] = idDate.value.substr( 0, 2);
                    aDate[1] = idDate.value.substr( 2, 2);
                    aDate[2] = idDate.value.substr( 4, 2);
                }
                else
                    if( idDate.value.length == 8 ){
                        aDate[0] = idDate.value.substr( 0, 2);
                        aDate[1] = idDate.value.substr( 2, 2);
                        aDate[2] = idDate.value.substr( 4, 4);
                    }
                    else{
                        alert( sErrFormat );
                        return false;
                    }
        }
        else
        {
            alert( sErrFormat );
            return false;
        }
    }

    // On vérifie que c'est bien des nombres
    if( isNaN( aDate[0] ) ||  isNaN( aDate[1] ) || isNaN( aDate[2] )  ){
        alert(sErrFormat);
        return false;
    }

    // Vérification grossière sur le jour
    if( aDate[0] > 31 || aDate[0] < 1 ){
        alert( sErrFormatJour );
        return false;
    }

    // Vérification du mois
    if( aDate[1] > 12 || aDate[1] < 1 ){
        alert( sErrFormatMois );
        return false;
    }

    // Vérifier que l'année est bien sur 1, 2 ou 4 chiffres
    if( aDate[2].length != 1 && aDate[2].length != 2 && aDate[2].length != 4  ){
        //alert( aDate[2].length );
        alert( sErrFormatAnnee );
        return false;
    }

    // Si l'année est sur 1 ou 2 chiffres, on la remet sur 4
    if(aDate[2] < 50)
    {
    	// Attention, si on passe une valeur commençant par 0
    	// parseInt va fonctionner en base octale, il faut donc
    	// préciser le fonctionnement en décimal avec le second paramètre.
        aDate[2] = 2000 + parseInt(aDate[2], 10);
    }
    else
        if((aDate[2] >= 50) && (aDate[2] < 100))
        {
            aDate[2] = 1900 + parseInt(aDate[2], 10);
        }



    // Création d'une référence temporelle numérique à partir des élémentnt de la date
    nDate = Date.parse( aDate[1] + "/" + aDate[0] + "/" + aDate[2]  );

    // Vérification que la référence temporelle est une date valide
    if( isNaN( nDate ) ){
        alert( idDate.value + " n'est pas une date valide !" );
        return false;
    }
    else{
        // On renvoie la date formatée
        dDate = new Date( nDate )
        //idDate.value = dDate.getDate() + "/" + ( dDate.getMonth() + 1 ) + "/" + dDate.getFullYear();
        idDate.value = testChiffre(dDate.getDate()) + "/" + testChiffre((dDate.getMonth() + 1)) + "/" + dDate.getFullYear();
        idDate.ok = true;
        return true;
    }
}


/**
 * Permet d'écrire un cookie
 *
 * @param string  nom      Nom du cookie
 * @param string  valeur   Valeur du cookie
 * @param date             Facultatif date d'expiration
 * @param string           Facultatif chemin de validité du cookie
 * @param string           Facultatif domaine de validité du cookies
 * @param string           Facultatif si il existe le cookies sera envoyé que si https
 *
 * cf http://www.actulab.com/la-structure-des-cookies.php
 */
function writeCookie(nom, valeur){

    var argv = writeCookie.arguments;
    var argc = writeCookie.arguments.length;
    var expires =(argc > 2) ? argv[2] : null;
    var path    =(argc > 3) ? argv[3] : null;
    var domain  =(argc > 4) ? argv[4] : null;
    var secure  =(argc > 5) ? argv[5] : false;

    document.cookie = nom + "=" + escape(valeur)+
    ((expires == null) ? ""         : ("; expires=" + expires.toGMTString()))+
    ((path    == null) ? ""         : ("; path="   + path))                  +
    ((domain  == null) ? ""         : ("; domain=" + domain))                +
    ((secure  == true) ? "; secure" : "");
}


function getCookieVal(offset){

    var endstr = document.cookie.indexOf (";", offset);

    if (endstr == -1)
        endstr = document.cookie.length;

    return unescape(document.cookie.substring(offset, endstr));
}

/**
 * Permet de lire un cookie
 *
 * @param string  nom      Nom du cookie
 *
 * cf http://www.actulab.com/la-structure-des-cookies.php
 */
function readCookie(nom){

    var arg  = nom + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i    = 0;

    while (i < clen){
        var j = i + alen;
        if (document.cookie.substring(i, j) == arg)
            return getCookieVal(j);
        i = document.cookie.indexOf(" ",i) + 1;
        if (i == 0)
            break;
    }

    return null;
}

/**
 * Permet de supprimer un cookie
 *
 * @param string  nom      Nom du cookie
 *
 * cf http://www.actulab.com/la-structure-des-cookies.php
 */
function clearCookie(nom){
    date = new Date;
    date.setFullYear(date.getFullYear()-1);
    writeCookie(nom, null, date);
}



/**
 * procedure retrounant l'heure  en fonction d'un nombre de minute (90 minute -> 1H30)
 *
 * @param   integer  inHeure   => Le nombre d'heure
 * @return  string             => Heure sous la forme xxHxx (ex -> 23H05)
 *
 */
function minuteToMinuteHeure2(inMinute){
    if (inMinute == '')
        inMinute = 0;

    var outHeure  = Math.floor(inMinute / 60);
    var outMinute = inMinute - outHeure * 60;
    if (outHeure < 10)
        outHeure = '0' + outHeure;

    if (outMinute < 10)
        outMinute = '0' + outMinute;

    return outHeure + 'H' + outMinute;
}
/**
* procedure qui compare	2 dates
* attention, cette procedure ne test pas si les dates sont valides !
* les dates doivent etre au format FR '05/10/2005'
* return 1 -> dateA < dateB
* return 2 -> dateA > dateB
* return 0 -> dateA == dateB
*/
function dateCompare(dateA, dateB){
   //création d'un tableau ou je range la date début dans trois cases, si il y a des zero je les supprimme
	deb = new Array(3);
    if (dateA.substring(0,1)=="0")
    	deb[1]=parseInt(dateA.substring(1,2));
    else
        deb[1]=parseInt(dateA.substring(0,2));

   	if (dateA.substring(3,4)=="0")
        deb[2]=parseInt(dateA.substring(4,5));
    else
        deb[2]=parseInt(dateA.substring(3,5));

    deb[3]=parseInt(dateA.substring(6,10));



    fin = new Array(3);
    if (dateB.substring(0,1)=="0")
        fin[1]=parseInt(dateB.substring(1,2));
    else
        fin[1]=parseInt(dateB.substring(0,2));

    if (dateB.substring(3,4)=="0")
        fin[2]=parseInt(dateB.substring(4,5));
    else
	    fin[2]=parseInt(dateB.substring(3,5));

	fin[3]=parseInt(dateB.substring(6,10));

   //comparaison des dates
    if ((deb[3] == fin[3])&&(deb[2] == fin[2])&&(deb[1] == fin[1]))
    	return 0;
    else
    	if ((deb[3]< fin[3])||
		   ((deb[3]== fin[3])&&(deb[2]< fin[2]))||
		   ((deb[3]== fin[3])&&(deb[2]== fin[2])&&(deb[1]< fin[1])))
		   return 1;
        else
        	return 2;
}

//vérifie si la chaine envoyée est de type numérique
function isNumeric(sText, strict)
{
	var validChars = CST_NUMERIQUE;
	var isNumber   = true;
	var char;
	
	if ((strict != null) && (strict == false))
		validChars += '.';

	for (i = 0; i < sText.length && isNumber == true; i++)
	{
		char = sText.charAt(i);
		if (validChars.indexOf(char) == -1)
		{
			isNumber = false;
		}
	}
	return isNumber;
}



/**
 * Donne un nombre entier qui correspond à l'heure actuelle
 *
 * @return   integer   nombre correspondant à la date + heure
 *
 */
function dateInt() {

    var now = new Date();

    var h = now.getHours();
    var m = now.getMinutes();
    var s = now.getSeconds();

    return ( h * 60 * 60 ) + ( m * 60 ) + s;
}



/**
 * Met le code en pose durant un certain temps.
 *
 * @param      integer    timeStamp    intervalle en miliseconde (1000 = 1 seconde)
 *
 */
function sleep(timeStamp){

    timeStamp = ( timeStamp / 1000 );
    var Exp = dateInt() + timeStamp;

    while (Exp > dateInt());

}
