function _class(className, superClass, classImp){
	if(superClass === "") superClass = Object;
	var clazz = (function(){
		return function(){
			if(typeof this._init == "function"){
				this._init.apply(this, arguments);
			}
		};
	})();
	var _p = clazz.prototype = new superClass();
	var _super = superClass.prototype;
	window[className] = clazz;
	classImp.apply(_p, [_super]);
}
function trim(str){
	return str.replace(/^(\s|\u00A0)+|(\s|\u00A0)+$/g, "");
}
if(typeof $E == "undefined"){
	var $E = function(id){
		return document.getElementById(id);
	};
}
function isIE(){
	var _ua = window.navigator.userAgent.toLowerCase();
	var $IE = /msie/.test(_ua);
	return $IE;
}
function contains(el, obj){
	for(var o = obj; o; o = o.parentNode){
		if(o == el) return true;
		if(!o.parentNode) return false;
	}
	return false;
};
function getPos(obj, refElement){
	var pos = {x: 0, y: 0};
	refElement = refElement || window.document.body;
	while(obj && obj != refElement){
		pos.x += obj.offsetLeft;
		pos.y += obj.offsetTop;
		obj = obj.offsetParent;
	}
	return pos;
};
function callTpl(html, json){
	if(!json) return html;
	return html.replace(/\{([\$=])(\w+)\}/g, function(_0, _1, _2){
		switch(_1){
		case "$":
			if(_2 in json){
				return json[_2];
			}else{
				return _0;
			}
		}
	});
};
function formToHash(form){
	var oHash = {};
	var el;
	for(var i = 0,len = form.elements.length;i < len;i++){
		el = form.elements[i];
		//alert(el.name);
		if(el.name == "") continue;
		if(el.disabled) continue;
		switch(el.tagName.toLowerCase()){
		case "fieldset":
			break;
		case "input":
			switch(el.type){
			case "radio":
				if(el.checked)
					oHash[el.name] = el.value;
				break;
			case "checkbox":
				if(el.checked){
					if(!oHash[el.name]){
						oHash[el.name] = [el.value];
					}else{
						oHash[el.name].push(el.value);
					}
				}
				break;
			case "button":
				break;
			case "image":
				break;
			default:
				oHash[el.name] = el.value;
				break;
			}
			break;
		case "select":
			if(el.multiple){
				for(var j = 0, lens = el.options.length;j < lens; j++){
					if(el.options[j].selected){
						if(!oHash[el.name]){
							oHash[el.name] = [el.options[j].value];
						}else{
							oHash[el.name].push(el.options[j].value);
						}
					}
				}
			}else{
				oHash[el.name] = el.value;
			}
			break;
		default:
			oHash[el.name] = el.value;
			break;
		}
	}
	el = null;
	return oHash;
}
_class("Ajax", "", function(){
	var OP = {
		method : "post",
		asynchronous : true,
		contentType : "application/x-www-form-urlencoded",
		encoding : "UTF-8",
		parameters : ""
	}
	function createXHR(){
		var xhr = false;
		try{
			xhr = new XMLHttpRequest();
		}catch(try_MS){
			try{
				xhr = new ActiveXObject("Msxml2.XMLHTTP");
			}catch(other_MS){
				try{
					xhr = new ActiveXObject("Microsoft.XMLHTTP");
				}catch(failed){
					xhr = false;
				}
			}
		}
		return xhr;
	}
	/*
	//macro _fdata(data, isEncode) = isEncode ? encodeURIComponent(data) : data
	function _fdata(data, isEncode){
		return isEncode ? encodeURIComponent(data) : data;
	}
	*/
	function jsonToQuery(json, isEncode){
		var sb = [];
		if(typeof json == "object"){
			for(var k in json){
				if(json[k] instanceof Array){
					for(var i = 0, len = json[k].length; i < len; i++){
						sb.push(k + "=" + (isEncode ? encodeURIComponent(json[k][i]) : json[k][i]));
					}
				}else{
					sb.push(k + "=" + (isEncode ? encodeURIComponent(json[k]) : json[k]));
				}
			}
		}
		return sb.length ? sb.join("&") : "";
	}
	this.request = function(method, url, postData, type, agent, funName, cbArgs){
		var tran = createXHR();
		if(!tran){
			return false;
		}
		tran.onreadystatechange = function(){
			if(tran.readyState == 4){
				var o = tran.responseText;
				if(tran.status == 200){
					if (type == "json") {
						try{
							o = eval("(" + tran.responseText + ")");
						}catch(ex){
							//args.onError(tran);
							return;
						}
					}
					//调用真实的回调函数
					if(typeof(agent) == "function"){
						agent(o, cbArgs);
					}else if(typeof(fun) == "function"){
						fun.call(agent, o, cbArgs);
					}else{
						agent[fun](o, cbArgs);
					}
					//args.onSuccess(json);
				}else{
					//args.onFail(tran);
				}
			}
		};
		if(method == "GET"){
			url = url + "?" + jsonToQuery(postData);
			tran.open(method, url, true);
			tran.send(null);
		}else{
			tran.open(method, url, true);
			tran.setRequestHeader("Content-Type", OP.contentType);
			tran.send(jsonToQuery(postData));
		}
	};
});
_class("PopupMenu", "", function(){
	this._init = function(){
		this._self = null;
		this._titleDom = null;
		this._title = null;
	};
	this.init = function(obj){
		this._self = obj || $E("PopUpMenu");
	};
	this.bindTitle = function(titleDomList){
		var handle = 0;
		var _this = this;
		var mtitle = null;
		function startTime(ev){
			ev = ev || window.event;
			handle = window.setTimeout(function(){
				_this._self.style.display = "none";
			}, 200);
		}
		function clearTime(ev){
			ev = ev || window.event;
			_this._self.style.display = "";
			_this._titleDom = ev.target || ev.srcElement;
			if(!contains(_this._self, _this._titleDom)){
				_this.resetPos();
				if(_this._titleDom.id != ""){
					if(_this.resetStatus){
						_this.resetStatus(_this._titleDom);
					}
				}
			}
			if(handle != 0){
				window.clearTimeout(handle);
				handle = 0;
			}
		}
		for(var i = 0, l = titleDomList.length; i< l; i++){
			var titleDom = titleDomList[i];
			titleDom.onmouseover = clearTime;
			titleDom.onmouseout  = startTime;
		}
		this._self.onmouseover = clearTime;
		this._self.onmouseout  = startTime;
	};
	this._isOutterElement = function(el){
		var doc = el.ownerDocument;
		var win = doc.parentWindow || doc.defaultView;
		return !(win == this._win && runtime.dom.contains(this._self, el));
	};
	this.resetPos = function(){
		var pos = getPos(this._titleDom);
		var num = 0;
		if(isIE()){
			//num = 30;
		}
		this._self.style.top = pos.y - num + "px";
		this._self.style.left = pos.x - num + "px";
	};
	this.setVisible = function(v){
		this._self.style.display = v ? "" : "none";
	};
});