/**
*
* Composantes Générales
*
*/

/**
*
*	Page
*	Charge les css de la page et fixe les outils du menu (Construit les modules rehcerche, tagleau et un livre)
*/
function Page(idLivre, tagIE){
    this.id = idLivre;
    this.prefCSS = (tagIE === false) ? '' : tagIE;
    this.page = document.getElementById('conteneurGlobal');
    this.conteneur = new Livre(this.id, 'blocPrincipal');	// instancie un livre
    this.formRecherche = new Nestor('recherche');		// instancie une boite de recherche
    this.tagleau = new Tagleau('tagleau');			// instancie le tagleau
    this.setStyle();
}

function LivreErreur(){
    document.getElementById('conteneurGlobal').style.backgroundImage = 'url(Media/images/Bg_livreErreur_ouvert.png)';
}

Page.prototype = {    
    setStyle: function(){
	this.loadCSS(this.prefCSS + 'general.css');
	this.loadCSS(this.prefCSS + 'positionnement.css');
    	this.loadCSS(this.prefCSS + 'positionnement_livre.css');
    	this.loadCSS(this.prefCSS + 'livre.css');
    	this.loadCSS(this.prefCSS + 'menu_livre.css');
	this.page.className = 'livre';
	document.getElementById('haut').getElementsByTagName('a')[0].className = 'retour';
	var bOutils = document.createElement('div');
	bOutils.className='outils';
	bOutils.appendChild(this.formRecherche);
	bOutils.appendChild(this.tagleau);
	this.page.appendChild(bOutils);
    },

    /**
    *	Chargement d'un fichier css
    *	@var fichier Nom de fichier à charger
    */
    loadCSS: function(fichier){
	var fichierStyle = document.createElement('link');
	fichierStyle.setAttribute('rel', "stylesheet");
	fichierStyle.setAttribute('type', "text/css");
	fichierStyle.setAttribute('href', "Media/css/"+fichier);
	fichierStyle.setAttribute('media', "screen");
	document.getElementsByTagName('head')[0].appendChild(fichierStyle);
    }
}

Page.prototype.constructor = Page;

/**
*	Moteur de Recherche (Le formulaire)
*/
function Nestor(idBoite){
    this.id = idBoite;
    this.boite = document.getElementById(idBoite);
    this.champ = this.boite.getElementsByTagName('input')[0];
    this.bouton = this.boite.getElementsByTagName('input')[1];
    this.setStyle();
    this.setComportement();
    return this.boite;
}

Nestor.prototype = {
    setStyle: function(){
	this.boite.className='recherche';
	this.champ.className = 'saisie';
	this.bouton.className = 'submit';
    },

    setComportement: function(){
	// interception de la touche "Enter"
	this.champ.onkeypress = function(evt){
	    var touche = (window.event) ? window.event.keyCode : evt.which;
	    if(touche == 13) return false;
	};
	
    	this.bouton.onclick = function(that){
	    return function() {
		if(that.champ.value == ''){
		    alert("Vous ne cherchez rien ?");
		    return false;
		};
	    	// construction de la boite
		if(document.getElementById('boiteResultat')) document.body.removeChild(document.getElementById('boiteResultat'));
		var boiteRecherche = document.createElement('div');
		boiteRecherche.id = 'boiteResultat';
		boiteRecherche.className = 'rechercheResultat';
	    	var chaine = 'action=recherche&saisie='+encodeURIComponent(that.champ.value);
		new Moteur(chaine, boiteRecherche, 1);
		document.body.appendChild(boiteRecherche);
	    	return false;
	    };
	}(this);
    }
}

Nestor.prototype.constructor = Nestor;

/**
*	Tagleau
*/
function Tagleau(idBoite){
    this.id = idBoite;
    this.boite = document.getElementById(idBoite);
    this.listeTags = this.boite.getElementsByTagName('dd')[0].getElementsByTagName('ul')[0];
    this.setStyle();
    this.setComportement();
    return this.boite;
}

Tagleau.prototype = {
    setStyle: function(){
	this.boite.className = 'tagleau';
	this.listeTags.id = 'listetags';
	this.listeTags.className = 'nuage';
	var tmp = this.listeTags.getElementsByTagName('li');
	for(index in tmp){
	    if(tmp[index].tagName == 'LI'){
		tmp[index].className = 'tag';
		tmp[index].style.fontSize = tmp[index].title * 10 + "px";
	    };
	};
	var liVide = document.createElement('li');
	liVide.className = 'clear';
	this.listeTags.appendChild(liVide);
    },

    setComportement: function(){
	var tmp = this.listeTags.getElementsByTagName('li');
	for(index in tmp){
	    if(tmp[index].tagName == 'LI' && tmp[index].getElementsByTagName('a')[0]){
       		tmp[index].getElementsByTagName('a')[0].onclick = function(that){
		    if(document.getElementById('boiteResultat')) document.body.removeChild(document.getElementById('boiteResultat'));
		    var boiteRecherche = document.createElement('div');
		    boiteRecherche.id = 'boiteResultat';
		    boiteRecherche.className = 'rechercheResultat';
		    // construction de la boite
		    var chaine = 'action=tag&id='+this.href.split('id=')[1];
		    new Moteur(chaine, boiteRecherche, 1);
		    document.body.appendChild(boiteRecherche);
		    return false;
		};
	    };
	}(this);
    }
}

Tagleau.prototype.constructor = Tagleau;

/**
*
*	Livre
*	Charge essentiellement le fond d'écran et appelle un Menu
*	@param idLivre	Id du livre
*	@param idBoite	Id du conteneur du livre
*	@param tagOpen Boolean Spécifie si l'on envoie le navigateur sur un livre ouvert i.e: sur sa liste de fiches
*
*/
function Livre(idLivre, idBoite, tagOpen){
    this.id = idBoite;
    this.idLivre = idLivre;
    this.tagOpen = (tagOpen) ? true : false;
    document.getElementById('conteneurGlobal').style.backgroundImage = 'url(Media/images/Bg_livre'+this.idLivre+'_ouvert.png)';
    this.boite = document.getElementById(idBoite);
    this.setStyle();
    if(idLivre == -1){		// cas du livre des définitions
	this.menu = new MenuDef(idBoite);
	new ListeDef(idBoite, -1, '');
	if(this.tagOpen) this.boite.getElementsByTagName('table')[0].className='indexLettres';
    } else {
	this.menu = new Menu(idBoite);
    };
    if(this.tagOpen) this.menu.activeListeFiche();
    return this.boite;
}

Livre.prototype = {
    setStyle: function(){
        this.boite.className = 'contenu';
	this.boite.getElementsByTagName('h2')[0].className='titre_livre';
	if(document.getElementById('intro')){
	    document.getElementById('intro').className='intro';
	    var corps = document.getElementById('intro').getElementsByTagName('p')[0].innerHTML;
	    var patron = /<b name="([^"]*)">([^<]*)<\/b>/ig;
	    document.getElementById('intro').getElementsByTagName('p')[0].innerHTML = corps.replace(patron, '<span class="$1">$2</span>');
	};
    }
}

Livre.prototype.constructor = Livre;

/**
*
*	Fiche
*	Charge essentiellement le fond d'écran et appelle un Menu
*	@param idFiche	Id de la fiche sélectionnée
*	@param idLivre	Id du livre
*	@param idBoite 	Id du conteneur de la fiche
*	@param tagIE 	Booleen indiquant le passage au mode synchrone pour les defs
*
*/
function Fiche(idFiche, idLivre, idBoite, tagIE){
    this.id = idBoite;
    this.idLivre = idLivre;
    this.idFiche = idFiche;
    this.tagIE = tagIE;
    document.getElementById('conteneurGlobal').style.backgroundImage = 'url(Media/images/Bg_livre'+this.idLivre+'_ouvert.png)';
    this.boite = document.getElementById(idBoite);
    this.menu = new MenuFiche(idBoite);			// Construit le menu de la fiche
    if(document.getElementById('listeMedia') && document.getElementById('listeMedia').getElementsByTagName('dt')[0].title != '_NULL_') this.listeMedias = new ListeMedias('listeMedia');	// Construit la liste des médias de la fiche
    this.listeLiens = document.getElementById('intro').getElementsByTagName('p')[0].getElementsByTagName('a');	// cas des définitions inline
    this.setStyle();
    this.setComportement();
    return this.boite;
}

Fiche.prototype = {
    setStyle: function(){
        this.boite.className = 'contenu';
	this.boite.getElementsByTagName('h2')[0].className='titre_livre';
	this.boite.getElementsByTagName('h3')[0].className='fiche'+this.boite.getElementsByTagName('h3')[0].id;
	var corps = document.getElementById('intro').getElementsByTagName('p')[0];
	var patron = /<b name="([^"]*)">([^<]*)<\/b>/ig;
	document.getElementById('intro').getElementsByTagName('p')[0].innerHTML = corps.innerHTML.replace(patron, '<span class="$1">$2</span>');
	document.getElementById('intro').className='fiche';
	corps.className='corps';
	if(this.listeLiens.length > 0){
	    for(var index in this.listeLiens){				// restylisation de l'appel des boites à définitions
	    	this.listeLiens[index].className = 'lienDef';
	    };
	};
    },

    setComportement: function() {
	if(this.listeLiens.length > 0){
	    for(var index in this.listeLiens){
	    	this.listeLiens[index].onclick = function(that){	// appelle de la boite contenant la définition
		    return function(){
		    	var corpsDef = 'action=def&' + this.href.split('&')[1];
			new DefBox(document.getElementById('intro').getElementsByTagName('p')[0], corpsDef, that.tagIE);
		    	return false;
		    }
		}(this);
	    };
	};
    }
}

Fiche.prototype.constructor = Fiche;

/**
*
*	Les différentes boites: boiteResultat, boiteMedia et boite contenant les définitions inline
*
*/

/**
*	Boite médias
*	@param idBoite	id du conteneur
*	@param type	type du média: Audio, Video, Image, Lien
*	@param substrat	Objet représentant le substrat sur equel se déplacent les fenêtres
*/
function BoiteMedia(idBoite, type, substrat, widthImg, heightImg){
    this.boite = document.getElementById(idBoite);
    this.type = type;
    this.substrat = substrat;
    this.widthImg = widthImg;
    this.heightImg = heightImg;
    this.header = this.boite.getElementsByTagName('div')[0];
    this.corps = this.boite.getElementsByTagName('div')[1];
    this.footer = this.boite.getElementsByTagName('div')[2];
    this.setStyle();
    this.setComportement();
}

BoiteMedia.prototype = {
    tailleMaxImage: 400,
    
    setStyle: function(){
    	this.header.className = 'entete';
	this.header.getElementsByTagName('a')[0].className = 'fermer';
	this.header.style.cursor = 'move';
	this.header.getElementsByTagName('span')[0].className = 'ico'+this.type;
    	this.footer.className = 'fin';
	// highlight
	var patron = /<b name="([^"]*)">([^<]*)<\/b>/ig;
	this.corps.getElementsByTagName('span')[0].innerHTML = this.corps.getElementsByTagName('span')[0].innerHTML.replace(patron, '<span class="$1">$2</span>');
	this.corps.getElementsByTagName('span')[1].innerHTML = this.corps.getElementsByTagName('span')[1].innerHTML.replace(patron, '<span class="$1">$2</span>');
	// habillage du corps
	this.corps.className = 'corps';
	this.corps.getElementsByTagName('span')[0].className = 'titre';
	this.corps.getElementsByTagName('span')[1].className = 'description';
	// traitement des photos trop grande
	if(this.corps.getElementsByTagName('a')[0]){
	    this.photo = this.corps.getElementsByTagName('a')[0].getElementsByTagName('img')[0];
	    if(this.widthImg > this.tailleMaxImage){
		this.photo.width = this.tailleMaxImage;
		this.photo.height = this.heightImg * (this.tailleMaxImage / this.widthImg);
	    };
	};
    },

    setComportement: function(){
        this.header.getElementsByTagName('a')[0].onclick = function(that){
	    return function() {
		if(that.type == 'Video'){
		    try { document.getElementById('boiteMedia').getElementsByTagName('object')[0].stop() }
		    catch (excp){};
		};
	    	document.body.removeChild(document.getElementById('boiteMedia'));
	    	return false;
	    };
	}(this);

	// on rend la boite déplaçable dans le substrat
	var tampon = this
	this.header.onmousedown = function(evt){
	    if(tampon.substrat) tampon.substrat.register(evt, tampon.boite);
	};

	this.header.onmouseup = function(evt){
	    if(tampon.substrat) tampon.substrat.deregister();
	};

	//	Cas où la boite média contient une photo
	if(this.corps.getElementsByTagName('a')[0]){
	    this.corps.getElementsByTagName('a')[0].onclick = function(that){	// on la rend cliquable et on créé le widget de visualisation
	    	return function(){
		    var grandePhoto = document.createElement('div');	// grandePhoto est la boite de visualisation de l'image en plein écran
		    grandePhoto.id = 'visuPhoto';
		    var photo = document.createElement('img');
		    photo.src = this.getElementsByTagName('img')[0].src;
		    // retaille de l'image si nécessaire
		    var ecranWidth = parseInt(document.body.clientWidth);
		    var ecranHeight = parseInt(document.body.clientHeight);
		    if(parseInt(photo.width) >= ecranWidth){
		    	var facteur = parseInt(photo.height) / parseInt(photo.width);
		    	photo.width = ecranWidth*0.7;
			photo.height = facteur * parseInt(photo.width);
		    };
		    if (parseInt(photo.height) >= ecranHeight) {
		    	var facteur = parseInt(photo.width) / parseInt(photo.height);
		    	photo.height = ecranHeight*0.7;
			photo.width = facteur * parseInt(photo.height);
		    };
		    // on centre la photo
		    photo.style.marginTop = '-' + Math.round(photo.height / 2) + "px";
		    photo.style.marginLeft = '-' + Math.round(photo.width / 2) + "px";
		    grandePhoto.appendChild(photo);
		    grandePhoto.className = 'zoomImage';
		    document.body.appendChild(grandePhoto);

		    grandePhoto.onclick = function(){		// on rend le zoom cliquable (pour donner la possibilité de le fermer)
			document.body.removeChild(document.getElementById('visuPhoto'));
		    };

		    return false;
	    	};
	    }(this);
	};
    }
}

BoiteMedia.prototype.constructor = BoiteMedia;

/**
*	Boite résultats
*	@param	idBoite: id du conteneur
*	@param	substrat: Objet représentant le substrat sur equel se déplacent les fenêtres
*/
function BoiteResultat(idBoite, substrat){
    this.boite = document.getElementById(idBoite);
    this.substrat = substrat;
    this.header = this.boite.getElementsByTagName('div')[0];
    this.corps = this.boite.getElementsByTagName('dl')[0];
    this.footer = this.boite.getElementsByTagName('div')[1];
    this.setStyle();
    this.setComportement();
}

BoiteResultat.prototype = {
    setStyle: function(){
    	this.header.className = 'entete';
	this.header.getElementsByTagName('a')[0].className = 'fermer';
	this.header.style.cursor = 'move';
    	this.corps.className = 'corps';
	lsRubT = this.corps.getElementsByTagName('dt');
	for(var i=0; lsRubT[i]; i++){
	    lsRubT[i].className = 'titre';
	};
	lsRub = this.corps.getElementsByTagName('dd');
	for(var i=0; lsRub[i]; i++){
	    lsRub[i].className = 'liste';
	    var lsImg = lsRub[i].getElementsByTagName('img');
	    for(var j=0; lsImg[j]; j++){
	    	lsImg[j].className = 'ico';
	    };
	};
    	this.footer.className = 'fin';
    },

    setComportement: function(){
        this.header.getElementsByTagName('a')[0].onclick = function(that){
	    return function() {
	    	document.body.removeChild(document.getElementById('boiteResultat'));
	    	return false;
	    };
	}(this);

	// on rend la boite déplaçable dans le substrat
	var tampon = this
	this.header.onmousedown = function(evt){
	    if(tampon.substrat !== false) tampon.substrat.register(evt, tampon.boite);
	};

	this.header.onmouseup = function(evt){
	    if(tampon.substrat !== false) tampon.substrat.deregister();
	};
	
	// on redirige les liens
	for(var i=0; this.corps.getElementsByTagName('a')[i]; i++){
	    this.corps.getElementsByTagName('a')[i].onclick = function(that){
		return function(){
		    if(this.name != 'Lien'){
			var newURL = this.href.split('?')[1];
			if(newURL.search('action=medias') == -1){
			    var moteur = new Moteur(newURL, document.getElementById('blocPrincipal'));
			} else {
		    	    if(document.getElementById('boiteMedia')) document.body.removeChild(document.getElementById('boiteMedia'));
		    		var boiteMedia = document.createElement('div');
		    		boiteMedia.id = 'boiteMedia';
		    		boiteMedia.className = 'medialisateur';
		    		// construction de la boite
				var chaine = newURL.split('&')[2] + '&id=' + newURL.split('&')[1].split('=')[1] + '&hl=true';
		    		new Moteur(chaine, boiteMedia, 1);
		    		document.body.appendChild(boiteMedia);
				return false;
			};
		    } else {
			return true;
		    };
		    return false;
		};
	    }(this);
	};
    }
}

BoiteResultat.prototype.constructor = BoiteResultat;

/**
*	Boite Definition
*	(Boites inlines)
*/
function DefBox(conteneur, fiche, tagIE){
    this.conteneur = conteneur;
    this.fiche = fiche;
    this.tagIE = tagIE;
    this.creationBoite();
    this.setStyle();
    this.setComportement();
    this.conteneur.appendChild(this.boite);
}

DefBox.prototype = {
    setStyle: function(){
	this.boite.className = 'definition';
	this.boite.style.top = this.conteneur.offsetTop + 15 + 'px';
	this.boite.style.left = this.conteneur.offsetLeft + 'px';
	this.boite.style.cursor = 'pointer';
    },

    setComportement: function(){
    	this.boite.onclick = function(that){
	    return function(){
	    	that.conteneur.removeChild(document.getElementById('definition'));
	    };
	}(this)
    },

    creationBoite: function(){
    	if(document.getElementById('definition')) this.conteneur.removeChild(document.getElementById('definition'));
	this.boite = document.createElement('div');
	this.boite.id = 'definition';
	new Moteur(this.fiche, this.boite, ((this.tagIE == true) ? 2 : 0));
    }
}

/**
*
*
*	Les différentes listes impliquées: ListeFiche, ListeMédias, ListeDefs
*
*/

/**
*	Liste des définitions (livre -1)
*	implémente la page des définitions (différentes de toutes les autres)
*/
function ListeDef(idBoite, idLivre, idFiche){
    this.boite = document.getElementById(idBoite);
    this.idFiche = (idFiche != '') ? idFiche : null;
    this.sommaire = this.boite.getElementsByTagName('table')[0];	// Pour ce livre, le sommaire est un tableau de lettres
    this.listeDefs = this.boite.getElementsByTagName('dl')[0];
    this.menu = new MenuDef(idBoite);
    this.idLivre = idLivre;
    this.setStyle();
    if(this.idFiche !== null) this.menu.activeListeFiche();
    return this.boite;
}

ListeDef.prototype = {
    setStyle: function(){
        this.boite.className = 'contenu';
	this.boite.getElementsByTagName('h2')[0].className='titre_livre';
	document.getElementById('intro').className='intro';
	document.getElementById('intro').getElementsByTagName('p')[0].className='corps';
   }
}

ListeDef.prototype.constructor = ListeDef;

/**
*	liste des fiches d'un livre (dont l'id!=-1)
*/
function ListeFiches(visualisateur){
    // formalisation de la liste des fiches
    this.listeFiches = document.getElementById('listeFiche').getElementsByTagName('li');
    this.listeTitres = document.getElementById('listeFiche').getElementsByTagName('ul');
    this.visualisateur = visualisateur;
    this.setStyle();
    this.setComportement();
}

ListeFiches.prototype = {
    setStyle: function(){
	for(var i=0; this.listeFiches[i]; i++){
	    this.listeFiches[i].className = 'itemFiche';
	};
	for(var i=0; this.listeTitres[i]; i++){
	    this.listeTitres[i].className = this.listeTitres[i].id;
	};
    },

    setComportement: function(){
	for(var i=0; this.listeFiches[i]; i++){
	    this.listeFiches[i].getElementsByTagName('a')[0].onclick = function(that){
	        return function(){
	    	    var newURL = this.href.split('?')[1];
		    var moteur = new Moteur(newURL, that.visualisateur);
		    return false;
		};
	    }(this);
	};
    }
}

ListeFiches.prototype.constructor = ListeFiches;

/**
*	liste des Medias d'une fiche
*/
function ListeMedias(id){
    this.listeMedias = document.getElementById(id);
    this.setStyle();
    this.setComportement();
}

ListeMedias.prototype = {
    setStyle: function(){
    	var lsMTitre = this.listeMedias.getElementsByTagName('dt');
	if(lsMTitre.length > 0){
	    for(var i=0; lsMTitre[i]; i++){
	        lsMTitre[i].getElementsByTagName('span')[0].className = lsMTitre[i].getElementsByTagName('span')[0].id;
	    };
	};
    },

    setComportement: function(){
    	var lsMTitre = this.listeMedias.getElementsByTagName('dd');
	if(lsMTitre.length > 0){
	    for(var i=0; lsMTitre[i]; i++){
	        for(var j=0; lsMTitre[i].getElementsByTagName('ul')[0].getElementsByTagName('li')[j]; j++){
		    var ficheTmp = lsMTitre[i].getElementsByTagName('ul')[0].getElementsByTagName('li')[j].getElementsByTagName('span')[0].getElementsByTagName('a')[0];
	    	    ficheTmp.name = lsMTitre[i].getElementsByTagName('ul')[0].id.slice(5);
		    ficheTmp.onclick= function(that){
		    	return function(){
			    if(this.name != 'Liens'){
		    		if(document.getElementById('boiteMedia')) document.body.removeChild(document.getElementById('boiteMedia'));
		    		var boiteMedia = document.createElement('div');
		    		boiteMedia.id = 'boiteMedia';
		    		boiteMedia.className = 'medialisateur';
		    		// construction de la boite
		    		var chaine = 'action=medias&id='+this.href.split('fiche=')[1];
		    		new Moteur(chaine, boiteMedia, 1);
		    		document.body.appendChild(boiteMedia);
				return false;
			    } else {
			    	return true;
			    };
			};
		    }(this);
		};
	    };
	};
    }
}

/**
*
*	Les différents types de menus 
*
*/
/**
*
*	Implémentation des menus classiques
*
*/
function Menu(visualisateur){
    this.visualisateur = document.getElementById(visualisateur);
    this.boutonLivres = document.getElementById('listeLivres').getElementsByTagName('li');
    this.boutonOutils = document.getElementById('listeOutils').getElementsByTagName('li');
    if(document.getElementById('listeFiche')) this.listeFiches = new ListeFiches(this.visualisateur);
    this.setStyle();
    this.setComportement();
// activation des boutons fiches et intro
    var menuLivre = document.getElementById('menuLivre');
    if(menuLivre){
	menuLivre.getElementsByTagName('li')[0].getElementsByTagName('a')[0].onclick = function(that){
	    return function() {
		document.getElementById('intro').className = 'intro';
	        document.getElementById('listeFiche').className = 'sanstyle';
	        return false;
	    };
	}(this);
	menuLivre.getElementsByTagName('li')[1].onclick = function(that){
	    return function() {
		that.activeListeFiche();
		return false;
	    };
	}(this);
    };
    return this.boite;
}
/**
*
*	Implémentation des menus quand le livre Définition (id=-1) est chargé
*
*/
function MenuDef(visualisateur){
    this.visualisateur = document.getElementById(visualisateur);
    this.boutonLivres = document.getElementById('listeLivres').getElementsByTagName('li');
    this.boutonOutils = document.getElementById('listeOutils').getElementsByTagName('li');
    this.setStyle();
    this.setComportement();
// activation des boutons fiches et intro
    var menuLivre = document.getElementById('menuLivre');
    menuLivre.getElementsByTagName('li')[0].getElementsByTagName('a')[0].onclick = function(that){
	return function() {
	    document.getElementById('intro').className = 'intro';
	    document.getElementById('blocPrincipal').getElementsByTagName('table')[0].className = 'sanstyle';
	    document.getElementById('listeFiche').className = 'sanstyle';
	    return false;
	};
    }(this);
    menuLivre.getElementsByTagName('li')[1].onclick = function(that){
	return function() {
	    document.getElementById('blocPrincipal').getElementsByTagName('table')[0].className = 'indexLettres';
	    that.activeListeFiche();
	    return false;
	};
    }(this);
    this.activeListeFiche = function() {
	document.getElementById('intro').className = 'sanstyle';
	document.getElementById('listeFiche').className = 'listeGlossaire';
	document.getElementById('listeFiche').getElementsByTagName('dt');
	document.getElementById('blocPrincipal').getElementsByTagName('table')[0].className = 'indexLettres';
	for(var i=0; document.getElementById('listeFiche').getElementsByTagName('dt')[i]; i++){
	    document.getElementById('listeFiche').getElementsByTagName('dt')[i].className = 'lettreTitre';
	};
	for(var i=0; document.getElementById('listeFiche').getElementsByTagName('li')[i]; i++){
	    document.getElementById('listeFiche').getElementsByTagName('li')[i].className = 'item';
	    document.getElementById('listeFiche').getElementsByTagName('li')[i].getElementsByTagName('span')[0].className = 'motTitre';
	};
    };
    return this.boite;
}

/**
*
*	Implémentation des menus quand une fiche est chargée
*
*/
function MenuFiche(visualisateur){
    this.visualisateur = document.getElementById(visualisateur);
    this.boutonLivres = document.getElementById('listeLivres').getElementsByTagName('li');
    this.boutonOutils = document.getElementById('listeOutils').getElementsByTagName('li');
    this.setStyle();
    this.setComportement();

    // ré-organisation du bloc et stylisation

    var intro = document.getElementById('intro');
    var listeTagsFiche = (document.getElementById('listeTagsFiche')) ? document.getElementById('listeTagsFiche').getElementsByTagName('li') : new Array();
    var iTitre = intro.getElementsByTagName('h3')[0];
    var tTitre = intro.getElementsByTagName('h3')[0].innerHTML;
    var iCorps = intro.getElementsByTagName('p')[0];
    var tCorps = intro.getElementsByTagName('p')[0].innerHTML;
    var iListe = intro.getElementsByTagName('ul')[0];
    if(iListe){
	var tListe = intro.getElementsByTagName('ul')[0].innerHTML;
	iListe.className = 'motclefs';
	iListe.innerHTML = tListe;
    };
    intro.innerHTML = '';
    iTitre.innerHTML = tTitre;
    iCorps.innerHTML = tCorps;
    intro.appendChild(iTitre);

// activation des boutons fiches et intro

    var sMenuLivre = document.getElementById('sMenuLivre');
    sMenuLivre.getElementsByTagName('li')[0].getElementsByTagName('a')[0].onclick = function(that){
	return function() {
	    new Moteur(this.href.split('?')[1].split('#')[0], that.visualisateur);
	    return false;
	};
    }(this);
    sMenuLivre.getElementsByTagName('li')[1].onclick = function(that){
	return function() {
	    new Moteur(this.getElementsByTagName('a')[0].href.split('?')[1].split('#')[0]+'&tagOpen=true', that.visualisateur);
	    return false;
	};
    }(this);
    // comportements menu fiche
    var sMenuFiche = document.getElementById('sMenuFiche');
    if(sMenuFiche){
	sMenuFiche.getElementsByTagName('li')[0].onclick = function(that){
	    return function() {
    		var srcFavoris = this.getElementsByTagName('a')[0].href;
    	        var labelFavoris = "Encycleau: " + document.getElementsByTagName('h3')[0].innerHTML;

    		if(window.sidebar){		// firefox
		    window.sidebar.addPanel(labelFavoris, srcFavoris, "");
    		} else if(window.external) {	// ie
		    window.external.AddFavorite(srcFavoris, labelFavoris);
		} else {
		    alert('Votre navigateur ne supporte pas cette op&eacute;ration.');
    		};
		return false;
	    };
	}(this);
	sMenuFiche.getElementsByTagName('li')[1].onclick = function(that){
	    return function() {
		if(this.getElementsByTagName('a')[0].className.search('_off') == -1){
	    	    document.getElementById('listeMedia').className = 'sanstyle';
	    	    document.getElementById('intro').getElementsByTagName('p')[0].className = 'corps';
	    	    document.getElementById('intro').getElementsByTagName('ul')[1].className = 'motclefs';
		    sMenuFiche.getElementsByTagName('li')[2].getElementsByTagName('a')[0].className = sMenuFiche.getElementsByTagName('li')[2].getElementsByTagName('a')[0].className.split('_off')[0];
		    this.getElementsByTagName('a')[0].className += '_off';
		}
		return false;
	    };
	}(this);
    };
    if(document.getElementById('listeMedia') && document.getElementById('listeMedia').getElementsByTagName('dt')[0] && document.getElementById('listeMedia').getElementsByTagName('dt')[0].title != '_NULL_'){
	sMenuFiche.getElementsByTagName('li')[2].onclick = function(that){
	    return function() {
		if(this.getElementsByTagName('a')[0].className.search('_off') == -1){
	    	    document.getElementById('listeMedia').className = 'listeMedias';
	    	    document.getElementById('intro').getElementsByTagName('p')[0].className = 'sanstyle';
	    	    document.getElementById('intro').getElementsByTagName('ul')[1].className = 'sanstyle';
		    sMenuFiche.getElementsByTagName('li')[1].getElementsByTagName('a')[0].className = sMenuFiche.getElementsByTagName('li')[1].getElementsByTagName('a')[0].className.split('_off')[0];
		    this.getElementsByTagName('a')[0].className += '_off';
		};
		return false;
	    };
	}(this);
    } else {
	if(sMenuFiche){
	    sMenuFiche.getElementsByTagName('li')[2].getElementsByTagName('a')[0].style.cursor = 'default';
	    sMenuFiche.getElementsByTagName('li')[2].onclick = function(that){
		return function() {
		    return false;
		};
	    }(this);
	};
    };
    // comportement des tags de la fiche
	if(sMenuFiche) intro.appendChild(sMenuFiche);
        intro.appendChild(iCorps);
        if(iListe) intro.appendChild(iListe);

    if(listeTagsFiche[0] && listeTagsFiche[0].getElementsByTagName('a')[0]){
	for(var i=0; listeTagsFiche[i]; i++){
	    listeTagsFiche[i].getElementsByTagName('a')[0].onclick = function(that){
		return function(){
		    if(document.getElementById('boiteResultat')) document.body.removeChild(document.getElementById('boiteResultat'));
		    var boiteRecherche = document.createElement('div');
		    boiteRecherche.id = 'boiteResultat';
		    boiteRecherche.className = 'rechercheResultat';
		    // construction de la boite
		    var chaine = 'action=tag&id='+this.href.split('id=')[1];
		    new Moteur(chaine, boiteRecherche, 1);
		    document.body.appendChild(boiteRecherche);
		    return false;
		};
	    }(this);
	};
    };
    if(document.getElementById('listeMedia')){
	document.getElementById('listeMedia').className = 'sanstyle';
        intro.appendChild(document.getElementById('listeMedia'));
    };
    if(sMenuFiche){
        sMenuFiche.className = 'menuFiche';
        sMenuFiche.getElementsByTagName('li')[0].getElementsByTagName('a')[0].className = 'bookmarker';
	sMenuFiche.getElementsByTagName('li')[1].getElementsByTagName('a')[0].className = 'lienFiche_off';
        sMenuFiche.getElementsByTagName('li')[2].getElementsByTagName('a')[0].className = (document.getElementById('listeMedia').getElementsByTagName('dt')[0] && document.getElementById('listeMedia').getElementsByTagName('dt')[0].title != '_NULL_') ? 'lienMedias' : 'listeMedia_none';
    };
    return this.boite;
}

/**
*
*	Tronc commun entre tous les menus
*	Implémente les menus donnant accès aux différents livres et le switcheur de rubriques
*
*/
Menu.prototype = {
    setStyle: function(){
    	// stylisation des blocs contenant les outils et boutons
	document.getElementById('menuOutils').className='menu_outils';
	document.getElementById('menuLivres').className='menu';
	// stylisation des blocs du menu d'un livre (intro + fiches)
	var menuLivre = document.getElementById('menuLivre');
	if(menuLivre){
	    menuLivre.className = 'menu_livre';
	    menuLivre.getElementsByTagName('li')[0].getElementsByTagName('a')[0].className = 'lien_intro';
	    menuLivre.getElementsByTagName('li')[1].getElementsByTagName('a')[0].className = 'lien_fiches';
	};
	// stylisation des boutons
	for(var i=0; this.boutonOutils[i]; i++){
	    if(this.boutonOutils[i].getElementsByTagName('a')[0].id == 'lP'){
		this.boutonOutils[i].className = 'ico_l_-1';
		this.boutonOutils[i].getElementsByTagName('a')[0].className='lien_livre';
	    } else if(this.boutonOutils[i].getElementsByTagName('a')[0].id == 'lG'){
		this.boutonOutils[i].className = 'ico_l_0';
		this.boutonOutils[i].getElementsByTagName('a')[0].className='lien_livre';
	    };
	};
	for(var i=0; this.boutonLivres[i]; i++){
	    this.boutonLivres[i].className = 'ico_l_'+this.boutonLivres[i].getElementsByTagName('a')[0].id.slice(1);
	    this.boutonLivres[i].getElementsByTagName('a')[0].className='lien_livre';
	};
    },

    setComportement: function() {
    	// activation des boutons outils
	for(var i=0; this.boutonOutils[i]; i++){
	    this.boutonOutils[i].onclick = function(that){
		return function (){
		    var newURL = this.getElementsByTagName('a')[0].href.split('?')[1];
		    var moteur = new Moteur(newURL, that.visualisateur);
		    return false;
		};
	    }(this);
	    this.boutonOutils[i].getElementsByTagName('a')[0].className='lien_livre';
	};
    	// activation des boutons livre
	for(var i=0; this.boutonLivres[i]; i++){
	    this.boutonLivres[i].onclick = function(that){
		return function (){
		    var newURL = this.getElementsByTagName('a')[0].href.split('?')[1];
		    var moteur = new Moteur(newURL, that.visualisateur);
		    return false;
		};
	    }(this);
	    this.boutonLivres[i].getElementsByTagName('a')[0].className='lien_livre';
	};
    },

    activeListeFiche: function() {
	document.getElementById('intro').className = 'sanstyle';
	document.getElementById('listeFiche').className = 'listeFiche';
    }
}

MenuFiche.prototype = Menu.prototype;
MenuDef.prototype = Menu.prototype;
Menu.prototype.constructor = Menu;

/**
*	Boite Globale
*	implémente le substrat où vont se déplacer les fenêtres
*	est rattaché au corps de la page (Body)
*/

function BoiteGlobale(){
    this.boite = document.body;
    this.fenetreCourante = 0;
    this.posXinit = 0;
    this.posYinit = 0;
    this.setComportement();
}

BoiteGlobale.prototype = {
    ZIndexMax: 510,
    setComportement: function() {
	var courantSubstrat = this;
	this.boite.onmousemove = function(evt){
	    if(courantSubstrat.fenetreCourante != 0){
		var mousePos = courantSubstrat.getMousePos(evt);
		document.getElementById(courantSubstrat.fenetreCourante.id).style.left = (mousePos.x - courantSubstrat.posXinit) + 'px';
		document.getElementById(courantSubstrat.fenetreCourante.id).style.top = (mousePos.y - courantSubstrat.posYinit) + 'px';
	    };
	};
    },

    /**
    *	Débute un mouvement
    *	@param evt vide, événement
    *	@param contenant Objet du DOM devant se déplacer)
    */
    register: function(evt, contenant){
	this.fenetreCourante = contenant;
	this.setWindowFocus(this.fenetreCourante.id);
	var mouseInit = this.getMousePos(evt);
	var windowInit = this.getWindowPos(document.getElementById(this.fenetreCourante.id));
	this.posXinit = mouseInit.x - windowInit.x;
	this.posYinit = mouseInit.y - windowInit.y;
    },
    /**
    *	Termine un mouvement
    */
    deregister: function(){
	windowFin = this.getWindowPos(document.getElementById(this.fenetreCourante.id));
	this.fenetreCourante = 0;
	this.posXinit = 0;
	this.posYinit = 0;
    },

    /**
    *	Fonctions internes de positionnement/localisation
    */

    getMousePos: function(evt){
	if(!evt) var evt = window.event;
	var pX = (evt.pageX) ? evt.pageX : (evt.clientX) ? (evt.clientX + this.boite.scrollLeft - this.boite.clientLeft) : false;
	var pY =  (evt.pageY) ? evt.pageY : (evt.clientY) ? (evt.clientY + this.boite.scrollTop - this.boite.clientTop) : false;
	return {x:pX, y:pY}
    },
    
    getWindowPos: function(fenetre){
	var pWX = 0;
	var pWY = 0;
	fenetre.offsetParent;
	while(fenetre.offsetParent){
	    pWX += fenetre.offsetLeft;
	    pWY += fenetre.offsetTop;
	    fenetre = fenetre.offsetParent;
	};
	pWX += fenetre.offsetLeft;
	pWY += fenetre.offsetTop;
	return {x: pWX, y: pWY};
    },
    
    setWindowFocus: function(fenetre){
	document.getElementById(fenetre).style.position = 'absolute';
	if(!document.getElementById(fenetre).style.zIndex | document.getElementById(fenetre).style.zIndex < this.ZIndexMax){
	    document.getElementById(fenetre).style.zIndex = (1 + parseInt(this.ZIndexMax));
	    this.ZIndexMax++;
	} else if(document.getElementById(fenetre).style.zIndex > this.ZIndexMax){
	    this.ZIndexMax = parseInt(document.getElementById(fenetre).style.zIndex);
	};
    }
}

BoiteGlobale.prototype.constructor = BoiteGlobale;

