Aheuh.Drag = Class.create({
	
	initialize: function (target,xmin,xmax,ymin,ymax,onMoveFunction) {
		this._target = target;
		this._mouseOldPos = {};
		this._setLimit(xmin,xmax,ymin,ymax);
		this.onMoveFunction = onMoveFunction;		
		this.draggable = false;
		this._targetDown = this.setDraggable.bind(this,true);
		this._docMouseUp = this.setDraggable.bind(this,false);
		this._docMouseMove = this._setMove.bindAsEventListener(this);
		Event.observe(this._target,"mousedown",this._targetDown);
		Event.observe(document,"mouseup",this._docMouseUp);
		Event.observe(document,"mousemove",this._docMouseMove);
	},
	
	_setLimit: function (xmin,xmax,ymin,ymax) {
		Aheuh.Axis.each( function (k){
			this[k.min] = eval(k.min); this[k.max] = eval(k.max);
			this['target'+[k.max]] = this[k.max]-this._target[k.offsetscale];
			this._mouseOldPos[k.mouse] = null;
		}.bind(this));
	},
	
	setDraggable: function (draggable) {
		this.draggable = draggable;
		Aheuh.Axis.each( function (k){ this._mouseOldPos[k.mouse] = null; }.bind(this));
	},
	
	_setMove: function (e) {
		Aheuh.Axis.each( this._move.bind(this,e) );
	},
	
	_move: function (e,k) {
		if (this.draggable) {			
			var mouse = Event['pointer'+k.key.toUpperCase()](e);
			if (this._mouseOldPos[k.mouse]) {				
				if (this[k.max]>this[k.min]) {
					var n = this._target[k.offsetpos]-(this._mouseOldPos[k.mouse]-mouse);					
					if (n<this[k.min]) { n = this[k.min]; }
					else if (n+this._target[k.offsetscale]>this[k.max]) { n = this['target'+[k.max]]; }
					this._target.style[k.pos] = n+"px";
					Event.SelectionClear();
					if (this.onMoveFunction) { this.onMoveFunction(); }
				}
			}
			this._mouseOldPos[k.mouse] = mouse;
		}
	},
	
	reload: function (xmin,xmax,ymin,ymax) {
		this._setLimit(xmin,xmax,ymin,ymax);
	},
	
	kill: function () {
		Event.stopObserving(this._target,"mousedown",this._targetDown);
		Event.stopObserving(document,"mouseup",this._docMouseUp);
		Event.stopObserving(document,"mousemove",this._docMouseMove);
	}

});