/**
 * @class Bibliotheque
 * Bibliothèque de fonctions utiles
 *
 * @note          Copyright(C) CCI.fr SAS, 2004
 * @author        Olivier GUILLOUX <olivier.guilloux@entreprise.cci.fr>
 * @author        Florent LAOT <f.laot@entreprise.cci.fr>,
 * @author        François DE FAUCAL <f.juindefaucal@entreprise.cci.fr>
 * @version       $Revision: 4280 $
 * @date          $Date: 2007-11-19 15:17:42 +0100 (lun, 19 nov 2007) $
 */

/**
 * Renvoyer l'élément du document correspondant à l'identifiant
 * passé en paramètre
 *
 * @param p_id : Identifiant de l'élément à retourner
 */
function B_getById(p_id) {
   return document.getElementById(p_id);
}

/**
 * Modifier le mode d'affichage de l'élément.
 *
 * @param p_object : Elément dont on veut modifier le mode d'affichage
 *
 * @param p_value : Mode d'affichage ('inline', 'block', 'none', ...)
 */
function B_setDisplay(p_object, p_value) {
    p_object.style.display = p_value;
}

/**
 * Masquer l'élément
 *
 * @param p_object : Elément qu'on veut masquer
 */
function B_setDisplayNone(p_object) {
    this.setDisplay(p_object, "none");
}

/**
 * Afficher l'élément en mode ligne
 *
 * @param p_object : Elément dont on veut modifier le mode d'affichage
 */
function B_setDisplayInline(p_object) {
    this.setDisplay(p_object, "inline");
}

/**
 * Afficher l'élément en mode bloc
 *
 * @param p_object : Elément dont on veut modifier le mode d'affichage
 */
function B_setDisplayBlock(p_object) {
    this.setDisplay(p_object, "block");
}

/**
 * Redéfinir la classe de style d'un élément
 *
 * @param p_object : Element HTML sur lequel appliquer le style
 *
 * @param p_classe : Classe de la feuile de style
 */
function B_setClass(p_object, p_class) {
    p_object.className = p_class;
}

/**
 * Retourner la liste des balises enfants de l'élément fourni ayant le type
 * indiqué.
 *
 * @param p_object : Elément parent
 *
 * @param p_tagName : Type de balise (INPUT, P, UL, LI, ...)
 */
function B_getListByTag(p_object, p_tagName) {
    return p_object.getElementsByTagName(p_tagName);
}

/**
 * Ajouter un enfant à un objet de type selection
 *
 * @param p_parentObject : Objet parent
 *
 * @param p_childObject : Objet enfant
 */
function B_appendChild(p_idParentObject, p_childObject) {
    // Récupère les objets a partir de leur id
    parentObject = lib.getById(p_idParentObject);

    //
    typeElement = p_childObject.nodeName;

    if ( typeElement == "OPTGROUP" ) {
        parentObject.appendChild(p_childObject);
    } else if( typeElement == "OPTION" ) {
        longueur = parentObject.options.length;
        parentObject.options[longueur] = p_childObject;
    }

}

/**
 * Remplacer un enfant à un objet de type selection
 *
 * @param p_parentObject : Objet parent
 *
 * @param p_childObject : Objet enfant
 */
function B_replaceChild(p_idParentObject, p_childObject, p_index) {
    // Récupère les objets a partir de leur id
    parentObject = lib.getById(p_idParentObject);
    typeElement = p_childObject.nodeName;

    if ( typeElement == "OPTGROUP" ) {
        listeGroupes = parentObject.getElementsByTagName("OPTGROUP");
        listeGroupes[p_index] = p_childObject;
    } else if( typeElement == "OPTION" ) {
        listeOptions = parentObject.getElementsByTagName("OPTION");
        listeOptions[p_index] = p_childObject;
    }
}

/**
 * Copier un tableau
 *
 * @param p_tab : Tableau à copier
 */
function B_copierTableau(p_tab) {
    var copie = new Array();

    for ( var i = 0; i < p_tab.length; i++ ) {
        cle = p_tab[i].value;
        copie[cle] = p_tab[i].text;
    }

    return copie;
}

/**
 * Renvoies la valeur comparable d'un élément de sélection
 *
 * @param p_element : Element de sélection -OPTION- ou -OPTGROUP-
 */
function B_getValueToCompare(p_element) {
    // Récupère le type de l'objet à comparer
    var typeElement = p_element.nodeName;
    
    // Récupère la valeur de l'objet à comparer
    var valeur = "";
    
    // Cas de balises -OPTGROUP-
    if ( typeElement == "OPTGROUP" ) {    
        // Récupère l'identifiant
        if (typeof p_element.id != 'undefined') {
	    valeur = p_element.id.toLowerCase();

	    // Cas particulier des cantons et EPCI (localisations filtrées)
	    valeur = valeur.replace("valeurslocalisation", "");
	    
	    // Cas particulier des NAF filtrés
	    valeur = valeur.replace("valeursactivites", "");
	    
    	    // Cas particulier des CPF filtrés
	    valeur = valeur.replace("valeurscpf", "");
	    var decomposition = valeur.split("_");
	    
	    if (typeof decomposition[1] != 'undefined') {
		/* (yassine) 00000 est une mauvaise valeur, j'ai perdu 1,5 jours pour comprendre pourquoi les metiers
		 * n'étaient pas groupés dans leur optgroup. C'est parcequ'une option metier commence par '(', et que 
		 * '(' < 0, donc, le tri se fait mal. La plus petite valeur possible est ' ' (32).
		 */
		
		valeur = valeur.split("_")[1] + "_     ";
	    } else {
		valeur = valeur.split("_")[0] + "_     ";
	    }
	}
	// Cas de balises -OPTION-
    } else if( typeElement == "OPTION" ) {
        // Récupère la famille
        famille = p_element.value.split("_")[0].toLowerCase();
	
        // Cas particuliers des saisies libres
        famille = famille.replace(/[0-9]/, "");
	
        // Récupère la valeur
        valeur = p_element.text.toLowerCase();

        // Cas particulier de la Corse
        deuxCaracteres = valeur.substring(0,2);

        if(deuxCaracteres == "2a") {
            valeur = valeur.replace(/2a/, "20");
	}
        if(deuxCaracteres == "2b") {
            valeur = valeur.replace(/2b/, "20");
	}
	
        // Cas particulier des effectifs
        quatreCaracteres = valeur.substring(0,4);
        if(quatreCaracteres == "0 sa") {
            valeur = valeur.replace(/0/, "00001");
	}
        if(quatreCaracteres == "1 - ") {
            valeur = valeur.replace(/1/, "0001");
	}
        if(quatreCaracteres == "10 -") {
            valeur = valeur.replace(/1/, "0010");
	}
        if(quatreCaracteres == "100 ") {
            valeur = valeur.replace(/1/, "0100");
	}
        if(quatreCaracteres == "20 -") {
            valeur = valeur.replace(/20/, "0020");
	}
        if(quatreCaracteres == "200 ") {
            valeur = valeur.replace(/200/, "0200");
	}
        if(quatreCaracteres == "3 - ") {
            valeur = valeur.replace(/3/, "0003");
	}
        if(quatreCaracteres == "50 -") {
            valeur = valeur.replace(/50/, "0050");
	}
        if(quatreCaracteres == "500 ") {
            valeur = valeur.replace(/500/, "0500");
	}
        if(quatreCaracteres == "6 - ") {
            valeur = valeur.replace(/6/, "0006");
	}
        
        // Supprime les espaces
        valeur = valeur.replace(/\s/, "");
	
        // Ajoute l'identifiant de la famille
        valeur =  famille + "_" + valeur;
    }
    
    if (valeur.substring(0, 29) == "donneeschiffreescapitalsocial") {
        var tableau = valeur.split("_");
        valeur = "donneeschiffreescapitalsocial_" + tableau[1];
    }
    if (valeur.substring(0, 16) == "infodatecreation") {
        var tableau = valeur.split("_");
        valeur = "infodatecreation_" + tableau[1];
    }

    // Retourne la valeur de l'objet
    return valeur;
}

/**
 */
function compare(maximum, minimum) {
    if (lib.getValueToCompare(maximum) >= lib.getValueToCompare(minimum) ) {
        return 1;
    }
    else {
        return -1;
    }
}

/**
 * Eliminer ou remplacer les caractères spéciaux
 *
 * @param p_chaine: Chaine de caractères à normaliser
 */
function B_normaliser( p_chaine ) {
    var retour = "";

    // Suppression des apostrophes
    retour = retour.replace("d'", "");
    retour = retour.replace("l'", "");

    // Définit les caractères à conserver
    var caracteresAConserver =
        "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    // Recherche et élimine ou remplace les caractères particuliers
    for (var i = 0; i < p_chaine.length; i++) {
        var c = p_chaine.charAt(i);
        var code = p_chaine.charCodeAt(i);

        var estAConserver = caracteresAConserver.indexOf(c);

        // Remplace les caractères accentués
        if (estAConserver == -1) {
            //alert(code + c);

            if(code == 233 || code == 232 || code == 234 || code == 235) {
                retour += "e";
            }
            else if (code == 244)
                retour += "o";
            else if (code == 224)
                retour += "a";
            else if (code == 249)
                retour += "u";
            else {
                retour += "*";
            }
        }
        else retour += c;
    }

    //alert(retour);
    return retour;
}

/**
 * Compare deux dates
 *
 * @param p_date1
 * @param p_date2
 *
 * @return 0 si identique, 1 si date1 > date2, 2 si date1 < date2, 3 si mauvais
 * format d'entrée
 */
function B_comparerDates(p_date1, p_date2) {
    var date1 = Date.parse(p_date1);
    var date2 = Date.parse(p_date2);

    if (date1 == date2) {
        return 0;
    } else if (date1 > date2) {
        return 1;
    } else if (date1 < date2) {
        return 2;
    } else {
        return 3;
    }
}

/**
 * Convertit une chaine de caractères en date
 *
 * @param p_chaine: Chaine à convertir
 *
 * @return date au format JavaScript
 */
function B_chaineEnDate(p_chaine) {
    var tab = p_chaine.split('/');
    var date = new Date(tab[2], tab[1]-1, tab[0]);
    return date;
}

/**
 * Convertit une date en chaine de caractères
 *
 * @param p_date: date au format JavaScript
 *
 * @return chaine de caractères de la forme jj/mm/aaaa
 */
function B_dateEnChaine(p_date) {
    var jour = "" + p_date.getDate();
    if (jour.length < 2) {
        jour = "0" + jour;
    }

    var mois = "" + (p_date.getMonth() + 1);
    if (mois.length < 2) {
        mois = "0" + mois;
    }

    var annee = p_date.getYear();
    if(annee < 999) {
        annee += 1900;
    }

    var valeurDate = jour + "/" + mois
        + "/" + annee;

    return valeurDate;
}

/**
 * Détermine si la chaine de caractères représentant une date est bien au
 * format jj/mm/aaaa
 */
function B_formatDateIncorrect(p_chaine) {
    var messageErreur = "";
    var tableau = p_chaine.split('/');

    // Vérifie que l'année est à 4 chiffres
    if (tableau[2].length != 4) {
        messageErreur  = "Veuillez saisir l'année sur 4 chiffres au";
        messageErreur += " format JJ/MM/AAAA";
        return messageErreur;
    }

    return messageErreur;
}

/**
 * Script original sur :
 * http://aktuell.de.selfhtml.org/artikel/javascript/utf8b64/utf8.htm
 */
function Bibliotheque_encoderEnUTF8(p_texte) {
	// Normalise les saut de lignes
	p_texte = p_texte.replace(/\r\n/g,"\n");
	
	var texteUTF8 = "";
	for(var n=0; n<p_texte.length; n++) {
		// Détermine de le code UTF-8 des caractères courants
		var c=p_texte.charCodeAt(n);
				
		if (c<128) {
			// Traite tous les caractères sur 1 octet
			texteUTF8 += String.fromCharCode(c);
		} else if((c>127) && (c<2048)) {
			// Traite tous les caractères sur 2 octets
			texteUTF8 += String.fromCharCode((c>>6)|192);
			texteUTF8 += String.fromCharCode((c&63)|128);
		} else {
			// Traite tous les caractères sur 3 octets
			texteUTF8 += String.fromCharCode((c>>12)|224);
			texteUTF8 += String.fromCharCode(((c>>6)&63)|128);
			texteUTF8 += String.fromCharCode((c&63)|128);
		}
	}
		
	return texteUTF8;
}

/**
 * Script original sur :
 * http://aktuell.de.selfhtml.org/artikel/javascript/utf8b64/utf8.htm
 */
function Bibliotheque_decoderUTF8(p_texteUTF8) {
	var texte = ""; var i=0; var c=c1=c2=0;

	// Boucle 'while' qui permet de sauter certains caractères
	while(i<p_texteUTF8.length) {
		c = p_texteUTF8.charCodeAt(i);
		if (c<128) {
			texte += String.fromCharCode(c);
			i++;
		} else if((c>191) && (c<224)) {
			c2 = p_texteUTF8.charCodeAt(i+1);
			texte += String.fromCharCode(((c&31)<<6) | (c2&63));
			i+=2;
		} else {
			c2 = p_texteUTF8.charCodeAt(i+1); 
			c3 = p_texteUTF8.charCodeAt(i+2);
			texte += String.fromCharCode(((c&15)<<12)|((c2&63)<<6)|(c3&63));
			i+=3;
		}
	}
	
	return texte;
}

/**
 * Control la validite d'un champ mail. i.e. verifie la presence d'@ et de .
 * 
 * @return: Vrai si l'adresse mail est valide faux sinon
 */
function Bibliotheque_controlMailValide(p_mail){
    str =  new String(p_mail);
    var undef;
    splitedStr = str.split('@');
    if ( str == '' ) return false;
    if ( splitedStr[1] == undef || splitedStr[2] != undef ) {
        return false;
    }else if ( splitedStr[1].split('.').length < 2 ){
        return false;
    }
    return true;
}

/**
 * Control une liste de champ vide, retourne faux si un des champs au moins
 * est vide, vrai sinon.
 *
 * @param p_listeChamps: Liste d'id à controler
 * 
 * @return: boolean
 */
function Bibliotheque_controlListeChampVide(p_listeChamps) {
    for (var i=0 ; i < p_listeChamps.length ; i++) {
        e = document.getElementById(p_listeChamps[i]);
        if (!e.value) {
            this.champVide = e;
            return false;
        }
    }
    return true;
}
/**
 * Bibliothèque de raccourcis JavaScript
 */
function Bibliotheque() {
    // Déclares ses méthodes
    this.getById = B_getById;
    this.setDisplay = B_setDisplay;
    this.setDisplayNone = B_setDisplayNone;
    this.setDisplayInline = B_setDisplayInline;
    this.setDisplayBlock = B_setDisplayBlock;
    this.setClass = B_setClass;
    this.getListByTag = B_getListByTag;
    this.appendChild = B_appendChild;
    this.copierTableau = B_copierTableau;
    this.getValueToCompare = B_getValueToCompare;
    this.replaceChild = B_replaceChild;
    this.normaliser = B_normaliser;
    this.comparerDates = B_comparerDates;
    this.chaineEnDate = B_chaineEnDate;
    this.dateEnChaine = B_dateEnChaine;
    this.formatDateIncorrect = B_formatDateIncorrect;
    this.encoderEnUTF8 = Bibliotheque_encoderEnUTF8;
    this.decoderUTF8 = Bibliotheque_decoderUTF8;
    this.controlMailValide = Bibliotheque_controlMailValide;
    this.controlListeChampVide = Bibliotheque_controlListeChampVide;
}
