/********************************************************************
Classe Popup --------------------------------------------------------
> Auteur : Brice Dauzats
> Date de création : 24/01/2007
> Date de mise à jour : aucune
> Société : Crypteo 
> Description : Classe de gestion de popup en surimpression de page
> Utilisation 
	Constructeur :
		# Popup(o:Object):void  	
			o : Objet de configuration
	Méthodes Publique:
		# show(url:String):void 		
			Montre le popup
			url : Url à charger dans le popup
		# show(o:Object[, oAdditional:Object]):void 		
			Montre le popup
			o : Objet de configuartion
			oAdditional: Objet de config additionnel
		# hide(void):void 		
			Cache le popup
	Objet de config :
		$Propriété
		.width:Number				Largeur du popup
		.height:Number				Hauteur du popup
		.offsetX:Number				decallage sur x
		.offsetY:Number				decallage sur y
		.enabledCenterX:Bool		active le centrage sur x					
		.enabledCenterY:Bool		active le centrage sur y
		.position:String			Positionnement du popup
		.className:String			classe du popup
		.src:String					url du popup
		.iframe:Object				référence indirecte sur l'iframe	
		.closeButton:Object			référence indirecte sur le bouton de fermeture
		.enabledResizeEvents:Bool	Active l'evenement de redimensionnement de la fenetre
		.enabledScrollEvents:Bool	Active l'evenement de scroll de la fenetre
		.anchor:String				ID de l'ancre sur laquelle se fixer
		.enabledAnchorX:Bool		active l'acrochage à l'ancre sur x
		.enabledAnchorY:Bool		active l'acrochage à l'ancre sur y
		Méthode
		.onResizeEvent:Function		Invoqué lors du redimensionnement
		.onScrollEvent:Function		Invoqué lors du scroll
		
> Les propriété préfixé d'un '_' sont privées.
********************************************************************/

function Popup(o)
{
	var $ = this;
	
	$.width = 200;
	$.height = 200;
	$.offsetX = 0;
	$.offsetY = 0;
	$.hackIEOffsetX = 0;
	$.hackIEOffsetY = 0;
	$.position = 'absolute';
	$.nameIframe = 'popupFrame';
	$.zIndex = 32000;
	$.className = "";
	$.src = "";
	$.emptyUrl = "";
	$.iframe = null;
	$.enabledCenterX = true;
	$.enabledCenterY = true;
	$.iframe = new Object();
	$.closeButton = new Object();
	$.closeButton.className = "";
	$.closeButton.innerHTML = '<a>[x]</a>';
	$.closeButton.insertAfter = false;
	$.closeButton.onclick = function(){$.hide();};
	
	$.anchorId = '';
	$.enabledAnchorX = true;
	$.enabledAnchorY = true;
	
	$.enabledResizeEvents = true;
	$.enabledScrollEvents = true;
	

	
	///////////////////////////////////////
	setProp($,o);
	///////////////////////////////////////
	$.init();
	
}
Popup.prototype = {
	show: function(o,oAdditional)
	{
		var $ = this;
		
		var typeArg = typeof(o);
		var typeArg2 = typeof(oAdditional);
		typeArg = typeArg.toLowerCase();
		typeArg2 = typeArg2.toLowerCase();
		if(!$.isInit)
			$.init();
		if(typeArg == 'object')
			setProp($,o);
		if(typeArg == 'string')
			setProp($,{src:o});
		if(typeArg2 == 'object')
			setProp($,oAdditional);
		if(typeArg == 'string')
			setProp($,{src:oAdditional});
			
		setProp($._div,$);
		setProp($._iframe,$.iframe);
		setProp($._closeButton,$.closeButton);
		
		$.dispSelect(false);
		$._div.style.display = 'block';
		$._div.style.visibility = 'hidden';
		$.isShow = true;
		$.draw();
		$.refreshPos();
		
		$._div.style.visibility = 'visible';
		$.draw();

	},
	hide: function()
	{
		this.dispSelect(true);
		this.isShow = false;
		this._iframe.src = this.emptyUrl;
		this._div.style.display = 'none';
	},
	move: function()
	{
		var $ = this;
		
		var ow = $._div.offsetWidth?$._div.offsetWidth:$.width;
		var oh = $._div.offsetHeight?$._div.offsetHeight:$.height;
		
		var oPos = $._getAnchorPos($.anchorId);
		
		if(isNaN($.offsetX))
			$.offsetX = 0;
		if(isNaN($.offsetY))
			$.offsetY = 0;
		if(isNaN($.hackIEOffsetX))
			$.hackIEOffsetX = 0;
		if(isNaN($.hackIEOffsetY))
			$.hackIEOffsetY = 0;
		
		var top = 0;
		var left = 0;
		if(oPos && $.enabledAnchorX)
			left = oPos.left;
		else
			left = $.enabledCenterX?$._fw/2-ow/2+$._sx:$._sx;
			
		if(oPos && $.enabledAnchorY)
			top = oPos.top;
		else	
			top = $.enabledCenterY?$._fh/2-oh/2+$._sy:$._sy;
		
		if($._nav.ie)
		{
			left += $.hackIEOffsetX;
			top += $.hackIEOffsetY;
		}
		$._div.style.left = (left+$.offsetX)+'px';
		$._div.style.top = (top+$.offsetY)+'px';
		
	},
	draw: function()
	{
		var $ = this;
		if($.isShow)
		{
			var d = $._div;
			//d.style.width = $.width;
			//d.style.height = $.height;
			d.style.position = $.position;
			d.style.zIndex = $.zIndex;
			d.className = $.className;
			
			var i = $._iframe;
			
			i.setAttribute('hspace','0');
			i.setAttribute('vspace','0');
			i.setAttribute('border','0');
			i.style.width = $.width+'px';
			
			i.style.height = $.height+'px';
			if($.src != '')
				i.src = $.src;
			//window[$.nameIframe].onload = function(){alert('loaded')}
			
			var b = $._closeButton;
			setProp(b,getProp($.closeButton));
		}
	},
	init: function()
	{
		var $ = this;
		try
		{
			
			$._nav = new Object();
			$._nav.ver = navigator.appVersion.substr(17,6);
			$._nav.ie =navigator.appVersion.substr(17,4)=="MSIE"?1:0;
			$._nav.ie5_6 = $._nav.ver=="MSIE 5" || $._nav.ver=="MSIE 6"?1:0;
			
			$._page =!document.documentElement.clientWidth?document.body:document.documentElement;	  
			$.create();
			if($.enabledResizeEvents)
				window.onresize = function(){$.refreshPos(); if($.onResizeEvent) $.onResizeEvent();}
			if($.enabledScrollEvents)
				window.onscroll = function(){$.refreshPos(); if($.onScrollEvent) $.onScrollEvent();}
			$.isInit = true;
		}
		catch(e)
		{
			$.isInit = false;	
		}
	},
	create: function()
	{
		var $ = this;
		if($._div)
			$.remove();
		$._div = document.createElement('div');
		$._iframe = document.createElement('iframe');
		$._iframe.setAttribute('name',$.nameIframe);
		$._iframe.frameBorder = 0;
		$._iframe.scrolling = 'no';

		$._closeButton = document.createElement('div');
		
		$.draw();
		
		$._div.appendChild($._iframe);
		if($.closeButton.insertAfter)
			$._div.appendChild($._closeButton);
		else
			$._div.insertBefore($._closeButton,$._iframe);
		
		$.hide();
		$._page.appendChild($._div);
		
	},
	remove: function()
	{
		delete this._div;
	},
	refreshPos: function()
	{
		if(this.isShow)
		{
			this.getWindowSize();
			this.move();
		}
	},
	/////////////////////////////////////
	_getAnchorPos: function(anchorID)
	{
		if(oAncor = document.getElementById(anchorID))
			return {left:this._getAnchorLeft(oAncor),top:this._getAnchorTop(oAncor)};
		else
			return false;
		
	},
	_getAnchorLeft: function(oAnchor)
	{
		if (oAnchor.offsetParent)
       		return (oAnchor.offsetLeft + this._getAnchorLeft(oAnchor.offsetParent));
   		else
       		return (oAnchor.offsetLeft);
	},
	_getAnchorTop: function(oAnchor)
	{
		if (oAnchor.offsetParent)
        	return (oAnchor.offsetTop + this._getAnchorTop(oAnchor.offsetParent));
    	else
        	return (oAnchor.offsetTop);
	},
	//////////////////////////////////////

	setUrl: function(url)
	{
		if(url && this._iframe)
		{
			this.url = url;
			this.iframe.src = this.url;
			
			setProp(this._iframe,this.iframe);
		}
	},
	dispSelect: function(v)
	{
		
		var elem=document.getElementsByTagName('select');
		if(this._nav.ie5_6)
			for(i=0;i<elem.length;i++)
				elem[i].style.visibility=v?'visible':'hidden';
	},
	///////////////////////////////////
	getWindowSize: function()
	{

		var $ = this;
		$._fw=$._nav.ie?$._page.clientWidth:window.innerWidth; //l fenêtre 
		$._fh=$._nav.ie?$._page.clientHeight:window.innerHeight  //h fenêtre 
		$._sx=$._nav.ie?$._page.scrollLeft:window.pageXOffset; //scroll h 
		$._sy=$._nav.ie?$._page.scrollTop:window.pageYOffset; //scroll v 
	}
	
}
///////////////////////////////////////

setProp = function(o,oProps,lv)
{
	if(!lv)
		lv = 0
	for(var i in oProps)
		try{
			lv++;
			if(lv > 10)
				continue;
			var typeo = typeof(oProps[i]);
			if(typeo.toLowerCase() == 'object')
			{
				if(!o[i])
					o[i] = new Object();
				setProp(o[i],oProps[i],lv)
			}
			else
				o[i] = oProps[i];
		}catch(e){}
}
getProp = function(o,filter)
{
	var out = new Object();
	for(var i in o)
		try{out[i] = o[i];}catch(e){}
	return out;
}
//non utilisé
isPropEmpty = function(o)
{
	if(o == '' || o == null || o == undefined)
		return true;
	return false;
}

