var _ST_ALL_ONGLETS = new Object();

/**
 * Composant permettant d'afficher une barre d'onglets
 * @param a_id		(String)	identifiant unique sur la page
 * @param a_format	(Object)	définition du format
 */
function Onglets(a_id, a_format) {
	this.id = a_id;
	this.format = a_format || new Object();
	
	this.items = [];
    this.keys = new Object(); 
    
    // on conserve tous les objets onglets (pour la gestion des rollover)
    _ST_ALL_ONGLETS[this.id] = this;
}

/**
 * permet la compatibilité parfaite entre menu et onglets
 */
Onglets.prototype.init = function() {
}


/**
 * Définit les différents onglets.
 * @param  a_items		(Object[])	tableau de définition des items
 */
Onglets.prototype.setItems = function(a_items) {
	// on supprime tous les items
	this.items.length = 0;
	
	if (und(a_items)) {
		// on arrête de suite
		return;
	}
	
	// on définit le format éventuel et les items
	var l_item;
	var l_index = 0;
	for (var i = 0; i < a_items.length; i++) {
		if ((i == 0) && und(a_items[i].code)) {
			// définition du format commun à tous les onglets
			this.format = a_items[0];
		} else {
			l_item = new OngletItem(this, l_index, a_items[i], a_items[i].format || this.format);
			this.items[l_index++] = l_item;
			this.keys[l_item.getKey()] = l_item;
		}
	}
}

/**
 * Affiche les différents onglets définis.
 * @param  a_items		(Object[])	tableau de définition des items (éventuellement nul)
 */
Onglets.prototype.show = function(a_items) {
	if (!und(a_items)) {
		// on change les items
		this.setItems(a_items);
	}
	
	// on 'crée' une cellule td par item
	var l_nb = this.items.length;
	var l_buf;
	if (l_nb > 0) {
		l_buf = this.initTable;
		for (var i = 0; i < l_nb; i++) {
			// on définit la cellule
			l_buf += this.createCell(i);
		}
		l_buf += '</table>';
	} else {
		// on ajoute un nbsp
		l_buf = '<span style="font-size:4px">&nbsp;</span>';
	}

	// on récupère l'élément parent
	if (!this.root) {
		this.root = xbGetElementById(this.id);
	}
	
	// on remplace le code HTML
	xbSetInnerHTML(this.root, l_buf);
}

/**
 * Sélectionne l'item correspondant à la clé fournie.
 * @param	a_key	(String)	clé de l'item
 */
Onglets.prototype.selectItem = function(a_key) {
	// on désélectionne l'éventuel précédent
	if (!und(this.selected)) {
		this.selected.unselect();
		this.selected = null;
	}
	if (!und(a_key)) {
		// on essaie de sélectionner le nouveau
		var l_item = this.keys[a_key];
		if (!und(l_item)) {
			l_item.setState(l_item.STATE_SELECTED);
			this.selected = l_item;
			return l_item;
		}
	}
	return null;
}

/**
 * Bloque / débloque les différents items, en fonction du booléen spécifié.
 * @param  a_blocked		(boolean)	true si les items doivent être bloqués
 */
Onglets.prototype.setBlocked = function(a_blocked) {
	var l_nb = this.items.length;
	for (var i = 0; i < l_nb; i++) {
		// on bloque l'item
		this.items[i].setBlocked(a_blocked);
	}
}

/**************************************************************************************************/
/**
 * Composant permettant d'afficher une barre d'onglets veerticale
 * @param a_id		(String)	identifiant unique sur la page
 * @param a_format	(Object)	définition du format
 */
function OngletsVert(a_id, a_format) {
	this.inheritFrom(a_id, a_format);
	this.initTable = '<table border="0" cellspacing="0" cellpadding="0" width="100%">';
}

OngletsVert.prototype = new Onglets();
OngletsVert.prototype.inheritFrom = Onglets;

/**
 * Ajoute le code initial (table) à l'endroit de l'appel.
 * @param	a_div	(HTML div)	éventuel div dans lequel écrire le code initial
 *								(si non défini, écriture directe dans le document)
 */
OngletsVert.prototype.initTop = function(a_div) {
	var l_s = '<span style="width:100%;" id="' + this.id + '" name="' + this.id + '"></span>';
	// on écrit
	if (a_div) {
		xbSetInnerHTML(a_div, l_s);
	} else {
		document.write(l_s);
	}
}

/**
 * Renvoie le code HTML correspondant à la cellule spécifiée par son index.
 * @param	a_index (int)	index de l'item
 */
OngletsVert.prototype.createCell = function(a_index) {
	var l_item = this.items[a_index];
	
	var l_buf = '<tr>';
	
	// on regarde si on a défini une image
	var l_imgSrc = this.format["image"];
	if (!und(l_imgSrc)) {
		// on ajoute une td contenant l'image
		l_buf += '<td width="11"><img src="' + l_imgSrc + '"/></td>';
	}
	
	// on crée la cellule principale
	l_buf += '<td';

	// on regarde la hauteur
	var l_size = l_item.getFormatProp("size");
	if (!und(l_size) && (l_size[0] > 0)) {
		// on récupère la hauteur
		l_buf += ' height="' + l_size[0] + 'px"';
	}
	
	// on ajoute les éléments communs
	l_buf += l_item.display();
	
	// on ferme la tr
	l_buf += '</tr>';
	
	return l_buf;
}

/**************************************************************************************************/

/**
 * Composant permettant d'afficher une barre d'onglets horizontale
 * @param a_id		(String)	identifiant unique sur la page
 * @param a_format	(Object)	définition du format
 */
function OngletsHoriz(a_id, a_format) {
	this.inheritFrom(a_id, a_format);
	this.initTable = '<table border="0" cellspacing="0" cellpadding="0">';
}

OngletsHoriz.prototype = new Onglets();
OngletsHoriz.prototype.inheritFrom = Onglets;

/**
 * Ajoute le code initial (table) à l'endroit de l'appel.
 * @param	a_div	(HTML div)	éventuel div dans lequel écrire le code initial
 *								(si non défini, écriture directe dans le document)
 */
OngletsHoriz.prototype.initTop = function(a_div) {
	var l_s = '<span id="' + this.id + '" name="' + this.id + '"></span>';
	// on écrit
	if (a_div) {
		xbSetInnerHTML(a_div, l_s);
	} else {
		document.write(l_s);
	}
}

/**
 * Renvoie le code HTML correspondant à la cellule spécifiée par son index.
 * @param	a_index (int)	index de l'item
 */
OngletsHoriz.prototype.createCell = function(a_index) {
	var l_item = this.items[a_index];
	
	var l_buf = '<td';
	// on regarde la largeur
	var l_size = l_item.getFormatProp("size");
	if (!und(l_size) && (l_size[1] > 0)) {
		// on récupère la largeur
		l_buf += ' width="' + l_size[1] + 'px"';
	}
	// on ajoute les éléments communs
	l_buf += l_item.display();
	
	return l_buf;
}



/**************************************************************************************************/

/**
 * Objet représentant un onglet au sein d'une barre d'onglets
 * @param a_onglets		(Onglets)	barre d'onglets 'parente'
 * @param a_index 		(int)		index de l'item
 * @param a_itemDef		(Object)	définition de l'item
 * @param a_format		(Object)	définition du format de l'item
 */
function OngletItem(a_onglets, a_index, a_itemDef, a_format) {
	if (und(a_onglets)) {
		// utilisation par les classes dérivées -> on ne fait rien
		return;
	}
	this.onglets = a_onglets;
	this.id = a_onglets.id + ':' + a_index;
	this.itemDef = a_itemDef;
	
	this.format = a_format;
	this.style = this.getFormatProp("style");
	
	// on définit l'état
	var l_sel = this.getFormatProp("selected");
	var l_dis = this.getFormatProp("disabled");
	if (!und(l_sel) && (l_sel == "yes")) {
		this.state = this.STATE_SELECTED;
	} else if (!und(l_dis) && (l_dis == "yes")) {
		this.state = this.STATE_DISABLED;
	} else {
		this.state = this.STATE_NORMAL;
	}
	this.isBlocked = false;
	this.cell = null;
}
/**
 * constantes d'état
 */
OngletItem.prototype.STATE_NORMAL = 0; 
OngletItem.prototype.STATE_SELECTED = 1; 
OngletItem.prototype.STATE_DISABLED = 2;

/**
 * Renvoie le code HTML de l'item dans le buffer fourni.
 * @return le code HTML
 */
OngletItem.prototype.display = function() {
	// on conserve la référence de la cellule
	var l_buf = ' id="' + this.id + '" name="' + this.id + '"';
	
	// on définit son style
	l_buf += ' class="' + this.getCSS(false) + '"';
	
	// on rajoute les contrôles d'événements
	l_buf += ' onmouseover="if (window.OngletItem_onMouseOver) OngletItem_onMouseOver(this, \'' + this.id + '\')"';
	l_buf += ' onmouseout="if (window.OngletItem_onMouseOut) OngletItem_onMouseOut(this, \'' + this.id + '\')"';
	
	if (this.state == this.STATE_NORMAL) {
		// on définit le gestionnaire de "clic"
		l_buf += ' onclick="if (window.OngletItem_onClick) OngletItem_onClick(this, \'' + this.id + '\')"';
	}
	// on ferme le tag ouvrant
	l_buf += '>';
	
	// on définit son contenu
	var l_code = this.itemDef.code;
	if (!und(l_code)) {
		l_code = l_code.replace(/ /g, "&nbsp;");
	} else {
		l_code = "&nbsp;";
	}
	l_buf += l_code;
	
	// on ferme le tag
	l_buf += '</td>';
	
	// on renvoie le code
	return l_buf;
}
/**
 * Renvoie la clé de l'item.
 * @return la clé
 */
OngletItem.prototype.getKey = function() {
	if (und(this.key)) {
		this.key = this.itemDef.key || this.itemDef.code;
	}
	return this.key;
}

/**
 * Renvoie le propriété de format spécifiée par son nom.
 * @param	a_name		(String)	nom de la propriété de format désirée
 * @return la valeur de la propriété
 */
OngletItem.prototype.getFormatProp = function(a_name) {
	// on recherche la propriété dans le format de l'item
	var l_prop = this.format[a_name];
	if (und(l_prop)) {
		// elle n'existe pas -> on regarde dans le format des onglets
		l_prop = this.onglets.format[a_name];
	}
	return l_prop;
}


/**
 * Met à jour l'aspect visuel de l'item.
 */
OngletItem.prototype.updateCSS = function() {
	// on modifie la cellule
	if (!this.cell) {
		this.cell = xbGetElementById(this.id);
	}
	if (this.cell) {
		// on change son apparence
		this.cell.className = this.getCSS(false);
	}
}

/**
 * Indique si l'item doit être bloqué.
 * @param 	a_blocked 	(bool)	true si item bloqué
 */
OngletItem.prototype.setBlocked = function(a_blocked) {
	this.isBlocked = a_blocked;
	// mise à jour de l'aspect visuel
	this.updateCSS();
	
}

/**
 * Indique l'état courant de l'item.
 * @param 	a_state 	(int)	nouvel état de l'item
 */
OngletItem.prototype.setState = function(a_state) {
	this.state = a_state;
	// mise à jour de l'aspect visuel
	this.updateCSS();
}

/**
 * Désélectionne l'item, en reprenant son ancien état si disabled
 */
OngletItem.prototype.unselect = function() {
	var l_dis = this.getFormatProp("disabled");
	var l_state;
	if (!und(l_dis) && (l_dis == "yes")) {
		l_state = this.STATE_DISABLED;
	} else {
		l_state = this.STATE_NORMAL;
	}
	this.setState(l_state);
}

/**
 * Renvoie la CSS correspondant à l'état de l'item, en fonction du survol ou non
 * @param 	a_over		(boolean)		true si survol par la souris
 * @return la css correcte
 */
OngletItem.prototype.getCSS = function(a_over) {
	var l_css;
	if (this.isBlocked == true) {
		// si l'item était précédemment sélectionné, on conserve son aspect
		// (en partant du principe qu'un élément sélectionné est inactif)
		if (this.state == this.STATE_SELECTED) {
			l_css = "OFF_SEL";
		} else {
			l_css = "OFF_DIS";
		}
	} else if (a_over == true) {
		switch(this.state) {
			case this.STATE_NORMAL : l_css = "OVER"; break;
			case this.STATE_SELECTED : l_css = "OVER_SEL"; break;
			case this.STATE_DISABLED : l_css = "OVER_DIS"; break;
		}
	} else {
		switch(this.state) {
			case this.STATE_NORMAL : l_css = "OFF"; break;
			case this.STATE_SELECTED : l_css = "OFF_SEL"; break;
			case this.STATE_DISABLED : l_css = "OFF_DIS"; break;
		}
	}
	return this.style.css[l_css];
}

/**
 * Renvoie l'item spécifié par l'id de sa barre et son id.
 * @param a_itemId		(int)		id (index) de l'onglet
 * @return l'OngletItem correspondant
 */
function OngletItem_getItem(a_itemId) {
	if (window._ST_ALL_ONGLETS) {
		var l_ids = a_itemId.split(':');
		if (_ST_ALL_ONGLETS[l_ids[0]]) {
			return _ST_ALL_ONGLETS[l_ids[0]].items[l_ids[1]];
		} else {
			return null;
		}
	} else {
		return null;
	}
}

/**
 * Gestionnaire appelé sur un événement 'mouseover'.
 * @param a_cell		(TDelt)		cellule courante (= this)
 * @param a_itemId		(String)	id (index) de l'onglet
 */
function OngletItem_onMouseOver(a_cell, a_itemId) {
	var l_item = OngletItem_getItem(a_itemId);
	if (l_item) {
		a_cell.className = l_item.getCSS(true);
	}
}

/**
 * Gestionnaire appelé sur un événement 'mouseout'.
 * @param a_cell		(TDelt)		cellule courante (= this)
 * @param a_itemId		(String)	id (index) de l'onglet
 */
function OngletItem_onMouseOut(a_cell, a_itemId) {
	var l_item = OngletItem_getItem(a_itemId);
	if (l_item) {
		a_cell.className = l_item.getCSS(false);
	}
}

/**
 * Gestionnaire appelé sur un événement 'click'.
 * @param a_cell		(TDelt)		cellule courante (= this)
 * @param a_itemId		(String)	id (index) de l'onglet
 */
function OngletItem_onClick(a_cell, a_itemId) {
	var l_item = OngletItem_getItem(a_itemId);
	if (und(l_item) || (l_item.state != l_item.STATE_NORMAL) || (l_item.isBlocked == true)) {
		// pas de clic possible -> on ne fait rien
		return;
	}
	
	var l_url = l_item.itemDef.url;
	
	if (!und(l_url)) {
		var l_pos = l_url.indexOf('javascript:');
		if (l_pos == 0) {
			// appel d'une méthode javascript
			if (l_url.indexOf('executeCommand') > 0) {
				// on récupère le contenu de la chaîne
				var l_parts = l_url.split("'");
				executeCommand(l_parts[1]);
			} else {
				eval(l_url.substring(l_pos + 11));
			}
		} else {
			// on essaie de récupérer la variable "process" dans l'url de la page courante
			var l_args = extractQueryParams();
			var l_process = l_args.process;
			if (!und(l_process)) {
				// on a bien une valeur -> on l'ajoute à l'url
				// on regarde si l'url contient déjà des paramètres
				var l_pos = l_url.indexOf("?");
				// si oui, on ajoute ('&') le paramètre, sinon, on crée une chaîne de param ('?')
				l_url += ((l_pos > 0) ? '&' : '?') + 'process=' + l_process;
			}
		
			// cas simple du changement de page
			var l_target = l_item.itemDef.target;
			if (und(l_target)) {
				// redirection simple
				location.href = l_url;
			} else {
				// changement de target ...
				if (l_target.indexOf("blank") >= 0) {
					// ouverture d'une nouvelle fenêtre
				} else if (l_target.indexOf("parent") >= 0) {
					// changement de page complète
					parent.location.href = l_url;
				} else {
					// redirection d'une autre frame
					// de la page courante ?
					var l_otherFrame = window[l_target];
					if (und(l_otherFrame)) {
						// de la page parente ?
						l_otherFrame = parent[l_target];
					}
					if (und(l_otherFrame)) {
						// on alerte le développeur
						alert("Impossible de modifier la frame " + l_target);
					} else {
						// c'est bon, on redirige
						l_otherFrame.location.href = l_url;
					}
				}
			}
		}
	}
}


 
