/**
 * base on TT's Juice frameworks
 */
var APP_PATH = '';
var _XConfig = [];
var _GIndex = 0;
_XConfig['dev'] = true;
window.STATICCLASS_CALENDAR = null;
window.STATICCLASS_XWINDOW = null;
window.STATICCLASS_XPOST = null;
window.STATICCLASS_XLINKACTION = null;
window.XWINDOW_AFTERCLOSE = null;
window.EX_COMP_CLASS = [];
window.EX_SCRIPT_CLASS_CACHE = [];
window.EX_XML_CLASS_CACHE = [];
window.EX_BLOCK_CONTAINER = null;
//document.domain = 'ajaxeye.com';

var _XBody = null;

function $() {
  	var elements = [];
  	for (var i = 0; i < arguments.length; i++) {
   		var element = arguments[i];
    	if (typeof element == 'string') {
      		element = document.getElementById(element);
    	}
    	if (arguments.length == 1) {
      		return element;
    	}
    	elements.push(element);
  	}
  	return elements;
}

function __getXmlObject() {
	return new ActiveXObject("Microsoft.XMLDOM");
}

function __isEmpty($str) {
	return __trim($str).length==0;
}

var _regLtrim = /^(\s|\u3000)*/;
var _regRtrim = /(\s|\u3000)*$/;
function __trim($text) {
	if ($text==null)
		return "";
	return $text.replace(_regLtrim, "").replace(_regRtrim, "");
}

function __go($url) {
	top.__jump(window);
    document.location = $url;
}

function __post($formname) {
	if (window.STATICCLASS_XPOST == null) {
		__loadScript("XPost", 7);
	}
	window.STATICCLASS_XPOST($formname);
}

function __linkaction($url, $handler) {
	if (window.STATICCLASS_XLINKACTION == null) {
		__loadScript("XLinkAction", 7);
	}
	window.STATICCLASS_XLINKACTION($url, $handler);
}

function __jump($win) {
}

function __isInt($v, $minusable) {
    var pattern;
    if ($minusable) {
        pattern = /^[-]?\d+$/;
    } else {
        pattern = /^[\d]*$/;
    }
    return pattern.test($v);
}

function __time($evt) {
	if (window.STATICCLASS_CALENDAR == null) {
		window.STATICCLASS_CALENDAR = __loadScript('Calendar', 1);	
	}
	window.STATICCLASS_CALENDAR.render($evt);
}

function __open($target, $params, $fct) {
	if (window.STATICCLASS_XWINDOW == null) {
		window.STATICCLASS_XWINDOW = __loadScript('XWindow', 1);
	}
	window.STATICCLASS_XWINDOW.open($target, $params);
	window.XWINDOW_AFTERCLOSE = $fct;
}

function __close() {
	if (window.STATICCLASS_XWINDOW != null) {
		window.STATICCLASS_XWINDOW.close();
		if (window.XWINDOW_AFTERCLOSE != null) {
			window.XWINDOW_AFTERCLOSE();
			window.XWINDOW_AFTERCLOSE = null;
		}
	}
}

function __alert($msg, $time) {
	if (typeof(top.ExMessengerMgr) != "undefined") {
		$time = $time || 3;
		top.__popup($msg, $time, window);
	} else {
		alert($msg);
	}
}

function __getGlobalIndex() {
	_GIndex++;
	return _GIndex;
}

function __isInXBody($dom) {
	if (_XBody == null) {
		return false;
	}
	return ElementUtils.findElementWithAttribute($dom, 'ex.impl', 'XBody');
}

function __isXWindow() {
	if (parent.STATICCLASS_XWINDOW != null) {
		return parent.STATICCLASS_XWINDOW.isOpen();
	}
	return document.body.getAttribute('ex.isXWindow') == 'true';
}

function __isXWindowOpen() {
	if (window.STATICCLASS_XWINDOW == null) {
		return false;
	} else {
		return window.STATICCLASS_XWINDOW.isOpen();
	}
}

function __isJump($fctStr) {
	if ($fctStr.indexOf("\.location") != -1) {
		return true;
	}
	if ($fctStr.indexOf("__jump") != -1) {
		return true;
	}
	return false;
}

function __wait($msg) {
	if (typeof(top.ExMessengerMgr) != 'undefined') {
		return top.__waitx($msg || "操作正在进行中", window);
	}
}

function __unwait($uuid) {
	if (typeof(top.ExMessengerMgr) != 'undefined') {
		top.__unwaitx($uuid);
	}	
}

function __loadCss($url) {
	var element = document.createElement("LINK");
	element.rel = "stylesheet";
	element.type = "text/css";
	element.href = $url;
	document.getElementsByTagName("HEAD")[0].appendChild(element);	
}

function __getBodyClientHeight() {
	if (typeof(document.compatMode) != 'undefined' && document.compatMode != 'BackCompat') {
		return document.documentElement.clientHeight;
	} else if (typeof (document.body) != 'undefined') {
		return document.body.clientHeight;
	}
	return 0;
}

function __getRect($element) {
	return [$element.clientWidth * 1, $element.clientHeight * 1];
}

function __getPos($element) {
	var iX = 0;
	var iY = 0;
	while ($element && $element.tagName && $element.tagName.toLowerCase() != 'body') {
		iX += $element.offsetLeft || 0;
		iY += $element.offsetTop || 0;
		$element = $element.offsetParent;
	}
	return [iX, iY];
}

function __renderCombobox($dom) {
	var items = $dom.getAttribute("ex.selected");
	if (ValidatorUtils.isNotBlank(items)) {
		$dom.value = items;
	}
	if ($dom.selectedIndex != -1) {
		$dom.options[$dom.selectedIndex].style.backgroundColor = "#CFEBA5"; 
	}
}

function __winopen($p) {
	var w = screen.availWidth;
	var h = screen.availHeight;
	var l = (w - $p.width) / 2;
	var t = (h - $p.height) / 2;
	var p_mb = $p.menubar ? "yes" : "no";
	var pa = "width=" + $p.width + ",height=" + $p.height + ",left=" + l + ",top=" + t + ",status=no,toolbar=no,location=no,menubar=" + p_mb;
	var o = window.open($p.url, "open", pa);
	o.focus();
	return o;
}

function __callHelp() {
	var p = [];
	p.argu = document.location.href;
	p.less = true;
	p.width = "1000px";
	p.height = "700px";
	if (window.ie) {
		var sFea = "dialogHeight:" + p.height + ";dialogWidth:" + p.width + ";center:yes;help:no;resizeable:yes;status:no";
		window.showModelessDialog(APP_PATH + '/help/index.php', p.argu, sFea);
	} else {
		alert('该特性目前不支持firefox');
		return;
		var sFea = 'dialog,width=' + p.width + ',height=' + p.height + ',scrollbars=0;centerscreen';
		window.open(APP_PATH + '/help/index.php?url=' + p.argu, '_blank', sFea);
	}
}

function $merge() {
	var mix = {};
	for (var i = 0; i < arguments.length; i++) {
		for (var property in arguments[i]) {
			var ap = arguments[i][property];
			var mp = mix[property];
			if (mp && typeof(ap) == 'object' && typeof(mp) == 'object') {
				mix[property] = $merge(mp, ap);
			} else {
				mix[property] = ap;
			}
		}
	}
	return mix;
}

var ExPanel = function() {
	
	var html = '<div style="position:absolute;left:2px;top:2px;z-index:199;color:black;visibility:hidden"></div>';
	var dContainer = ElementUtils.createElementByHtml(html);
	document.body.appendChild(dContainer);
	
	this.getContainer = getContainer;
	this.setVisible = setVisible;
	
	function getContainer() {
		return dContainer;
	}
	
	function setVisible($visible) {
		var val = $visible ? 'visible' : 'hidden';
		dContainer.style.visibility = val;
		val = $visible ? '' : 'none';
		dContainer.style.display = val;
	}
}
/*****************************************************************
 * 
 * Xml
 * 
 *****************************************************************/
function XmlUtils() {
}

/**
 * 将xml字符串转换为xml文档对象
 * @param {String} $text
 */
XmlUtils.parse = function($text) {
	if (typeof ActiveXObject != 'undefined' && typeof GetObject != 'undefined') {
		var b = new ActiveXObject('Microsoft.XMLDOM');
		b.loadXML($text);
		return b;
	}
	if (typeof DOMParser != 'undefined') {
		return (new DOMParser).parseFromString($text, 'text/xml');
	}
	return null;
}

function ArrayUtils() {
}

/**
 * 判断数组$array中是否存在$val这个值
 * TODO 这个方法可以优化
 */
ArrayUtils.exists = function($array, $val) {
	var len = $array.length;
	for (var i = 0; i < len; i++) {
		if ($array[i] == $val) {
			return true;
		}
	}
	return false;
}

/*****************************************************************
 * 
 * Ajax
 * 
 *****************************************************************/
function XHR($options) {
	
	var transport = null;
	var response = null;
	var options = {
		method: 'post',
		async: true,
		onSuccess: null,
		onFailure: null
	};
	
	this.send = send;
	this.getResponse = getResponse;
	
	options = $merge(options, $options);
	transport = getTransport();
	if (!transport) {
		alert('创建xmlhttp失败');
		return;
	}
	
	function send($url, $data) {
		if ($data && options.method == 'get') {
			var d = ($url.indexOf('?') == -1) ? '?' : '&';
			$url = $url + d + $data;
			$data = null;
		}
		transport.open(options.method.toUpperCase(), $url, options.async);
		transport.onreadystatechange = function () {
			if (transport.readyState == 4) {
				if (transport.status == 200) {
					response = {
						'text': transport.responseText,
						'xml': transport.responseXML
					};
					if (options.onSuccess) {
						options.onSuccess(response.text, response.xml);
					}
				} else {
					if (options.onFailure) {
						options.onFailure(transport);
					}
				}
			}
		};
		if (options.method == 'post' && transport.overrideMimeType) {
			transport.setRequestHeader('Connection', 'close');
		}
		transport.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		transport.send($data);
		// firefox3 中，同步xmlhttp请求，不会调用onreadystatechange方法，需在这里这样判断返回数据
		if (window.gecko && !options.async) {
			if (transport.status == 200) {
				response = {
					'text': transport.responseText,
					'xml': transport.responseXML
				};
				if (options.onSuccess) {
					options.onSuccess(response.text, response.xml);
				}
			} else {
				if (options.onFailure) {
					options.onFailure(transport);
				}
			}
		}
		
		return this;
	}
	
	function getResponse() {
		return response;
	}
	
	function getTransport() {
		var t = null;
		try {
			t = new XMLHttpRequest();
		} catch (e1) {
			try {
				t = new ActiveXObject('Msxml2.XMLHTTP');
			} catch (e2) {
				try {
					t = new ActiveXObject('Microsoft.XMLHTTP');
				} catch (e3) {
					t = false;
				}
			}
		}
		return t;
	}
}

/*****************************************************************
 * 
 * Element
 * 
 *****************************************************************/
function ElementUtils() {
}

ElementUtils.remove = function($element) {
	var element = $($element);
	element.parentNode.removeChild(element);	
}

function ErrorModel($msg, $elm) {
    var elm = $elm;
    var msg = $msg;

    this.getElement = function() {
        return elm;
    }
    this.getMessage = function() {
        return msg;
    }
}

/**
 * 循环查找元素的上一个与$tagName相同的元素
 * 
 * @param {Object} $tagName
 */
ElementUtils.findElement = function($element, $tagName) {
	var element = $element;
	while (element.parentNode && (!element.tagName || (element.tagName.toUpperCase() != $tagName.toUpperCase()))) {
		element = element.parentNode;
	}			
	return element;
}

ElementUtils.findElementWithAttribute = function($element, $attribute, $value) {
	var element = $element;
	while ((element != null) && (element.tagName != 'BODY')) {
		if (element.getAttribute($attribute) == $value) {
			return element;
		}
		element = element.parentNode;
	}			
	return null;
}

ElementUtils.cleanWhitespace = function($element) {
	var element = $($element);
	for (var i = 0; i < element.childNodes.length; i++) {
		var node = element.childNodes[i];
		if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
			ElementUtils.remove(node);
		}
	}
}

ElementUtils.addClass = function($element, $className) {
	if (!ElementUtils.hasClass($element, $className)) {
		$element.className = $element.className + ' ' + $className;
	}
}

ElementUtils.removeClass = function($element, $className) {
	if (ElementUtils.hasClass($element, $className)) {
		var cls = (' ' + $element.className + ' ').replace(' ' + $className + ' ', '');
		$element.className = cls;
	}
}

ElementUtils.hasClass = function($element, $className) {
	var cls = ' ' + $element.className + ' ';
	return (cls.indexOf(' ' + $className + ' ') != -1);
}

ElementUtils.createElementByHtml = function($html) {
	var span = document.createElement("SPAN");
    span.innerHTML = $html;
    return span.childNodes[0];
}

ElementUtils.insertAdjacentHtml = function($element, $pos, $html) {
	if ($element.insertAdjacentHTML) {
		$element.insertAdjacentHTML($pos, $html);
	} else {
		if ($pos == 'beforeEnd') {
			var range = $element.ownerDocument.createRange();
			range.selectNodeContents($element);
			range.collapse(false);
			var fragment = range.createContextualFragment($html);	
			$element.appendChild(fragment);
		}		
	}
}

ElementUtils.insertAdjacentElement = function($element, $pos, $elm) {
	if ($element.insertAdjacentElement) {
		$element.insertAdjacentElement($pos, $elm);
	} else {
		if ($pos == 'afterBegin') {
			$element.insertBefore($elm, $element.firstChild);
		} else if ($pos == 'beforeEnd') {
			$element.appendChild($elm);	
		}
	}
}

/** 
 * @since 2006/10/28 15:10
 */
ElementUtils.getElements = function($form) {
	var form = $form;
	var el = null;
	var name = null;
	var value = null;
	var elements = [];
	var ips = form.getElementsByTagName("INPUT");
	for (var i = 0; i < ips.length; i++) {
		el = ips[i];
		if (el.type.toLowerCase() == "reset" || el.type.toLowerCase() == "button") {
			continue;
		}
		name = el.name;
		value = el.value == null ? "" : el.value;
		value = encodeURIComponent(value);
		if (el.type.toLowerCase() == "checkbox" || el.type.toLowerCase() == "radio") {
			if (el.checked) {
				elements.push([name, value]);
			}
		} else {
			elements.push([name, value]);
		}
	}
	var tas = form.getElementsByTagName("TEXTAREA");
	for (var i = 0; i < tas.length; i++) {
		el = tas[i];
		value = el.value == null ? "" : el.value;
		value = encodeURIComponent(value);
		elements.push([el.name, value]);
	}
	var sels = form.getElementsByTagName("SELECT");
	for (var i = 0; i < sels.length; i++) {
		el = sels[i];
		value = "";
		if (el.type.toLowerCase() == "select-one") {
			var opt;
			var index = el.selectedIndex;
			if (index >= 0) {
				opt = el.options[index];
				value = opt.value;
				value = encodeURIComponent(value);
				elements.push([el.name, value]);
			}			
		}
	}
	return elements;
}

/**
 * 将form中数据以name1=value1&name2=value2&name3=value3的形式返回
 * 还是prototype.js中实现的方法牛X,以后再慢慢优化 :P
 *
 * @since 2006/10/28 15:35 
 */
ElementUtils.serialize = function($form) {
	var elements = ElementUtils.getElements($form);
	var queryComponent = [];
	for (var i = 0; i < elements.length; i++) {
		queryComponent.push(elements[i][0] + "=" + elements[i][1]);
	}
	return queryComponent.join("&");
}

/*****************************************************************
 * 
 * Event
 * 
 *****************************************************************/
function Event() {
	// general Event
	this.observers = false;
	// DOMReady Event
	this.domreadyObservers = false;
	this.timer = false;
	this.fired = false;
}

Event.addEvent = function($element, $name, $observer, $useCapture) {	
	$element = $($element);
	$useCapture = $useCapture || false;	
	if ($name == 'keypress' && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || $element.attachEvent)) {
		$name = 'keydown';	
	}	
	Event._observeAndCache($element, $name, $observer, $useCapture)	     			
}

Event.removeEvent = function($element, $name, $observer, $useCapture) {
	$element = $($element);	
	$useCapture = $useCapture || false;
	if ($name == 'keypress' && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || $element.attachEvent)) {
		$name = 'keydown';	
	}
	if ($element.removeEventListener) {
		$element.removeEventListener($name, $observer, $useCapture);
	} else if ($element.detachEvent) {
		$element.detachEvent("on" + $name, $observer);
	}
}

Event.element = function($event) {
	return $event.target || $event.srcElement;		
}

Event.findElement = function($event, $tagName) {
	var element = Event.element($event);
	return ElementUtils.findElement(element, $tagName);
}

Event.pointerX = function($event) {
	return $event.pageX || ($event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
}

Event.pointerY = function($event) {
	return $event.pageY || ($event.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
}

Event._observeAndCache = function($element, $name, $observer, $useCapture) {
	if (!this.observers) this.observers = [];
	if ($element.addEventListener) {
		this.observers.push([$element, $name, $observer, $useCapture]);
		$element.addEventListener($name, $observer, $useCapture);
	} else if ($element.attachEvent) {
		this.observers.push([$element, $name, $observer, $useCapture]);
		$element.attachEvent('on' + $name, $observer);
	}
}

Event.addDOMReadyEvent = function($callback) {
	
	if (!this.domreadyObservers) this.domreadyObservers = [];
	if (Event.fired) {
		$callback();
		return;
	}
	
	this.domreadyObservers.push($callback);
	
	function fireDOMReadyEvent() {
		if (Event.fired) {
			return;
		}
		if (Event.timer) {
			window.clearInterval(Event.timer);
		}
		Event.fired = true;
		var i = null;
		for (i in Event.domreadyObservers) {
			Event.domreadyObservers[i]();
		}
	}
	
	if (document.addEventListener) {
		if (window.webkit) {
			timer = window.setInterval(function() {
				if (/loaded|complete/.test(document.readyState)) {
					fireDOMReadyEvent();
				}
			}, 10);
			Event.addEvent(window, 'load', fireDOMReadyEvent);
		} else {
			document.addEventListener("DOMContentLoaded", fireDOMReadyEvent, false);
		}
	} else {
		var src = (window.location.protocol == 'https') ? '://0' : 'javascript:void(0)';
		document.write('<script id="__tbOnDOMReady" src="' + src + '" defer><\/script>');
		$('__tbOnDOMReady').onreadystatechange = function() {
			if (this.readyState == 'complete') {
				this.onreadystatechange = null;
				fireDOMReadyEvent();
			}
		};
	}
}

/*****************************************************************
 * 
 * URL
 * 
 *****************************************************************/
function URLUtils() {
}

URLUtils.isFileNameSame = function($arg1, $arg2) {

    if (URLUtils.getFileName($arg1) == URLUtils.getFileName($arg2)) {
        return true;
    }
    return false;
}

URLUtils.getFileName = function($url) {

    var idx = $url.lastIndexOf('/');
    var filename = $url.substr(idx + 1);
    idx = $url.indexOf('?');
    if (idx != -1) {
        filename = $url.substr(0, idx);
    }

    return filename;
}

URLUtils.addParam = function($url) {

    var url = $url;

    for (var i = 1; i < arguments.length; i++) {
        var ary = arguments[i];
        if (url.indexOf("?") != -1) {
            url = url + "&" + ary[0] + "=" + ary[1];
        } else {
            url = url + "?" + ary[0] + "=" + ary[1];
        }
    }

    return url;
}

URLUtils.getParam = function($url, $param) {

    var reg = "/^.*[\\?|\\&]" + $param + "\\=([^\\&]*)/";
    reg = eval(reg);
	
	var ret = $url.match(reg);
	if (ret != null) {
		return ret[1];
	} else {
		return "";
	}   
}

URLUtils.parseParams = function($params) {
	var reg = /([^\=\;]*)\=([^\;]*)/gi;
	var rt = [];
	if($params == null) {
		return rt;
	}
	var mat = $params.match(reg);
	var t = null;
	for (var i = 0; i < mat.length; i++) {
		t = mat[i].split("=");
		if (t[1].toLowerCase() == "true") {
			rt[t[0]] = true;
		} else {
			rt[t[0]] = t[1];
		}
	}
	return rt;
}

URLUtils.noCache = function($url) {
	return URLUtils.addParam($url, ["nocache", Math.random()]);
}

function __render($elements) {
	for (var i = 0; i < $elements.length; i++) {
		var element = $elements[i];
		var impl = element.getAttribute('ex.impl');
		if (impl != null) {
			__renderComps(element, impl);
		} else if (element.tagName.toLowerCase() == "select") {
			__renderCombobox(element);
		}
	}
}

function __renderComps(element, impl) {
	if (impl == 'XBody') {
		_XBody = element;
	} else {
		if (typeof(window.EX_SCRIPT_CLASS_CACHE[impl]) == 'undefined') {
			try {
				__loadScript(impl, 7);
			} catch (e) {
				alert('没有找到实现JS类或者类出错: ' + impl + ' : ' + e.description);
				throw e;
			}
		}
		var classz = new EX_COMP_CLASS[impl]();
		classz.render(element);
	}
}

function __renderXBody($body) {
	_XBody = $body;
	var pos = __getPos($body);
	var p = __getBodyClientHeight() - pos[1];
	if (p > 40) {
		document.body.scroll = 'no';
		$body.style.height = p + 'px';
		$body.style.width = '100%';
		$body.style.overflowX = 'auto';
		$body.style.overflowY = 'auto';
		
		// 改变XBody childNodes的宽度，不然某些情况下显示会有问题
		//ElementUtils.cleanWhitespace($body);
		//var chs = $body.childNodes;
		//for (var i = 0; i < chs.length; i++) {
			//chs[i].style.width = ($body.clientWidth - 11) + 'px';			
		//	chs[i].style.width = '100%';
		//}
		
		window.onresize = function() {
			__renderXBody($body);
		};
	} else {
		document.body.scroll = 'yes';
	}
}

function __getScrollerWidth() {
    var scr = null;
    var inn = null;
    var wNoScroll = 0;
    var wScroll = 0;

    // Outer scrolling div
    scr = document.createElement('div');
    scr.style.position = 'absolute';
    scr.style.top = '-1000px';
    scr.style.left = '-1000px';
    scr.style.width = '100px';
    scr.style.height = '50px';
    // Start with no scrollbar
    scr.style.overflow = 'hidden';

    // Inner content div
    inn = document.createElement('div');
    inn.style.width = '100%';
    inn.style.height = '200px';

    // Put the inner div in the scrolling div
    scr.appendChild(inn);
    // Append the scrolling div to the doc
    document.body.appendChild(scr);

    // Width of the inner div sans scrollbar
    wNoScroll = inn.offsetWidth;
    // Add the scrollbar
    scr.style.overflow = 'auto';
    // Width of the inner div width scrollbar
    wScroll = inn.offsetWidth;

    // Remove the scrolling div from the doc
    document.body.removeChild(
        document.body.lastChild);

    // Pixel width of the scroller
    return (wNoScroll - wScroll);
}

function __loadScript($class, $returnType) {
	if (window.EX_SCRIPT_CLASS_CACHE[$class] == null) {
		var script = null;
		if (typeof(top.EX_XML_CLASS_CACHE) != 'undefined') {
			script = top.EX_XML_CLASS_CACHE[$class];
			if (typeof(script) == 'undefined' && typeof(opener) != 'undefined') {
				try {
					if (typeof(opener.EX_XML_CLASS_CACHE) != 'undefined') {
						script = opener.EX_XML_CLASS_CACHE[$class];
					}
				} catch (e) {
				}
			}
		}
		// class没有被缓存
		if (script == null) {
			var url = APP_PATH + '/js/dynamic/' + $class + '.js';
			var syncXhr = new XHR({async: false, method: 'get'}).send(url);
			script = syncXhr.getResponse().text;
			if (typeof(top.EX_XML_CLASS_CACHE) != 'undefined') {
				// put to top's script cache
				top.EX_XML_CLASS_CACHE[$class] = script;
			}
			try {
				if (typeof(opener) != 'undefined' && typeof(opener.top.EX_XML_CLASS_CACHE) != 'undefined') {
					// put to opener's script cache
					opener.top.EX_XML_CLASS_CACHE[$class] = script;
				}
			} catch (e) {
			}
		}
		// just load script only
		eval(script);
		if ($returnType == 7) {
			return;
		}
		var fct = eval($class);
		
		var tM = [];
		tM['pointer'] = fct;
		tM['instance'] = new fct();	
			
		// put to self's cache
		window.EX_SCRIPT_CLASS_CACHE[$class] = tM;
		if ($returnType == 2) {
			return window.EX_SCRIPT_CLASS_CACHE[$class].instance;
		}
	}
	if ($returnType == 1) {
		// singleton
		return window.EX_SCRIPT_CLASS_CACHE[$class].instance;
	} else if ($returnType == 2) {
		// new class
		return window.EX_SCRIPT_CLASS_CACHE[$class]['pointer']();
	} else if ($returnType == 0 || $returnType == null) {
		// class define refer
		return window.EX_SCRIPT_CLASS_CACHE[$class]['pointer'];
	} else {
		return null;
	}
}

function __init() {
	if (_XConfig['dev'] && window.ie) {
		Event.addEvent(document.body, 'mousedown', __getFileName);
	}
	
	window.isDOMReady = true;
	
	__render(document.getElementsByTagName("DIV"));
	__render(document.getElementsByTagName("TABLE"));
	__render(document.getElementsByTagName('SELECT'));
	
	if (typeof(window.renderComplete) != "undefined") {
    	window.renderComplete();
    }
	if (typeof(top.__unjump) != "undefined") {
		top.__unjump();
	}
}

function __getFileName() {
	var kc = event.button;
	if (event.ctrlKey && kc == 2) {
		var url = document.location.toString();
		var idx = url.lastIndexOf('/');
		url = url.substr(idx + 1);
		var idx2 = url.indexOf('?');
		if (idx2 != -1) {
			url = url.substr(0, idx2);
		}
		window.clipboardData.setData("Text", url);
	}
}

/**
 * 在firefox下,假如iframe是隐藏的,iframe中的页面装载完成就不会触发DOMContentLoaded事件
 * 比如XWindows组件中就会有此问题,在onload时候再检查一遍
 */
function __ensureInit() {
	if (!Event.fired) {
		Event.fired = true;
		var i = null;
		for (i in Event.domreadyObservers) {
			Event.domreadyObservers[i]();
		}
		if (!Event.fired) {
			Event.fired = true;
			__init();
		}
	}
}

function __initXBody() {
	if (!window.isDOMReady) {
		setTimeout(__initXBody, 10);
		return;
	}
	if (_XBody != null) {
		__renderXBody(_XBody);
	}
}

Event.addDOMReadyEvent(__init);
Event.addEvent(window, 'load', __ensureInit);
Event.addEvent(window, 'load', __initXBody);

/*****************************************************************
 * 
 * Cookie
 * 
 *****************************************************************/
function CookieUtils() {
}

CookieUtils.addCookie = function($name, $value) {
	var str = $name + '=' + escape($value);
	document.cookie = str;
}

CookieUtils.getCookie = function($name) {
	if (!name) {
		return '';
	}
	var rawck, tmp, i;
	var cookies = new Array();
	rawck = document.cookie.split('; ');
	for (var i = 0; i < rawck.length; i++) {
		tmp = rawck[i].split('=');
		cookies[tmp[0]] = unescape(tmp[1]);
	}
	if (cookies[$name] != null) {
		return cookies[$name];
	} else {
		return '';
	}
}

/**
 *	Validator
 */
function ValidatorUtils() {
}

ValidatorUtils.isBlank = function($v) {
    if ($v == null) {
        return true;
    }
    for (var i = 0; i < $v.length; i++) {
        var c = $v.charAt(i);
        if ((c != ' ') && (c != '\n') && (c != '\t')) {
            return false;
        }
    }
    return true;
}

ValidatorUtils.isNotBlank = function($v) {
    if ($v == null) {
        return false;
    }
    var pattern = /\S/;
    return pattern.test($v);
}

ValidatorUtils.isEmail = function($v) {
    var pattern = /^[\w_-]+@[\w_-]+(\.[\w_-]+)+$/i;
    return pattern.test($v);
}

ValidatorUtils.isMax = function($v, $l) {
	return $v.length > $l ? true : false;
}

ValidatorUtils.isMin = function($v, $l) {
	return $v.length < $l ? true : false;
}

ValidatorUtils.isInt = function($v, $minusable) {
    var pattern;
    if ($minusable) {
        pattern = /^[-]?\d+$/;
    } else {
        pattern = /^[\d]*$/;
    }
    return pattern.test($v);
}

ValidatorUtils.isDouble = function($v, $minusable) {
   	var pattern;
    if ($minusable) {
        pattern = /^[-]?\d+\.?\d+$/;
    } else {
        pattern = /^\d+\.?\d+$/;
    }
    return pattern.test($v);
}

ValidatorUtils.isEnglish = function($v) {
    var pattern = /^[a-zA-Z]*$/;
    return pattern.test($v);
}

ValidatorUtils.isChinese = function($v) {
    var pattern = /^[\u4e00-\u9fa5]*$/;
    return pattern.test($v);
}

ValidatorUtils.isUrl = function($v) {
    var pattern = /^http:\/\/([\w-]+\.)+[\w-]+[\/\w-.\?%&=]?/;
    return pattern.test($v);
}

ValidatorUtils.isUserName = function($v) {
	var pattern = /^[\u4e00-\u9fa5_a-zA-Z0-9]+$/i;
	return pattern.test($v);
}

function DateUtils() {
}

DateUtils.compareDate = function($date1, $date2, $op) {
	var idx1 = $date1.indexOf(':');
	var idx2 = $date2.indexOf(':');
	var oDate1, oDate2 = null;
	idx1 == -1 ? oDate1 = DateUtils.parseDate($date1) : DateUtils.parseDateTime($date1);
	idx2 == -1 ? oDate2 = DateUtils.parseDate($date2) : DateUtils.parseDateTime($date2);
	
	switch($op) {
		case '>':
			return oDate1 > oDate2;
			break;
		case '<':
			return oDate1 < oDate2;
			break;
		case '>=':
			return oDate1 >= oDate2;
		case '<=':
			return oDate1 <= oDate2;
		default:
			alert('不支持的比较符: ' + $op);
			return false;
	}
}

DateUtils.parseDate = function($date) {
	if ($date == '') {
		return null;
	}
	var regex = /(\d*)年(\d*)月(\d*)日/;
	var t = $date.match(regex);
	var date = new Date();
	date.setYear(t[1]);
	date.setMonth(t[2] * 1 - 1);
	date.setDate(t[3]);
	date.setHours(0);
	date.setMinutes(0);
	
	return date;
}

DateUtils.parseDateTime = function($date) {
	if ($date == '') {
		return null;
	}
	var regex = /(\d*)年(\d*)月(\d*)日\s(\d*)\:(\d*)/;
	var t = $date.match(regex);
	var date = new Date();
	date.setYear(t[1]);
	date.setMonth(t[2] * 1 - 1);
	date.setDate(t[3]);
	date.setHours(t[4]);
	date.setMinutes(t[5]);
	
	return date;
}

/*****************************************************************
 * 
 * UUID
 * 
 *****************************************************************/
function __uuid() {
    var uuid = __hex(new Date().getTime()) + "-" +
               __hex(__random()).substr(0,4) + "-" +
               __hex(__random()).substr(1,4) + "-" +
               __hex(__random()).substr(2,4) + "-" +
               __hex(__random()).substr(3,4) +
               __hex(__random()).substr(4,4) +
               __hex(__random()).substr(2,4);
    return uuid;
}

var _chars = "0123456789abcdef";

function __random() {
	return Math.random() * 10000000000;
};

function __hex($num) {
	var str = "";
	for(var j = 7; j >= 0; j--) {
		str += _chars.charAt(($num >> (j * 4)) & 0x0F);
	}
	return str;
}

/*****************************************************************
 * 
 * Browser version (idea from mootools) :-)
 * 
 * window.ie	- 为true时表示Internet Explorer
 * window.ie6 	- 为true时表示Internet Explorer 6
 * window.ie7 	- 为true时表示Internet Explorer 7
 * window.gecko - 为true时表示Mozilla/Gecko系列浏览器
 * 
 *****************************************************************/
if (window.ActiveXObject) {
	window.ie = window[window.XMLHttpRequest ? 'ie7' : 'ie6'] = true;
} else if (navigator.userAgent.indexOf("Firefox") != -1) {
	window.gecko = true;
}

/*****************************************************************
 * 
 * Hack
 * 
 *****************************************************************/
// 启用IE6背景图片缓存
if (window.ie6) {
	try {
		document.execCommand("BackgroundImageCache", false, true);
	} catch (e) {
	}
}

function __block() {

    var width = document.body.clientWidth;
    var height = document.body.clientHeight;

    if (window.EX_BLOCK_CONTAINER == null) {
        var left = document.body.scrollLeft;
        var top = document.body.scrollTop;
        var html = '<div style="position:absolute;width:' + width + 'px;height:' + height + 'px;left:' + left + 'px;top:' + top + 'px;z-Index:150;background:white;"></div>';
        EX_BLOCK_CONTAINER = ElementUtils.createElementByHtml(html);
        EX_BLOCK_CONTAINER.style.opacity = 0;
        EX_BLOCK_CONTAINER.style.filter = 'alpha(opacity="0")';
        document.body.appendChild(EX_BLOCK_CONTAINER);
    } else {
        EX_BLOCK_CONTAINER.style.width = width;
        EX_BLOCK_CONTAINER.style.height = height;
        EX_BLOCK_CONTAINER.style.display = "";
    }
}

function __unblock() {
    if (window.EX_BLOCK_CONTAINER != null) {
        EX_BLOCK_CONTAINER.style.display = "none";
    }
}
