////////////////////////////////////////////////////////////////////////////
//
// © PMP CONCEPT 2007 :: GESTION DES POPUPS
//
////////////////////////////////////////////////////////////////////////////

/* inclusion des dépendances */
PMP.include("librairiesjs/dragdrop.js");


// Classe Popup
// 
//
PMP.util.pmpPopup = function(element) 
{
	// ************************************************************************ 
	// INITIALISATION
	// ************************************************************************ 
	// popup modale ou non (une popup modale bloque toute action, on est obligé de la fermer avant de pouvoir effectuer une autre action)
	this.modal = false;
	this.showOverlay = this.modal ? true : true;
	this.visible = false;
	this.offsetX = 0;	// position horizontale courante de la popup dans le navigateur (décalage par rapport à la position du scroll horizontal)
	this.offsetY = 0;	// position verticale courante de la popup dans le navigateur (décalage par rapport à la position du scroll vertical)

	// ************************************************************************ 
	// EVENEMENTS
	// ************************************************************************ 
	// fermeture de la popup
	this.onClose = null;
	

	if(PMP.common.isUndefined(element))
		var element = "";
	else if(PMP.common.isObject(element))
	{
		var contentElement = document.createElement("div");
		contentElement.appendChild(element);
		element = contentElement.innerHTML;
	}
	
	// ************************************************************************ 
	// ATTRIBUTS PRIVES ACCESSIBLES DEPUIS METHODE PRIVEE OU PRIVILEGIEES
	// ************************************************************************ 
	var index = PMP.util.pmpPopup.count;
	PMP.util.pmpPopup.count++;
	var zindex = (index + 1) * 100;
	
	this.popupOverlay = document.createElement("div");
	this.popupOverlay.setAttribute("id", "popupOverlay" + index);
	this.popupOverlay.setAttribute("class", "pmpPopupOverlay");
	this.popupOverlay.setAttribute("style", "z-index:"+(zindex+10)+"; visibility:hidden;");
	this.popupOverlay.id = "popupOverlay" + index;
	this.popupOverlay.className = "pmpPopupOverlay";
	this.popupOverlay.style.zIndex = (zindex+10);
	this.popupOverlay.style.visibility = "hidden";
	
	this.popup = document.createElement("span");
	this.popup.setAttribute("id", "popup" + index);
	this.popup.setAttribute("class", "pmpPopup");
	this.popup.setAttribute("style", "z-index:"+(zindex+30)+"; visibility:hidden;");
	this.popup.id = "popup" + index;
	this.popup.className = "pmpPopup";
	this.popup.style.zIndex = (zindex+30);
	this.popup.style.visibility = "hidden";
	this.popup.innerHTML	= element;
	
	
	// ajout de l'overlay au DOM du document
	//PMP.common.truebody().appendChild(this.popupOverlay);
	document.body.appendChild(this.popupOverlay);
	// ajout de la popup au DOM du document
	//PMP.common.truebody().appendChild(this.popup);
	document.body.appendChild(this.popup);

	// récupération des éléments dans le DOM
	this.popupOverlay = document.getElementById(this.popupOverlay.id);
	this.popup = document.getElementById(this.popup.id);
	this.content = this.popup;
	
	// si l'overlay est visible, sous IE on le redimensionne
	//if(this.showOverlay && !PMP.browser.strictMode && PMP.browser.IE)
	//	this.updateOverlay();
	//mise à jour de la position à l'écran
	//this.updatePosition();

	
	PopupManager.addPopup(this);
}


PMP.util.pmpPopup.prototype = {

	
	setDraggable : function(elementStartDrag) 
	{
		this.dragdrop = new PMP.util.pmpDragDrop(this.popup, elementStartDrag, {onDragEnd:this.onDragEnd.bind(this)});
	},

	show : function() 
	{
		// si le contenu de la popup n'est pas défini on n'affiche rien
		if(this.content.innerHTML.trim()=="")
			return;

		// taille de l'overlay
		if(!PMP.browser.strictMode || PMP.browser.IE)
		{
			//document.getElementsByTagName("body")[0].style.height = "100%";
			//document.getElementsByTagName("html")[0].style.width = "100%";
			//document.getElementsByTagName("html")[0].style.overflow = "hidden";

			this.popupOverlay.style.position="absolute";
			this.updateOverlay();
		}
	
		// position de la popup
		this.updatePosition();

		// masque les éléments bug IE
		PMP.dom.hideElementsByTagName('SELECT');					// masque tous les select par défaut
		PMP.dom.showElementsByTagName('SELECT', this.content); 	// affiche les select de la popup

		// affichage de l'overlay si l'attribut showOverlay n'est pas explicitement défini à false :
		if(this.popupOverlay && this.showOverlay)
		{
			this.popupOverlay.style.visibility="visible";
			this.popupOverlay.style.display = "";

			// si la popup n'est pas modale on masque la popup en cliquant sur l'overlay
			if(!this.modal)
			{
				this.popupOverlay.onclick = this.close.bind(this);
			}
		}
		// affichage de la popup
		if(this.popup)
		{
			this.popup.style.visibility = "visible";
			this.popup.style.display = "";
		}

		this.visible  = true;

		this.focus();
	},

	hide : function() 
	{
		// masquage de l'overlay si l'attribut showOverlay n'est pas explicitement défini à false :
		if(this.popupOverlay)
		{
			this.popupOverlay.style.visibility = "hidden";
			this.popupOverlay.style.display = "none";
		}
		// masquage de la popup
		if(this.popup)
		{
			this.popup.style.visibility = "hidden";
			this.popup.style.display = "none";
		}

		this.visible  = false;
	},

	remove : function() 
	{
		// suppression de l'overlay dans le DOM du document
		if(this.popupOverlay && this.popupOverlay.parentNode)
			this.popupOverlay.parentNode.removeChild(this.popupOverlay);
		// suppression de la popup dans le DOM du document
		if(this.popup && this.popup.parentNode)
			this.popup.parentNode.removeChild(this.popup);
		
		//PMP.util.pmpPopup.count--;
		this.removed = true;
		PopupManager.removePopup(this);
	},

	close : function() 
	{
		if(PMP.common.isFunction(this.onClose))
			this.onClose.apply(this);
		
		this.remove();
	},

	updateOverlay : function() 
	{
		// BUG IE LORSQUE LA FEUILLE DE STYLE N'EST PAS ACTIVEE
		// vérification de la présence de la feuille de style activée dans le navigateur
		var styleSheetEnabled = false;
		if(document.styleSheets)
		{
			for(var i=0; i<document.styleSheets.length; i++)
			{
				if(document.styleSheets[i].href.search("popup.css")>-1 && document.styleSheets[i].disabled == false)
				{
					styleSheetEnabled = true;
					break;
				}
				
				//if(document.styleSheets[i].href.search("infopanier.css")==-1)
				//	continue;
		
				//for (var propriete in document.styleSheets[i])
				//	alert(propriete + ": "+document.styleSheets[i][propriete]);
			}
			
			// SI LA FEUILLE DE STYLE N'A PAS ETE TROUVEE OU SI ELLE N'EST PAS ACTIVEE
			if(!styleSheetEnabled)
				return;
		}
	
		var windowProperties = PMP.common.getWindowProperties();
	
		if(this.popupOverlay)
		{
			if(PMP.common.getContentHeight(PMP.common.truebody()) > 2045)
			{
				// l'overlay est ajuster aux dimensions de la zone d'afichage de la fenêtre (zone visible du document)
				var height = 2000;
				var docHeight = PMP.common.getContentHeight(PMP.common.truebody());
				var top = windowProperties.scrollTop - (height-windowProperties.innerHeight)/2;
				if( top+height > docHeight )
					top = docHeight - height;
				
				this.popupOverlay.style.top		= top + "px";
				this.popupOverlay.style.left	= 0 + "px";
				this.popupOverlay.style.width	= "100%";
				this.popupOverlay.style.height	= height + "px";
			}
			else
			{
				// l'overlay est ajuster aux dimensions de du document)
				this.popupOverlay.style.top		= 0 + "px";
				this.popupOverlay.style.left	= 0 + "px";
				this.popupOverlay.style.width	= "100%";
				this.popupOverlay.style.height	= PMP.common.getContentHeight(PMP.common.truebody()) + "px";
			}
		}	
	},

	updatePosition : function() 
	{
		// par défaut centrée
		if(!this.offsetX && !this.offsetY)
		{
			PMP.common.horizontalCenter(this.content);
			PMP.common.verticalCenter(this.content);
		}
		// sinon met à jour la position de la popup à l'écran
		else
		{
			var windowProperties = PMP.common.getWindowProperties();
			var top = windowProperties.scrollTop + this.offsetY;
			var left = windowProperties.scrollLeft + this.offsetX;

			if(top<0)
				this.content.style.top = 0 + "px";
			else if(top+this.content.offsetHeight > PMP.common.getContentHeight(PMP.common.truebody()))
				this.content.style.top = PMP.common.getContentHeight(PMP.common.truebody()) - this.content.offsetHeight + "px";
			else
				this.content.style.top = top + "px";

			if(left<0)
				this.content.style.left = 0 + "px";
			else if(left+this.content.offsetWidth > PMP.common.getContentWidth(PMP.common.truebody()))
				this.content.style.left = PMP.common.getContentWidth(PMP.common.truebody()) - this.content.offsetWidth + "px";
			else
				this.content.style.left = left + "px";
		}
	},

	onDragEnd : function() 
	{
		var windowProperties = PMP.common.getWindowProperties();
		
		this.offsetX = PMP.common.getElementLeft(this.content) - windowProperties.scrollLeft;
		this.offsetY = PMP.common.getElementTop(this.content) - windowProperties.scrollTop;
		this.updatePosition();
	},

	focus : function() 
	{
	}
}

PMP.util.pmpPopup.count = 0;


// PopupManager
// Implémente les fonctions pour la gestion des popups
//
var PopupManager = {};

PopupManager.popups = new Array();

PopupManager.createPopup = function(element, parent, modal) 
{
	var popup = new PMP.util.pmpPopup(element);

	if(PMP.common.isBoolean(modal))
		popup.modal = modal;

	return popup;
};

PopupManager.addPopup = function(popup) 
{
	this.popups.push(popup);
	// position les élément
	//this.refreshStyle();
	// centre le popup à l'écran
	//this.centerPopup(popup);

	// gestion de l'affichage
	window.onscroll = PopupManager.refreshStyle;
	window.onresize = PopupManager.refreshStyle;
};

PopupManager.centerPopup = function(popup) 
{
	if(PMP.common.isNumber(popup))
	{
		if(popup>=0 && popup<this.popups.length)
			popup = this.popups[popup];
		else
			popup = null;
	}
	
	if(popup)
	{
		PMP.common.horizontalCenter(popup.content);
		PMP.common.verticalCenter(popup.content);

		var windowProperties = PMP.common.getWindowProperties();
		
		popup.offsetX = PMP.common.getElementLeft(popup.content) - windowProperties.scrollLeft;
		popup.offsetY = PMP.common.getElementTop(popup.content) - windowProperties.scrollTop;
		//alert(PMP.common.getElementWidth(popup.content));
	}
};

PopupManager.removePopup = function(popup) 
{
	var iPopup=-1;
	if(PMP.common.isNumber(popup))
	{
		if(popup>=0 && popup<this.popups.length)
		{
			iPopup = popup;
			popup = this.popups[popup];
		}
		else
			popup = null;
	}
	else
	{
		for(iPopup=0; iPopup<this.popups.length; iPopup++)
		{
			if(this.popups[iPopup] == popup)
				break;
		}
	}
	
	if(popup)
	{
		if(!popup.removed)
			popup.remove();

		if(iPopup>=0 && iPopup<this.popups.length)
			this.popups.splice(iPopup, 1);

		if(this.popups.length==0)
		{
			// affiche les éléments (bug IE)
			PMP.dom.showElementsByTagName('SELECT');
			
			//if IE 6
			if (typeof document.body.style.maxHeight == "undefined") 
			{
				//document.getElementsByTagName("body")[0].style.height = "auto";
				//document.getElementsByTagName("html")[0].style.width = "auto";
				//document.getElementsByTagName("html")[0].style.overflow = "";
			}
		}
		else
		{
			// affiche les éléments de la popup du niveau inférieur (bug IE)
			PMP.dom.showElementsByTagName('SELECT', this.popups[this.popups.length-1].content);
			this.popups[this.popups.length-1].focus();
		}
	}
};

PopupManager.refreshStyle = function() 
{
	for(var i=0; i<PopupManager.popups.length; i++)
	{
		if(PopupManager.popups[i])
		{
			// si l'overlay est visible, sous IE on le redimensionne
			if(PopupManager.popups[i].visible && PopupManager.popups[i].showOverlay && (!PMP.browser.strictMode || PMP.browser.IE))
				PopupManager.popups[i].updateOverlay();
			//mise à jour de la position à l'écran
			if(PopupManager.popups[i].visible)
				PopupManager.popups[i].updatePosition();
		}
	}
};