/********************************************************************
	client script library by webgenie
	Daniel, Jang (geniex@msn.com)
********************************************************************/

function $(id) {
	try {
		return document.getElementById(id);
	}
	catch (ex) {
		return null;
	}
}

function $$(name, index) {
	if (typeof index == "undefined") index = -1;

	try {
		var objElements = document.getElementsByName(name);
		if (objElements.length <= 0) {
			return null;
		}

		if (index >= objElements.length) {
			return null;
		}

		if (index >= 0) {
			return objElements[index];
		}
		else {
			return objElements;
		}
	}
	catch (ex) {
		return null;
	}
}

var addNamespace = Function.prototype.addNamespace = function(namespace) {
	var objRoot = window;
	var nsParts = namespace.split(".");

	for (var i=0;i<nsParts.length;i++) {
		if (!objRoot[nsParts[i]]) {
			objRoot[nsParts[i]] = new Object();
		}
		objRoot = objRoot[nsParts[i]];
	}
}

Object.prototype.inherit = function(source, replace) {
	if (typeof replace == "undefined") replace = false;

	for(prop in source) {
		if(replace == false && this[prop] != null) continue;
		this[prop] = source[prop];
	}
}

String.prototype.leftTrim = function() {
	return this.replace(/^\s*/,"");
}

String.prototype.rightTrim = function() {
	return this.replace(/\s*$/, "");
}

String.prototype.trim = function() {
	return this.leftTrim().rightTrim();
}

String.prototype.removeWhiteSpaces = function() {
	return this.replace(/\s*/, "");
}

String.prototype.isEmpty = function() {
	return (this.trim() == "");
}

String.prototype.startsWith = function(v) {
	if (typeof v != "string") {
		try {
			v = String(v);
		}
		catch (ex) {
			return false;
		}
	}
	
	var _len = v.length;
	if (this.length < _len) {
		return false;
	}

	return (this.substr(0, _len) == v);
}

String.prototype.endsWith = function(v) {
	if (typeof v != "string") {
		try {
			v = String(v);
		}
		catch (ex) {
			return false;
		}
	}

	var _len = v.length;
	if (this.length < _len) {
		return false;
	}

	var _startPos = this.length - _len;
	return (this.substr(_startPos) == v);
}

String.prototype.splitAny = function() {
	if (arguments.length == 0) {
		var objArray = new Array();
		objArray.push(this);
		return objArray;
	}

	var _temp = "";
	for (var i=0;i<arguments.length;i++) {
		if (typeof arguments[i] != "string") {
			try {
				arguments[i] = String(arguments[i]);
			}
			catch (ex) {
				throw "invalid argument.";
			}
		}
		_temp += arguments[i];
	}

	return this.split(eval("/[" + _temp + "]+/"));
}

String.prototype.padLeft = function(length, ch) {
	if (typeof ch == "undefined") {
		ch = "";
	}

	if (this.length >= length) {
		return this;
	}

	var _temp = this;

	for (var i=_temp.length;i<length;i++) {
		_temp = ch + _temp;
	}

	return _temp;
}

String.prototype.padRight = function(length, ch) {
	if (typeof ch == "undefined") {
		ch = "";
	}

	if (this.length >= length) {
		return this;
	}

	var _temp = this;

	for (var i=_temp.length;i<length;i++) {
		_temp += ch;
	}

	return _temp;
}

String.prototype.contains = function(v) {
	if (typeof v != "string") {
		return false;
	}
	
	return (this.indexOf(v) >= 0);
}

String.prototype.reverse = function() {
	var _temp = "";
	for (var i=this.length - 1;i>=0;i--) {
		_temp += this.charAt(i);
	}

	return _temp;
}

String.prototype.insertAt = function(index, ch) {
	if ((this.length >= index) ||
		(index < 0)) {
		throw "out of range index.";
	}
	
	if (index == 0) {
		return ch + this;
	}
	else {
		var _temp = this.substr(0, index) + ch + this.substr(index);
		return _temp;
	}
}

String.prototype.removeAt = function(index) {
	if ((this.length >= index) ||
		(index < 0)) {
		throw "out of range index.";
	}
	
	if (index == 0) {
		return this.substr(index + 1);
	}
	else {
		var _temp = this.substr(0, index) + ch + this.substr(index + 1);
		return _temp;
	}
}

var addEvent = Function.prototype.addEvent = function(obj, evt, func) {
	if (obj.attachEvent) {
		obj.attachEvent("on" + evt, func);
	}
	else if (obj.addEventListener) {
		obj.addEventListener(evt, func, true);
	}
}

var removeEvent = Function.prototype.removeEvent = function(obj, evt, func) {
	if (obj.detachEvent) {
		obj.detachEvent("on" + evt, func);
	}
	else if (obj.addEventListener) {
		obj.removeEventListener(evt, func, true);
	}
}

if (!window.XMLHttpRequest) {
	window.XMLHttpRequest = function() {
		var progID = ["MSXML2.XMLHttp", "Microsoft.XMLHttp"];

		for (var i=0;i<progID.length;i++) {
			try {
				return new ActiveXObject(progID[i]);
			}
			catch (ex) {}
		}

		return null;
	}
}

addNamespace("DOM");

DOM.getParent = function(src) {
	if (src.parentElement) {
		return src.parentElement;
	}
	else {
		return src.parentNode;
	}
}

DOM.browser = {
	ie : (window.ActiveXObject),
	firefox : (navigator.userAgent.indexOf("Firefox") >= 0),
	opera : (window.opera) ? true : false
}

DOM.getElementPosition = function(obj) {
    var result = new Object();
    result.x = 0;
    result.y = 0;
    result.width = 0;
    result.height = 0;

    if (obj.offsetParent) {
        result.x = obj.offsetLeft;
        result.y = obj.offsetTop;
        var parent = obj.offsetParent;
        while (parent) {
            result.x += parent.offsetLeft;
            result.y += parent.offsetTop;
            var parentTagName = parent.tagName.toLowerCase();
            if (parentTagName != "table" &&
                parentTagName != "body" && 
                parentTagName != "html" && 
                parentTagName != "div" && 
                parent.clientTop && 
                parent.clientLeft) {
                result.x += parent.clientLeft;
                result.y += parent.clientTop;
            }
            parent = parent.offsetParent;
        }
    }
    else if (obj.left && obj.top) {
        result.x = obj.left;
        result.y = obj.top;
    }
    else {
        if (obj.x) {
            result.x = obj.x;
        }
        if (obj.y) {
            result.y = obj.y;
        }
    }
    if (obj.offsetWidth && obj.offsetHeight) {
        result.width = obj.offsetWidth;
        result.height = obj.offsetHeight;
    }
    else if (obj.style && obj.style.pixelWidth && obj.style.pixelHeight) {
        result.width = obj.style.pixelWidth;
        result.height = obj.style.pixelHeight;
    }
    return result;
}

DOM.enableControls = function(controls) {
	if (controls.length) {
		for (var i=0;i<controls.length;i++) {
			if (controls[i].disabled) {
				controls[i].disabled = false;
			}
		}
	}
}

DOM.disableControls = function(controls) {
	if (controls.length) {
		for (var i=0;i<controls.length;i++) {
			if (typeof controls[i].disabled != "undefined") {
				controls[i].disabled = true;
			}
		}
	}
}

DOM.createElement = function(tag) {
	return document.createElement(tag);
}

addNamespace("Dho.UI");

Dho.UI.LoadingDialogPosition = {
	LeftTop : 1,
	CenterTop : 2,
	RightTop : 3,
	LeftMiddle : 11,
	CenterMiddle : 12,
	RightMiddle : 13,
	LeftBottom : 21,
	CenterBottom : 22,
	RightBottom : 23
}

Dho.UI.LoadingDialog = function(id) {
	var _targetControl = $(id);
	var _position = Dho.UI.LoadingDialogPosition.CenterMiddle;
	var _offsetX = 0;
	var _offsetY = 0;
	var _currentTop = document.body.scrollTop;
	var _timeoutTimer = 0;

	var _errorMessage = "Dho.UI.LoadingDialog Object Error:\n\n{0}";

	if (_targetControl == null) {
		alert(_errorMessage.replace("'{0}'", "Could not found object '" + id + "'"));
		return;
	}

	_targetControl.style.position = "absolute";
	_targetControl.style.zIndex = Math.pow(2, 31) - 1;
	_targetControl.style.visibility = "hidden";
	var _pos = null;

	this.show = function(timeout) {
		if (typeof timeout == "undefined") {
			timeout = 0;
		}

		if (timeout > 0) {
			_timeoutTimer = setTimeout(this.hide, timeout * 1000);
		}
		_pos = _getLoadingDlgPosition();
		_targetControl.style.top = _pos.y + "px";
		_targetControl.style.left = _pos.x + "px";
		_targetControl.style.width = _pos.width + "px";
		_targetControl.style.height = _pos.height + "px";

		_targetControl.style.visibility = "visible";
	}

	this.hide = function() {
		if (_timeoutTimer > 0) {
			clearTimeout(_timeoutTimer);
			_timeoutTimer = 0;
		}
		_targetControl.style.visibility = "hidden";
	}

	this.setOffsetX = function(x) {
		_offsetX = x;
	}

	this.getOffsetX = function() {
		return _offsetX;
	}

	this.setOffsetY = function(y) {
		_offsetY = y;
	}

	this.getOffsetY = function() {
		return _offsetY;
	}

	this.getPosition = function() {
		return _position;
	}

	this.setPosition = function(pos) {
		_position = pos;
	}

	var _getLoadingDlgPosition = function() {
		var objPos = new Object();
		objPos.x = 0;
		objPos.y = document.body.scrollTop;
		objPos.width = 0;
		objPos.height = 0;

		objPos.width = _targetControl.offsetWidth;
		objPos.height = _targetControl.offsetHeight;
		
		var docWidth = document.body.clientWidth;
		var docHeight = document.body.clientHeight;
		
		switch (_position % 10) {
			case 1:			//left
				objPos.x = 0 + _offsetX;
				break;
			case 2:			//center
				objPos.x = (docWidth - objPos.width) / 2;
				break;
			case 3:			//right
				objPos.x = (docWidth - objPos.width) - _offsetX;
				break;
		}

		switch (parseInt(_position / 10)) {
			case 0:			//top
				objPos.y += _offsetY;
				break;
			case 1:			//middle;
				objPos.y = (docHeight - objPos.height) / 2;
				break;
			case 2:			//bottom
				objPos.y += (docHeight - objPos.height) - _offsetY;
				break;
		}

		return objPos;
	}
}

Dho.UI.OverlayTextbox = function(id) {
	var _targetControl = $(id);
	var _overlayText = "";

	if (_targetControl == null) {
		alert("Could not found object '" + id + "'");
		return null;
	}

	this.bind = function() {
		_targetControl.blur();
		addEvent(_targetControl, "focus", _focusHandler);
		addEvent(_targetControl, "blur", _blurHandler);

		_targetControl.value = _overlayText;
	}

	var _focusHandler = function() {
		if (_targetControl.value.trim() == _overlayText) {
			_targetControl.value = "";
		}
	}

	var _blurHandler = function() {
		if (_targetControl.value.trim() == 0) {
			_targetControl.value = _overlayText;
		}
	}

	this.getTextBox = function() {
		return _targetControl;
	}

	this.getOverlayText = function() {
		return _overlayText;
	}

	this.setOverlayText = function(s) {
		_overlayText = s;
	}
}

if (window.XMLHttpRequest == null) {
	window.XMLHttpRequest = function() {
		var progID = ["MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
		
		for (var i=0;i<progID.length;i++) {
			try {
				return new ActiveXObject(progID);
			}
			catch (ex) {}
		}
	}
}

addNamespace("Dho.Net");

Dho.Net.RequestType = {
	XmlHttp : 1,
	Iframe : 2
}

Dho.Net.ResponseType = {
	"HTML" : 0x0001,
	"XML" : 0x0002,
	"Text" : 0x0004,
	"JSON" : 0x0008
}

Dho.Net.Request = function() {
	var _reqType = Dho.Net.RequestType.XmlHttp;
	var _onCompleteHandler = null;
	var _onErrorHandler = null;
	var _timeoutInterval = 0;
	var _timeoutTimer = 0;
	var _externalTimeoutHandler = null;
	var _externalCompleteHandler = null;
	var _externalErrorHandler = null;

	//start of private members
	var _createRequest = function() {
		if (window.ActiveXObject) {
			var progID = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
			for (var i=0;i<progID.length;i++) {
				try {
					return new ActiveXObject(progID[i]);
				}
				catch (ex) {}
			}

			_reqType = Dho.Net.RequestType.Iframe;
			return DOM.createElement("iframe");
		}
		else {
			try {
				return new XMLHttpRequest();
			}
			catch (ex) {
				_reqType = Dho.Net.RequestType.Iframe;
				return DOM.createElement("iframe");
			}
		}
	}

	var _setRequestHeader = function(key, value) {
		if (_reqType == Dho.Net.RequestType.XmlHttp) {
			if (typeof _objReq.setRequestHeader == "function") {
				_objReq.setRequestHeader(key, value);
			}
			else {
				_objReq.setRequestHeader(key, value);
			}
		}
	}

	var _encode = function(data) {
		if (typeof data == "undefined") return data;
		if (data.trim().length == 0) return data;

		var arrData = data.split("&");
		var arrResult = new Array();

		for (var i=0;i<arrData.length;i++) {
			var pos = arrData[i].indexOf("=");
			if (pos != -1) {
				var key = encodeURIComponent(arrData[i].substring(0, pos));
				var value = encodeURIComponent(arrData[i].substring(pos + 1));

				arrResult.push(key + "=" + value);
			}
		}

		return arrResult.join("&");
	}

	var _sendXmlHttpRequest = function(method, url, data, async) {
		method = method.toUpperCase();
		data = _encode(data);

		if (method == "GET" && data.length > 0) {
			url += "?" + data;
			data = "";
		}

		_objReq.open(method, url, async);

		if (method == "POST") {
			_setRequestHeader("Content-Type", "application/x-www-form-urlencoded; Charset=UTF-8");
			_setRequestHeader("Cache-Control", "no-cache");
		}
		
		if (async && _timeoutInterval > 0) {
			_timeoutTimer = window.setTimeout(_timeoutHandler, _timeoutInterval);
		}

		if (async) {
			if (DOM.browser.ie) {
				_objReq.onreadystatechange = _completeHandler;
			}
			else {
				_objReq.onload = _completeHandler;
			}
		}

		_objReq.send(data);

		if (!async) {
			_completeHandler();
		}
	}

	var _sendIframeRequest = function(method, url, data) {
	}

	var _timeoutHandler = function() {
		if (_objReq.readyState != 4) {
			_objReq.abort();
			
			if (typeof _externalTimeoutHandler == "function") {
				_externalTimeoutHandler();
			}
		}
	}

	var _completeHandler = function() {
		if (_objReq.readyState == 4) {
			_clearTimeout();

			if (_objReq.status == 200) {
				var szResult = _objReq.responseText;

				if (typeof _externalCompleteHandler == "function") {
					_externalCompleteHandler(szResult);
				}
			}
			else {
				_errorHandler();
			}
		}
	}

	var _errorHandler = function() {
		var httpErrorCode = _objReq.status;

		if (httpErrorCode != 0 && httpErrorCode != 200) {
			if (typeof _externalErrorHandler == "function") {
				_externalErrorHandler(httpErrorCode);
			}
		}
	}

	var _clearTimeout = function() {
		window.clearTimeout(_timeoutTimer);
		_timeoutTimer = 0;
	}

	//end of private members

	//start of public members

	this.setTimeoutHandler = function(func) {
		_externalTimeoutHandler = func;
	}

	this.setCompleteHandler = function(func) {
		_externalCompleteHandler = func;
	}

	this.setErrorHandler = function(func) {
		_externalErrorHandler = func;
	}

	this.setTimeout = function(time) {
		_timeoutInterval = (time > 0) ? (time * 1000) : 0;
	}

	this.send = function(method, url, data, async, oncomplete, onerror) {
		if (typeof oncomplete != "undefined") {
			this.setCompleteHandler(oncomplete);
		}

		if (typeof onerror != "undefined") {
			this.setErrorHandler(onerror);
		}

		switch (_reqType) {
			case Dho.Net.RequestType.XmlHttp:
				_sendXmlHttpRequest(method, url, data, async, oncomplete, onerror);
				break;
			case Dho.Net.RequestType.Iframe:
				_sendIframeRequest(method, url, data, oncomplete, onerror);
				break;
			default:
				throw "Unknown request type!";
				break;
		}
	}
	
	this.dispose = function() {
		if (_objReq)
			_objReq = null;
		_onCompleteHandler = null;
		_onErrorHandler = null;
		_externalTimeoutHandler = null;
		_externalCompleteHandler = null;
		_externalErrorHandler = null;
	}

	this.getResponseXml = function() {
		return _objReq.responseXml;
	}

	this.getResponseText = function() {
		return _objReq.responseText;
	}

	//end of public members

	var _objReq = _createRequest();

}
