Number.prototype.between = function(range){	return range.include(this);	}

var ResizableWindow = Class.create();
ResizableWindow.prototype={
	initialize:function(element){
		this.element = $(element);
		var defaults = {
			tolerance : 10,
			minHeight : 5,
			maxHeight : 5000,
			minWidth : 5,
			maxWidth : 5000,
			dragOptions :{}
		}
		this.options = Object.extend(defaults,arguments[1] || {});
		this.draggable = new Draggable(this.element,this.options.dragOptions);
		Draggables.unregister(this.draggable);

		//Fixes IE bugs
		Draggables.deactivate();
		document.body.ondragstart = function() { return false; };
		document.body.ondrag = function(){return false;};
    		document.body.onselectstart = function() { return false; };
    		document.body.onselect = function(){return false;};

		this.onMouseOver = this.isOnResizeHandler.bindAsEventListener(this);
		this.onMouseDown = this.startDrag.bindAsEventListener(this);
		this.onMouseMove = this.onResize.bindAsEventListener(this);
		this.onMouseUp = this.onResizeEnd.bindAsEventListener(this);

		this.launchListeners();
	},
	launchListeners : function(){
		Event.observe(this.element,'mousemove',this.onMouseOver);
		Event.observe(this.element,'mouseover',this.onMouseOver);
		Event.observe(this.element,'mousedown',this.onMouseDown);
	},
	stopListeners : function(){
		Event.stopObserving(this.element,'mousemove',this.onMouseOver);
		Event.stopObserving(this.element,'mouseover',this.onMouseOver);
		Event.stopObserving(this.element,'mousedown',this.onMouseDown);
	},
	show : function(){
		this.launchListeners();
		this.element.show();
	},
	hide : function(){
		this.stopListeners();
		this.element.hide();
	},
	isOnResizeHandler : function(e){
/*
		var right = Position.cumulativeOffset(this.element)[0]+this.element.getDimensions().width;
		var bottom = Position.cumulativeOffset(this.element)[1]+this.element.getDimensions().height;
		if(Event.pointerX(e).between($R(right-this.options.tolerance, right))&&Event.pointerY(e).between($R(bottom-this.options.tolerance, bottom))){
*/
		var pleft = Position.cumulativeOffset(this.element)[0];
		var ptop = Position.cumulativeOffset(this.element)[1];
		var pwidth = this.element.getDimensions().width;
		var pheight = this.element.getDimensions().height;
		var phandles={
		se:{x:pleft+pwidth  ,y:ptop+pheight  ,cursor:'se-resize',RX:true ,RY:true },
		 s:{x:pleft+pwidth/2,y:ptop+pheight  ,cursor: 's-resize',RX:false,RY:true },
		sw:{x:pleft         ,y:ptop+pheight  ,cursor:'sw-resize',RX:false,RY:true },
		 w:{x:pleft         ,y:ptop+pheight/2,cursor: 'w-resize',RX:true ,RY:false},
/*		nw:{x:pleft              ,y:ptop          ,cursor:'nw-resize',RX:true,RY:true },
		 n:{x:pleft+pwidth/2,y:ptop          ,cursor: 'n-resize',RX:false,RY:true },
		ne:{x:pleft+pwidth  ,y:ptop          ,cursor:'ne-resize',RX:true ,RY:false}, */
		 e:{x:pleft+pwidth  ,y:ptop+pheight/2,cursor: 'e-resize',RX:true ,RY:false}
		}
		this.overResize = false;
		for (var khandle in phandles){
			var phandle=phandles[khandle];
			if(Event.pointerX(e).between($R(phandle.x-this.options.tolerance, phandle.x))&&Event.pointerY(e).between($R(phandle.y-this.options.tolerance, phandle.y))){
				this.element.setStyle({cursor:phandle.cursor});
				this.overResize=true;
				this.overResizeX=phandle.RX;
				this.overResizeY=phandle.RY;
			}
		}
/*
		if(Event.pointerX(e).between($R(pleft+pwidth-this.options.tolerance, pleft+pwidth))&&Event.pointerY(e).between($R(ptop+pheight-this.options.tolerance, ptop+pheight))){
			this.element.setStyle({cursor:'se-resize'});
			this.overResize=true;
			this.overResizeX=true;
			this.overResizeY=true;
		}else if(Event.pointerX(e).between($R(pleft+pwidth-this.options.tolerance, pleft+pwidth))&&Event.pointerY(e).between($R(ptop-this.options.tolerance, ptop))){
			this.element.setStyle({cursor:'ne-resize'});
			this.overResize=true;
*/
		if (!this.overResize)
			this.element.setStyle({cursor:''});
	},
	startDrag : function(e){
		if(this.overResize){
			Draggables.unregister(this.draggable);
			this.mouseCoords =[Event.pointerX(e),Event.pointerY(e)];
			Event.stop(e);
			this.dimensions=this.element.getDimensions();
			Draggables.deactivate();
			Event.observe(document,'mousemove',this.onMouseMove);
			Event.observe(document,'mouseup',this.onMouseUp);

		}else{
			Draggables.register(this.draggable);
		}

	},
	onResize : function(e){
		Draggables.deactivate();//Fixes IE bug
		var moved = [Event.pointerX(e)-this.mouseCoords[0],Event.pointerY(e)-this.mouseCoords[1]];
		if(this.overResizeX)
			$(this.element).style.width= [this.options.minWidth,[this.options.maxWidth,this.dimensions.width+moved[0]].min()].max() + 'px';
		if(this.overResizeY)
			$(this.element).style.height = [this.options.minHeight,[this.options.maxHeight,this.dimensions.height+moved[1]].min()].max() + 'px';

	},
	onResizeEnd : function(e){
		Event.stopObserving(document,'mouseup',this.onMouseUp);
		Event.stopObserving(document,'mousemove',this.onMouseMove);
	}
}


