var dragElement;
var resizeElement;

function DragGo(event) {
	var cur_x, cur_y, max_height;
	var new_x, new_y;
	event = event_DOMnify(event);
	if (!dragElement.inDrag) {
		return;
	}

	event.preventDefault();
	event.stopPropagation();

	// Get cursor position.
	cur_x = event.pageX;
	cur_y = event.pageY;

	new_x = cur_x + dragElement.xOffset;
	new_y = cur_y + dragElement.yOffset;


	var windowHeight;
	if(window.innerHeight) {
		windowHeight = window.innerHeight
	}
	else if (document.documentElement.clientHeight) {
		windowHeight = document.documentElement.clientHeight;
	}
	else {
		windowHeight = document.body.clientHeight;
	}

	var maxWidth = document.body.clientWidth;
	var maxHeight = document.body.clientHeight < windowHeight ? windowHeight : document.body.clientHeight;

	if ((new_x + dragElement.clientWidth) > (maxWidth - 5)) {
		new_x = maxWidth - dragElement.clientWidth - 5;
		dragElement.xOffset = dragElement.offsetLeft - event.pageX;
	}
	else if (new_x < 1) {
		new_x = 1;
		dragElement.xOffset = dragElement.offsetLeft - event.pageX;
	}

	if ((new_y + dragElement.clientHeight) > (maxHeight - 5)) {
		new_y = maxHeight - dragElement.clientHeight - 5;
		dragElement.yOffset = dragElement.offsetTop - event.pageY;
	}
	else if (new_y < 1) {
		new_y = 1;
		dragElement.yOffset = dragElement.offsetTop - event.pageY;
	}


	dragElement.style.left = new_x + "px";
	dragElement.style.top = new_y + "px";
}

function DragStop(event) {
	dragElement.inDrag = false;

	// Remove mousemove and mouseup event captures on document.
	remove_EventListener(document, "mousemove", DragGo);
	remove_EventListener(document, "mouseup", DragStop);
}

function startDrag(event, sender) {
	event = event_DOMnify(event);
	dragElement = sender;

	if (event.button === 0 || (browser.isIE && event.button === 1)) {
		dragElement.xOffset = dragElement.offsetLeft - event.pageX;
		dragElement.yOffset = dragElement.offsetTop - event.pageY;

		// Set document to capture mousemove and mouseup events.
		add_EventListener(document, "mousemove", DragGo);
		add_EventListener(document, "mouseup",   DragStop);

		dragElement.inDrag = true;
	}
	event.preventDefault();
	event.stopPropagation();
}

function resizeGoE(event) {
	var cur_x, max_width;
	var new_width;
	event = event_DOMnify(event);
	if (!resizeElement.inResize) {
		return;
	}

	resizeElement.maximized = false;

	event.preventDefault();
	event.stopPropagation();

	// Get cursor position.
	cur_x = event.pageX;

	new_width = Math.max((resizeElement.offsets.width + (cur_x - resizeElement.offsets.x)), 100);
	resizeElement.frame.style.width = new_width + "px";
	resizeElement.clientArea.style.width = new_width + "px";
	resizeElement.header.style.width = new_width + "px";
}

function resizeGoS(event) {
	var cur_y, max_height;
	var new_width;
	event = event_DOMnify(event);
	if (!resizeElement.inResize) {
		return;
	}

	resizeElement.maximized = false;

	event.preventDefault();
	event.stopPropagation();

	// Get cursor position.
	cur_y = event.pageY;

	new_height = Math.max((resizeElement.offsets.height + (cur_y - resizeElement.offsets.y)), 100);
	resizeElement.frame.style.height = new_height + "px";

	var clientHeight = new_height - resizeElement.header.offsetHeight;
	resizeElement.clientArea.style.height = clientHeight + "px";
	resizeElement.canvas.style.height = (clientHeight - 7) + "px";
}

function resizeGoW(event) {
	var cur_x, max_width;
	var new_width, new_left;

	event = event_DOMnify(event);
	if (!resizeElement.inResize) {
		return;
	}

	resizeElement.maximized = false;

	event.preventDefault();
	event.stopPropagation();

	// Get cursor position.
	cur_x = event.pageX;
	new_width = Math.max((resizeElement.offsets.width - (cur_x - resizeElement.offsets.x)), 100);
	new_left = resizeElement.offsets.left + (cur_x - resizeElement.offsets.x);
	resizeElement.frame.style.width = new_width + "px";
	resizeElement.frame.style.left = new_left + "px";
	resizeElement.clientArea.style.width = new_width + "px";
	resizeElement.clientArea.style.left = new_left + "px";
	resizeElement.header.style.width = new_width + "px";
	resizeElement.header.style.left = new_left + "px";
}

function resizeStop(event) {
	resizeElement.inResize = false;

	// Remove mousemove and mouseup event captures on document.
	remove_EventListener(document, "mousemove", resizeGoE);
	remove_EventListener(document, "mousemove", resizeGoS);
	remove_EventListener(document, "mousemove", resizeGoW);
	remove_EventListener(document, "mouseup", resizeStop);
}

function resizeBlock(event) {
	var new_height, new_width;

	var tmp = document.getElementsByTagName('html');
	new_height = tmp[0].scrollHeight;
	// Google Chrome fix
	new_height = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
	new_width = tmp[0].scrollWidth;

	if(document.getElementById('blocking_div'))document.getElementById('blocking_div').style.height = new_height + 'px';
	if(document.getElementById('blocking_div'))document.getElementById('blocking_div').style.width = new_width + 'px';
}

function popup_div(popup_id) {

	this.popup_id = popup_id;
	this.minimized = false;
	this.maximized = false;
	this.blocking = false;
	this.oldWidth;
	this.oldHeight;

	//popup div creation
	this.frame = document.createElement('DIV');
	this.frame.id = popup_id;
	this.frame.style.position = 'absolute';
	this.frame.style.visibility = 'hidden';
	this.frame.style.backgroundColor = 'white';
	this.frame.style.zIndex = '999999';
	this.frame.style.top = '100px';
	this.frame.style.left = '50px';
	this.frame.style.borderWidth = '1px';
	this.frame.style.borderStyle = 'solid';
	this.frame.style.borderLeftColor = '#888888';
	this.frame.style.borderTopColor = '#888888';
	this.frame.unselectable = "on";
	this.frame.popup = this;
	this.frame.onmousedown = function(event) {
		event = event_DOMnify(event);
		if (this.popup.resizable && !this.popup.minimized) {
			if (event.button === 0 || (browser.isIE && event.button === 1)) {
				var x = event.pageX;
				var y = event.pageY;
				var width = this.offsetWidth;
				var height = this.offsetHeight;
				var top = this.offsetTop;
				var left = this.offsetLeft;
				var offsets = {'x':x, 'y':y, 'width':width, 'height':height, 'top':top, 'left':left};

				if (event.pageX >= (this.offsetLeft + this.offsetWidth - 5)) {
					resizeElement = this.popup;
					resizeElement.inResize = true;
					resizeElement.offsets = offsets;

					if (event.pageY >= (this.offsetTop + this.clientHeight - 5)) {
						//south-east resize
						// Set document to capture mousemove events.
						add_EventListener(document, "mouseup", resizeStop);
						add_EventListener(document, "mousemove", resizeGoS);
						add_EventListener(document, "mousemove", resizeGoE);
					}
					else {
						//east resize
						// Set document to capture mousemove events.
						add_EventListener(document, "mouseup", resizeStop);
						add_EventListener(document, "mousemove", resizeGoE);
					}
					event.preventDefault();
					event.stopPropagation();
				}
				else if (event.pageX <= (this.offsetLeft + 5)) {
					resizeElement = this.popup;
					resizeElement.inResize = true;
					resizeElement.offsets = offsets;

					if (event.pageY > (this.offsetTop + this.clientHeight - 5)) {
						//south-west resize
						// Set document to capture mousemove events.
						add_EventListener(document, "mousemove", resizeGoS);
						add_EventListener(document, "mousemove", resizeGoW);
					}
					else {
						//west resize
						// Set document to capture mousemove events.
						add_EventListener(document, "mousemove", resizeGoW);
					}

					add_EventListener(document, "mouseup", resizeStop);
					event.preventDefault();
					event.stopPropagation();
				}
				else if (event.pageY >= (this.offsetTop + this.clientHeight - 5)) {
					resizeElement = this.popup;
					resizeElement.inResize = true;
					resizeElement.offsets = offsets;

					//south resize
					// Set document to capture mousemove events.
					add_EventListener(document, "mousemove", resizeGoS);
					add_EventListener(document, "mouseup", resizeStop);
					event.preventDefault();
					event.stopPropagation();
				}
			}
		}
	}

	this.frame.onmousemove = function(event) {
		event = event_DOMnify(event);

		if (this.popup.resizable && !this.popup.minimized) {
			if (event.pageX >= (this.offsetLeft + this.offsetWidth - 5)) {
				this.style.cursor = 'e-resize';
				if (event.pageY >= (this.offsetTop + this.clientHeight - 5)) {
					this.style.cursor = 'se-resize';
				}
			}
			else if (event.pageX <= (this.offsetLeft + 5)) {
				this.style.cursor = 'w-resize';
				if (event.pageY >= (this.offsetTop + this.clientHeight - 5)) {
					this.style.cursor = 'sw-resize';
				}
			}
			else if (event.pageY >= (this.offsetTop + this.clientHeight - 5)) {
				this.style.cursor = 's-resize';
			}
			else {
				this.style.cursor = 'default';
			}
		}
	}

	//popup div header
	this.header = document.createElement('DIV');
	this.header.popup = this;
	this.header.className = 'popupHeader';
	this.header.id = popup_id + 'Header';
	this.header.unselectable = "on";
	this.header.onmousedown = function (event) {
		if(!this.popup.maximized) {
			this.popup.startDrag(event);
		}
	}

	this.header.onmouseup = function (event) {
		this.popup.stopDrag(event);
	}

	//close button
	this.closebtn = document.createElement('DIV');
	this.closebtn.popup = this;
	this.closebtn.className = 'popupClose';
	typeof(this.closebtn.style.cssFloat) !== 'undefined' ? this.closebtn.style.cssFloat = 'right' : this.closebtn.style.styleFloat = 'right';
	this.closebtn.style.cursor = 'pointer';
	this.closebtn.title = 'Close';
	this.closebtn.onclick = function (event) {
		this.popup.close();
	}

	//restore button
	this.restorebtn = document.createElement('DIV');
	this.restorebtn.popup = this;
	this.restorebtn.className = 'popupMaximize';
	typeof(this.restorebtn.style.cssFloat) !== 'undefined' ? this.restorebtn.style.cssFloat = 'right' : this.restorebtn.style.styleFloat = 'right';
	this.restorebtn.style.cursor = 'pointer';
	this.restorebtn.title = 'Maximize';
	this.restorebtn.onclick = function (event) {
		this.popup.maximize();
	}

	//minimize button
	this.minimizebtn = document.createElement('DIV');
	this.minimizebtn.popup = this;
	this.minimizebtn.className = 'popupMinimize';
	typeof(this.minimizebtn.style.cssFloat) !== 'undefined' ? this.minimizebtn.style.cssFloat = 'right' : this.minimizebtn.style.styleFloat = 'right';
	this.minimizebtn.style.cursor = 'pointer';
	this.minimizebtn.title = 'Minimize';
	this.minimizebtn.onclick = function (event) {
		this.popup.minimize();
	}

	//popup div content
	this.clientArea = document.createElement('DIV');
	this.clientArea.className = 'popupClientArea';
	this.clientArea.id = popup_id + 'ClientArea';
	this.clientArea.unselectable = "on";

	this.canvas = document.createElement('DIV');
	this.canvas.className = 'popupContent';
	this.canvas.id = popup_id + 'Content';
	this.canvas.style.overflow = 'auto';
	//this.canvas.style.margin = '0px 5px 5px 5px';
	//this.canvas.style.border = '1px solid';
	//this.canvas.style.borderRightColor = '#888888';
	//this.canvas.style.borderBottomColor = '#888888';
	this.canvas.unselectable = "on";

	this.frame.appendChild(this.header);
	this.header.appendChild(this.closebtn);
	//this.header.appendChild(this.restorebtn);
	//this.header.appendChild(this.minimizebtn);
	this.clientArea.appendChild(this.canvas);
	this.frame.appendChild(this.clientArea);

	if (browser.isIE && browser.version < 7) {
		this.iframe = document.createElement('IFRAME');
		this.iframe.style.position = 'absolute';
		this.iframe.style.display = 'block';
		this.iframe.style.zIndex = -1;
		this.iframe.style.width = '100%';
		this.iframe.style.height = '100%';
		this.iframe.style.top = 0;
		this.iframe.style.left = 0;
		this.iframe.style.filter = 'mask()';
		this.iframe.style.backgroundColor = '#ffffff';

		this.clientArea.appendChild(this.iframe);
	}


	popup_div.prototype.populate = function(content) {
		this.canvas.innerHTML = content;
	}

	popup_div.prototype.minimize = function() {
		if(!this.minimized) {
			if(!this.maximized) {
				this.oldWidth = this.frame.style.width;
				this.oldHeight = this.frame.style.height;
			}
			this.frame.style.width = '100px';
			this.frame.style.height = this.header.offsetHeight + 'px';
			this.header.style.width = '100px';
			this.clientArea.style.display = "none";
			this.canvas.style.display = "none";
			if (browser.isIE && browser.version < 7) {
				this.iframe.style.width = '100px';
				this.iframe.style.height = this.header.offsetHeight + 'px';
			}


			this.minimized = true;
			this.maximized = false;
		}
		else {
			var windowHeight;
			if(window.innerHeight) {
				windowHeight = window.innerHeight
			}
			else if (document.documentElement.clientHeight) {
				windowHeight = document.documentElement.clientHeight;
			}
			else {
				windowHeight = document.body.clientHeight;
			}

			var maxRight = document.body.clientWidth;
			var maxBottom = document.body.clientHeight < windowHeight ? windowHeight : document.body.clientHeight;

			this.frame.style.width = this.oldWidth;
			this.frame.style.height = this.oldHeight;
			this.header.style.width = this.oldWidth;
			this.clientArea.style.width = this.oldWidth;
			this.clientArea.style.height = (parseInt(this.oldHeight) - this.header.offsetHeight) + 'px';
			this.canvas.style.height = (parseInt(this.oldHeight) - this.header.offsetHeight - 7) + 'px';

			if ((this.frame.offsetLeft + this.frame.clientWidth) > (maxRight - 5)) {
				new_x = maxRight - this.frame.clientWidth - 5;
				this.frame.style.left = new_x + 'px';
			}

			if ((this.frame.offsetTop + this.frame.clientHeight) > (maxBottom - 5)) {
				new_y = maxBottom - this.frame.clientHeight - 5;
				this.frame.style.top = new_y + 'px';
			}

			this.clientArea.style.display = "";
			this.canvas.style.display = "";

			if (browser.isIE && browser.version < 7) {
				this.iframe.style.width = this.frame.style.width;
				this.iframe.style.height = this.frame.style.height;
			}

			this.minimized = false;
		}
	}

	popup_div.prototype.maximize = function() {
		if(!this.maximized) {
			if(!this.minimized) {
				this.oldWidth = this.frame.style.width;
				this.oldHeight = this.frame.style.height;
			}

			var windowHeight;
			if(window.innerHeight) {
				windowHeight = window.innerHeight
			}
			else if (document.documentElement.clientHeight) {
				windowHeight = document.documentElement.clientHeight;
			}
			else {
				windowHeight = document.body.clientHeight;
			}

			var windowWidth;
			if(window.innerWidth) {
				windowWidth = window.innerWidth
			}
			else if (document.documentElement.clientHeight) {
				windowWidth = document.documentElement.clientWidth;
			}
			else {
				windowWidth = document.body.clientWidth;
			}

			this.frame.style.top = 0;
			this.frame.style.left = 0;
			this.frame.style.height = windowHeight - 3 + 'px';
			this.frame.style.width = windowWidth - 3 + 'px';
			this.header.style.width = windowWidth - 3 + 'px';
			this.clientArea.style.width = windowWidth - 3 + 'px';
			this.clientArea.style.height = ((windowHeight - 3) - this.header.offsetHeight) + 'px';
			this.canvas.style.height = ((windowHeight - 3) - this.header.offsetHeight - 7) + 'px';
			if (browser.isIE && browser.version < 7) {
				this.iframe.style.width = this.frame.style.width;
				this.iframe.style.height = this.frame.style.height;
			}

			this.minimized = false;
			this.maximized = true;
			this.clientArea.style.display = "";
			this.canvas.style.display = "";
		}
		else {
			this.frame.style.width = this.oldWidth;
			this.frame.style.height = this.oldHeight;
			this.header.style.width = this.oldWidth;
			this.clientArea.style.width = this.oldWidth;
			this.clientArea.style.height = (parseInt(this.oldHeight) - this.header.offsetHeight) + 'px';
			this.canvas.style.height = (parseInt(this.oldHeight) - this.header.offsetHeight - 7) + 'px';

			this.maximized = false;
			this.clientArea.style.display = "";
			this.canvas.style.display = "";
			if (browser.isIE && browser.version < 7) {
				this.iframe.style.width = this.frame.style.width;
				this.iframe.style.height = this.frame.style.height;
			}
		}
	}

	popup_div.prototype.restore = function() {
		if(this.minimized || this.maximized) {
			this.frame.style.width = this.oldWidth;
			this.frame.style.height = this.oldHeight;

			this.header.style.width = this.oldWidth;

			this.clientArea.style.display = "";
			this.canvas.style.display = "";
			if (browser.isIE && browser.version < 7) {
				this.iframe.style.width = this.frame.style.width;
				this.iframe.style.height = this.frame.style.height;
			}
			this.minimized = false;
			this.maximized = false;
		}
	}

	popup_div.prototype.close = function() {
		this.open = false;
		this.frame.style.visibility = "hidden";
		document.body.removeChild(this.frame);

		if(this.blocking === true && document.getElementById('blocking_div')) {
			remove_EventListener(window,'resize', resizeBlock);
			document.body.removeChild(document.getElementById('blocking_div'));

			if(typeof(browser) != 'undefined') {
				if(browser.isIE && browser.version < 7){
					var selects = document.getElementsByTagName('select');
					for(i = 0; i < selects.length; i++) {
						if(selects[i].hiddenByDiv == true) {
							selects[i].style.display = selects[i].previousDisplay;
						}
					}
				}
			}
		}
	}

	popup_div.prototype.show = function(width, height, blocking, resizable){
		this.open = true;
		this.restore();
		this.frame.style.width = width + 10 + 'px';
		this.frame.style.height = height + 'px';
		this.header.style.width = width + 10 + 'px';
		this.clientArea.style.width = width + 10 + 'px';
		this.resizable = isset(resizable) ? resizable : false;

		if(blocking === true && !document.getElementById('blocking_div')) {
			this.blocking = true;

			var div_height, div_width;
			if(typeof(window.innerHeight) == 'number') {
				div_height = window.innerHeight;
				div_width = parseInt(window.innerWidth - 17);
			}
			else {
				div_height = document.documentElement.clientHeight;
				div_width = parseInt(document.documentElement.clientWidth - 17);
			}
			var tmp = document.getElementsByTagName('html');
			div_height = Math.max(tmp[0].scrollHeight, div_height);
			div_width = Math.max(tmp[0].scrollWidth, div_width);

			var blocking_div = document.createElement('DIV');
			blocking_div.id = 'blocking_div';
			blocking_div.style.width = div_width + 'px';
			blocking_div.style.height = div_height + 'px';
			blocking_div.style.display='';
			blocking_div.style.zIndex = this.frame.style.zIndex - 1;
			blocking_div.style.position = 'absolute';
			blocking_div.style.top = '0px';
			blocking_div.style.left = '0px';
			blocking_div.style.backgroundColor = '#000000';
			blocking_div.style.filter = 'alpha(opacity=15)';
			blocking_div.style.opacity = '.15';

			document.body.appendChild(blocking_div);
			add_EventListener(window, 'resize', resizeBlock);

			if(typeof(browser) != 'undefined') {
				if(browser.isIE && browser.version < 7){
					var selects = document.getElementsByTagName('select');
					for(i = 0; i < selects.length; i++) {
						selects[i].hiddenByDiv = true;
						selects[i].previousDisplay = selects[i].style.display;
						selects[i].style.display = 'none';
					}
				}
			}
		}

		if(!document.getElementById(this.frame.id)) {
			document.body.appendChild(this.frame);
		}

		this.clientArea.style.height = (height - this.header.offsetHeight) + 'px';
		//this.canvas.style.height = (height - this.header.offsetHeight - 7) + 'px';
		this.frame.style.visibility = "visible";
	}

	popup_div.prototype.startDrag = function (event) {
		if(this.blocking === true){
			add_EventListener(document, "mousemove", resizeBlock);
		}

		startDrag(event, this.frame);
	}

	popup_div.prototype.stopDrag = function (event) {
		if(this.blocking === true){
			remove_EventListener(document, "mousemove", resizeBlock);
		}
	}

	popup_div.prototype.startResize = function (event) {
		startResize(event, this.frame);
	}

	popup_div.prototype.moveTo = function (left, top) {
		this.frame.style.top = top + 'px';
		this.frame.style.left = left + 'px';
	}

}


function popup_window(){
	var popup_win;

	this.location;
	this.title;
	this.width;
	this.height;
	this.addressbar = true;
	this.statusbar = true;
	this.menubar = true;
	this.directories = true;
	this.toolbar = true;
	this.resizable = true;
	this.scrollbars = true;

	popup_window.prototype.show = function() {
		var config;
		config = this.toolbar ? ' toolbar=1,' : ' toolbar=0,';
		config += this.addressbar ? ' location=1,' : ' location=0,';
		config += this.directories ? ' directories=1,' : ' directories=0,';
		config += this.statusbar ? ' status=1,' : ' status=0,';
		config += this.menubar ? ' menubar=1,' : ' menubar=0,';
		config += this.scrollbars ? ' scrollbars=1,' : ' scrollbars=0,';
		config += this.resizable ? ' resizable=1,' : ' resizable=0,';
		config += !empty(this.width) ? ' width=' + this.width + ',' : '';
		config += !empty(this.height) ? ' height=' + this.height : '';

		popup_win = window.open(this.location, this.title, config);
		if (window.focus) {popup_win.focus()}
		return false;
	}
}
