
// NOTE: The functions in this file are a sub set of the X Library
//       taken from http://cross-browser.com/

function xGetElementById(e)
{
	if(typeof(e)=='string')
	{
		if(document.getElementById)
			e=document.getElementById(e);
		else if(document.all)
			e=document.all[e];
		else e=null;
	}
	return e;
};

function xGetComputedStyle(oEle,sProp,bInt)
{
	var s,p='undefined';
	var dv=document.defaultView;
	if(dv&&dv.getComputedStyle)
	{
		s=dv.getComputedStyle(oEle,'');
		if(s)
			p=s.getPropertyValue(sProp);
	}
	else if(oEle.currentStyle)
	{
		var i,c,a=sProp.split('-');
		sProp=a[0];
		for(i=1;i<a.length;++i)
		{
			c=a[i].charAt(0);
			sProp+=a[i].replace(c,c.toUpperCase());
		}
		p=oEle.currentStyle[sProp];
	}
	else 
		return null;
	return bInt?(parseInt(p)||0):p;
};

function xParent(e,bNode)
{
	if(!(e=xGetElementById(e)))
		return null;
	var p=null;
	if(!bNode&&xDef(e.offsetParent))
		p=e.offsetParent;
	else if(xDef(e.parentNode))
		p=e.parentNode;
	else if(xDef(e.parentElement))
		p=e.parentElement;
	return p;
};

function xMoveTo(e,x,y)
{
	xLeft(e,x);
	xTop(e,y);
};

function xShow(e)
{
	return xVisibility(e,1);
};

function xZIndex(e,uZ)
{
	if(!(e=xGetElementById(e)))
		return 0;
	if(e.style&&xDef(e.style.zIndex))
	{
		if(xNum(uZ))e.style.zIndex=uZ;
		uZ=parseInt(e.style.zIndex);
	}
	return uZ;
};

function xLeft(e,iX)
{
	if(!(e=xGetElementById(e)))
		return 0;
	var css=xDef(e.style);
	if(css&&xStr(e.style.left))
	{
		if(xNum(iX))
			e.style.left=iX+'px';
		else
		{
			iX=parseInt(e.style.left);
			if(isNaN(iX))
				iX=xGetComputedStyle(e,'left',1);
			if(isNaN(iX))
				iX=0;
		}
	}
	else if(css&&xDef(e.style.pixelLeft))
	{
		if(xNum(iX))
			e.style.pixelLeft=iX;
		else 
			iX=e.style.pixelLeft;
	}
	return iX;
};

function xTop(e,iY)
{
	if(!(e=xGetElementById(e)))
		return 0;
	var css=xDef(e.style);
	if(css&&xStr(e.style.top))
	{
		if(xNum(iY))
			e.style.top=iY+'px';
		else
		{
			iY=parseInt(e.style.top);
			if(isNaN(iY))
				iY=xGetComputedStyle(e,'top',1);
			if(isNaN(iY))
				iY=0;
		}
	}
	else if(css&&xDef(e.style.pixelTop))
	{
		if(xNum(iY))
			e.style.pixelTop=iY;
		else 
			iY=e.style.pixelTop;
	}
	return iY;
};

function xScrollLeft(e,bWin)
{
	var offset=0;
	if(!xDef(e)||bWin||e==document||e.tagName.toLowerCase()=='html'||e.tagName.toLowerCase()=='body')
	{
		var w=window;
		if(bWin&&e)
			w=e;
		if(w.document.documentElement&&w.document.documentElement.scrollLeft)
			offset=w.document.documentElement.scrollLeft;
		else if(w.document.body&&xDef(w.document.body.scrollLeft))
			offset=w.document.body.scrollLeft;
	}
	else
	{
		e=xGetElementById(e);	
		if(e&&xNum(e.scrollLeft))
			offset=e.scrollLeft;
	}
	return offset;
};

function xScrollTop(e,bWin)
{
	var offset=0;
	if(!xDef(e)||bWin||e==document||e.tagName.toLowerCase()=='html'||e.tagName.toLowerCase()=='body')
	{
		var w=window;
		if(bWin&&e)
			w=e;
		if(w.document.documentElement&&w.document.documentElement.scrollTop)
			offset=w.document.documentElement.scrollTop;
		else if(w.document.body&&xDef(w.document.body.scrollTop))
			offset=w.document.body.scrollTop;
	}
	else
	{
		e=xGetElementById(e);
		if(e&&xNum(e.scrollTop))
			offset=e.scrollTop;
	}
	return offset;
};

function xVisibility(e,bShow)
{
	if(!(e=xGetElementById(e)))
		return null;
	if(e.style&&xDef(e.style.visibility))
	{
		if(xDef(bShow))
			e.style.visibility=bShow?'visible':'hidden';
		return e.style.visibility;
	}
	return null;
};

function xDef()
{
	for(var i=0;i<arguments.length;++i)
	{
		if(typeof(arguments[i])=='undefined')
			return false;
	}
	return true;
};

function xNum()
{
	for(var i=0;i<arguments.length;++i)
	{
		if(isNaN(arguments[i])||typeof(arguments[i])!='number')
			return false;
	}
	return true;
};

function xStr(s)
{
	for(var i=0;i<arguments.length;++i)
	{	
		if(typeof(arguments[i])!='string')
			return false;
	}
	return true;
};

function xPreventDefault(e)
{
	if(e&&e.preventDefault)
		e.preventDefault();
	else if(window.event)
		window.event.returnValue=false;
};

function xAddEventListener(e,eT,eL,cap)
{
	if(!(e=xGetElementById(e)))
		return;
	eT=eT.toLowerCase();
	if(e.addEventListener)
		e.addEventListener(eT,eL,cap||false);
	else if(e.attachEvent)
		e.attachEvent('on'+eT,eL);
	else 
		e['on'+eT]=eL;
};

function xRemoveEventListener(e,eT,eL,cap)
{
	if(!(e=xGetElementById(e)))
		return;
	eT=eT.toLowerCase();
	if(e.removeEventListener)
		e.removeEventListener(eT,eL,cap||false);
	else if(e.detachEvent)
		e.detachEvent('on'+eT,eL);
	else 
		e['on'+eT]=null;
};

function xEvent(evt)
{
	var e=evt||window.event;
	if(!e)
		return;
	if(e.type)
		this.type=e.type;
	if(e.target)
		this.target=e.target;
	else if(e.srcElement)
		this.target=e.srcElement;
	if(e.relatedTarget)
		this.relatedTarget=e.relatedTarget;
	else if(e.type=='mouseover'&&e.fromElement)
		this.relatedTarget=e.fromElement;
	else if(e.type=='mouseout')
		this.relatedTarget=e.toElement;
	if(xDef(e.pageX,e.pageY))
	{
		this.pageX=e.pageX;
		this.pageY=e.pageY;
	}
	else if(xDef(e.clientX,e.clientY))
	{
		this.pageX=e.clientX+xScrollLeft();
		this.pageY=e.clientY+xScrollTop();
	}
	if(xDef(e.offsetX,e.offsetY))
	{
		this.offsetX=e.offsetX;
		this.offsetY=e.offsetY;
	}
	else if(xDef(e.layerX,e.layerY))
	{
		this.offsetX=e.layerX;
		this.offsetY=e.layerY;
	}
	else
	{
		this.offsetX=this.pageX-xPageX(this.target);
		this.offsetY=this.pageY-xPageY(this.target);
	}
	this.keyCode=e.keyCode||e.which||0;
	this.shiftKey=e.shiftKey;
	this.ctrlKey=e.ctrlKey;
	this.altKey=e.altKey;
};

var _xDrgMgr={ ele:null,mm:false };

function xEnableDrag(id,fS,fD,fE)
{
	var ele=xGetElementById(id);
	if(ele)
	{
		ele.xDraggable=true;
		ele.xODS=fS;
		ele.xOD=fD;
		ele.xODE=fE;
		xAddEventListener(ele,'mousedown',_xOMD,false);
		if(!_xDrgMgr.mm)
		{
			_xDrgMgr.mm=true;
			xAddEventListener(document,'mousemove',_xOMM,false);
		}
	}
};

function _xOMD(e)
{
	var evt=new xEvent(e);
	var ele=evt.target;
	while(ele&&!ele.xDraggable)
	{
		ele=xParent(ele);
	}
	if(ele)
	{
		xPreventDefault(e);
		ele.xDPX=evt.pageX;
		ele.xDPY=evt.pageY;
		_xDrgMgr.ele=ele;
		xAddEventListener(document,'mouseup',_xOMU,false);
		if(ele.xODS)
		{
			ele.xODS(ele,evt.pageX,evt.pageY);
		}
	}
};

function _xOMM(e)
{
	var evt=new xEvent(e);
	if(_xDrgMgr.ele)
	{
		xPreventDefault(e);
		var ele=_xDrgMgr.ele;
		var dx=evt.pageX-ele.xDPX;
		var dy=evt.pageY-ele.xDPY;
		ele.xDPX=evt.pageX;
		ele.xDPY=evt.pageY;
		if(ele.xOD)
		{
			ele.xOD(ele,dx,dy);
		}
		else
		{
			xMoveTo(ele,xLeft(ele)+dx,xTop(ele)+dy);
		}
	}
};

function _xOMU(e)
{
	if(_xDrgMgr.ele)
	{
		xPreventDefault(e);
		xRemoveEventListener(document,'mouseup',_xOMU,false);
		if(_xDrgMgr.ele.xODE)
		{
			var evt=new xEvent(e);
			_xDrgMgr.ele.xODE(_xDrgMgr.ele,evt.pageX,evt.pageY);
		}
		_xDrgMgr.ele=null;
	}
};
