/**
* Dependencies: modCoord.js, modCss.js
*/

var	modDrag_upDir		= 1;
var	modDrag_rightDir	= 2;
var	modDrag_downDir		= 4;
var	modDrag_leftDir		= 8;

modDrag = {

	obj: null,

	makeDragable: function(elem, elemParent)
	{
		if (elem)
		{
			elem.modDrag = {
				_lastX: 0,
				_lastY: 0,
				_zIndex: null,
				_dir: 0,
				parent: elemParent ? elemParent : elem,
				minX: null,
				minY: null,
				maxX: null,
				maxY: null,
				opacity: null,
				onDragInit: new Array(),
				onDrag: new Array(),
				onDragEnd: new Array()
			};
			elem.modDrag._zIndex 	= modCss.getCssStyle(elem.modDrag.parent, 'z-index');
			elem.onmouseover		= (elem.style.cursor = 'move');
			elem.onmousedown		= modDrag._initDrag;
		}
		else
			alert('makeDragable: elem doesn\'t exist');
	},

	setMinX: function(elem, val)
	{
		if (elem && elem.modDrag != 'undefined')
			elem.modDrag.minX = val;
		else
			alert('setMinX: elem doesn\'t exist');
	},

	setMinY: function(elem, val)
	{
		if (elem && elem.modDrag != 'undefined')
			elem.modDrag.minY = val;
		else
			alert('setMinY: elem doesn\'t exist');
	},

	setMaxX: function(elem, val)
	{
		if (elem && elem.modDrag != 'undefined')
			elem.modDrag.maxX = val;
		else
			alert('setMaxX: elem doesn\'t exist');
	},

	setMaxY: function(elem, val)
	{
		if (elem && elem.modDrag != 'undefined')
			elem.modDrag.maxY = val;
		else
			alert('setMaxY: elem doesn\'t exist');
	},

	setOpacity: function(elem, val)
	{
		if (elem && elem.modDrag != 'undefined')
			elem.modDrag.opacity = val;
		else
			alert('setOpacity: elem doesn\'t exist');
	},

	dragVertically: function(elem)
	{
		if (elem && elem.modDrag != 'undefined')
		{
			var	topLeft	= modCoord.elemTopLeft(elem.modDrag.parent);
			var	size	= modCoord.create(modCss.getCssStyle(elem.modDrag.parent, 'width'),
									   	  modCss.getCssStyle(elem.modDrag.parent, 'height'));
			elem.modDrag.minX = topLeft.x;
			elem.modDrag.maxX = topLeft.x + size.x;
		}
		else
			alert('dragVerticaly: elem doesn\'t exist');
	},

	dragHorizontally: function(elem)
	{
		if (elem && elem.modDrag != 'undefined')
		{
			var	topLeft	= modCoord.elemTopLeft(elem.modDrag.parent);
			var	size	= modCoord.create(modCss.getCssStyle(elem.modDrag.parent, 'width'),
									   	  modCss.getCssStyle(elem.modDrag.parent, 'height'));
			elem.modDrag.minY = topLeft.y;
			elem.modDrag.maxY = topLeft.y + size.y;
		}
		else
			alert('dragHorizontaly: elem doesn\'t exist');
	},

	dragInBox: function(elem, minX, minY, maxX, maxY)
	{
		if (elem && elem.modDrag != 'undefined')
		{
			elem.modDrag.minX = minX;
			elem.modDrag.minY = minY;
			elem.modDrag.maxX = maxX;
			elem.modDrag.maxY = maxY;
		}
		else
			alert('dragInBox: elem doesn\'t exist');
	},

	_callFunc: function(array, elem, x, y)
	{
		for (i = 0; i < array.length; i++)
			array[i].apply(elem, [x, y]);
	},

	_initDrag: function(e)
	{
		if (this.modDrag != 'undefined')
		{
			modDrag.obj = this;
			var parent	= this.modDrag.parent;
			var	mouse	= modCoord.mouseAbs(e);
			parent.style.zIndex	= 1000000;
			if (this.modDrag.opacity != null)
			{
				parent.style.opacity	= this.modDrag.opacity;	
				parent.style.filter		= 'alpha(opacity=' + (this.modDrag.opacity * 100) + ')';
			}
			this.modDrag._lastX	= mouse.x;
			this.modDrag._lastY	= mouse.y;
			document.onmousemove	= modDrag._drag;
			document.onmouseup		= modDrag._endDrag;
			modDrag._callFunc(this.modDrag.onDragInit, this, mouse.x, mouse.y);
		}
		else
			alert('_initDrag: elem doesn\'t exist');
		return false;
	},
	
	_drag: function(e)
	{
		if (this.modDrag != 'undefined')
		{
			var	parent	= modDrag.obj.modDrag.parent;
			var	topLeft	= modCoord.elemTopLeft(parent);
//			var	off		= modCoord.offsetTopLeft(parent);
			var	mouse	= modCoord.mouseAbs(e);
			var	size	= modCoord.create(modCss.getCssStyle(parent, 'width'), modCss.getCssStyle(parent, 'height'));
			var	dx		= mouse.x - modDrag.obj.modDrag._lastX;
			var	dy		= mouse.y - modDrag.obj.modDrag._lastY;
			var	lft		= topLeft.x + dx;
			var	top		= topLeft.y + dy;
			if (modDrag.obj.modDrag.minX!=null && lft < modDrag.obj.modDrag.minX) lft = modDrag.obj.modDrag.minX;
			if (modDrag.obj.modDrag.maxX!=null && lft + size.x > modDrag.obj.modDrag.maxX) lft = modDrag.obj.modDrag.maxX - size.x;
			if (modDrag.obj.modDrag.minY!=null && top < modDrag.obj.modDrag.minY) top = modDrag.obj.modDrag.minY;
			if (modDrag.obj.modDrag.maxY!=null && top + size.y > modDrag.obj.modDrag.maxY) top = modDrag.obj.modDrag.maxY - size.y;
			parent.style.left	= lft + 'px';
			parent.style.top	= top + 'px';
			modDrag.obj.modDrag._lastX	= mouse.x;
			modDrag.obj.modDrag._lastY	= mouse.y;
			modDrag.obj.modDrag._dir	= 0;
			modDrag.obj.modDrag._dir	+= dx > 0 ? modDrag_rightDir : (dx < 0 ? modDrag_leftDir : 0);
			modDrag.obj.modDrag._dir	+= dy > 0 ?modDrag_downDir : (dy < 0 ? modDrag_upDir : 0);
//			
//			var txt = document.getElementById('text');
//			txt.innerHTML = '[Mouse pos]x:' + mouse.x + ' y:' + mouse.y + "\n";
//			txt.innerHTML += '[Elem pos]x:' + off.x + ' y:' + off.y + "\n";
//			txt.innerHTML += 'minX: ' + modDrag.obj.modDrag.minX + "\n";
//			txt.innerHTML += 'maxX: ' + modDrag.obj.modDrag.maxX + "\n";
//			txt.innerHTML += 'minY: ' + modDrag.obj.modDrag.minY + "\n";
//			txt.innerHTML += 'maxY: ' + modDrag.obj.modDrag.maxY + "\n";
			modDrag._callFunc(modDrag.obj.modDrag.onDrag, modDrag.obj, lft, top);
		}
		else
			alert('_drag: elem doesn\'t exist');
		return false;
	},
	
	_endDrag: function(e)
	{
		if (this.modDrag != 'undefined')
		{
			var	parent	= modDrag.obj.modDrag.parent;
			modDrag.obj.modDrag._lastX	= null;
			modDrag.obj.modDrag._lastY	= null;
			if (modDrag.obj.modDrag.opacity != null)
			{
				parent.style.opacity	= 1;	
				parent.style.filter		= 'alpha(opacity=100)';
			}
			parent.style.zIndex 	= modDrag.obj.modDrag._zIndex;
			document.onmousemove	= null;
			document.onmouseup 		= null;
			modDrag._callFunc(modDrag.obj.modDrag.onDragEnd, modDrag.obj, parent.style.left, parent.style.top);
			modDrag.obj	= null;
		}
		else
			alert('_dragEnd: elem doesn\'t exist');
		return false;
	}

};