/**
 * Fenêtres et boites de dialogue DHTML.
 * Méthodes principales :
 *   - openInnerWindow : Affichage d'une url dans une fenêtre.
 *   - showMessageDialog : Affichage d'une boite de dialogue de message.
 *   - showConfirmDialog : Affichage d'une boite de dialogue de confirmation.
 */

/**
 * Ouverture d'une url dans une fenêtre.
 */
function openInnerWindow(title, url, width, height, returnFunc, id)
{
	if(!id)
	{
		id	= "gendlgid" + generatedDialogId++;
	}
	var winInstance = new DHTMLWindow(id);
	winInstance.show(title, url, width, height, returnFunc, "window");
	return id;
}

/**
 * Ouverture d'une boite de dialogue de message.
 * Pour simplification un ou plusieurs des trois derniers paramètres peuvent être ignorés.
 */
function showMessageDialog(title, message, messageType, returnFunc, id)
{
	if(!id)
	{
		id	= "gendlgid" + generatedDialogId++;
	}
	showInnerDialog(id, title, message, messageType, "default", null, null, returnFunc);

	return id;
}

/**
 * Ouverture d'une boite de dialogue de confirmation.
 */
function showConfirmDialog(title, message, messageType, optionType, returnFunc, id)
{
	if(!id)
	{
		id	= "gendlgid" + generatedDialogId++;
	}
	showInnerDialog(id, title, message, messageType, optionType, null, null, returnFunc);

	return id;
}

/**
 * Fonction complète pour l'affichage des dialogues
 */
function showInnerDialog(id, title, content, messageType, optionType, options, defaultOption, returnFunc)
{
	var winInstance = new DHTMLDialog(id);
	winInstance.showDialog(title, content, messageType, optionType, options, defaultOption, returnFunc);
}

var generatedDialogId = 0;

/**
 * Ce tableau stocke les instances des popups gérés par le gestionnaire d'interface.
 * Dès qu'une popup est créée, elle est ajoutée dans cette liste.
 * avt chaque création, on vérifie l'unicité de chaque type de fenêtres.
 * Toutes ces fenêtres sont modales.
 * Parmi les types de fenêtres gérées en std, on trouve :
 * - erreur
 * - information / message
 * - confirmation
 * - autres...
 */
 var popupLst = {};


/*if(document != top.document)
{
	popupLst = window.parent.popupLst;
}*/


/**
 * Gestion du retour serveur pour les boîtes de dialogue
 * <ul>
 * <li>erreur</li>
 * <li>confirmation</li>
 * <li>information</li>
 * </ul>
 * @todo la signature de la classe Dialog a été modifiée.
 */
function handleDialog(xmlNode)
{
	var title = null;
	var message = null;
	// Type de dialogue par défaut : message
	var dialogType = xmlNode.getAttribute("type", "message");
	// Type de message par défaut : plain cad sans icone
	var messageType = xmlNode.getAttribute("messageType", "plain");
	var optionType = null;
	var returnFunc = null;
	var id = xmlNode.getAttribute("id", null);

	// Le message à afficher est contenu dans la balise message
	if(xmlNode.getElements("message") &&
		xmlNode.getElements("message").length > 0)
	{
		message = unescape(xmlNode.getElements("message")[0].getText());
	}

	var defaultTitle = "Information";
	if(messageType == "error")
	{
		defaultTitle = "Erreur";
	}
	else if(messageType == "warning")
	{
		defaultTitle = "Alerte";
	}
	else if(messageType == "question")
	{
		defaultTitle = "Question";
	}
	else
	{
		defaultTitle = "Information";
	}

	if(dialogType == 'message')
	{
		title = defaultStringValue(xmlNode.getAttribute("title"), defaultTitle);
		returnFunc = defaultStringValue(xmlNode.getAttribute("returnFunc"), null);
		optionType = "default";
		showMessageDialog(title, message, messageType, returnFunc, id);
	}
	else if(dialogType == 'confirm')
	{
		title = xmlNode.getAttribute("title");
		optionType = xmlNode.getAttribute("optionType");
		returnFunc = xmlNode.getAttribute("returnFunc");
		showConfirmDialog(title, message, messageType, optionType, returnFunc, id);
	}
	else
	{
		alert("Wrong dialog type " + dialogType);
		return;
	}
}


/**
 * Class générale pour l'affichage de window.
 */
var DHTMLWindow = Class.create();

Object.extend(DHTMLWindow.prototype, DHTMLMask.prototype);

//DHTMLWindow.prototype =
Object.extend(DHTMLWindow.prototype,
{
	/**
	 * Constructeur de la window
	 */
	initialize: function(name,options)
	{
	   popupLst[name] = this;

   	this.options = options;
//		this.gTabbableTags = new Array("A","BUTTON","TEXTAREA","INPUT","IFRAME");
//		this.gTabIndexes = new Array();
		this.gi = 0;
		this.gPopupIsShown = false;
//		this.gHideSelects = false;
		this.body = document.getElementsByTagName('body')[0];
		this.name = name;
		this.initMask("PopUpMask");

		// Recréé le composant sinon, il peut conserver des propriétés d'affichage
		// du précédent
		if($("popupContainer"))
		{
			this.body.removeChild($("popupContainer"));
		}

		this.gPopupContainer = document.createElement('div');
		this.gPopupContainer.id = "popupContainer";

		// Ajoute le container de la fenêtre au document
		this.body.appendChild(this.gPopupContainer);

		// Contenu de la fenêtre :
		//  popupTitleBar : Barre de titre
		//  popupFrame : Contenu de la boite de la fenêtre
		this.gPopupContainer.innerHTML = '' +
			'<div id="popupInner">' +
				'<div id="popupTitleBar">' +
					'<div id="popupTitle"></div>' +
					'<div id="popupControls">' +
						'<img src="./images/close.gif" onclick="hideInnerWindow(\''+name+'\', \'cancel\');" />' +
					'</div>' +
			'</div>' +
         '<div id="popupFrame"></div>';

		this.gPopFrame = $("popupFrame");

		// Cache la fenêtre pour que son centrage (sa position est en 0,0 au départ)
		//	ne provoque pas de clignotement à l'affichage.
		this.gPopupContainer.style.visibility="hidden";

		// check to see if this is IE version 6 or lower. hide select boxes if so
		// maybe they'll fix this in version 7?
//		var brsVersion = parseInt(window.navigator.appVersion.charAt(0), 10);
//		if (brsVersion <= 6 && window.navigator.userAgent.indexOf("MSIE") > -1)
//		{
//			this.gHideSelects = true;
//		}

		// Partie à regarder plus tard ???????????????????
		// Add onclick handlers to 'a' elements of class submodal or submodal-width-height
		var elms = document.getElementsByTagName('a');
		for (i = 0; i < elms.length; i++)
		{
			if (elms[i].className.indexOf("submodal") == 0)
			{
				elms[i].onclick = function()
				{
					// default width and height
					var width = 400;
					var height = 200;
					// Parse out optional width and height from className
					params = this.className.split('-');
					if (params.length == 3)
					{
						width = parseInt(params[1]);
						height = parseInt(params[2]);
					}
					this.show(this.href,width,height,null);
					return false;
				}
			}
		}
	},

	setOverflow:function(overflowValue)
	{
		this.gPopFrame.style.overflow = overflowValue;
	},

	/**
	 * Méthode d'affichage de la fenêtre
	 */
	show:function(title, content, width, height, returnFunc, pMode)
	{
		this.mode = pMode;

		// Le mode par défaut est la fenêtre
		if(!this.mode)
		{
			this.mode="window";
		}

		// En mode window, le contenu de la fenêtre est une iframe pointant sur
		// une url.
		var newContent = content;
		if(this.mode == "window")
		{
			newContent = '<iframe id="frame_' + this.name + '" src="' + content + '" scrolling="yes" width="100%" height="100%" bgcolor="#f00" frameborder="0"></iframe>';
		}

		this.gPopupIsShown = true;
//		this.disableTabIndexes();
		this.gPopupContainer.style.display = "block";
		// Initialise l'index de profondeur pour qu'il soit supérieur à celui
		// du masque de la page
		this.gPopupContainer.style.zIndex = this.maskDiv.style.zIndex + 1;

		// En mode window la hauteur et la largeur sont connus au départ
		// donc on peut centrer tout de suite
		if(this.mode == "window")
		{
			if(width && height)
			{
				this.centerPopWin(width, height);
			}
			else
			{
				this.centerPopWin(this.width, this.height);
			}
		}

		var titleBarHeight = parseInt($("popupTitleBar").offsetHeight, 10);
		this.gPopupContainer.style.width = width + "px";
		if(this.mode == "window")
		{
			this.gPopupContainer.style.height = (height+titleBarHeight) + "px";
		}

		// need to set the width of the iframe to the title bar width because of the dropshadow
		// some oddness was occuring and causing the frame to poke outside the border in IE6
		this.gPopFrame.style.width = parseInt($("popupTitleBar").offsetWidth, 10) + "px";

		if(this.mode == "window")
		{
			// En mode window, on ajoute à la fenêtre la possibilité d'avoir un
			// contenu supérieur à son container
			this.gPopFrame.style.overflow = "auto";
			this.gPopFrame.style.height = (height) + "px";
		}

		// set the url
		if(newContent)
		{
			this.gPopFrame.innerHTML = newContent;
		}
		else
		{
			this.gPopFrame.innerHTML = this.newContent
		}
		if (title)
		{
			$('popupTitle').innerHTML = title;
		}
		else
		{
			$('popupTitle').innerHTML = this.title;
		}

		if(this.gPopupContainer.offsetHeight > getInnerDocumentHeight())
		{
			//alert("too large " + this.gPopFrame.style.overflow);
			this.gPopFrame.style.overflow = "auto";
			this.gPopupContainer.style.height = (getInnerDocumentHeight()) + "px";
			this.gPopFrame.style.height = (getInnerDocumentHeight() - titleBarHeight) + "px";
		}

		// En mode dialogue, on laisse la fenêtre se dimensionner seule, puis
		// on la centre par rappotr à cette taille
		if(this.mode == "dialog")
		{
			this.centerPopWin(this.gPopupContainer.offsetWidth, null);
		}

		// Cache les boites de sélection qui sinon apparaissent par dessus la boite
		// de dialogue
//		if(this.gHideSelects == true)
//		{
//			this.hideSelectBoxes();
//		}


		// If using Mozilla or Firefox, use Tab-key trap.
//		if(!document.all)
//		{
//			this.previousKeyHandler = document.onkeypress;
//			document.onkeypress = keyDownHandler;
//		}

		this.keyHandler = createMethodReference(this, "handleKeys");
		if(!document.all)
		{
			Event.observe(window, "keypress", this.keyHandler);
		}
		else
		{
			Event.observe(document, "keypress", this.keyHandler);
		}

		this.showMask();

		// Rend visible le container après son centrage pour éviter des clignotement
		// de raffraichissement.
		this.gPopupContainer.style.visibility="visible";

		this.gReturnFunc = returnFunc;

	},

	/**
	 * Gestion des frappes de touche
	 */
	handleKeys:function(event)
	{
		// 27 : échappe
		if(this.mode == "dialog" &&
			getKeyCode(event) == 27)
		{
			this.hide(this.name, "cancel");
		}
	},

	/**
	 * Initialisation du masque empéchant les intéractions avec la page sous la fenêtre
	 */
/*	initMask:function()
	{
		if($("popupMask"))
		{
			this.gPopupMask = $("popupMask");
		}
		else
		{
			this.gPopupMask = document.createElement('div');
			this.gPopupMask.id = 'popupMask';
			this.gPopupMask.className = 'popupMask';
			this.gPopupMask.innerHTML = "&nbsp;";
			document.body.appendChild(this.gPopupMask);
			this.gPopupMask.style.zIndex = 10000;
		}
		this.resizeHandler = createMethodReference(this, "updateMaskSize");
		Event.observe(window, "resize", this.resizeHandler);
		Event.observe(window, "scroll", this.updateMaskPosition);
	},
*/
	/**
	 * Affichage du masque de la page
	 */
/*	showMask:function()
	{
//		initX = document.body.scrollWidth;
//		initY = document.body.scrollHeight;
		this.updateMaskPosition();
		this.updateMaskSize(null);
		this.gPopupMask.style.display = "block";
	},
*/
	/**
	 * Met à jour la position du masque en fonction des scrolls
	 */
/*	updateMaskPosition:function()
	{
		var gPopupMask = $("popupMask");
		var theBody = document.documentElement;
		var scLeft = getViewportX();
		var scTop = getViewportY();
		gPopupMask.style.top = scTop + "px";
		gPopupMask.style.left = scLeft + "px";
	},
*/
	/**
	 * Met à jour la taille du masque en fonction de la zone visible du document
	 * dans le navigateur.
	 */
/*	updateMaskSize:function(event)
	{
		var gPopupMask = $("popupMask");
		var fullWidth = getInnerDocumentWidth();
		gPopupMask.style.width = fullWidth + "px";
		var fullHeight = getInnerDocumentHeight();
		gPopupMask.style.height = fullHeight + "px";
		if(event)
		{
			this.centerPopWin(this.gPopupContainer.offsetWidth, this.gPopupContainer.offsetHeight);
		}
	},
*/
	/**
	 * Ecoute un évenement
	 */
/*	addListener:function(obj, evType, fn)
	{
		if(obj.addEventListener)
		{
			obj.addEventListener(evType, fn, false);
			return true;
		}
		else
			if (obj.attachEvent)
			{
				return obj.attachEvent('on' + evType, fn);
			}
			else
			{
				return false;
			}
	},
*/
/**
 * Centrage de la window
 */
centerPopWin:function(width, height)
{
	if (this.gPopupIsShown == true)
	{
		if (width == null || isNaN(width))
		{
			width = this.gPopupContainer.offsetWidth;
		}
		if (height == null)
		{
			height = this.gPopupContainer.offsetHeight;
		}

		var fullWidth = getInnerDocumentWidth();
		var fullHeight = getInnerDocumentHeight();
		var titleBarHeight = parseInt($("popupTitleBar").offsetHeight, 10);

		var scTop = Math.max(0, ((fullHeight - (height + titleBarHeight)) / 2));
		var scLeft = Math.max(0, ((fullWidth - width) / 2));

		this.gPopupContainer.style.top = scTop + "px";
		this.gPopupContainer.style.left = scLeft  + "px";
	}
},

	/**
	 * Fonction de fermeture de la fenêtre
	 */
	hide:function(callReturnFunc, response)
	{
		if(this.gPopupIsShown == false)
		{
			return;
		}

		this.gPopupIsShown = false;
//		this.restoreTabIndexes();
//		if (this.gPopupMask == null)
//		{
//			return;
//		}
//		this.gPopupMask.style.display = "none";
		this.hideMask();
		this.gPopupContainer.style.display = "none";

		if(!response)
		{
			response = "cancel";
		}

		if(callReturnFunc != false)
		{
			 this.callReturnFunction(response);
		}
		this.gPopFrame.innerHTML = './javascript/thirdparty/loading.html';
		// display all select boxes
//		if (this.gHideSelects == true)
//		{
//			this.displaySelectBoxes();
//		}
		//alert("")
//		Event.stopObserving(window, "resize", this.resizeHandler);
//		Event.stopObserving(window, "scroll", this.updateMaskPosition);
		Event.stopObserving(window, "keypress", this.keyHandler);
//		if(!document.all)
//		{
//			document.onkeypress = this.previousKeyHandler;
//		}
		this.body.removeChild(this.gPopupContainer);
	},

	callReturnFunction:function(response)
	{
		this.funcCall = eval(this.gReturnFunc);
		if(this.funcCall)
		{
			eval(this.gReturnFunc + "('" + this.name + "', '" + response + "');");
		}
	}


// For IE.  Go through predefined tags and disable tabbing into them.
// disableTabIndexes:function() {
//
//	if (document.all) {
//		var i = 0;
//		for (var j = 0; j < this.gTabbableTags.length; j++) {
//			var tagElements = document.getElementsByTagName(this.gTabbableTags[j]);
//			for (var k = 0 ; k < tagElements.length; k++) {
//				this.gTabIndexes[i] = tagElements[k].tabIndex;
//				tagElements[k].tabIndex="-1";
//				i++;
//			}
//		}
//	}
//}

// For IE. Restore tab-indexes.
// restoreTabIndexes:function() {
//	if (document.all) {
//		var i = 0;
//		for (var j = 0; j < this.gTabbableTags.length; j++) {
//			var tagElements = document.getElementsByTagName(this.gTabbableTags[j]);
//			for (var k = 0 ; k < tagElements.length; k++) {
//				tagElements[k].tabIndex = this.gTabIndexes[i];
//				tagElements[k].tabEnabled = true;
//				i++;
//			}
//		}
//	}
//},

/**
* Hides all drop down form select boxes on the screen so they do not appear above the mask layer.
* IE has a problem with wanted select form tags to always be the topmost z-index or layer
*
* Thanks for the code Scott!
*/
// hideSelectBoxes:function() {
//	 this.selectList = new Array();
//	for(var i = 0; i < document.forms.length; i++) {
//		for(var e = 0; e < document.forms[i].length; e++){
//			if(document.forms[i].elements[e].tagName.toUpperCase() == "SELECT" &&
//				document.forms[i].elements[e].style.visibility != "hidden") {
//				this.selectList.push(document.forms[i].elements[e]);
//				document.forms[i].elements[e].style.visibility="hidden";
//			}
//		}
//	}
//},

/**
* Makes all drop down form select boxes on the screen visible so they do not reappear after the dialog is closed.
* IE has a problem with wanted select form tags to always be the topmost z-index or layer
*/
//displaySelectBoxes:function() {
///*	for(var i = 0; i < document.forms.length; i++) {
//		for(var e = 0; e < document.forms[i].length; e++){
//			if(document.forms[i].elements[e].tagName.toUpperCase() == "SELECT") {
//			document.forms[i].elements[e].style.visibility="visible";
//			}
//		}
//	}
//*/
//	for(var i=0; i<this.selectList.length; i++)
//	{
//		this.selectList[i].style.visibility="visible";
//	}
//}
});

/**
 * Gestion de la frappe de touche : annule l'évenement si c'est la touche tab
 */
//function keyDownHandler(e)
//{
//	if(getKeyCode(e) == 9)
//	{
//		e.returnValue = false;
//		return false;
//	}
//}


/**
 * Fonction utilitaire permettant de cacher une fenêtre
 * (dont la référence serait stockée dans popupLst).
 */
function hideInnerWindow(winId, response)
{
	if(!popupLst[winId])
	{
		alert("Popup " + winId + " not found, can't hide it");
	}
	else
	{
		popupLst[winId].hide(true, response);
	}
}

/**
 * Classe boite de dialogue
 */
var DHTMLDialog = Class.create();

/**
 * La classe boite de dialogue étend la fenêtre
 */
Object.extend(DHTMLDialog.prototype, DHTMLWindow.prototype);

/**
 * Extensions à la classe fenêtre
 */
Object.extend(
DHTMLDialog.prototype,
{
	/**
	 * title : Titre de la boite de dialogue
	 * message : Message à afficher
	 * messageType : Type de message : "error", "information", "warning", "question", "plain"
	 * optionType : Type de choix de boutons : "default", "yes_no", "yes_no_cancel", "ok_cancel"
	 * options : Liste de boutons à afficher.
	 * defaultOption : Option sélectionnée par défaut (utile si frappe de la touche entrée dés l'affichage de la  boite de dialogue).
	 * returnFunc : Fonction chargée de gérer la réponse de l'utilisateur function XXX(option)
	 */
	showDialog:function(
		title, message, messageType,
		optionType, options, defaultOption,
		returnFunc, optionsLabels)
	{
		var optionsLabelsToUse = optionsLabels;
		// Cas ou un type d'option prédéfini est précisé
		if(optionType)
		{
			// Boite de dialogue par défaut (bouton ok).
			if(optionType == "default")
			{
				options = new Array("ok");
				optionsLabelsToUse = new Array("OK");
			}
			// Choix oui/non
			else if(optionType == "yes_no")
			{
				options = new Array("yes", "no");
				optionsLabelsToUse = new Array("Oui", "Non");
			}
			// Choix oui/non/annuler
			else if(optionType == "yes_no_cancel")
			{
				options = new Array("yes", "no", "cancel");
				optionsLabelsToUse = new Array("Oui", "Non", "Annuler");
			}
			// Choix oui/annuler
			else if(optionType == "ok_cancel")
			{
				options = new Array("ok", "cancel");
				optionsLabelsToUse = new Array("OK", "Annuler");
			}
			else
			{
				alert("Wrong option type : " + optionType);
				return;
			}
		}
		else
		{
			if(!options)
			{
				alert("options needed to display dialog");
				return;
			}

			// Si les labels des options ne sont pas définis prend la valeur
			// des options comme label
			if(!optionsLabel)
			{
				optionsLabelsToUse = options;
			}
		}

		varNewContent =
			'<table width="100%" border="0"><tr>';
		// Si c'est un message plain on n'affiche pas d'icone
		if(messageType && messageType != "plain")
		{
			// Icone de la boite de dialogue : l'image est gérée via une image de
			// fond définie par un style nommé dialog_icon_<type de message>
			varNewContent += '<td class="dialog_icon_cell" rowspan="2" valign="top"><div id="dialog_icon_' + messageType + '">&nbsp;</div></td>';
		}
		varNewContent += '<td align="center" width="100%">' +
					'<table width="100%"><tr><td width="100%" class="dialog_message_cell">';
		varNewContent += message;
		varNewContent += '</td></tr></table>' +
				'</td>' +
			'</tr>' +
			'<tr><td colspan="2" align="center">';

		// Ajoute les boutons
		for(var i=0; i<options.length; i++)
		{
			varNewContent += '<input id=\"dialog_' + options[i] + '\" type="button" value=\"' + optionsLabelsToUse[i] + '\" onclick=\"javascript:hideInnerWindow(\'' + this.name + '\', \'' + options[i] + '\');\">';
		}
		varNewContent += '</td></tr></table>';

		// On utilise une largeur de boite de dialogue prédéfinie
		this.show(title, varNewContent, 500, null, returnFunc, "dialog");

		if(defaultOption)
		{
			$(defaultOption).focus();
		}
		else
		{
			$("dialog_" + options[0]).focus();
		}
	}
});
