function CodeEncode(str)
{
	var res='';
	for(var i=0;i<str.length;i++)
	{
		var c=str.charCodeAt(i).toString(16);
		while(c.length<4)c='0'+c;
		res+='\\u'+c;
	}
	return res;
}


/****************************************************************\
	Cookie Functions
\****************************************************************/


function SetCookie(name,value,seconds)
{
	var cookie=name+"="+escape(value)+"; path=/;";
	if(seconds)
	{
		var d=new Date();
		d.setSeconds(d.getSeconds()+seconds);
		cookie+=" expires="+d.toUTCString()+";";
	}
	document.cookie=cookie;
}
function GetCookie(name)
{
	var cookies=document.cookie.split(';');
	for(var i=0;i<cookies.length;i++)
	{
		var parts=cookies[i].split('=');
		if(name==parts[0].replace(/\s/g,''))
			return unescape(parts[1])
	}
	//return undefined..
}
function GetCookieDictionary()
{
	var dict={};
	var cookies=document.cookie.split(';');
	for(var i=0;i<cookies.length;i++)
	{
		var parts=cookies[i].split('=');
		dict[parts[0].replace(/\s/g,'')]=unescape(parts[1]);
	}
	return dict;
}
function GetCookieArray()
{
	var arr=[];
	var cookies=document.cookie.split(';');
	for(var i=0;i<cookies.length;i++)
	{
		var parts=cookies[i].split('=');
		var cookie={name:parts[0].replace(/\s/g,''),value:unescape(parts[1])};
		arr[arr.length]=cookie;
	}
	return arr;
}



/****************************************************************\
	Position Functions
\****************************************************************/
//get the position of a element ( by the scroll offset )
function GetScrollPostion(e)
{
	var b=window.document.body;
	var p=b;
	if(window.document.compatMode=='CSS1Compat')
	{
		p=window.document.documentElement;
	}
	
	if(e==b)return {left:0,top:0};
	
	try
	{
		if(e.getBoundingClientRect)
		{
			with(e.getBoundingClientRect())
			{
				return {left:p.scrollLeft+left,top:p.scrollTop+top};
			}
		}
	}
	catch(x)
	{
		//IE5..
	}
	
	var l=0;
	var t=0;
	for(var e1=e;e1!=null&&e1!=b;e1=e1.offsetParent)
	{
		l+=e1.offsetLeft;
		t+=e1.offsetTop;
	}
	return {left:l,top:t}
}

//get the position of a element ( by the client offset )
function GetClientPosition(e)
{
	var b=window.document.body;
	var p=b;
	if(window.document.compatMode=='CSS1Compat')
	{
		p=window.document.documentElement;
	}
	
	if(e==b)return {left:-p.scrollLeft,top:-p.scrollTop};
	
	if(e.getBoundingClientRect)
	{
		with(e.getBoundingClientRect())
		{
			return {left:left-p.clientLeft,top:top-p.clientTop};
		}
	}
	
	var l=0;
	var t=0;
	for(var e1=e;e1!=null&&e1!=b;e1=e1.offsetParent)
	{
		l+=e1.offsetLeft;
		t+=e1.offsetTop;
	}
	return {left:l-b.scrollLeft,top:t-b.scrollTop}
}
//get absolute or relative parent
function GetStandParent(e)
{
	if(e.currentStyle)
	{
		for(var pe=e.parentElement;pe!=null;pe=pe.parentElement)
		{
			var sp=pe.currentStyle.position;
			if(sp=='absolute'||sp=='relative')
				return pe;
		}
	}
	else
	{
		var view=e.ownerDocument.defaultView;
		for(var pe=e.parentNode;pe!=null&&pe.nodeType==1;pe=pe.parentNode)
		{
			var sp=view.getComputedStyle(pe, '').getPropertyValue("position")
			if(sp=='absolute'||sp=='relative')
				return pe;
		}
	}
	return (e.ownerDocument||e.document).body;
}
//calc the position of floate that relative to e
function CalcPosition(floate,e)
{
	//var b=window.document.body;
	var epos=GetScrollPostion(e);
	var spos=GetScrollPostion(GetStandParent(floate));
	var s=GetStandParent(floate);
	return {left:epos.left-spos.left-(s.clientLeft||0),top:epos.top-spos.top-(s.clientTop||0)};
}

//get the best position to put the floate
function AdjustMirror(floate,e,pos)
{
	//c:Client,f:floate,e:e,p:floate's StandParent,m:Mirror

	//get the size of window
	var cw=window.document.body.clientWidth;
	var ch=window.document.body.clientHeight;
	if(window.document.compatMode=='CSS1Compat')
	{
		cw=window.document.documentElement.clientWidth;
		ch=window.document.documentElement.clientHeight;
	}
	
	if(ch<200)
	{
		//for the FireFox popup bug
		if(typeof(XMLHttpRequest)!="undefined")
		{
			var sizingPanel=document.createElement("DIV");
			sizingPanel.style.cssText="position:absolute;width:100%;height:100%;top:0px;left:0px;";
			document.body.appendChild(sizingPanel);
			cw=sizingPanel.offsetWidth;
			ch=sizingPanel.offsetHeight;
			document.body.removeChild(sizingPanel);
		}
	}
	
	//get the size of float element
 	var fw=floate.offsetWidth;
	var fh=floate.offsetHeight;
	
	var pcpos=GetClientPosition(GetStandParent(floate));
	
	//get the center of float element
	var fmpos={left:pcpos.left+pos.left+fw/2,top:pcpos.top+pos.top+fh/2};//

	var empos={left:pcpos.left+pos.left,top:pcpos.top+pos.top};

	if(e!=null)
	{
		var ecpos=GetClientPosition(e);
		
		//get the center of the relative element
		empos={left:ecpos.left+e.offsetWidth/2,top:ecpos.top+e.offsetHeight/2};//
	}
	
	var allowmove=true;
 
	//left<-->right

	if(fmpos.left-fw/2<0)
	{
		if((empos.left*2-fmpos.left)+fw/2<=cw)
		{
			fmpos.left=empos.left*2-fmpos.left;
		}
		else if(allowmove)
		{
			fmpos.left=fw/2+4;
		}
	}
	else if(fmpos.left+fw/2>cw)
	{
		if((empos.left*2-fmpos.left)-fw/2>=0)
		{
			fmpos.left=empos.left*2-fmpos.left;
		}
		else if(allowmove)
		{
			fmpos.left=cw-fw/2-4;
		}
	}
	

	//top<-->bottom

	if(fmpos.top-fh/2<0)
	{
		if((empos.top*2-fmpos.top)+fh/2<=ch)
		{
			fmpos.top=empos.top*2-fmpos.top;
		}
		else if(allowmove)
		{
			fmpos.top=fh/2+4;
		}
	}
	else if(fmpos.top+fh/2>ch)
	{
		if((empos.top*2-fmpos.top)-fh/2>=0)
		{
			fmpos.top=empos.top*2-fmpos.top;
		}
		else if(allowmove)
		{
			fmpos.top=ch-fh/2-4;
		}
	}
 
	pos.left=fmpos.left-pcpos.left-fw/2;
	pos.top=fmpos.top-pcpos.top-fh/2;
}

/****************************************************************\
	Prototype
\****************************************************************/

function Element_GetText()
{
	var r = this.ownerDocument.createRange();
	r.selectNodeContents(this);
	return r.toString();
}

if( typeof(Element)!="undefined")
{
	if(Element.prototype.__defineGetter__)
	{
		Element.prototype.__defineGetter__("text",Element_GetText);
		Element.prototype.__defineGetter__("innerText",Element_GetText);
	}
	else
	{
	}
}

function _showmsg(message)
{
	var msg={};
	msg.MessageType="LOCAL";
	msg.MessageCss="User";
	msg.MessageHtml=message;
	_InvokeChatEvent("MESSAGE",["MESSAGE","NEW",msg]);
}


var __active_element;
function __active_element_focus()
{
	window.__isblur=false;
}
function __active_element_blur()
{
	window.__isblur=true;
}
if(document.attachEvent)
{
	document.attachEvent("onactivate",function(){
		__active_element=document.activeElement;
		if(!__active_element)return;
		__active_element.attachEvent("onfocus",__active_element_focus);
		__active_element.attachEvent("onblur",__active_element_blur);
	});
	document.attachEvent("ondeactivate",function(){
		if(!__active_element)return;
		__active_element.detachEvent("onfocus",__active_element_focus);
		__active_element.detachEvent("onblur",__active_element_blur);
		__active_element=null;
	});
}
else
{
	document.addEventListener("focus",__active_element_focus,true);
	document.addEventListener("blur",__active_element_blur,true);
}
function GetWindowIsFocus()
{
	return window.__isblur?false:true;
}
function FocusWindow()
{
	var e=__active_element;
	//TODO: FireFox doesn't work?
	window.focus();
	if(e && e.focus )
	{
		try
		{
			e.focus();
		}
		catch(x)
		{
		}
	}
}

