/********************************************************
	DOM Lib: drag
		
	Gestiona el arrastre de elementos HTML
	
	Comentarios, dudas, sugerencias: jose@doubleyou.com
	
	Última revisión: 19/07/04
********************************************************/

/*
	TO DO
	- Testearlo a fondo
	- Comprobar compatibilidad con distintos elementos (img, span, table, etc)
	- Posiblemente puede simplificarse más
	- Por ahora, no permite pasarle otro elemento como márgenes para el elemento arrastable
*/

DOM.setDragable = function(el){
	this.dragObject.addElement(el);
}

DOM.dragObject = new Object();

DOM.dragObject.addElement = function(el){
	var el = DOM.getElement(el);
	el.dragBoundary = null;

	el.onmousedown = function(e){
		DOM.dragObject._startDrag(e,this);
	}
}


DOM.dragObject._startDrag = function(event,el){
	this.dragElm = el;
	
	if (DOM.browser.ie) {
		document.attachEvent("onmousemove", this._doDrag);
		document.attachEvent("onmouseup",this._stopDrag);
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	else{
		document.addEventListener("mousemove",this._doDrag,   true);
		document.addEventListener("mouseup",this._stopDrag, true);
		event.preventDefault();
	}	

	if (DOM.browser.ie || DOM.browser.opera){
	    x = window.event.clientX + document.documentElement.scrollLeft+ document.body.scrollLeft;
    	y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
	}
	else{
	    x = parseInt(event.clientX + window.scrollX);
    	y = parseInt(event.clientY + window.scrollY);		
	}

	DOM.dragObject.cursorStartX = x;
	DOM.dragObject.cursorStartY = y;
	DOM.dragObject.elStartLeft  = DOM.getX(el);
	DOM.dragObject.elStartTop   = DOM.getY(el);	
}

DOM.dragObject._doDrag = function(event){
	
	if (DOM.browser.ie || DOM.browser.opera){
	    x = window.event.clientX + document.documentElement.scrollLeft+ document.body.scrollLeft;
    	y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
	}
	else{
	    x = parseInt(event.clientX + window.scrollX);
    	y = parseInt(event.clientY + window.scrollY);		
	}

	var xx = DOM.dragObject.elStartLeft+x-DOM.dragObject.cursorStartX;
	var yy = DOM.dragObject.elStartTop+y-DOM.dragObject.cursorStartY;
	
	if (DOM.dragObject.dragElm.dragBoundary!=null){
		var w = DOM.getWidth(DOM.dragObject.dragElm);
		var h = DOM.getHeight(DOM.dragObject.dragElm);
			
		
		var t = DOM.dragObject.dragElm.dragBoundary[0];
		var r = DOM.dragObject.dragElm.dragBoundary[1];
		var b = DOM.dragObject.dragElm.dragBoundary[2];
		var l = DOM.dragObject.dragElm.dragBoundary[3];
		

		if (xx<l) xx = l;
		else if (xx+w>r) xx = r-w;
		if (yy<t) yy = t;
		else if(yy+h>b) yy = b-h;
	}
	
	DOM.moveTo(DOM.dragObject.dragElm,xx,yy)
	if (DOM.dragObject.dragElm.ondrag) DOM.dragObject.dragElm.ondrag();
	
	//IE selecciona texto al dragear, así que lo obligamos a deseleccionarlo
	if (document.selection) document.selection.clear();	
	
}

DOM.dragObject._stopDrag = function(event){

	if (DOM.browser.ie) {
		document.detachEvent("onmousemove", DOM.dragObject._doDrag);
		document.detachEvent("onmouseup",DOM.dragObject._stopDrag);
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	else{
		document.removeEventListener("mousemove",DOM.dragObject._doDrag,   true);
		document.removeEventListener("mouseup",DOM.dragObject._stopDrag, true);
		event.preventDefault();
	}	
}


DOM.dragObject.setDragBoundary = function(){
	var a = arguments;
	var el = DOM.getElement(a[0]);
	if (a.length==1) return false;
	else el.dragBoundary = new Array(a[1],a[2],a[3],a[4]);
}
