//////////////////////////////////////////////////////////
//
//  Adopted from original by Aaron Boodman: www.youngpup.net
//
//  red.drag.init(elem, elemParent, minX, maxX, minY, maxY, bSwapHorzRef, bSwapVertRef);
//  elem.ondrag = function() {
//  }
//  elem.ondragend = function() {
//  }
//////////////////////////////////////////////////////////

red.prototype.drag = {
   
    obj : null,
	
	lastobj : null,
	
	dragobjekte : new Array(),
	
	zindex : 500,
		
	colorchange : true,
	
	opacitychange : false,
		
	active_color : '#999',
	
	cursor : 'move', /* default,crosshair,pointer,move,wait,text,help,(n,ne,e,se,s,sw,w,nw -)resize  */
	
	is_resizer : false,
	
	/*drop_target : null,*/
	
    init: function(elem, elemParent, minX, maxX, minY, maxY, bSwapHorzRef, bSwapVertRef) {
        
		elem.onmousedown = red.prototype.drag.start;
        if(elemParent != null){
			elemParent.child = elem;
			elemParent.onmousedown = red.prototype.drag.makezindex;
		}

						
		red.prototype.css.set(elem,";cursor:"+red.prototype.drag.cursor+";",false);
		
		elem.hmode = bSwapHorzRef ? false : true ;
        elem.vmode = bSwapVertRef ? false : true ;
        elem.root = elemParent && elemParent != null ? elemParent : elem ;
       	
		//make absolute
		if(!red.prototype.css.has_position(elem.root)){
			red.prototype.css.position(elem.root);
		}
		if (elem.hmode && isNaN(parseInt(elem.root.style.left ))) {
			elem.root.style.left = red.prototype.css.get(elem.root, "left");
		}
        if (elem.vmode && isNaN(parseInt(elem.root.style.top ))) {
			elem.root.style.top = red.prototype.css.get(elem.root, "top");
        }
        if (!elem.hmode && isNaN(parseInt(elem.root.style.right ))) {
			elem.root.style.right = red.prototype.css.get(elem.root, "right");
        }
        if (!elem.vmode && isNaN(parseInt(elem.root.style.bottom))) {
			elem.root.style.bottom = red.prototype.css.get(elem.root, "bottom");
        }
			
		
        elem.minX = typeof minX != 'undefined' ? minX : null;
        elem.minY = typeof minY != 'undefined' ? minY : null;
        elem.maxX = typeof maxX != 'undefined' ? maxX : null;
        elem.maxY = typeof maxY != 'undefined' ? maxY : null;
       
	   
        elem.root.ondragstart 	= new Function();
        elem.root.ondragend  	= new Function();
        elem.root.ondrag 		= new Function();
		elem.root.ondrop 		= new Function();
		
		red.prototype.drag.zindex++;
		elem.root.style.zIndex = red.prototype.drag.zindex;
						
		red.prototype.drag.dragobjekte[red.prototype.drag.dragobjekte.length] =  elem.root;
		
		// farben
		
		if(red.prototype.drag.colorchange){
			elem.inactive_color = elem.style.backgroundColor;
			elem.active_color = red.prototype.drag.active_color;
		}

		//für drop
		elem.root.position = elem.root.style.position;
		
		return elem.root;	
    },
   
	start: function(e) {
        var elem = red.prototype.drag.obj = this;
        
		if(red.prototype.drag.opacitychange){
			red.prototype.css.setopacity(elem,50);
		}
				
		// farben
		if(!elem.root.child && red.prototype.drag.is_resizer == false){
			//elem.root.child = elem;
			red.prototype.drag.makezindex(elem);
		}
								
		e = red.prototype.drag.fixE(e);
		red.prototype.drag.y = parseInt(elem.vmode ? elem.root.style.top  : elem.root.style.bottom);
        red.prototype.drag.x = parseInt(elem.hmode ? elem.root.style.left : elem.root.style.right );
        
		elem.root.ondragstart(red.prototype.drag.x, red.prototype.drag.y);
       
		elem.lastMouseX = e.clientX;
        elem.lastMouseY = e.clientY;
        	
        if (elem.hmode) {
            if (elem.minX != null) elem.minMouseX    = e.clientX - red.prototype.drag.x + elem.minX;
            if (elem.maxX != null) elem.maxMouseX    = elem.minMouseX + elem.maxX - elem.minX;
        } 
		else {
            if (elem.minX != null) elem.maxMouseX = -elem.minX + e.clientX + red.prototype.drag.x;
            if (elem.maxX != null) elem.minMouseX = -elem.maxX + e.clientX + red.prototype.drag.x;
        }
        
		if (elem.vmode) {
            if (elem.minY != null) elem.minMouseY    = e.clientY - red.prototype.drag.y + elem.minY;
            if (elem.maxY != null) elem.maxMouseY    = elem.minMouseY + elem.maxY - elem.minY;
        } 
		else {
            if (elem.minY != null) elem.maxMouseY = -elem.minY + e.clientY + red.prototype.drag.y;
            if (elem.maxY != null) elem.minMouseY = -elem.maxY + e.clientY + red.prototype.drag.y;
        }
       		
        red.prototype.event.add(document,'mousemove',red.prototype.drag.Drag);
		red.prototype.event.add(document,'mouseup',red.prototype.drag.end);
		
		
		// drop
		if(red.prototype.drag.obj.drop_target != null){
			var target = false;
			
			if(red.prototype.is_object(red.prototype.drag.obj.drop_target)){
				var target = red.prototype.drag.obj.drop_target;
			}
			else if(red.prototype.is_string(red.prototype.drag.obj.drop_target)){			
				var target = red.prototype.dom.byid(red.prototype.drag.obj.drop_target);
			}
			
			if(target){
				var parent = red.prototype.dom.parent(red.prototype.drag.obj);
				if(parent == target){
					red.prototype.css.position(red.prototype.drag.obj,red.prototype.drag.obj.position);
					red.prototype.dom.remove(red.prototype.drag.obj);
					red.prototype.dom.insert(red.prototype.drag.obj);
					var sizexy = red.prototype.css.getsizexy(red.prototype.drag.obj);
					var mousexy = red.prototype.mouse.getxy(e);
					
					var x = mousexy[0]-(sizexy[0]/2);
					var y = mousexy[1]-(sizexy[1]/2);
					
					red.prototype.css.setxy(red.prototype.drag.obj,[x,y]);
				}
								
			}
		}
		
		
		return false;
    },

    Drag: function(e) {
        e = red.prototype.drag.fixE(e);
        var elem = red.prototype.drag.obj;
        
		/* mouseup außerhalb von window */
		if ((elem != null) && !((e.button & 1)||(e.which & 1))){
			red.prototype.drag.end();
			return;
		}
		
		var ey = e.clientY;
        var ex = e.clientX;
			
        red.prototype.drag.y = parseInt(elem.vmode ? elem.root.style.top  : elem.root.style.bottom);
        red.prototype.drag.x = parseInt(elem.hmode ? elem.root.style.left : elem.root.style.right );
        				
		var nx, ny;
       
        if (elem.minX != null) ex = elem.hmode ? 
            Math.max(ex, elem.minMouseX) : Math.min(ex, elem.maxMouseX);
        if (elem.maxX != null) ex = elem.hmode ? 
            Math.min(ex, elem.maxMouseX) : Math.max(ex, elem.minMouseX);
        if (elem.minY != null) ey = elem.vmode ? 
            Math.max(ey, elem.minMouseY) : Math.min(ey, elem.maxMouseY);
        if (elem.maxY != null) ey = elem.vmode ? 
            Math.min(ey, elem.maxMouseY) : Math.max(ey, elem.minMouseY);
        nx = red.prototype.drag.x + ((ex - elem.lastMouseX) * (elem.hmode ? 1 : -1));
        ny = red.prototype.drag.y + ((ey - elem.lastMouseY) * (elem.vmode ? 1 : -1));
        red.prototype.drag.obj.root.style[elem.hmode ? "left" : "right"] = nx + "px";
        red.prototype.drag.obj.root.style[elem.vmode ? "top" : "bottom"] = ny + "px";
        red.prototype.drag.obj.lastMouseX = ex;
        red.prototype.drag.obj.lastMouseY = ey;
        red.prototype.drag.obj.root.ondrag(nx, ny);
        return false;
    },
    
    end: function() {
       	//alert('ende');
		
		red.prototype.event.remove(document,'mousemove',red.prototype.drag.Drag);
		red.prototype.event.remove(document,'mouseup',red.prototype.drag.end);
		
		if(red.prototype.drag.opacitychange){
			red.prototype.css.setopacity(red.prototype.drag.obj,100);
		}
		
        red.prototype.drag.obj.root.ondragend( 
            parseInt(red.prototype.drag.obj.root.style[red.prototype.drag.obj.hmode ? "left" : "right"]), 
            parseInt(red.prototype.drag.obj.root.style[red.prototype.drag.obj.vmode ? "top" : "bottom"]));
        
				
		// drop
		if(red.prototype.drag.obj.root.drop_target != null){
			var target = false;
			
						
			if(red.prototype.is_object(red.prototype.drag.obj.drop_target)){
				var target = red.prototype.drag.obj.drop_target;
			}
			else if(red.prototype.is_string(red.prototype.drag.obj.drop_target)){			
				var target = red.prototype.dom.byid(red.prototype.drag.obj.drop_target);
			}
			if(target){
				var endxy 	= red.prototype.css.getxy(red.prototype.drag.obj);
				var endsize = red.prototype.css.getsizexy(red.prototype.drag.obj);
				var endrect = red.prototype.rect.create(endxy[0],endxy[1],endsize[0],endsize[1]);
			
				var targetxy 	= red.prototype.css.getxy(target);
				var targetsize 	= red.prototype.css.getsizexy(target);
				var targetrect 	= red.prototype.rect.create(targetxy[0],targetxy[1],targetsize[0],targetsize[1]);
			
				var test 		= red.prototype.rect.touch(endrect,targetrect);
				
				if(test){
					red.prototype.css.position(red.prototype.drag.obj,'static');
					red.prototype.dom.insert(red.prototype.drag.obj,target);
					
					 red.prototype.drag.obj.root.ondrop( 
						parseInt(red.prototype.drag.obj.root.style[red.prototype.drag.obj.hmode ? "left" : "right"]), 
						parseInt(red.prototype.drag.obj.root.style[red.prototype.drag.obj.vmode ? "top" : "bottom"])
						);
				}
			}
		}
				
		
		red.prototype.drag.obj = null;
    },
    
    fixE: function(e) {
        if (typeof e == 'undefined') e = window.event;
        if (typeof e.elemX == 'undefined') e.elemX = e.offsetX;
        if (typeof e.elemY == 'undefined') e.elemY = e.offsetY;
        return e;
    },
	
	makezindex : function(elem){
		if(elem == null){
			elem = this;
		}
		else{
			if(elem.type == 'mousedown'){
				elem = elem.currentTarget;
			}
			else{
				//elem = elem;
				//elem.child = elem;
				//alert(elem.child);
			}
		}
		
		if(elem.child){
			var child = elem.child;
		}
		else{
			var child = elem;
		}
		
		// farben
		if(red.prototype.drag.colorchange &&(red.prototype.drag.lastobj != child)){
			child.style.backgroundColor = child.active_color;
			if(red.prototype.drag.lastobj != null){
				red.prototype.drag.lastobj.style.backgroundColor = red.prototype.drag.lastobj.inactive_color;
			}
			red.prototype.drag.lastobj = child;
		}
				
		for(var i=0;i < red.prototype.drag.dragobjekte.length;i++){
			if(red.prototype.drag.dragobjekte[i].style.zIndex > elem.style.zIndex){
				red.prototype.drag.dragobjekte[i].style.zIndex = red.prototype.drag.dragobjekte[i].style.zIndex - 1;
			}
		}
		elem.style.zIndex = red.prototype.drag.zindex;
	}
};