//
//
// Layers.js
//
//
/*==================================================


 Layers Class


==================================================*/
Layers = function()
{
	this._listeners = [];
}
//
Layers.prototype.add = function(layer_id, trigger_id, close_id, pos)
{
	var layer = new Layers.Layer(this, layer_id, trigger_id, close_id, pos);
	return layer;// @@@
}
Layers.prototype.setLinear = function()
{
	this.stat_linear = true;
	this.baseLayer = this._listeners[0];
	this.baseTrigger = this._listeners[0].trigger;
}
Layers.prototype.addListener = function(layer)
{
	this._listeners.push(layer);
}
Layers.prototype.removeListener = function(layer)
{
	for( var i=0,len=this._listeners.length; i<len; i++ )
	{
		if(this._listeners[i]==layer)
		{
			this._listeners.splice(i,1);
			return true;
		}
	}
	return false;
}
Layers.prototype.broadcastMsg = function(layer, callback)
{
	for( var i=0,len=this._listeners.length; i<len; i++ )
	{
		var scope = this._listeners[i];
		//
		scope[callback]();
	}
}
Layers.prototype.exclusiveLayers = function(scope, callback)
{
	this.removeListener(scope);
	this.broadcastMsg(scope, callback);
	this.addListener(scope);
}
Layers.prototype.delegateTrigger = function(layer)
{
	if(this.stat_linear==true&&layer!=this.baseLayer)
	{
		var bounds = this.baseLayer.getBounds();
		var top = bounds.top;
		var left = bounds.left;
		//
		layer.changeTrigger(this.baseTrigger);
		layer.setPosition(left, top);
		this.baseLayer.disableTrigger();
	}
}
Layers.prototype.defaultTrigger = function(layer)
{
	if(this.stat_linear==true&&layer!=this.baseLayer)
	{
		layer.resetTrigger();
		this.baseLayer.enableTrigger();
	}
}
Layers.prototype.allClose = function()
{
	for( var i=0,len=this._listeners.length; i<len; i++ )
	{
		this._listeners[i].hideLayer();
	}
}

/*==================================================

 Layers.Super Class (Super Class)

==================================================*/
Layers.Super = function(id)
{
	this.el = document.getElementById(id);
}
//
Layers.Super.prototype.getBounds = function()
{
	var obj = {
				top: this.getOffsetTop(this.el, 0),
				left: this.getOffsetLeft(this.el, 0),
				width: this.el.offsetWidth,
				height: this.el.offsetHeight
	};
	return obj;
}
Layers.Super.prototype.getOffsetTop = function( el, top )
{
	var tagName = el.tagName;
	//
	if(tagName=='HTML'||tagName=='BODY')
	{
		return top;
	} else {
		top += el.offsetTop;
		return arguments.callee( el.offsetParent, top );
	}
}
Layers.Super.prototype.getOffsetLeft = function( el, left )
{
	var tagName = el.tagName;
	//
	if(tagName=='HTML'||tagName=='BODY')
	{
		return left;
	} else {
		left += el.offsetLeft;
		return arguments.callee( el.offsetParent, left );
	}
}

/*==================================================

 Layers.Layer Class

==================================================*/
Layers.Layer = function(broadcaster, layer_id, trigger_id, close_id, pos)
{
	Layers.Super.call(this, layer_id);
	//
	this.broadcaster = broadcaster;
	this.broadcaster.addListener(this);
	//
	this.trigger = new Layers.Trigger(trigger_id);
	this.org_trigger = this.trigger;
	this.trigger.setOnClick(this, "toggle");
	//
	if(!!close_id==true)
	{
		this.close_trigger = new Layers.Trigger(close_id);
		this.close_trigger.setOnClick(this, "hideLayer");
	}
	//
	this.hideLayer();
	this.pos = pos;
	this.leftLimit = 507;
}
Layers.Layer.prototype = new Layers.Super();
Layers.Layer.prototype.constructor = Layers.Layer;
Layers.Layer.prototype.setBounds = function()
{
	var bounds = this.trigger.getBounds();	
	//debug.p(!!this.pos);
	if(!!this.pos==false)
	{
		var top = bounds.top+bounds.height;
		var left = this.leftLimit;
	} else {
		switch(typeof(this.pos))
		{
			case "string":
				if(this.pos=="above")
				{
					var top = bounds.top-this.el.offsetHeight;
					var left = this.leftLimit;
				}
				break;
			
			case "object":
				var top = this.pos.top||0;
				var left = this.pos.left||0;
				break;
		}
	}
	this.setPosition(left, top);
}
Layers.Layer.prototype.setPosition = function(left, top)
{
	this.el.style.position = "absolute";
	this.el.style.top = top+"px";
	this.el.style.left = left+"px";
}
Layers.Layer.prototype.toggle = function()
{
	if(this.stat==true)
	{
		this.hideLayer();
	} else {
		if(this.trigger) this.showLayer();
		this.broadcaster.exclusiveLayers(this, "hideLayer");
	}
}
Layers.Layer.prototype.showLayer = function()
{
	this.el.style.display = "block";
	this.setBounds();
	this.el.style.visibility = "visible";
	this.stat = true;
	this.broadcaster.delegateTrigger(this);
}
Layers.Layer.prototype.hideLayer = function()
{
	this.el.style.display = "none";
	this.el.style.visibility = "hidden";
	this.stat = false;
	this.broadcaster.defaultTrigger(this);
	
}
Layers.Layer.prototype.changeTrigger = function(trigger)
{
	this.trigger = trigger;
}
Layers.Layer.prototype.resetTrigger = function()
{
	this.trigger = this.org_trigger;
}
Layers.Layer.prototype.disableTrigger = function()
{
	this.trigger = null;
}
Layers.Layer.prototype.enableTrigger = function()
{
	this.trigger = this.org_trigger;
}

/*==================================================

 Layers.Trigger Class

==================================================*/
Layers.Trigger = function(id)
{
	Layers.Super.call(this, id);
}
//
Layers.Trigger.prototype = new Layers.Super();
Layers.Trigger.prototype.constructor = Layers.Trigger;
Layers.Trigger.prototype.setOnClick = function(scope, callback)
{
	try {
		this.el.addEventListener('click', function(){ scope[callback](); }, false);
	} catch(e) {
		this.el.attachEvent('onclick', function(){ scope[callback](); });
	}
}
Layers.Trigger.prototype.removeOnClick = function(scope, callback)
{
	try {
		this.el.removeEventListener('click', function(){ scope[callback](); }, false);
	} catch(e) {
		this.el.detachEvent('onclick', function(){ scope[callback](); });
	}
}

/*==================================================

 Layers.Iframe Class

==================================================*/
Layers.Iframe = function(id)
{
	this.target = parent[id];
}
//
Layers.Iframe.prototype.addCloseTrigger = function(trigger)
{
	var close_el = document.getElementById(trigger);
	//
	this.setOnClick(close_el, this, "hideLayer");
}
Layers.Iframe.prototype.setOnClick = function(el, scope, callback)
{
	try {
		el.addEventListener('click', function(){ scope[callback](); }, false);
	} catch(e) {
		el.attachEvent('onclick', function(){ scope[callback](); });
	}
}
Layers.Iframe.prototype.hideLayer = function()
{
	this.target.allClose();
}
