function pos_getAbsX(el) { return (el.x) ? el.x : pos_getAbsPos(el,"Left"); }
function pos_getAbsY(el) { return (el.y) ? el.y : pos_getAbsPos(el,"Top"); }
function pos_getAbsPos(el, which) {
	iPos = 0;
	while (el != null) {
		iPos += el["offset" + which];
		el = el.offsetParent;
	}
	return iPos;
}

function pos_getWindowWidth(el) {
	if (el.innerWidth) return(el.innerWidth);
	else if (el.document.body.clientWidth) return(el.document.body.clientWidth);
	else return -1;
}

function pos_getWindowHeight(el) {
	if (el.innerHeight) return(el.innerHeight);
	else if (el.document.body.clientHeight) return(el.document.body.clientHeight);
	else return -1;
}


/*
	Drag-And-Drop
*/

window.oDragNDrop = {
	dragObject: null,
	mouseOffset: null,
	mouseCoords: function(ev)
	{
		if(ev.pageX || ev.pageY){
			return {x:ev.pageX, y:ev.pageY};
		}
		return {
			x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
			y:ev.clientY + document.body.scrollTop  - document.body.clientTop
		};
	},
	mouseMove: function(ev)
	{
		ev = ev || window.event;
		var mousePos = oDragNDrop.mouseCoords(ev);
		if(!oDragNDrop.dragObject)return;
		if(oDragNDrop.dragObject.style.position!='absolute')
		{
			oDragNDrop.dragObject.style.width = oDragNDrop.dragObject.offsetWidth+"px";
			oDragNDrop.dragObject.style.position = 'absolute';
		}
		oDragNDrop.dragObject.style.top = mousePos.y - oDragNDrop.mouseOffset.y;
		oDragNDrop.dragObject.style.left = mousePos.x - oDragNDrop.mouseOffset.x;
		if(oDragNDrop.dragObject.onDragMove)oDragNDrop.dragObject.onDragMove(ev);
		return false;
	},
	mouseUp: function(ev)
	{
		ev = ev || window.event;
		oDragNDrop.dragObject.style.zIndex = '';
		removeEvent(document,'mousemove',oDragNDrop.mouseMove);
		removeEvent(document,'mouseup',oDragNDrop.mouseUp);
		if(oDragNDrop.dragObject.onDragEnd)oDragNDrop.dragObject.onDragEnd(ev);
		oDragNDrop.dragObject = null;
	},
	mouseDown: function(event)
	{
		if(oDragNDrop.dragObject)return;
		ev = event || window.event;
		target = ev.target || ev.srcElement;
		if(!target) return false;
		while(!target.draggingEnabled && target.parentNode)target=target.parentNode;
		if(!target.draggingEnabled)return false;
		addEvent(document,'mousemove',oDragNDrop.mouseMove);
		addEvent(document,'mouseup',oDragNDrop.mouseUp);
		oDragNDrop.dragObject = target;
		if(target.onDragStart)target.onDragStart(ev);
		var docPos = getElementAbsPos(target);
		var parentPos = target.offsetParent?getElementAbsPos(target.offsetParent):{x:0,y:0};
		var mousePos = oDragNDrop.mouseCoords(ev);
		oDragNDrop.mouseOffset = {x:mousePos.x - docPos.x + parentPos.x, y:mousePos.y - docPos.y + parentPos.y};
		target.style.zIndex = 1000;
		return false;
	}
}
function enableDragging(el)
{
	if(!oDragNDrop || !el || el.draggingEnabled) return;
	el.oldonmousedown = el.onmousedown;
	el.onmousedown = function(){if(this.oldonmousedown)this.oldonmousedown();return false;}
	addEvent(el,"mousedown",oDragNDrop.mouseDown);
	el.draggingEnabled = true;
	el.oldcursor = el.style.cursor;
	el.style.cursor = "move";
	// Tämä aiheutti liikuteltavan elementin hyppimisen ja räjähtelyn, voi olla että kuuluisi olla absolute
	//el.style.position = "relative";
	for(var i in {onDragStart:0,onDragMove:0,onDragEnd:0}) try
	{
		var t=el[i] || el.getAttribute(i);
		if(t && typeof(t)!="function")eval("el."+i+"=function(){"+t+"}");
		else el[i]=t;
	}
	catch(e) { el[i]=undefined; }
}
function disableDragging(el)
{
	if(!oDragNDrop || !el || !el.draggingEnabled) return;
	el.onmousedown=el.oldonmousedown;
	removeEvent(el,"mousedown",oDragNDrop.mouseDown);
	el.draggingEnabled = undefined;
	el.style.cursor = el.oldcursor;
}

/*
	Make object position fixed
*/

var oFixed = {
	elementList: new Array(),
	add: function (el)
	{
		if(!el || document.body.scrollLeft==undefined)return false;
		try
		{
			el.oldPosition=el.style.position;
			el.oldLeft=el.style.left;
			el.oldTop=el.style.top;
			el.style.position="absolute";
			var p=getElementAbsPos(el);
			var pp=el.offsetParent?getElementAbsPos(el.offsetParent):{x:0,y:0};
			el.absX=p.x-pp.x-document.body.scrollLeft;
			el.absY=p.y-pp.y-document.body.scrollTop;
			if(this.isFixed(el))return;
			this.elementList.push(el);
			if(this.elementList.length==1)addEvent(window,'scroll',this.onscroll);
		}
		catch(e)
		{
			return false;
		}
		return true;
	},
	isFixed: function(el)
	{
		for(var i=0;i<this.elementList.length;i++)if(this.elementList[i]==el)return i+1;
		return false;
	},
	onscroll: function()
	{
		for(var i=0;i<oFixed.elementList.length;i++)
		{
			var e=oFixed.elementList[i];
			e.style.left=(document.body.scrollLeft+e.absX)+"px";
			e.style.top=(document.body.scrollTop+e.absY)+"px";
		}
	},
	remove: function (el)
	{
		try
		{
			if(!el)return false;
			var i=this.isFixed(el);
			if(!i)return false;
			el.style.position=el.oldPosition;
			el.style.left=el.oldLeft;
			el.style.top=el.oldTop;
			this.elementList.splice(i-1,1);
			if(this.elementList.length==0)removeEvent(window,'scroll',this.onscroll);
		}
		catch(e)
		{
			return false;
		}
		return true;
	}
}

function fixPosition(el)
{
	return oFixed.add(el);
}
function unfixPosition(el)
{
	return oFixed.remove(el);
}
function isFixed(el)
{
	return oFixed.isFixed(el);
}
