/*
-------------------
Dragger
-------------------
*/

var Dragger = {
	makeDraggable: function(element, extend, child) {
		var root = element;
		root.setStyle({zIndex: 1});
		if(child) {
			element = element.select('.'+child);
		} else {
			element = [element];
		}
		for(i=0;i<element.length;i++) {
			var inny = element[i];
			element[i].setStyle({'cursor': 'move'});
			element[i].observe("mousedown", function(event) {
				if(!event.isLeftClick()) return;
				x = event.element();
				while(x && x != inny) {
					x = x.up();
				}
				if(!x) return false;
				
				var el = root;
				if(extend && extend.startCond) {
					if(extend.startCond(el) === false) return false;
				}
				
				// In my world, everything's positive.
				var x = intval(el.getStyle('left'));
				if(x < 0) x = 0;
				var y = intval(el.getStyle('top'));
				if(y < 0) y = 0;

				var dx = event.pointerX() - x;
				var dy = event.pointerY() - y;

				el.setStyle({zIndex: 2});

				document.observe("mousemove", moveHandler);
				document.observe("mouseup", upHandler);
							
				event.stop();
				
				function moveHandler(event) {
					var posx = event.pointerX();
					var posy = event.pointerY();
					var movement = true;
					if(extend && extend.moveCond) {
						movement = extend.moveCond(el,(posx - dx),(posy - dy));
					}
					if(movement) {
						el.setStyle({left: (posx - dx) + "px",
										top: (posy - dy) + "px"});
					}
					event.stop();
				}

				function upHandler(event) {
					document.stopObserving('mousemove', moveHandler);
					document.stopObserving('mouseup', upHandler);
					if(extend && extend.stopCond) {
						extend.stopCond(el,x,y);
					}
					el.setStyle({zIndex: 1});
					event.stop();
				}
			});
		}
	}
}

Element.addMethods(Dragger);