﻿/******************************
 * Common functions
 ------------------------------
 * Author by Clake
 * Datetime 2008-01-27
 * Last Modified  2009-4-13
 ******************************/

/***************************************
 * Config file
 ***************************************/
var cfg = {};

cfg["so"] = {};

cfg["js"] = {};

cfg["css"] = {};

var global = {};

/***************************************
 * public regex
 ***************************************/
var regex = {
		Require : /.+/,
		Email : /^\w+([-+.]\w+)*@\w+([-.]\\w+)*\.\w+([-.]\w+)*$/,
		Phone : /^((\(\d{3}\)))?(\(0\d{2,3}\)|0\d{2,3})?[1-9]\d{6,7}([0-9]\d{2}){0,1}$/,
		Mobile : /^((\(\d{3}\)))?1[35]\d{9}$/,
		PhoneMobile : /^(((\(\d{3}\)))?(\(0\d{2,3}\)|0\d{2,3})?[1-9]\d{6,7}([0-9]\d{2}){0,1})|(((\(\d{3}\)))?1[35]\d{9})$/,
		Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
		IdCard : /^\d{15}(\d{2}[A-Za-z0-9])?$/,
		Currency : /^\d+(\.\d+)?$/,
		Number : /^\d+$/,
		Zip : /^[1-9]\d{5}$/,
		QQ : /^[1-9]\d{4,8}$/,
		Integer : /^[-\+]?\d+$/,
		Double : /^[-\+]?\d+(\.\d+)?$/,
		English : /^[A-Za-z]+$/,
		Chinese :  /^[\u0391-\uFFE5]+$/,
		UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/
};

/***************************************
 * common function
 ***************************************/
//**************************************************
// Check browse version 'IE' or 'FF' or 'OP' or 'SA'
//**************************************************
var ua = window.navigator.userAgent.toLowerCase();
var flagEX = document.all && ua.indexOf("msie") != -1 ? "IE" : "FF";
var is_ie = flagEX == "IE" ? true : false;
var is_ie6 = ua.indexOf("msie 6") != -1 ? true : false;
var is_ie7 = ua.indexOf("msie 7") != -1 ? true : false;
var is_ie8 = ua.indexOf("msie 8") != -1 ? true : false;
var is_ie9 = ua.indexOf("msie 9") != -1 ? true : false;
var is_ff = ua.indexOf("firefox") != -1 ? true : false;
var is_sa = ua.indexOf("safari") != -1 && ua.indexOf("chrome") == -1 ? true : false;
var is_ch = ua.indexOf("chrome") != -1 ? true : false;
var is_opa = ua.indexOf("opera") != -1 ? true : false;
var is_ipad = ua.indexOf("ipad") != -1 ? true : false;
var is_iphone = ua.indexOf("iphone") != -1 ? true : false;
ua = null;
//************************************
//get url search string params
//************************************
function getUrlParams() {
	var str = window.location.search;
	str = str.substr(1);
	var params_arr = str.split("&");
	var params = {};
	var param;
	for (var i=0;i<params_arr.length;i++) {
		param = params_arr[i].split("=");
		params[param[0]] = param[1];
	}
	return params;
}
//************************************
//view Object function and Property
//************************************
function getobjparm(obj) {
	var funcstr = "function:\n";
	for (var p in obj ){
			funcstr += p+"<br/>";
	}
	document.body.innerHTML = funcstr;
	funcstrr = null;
}
//************************************
// Get Element Object Client X-Y
//************************************
function getElementXY(e) {
	var parent = arguments[1]?arguments[1]:undefined;
	var t = new Array();
	t['top'] = e.offsetTop;
	t['left'] = e.offsetLeft;
	var scrollTop = 0;
	var scrollLeft = 0;
	var topScroll = 0;
	var leftScroll = 0;
	while ((e = e.offsetParent) && e != parent) {
		t['top'] += e.offsetTop;
		t['left'] += e.offsetLeft;		
		topScroll = e.scrollTop;
		scrollTop += topScroll;
		leftScroll = e.scrollLeft;
		scrollLeft += leftScroll;
	}
	t['top'] = t['top'] - (scrollTop - topScroll);
	t['left'] = t['left'] - (scrollLeft - leftScroll);
	
	scrollTop = topScroll = scrollLeft = leftScroll = parent = null;
	return t;
}
//************************************
// Round
//************************************
function roundx(Dight,How) {
	Dight = Math.round (Dight*Math.pow(10,How))/Math.pow(10,How);
	return Dight;
} 
//************************************
// Create and return httpxml Object
//************************************
function clsajax() {
	var xmlhttp;
	if (flagEX == "IE" ){
		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		xmlhttp = new window.XMLHttpRequest();
	}
	return xmlhttp;
}
//**********************
// Load xml document
//**********************
var loadXML = function(xmlFile) {
	var xmlDoc;
	if(window.ActiveXObject){
		xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
		xmlDoc.async = false;
		xmlDoc.load(xmlFile);
	} else if (document.implementation&&document.implementation.createDocument){
		xmlDoc = document.implementation.createDocument('', '', null);
		xmlDoc.async = false;
		xmlDoc.load(xmlFile);
	} else {
		return null;
	}
	return xmlDoc;
};
//**********************
//get object key
//**********************
function getObjKey(obj) {
	for (var k in obj) {
		return k;
	}
}

function getObjKeys(obj) {
	var keys = [];
	for (var k in obj) {
		keys.push(k);
	}
	return keys;
}

function expand(src,exp) {
	for (var i in exp ) {
		src[i] = exp[i];
	}
	return src;
}
//********************
// Show title info
//********************
var msgdiv;
function showclew() {
	if (flagEX == "IE" && document.readyState != "complete") return;
	var srcObj = arguments[1] ? arguments[1] : this;
	if (!msgdiv) {
		msgdiv = document.createElement("DIV");
		document.body.appendChild(msgdiv);
	}
	srcObj.onmousemove = clewmove;
	srcObj.onmouseout = closeclew;
	msgdiv.style.position = "absolute";
	msgdiv.style.padding = "1px 3px";
	msgdiv.style.border = "1px solid #82c3ff";
	msgdiv.style.backgroundColor = "#e7f3ff";
	msgdiv.style.fontSize = "12px";
	msgdiv.style.zIndex = "100000";
	msgdiv.innerHTML = srcObj.getAttribute("clewmsg");
	msgdiv.style.visibility = "visible";
	srcObj = null;
}

function clewmove() {
	var flag = this.getAttribute("clewflag");
	if (flag == "mouse") {
		var evt = arguments[0] ? arguments[0] : window.event;
		var bod = document.documentElement ? document.documentElement : document.body;
		msgdiv.style.top = flagEX == "FF" ? (evt.pageY + 10) + "px" : (evt.y + 10) + bod.scrollTop + "px";
		msgdiv.style.left = flagEX == "FF" ? (evt.pageX + 10) + "px" : (evt.x + 10) + "px";
		evt = bod = null;
	} else {
		var t = getElementXY(this);
		msgdiv.style.top = t['top'] + "px";
		msgdiv.style.left = (t['left'] + this.clientWidth) + "px";
		t = null;
	}
	flag = null;
}

function closeclew() {
	msgdiv.style.visibility = "hidden";
}


//******************************************
// Add trim function in string object 
//******************************************
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
};

//******************************************
// Add indexOf function in Array object 
//******************************************
if(!Array.indexOf){
	Array.prototype.indexOf = function(obj){
		for(var i=0; i<this.length; i++){
			if(this[i]==obj){
				return i;
			}
		}
		return -1;
	};
}
//******************************************
//Add hasItem function in object 
//******************************************
var hasItem = function(obj){
	var i = 0;
	for (var item in obj) {
		i++;
	}
	return i>0?true:false;
};
//******************************************
// Get element for ID
//******************************************
var $ = function(element_id) {
	var elm = null;
	if (typeof element_id == "string") {
		elm = document.getElementById(element_id);
	} else {
		elm = element_id;
	}
	
	elm.addEvent = function(type,func) {
		if (flagEX == "IE") {
			this.attachEvent("on"+type,func);
		} else {
			this.addEventListener(type,func,false);
		}
	};
	
	elm.removeEvent = function(type,func) {
		if (flagEX == "IE") {
			this.detachEvent("on"+type,func);
		} else {
			this.removeEventListener(type,func,false);
		}
	};
	
	elm.css = function(style) {
		var key;
		for (key in style) {
			try {
				if (key == "float") {
					if (flagEX == "IE") {
						key = "styleFloat";
					} else {
						key = "cssFloat";
					}
				}
				this.style[key] = style[key];
			} catch(e) {
				continue;
			}
		}
		key = null;
	};
	
	elm.addClass = function(cls_name) {
		var arr = this.getClass();
		if (arr) {
			if (!this.hasClass(cls_name)) {
				arr.push(cls_name);
				this.className = arr.join(" ");
			}
		} else {
			this.className = cls_name;
		}
		arr = null;
	};
	
	elm.hasClass = function(cls_name) {
		var arr = this.getClass();
		if (typeof arr == "array") {
			if (arr.indexOf(cls_name) != -1) {
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	};
	
	elm.removeClass = function() {
		
	};
	
	elm.getClass = function() {
		var s = this.className;
		if (s) {
			return s.split(" ");
		} else {
			return false;
		}
	};
	
	return elm;
};

//******************************************
// Get elements for NAME
//******************************************
var $N = function(elementName) {
	return document.getElementsByName(elementName);
};
//******************************************
// Get elements for TAGNAME
//******************************************
var $T = function(element_tag) {
	return document.getElementsByTagName(element_tag);
};
//******************************************
//Create elements
//******************************************
var $C = function(element_tag) {
	return document.createElement(element_tag);
};

var $CF = function() {
	return document.createDocumentFragment();
};
//******************************************
// Dynamic load Javascript File
//******************************************
var loadScript = {
	_loaded:{},
	_onLoad:function(srcStr,strID){
		var func = arguments[2];
		var version = arguments[3];
		if (loadScript._loaded[strID]) {
			if (func && typeof func == "function") func();
			return;
		}
		var element = document.createElement("SCRIPT");
		if (typeof version == "string") {
			element.src = srcStr+"?"+version;
		} else if (typeof version == "boolean") {
			element.src = srcStr+"?"+randomString(5);
		} else {
			element.src = srcStr;
		}
		element.type = 'text/javascript';
		element.id = strID;
		element.language = 'javascript';
		loadScript._loaded[strID] = false;
		if (flagEX == "IE") {
			element.onreadystatechange = function(){
				var state = this.readyState;
            	if (state == "loaded" || state == "interactive" || state == "complete") {
					this.onreadystatechange = null;
					loadScript._loaded[strID] = true;
					if (func && typeof func == "function") func();
				}
			};
		} else {
			element.onload = function() {
				this.onload = null;
				loadScript._loaded[strID] = true;
				if (func && typeof func == "function") func();
        	};
			element.onerror = function() {
				alert("Load Library Error!");
			};
		}
		document.getElementsByTagName("head")[0].appendChild(element);
		element = null;
	}
};
//******************************************
// rgb to Color value
//******************************************
function rgbToColor(forecolor) {
	if(flagEX == "IE") {
		return rgbhexToColor((forecolor & 0xFF).toString(16), ((forecolor >> 8) & 0xFF).toString(16), ((forecolor >> 16) & 0xFF).toString(16));
	}
	if(forecolor == '' || forecolor == null) {
		forecolor = "#000000";
	}
	if (forecolor == "transparent") {
		forecolor = "#FFFFFF";
	}
	if(forecolor.toLowerCase().indexOf('rgb') == 0) {
		var matches = forecolor.match(/^rgb\s*\(([0-9]+),\s*([0-9]+),\s*([0-9]+)\)$/);
		if(matches) {
			return rgbhexToColor((matches[1] & 0xFF).toString(16), (matches[2] & 0xFF).toString(16), (matches[3] & 0xFF).toString(16));
		} else {
			return rgbToColor(null);
		}
	} else {
		return forecolor;
	}
}

function rgbhexToColor(r, g, b) {
	return '#' + (str_pad(r, 2, 0) + str_pad(g, 2, 0) + str_pad(b, 2, 0));
}

//******************************************
// pad char in string end
//******************************************
function str_pad(text, length, padstring) {
	var type = arguments[3] || "left";
	text += '';
	padstring += '';
	var padtext = null;
	if(text.length < length) {
		padtext = padstring;

		while(padtext.length < (length - text.length)) {
			padtext += padstring;
		}
		if (type == "left") {
			text = padtext.substr(0, (length - text.length)) + text;
		} else if (type == "right") {
			text = text + padtext.substr(0, (length - text.length));
		}
		
	}
	padtext = null;
	return text;
}
//******************************************
//get redom string
//******************************************
function randomString(str_length) {
	var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
	var num;
	var out_str = "";
	for (var i=0;i<str_length;i++) {
		num = Math.round(Math.random()*chars.length);
		out_str += chars.substring(num, num+1);
	}
	chars = num = null;
	return out_str;
}

//******************************************
// show black back Alpha default 50%
//******************************************
var blackDiv = null;
function showBlackBack(flag) {
	var alpha = arguments[1] ? arguments[1] : 50;
	if (!blackDiv) {
		blackDiv = document.createElement("DIV");
		blackDiv.style.zIndex = "300";
		blackDiv.style.width = "100%";
		blackDiv.style.height = "100%";
		blackDiv.style.position = "absolute";
		blackDiv.style.top = "0pt";
		blackDiv.style.left = "0pt";
		blackDiv.style.backgroundColor = "#999999";
		if (flagEX == "IE") {
			blackDiv.style.filter = "Alpha(opacity="+alpha+")";
		} else {
			blackDiv.style.opacity = alpha/100;
		}
		blackDiv.style.visibility = "hidden";
		if (document.body) {
			document.body.appendChild(blackDiv);
		}
	}
	if (flag) {
		var bod = document.documentElement ? document.documentElement : document.body;
		blackDiv.style.height = bod.scrollHeight + "px";
		blackDiv.style.width = bod.scrollWidth + "px";
		blackDiv.style.visibility = "visible";
		if (is_ie6) {
			var ops = $T("select");
			var p;
			for (p=0;p<ops.length ;p++ ){
				ops[p].style.visibility = "hidden";
			}
			ops = p = null;
		}
		bod = null;
		//document.body.style.overflow = "hidden";
	} else {
		blackDiv.style.visibility = "hidden";
		if (is_ie6) {
			var ops = $T("select");
			var p;
			for (p=0;p<ops.length ;p++ ){
				ops[p].style.visibility = "visible";
			}
			ops = p = null;
		}
		//document.body.style.overflow = "auto";
	}
}
//******************************************
// Request Object
//******************************************
var requestHttp = {
	__callBack:null,
	__xmlHttp:clsajax(),
	__satatus:false,
	openReq:function(http_param){
		requestHttp.__callBack = http_param["callback"] || null;
		requestHttp.__xmlHttp.open(http_param["type"],http_param["url"],http_param["sync"]);
		if (http_param["type"] == "POST") {
			requestHttp.__xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		}
		if (http_param["sync"]) {
			requestHttp.__xmlHttp.onreadystatechange=function(){
				if (requestHttp.__xmlHttp.readyState == null){
					alert("server time out,please try agein");
				}
				if (requestHttp.__xmlHttp.readyState == 4){
					requestHttp.__satatus = false;
					if (requestHttp.__xmlHttp.status == 200){
						var content = requestHttp.__xmlHttp.responseText;
						requestHttp.__callBack(content);
						content = null;
					} else {
						alert("server error,error code:"+requestHttp.__xmlHttp.status+" ,please try agein");
					}
				}
			};
			requestHttp.__satatus = true;
			requestHttp.__xmlHttp.send(http_param["param"]);
		} else {
			requestHttp.__xmlHttp.send(http_param["param"]);
			var content = requestHttp.__xmlHttp.responseText;
			if (typeof requestHttp.__callBack == "function") {
				requestHttp.__callBack(content);
				content = null;
			} else {
				return content;
			}
		}
	}
};

//******************************************
// Replace Html to text
//******************************************

function replace_html(html) {
	return html.replace(/<[\/\!]*?[^<>]*?>/ig,"");
}

function html2str() {
	
}

function str2html(str) {
	if (str) 
		str = str.toString();
	else
		return "";
	var search = [
	    "&",
	    "<",
	    ">"
	];
	
	var replace = [
	    "&amp",
	    "&lt",
	    "&gt"
	];
	
	for (var i=0;i<search.length;i++) {
		str.replace(search[i],replace[i]);
	}
	
	return str;
}

//******************************************
// Add or Remove Event to Object
//******************************************
var Hwin = {
	addEvent:function(obj,behave,fn){
		behave = behave.toLowerCase();
		if (behave.substr(0,2) == 'on') behave = behave.substr(2);
		if(window.attachEvent){
			obj[behave+fn] = fn;
			obj.attachEvent('on'+behave,obj[behave+fn]);
		} else if (window.addEventListener){
			obj.addEventListener(behave,fn,false);
		} else {
			obj['on'+behave] = fn;   
		}
	},
	removeEvent:function(obj,behave,fn){
		behave = behave.toLowerCase();
		if (behave.substr(0,2) == 'on') behave = behave.substr(2);
		if(window.detachEvent ) {
			obj.detachEvent ('on'+behave,obj[behave+fn]);
			obj[behave+fn] = null;
		} else if (window.removeEventListener){
			obj.removeEventListener(behave,fn,false);
		} else {
			obj['on'+behave] = null;  
		}  
	}
};
//******************************************
// Get Flash Object
//******************************************
function getFlashMovieObject(movieName) {
	if (window.document[movieName]) {
		return window.document[movieName];
	}
	if (navigator.appName.indexOf("Microsoft")==-1) {
		if (document.embeds && document.embeds[movieName])
			return document.embeds[movieName];
	} else {
		return document.getElementById(movieName);
	}
}
//******************************************
// Format Object key and value
//******************************************
function getObjKV(obj) {
	var k,newValue={};
	for (k in obj) {
		newValue["key"] = k;
		newValue["value"] = obj[k];
	}
	k = null;
	return newValue;
}
//******************************************
// Get Event Object for function
//******************************************
function getEvent(){
	if(flagEX == "IE")    return window.event;        
	var func=getEvent.caller;            
	while(func!=null){    
		var arg0=func.arguments[0];
		if(arg0){
			if((arg0.constructor==Event)
			 || (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){    
			 return arg0;
			}
		}
		func=func.caller;
	}
	func = null;
	return null;
}
//******************************************
// Get&Set Cookie
//******************************************
function setCookie(name,value,expires,path,domain) {
	var expDays = expires*24*60*60*1000;
	var expDate = new Date();
	expDate.setTime(expDate.getTime()+expDays);
	var expString = ((expires==null) ? "" : (";expires="+expDate.toGMTString()));
	var pathString = ((path==null) ? "" : (";path="+path));
	var domainString = ((domain==null) ? "" : (";domain="+domain));
	document.cookie = name + "=" + escape(value) + expString + pathString + domainString;
	expDays = expDate = expString = pathString = domainString = null;
}

function getCookie(name) {
	var result = null;
	var myCookie = document.cookie + ";";
	var searchName = name + "=";
	var startOfCookie = myCookie.indexOf(searchName);
	var endOfCookie;
	if (startOfCookie != -1) {
		startOfCookie += searchName.length;
		endOfCookie = myCookie.indexOf(";",startOfCookie);
		result = unescape(myCookie.substring(startOfCookie, endOfCookie));
	}
	myCookie = searchName = startOfCookie = endOfCookie = null;
	return result;
}

function clearCookie(name) {
	var ThreeDays=3*24*60*60*1000;
	var expDate = new Date();
	expDate.setTime(expDate.getTime()-ThreeDays);
	document.cookie=name+"=;expires="+expDate.toGMTString();
	ThreeDays = expDate = null;
}
/******************************************************************
 * copy or clone object 
 ******************************************************************/
var utilCopy = (function() {
	function copy(obj) {

		if (typeof obj !== 'object' ) {
			return obj;  // non-object have value sematics, so obj is already a copy.
		} else {
			var value = obj.valueOf();
			if (obj != value) { 
				return new obj.constructor(value);
			} else {
				if ( obj instanceof obj.constructor && obj.constructor !== Object ) { 
					var c = clone(obj.constructor.prototype);
					for ( var property in obj) { 
						if (obj.hasOwnProperty(property)) {
							c[property] = obj[property];
						} 
					}
				} else {
					var c = {};
					for ( var property in obj ) c[property] = obj[property];
				}
				
				return c;
			}
		}
	}

	function Clone() { }
	function clone(obj) {
		Clone.prototype = obj;
		return new Clone();
	}

	function chain(base, local) {
		var chain = clone(base);
		for ( key in local ) {
			chain[key] = local[key];
		}
		return chain;
	}

	return { 
		copy:copy,
		clone:clone,
		chain:chain
	};
})();
//******************************************
//Move element new version
//******************************************
var moveElement = (function(){
	var cX,cY,mflag,isOverride;
	var eLeft,eTop,currElement;
	var evt_start,evt_move,evt_stop;
	var dragValue = null;
	function startMove(elm) {
		currElement = typeof(elm) == "string"?$(elm):elm;
		if (typeof arguments[1] == "object") {
			evt_start = arguments[1].start;
			evt_move = arguments[1].move;
			evt_stop = arguments[1].stop;
			isOverride = arguments[1].override||false;
		} else {
			evt_start = evt_move = evt_stop = null;
			isOverride = false;
		}
		
		dragValue = arguments[2]||null;
		
		currElement.onselectstart = function(){
			var evt = getEvent();
			if (flagEX == "IE") {
				evt.cancelBubble = true;
				evt.returnValue = false;
			} else {
				evt.stopPropagation();
				evt.preventDefault();
			}
			evt = null;
			return false;
		};
		
		var evt = getEvent();
		
		cX = evt.clientX;
		cY = evt.clientY;
		eLeft = parseInt(currElement.style.left);
		eTop = parseInt(currElement.style.top);
		eLeft = isNaN(eLeft) ? 0 : eLeft;
		eTop = isNaN(eTop) ? 0 : eTop;
		mflag = true;
		if (typeof evt_start == "function") {
			evt_start(currElement);
		}
		
		if (flagEX == "IE") {
			//currElement.setCapture();
			document.onmousemove = move;
			document.onmouseup = stopMove;
		} else {
			window.onmousemove = move;
			window.onmouseup = stopMove;
			window.onselectstart = function(){return false;};
		}
		evt = null;
	}
	
	function move() {
		var evt = getEvent();
		if (isOverride) {
			if (typeof evt_move == "function" ) {
				evt_move(evt,cX,cY,eLeft,eTop,currElement);
			}
		} else {
			if (mflag) {
				if (typeof evt_move == "function" ) {
					evt_move(evt,cX,cY,eLeft,eTop,currElement);
				}
				currElement.style.top = eTop + (evt.clientY - cY) + "px";
				currElement.style.left = eLeft + (evt.clientX - cX) + "px";
			}
		}
		evt = null;
	}
	
	function stopMove() {
		
		if (flagEX == "IE") {
			document.onmousemove = null;
			//this.releaseCapture();
			document.onmouseup = null;
		} else {
			window.onmousemove = null;
			window.onmouseup = null;
		}
		if (typeof evt_stop == "function") {
			evt_stop(currElement);
		}
		mflag = false;
	}
	
	function getDragValue() {
		return dragValue;
	}
	
	function getStatus() {
		return mflag;
	}
	
	function setEvent(type) {
		if (type == "start") {
			
		} else if (type == "move") {
			
		} else if (type == "stop") {
			
		}
	}
	return {
		startMove:startMove,
		getDragValue:getDragValue,
		getDragStatus:getStatus,
		setEvent:setEvent
	};
})();

//******************************************
// tip management 
//******************************************
var TipManage = (function(){
	var parent = null;
	var tip = null;
	var tip_r = null;
	var tip_content = null;
	var _append = false;
	var _cfg = {};
	init();
	//init
	function init() {
		tip = $C("DIV");
		tip.className = "tip_body";
		tip.style.display = "none";
		
		tip_r = $C("DIV");
		tip_r.className = "tip_c";
		tip.appendChild(tip_r);
		
		tip_content = $C("DIV");
		tip_content.className = "tip_content";
		tip.appendChild(tip_content);
	}
	
	/**
	 * CFG object params
	 * [width]		default: 100
	 * [height]		default: 20
	 * [type]		default:right Value: left,right,up,down
	 * [showType]   defalut:mouse Value: mouse,focus
	 * [content]	
	 */
	function _showTip(elm,cfg) {
		if (!_append) {
			document.body.appendChild(tip);
			_append = true;
		}
//		if (parent == elm) {
//			tip.style.display = "block";
//			return;
//		}
		_cfg["width"] = parseInt(cfg["width"]) || 100;
		_cfg["height"] = parseInt(cfg["height"]) || 20;
		_cfg["type"] = cfg["type"] || "right";
		_cfg["content"] = cfg["content"];
		parent = elm;
		var xy = getElementXY(elm);
		
		tip_content.style.height = _cfg["height"]+"px";
		tip_content.style.width = _cfg["width"]+"px";
		tip_content.innerHTML = _cfg["content"];
		
		tip_r.className = "tip_c tip_"+_cfg["type"];
		if (_cfg["type"] == "right" || _cfg["type"] == "left") {
			tip_r.style.width = "6px";
			tip_r.style.height = "20px";
		} else {
			tip_r.style.width = "20px";
			tip_r.style.height = "6px";
		}
		
		if (_cfg["type"] == "right") {
			tip_r.style.left = "0";
			tip_r.style.top = "0";
			tip_content.style.left = "5px";
			tip_content.style.top = "0";
			
			tip.style.left = (xy["left"] + elm.clientWidth) + "px";
			tip.style.top = xy["top"]+"px";
		} else if (_cfg["type"] == "left") {
			tip_r.style.left = (_cfg["width"]+9)+"px";
			tip_r.style.top = "0";
			tip_content.style.left = "0";
			tip_content.style.top = "0";
			
			tip.style.left = (xy["left"] - (_cfg["width"]+15)) + "px";
			tip.style.top = xy["top"]+"px";
		} else if (_cfg["type"] == "up") {
			tip_r.style.left = "0";
			tip_r.style.top = (_cfg["height"]+9)+"px";
			tip_content.style.left = "0";
			tip_content.style.top = "0";
			
			tip.style.left = xy["left"] + "px";
			tip.style.top = (xy["top"] - (_cfg["height"]+15)) + "px";
		} else if (_cfg["type"] == "down") {
			tip_r.style.left = "0";
			tip_r.style.top = "0";
			tip_content.style.left = "0";
			tip_content.style.top = "5px";
			
			tip.style.left = xy["left"] + "px";
			tip.style.top = (xy["top"] - elm.clientHeight) + "px";
		}
		
		tip.style.display = "block";
		
		xy = null;
	}
	
	function _close() {
		tip.style.display = "none";
	}
	
	return {
		showTip:_showTip,
		close:_close
	};
})();

//******************************************
//convert data to format string
//******************************************
var DataType = (function(){
	function _convertNumber(value,precision) {
		var v = parseFloat(value);
		if (isNaN(v)) {
			return "";
		}
		var negative = v < 0 ? true : false;
		v = roundx(v,precision);
		var val_str = v.toString().split(".");
		var int_str = val_str[0];
		if (negative) {
			int_str = int_str.substr(1);
		}
		var float_str = "";
		if (val_str.length > 1) {
			float_str = val_str[1];
		}
		
		if (precision > 0) {
			float_str = "."+str_pad(float_str,precision,"0","right");
		} else {
			float_str = "";
		}

		var tmp,str_arr = [];
		while (true) {
			if (int_str.length > 3) {
				tmp = int_str.substr(int_str.length-3);
				int_str = int_str.substr(0,int_str.length-3);
				str_arr.splice(0, 0,tmp);
			} else {
				str_arr.splice(0, 0,int_str);
				break;
			}
		}

		v = val_str = val_str = int_str = tmp = null;
		
		return (negative ? "-":"") + str_arr.join(",") + float_str;
	}
	
	return {
		ConvertNumber:_convertNumber
	};
})();

//******************************************
//PHPRPC sync poll array 
//******************************************
var RpcSyncPollArray = function() {
	var funcs = [];
	var status = "stop"; //'none','running','stop'
	function _add() {
		var args = _argsToArray(arguments);
		funcs.push({
			'lib':args[0],
			'func':args[1],
			'params':args.slice(2, args.length-1),
			'callback':args[args.length-1]
		});
		args = null;
	};
	
	function _argsToArray(args) {
		var n = args.length;
        var argArray = new Array(n);
        for (var i = 0; i < n; i++) {
            argArray[i] = args[i];
        }
        return argArray;
	};
	
	function _exec() {
		if (funcs.length > 0) {
			status = "running";
			var p = funcs.shift();
			var lib;
			if (lib = Page.pServer[p.lib]) {
				var param = [];
				for (var i=0;i<p.params.length;i++) {
					param.push("p.params["+i+"]");
				}
				var callback = (function(call){
					return function(result,args,output,warning){
						call(result,args,output,warning);
						_exec();
					};
				})(p.callback);
				eval('lib.invoke(p.func,'+param.join(",")+',callback)');
				param = null;
			}
		} else {
			status = "stop";
		}
	};
	
	function _getStatus() {
		return status;
	};
	
	return {
		add:_add,
		exec:_exec,
		getStatus:_getStatus
	};
};


