// Taille initiale du contenu de l'iframe de menu plat
var ifWidth = 0;

// Affichage de traces pour debug
var isDebug = false;
	
/**
 * Fonction permettant de masquer ou d'afficher le menu.
 *
 * @param isSousMenu : boolean permettant de distinguer l'affichage
 *			d'un menu plat de l'affichage d'un menu arborescence.
 * @param isCollapsed : boolean permettant de déterminer si l'état 
 * 			initial du menu est masqué ou affiché.
 * @see wch.js
 * @version 2.0
 */
function show_hide(isSousMenu, isCollapsed) {
	var isMenuToHide = false;
	printToDebug('isSousMenu='+isSousMenu+';isCollapsed='+isCollapsed);
	
	if ( isSousMenu != 'true' ){
		printToDebug('type=arbo');
		var divMenu = document.getElementById('menu');

		_gererEtatInitial(divMenu,isCollapsed);
				
		if(divMenu.style.visibility=="visible"){
			divMenu.style.visibility="hidden";
			WCH.Discard('menu');
		}else{
			divMenu.style.visibility="visible";
			WCH.Apply('menu');
		}
	}else{
		printToDebug('type=other');
		var divMenu = window.parent.document.getElementById("divmenu");
		var divFlechMenu = window.parent.document.getElementById("divflechmenu");
		
		_gererEtatInitial(divMenu,isCollapsed);

		if(divMenu.style.visibility=="visible"){
			divMenu.style.visibility="hidden";
			divFlechMenu.style.visibility="visible";
		}else{
			divMenu.style.visibility="visible";
			divFlechMenu.style.visibility="hidden";		
		}	
	}
}


/**
 * Fonction permettant de gérer l'état initial du div contenant le menu.
 * Lors de la création du div contenant le menu on ne lui affecte pas 
 * sa visibilité. Du coup sans cette méthode il faut cliquer 2 fois sur
 * l'icone pour masquer/montrer le menu.
 *
 * @param mydiv : le tag <div> qu'on veut impacter.
 * @param isCollapsed : boolean permettant de donner le style correspondant
 *				à l'état du menu (hidden s'il est collapsed, visible sinon).
 * @version 1.0
 */
function _gererEtatInitial(mydiv,isCollapsed){
	if (mydiv.style.visibility == ""){
		if (eval(isCollapsed)){
			mydiv.style.visibility="hidden";
		}else{
			mydiv.style.visibility="visible";
		}
	}
}
/* ------------------- */

/**
 * Fonction de redimensionnement de l'iframe contenant le menu plat.
 * Nécessite d'être invoqué sur l'évenement window.onresize, 
 * cf. meow.js fonction meowOnLoad().
 *
 * @param frameid : le nom de l'iframe à impacter. Si non renseigné alors
 *					on prend 'ifmenu' par défaut.
 * @see meow.js
 * @version 1.2 
 */
function resizeIframe(frameid){

	if (frameid == null || frameid == ''){
		frameid='ifmenu';
		/*printToDebug("default ");
	}else{
		printToDebug("ifmenu ");*/
	}
	var currentfr=document.getElementById(frameid);
	var largeurAscenseur = 20;
	var tabM;
	var currentfrDocument;
	if (currentfr) {
		if (currentfr.contentDocument && currentfr.contentDocument != null) {
			try{
				currentfrDocument = currentfr.contentDocument;
				tabM = currentfrDocument.getElementById('tabMenu');
			}catch(e){
			}
		} else if (	currentfr.Document) {
			currentfrDocument = currentfr.Document;
			try{
				tabM = currentfrDocument.getElementById('tabMenu');
			}catch(e){
			}
		}
	}
			
	if (currentfr){
		// On récupère la taille initiale du tableau représentant
		// le menu, contenu dans l'iframe :
		if (tabM){
			var tabMWidth = tabM.offsetWidth;
			ifWidth = tabMWidth+12; // on ajoute une petite marge
		}
		currentfr.style.display="block";
		// La hauteur maxi correspond à la hauteur de la fenetre 
		// courante moins un petit quelque chose
		var h =document.body.clientHeight-100;
		// La largeur maxi correspond à la moitié de la fenetre courante
		var w = document.body.clientWidth/2;


		try{
			var innerFrameWidth = currentfrDocument.body.scrollWidth;
			if (innerFrameWidth > w){
				// Le menu ne doit jamais faire plus de la moitié
				// de l'écran en largeur :
				innerFrameWidth = w;
			}else{
				// On met la taille du contenu :
				innerFrameWidth = ifWidth;
			}
			currentfr.width = innerFrameWidth+largeurAscenseur;
		}catch(e){
		}			
		
		try{
			var innerFrameHeight = currentfrDocument.body.scrollHeight;
			if (innerFrameHeight > h){
				innerFrameHeight = h;
			}
			currentfr.height = innerFrameHeight+largeurAscenseur;
			
		}catch(e){
		}

		if (currentfr.attachEvent){
			currentfr.detachEvent("onload", readjustIframe) // Bug fix line
			currentfr.attachEvent("onload", readjustIframe)
		} else {
			addLoadEvent(currentfr,readjustIframe);
		}
	}

}

function addLoadEvent(frame2, func){
	var oldonload = frame2.onload;
	if (typeof frame2.onload != 'function'){
		frame2.onload = func;
	}else{
		frame2.onload = function(){
			oldonload();
			func('ifmenu');
		}
	}
}

function readjustIframe(loadevt) {
	var crossevt=(window.event)? event : loadevt
	if (crossevt) {
		var iframeroot=(crossevt.currentTarget)? crossevt.currentTarget : crossevt.srcElement
		if (iframeroot){
			resizeIframe(iframeroot.id);
		}
	} else {
		resizeIframe('ifmenu');
	}
}

/** 
 * Fonction d'affichage des élements d'un menu.
 * Appelé notamment par meow.web.taglibs.RendererHTML.afficherNiveau().
 * La gestion du décalage des élements est traitée ici.
 *
 * @param level : le niveau de l'élément; permet de calculer le décalage
 * @param image : l'url de l'image à associer à l'élément
 *				(node ouvert, node fermé, leaf)
 * @param action : l'url à invoquer lors du clic sur l'élément. 
 *				Il n'y en a pas pour un père.
 * @param target : la partie d'écran à impacter. 
 * 				Ex:"" pour un sous élément de menu, " target=\"_top\" " pour un leaf.
 * @param label : le libellé de l'élément
 * @param desc : descriptif de l'action liée à l'élément
 * @param enabled : flag indiquant si l'élément est actif (cliquable) ou passif
 * @version 1.2
 */
function afficherMenu(level,image,action,target,label,desc,enabled){
	var stringToDisplay = '';
	var spaces = "&nbsp;";
	var isPere = (action == '');
	for (i=0; i<level;i++){
		spaces+="&nbsp;";
	}
	
	stringToDisplay += ("<TR><TD nowrap class=\"menubody\">" + spaces + "<img src=\"" + image + "\" width=\"15\" height=\"15\" align=\"absmiddle\">&nbsp;");
	if ( ! isPere ){
		if (eval(enabled)){
			stringToDisplay += ("<a class=\"menulink\" href=\"" + action +"\"" + target +" >");
		}else{
			stringToDisplay += "<FONT style=\"font-style: italic;\" color=\"gray\">";
		}
	}

	stringToDisplay += (label);

	if ( ! isPere  ){
		if (eval(enabled)){
			stringToDisplay += "</a>";
		}else{
			stringToDisplay += "</FONT>";
		}
	}
	
	stringToDisplay += "</TD></TR>\n";
		
	document.write(stringToDisplay);	
}

/** 
 * Fonction écrivant les traces soit
 * dans le status, limité à 100 chars 
 * (au delà on vide le status et on
 * recommence à écrire),
 * soit dans une autre page.
 * /!\ l'écriture dans une autre page 
 * ralenti l'affichage des pages /!\
 *
 * @param msg : le message à afficher
 * @version 1.1
 */
function printToDebug(msg){
	if (isDebug) {
		msg += "; ";
		var isTraceToStatus = false;
		var statusLimit = 100;
		 
		if (isTraceToStatus){
			var l = window.status.length;
			if (l + msg.length > statusLimit)
		 		window.status = '';
			window.status += msg;
		}else{
			try{
				var wFille = window.open('', 'wFille', 'height=100,width=375,scrollbars=yes');
				wFille.document.write('<li>' + new Date() + '-' + msg + '</li>');
				var wFilleHeight = wFille.document.body.scrollHeight;

				// Scroller en bas de la page fille :
				wFille.scrollTo(0, wFilleHeight);			
			}catch(e){
				alert(e + '-' + e.message);
			}
			
		}

	}
}
