/*********************************************************************
 *
 * Date: Jan. 8th 2006
 * Author: Chen
 * Purpose: Interface that using XMLHttpRequest object to realize 
 *			asynchronous requesting/responsing data.
 *
 *********************************************************************
*/

var lang1001 = 'Maximize';
var lang1002 = 'Restore';
var lang1003 = 'Close';
var lang1004 = 'Minimize';
var lang1005 = 'Recent updates';

/*
 * Get XMLHttpRequest object from IE/NS/Firefox browser
 *
*/
function GetHttpRequest()
{
	if ( window.XMLHttpRequest )		// Geoko
		return new XMLHttpRequest() ;
	else if ( window.ActiveXObject )	// IE
		return new ActiveXObject("MsXml2.XmlHttp") ;
	else // No support
		return null;
}

/*
 * Requests data from server side by given URL
 * @strPage: the given url
 * @wp, lp: appended parameters that either/both maybe empty.
 * @callbackFunc: The callback function should be invoked after we have successful received data 
*/
function getHtml(strPage, wp, lp, callbackFunc)
{
   var objXMLHttp = GetHttpRequest();
   if (!objXMLHttp) return;
   
   callbackInitGUI(0,4);
   callbackChangeGUI(2, 0, 4, lang1005);
   
   objXMLHttp.open("get", strPage, true); 
   objXMLHttp.onreadystatechange= function() {
	   if (objXMLHttp.readyState == 1) // The load is in progress¡ªreading persisted properties, but not yet parsing data. 
	   {
		   
	   }
	   else if (objXMLHttp.readyState == 2) // The object model is not yet available.
	   {
	   }
	   else if (objXMLHttp.readyState == 3) // Although the object model is available during this state, it is read-only.
	   {
	   }
	   else if (objXMLHttp.readyState == 4) // Indicates that all data has been received (readystate = = 4):
	   {
		  //window.location.reload(); 
		  try
		  {
			if (typeof(callbackFunc) == "function")
				callbackFunc(objXMLHttp, wp, lp);
			else
		  		callbackXMLHttp(objXMLHttp, wp, lp);
		  } catch(e) {};
		  
		  callbackChangeGUI(4, 0, 4, lang1010);
	   }
   };

   objXMLHttp.send(null);
}

function callbackInitGUI(minPos, maxPos)
{
	createProgressBar(lang1005, 300, 60, minPos, maxPos);
}

function callbackChangeGUI(curpos, minPos, maxPos, info)
{
	updateProgressBar(curpos, maxPos - minPos, info);
	if (curpos >= maxPos)
		destroyProgressWindow(window);
}

// Default callback function is invoked when XMLHttp request has returned
function callbackXMLHttp(objXMLHttp, wp, lp)
{
	//alert(objXMLHttp.responseText);
	var elements = null;
	if (isIE())
		elements = document.all;
	else
		elements = document.getElementsByTagName("*");
	
	var element = null;
	if (isIE())
	{
		element = elements[wp][lp];
		if (!element && parseInt(lp) == 0) // If there is only one collection for 'wp' element 
			element = elements[wp];
	}
	else
	{
		var subIndex = 0;
		for (var i = 0; i < elements.length; ++i)
		{
			if (wp == elements[i].id && 
							   subIndex++ == lp)
			{
				element = elements[i];
				break;
			}
		}
	}
	//alert(element);
	if (element)
		element.innerHTML = objXMLHttp.responseText;
}

/*********************************************************************
 *
 * Date: Jan. 8th 2006
 * Author: Chen
 * Purpose: Interface that global event to be captured so as to  
 *			further do related things.
 *
 *********************************************************************
*/
var g_event = null;
document.onmousemove = function(event)
{
	g_event = event || window.event || null;
	
	// Temporary... for NS/Firefox;
	if (!isIE())
		onSystemBarMouseMove(); // see blow related function
};

document.onmouseup = function(event)
{
	// Temporary... for NS/Firefox;
	if (!isIE())
		onSystemBarMouseUp(); // see blow related function	
}

document.onclick = function(event)
{
	if (isIE())
	{
		var oSrc = window.event.srcElement;
		if (oSrc && oSrc.tagName && oSrc.tagName.toUpperCase() == "A")
		{
			oSrc.blur();
		}
	}
	else
	{
		var oSrc = event.target;
		if (oSrc && oSrc.tagName && oSrc.tagName.toUpperCase() == "A")
		{
			oSrc.blur();
		}		
	}
};

document.onselectstart = function() { return true; };

function getEvent() {
	return g_event;
}

var g_onscroll = null;
var g_onresize = null;
window.onscroll = function() 
{ 
	if(g_onscroll)g_onscroll();
	doPopupWindowScroll(); // See below related function
	doProgressWindowScroll();
	onChangeMaskLayer();
};

window.onresize = function()
{
	if(g_onresize)g_onresize();
	onPopupWindowResize(); // See below related function
	doProgressWindowScroll();
	doChildWindowScroll();
	onChangeMaskLayer();
};

// event target reference (Gecko || IE)
function getEventSrc() {
  if (g_event == null)
    return null;

 return g_event.target || g_event.srcElement || null;
}

/*********************************************************************
 *
 * Date: Jan. 8th 2006
 * Author: Chen
 * Purpose: Interface for define some structures.
 *
 *********************************************************************
*/
function point(x,y)
{
	this.x = x;
	this.y = y;
}

function rect(left, top, right, bottom)
{
	this.left = left;
	this.top = top;
	this.right = right;
	this.bottom = bottom;
}

/*********************************************************************
 *
 * Date: Jan. 8th 2006
 * Author: Chen
 * Purpose: Interface for some valuable functionalities.
 *
 *********************************************************************
*/

// Get total days by current month and year
function getDays(month, year)
{
	month = parseInt(month);
	year = parseInt(year);
	var days = 0;
	switch(month)
	{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			days = 31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			days = 30;
			break;
		case 2:
		{
			var dt = new Date("February 29, " + year);
			if (dt.getFullYear() == year && dt.getMonth() == (month-1))
				days = 29;
			else
				days = 28;
		}
			break;
		default:
			break;
	}
	
	return days;
}

/*
 * Return offset left/top with scroll-bar
 *
*/
function getScrollLeft(oWnd)
{
	var oDoc;
	if (typeof(oWnd) != "object")
		oDoc = window.document;
	else
		oDoc = oWnd.document;
		
	return oDoc.body.scrollLeft | oDoc.documentElement.scrollLeft;
}

function getScrollTop(oWnd)
{
	var oDoc;
	if (typeof(oWnd) != "object")
		oDoc = window.document;
	else
		oDoc = oWnd.document;
		
	return oDoc.body.scrollTop | oDoc.documentElement.scrollTop;
}

/*
 * Returns valid width/height with the browser
 *
*/
function getBrowserWidth(oWnd)
{
	var oDoc;
	if (typeof(oWnd) != "object")
		oDoc = window.document;
	else
		oDoc = oWnd.document;
		
	var width = 0;
//	if (isIE())
//	{
		var oTool = createBrowserTool(oWnd);
		width = oTool.offsetLeft + oDoc.body.offsetLeft;
//	}
//	else
	//	width = window.innerWidth;
	
	return width;
}

function getBrowserHeight(oWnd)
{
	var oDoc;
	if (typeof(oWnd) != "object")
		oDoc = window.document;
	else
		oDoc = oWnd.document;
		
	var height = 0;
//	if (isIE())
//	{
		var oTool = createBrowserTool(oWnd);
		height = oTool.offsetTop + oDoc.body.offsetTop;
//	}
//	else
//		height = window.innerHeight;
	
	//alert(window.screenHeight);
	return height;
}

/*
 * Creates a browser tool for measure client width/height of IE browser(,
 * then the tool object to be returned.
*/
function createBrowserTool(oWnd)
{
	var oDoc;
	if (typeof(oWnd) != "object")
	{
		oDoc = window.document;
		oWnd = window;
	}
	else
		oDoc = oWnd.document;
		
	var oTool = oDoc.getElementById("browsertool");
	if (!oTool)
	{
		oTool = oDoc.createElement("div");
		oDoc.body.appendChild(oTool);
		oTool.id = "browsertool";
		oTool.style.width = "0px";
		oTool.style.height = "0px";
		oTool.style.position = "absolute";
		oTool.style.left = "100%";
		oTool.style.top = "100%";
		oWnd.scrollTo(getScrollLeft(oWnd), getScrollTop(oWnd));
		
		//oTool.style.top = oTool.offsetTop + getScrollTop() + "px";
		//oTool.style.left = oTool.offsetLeft + getScrollLeft() + "px";
		//alert(oTool.offsetTop);
	}
	
	return oTool;
}

/*
 * To validate current browser whether is(return true) or not(return false) IE.
 *
*/
function isIE() {
	return navigator.appName.indexOf("Internet Explorer")!=-1;
}

function isOpera() {
	return navigator.appName.indexOf("Opera")!=-1;
}

/*
 * Get current version of the browser
 *
*/
function getBrowserVersion()
{
	var ver = 0.0;
	if (isIE())
	{
		var pos = window.navigator.appVersion.indexOf("MSIE");
		if (pos != -1)
		{
			var posNext = window.navigator.appVersion.indexOf(";", pos + 4);
			if (posNext != -1)
			{
				ver = parseFloat(window.navigator.appVersion.substr(pos+4, posNext));
			}
		}
	}
	else
	{
		var pos = window.navigator.appVersion.indexOf("(");
		if (pos != -1)
		{
			ver = parseFloat(window.navigator.appVersion.substr(0, pos));
		}
	}
	
	return ver;
}

/*
 * Register specified event for related element that 
 * compatibly with IE/NS/Firefox.
 * @obj: related element
 * @eventName: specified event name, e.g, "onchange" or "onclick" or etc.
 * @dispatch: function name who process this event
*/
function registerEvent(obj, eventName, dispatch)
{
	if (isIE() == false)
	{
		if (eventName.substr(0,2) == "on")
			eventName = eventName.substr(2);
	}
		
	if (isIE())
	{
		obj.attachEvent(eventName, dispatch);
	}
	else
	{
		obj.addEventListener(eventName, dispatch, false);
	}
}

function enableEventBubble(isEnable)
{
	var oEvent = getEvent();
	if (oEvent)
	{
		oEvent.cancelBubble = !isEnable;
	}
}

/*
 * Return parameter value by given URL and key word
 *
*/
function getUrlParam(url, key, sep)
{
	var param = "";
	if (url.length == 0 || key.length == 0 || sep.length == 0)
		return param;
	
	var pos = url.indexOf("?");
	if (pos == -1)
		return param;
	
	var params = url.substr(pos+1).split(sep);
	if (params.length == 0)
		return param;

	for (var i = 0; i < params.length; ++i)
	{
		var data = params[i];
		if (data.substr(0, key.length+1).toUpperCase() == (key+"=").toUpperCase())
		{
			param = data.substr(key.length+1);
			break;
		}
	}
	
	return param;
}

// A semi transparent layer make it easy to 
// enable/disable whole document.
function enableHtmlDoc(wnd, isEnabled)
{
	if (!wnd) return;
	var oDoc = wnd.document;
	var oMaskLayer = oDoc.getElementById("masklayer");
	
	if (!oMaskLayer)
	{
		if (isIE())
			oMaskLayer = oDoc.createElement("iframe");
		else
			oMaskLayer = oDoc.createElement("div");
		oMaskLayer.id = "masklayer";
		oMaskLayer.style.position = "absolute";
		oMaskLayer.style.width = getBrowserWidth(wnd) + "px";
		oMaskLayer.style.height = getBrowserHeight(wnd) + "px";
		oMaskLayer.style.left = "0px";
		oMaskLayer.style.top = "0px";
		oMaskLayer.style.backgroundColor = "white";
		oMaskLayer.style.zIndex = "9";
		if (isIE())
			oMaskLayer.style.filter = 'alpha(opacity=35)';
		else if (isOpera())
			oMaskLayer.style.opacity = '0.35';
		else
			oMaskLayer.style.MozOpacity = '0.35';
		oDoc.body.appendChild(oMaskLayer);
	}
	
	if (isEnabled)
	{
		oMaskLayer.style.display = "none";
	}
	else
	{
		oMaskLayer.style.display = "block";
	}
}

// A semi transparent layer that its size will be changed 
// with the client size of browser
function onChangeMaskLayer(parentWnd)
{
	var oDoc;
	if (typeof(parentWnd) == "object")
		oDoc = parentWnd.document;
	else
		oDoc = window.document;
		
	var oMaskLayer = oDoc.getElementById("masklayer");
	if (oMaskLayer)
	{
		oMaskLayer.style.width = getBrowserWidth(parentWnd) + getScrollLeft(parentWnd) + "px";
		oMaskLayer.style.height = getBrowserHeight(parentWnd) + getScrollTop(parentWnd) + "px";
	}
}

/*********************************************************************
 *
 * Date: Mar. 3rd 2006
 * Author: Chen
 * Purpose: Interface for a progress bar
 *
 *********************************************************************
*/
function createProgressBar(caption, w, h, minRange, maxRange)
{
	destroyProgressWindow(window);
	
	// Create this window
	var oProgWnd = document.createElement("div");
	oProgWnd.id = "progresswnd";
	//oWnd.overflowX = "hidden";
	oProgWnd.style.position = "absolute";
	oProgWnd.style.width = w + "px";
	oProgWnd.style.height = h + "px";
	
	var oProgBar = document.createElement("div");
	oProgBar.id = "progressbar";
	oProgWnd.appendChild(oProgBar);
	
	var oProgInfo = document.createElement("div");
	oProgInfo.id = "progressinfo";
	oProgWnd.appendChild(oProgInfo);
	
	document.body.appendChild(oProgWnd);
	
	createToolBar(oProgWnd, caption);
	
	doProgressWindowScroll();
}

function updateProgressBar(curpos, range, info)
{
	var oProgBar = document.getElementById("progresswnd");
	if (!oProgBar)
		return;
		
	if (curpos < 0) curpos = 0;
		
	var oNodes = oProgBar.childNodes;
	for (var i = 0; i < oNodes.length; ++i)
	{
		if (oNodes[i].id == "progressbar")
		{
			oNodes[i].style.width = oProgBar.offsetWidth * curpos / range - oProgBar.offsetWidth / 20 + "px";
		}
		else if (oNodes[i].id == "progressinfo")
		{
			oNodes[i].innerHTML = info;
		}
	}
}

/*********************************************************************
 *
 * Date: Mar. 3rd 2006
 * Author: Chen
 * Purpose: Interface for a tool bar that special for 'progress-bar'
 *
 *********************************************************************
*/
function createToolBar(assocWnd, windowName)
{
	if (typeof(assocWnd) != "object")
		return;
	
	// Create a system-bar associated with this window
	var oSysBar = document.createElement("div");
	oSysBar.id = "tool_systembar";
	oSysBar.style.position = "absolute";
	oSysBar.style.width = assocWnd.offsetWidth + "px";
	var oIcon = document.createElement("a");
	oIcon.className = "captionicon";
	
	var oTitle = document.createElement("a");
	oTitle.className = "caption";
	if (windowName && windowName.length > 0)
	{
		oTitle.href = "javascript:void(0)";
		oTitle.title = windowName;
		oTitle.innerHTML = windowName;
	}
	var oCloseButton = document.createElement("a");
	oCloseButton.className = "closebutton";
	oCloseButton.href = "javascript:void(0)";
	oCloseButton.title = lang1003;
	
	oSysBar.appendChild(oIcon);
	oSysBar.appendChild(oTitle);
	oSysBar.appendChild(oCloseButton);
	document.body.appendChild(oSysBar);

	// Because the IE's bug(z-index cannot apply with 'input' or 'select' etc.)
	// so we must create a 'iframe' bar to mask this problem.
	if (isIE())
	{
		var oMaskBar = document.createElement("iframe");
		oMaskBar.id = "tool_maskbar";
		oMaskBar.style.position = "absolute";
		oMaskBar.style.width = assocWnd.offsetWidth + "px";
		oMaskBar.style.height = assocWnd.offsetHeight + oSysBar.offsetHeight + "px";
		document.body.appendChild(oMaskBar);
	}
	
	registerEventsForToolBar();
}

/*
 * Destroy pop-window created by user
 *
*/
function destroyProgressWindow(parent)
{
	if (!parent) return;
	/*
	if (isIE() && getBrowserVersion() >= 5.0)
	{
		window.close();
		return;
	}*/
	
	enableHtmlDoc(parent, true);
	
	var oDoc = parent.document;
	var oMaskBar = oDoc.getElementById("tool_maskbar"); // Only for IE
	if (oMaskBar)
		oMaskBar.parentNode.removeChild(oMaskBar);
		
	var oSysBar = oDoc.getElementById("tool_systembar");
	if (oSysBar)
		oSysBar.parentNode.removeChild(oSysBar);
	
	var oWnd = oDoc.getElementById("progresswnd");
	
	if (oWnd)
	{
		oWnd.parentNode.removeChild(oWnd);
	}
}

function registerEventsForToolBar()
{
	var oSysBar = document.getElementById("tool_systembar");
	if (!oSysBar) return;
	
//	registerEvent(oSysBar, "onmousedown", onSystemBarMouseDown);
//	registerEvent(oSysBar, "onmousemove", onSystemBarMouseMove);
//	registerEvent(oSysBar, "onmouseup", onSystemBarMouseUp);
	
	var kids = oSysBar.childNodes;
	for (var i = 0; i < kids.length; ++i)
	{
		if (kids[i].className == "closebutton")
		{
			registerEvent(kids[i], "onclick", on_tool_CloseButtonClick);
			registerEvent(kids[i], "onmousedown", on_tool_CloseButtonMouseDown);
		}
	}
}

function on_tool_CloseButtonClick()
{
	enableEventBubble(true);
	destroyProgressWindow(window);
}

function on_tool_CloseButtonMouseDown()
{
	enableEventBubble(false);
}

/*********************************************************************
 *
 * Date: Mar. 3rd 2006
 * Author: Chen
 * Purpose: Interface for a system bar
 *
 *********************************************************************
*/
function createSystemBar(parentWnd, assocWnd, windowName)
{
	if (typeof(parentWnd) != "object" || typeof(assocWnd) != "object")
		return;
		
	var oDoc = parentWnd.document;
		
	// Because the IE's bug(z-index cannot apply with 'input' or 'select' etc.)
	// so we must create a 'iframe' bar to mask this problem.
	if (isIE())
	{
		var oMaskBar = oDoc.createElement("iframe");
		oMaskBar.id = "maskbar";
		oMaskBar.style.position = "absolute";
		oMaskBar.style.width = assocWnd.offsetWidth + "px";
		oDoc.body.appendChild(oMaskBar);
	}
	
	// Create a system-bar associated with this window
	var oSysBar = oDoc.createElement("div");
	oSysBar.id = "systembar";
	oSysBar.style.position = "absolute";
	oSysBar.style.zIndex = 999;
	oSysBar.style.lineHeight = '25px';
	oSysBar.style.verticalAlign = 'middle';
	oSysBar.style.width = assocWnd.offsetWidth + "px";
	oSysBar.style.height = '25px';
	oSysBar.style.fontSize = '14px';
	if(isIE())
		oSysBar.style.filter = "progid:DXImageTransform.Microsoft.Gradient(GradientType=1, StartColorStr='#ff666666', EndColorStr='#ffffffff')";
	else
		oSysBar.style.MozAppearance = "statusbar";
	
	//var oIcon = oDoc.createElement("a");
	//oIcon.className = "captionicon";
	
	var oTitle = oDoc.createElement("a");
	oTitle.style.display = 'block';
	oTitle.style.position = 'absolute';
	if(isIE())oTitle.style.floatStyle = 'left';
	else oTitle.style.cssFloat = 'left';
	oTitle.href = "javascript:void(0)";
	oTitle.title = 'geekclaw.net - ' + windowName;
	oTitle.innerHTML = 'geekclaw.net - ' + windowName;
	oTitle.style.textDecoration = 'none';
	oTitle.style.color = '#fff';
	if(!isIE()) oTitle.style.color = '#000';
	//oTitle.style.backgroundColor = '#00f';
	//oTitle.style.width = '90%';
	oTitle.style.clear = 'none';
	oTitle.style.borderLeft = 'solid 1px #999';

	var oCloseButton = oDoc.createElement("a");
	oCloseButton.style.position = 'absolute';
	oCloseButton.className = 'closebutton';
	oCloseButton.style.display = 'block';
	oCloseButton.href = "javascript:void(0)";
	oCloseButton.title = 'Close';
	oCloseButton.innerHTML = 'X';
	oCloseButton.style.height = '25px';
	oCloseButton.style.textAlign = 'center';
	//oCloseButton.style.backgroundColor = '#0f0';
	if(isIE())oCloseButton.style.floatStyle = 'left';
	else oCloseButton.style.cssFloat = 'left';
	oCloseButton.style.marginLeft = '91%';
	oCloseButton.style.textDecoration = 'none';
	oCloseButton.style.fontWeight = 'bold';
	oCloseButton.style.width = '9%';
	oCloseButton.style.clear = 'none';
	oCloseButton.style.borderRight = 'solid 1px #999';
	/*
	var oMaxButton = oDoc.createElement("a");
	oMaxButton.className = "maxbutton";
	oMaxButton.id = "maxbutton";
	oMaxButton.href = "javascript:void(0)";
	oMaxButton.title = lang1001;
	var oResetButton = oDoc.createElement("a");
	oResetButton.className = "resetbutton";
	oResetButton.id = "resetbutton";
	oResetButton.href = "javascript:void(0)";
	oResetButton.title = lang1002;
	oResetButton.style.display = "none"; // Initial state is no display
	var oMinButton = oDoc.createElement("a");
	oMinButton.className = "minbutton";
	oMinButton.id = "minbutton";
	oMinButton.href = "javascript:void(0)";
	oMinButton.title = lang1004;*/
	
	//oSysBar.appendChild(oIcon);
	oSysBar.appendChild(oTitle);
	oSysBar.appendChild(oCloseButton);

	
	//oSysBar.appendChild(oMaxButton);
	//oSysBar.appendChild(oResetButton);
	//oSysBar.appendChild(oMinButton);
	oDoc.body.appendChild(oSysBar);
	
	registerEventsForSysBar(parentWnd);
}

function setPopWindowCaption(windowName)
{
	var oCurWnd = window;
	var oCurDoc = oCurWnd.document;
	var oPopWnd = oCurDoc.getElementById("popupwindow");
	if (!oPopWnd)
	{
		oCurWnd = window.parent;
		oCurDoc = oCurWnd.document;
		oPopWnd = oCurDoc.getElementById("popupwindow");
		if (!oPopWnd) return;
	}
	var oSysBar = oCurDoc.getElementById("systembar");
	if (!oSysBar) return;
	var oCaption = oSysBar.firstChild.nextSibling;
	if (!oCaption) return;
	oCaption.innerHTML = windowName;
	oCaption.title = windowName;
}

function doProgressWindowScroll()
{
	var oMaskBar = document.getElementById("tool_maskbar"); // Only for IE
	var oSysBar = document.getElementById("tool_systembar");
	var oWnd = document.getElementById("progresswnd");
	if (oWnd && oSysBar)
	{
		var dx = getBrowserWidth() / 2 - oWnd.offsetWidth / 2 - document.body.offsetLeft;
		var dy = getBrowserHeight() / 2 - (oSysBar.offsetHeight + oWnd.offsetHeight) / 2 - document.body.offsetTop;
		if (dx < 0) dx = 0;
		if (dy < 0) dy = 0;
		dx += getScrollLeft();
		dy += getScrollTop();
		
		oSysBar.style.left = dx + "px";
		oSysBar.style.top = dy + "px";
		oWnd.style.left = dx + "px";
		oWnd.style.top = dy + oSysBar.offsetHeight + "px";
		
		if (oMaskBar)
		{
			oMaskBar.style.left = dx + "px";
			oMaskBar.style.top = dy + "px";
			oMaskBar.style.width = oSysBar.offsetWidth + "px";
		}
	}
}

/*********************************************************************
 *
 * Date: Feb. 8th 2006
 * Author: Chen
 * Purpose: Interface for a window that it consists of some elements combination.
 *			and realize many functionalities associated with window.
 *
 *********************************************************************
*/
/*
 * Using 'iframe' element to simulate a popup-window,
 * to perform this function in a real window.
 * @windowName: The name of the window
 * @url: Hyper-link address for the window
 * @w: The width of the window
 * @h: The height of the window
 * @parent: The parent of pop-window
*/
function createPopWindow(windowName, url, w, h, parent)
{
	/*
	if (isIE() && getBrowserVersion() >= 5.0)
	{		
		window.showModalDialog(url, parent, "status=off;edge=sunken;center=yes;dialogWidth=" + (10+w) + "px;dialogHeight=" + h + "px;");
		return;
	}*/
	
	var oDoc = parent.document;
	
	// Create this window
	var oWnd = oDoc.createElement("iframe");
	oWnd.id = "popupwindow";
	oWnd.frameBorder = "0";
	oWnd.style.zIndex = 999;
	oWnd.scrolling = 'no';
	//oWnd.overflowX = "hidden";
	oWnd.style.position = "absolute";
	oWnd.style.width = w + "px";
	oWnd.style.height = h + "px";
	oWnd.src = url; // Navigate this window
	oDoc.body.appendChild(oWnd);
	
	createSystemBar(parent, oWnd, windowName);
	
	doPopupWindowScroll(parent); // Appropriate position for this window and system-bar
	
	enableHtmlDoc(parent, false); // Makes a mask layer that this window looks like a modal dialog
	onChangeMaskLayer(parent); // Apply real width/height with the mask layer.
	
	if (isIE()) // IE's bug, if we don't reload this page, that current session may lost.
		oWnd.contentWindow.location.reload();

	if(isIE()){
		oWnd.onreadystatechange = function(){
			if('complete' == oWnd.readyState){
				var canvas = oWnd.contentWindow.document.getElementById('canvas');
				if(canvas){
					canvas.style.width = w-15 + 'px'; // scroll bar -
					canvas.style.height = h-20 + 'px';
				}
			}
		}
	}
	else{
		oWnd.onload = function(){
			var canvas = oWnd.contentWindow.document.getElementById('canvas');
			if(canvas){
				canvas.style.width = w-15 + 'px'; // scroll bar -
				canvas.style.height = h-20 + 'px';
			}
		}
	}

}

/*
 * Destroy pop-window created by user
 *
*/
function destroyPopWindow(parent)
{
	if (!parent) return;
	/*
	if (isIE() && getBrowserVersion() >= 5.0)
	{
		window.close();
		return;
	}*/
	
	enableHtmlDoc(parent, true);
	
	var oDoc = parent.document;
	var oMaskBar = oDoc.getElementById("maskbar"); // Only for IE
	if (oMaskBar)
		oMaskBar.parentNode.removeChild(oMaskBar);
		
	var oSysBar = oDoc.getElementById("systembar");
	if (oSysBar)
		oSysBar.parentNode.removeChild(oSysBar);
	
	var oWnd = oDoc.getElementById("popupwindow");
	
	if (oWnd)
	{
		oWnd.parentNode.removeChild(oWnd);
	}
}

function registerEventsForSysBar(oWnd)
{
	var oDoc;
	if (typeof(oWnd) != "object")
	{
		oWnd = window;
		oDoc = window.document;
	}
	else
		oDoc = oWnd.document;
		
	var oSysBar = oDoc.getElementById("systembar");
	if (!oSysBar) return;
	
	registerEvent(oSysBar, "onmousedown", oWnd.onSystemBarMouseDown);
	registerEvent(oSysBar, "onmousemove", oWnd.onSystemBarMouseMove);
	registerEvent(oSysBar, "onmouseup", oWnd.onSystemBarMouseUp);
	
	var kids = oSysBar.childNodes;
	for (var i = 0; i < kids.length; ++i)
	{
		if (kids[i].className == "caption")
		{
			registerEvent(kids[i], "onclick", oWnd.onTitleButtonClick);
			registerEvent(kids[i], "onmousedown", oWnd.onTitleButtonMouseDown);
		}
		else if (kids[i].className == "closebutton")
		{
			registerEvent(kids[i], "onclick", oWnd.onCloseButtonClick);
			registerEvent(kids[i], "onmousedown", oWnd.onCloseButtonMouseDown);
		}
		else if (kids[i].className == "maxbutton")
		{
			registerEvent(kids[i], "onclick", oWnd.onMaxButtonClick);
			registerEvent(kids[i], "onmousedown", oWnd.onMaxButtonMouseDown);
		}
		else if (kids[i].className == "resetbutton")
		{
			registerEvent(kids[i], "onclick", oWnd.onResetButtonClick);
			registerEvent(kids[i], "onmousedown", oWnd.onResetButtonMouseDown);
		}
		else if (kids[i].className == "minbutton")
		{
			registerEvent(kids[i], "onclick", oWnd.onMinButtonClick);
			registerEvent(kids[i], "onmousedown", oWnd.onMinButtonMouseDown);
		}
	}
}

function doPopupWindowScroll(parentWnd)
{
	var oDoc;
	if (parentWnd == null || typeof(parentWnd) != "object")
		oDoc = window.document;
	else
		oDoc = parentWnd.document;
	
	var oMaskBar = oDoc.getElementById("maskbar"); // Only for IE
	var oSysBar = oDoc.getElementById("systembar");
	var oWnd = oDoc.getElementById("popupwindow");
	if (oWnd && oSysBar)
	{
		var dx = getBrowserWidth(parentWnd) / 2 - oWnd.offsetWidth / 2 - oDoc.body.offsetLeft;
		var dy = getBrowserHeight(parentWnd) / 2 - (oSysBar.offsetHeight + oWnd.offsetHeight) / 2 - oDoc.body.offsetTop;
		if (dx < 0) dx = 0;
		if (dy < 0) dy = 0;
		dx += getScrollLeft(parentWnd);
		dy += getScrollTop(parentWnd);
		
		oSysBar.style.left = dx + "px";
		oSysBar.style.top = dy + "px";
		oWnd.style.left = dx + "px";
		oWnd.style.top = dy + oSysBar.offsetHeight + "px";
		/*
		if (oWnd.offsetWidth > getBrowserWidth())
		{
			oSysBar.style.width = oWnd.style.width = getBrowserWidth() + "px";
		}
		if (oWnd.offsetHeight > getBrowserHeight())
		{
			oWnd.style.height = getBrowserHeight() + "px";
		}*/
		
		if (oMaskBar)
		{
			oMaskBar.style.left = dx + "px";
			oMaskBar.style.top = dy + "px";
			oMaskBar.style.width = oSysBar.offsetWidth + "px";
		}
	}
}

function onPopupWindowResize()
{
	doPopupWindowScroll();
}

/*
 * When the user was pressed the 'systembar' it will fire up!
 *
*/
var g_toggle = false;
var g_eventStartPos = new point(0,0);
var g_sysbarStartPos = new point(0,0);

function onSystemBarMouseDown()
{
	if (g_toggle == false)
	{
		var oSysBar = document.getElementById("systembar");
		if (oSysBar && isIE())
			oSysBar.setCapture();
			
		var oEvent = getEvent();
		g_eventStartPos.x = parseInt(oEvent.clientX);
		g_eventStartPos.y = parseInt(oEvent.clientY);
		g_sysbarStartPos.x = parseInt(oSysBar.style.left);
		g_sysbarStartPos.y = parseInt(oSysBar.style.top);
		
		g_toggle = true;
	}
}

function onSystemBarMouseMove()
{
	if (g_toggle == true)
	{
		var oMaskBar = document.getElementById("maskbar"); // Only for IE
		var oSysBar = document.getElementById("systembar");
		var oWnd = document.getElementById("popupwindow");
		
		if (oWnd && oSysBar)
		{
			var oEvent = getEvent();
			var left = g_sysbarStartPos.x + (oEvent.clientX - g_eventStartPos.x);
			var top = g_sysbarStartPos.y + (oEvent.clientY - g_eventStartPos.y);
			
			var minLeft, minTop, maxRight, maxBottom;
			minLeft = getScrollLeft() - document.body.offsetLeft;
			minTop = getScrollTop() - document.body.offsetTop;
			maxRight = getBrowserWidth() - document.body.offsetLeft + getScrollLeft() - 20;
			maxBottom = getBrowserHeight() - document.body.offsetTop + getScrollTop() - 20;
			if (left < minLeft) left = minLeft;
			if (top < minTop) top = minTop;
			if (left > maxRight) left = maxRight;
			if (top > maxBottom) top = maxBottom;
			
			oSysBar.style.left = left + "px"
			oSysBar.style.top = top + "px";
			oWnd.style.left = left + "px";
			oWnd.style.top = oSysBar.offsetHeight + top + "px";
			
			if (oMaskBar)
			{
				oMaskBar.style.left = left + "px";
				oMaskBar.style.top = top + "px";
			}
			
			//window.status = getBrowserWidth() + ", " + getBrowserHeight();
		}
	}
}

function onSystemBarMouseUp()
{
	if (g_toggle == true)
	{
		var oSysBar = document.getElementById("systembar");
		if (oSysBar && isIE())
			oSysBar.releaseCapture();
		g_toggle = false;
	}
}

function onTitleButtonClick()
{
	enableEventBubble(true);
	
	var oWnd = document.getElementById("popupwindow");
	if (oWnd)
	{
		oWnd.contentWindow.location.reload();
	}
}

function onTitleButtonMouseDown()
{
	enableEventBubble(false);
}

function onCloseButtonClick()
{
	enableEventBubble(true);
	destroyPopWindow(window);
}

function onCloseButtonMouseDown()
{
	enableEventBubble(false);
}

var g_wndOriginRect = new rect(0,0,0,0);
function onMaxButtonClick()
{	
	enableEventBubble(true);
	return; // At present, nothing is to do
	
	var oMaskBar = document.getElementById("maskbar"); // Only for IE
	var oSysBar = document.getElementById("systembar");
	var oWnd = document.getElementById("popupwindow");
	if (oSysBar && oWnd)
	{	
		// Saving original coordinates of current pop-window
		 g_wndOriginRect.left = parseInt(oSysBar.style.left);
		 g_wndOriginRect.top = parseInt(oSysBar.style.top);
		 g_wndOriginRect.right = g_wndOriginRect.left + oWnd.clientWidth;
		 g_wndOriginRect.bottom = g_wndOriginRect.top + oSysBar.offsetHeight + oWnd.clientHeight;
	
		// Maximize current pop-window
		oSysBar.style.left = getScrollLeft() + "px";
		oSysBar.style.top = getScrollTop() + "px";
		oSysBar.style.width = getBrowserWidth() + "px";
		oWnd.style.left = getScrollLeft() + "px";
		oWnd.style.top = getScrollTop() + oSysBar.offsetHeight + "px";
		oWnd.style.width = getBrowserWidth() + "px";
		oWnd.style.height = getBrowserHeight() - oSysBar.offsetHeight + "px";
		
		if (oMaskBar)
		{
			oMaskBar.style.left = oSysBar.style.left;
			oMaskBar.style.top = oSysBar.style.top;
			oMaskBar.style.width = oSysBar.style.width;
		}
	}	
	
	// Now, we have change state for maximum button and reset button
	var oMaxBtn = document.getElementById("maxbutton");
	var oResetBtn = document.getElementById("resetbutton");
	if (oMaxBtn && oResetBtn)
	{
		oResetBtn.style.display = "block";
		oMaxBtn.style.display = "none";
	}
}

function onMaxButtonMouseDown()
{
	enableEventBubble(false);
}

function onResetButtonClick()
{
	enableEventBubble(true);
}

function onResetButtonMouseDown()
{
	enableEventBubble(false);
}

function onMinButtonClick()
{
	enableEventBubble(true);
}

function onMinButtonMouseDown()
{
	enableEventBubble(false);
}

/*
 * Create a child window that make it to be embeded current browser window,
 * and the child window's width/height is corresponding to its parent element.
 * @windowName: The name of the window
 * @url: Hyper-link address for the window
 * @parentElement: the parent element of the child window, and it cannot be null.
*/
var g_parentOfChildWindow = null;
function createChildWindow(windowName, url, parentElement)
{
	if (!parentElement) return;
	g_parentOfChildWindow = parentElement;
	
	destroyChildWindow(window);

	// Get width/height of parent element
	var w = parentElement.offsetWidth;
	var h = parentElement.offsetHeight;

	// Calculate absolute position of parent element
	var dx = 0;
	var dy = 0;
	// Calculate offset distance of left/top
	var oParent = parentElement;
	while (oParent)
	{
		dx += oParent.offsetLeft;
		dy += oParent.offsetTop;
		
		oParent = oParent.offsetParent;
	}
	
	// Create this window
	var oWnd = document.createElement("iframe");
	oWnd.id = "childwindow";
	oWnd.frameBorder = "0";
	//oWnd.overflowX = "hidden";
	oWnd.style.position = "absolute";
	oWnd.style.width = w - 5 + "px";
	oWnd.style.height = h - 30 + "px";
	document.body.appendChild(oWnd);
	
	// Because the IE's bug(z-index cannot apply with 'input' or 'select' etc.)
	// so we must create a 'iframe' bar to mask this problem.
	if (isIE())
	{/*
		var oMaskBar = document.createElement("iframe");
		oMaskBar.id = "child_maskbar";
		oMaskBar.style.position = "absolute";
		oMaskBar.style.width = oWnd.offsetWidth + "px";
		document.body.appendChild(oMaskBar);*/
	}
	
	// Create a system-bar associated with this window
	var oSysBar = document.createElement("div");
	oSysBar.id = "child_systembar";
	oSysBar.style.position = "absolute";
	oSysBar.style.width = oWnd.offsetWidth + "px";
	var oIcon = document.createElement("a");
	oIcon.className = "captionicon";
	
	var oTitle = document.createElement("a");
	oTitle.className = "caption";
	oTitle.href = "javascript:void(0)";
	oTitle.title = windowName;
	oTitle.innerHTML = windowName;
	var oCloseButton = document.createElement("a");
	oCloseButton.className = "closebutton";
	oCloseButton.href = "javascript:void(0)";
	oCloseButton.title = lang1003;
	
	oSysBar.appendChild(oIcon);
	oSysBar.appendChild(oTitle);
	oSysBar.appendChild(oCloseButton);
	document.body.appendChild(oSysBar);
	
	registerEventsForChildSysBar();
	/*
	doPopupWindowScroll(); // Appropriate position for this window and system-bar
	onChangeMaskLayer();
	*/
	
	// Set up docking position with 'systembar' and this window
	oSysBar.style.left = dx + "px";
	oSysBar.style.top = dy + "px";
	oWnd.style.left = dx + "px";
	oWnd.style.top = dy + oSysBar.offsetHeight + "px";

	oWnd.src = url; // Navigate this window
}

function doChildWindowScroll()
{
	var oMaskBar = document.getElementById("child_maskbar"); // Only for IE
	var oSysBar = document.getElementById("child_systembar");
	var oWnd = document.getElementById("childwindow");
	if (oWnd && oSysBar && g_parentOfChildWindow)
	{
		var dx = 0;
		var dy = 0;
		var oParent = g_parentOfChildWindow;
		while (oParent)
		{
			dx += oParent.offsetLeft;
			dy += oParent.offsetTop;
			
			oParent = oParent.offsetParent;
		}
		
		if (isNaN(dx) || isNaN(dy))
			return;
			
		if (dx < 0) dx = 0;
		if (dy < 0) dy = 0;
		
		//dx += getScrollLeft();
		//dy += getScrollTop();
		
		oSysBar.style.left = dx + "px";
		oSysBar.style.top = dy + "px";
		oWnd.style.left = dx + "px";
		oWnd.style.top = dy + oSysBar.offsetHeight + "px";
		
		if (oMaskBar)
		{
			oMaskBar.style.left = dx + "px";
			oMaskBar.style.top = dy + "px";
			oMaskBar.style.width = oSysBar.offsetWidth + "px";
		}
	}
}

/*
 * Destroy child window created by user
 *
*/
function destroyChildWindow(parent)
{
	if (!parent) return;
	/*
	if (isIE() && getBrowserVersion() >= 5.0)
	{
		window.close();
		return;
	}*/
	
	var oDoc = parent.document;
	var oMaskBar = oDoc.getElementById("child_maskbar"); // Only for IE
	if (oMaskBar)
		oMaskBar.parentNode.removeChild(oMaskBar);
		
	var oSysBar = oDoc.getElementById("child_systembar");
	if (oSysBar)
		oSysBar.parentNode.removeChild(oSysBar);
		
	var oWnd = oDoc.getElementById("childwindow");
	if (oWnd)
		oWnd.parentNode.removeChild(oWnd);
}

function registerEventsForChildSysBar()
{
	var oSysBar = document.getElementById("child_systembar");
	if (!oSysBar) return;
	
	var kids = oSysBar.childNodes;
	for (var i = 0; i < kids.length; ++i)
	{
		if (kids[i].className == "caption")
		{
			registerEvent(kids[i], "onclick", on_child_TitleButtonClick);
			registerEvent(kids[i], "onmousedown", on_child_TitleButtonMouseDown);
		}
		else if (kids[i].className == "closebutton")
		{
			registerEvent(kids[i], "onclick", on_child_CloseButtonClick);
			registerEvent(kids[i], "onmousedown", on_child_CloseButtonMouseDown);
		}
	}
}

function on_child_TitleButtonClick()
{
	enableEventBubble(true);
	
	var oWnd = document.getElementById("childwindow");
	if (oWnd)
	{
		oWnd.contentWindow.location.reload();
	}
}

function on_child_TitleButtonMouseDown()
{
	enableEventBubble(false);
}

function on_child_CloseButtonClick()
{
	enableEventBubble(true);
	destroyChildWindow(window);
}

function on_child_CloseButtonMouseDown()
{
	enableEventBubble(false);
}

// global functions
function $(id){
	return document.getElementById(id);
}