/*
----------------------
Drag Reordering Class
----------------------
Set height to FALSE
if your elements are
different heights.
----------------------
*/

var DragOrder = Class.create({
	initialize:	function(id,height)
					{
						this.ff = new Element('input',{type: 'hidden',name: id});
						this.values = new Array();
						this.el = $(id);
						this.btm = false;
						if(this.el.getStyle('position') != "absolute"
							&& this.el.getStyle('position') != "relative") {
							debug("DragOrder: Parent element not absolute or relative");
							return;
						}
						var ch = this.el.childElements();
						if(ch.length == 0) {
							return;
						}
						this.height = height;
						if(height !== false && !height) {
							this.height = ch[0].getHeight();
						} else if(height === false) {
							this.height = false;
						}
						for(c=0;c<ch.length;c++) {
							if(ch[c].getStyle('position') != "relative") {
								debug("DragOrder: Child element not relative");
								continue;
							}
							this.values[c] = ch[c].identify();
							// Okay, let's add the events
							ch[c].makeDraggable(this);
						}
						this.el.insert({bottom: this.ff});
					},

	getOrder:	function()
					{
						return this.values;
					},

	setOrder:	function(arr)
					{
						this.values = arr.clone();
						arr.reverse();
						for(i=0;i<arr.length;i++) {
							this.el.insert({top: $(arr[i])});
						}
					},

	updateField:	function()
					{
						this.ff.value = this.values.join();
					},

	startCond:	function(el)
					{
						// Let's create an element where this element is
						el.insert({after: new Element('div',{id: 'dragMover'}).setStyle({border: 'dashed 2px red',
																		width: (intval(el.getWidth())-4)+'px',
																		height: (intval(el.getHeight())-4)+'px',
																		display: 'block'
																		}
																	)});
						el.setStyle({position: 'absolute',
										top: this.getPrevHeights(el)+'px'});
						return true;
					},

	getPrevHeights:	function(el)
					{
						var ret = 0;
						while((el = el.previous()) != undefined) {
							ret += el.getHeight();
						}
						return ret;
					},

	complexMove:	function(el,x,y)
					{
						var t = el.siblings(), i = 0, u, dm = false;
						var j;
						if(this.btm) {
							i = this.el.getHeight();
							for(j=t.length-1;j>=0;j--) {
								if(t[j] == el) continue;
								if(y > (i-t[j].getHeight())) {
									u = t[j];
									dm = true;
									break;
								} else if(y > (i-(t[j].getHeight()/2))) {
									u = t[j-1];
									break;
								}
								i -= t[j].getHeight();
							}
						} else {
							for(j=0;j<t.length;j++) {
								if(t[j] == el) continue;
								if(y < (i+(t[j].getHeight()/2))) {
									u = t[j];
									break;
								} else if(y < (i+t[j].getHeight())) {
									u = t[j+1];
									dm = true;
									break;
								}
								i += t[j].getHeight();
							}
						}
						this.btm = false;
						if(j > (t.length/2)) {
							this.btm = true;
						}
						if(u != undefined) {
							if(dm) {
								u.insert({after: $('dragMover')});
							} else {
								u.insert({before: $('dragMover')});
							}
						}
						
						return true;
					},
					
	simpleMove:		function(el,x,y)
					{
						var t = el.siblings();
						var m = y % this.height;
						var i = (y - m) / this.height;
						var u;
						var dm = false;
						if(m < (this.height / 2)) {
							u = t[i];
							if(i == 0) dm = true;
						} else {
							u = t[i+1];
						}
						if(u != undefined) {
							if(!dm) {
								u.insert({after: $('dragMover')});
							} else {
								u.insert({before: $('dragMover')});
							}
						}
						return true;
					},

	moveCond:	function(el,x,y)
				{
					if(this.height !== false) {
						return this.simpleMove(el,x,y);
					}
					return this.complexMove(el,x,y);
				},

	stopCond:	function (el,x,y)
				{
					el.setStyle({position: 'relative',left: '0px',top: '0px'});
					$('dragMover').insert({before: el});
					$('dragMover').remove();
					arr = this.el.childElements();
					this.values.clear();
					for(i=0;i<arr.length;i++) {
						this.values[i] = arr[i].identify();
					}
					this.updateField();
					this.btm = false;
					return true;
				}
});
