/* sortable list - sweet!  requires drag.js */

var DisableDrag = false;
function SortableList(list, message, controller, action, sortid, params){
		var This = this;
		This.message_div = new Element(message);
		This.list_id = list;
		This.drags = new Array();
		This.list = new Element(list);
		This.sortid = sortid ? sortid : "id";
		This.nodes = This.list.getChildren("li");
		This.controller = controller;
		This.action = action;
		This.params = params ? params : false;
		
	This.build = function(){
		This.drags = new Array();
		
		for(var i=0; i < This.nodes.length; i++){	
			
			var gh = new GhostDrag(This.nodes[i], {onStop:This.stop});
			This.drags.push(gh);
		}	
		for(var i = 0; i < This.drags.length; i++){
			for(var f = 0; f < This.drags.length; f++ ){				
				if( This.drags[f].element.element.id != This.drags[i].element.id  ){
						var oc = this.drags[f].element.element.className ? this.drags[f].element.element.className : " ";
						var dt = new DragTarget(This.drags[f].element.element, {	 
								onDrop:This.drop, 
								onHover:This.hover,
								offClass:oc	});											
						This.drags[i].addListener(dt);
				}	  
			}
		}	
	}
	This.hover= function(target, drag, e){
		var ei = new EventInfo(e, true);
		var top = target.element.getRelativeTop();
		var center =  target.element.getRelativeTop() + target.element.getRealHeight()/2;
		if(ei.ymouse < center){
			target.hover = "top";
			target.element.setClass(target.offClass + ' hoverTop');
		}else if(ei.ymouse > center){
			target.hover = "bottom";
			target.element.addClass(target.offClass + ' hoverBottom');
		}
	}
	This.drop= function(target, drag, e){
		target.element.setClass(target.offClass);
		if(drag.ghost)
			drag.destroyGhost();
		if(target.hover)
			This.move(drag, target, target.hover);
	}
	This.move= function(move, to, position){
		var move_id = move.element.id;
		var to_id	= to.element.id;
		var new_parent = position == "in" ? to.element.id : to.element.element.getAttribute("parent");
		
		var move = move.element.element;
		var to	= to.element.element;
		
		var clone = move.cloneNode(true);
			clone.setAttribute("parent",new_parent);
				
		var remove = document.getElementById(move_id);
			remove.parentNode.removeChild(remove);
			
		if(position == "top"){
			to.parentNode.insertBefore(clone, to);
			This.update(This.list);
		}else{
			to.parentNode.insertBefore(clone, to.nextSibling);
			This.update(This.list);
		}	
	}
	This.update= function(list){
		var items = This.nodes;
		var update = new Array();
		for(var i =0; i < items.length; i++){
			update.push('{"id":"'+items[i].getAttribute(This.sortid)+'","sort_order":"'+i+'"}'); 
		}
		if(This.params){
			var send = '{"params":' + This.params + ',"sorts":[' + update.join(",") + ']}';	
		} else  {
			var send = "[" + update.join(",") + "]";	
		}		
		This.update_obj = send;
		This.save();
	}
	This.save = function(){
		This.build();	
		RemoteCall.handlers = {
			onData:function(data){
				This.message_div.setContent('<p class="notify">Sorting changes saved.</p>');	
				window.setTimeout(ClearNotifications, 2000);
			},
			onError:function(resp){
				alert("Error sorting list: " + resp);	
			}
		}
		//alert(This.update_obj);
		This.message_div.setContent('<p class="notify">Saving sort order...</p>');
		RemoteCall.make(This.controller, This.action, This.update_obj);
	}
	This.stop= function(ei, drag){
		drag.destroyGhost();
	}
	This.contains= function(item, id){
		var kids = item.getElementsByTagName("li");
		for(var k = 0; k < kids.length; k++){			
			if(kids[k].getAttribute('id') == id){
				return true;
			}
		}
		return false;
	}	
	This.build();
};