var _ST_ALL_ONGLETS_IMAGE = 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 OngletsImage(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_IMAGE[this.id] = this;
}

/**
 * permet la compatibilité parfaite entre menu et onglets
 */
OngletsImage.prototype.init = function() {
}


/**
 * Définit les différents onglets.
 * @param  a_items		(Object[])	tableau de définition des items
 */
OngletsImage.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 OngletImageItem(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)
 */
OngletsImage.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 += this.endTable;
	} 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
 */
OngletsImage.prototype.selectItem = function(a_key) {
	// on désélectionne l'éventuel précédent
	if (!und(this.selected)) {
		this.selected.setState(OngletImageItem.prototype.STATE_NORMAL);
		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
 */
OngletsImage.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 OngletsImageVert(a_id, a_format) {
	this.inheritFrom(a_id, a_format);
	this.initTable = '<table border="0" cellspacing="0" cellpadding="0" width="100%">';
	this.endTable = '</table>';
}

OngletsImageVert.prototype = new OngletsImage();
OngletsImageVert.prototype.inheritFrom = OngletsImage;

/**
 * Ajoute le code initial (table) à l'endroit de l'appel.
 */
OngletsImageVert.prototype.initTop = function() {
	var l_s = '<span style="width:100%;" id="' + this.id + '" name="' + this.id + '"></span>';
	// on écrit
	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
 */
OngletsImageVert.prototype.createCell = function(a_index) {
	var l_item = this.items[a_index];
	
	var l_buf = '<tr>';
	
	// 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] + '"';
	}
	
	// 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 OngletsImageHoriz(a_id, a_format) {
	this.inheritFrom(a_id, a_format);
	this.initTable = '<table border="0" cellspacing="0" cellpadding="0"><tr>';
	this.endTable = '</tr></table>';
}

OngletsImageHoriz.prototype = new OngletsImage();
OngletsImageHoriz.prototype.inheritFrom = OngletsImage;

/**
 * Ajoute le code initial (table) à l'endroit de l'appel.
 */
OngletsImageHoriz.prototype.initTop = function() {
	var l_s = '<span id="' + this.id + '" name="' + this.id + '"></span>';
	// on écrit
	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
 */
OngletsImageHoriz.prototype.createCell = function(a_index) {
	var l_item = this.items[a_index];
	
	var l_buf = '<td align="left" valign="middle"';
	// 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		(OngletsImage)	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 OngletImageItem(a_onglets, a_index, a_itemDef, a_format) {
	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
 */
OngletImageItem.prototype.STATE_NORMAL = 0; 
OngletImageItem.prototype.STATE_SELECTED = 1; 
OngletImageItem.prototype.STATE_DISABLED = 2;

/**
 * Renvoie le code HTML de l'item dans le buffer fourni.
 * @return le code HTML
 */
OngletImageItem.prototype.display = function() {
	var l_buf = '>';

	// on conserve la référence de la cellule
	l_buf += '<img id="' + this.id + '" name="' + this.id + '"';
	
	// on rajoute les contrôles d'événements
	var l_key = this.itemDef.key;
	if (!und(l_key)) {
		l_buf += ' onmouseover="if (window.OngletImageItem_onMouseOver) OngletImageItem_onMouseOver(this, \'' + this.id + '\')"';
		l_buf += ' onmouseout="if (window.OngletImageItem_onMouseOut) OngletImageItem_onMouseOut(this, \'' + this.id + '\')"';
	}
	
	if (this.state == this.STATE_NORMAL) {
		// on définit le gestionnaire de "clic"
		l_buf += ' onclick="if (window.OngletImageItem_onClick) OngletImageItem_onClick(this, \'' + this.id + '\')"';
	}
	
	// on définit son contenu image
	var l_imgSrc;
	if (und(l_key)) {
		l_imgSrc = this.getFormatProp("imgsDir") + '_sep.gif';
	} else {
		l_imgSrc = this.getFormatProp("imgsDir") + l_key.substring(l_key.length-2) + this.getImgSuffixe(false) + '.gif';
	}
	l_buf += ' src="' +  l_imgSrc + '"';

	// on ferme l'image
	l_buf += '/>';

	// on ferme le tag
	l_buf += '</td>';
	
	// on renvoie le code
	return l_buf;
}
/**
 * Renvoie la clé de l'item.
 * @return la clé
 */
OngletImageItem.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é
 */
OngletImageItem.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.
 * @param 	a_over		(boolean)		true si survol par la souris
 */
OngletImageItem.prototype.updateImage = function(a_over) {
	// on modifie la cellule
	if (!this.cell) {
		this.cell = xbGetElementById(this.id);
	}
	if (this.cell) {
		// on change son image
		var l_imgSrc = this.cell.src;
		// on récupère le "début" du nom complet
		l_imgSrc = l_imgSrc.substring(0, l_imgSrc.lastIndexOf('_'));
		l_imgSrc = l_imgSrc + this.getImgSuffixe(a_over) + '.gif'
		this.cell.src = l_imgSrc;
		// on "change" le style
		this.cell.className = (this.isActive()) ? "activeImg" : "inactiveImg";
	}
}

/**
 * Indique si l'item doit être bloqué.
 * @param 	a_blocked 	(bool)	true si item bloqué
 */
OngletImageItem.prototype.setBlocked = function(a_blocked) {
	this.isBlocked = a_blocked;
	// mise à jour de l'aspect visuel
	this.updateImage();
	
}

/**
 * Indique l'état courant de l'item.
 * @param 	a_state 	(int)	nouvel état de l'item
 */
OngletImageItem.prototype.setState = function(a_state) {
	this.state = a_state;
	// mise à jour de l'aspect visuel
	this.updateImage();
}

/**
 * Renvoie le suffixe de l'image correspondant à l'état de l'item, en fonction du survol ou non
 * @param 	a_over		(boolean)		true si survol par la souris
 * @return le suffixe correct
 */
OngletImageItem.prototype.getImgSuffixe = function(a_over) {
	var l_suff;
	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_suff = "_sel";
		} else {
			l_suff = "_dis";
		}
	} else if (a_over == true) {
		switch(this.state) {
			case this.STATE_NORMAL : l_suff = "_over"; break;
			case this.STATE_SELECTED : l_suff = "_sel"; break;
			case this.STATE_DISABLED : l_suff = "_dis"; break;
		}
	} else {
		switch(this.state) {
			case this.STATE_NORMAL : l_suff = "_off"; break;
			case this.STATE_SELECTED : l_suff = "_sel"; break;
			case this.STATE_DISABLED : l_suff = "_dis"; break;
		}
	}
	return l_suff;
}

/**
 * Renvoie true si l'image dispose d'un style indiquant une action possible (pointeur)
 * @return true
 */
OngletImageItem.prototype.isActive = function() {
	if (this.isBlocked == true) {
		return false;
	} else {
		return (this.state == this.STATE_NORMAL);
	}
}

/**
 * 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'OngletImageItem correspondant
 */
function OngletImageItem_getItem(a_itemId) {
	if (window._ST_ALL_ONGLETS_IMAGE) {
		var l_ids = a_itemId.split(':');
		if (_ST_ALL_ONGLETS_IMAGE[l_ids[0]]) {
			return _ST_ALL_ONGLETS_IMAGE[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 OngletImageItem_onMouseOver(a_cell, a_itemId) {
	var l_item = OngletImageItem_getItem(a_itemId);
	if (l_item) {
		l_item.updateImage(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 OngletImageItem_onMouseOut(a_cell, a_itemId) {
	var l_item = OngletImageItem_getItem(a_itemId);
	if (l_item) {
		l_item.updateImage(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 OngletImageItem_onClick(a_cell, a_itemId) {
	var l_item = OngletImageItem_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;
					}
				}
			}
		}
	}
}


 