var Popup = Class.create();
Popup.prototype = {
	initialize: function(html, width, height){
		this._html = html;
		this._width = width;
		this._height = height;
		this._mask = null;
		this._popup = null;

		this._needdrag = true;
		this._startX = 0;
		this._startY=0;
		this._startTop = 0;
		this._startLeft = 0;
		this._mousedown = false;
	},
	destory:function(){
		if(this._popup)
			document.body.removeChild(this._popup);
		if(this._mask)
			document.body.removeChild(this._mask);
		Events.removeListener(window, "resize", Delegate.create(this, this._adjust));
		if( this._needdrag )  this._cleardrag();
	},
	show: function(module, needdrag){
		if (this._popup)
			Element.show(this._popup);
		else{
			this._popup = document.createElement("div");
			this._popup.id = "pop_div_"+(new Date().getTime());
			this._popup.innerHTML = this._html;
			Insertion.bottom(document.body, this._popup);
			Element.setStyle(this._popup, {
				position: "absolute",
				zIndex: 1001
			});
		}
		//default use mask
		if (isUndef(module) || module){
			if (this._mask)
				Element.show(this._mask);
			else{
				this._mask = document.createElement("div");
				Insertion.bottom(document.body, this._mask);
				Element.setStyle(this._mask, {
					backgroundColor: "Black",
					filter: "alpha(opacity=40)",
					MozOpacity: "0.4",
					position: "absolute",
					left: "0px",
					top: "0px",
					zIndex: 1000
				});
			}
		}
		
		//default use drag effect
		if( !isUndef(needdrag) ) this._needdrag=needdrag;
		if( this._needdrag ) this._setdrag();
		
		this._adjust();
		Events.addListener(window, "resize", Delegate.create(this, this._adjust));
		Events.addListener(window, "scroll", Delegate.create(this, this._adjust));
	},
	hide: function(){
		if (this._popup)
			Element.hide(this._popup);
		if (this._mask)
			Element.hide(this._mask);
		
		if( this._needdrag ) this._cleardrag();
	},
	_adjust: function(){
		if (this._mask != null){		
			Element.setStyle(this._mask, {
				width:  Math.max(document.body.scrollWidth, document.documentElement.clientWidth)+"px",
				height: Math.max(document.body.scrollHeight, document.documentElement.clientHeight)+"px"
				//pixelWidth: Math.max(document.body.scrollWidth, document.documentElement.clientWidth),
				//pixelHeight: Math.max(document.body.scrollHeight, document.documentElement.clientHeight)
			});
		}
		
		Element.setStyle(this._popup,{
			left: (document.documentElement.clientWidth/2 + document.documentElement.scrollLeft - this._width)+"px",
			top: (document.documentElement.clientHeight/2 + document.documentElement.scrollTop - this._height)+"px"
		});
	},
	_setdrag: function () {
		Events.addListener(document.body, "mousedown", Delegate.create(this, this._onmousedown));
		Events.addListener(document.body, "mousemove", Delegate.create(this, this._onmousemove));
		Events.addListener(document.body, "mouseup", Delegate.create(this, this._onmouseup));
	},
	_cleardrag : function () {
		Events.removeListener(document.body, "mousedown", Delegate.create(this, this._onmousedown));
		Events.removeListener(document.body, "mousemove", Delegate.create(this, this._onmousemove));
		Events.removeListener(document.body, "mouseup", Delegate.create(this, this._onmouseup));
	},
	_checkmouse : function (event) {
		var element=Events.element(event);
		while(element && element.id!=this._popup.id && element.tagName!="BODY")element=element.parentNode;
		if( !element || element.tagName=="BODY" || element.id!=this._popup.id) return null;
		
		//now element=this._popup

		var distance=event.clientY-parseInt(Element.getStyle(element, "top"));
		//alert(distance);
		var range=40;//parseInt(parseInt(Element.getStyle(element, "height"))*20/100 )
		if(	distance > range )
			return null;
		else
			return element;
	},
	_onmousedown : function (event) {
		var element=this._checkmouse(event);
		if( !element ) return;

		this._mousedown = true; 
		this._startX = event.clientX; 
		this._startY = event.clientY; 
		this._startLeft = Element.getStyle(element, "left");
		this._startTop = Element.getStyle(element, "top");
	},
	_onmousemove : function (event) {
		var element=this._checkmouse(event);
		if( !element ){
			Element.setStyle(this._popup, { cursor: ""} );
		}
		else{
			if( Browser.isMSIE )
				Element.setStyle(this._popup, { cursor: "move"} );
			else
				Element.setStyle(this._popup, { cursor: "pointer"} );
		}

		if (this._mousedown){ 
			var cur_left=(parseInt(this._startLeft)+event.clientX-this._startX);
			var cur_top=(parseInt(this._startTop)+event.clientY-this._startY);
			Element.setStyle(this._popup,{
				left: cur_left+"px",
				top:  cur_top+"px"
			});
		}
	},
	_onmouseup : function () {
		this._mousedown = false; 
	}
	
};