/**
 * variables globales
 */
var KEYS = [];		// clé des différentes parties
var LABELS = [];	// nom des différentes parties

var SS_RUBS = null;
var ONGLETS = null;

var menu = null;
var menug = null;
var onglets = null;

/**
 * types de popup disponibles
 */
var HORIZ		= 'horiz'
var VERT		= 'vert';
var HORIZ_SPEC	= 'horizSpec';
var VERT_SPEC	= 'vertSpec';

/**
 * Affiche le menu transversal
 * @param 	a_items		(Object[])		description des items
 * @param	a_target	(String)		éventuel target
 * @param	a_logout	(boolean)		true si l'item de connexion doit être en déconnexion
 */
function writeMenuTrans(a_items, a_target, a_logout) {
	var l_buf = '<div class="menutrans" style="position:absolute; white-space:nowrap;">';
	l_buf += '  ';
	
	// on passe en revue tous les items (à partir de 1, 0 étant le format éventuel)
	var i, l_nb = a_items.length;
	var l_item;
	var l_target;
	for (i = 1; i < l_nb; i++) {
		l_item = a_items[i];
		if (i > 1) {
			// séparateur
			l_buf += '| ';
		}
		l_buf += '<a href="' + l_item.url + '"';
		l_target = l_item.target || a_target;		// prise en compte du target spécifique à l'item
		if (!und(l_target)) {
			l_buf += ' target="' + l_target + '"';
		}
		l_buf += '>' + l_item.code.replace(/ /g, "&nbsp;") + '</a> ';
	}
	// on ajoute l'item 'mon compte', en login ou en logout selon le paramètre fourni
	l_buf += '| <a';
	if (!und(a_target)) {
		l_buf += ' target="' + a_target + '"';
	}
	l_buf += ' href="../control?';
	if (!und(a_logout) && (a_logout == true)) {
		// déconnexion
		l_buf += '_action=logout">Déconnexion';
	} else {
		// accès à mon compte
		l_buf += '_action=show&key=core.login">Mon compte';
	}
	l_buf += '</a>&nbsp;';

	l_buf += '</div>';
	
	// on écrit
	document.write(l_buf);
}

/**
 * Renseigne toutes les variables globales à partir des données fournies.
 * @param	a_rub		(String)	nom de la rubrique
 * @param	a_ssRub		(String)	nom de la sous-rubrique
 * @param	a_onglet	(String)	nom de l'onglet
 */
function setInfos(a_rub, a_ssRub, a_onglet) {
	// les clés sont identiques aux labels dans ce cas
	KEYS[0]	= a_rub;
	KEYS[1]	= a_ssRub;
	KEYS[2]	= a_onglet;

	LABELS[0]	= a_rub;
	LABELS[1]	= a_ssRub;
	LABELS[2]	= a_onglet;
	
	SS_RUBS = RUBRIQUES_ITEMS[KEYS[0]];
}

/**
 * Renseigne toutes les variables globales à partir de la clé fournie (ex : '010101').
 * Si elle est nulle, utilise directement le nom de la page (ex : '.../010101.htm').
 * @param  a_key	(String)	clé de la page (ex : '010101');
 */
function extractInfos(a_key) {
	if (a_key) {
		// clé définie -> on ne fait rien de plus
	} else {
		// pas de clé -> on utilise le nom du fichier
		var l_loc = window.location.pathname;
		var l_end = l_loc.lastIndexOf('.');
		var l_pos = l_end;
		// on parcours le nom jusqu'à trouver le séparateur de fichiers
		do {
			l_pos--;
		} while ((l_pos >= 0) && (l_loc.charAt(l_pos) != '/') && (l_loc.charAt(l_pos) != '\\'));
		a_key = l_loc.substring(l_pos + 1, l_end);
	}

	// création des clés
	KEYS[0] = a_key.substr(0, 2);		// rubrique
	KEYS[1] = a_key.substr(0, 4);		// sous-rubrique
	KEYS[2] = a_key;					// onglet
	
	// récupération des 'labels'
	// labels de la rubrique
	SS_RUBS = getSsRubriques(KEYS[0]);
	if (SS_RUBS == null) {
		// on arrête là
		return null;
	}
	// label de la sous-rubrique
	var l_item;
	for (var l_sub = 1; l_sub < SS_RUBS.length; l_sub++) {
		l_item = SS_RUBS[l_sub];
		if (l_item.key == KEYS[1]) {
			// c'est le bon -> on le conserve
			LABELS[1] = l_item.code;
			break;
		}
	}
	// label de l'onglet
	ONGLETS = getOnglets(KEYS[1]);
	if (ONGLETS == null) {
		return null;
	}
	for (var l_ong = 1; l_ong < ONGLETS.length; l_ong++) {
		l_item = ONGLETS[l_ong];
		if (l_item.key == KEYS[2]) {
			// c'est le bon -> on le conserve
			LABELS[2] = l_item.code;
			break;
		}
	}
}

/**
 * Renvoie le code complet de définition d'un menu gauche (cf 'Rubrique')
 * à partir de l'item de menu principal.
 * @param a_rubriqueKey		(String)	clé de la rubrique (ex : '01')
 */
function getSsRubriques(a_rubriqueKey) {
	var l_rub = []
	// champ format : identique pour toutes les rubriques
	l_rub[0] = rubFormat;
			    
	// on récupère le bon sous-menu
	var l_item;
	var l_found = false;
	for (var l_sub = 1; l_sub < MENU_ITEMS.length; l_sub++) {
		l_item = MENU_ITEMS[l_sub];
		if (l_item.key == a_rubriqueKey) {
			// c'est le bon -> on le conserve
			LABELS[0] = l_item.code;
			l_found = true;
			break;
		}
	}
	if (l_found == false) {
		// pas d'item -> on arrête là
		return;
	}
	
	var l_subMenu = l_item.sub;
	var l_subItem;
	for (var i = 1; i < l_subMenu.length; i++) {
		l_subItem = l_subMenu[i];
		// on regarde s'il s'agit d'un séparateur
		if (und(l_subItem.code)) {
			// oui -> on définit un séparateur
			l_rub[i] = leftItemSep;
		} else {
			// on clone l'item
			l_rub[i] = {"code": l_subItem.code, "url": l_subItem.url, "key": l_subItem.key};
		}
	} 

	return l_rub;
}

/**
 * Renvoie le tableau de données correspondant au couple rubrique - sous-rubrique.
 * Si aucun onglet, renvoie un tableau "vide"
 * S'occupe de les filtrer dans le cas de l'agenda.
 * @param	a_ssRubKey		(String)	clé de la sous-rubrique (ex : '0101')
 * @return la définition des onglets (Object[])
 */
function getOnglets(a_ssRubKey) {
	if (window.ONGLETS_ITEMS) {
		var l_items = ONGLETS_ITEMS[a_ssRubKey];
		if (l_items && l_items.length == 0) {
			// pas d'onglets
			return INIT_ONG;
		} else {
			l_items = (l_items) ? l_items : ONGLETS_ITEMS[a_ssRubKey.substr(0, 2)];
			return (l_items) ? filter(l_items) : INIT_ONG;
		}
	} else {
		return null;
	}
}

/**
 * Filtre les onglets dans le cas de l'agenda.
 * @param	a_items		(Object[])	items à filtrer
 * @return la définition des onglets (Object[])
 */
function filter(a_items) {
	// on récupère le format
	var l_format = a_items[0];
	
	// on regarde s'il s'agit de la définition de l'agenda
	if (und(l_format.agenda)) {
		// on -> on arrête là;
		return a_items;
	} 
	// on définit les mois à afficher
	var l_date = new Date();
	var l_currMonth = l_date.getMonth();
	
	// on crée le tableau des items filtrés	
	var l_filteredItems = [];
	l_filteredItems[0] = l_format;
	// on remplit le tableau avec les items corrects
	for (var i = 0; i < l_format.nbMonth; i++) {
		l_filteredItems[1 + i] = a_items[1 + (l_currMonth + i)%12 ];
	}

	return l_filteredItems;
}

/**
 * Crée le libellé indiquant la position dans le site.
 */
function writePathLib() {
	var l_imgBuf = '<img src="../_imgs/flnu.gif" width="14" height="11"/>';
	
	var l_buf = '';
	
	var l_label;
	var l_der = true;
	for (var i = 2; i >= 0; i--) {
		l_label = LABELS[i];
		if (!und(l_label)) {
			if (l_der == true) {
				// on l'affiche en gras
				l_buf = l_imgBuf + '<strong>' + l_label + '</strong>';
				l_der = false;
			} else {
				// on le compare au précédent
				if (l_label != LABELS[i+1]) {
					// on l'affiche
					l_buf = l_imgBuf + l_label + l_buf;
				}
			}
		}
	}
	// on ajoute le premier morceau
	l_buf = '  <a href="../root/index.htm">Accueil</a>' + l_buf;

	document.write(l_buf);
}

/**
 * Ecrit le titre de la rubrique.
 */
function writeRub() {
	var l_td = xbGetElementById("rubLib");
	l_td.className = 'couleurRub';
	xbSetInnerHTML(l_td, LABELS[0].replace(/ /g, " "));
}

/**
 * Ecrit le titre de la sous-rubrique, en spécifiant la classe.
 * Modifie également la classe du corner droit.
 * @param a_cssName		(String)	css à utiliser (si non indiquée, 'couleurSsRub' + KEYS[0])
 */
function writeSubRub(a_cssName) {
	// définition de la classe
	if (und(a_cssName)) {
		a_cssName = 'couleurSsRub' + KEYS[0];
	}
	
	// libellé
	var l_td = xbGetElementById("ssRubLib");
	l_td.className = a_cssName;
	l_td.style.paddingLeft = 10;
	if (!und(LABELS[1])) {
		xbSetInnerHTML(l_td, LABELS[1].replace(/ /g, " "));
	}
	
	// coin droit
	xbGetElementById("ssRubCorn").className = a_cssName;
}

/**
 * Ajoute le code HTML correspondant à une image (+ loupe) cliquable pour obtenir un zoom.
 * @param a_type	(String)	type de popup à appeler (HORIZ, VERT, HORIZ_SPEC, VERT_SPEC)
 * @param a_imgSrc	(String)	url de l'image dans le répertoire ../imgs/
 *										(ex : '_01-imgs-musee/010101-p.jpg')
 * @param a_id		(String)	identifiant de la popup pour le zoom (ex : '010101')
 * @param a_index	(int)		index de l'image dans la page (0 par défaut)
 */
function addZoomableImage(a_type, a_imgSrc, a_id, a_index) {
	a_index = (a_index) ? a_index : '';
	var l_func;
	switch(a_type) {
		case HORIZ		: l_func = 'zoomInHoriz'; break;
		case VERT		: l_func = 'zoomInVert'; break;
		case HORIZ_SPEC	: l_func = 'zoomInHorizSpec'; break;
		case VERT_SPEC	: l_func = 'zoomInVertSpec'; break;
	}
	
	var l_bufHRef = '<a href="javascript:void(0);" onclick="' + l_func + '(\'' + a_id + '\')"';
	// image elle-même
	var l_buf = l_bufHRef + '>' + '<img src="../_imgs/' + a_imgSrc + '" title="Agrandir l\'image"/></a>';
	l_buf += '<br/>';
	
	// loupe
	l_buf += l_bufHRef + 'onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage(\'zoom' + a_index + '\', \'\', \'../_imgs/zoomon.gif\', 1)">';
	l_buf += '<img src="../_imgs/zoomoff.gif" title="Agrandir l\'image" name="zoom' + a_index + '" width="170" height="17"></a><br/>';
	
	// on écrit
	document.write(l_buf);
}

/**
 * Ajoute le code HTML correspondant à une image (+ loupe) cliquable pour obtenir un zoom.
 * @param a_id		(String)	numéro de la maquette ('01' à '10')
 * @param a_index	(int)		index de l'image dans la page (0 par défaut)
 */
function addMaquetteImage(a_id, a_index) {
 	a_index = (a_index) ? a_index : '';
	var l_bufHRef = '<a href="javascript:void(0);" onclick="maquette(\'' + a_id + '\')"';

	// image elle-même
	var l_buf = l_bufHRef + '>' + '<img src="../_imgs/_03-imgs-collections/030701-' + a_id + '-off.jpg" title="Voir aussi la maquette"/></a>';
	l_buf += '<br/>';
	
	// loupe
	l_buf += l_bufHRef + 'onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage(\'also' + a_index + '\', \'\', \'../_imgs/alsoon.gif\', 1)">';
	l_buf += '<img src="../_imgs/alsooff.gif" title="Agrandir l\'image" name="also' + a_index + '" width="85" height="17"></a><br/>';
	
	// on écrit
	document.write(l_buf);
}

/**
 * Affiche au besoin les flèches de nvaigation de bas de page.
 */
function addBottomNav() {
	// on recherche les onglets précédant et suivant
	var l_navs = searchBottomNav(ONGLETS, KEYS[2]);
	
	// on ajoute le code correspondant
	document.write(writeBottomNav(l_navs[0], l_navs[1]));
}

/**
 * Renvoie les onglets précédant et suivant de la clé fournie.
 * @param	a_items		(Object[])		tableau des définitions des onglets
 * @param	a_key		(String)		clé de l'onglet courant
 * @return	[prevUrl, nextUrl]
 */
function searchBottomNav(a_items, a_key) {
	var l_prev = null, l_next = null;
	// on récupère les onglets associés
	if (und(a_items) || (a_items.length == 2)) {
		// format + 1 -> pas d'onglet en fait -> on affiche uniquement la flèche 'top'
	} else {
		// on parcours le tableau pour trouver l'index correspondant à l'onglet courant
		var l_key;
		for (var i = 1; i < a_items.length; i++) {
			l_key = a_items[i].key || a_items[i].code
			if (l_key == a_key) {
				// c'est bon, on l'a
				break;
			}
		}
		// on récupère le précédent éventuel
		if (i > 1) {
			// il y a bien un précédent
			l_prev = a_items[i-1].url;
		}
		// on récupère le suivant éventuel
		if (i < (a_items.length - 1)) {
			// il y a bien un précédent
			l_next = a_items[i+1].url;
		}
	}
	return [l_prev, l_next];
}

/**
 * Affiche les flèches de navigation de bas de page, avec les liens ad-hoc.
 * Si un des paramètres vaut null, n'affiche pas la flèche ...
 * @param a_prev	(String)	url relative de la page précédente (ex '010101.htm')
 * @param a_next	(String)	url relative de la page suivante   (ex '010103.htm')
 */
function writeBottomNav(a_prev, a_next) {
	var l_buf = '<table width="100%" border="0" cellspacing="0" cellpadding="0">';
	l_buf += '<tr>';
	// lien vers le haut
	l_buf += '<td><a href="#top" onmouseover="MM_swapImage(\'tothetop\',\'\',\'../_imgs/arrowtopon.gif\',1)" onmouseout="MM_swapImgRestore()">';
    l_buf += '<img title="Haut de la page" height="20" src="../_imgs/arrowtopoff.gif" width="17" name="tothetop"/>';
    l_buf += '</a></td>';
	
	// lien vers la page précédente
	if (a_prev) {
		l_buf += '<td align="right"><a href="' + a_prev +'" ';
		l_buf += 'onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage(\'prec\',\'\',\'../_imgs/arrowlefton.gif\',1)">';
		l_buf += '<img src="../_imgs/arrowleftoff.gif" title="page précédante" name="prec" width="20" height="17"/>';
		l_buf += '</a></td>'
	} else {
		l_buf += '<td>&nbsp;</td>';
	}
	l_buf += '<td>&nbsp;</td>';
	// lien vers la page suivante
	if (a_next) {
		l_buf += '<td align="right" width="110"><a href="' + a_next +'" ';
		l_buf += 'onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage(\'suivante\',\'\',\'../_imgs/arrowrighton.gif\',1)">';
		l_buf += '<img src="../_imgs/arrowrightoff.gif" title="page suivante" name="suivante" width="20" height="17"/>';
		l_buf += '</a></td>'
	} else {
		l_buf += '<td width="110">&nbsp;</td>';
	}
	l_buf += '</tr>';
	l_buf += '</table>';

	// on renvoie le code HTML
	return l_buf;
}

/**
 * Initialise la page : tous les menus présents sur la page, ainsi que le titre.
 */
function init() {
	// menu principal
	menu.init();
	menu.show();
   
	// menu gauche
	/* utilisation du composant Onglet -> rien à faire
	if (menug) {
		menug.init();
		menug.show();
	}
	*/
   
	// onglets
	if (onglets && (onglets.items.length > 1)) {
		onglets.init();
		onglets.show();
	}
		
	// on modifie le titre du document
	var l_titre = LABELS[1];
	if (!und(l_titre)) {
		window.document.title = (LABELS[2]) ? l_titre + ' : ' + LABELS[2] : l_titre;
	}
}

/**
 * Exécute la commande particulière spécifiée.
 * @param a_command		(String)	commande à transmettre au serveur
 */
function executeCommand(a_command) {
	return staticExecuteCommand(a_command);
}

/**
 * Exécute la commande particulière spécifiée.
 * @param a_command		(String)	commande à transmettre au serveur
 */
function staticExecuteCommand(a_command) {
	// on analyse la chaîne de commande
	var l_commands = a_command.split(":");
	
	// on construit l'url, en décomposant la clé
	var l_keys = l_commands[0].split(".");
	var l_url = '../control?key=' + l_keys[0] + '&_action=' + l_commands[0];
	if (l_commands.length > 1) {
		l_url += '&link_id=' + l_commands[1];
	}
	
	// on affiche cette page
	location.href = l_url;
}

/**
 * Fonction appelée sur le onload du body
 */
function loaded() {
	// ne fait rien ici, utile pour les pages particulières
}

/**********************************************************************************************/
/*******   gestion de l'ouverture / fermeture des div *****************************************/
/**********************************************************************************************/

var __DIV_OPEN = '';

function changeVisibility(a_divId, a_vis) {
	var l_vis = a_vis | true;
	
	if (a_divId == __DIV_OPEN) {
		// c'est le même id que celui déjà ouvert
		if (a_vis) {
			// on ne fait rien
			return;
		}
		l_vis = a_vis | false;
	}

	if (__DIV_OPEN != '') {
		// on ferme l'ancien
		defineVisibility(__DIV_OPEN, false);
	}
	if (__DIV_OPEN != a_divId) {
		// on ouvre le nouveau
		defineVisibility(a_divId, l_vis);
	}
	if (l_vis) {
		// on conserve le nouveau
		__DIV_OPEN = a_divId;
	} else {
		__DIV_OPEN = '';
	}	
}

/**
 * Définit la visibilité du texte contenu dans le div spécifié, et modifie la css du titre
 * @param	a_divId		(String)	id du div contenant le texte
 * @param	a_vis		(boolean)	true si visible, false sinon
 */
function defineVisibility(a_divId, a_vis) {
	xbGetElementById(a_divId).style.display = a_vis ? "block" : "none";
	//var l_titDiv = xbGetElementById(a_divId + '_tit');
	//l_titDiv.className = defineLineCSS(l_titDiv.className, a_vis);
}

var CSS_SELECTED = 'divSel';

/**
 * Renvoie la nouvelle CSS, en fonction de l'ancienne et de la valeur de a_selected
 * @param	a_oldCSS	(String)	ancienne valeur de la CSS
 * @param	a_selected	(boolean)	true si sélection, false sinon
 * @return la nouvelle CSS
 */
function defineLineCSS(a_oldCSS, a_selected) {
	var l_cssParts = a_oldCSS.split(' ');
	var l_nbParts = l_cssParts.length;

	if (a_selected) {
		if (l_cssParts[l_nbParts -1] != CSS_SELECTED) {
			// on ajoute la css à la fin
			l_cssParts[l_nbParts] = CSS_SELECTED;
			l_nbParts++;
		}
	} else {
		if (l_cssParts[l_nbParts -1] == CSS_SELECTED) {
			// on supprime la dernière CSS
			l_nbParts--;
		}
	}

	// on reconstruit la CSS
	var l_newCSS = '';
	for (var i = 0; i < l_nbParts; i++) {
		l_newCSS += ' ' + l_cssParts[i];
	}
	return l_newCSS.substring(1);
}

