lb.dhtml = new function()
{
	this.loaded = false;
	
	this.layers = {};
	this.loadLayer = function(id,settings)
	{
		return new CLayer(id,settings);
	}
	this.onLoad = function()
	{
		this.loaded = true;
		for(var id in this.layers)
			if(!this.layers[id].load()) this.layers[id] = null;
		
		return true;
	}
	if(defined(window.addEventListener)) window.addEventListener('load', function(){return lb.dhtml.onLoad();}, false);
	else if(defined(window.attachEvent)) window.attachEvent('onload', function(){return lb.dhtml.onLoad();});
	else window.onload = lb.dhtml.onLoad;
}

function CPoint(x,y)
{
	this.x = x;
	this.y = y;
}
function CLayer(sID,oSettings)
{
	if(defined(lb.dhtml.layers[sID]))
		return false;
	
	var oS = if_undef(oSettings,{});
	this.settings = {};
	this.settings.unit = if_undef(oS.unit,'px',['in','cm','mm','em','ex','pt','pc','px']);
	this.settings.x = if_undef(oS.x,'left',['left','right']);
	this.settings.y = if_undef(oS.y,'top',['top','bottom']);
	this.settings.precision = if_undef(oS.precision,null);
	
	if(null == this.settings.precision) switch(this.settings.unit)
	{
		case 'px':
			this.settings.precision = 0;
			break;
		case 'in':
		case 'cm':
		case 'mm':
		case 'em':
		case 'ex':
		case 'pt':
		case 'pc':
		default:
			this.settings.precision = 6;
			break;
	}
	
	this.sliding = null;
	
	this.sUnitRE = /^(-?[0-9.]+)(in|cm|mm|em|ex|pt|pc|px)$/i
	
	this.id = sID;
	this.element = null;
	
	lb.dhtml.layers[this.id] = this;
	this.svar = "lb.dhtml.layers['"+this.id+"']";
	
	this.load = function()
	{
		this.element = $(this.id);
		if(null == this.element) return false;
		this.style = this.element.style;
		//alert('lb.dhtml.layers.'+this.id+' is '+(defined(lb.dhtml.layers[this.id])?'defined':'undefined'));
		return true;
	}
	if(lb.dhtml.loaded) this.load();
	
// Methods
	this.getUnit = function(fUnit)
	{
		var iMultiplier = Math.pow(10,this.settings.precision);
		return (Math.round(fUnit * iMultiplier) / iMultiplier) + this.settings.unit
	}
	
	this.getPosition = function()
	{
		var aX = this.sUnitRE.exec(this.style[this.settings.x])
		var aY = this.sUnitRE.exec(this.style[this.settings.y])

		if(null == aX || null == aY) return false;
		if(this.settings.unit != aX[2] || this.settings.unit != aY[2]) return false;
		
		return new CPoint(parseFloat(aX[1]),parseFloat(aY[1]));
	}
	
	this.moveTo = function(fX, fY)
	{
		this.style[this.settings.x] = this.getUnit(fX);
		this.style[this.settings.y] = this.getUnit(fY);
		return true;
	}
	
	this.moveBy = function(fX, fY)
	{
		fX = if_undef(fX,0.0);
		fY = if_undef(fY,0.0);
		if(0.0 == fX && 0.0 == fY) return true;
		
		var oCurPos = this.getPosition();
		if(false == oCurPos) return false;
		
		return this.moveTo(oCurPos.x + fX, oCurPos.y + fY);
	}
	
	this.slideTo = function(fX, fY, iMilliSeconds, iSteps)
	{
		var oCurPos = this.getPosition();
		if(false == oCurPos) return false;
		
		return this._slide(oCurPos.x, oCurPos.y, parseFloat(fX), parseFloat(fY), iMilliSeconds, iSteps);
	}
	
	this.slideBy = function(fX, fY, iMilliSeconds, iSteps)
	{
		fX = if_undef(fX,0.0);
		fY = if_undef(fY,0.0);
		if(0.0 == fX && 0.0 == fY) return true;
		
		var oCurPos = this.getPosition();
		if(false == oCurPos) return false;
		
		return this._slide(oCurPos.x, oCurPos.y, oCurPos.x + fX, oCurPos.y + fY, iMilliSeconds, iSteps);
	}
	
	this._slide = function(fStartX,fStartY,fEndX,fEndY,iMilliSeconds,iSteps)
	{
		if(null != this.sliding) return false;
		
		iMilliSeconds = if_undef(iMilliSeconds,0);
		iSteps = if_undef(iSteps,null);
		
		if(iMilliSeconds <= 0) return this.moveTo(fEndX,fEndY);
		
		this.sliding = {};
		
		this.sliding.iSteps = null != iSteps ? iSteps : Math.round(iMilliSeconds / 200);
		
		this.sliding.fStartX = fStartX;
		this.sliding.fStartY = fStartY;
		
		this.sliding.fEndX = fEndX;
		this.sliding.fEndY = fEndY;
		//alert(iMilliSeconds);
		this.sliding.iStepT = Math.round(iMilliSeconds / this.sliding.iSteps);
		this.sliding.fStepX = (this.sliding.fEndX - this.sliding.fStartX) / this.sliding.iSteps;
		this.sliding.fStepY = (this.sliding.fEndY - this.sliding.fStartY) / this.sliding.iSteps;
		
		this.sliding.iTimeout = null;
			
		this._step(0);
		
		return true;
	}
	this._step = function(iStep)
	{
		if(null == this.sliding) return false;
		
		if(iStep >= this.sliding.iSteps)
		{
			//alert('Finishing at: '+this.getUnit(this.sliding.fEndX)+' x '+this.getUnit(this.sliding.fEndY));
			this.moveTo(this.sliding.fEndX,this.sliding.fEndY);
			this.sliding = null;
			return true;
		}
		
		if(iStep > 0)
		{
			var fNewX = (iStep * this.sliding.fStepX) + this.sliding.fStartX;
			var fNewY = (iStep * this.sliding.fStepY) + this.sliding.fStartY;
			//alert('Moving to: '+this.getUnit(fNewX)+' x '+this.getUnit(fNewY));
			this.moveTo(fNewX,fNewY);
		}
		//else alert('Starting at: '+this.getUnit(this.sliding.fStartX)+' x '+this.getUnit(this.sliding.fStartY));
		
		++iStep;
		var sCode = this.svar+'._step('+iStep+');';
		//debug_text('Step '+iStep+', '+this.sliding.iStepT+' ms');
		this.sliding.iTimeout = window.setTimeout(sCode,this.sliding.iStepT);
	}
	
	return this;
}
