/**
 *	Qihoo JavaScript SDK ( Base )
 *	Version 1.0.0.1000 @ 2007-03-16
 *	(C) Qihoo.com
 */


/**
 *	Global qh Object
 */
var QH		= new Object;
var g_this	= this;

//	当前浏览器环境
QH.ua	= window.navigator.userAgent.toLowerCase();
QH.env	=
{
	bDebug		: false,
	bFirefox	: false,
	bOpera		: false,
	bOpera7Up	: false,
	bOpera6Dn	: false,
	bIE		: false,
	bIE4		: false,
	bIE5		: false,
	bIE6		: false,
	bIE7		: false,
	bIE4Up		: false,
	bIE5Up		: false,
	bIE6Up		: false,
	bIE7Up		: false,
	bIEBox		: false,
	bNetscape	: false,
	bMac		: false
};
QH.debug = function( oError, msg )
{
	if ( QH.env.bDebug )
	{
		if ( msg )
			alert( msg );
		else
			alert( oError.description );
	}
}

function qh_set_debug( bDebug )
{
	QH.env.bDebug = bDebug;
}
function qh_isdefine( obj )
{
	return ( "undefined" != typeof obj );
}

//	by llk 2007-03-26
function qh_isset(o) {
	if( null == typeof o || 'undefined' == typeof o ) {
		return false;
	} else {
		return true;
	}
}

function qh_init_env()
{
	try
	{
		if ( window.opera )
		{
			QH.env.bOpera	= true;
			var i = QH.ua.indexOf("opera");
			if ( -1 != i )
			{
				var v = parseInt( QH.ua.charAt( i + 6 ) );
				QH.env.bOpera7Up	= ( v >= 7 );
				QH.env.bOpera6Dn	= ( v < 7 );
			}
		}
		else
		{
			if ( navigator.vendor != "KDE" && document.all && QH.ua.indexOf("msie") != -1 )
			{
				QH.env.bIE4Up	= ( parseFloat( navigator.appVersion ) >= 4 );
				QH.env.bIE5Up	= ( parseFloat( navigator.appVersion ) >= 5 );
				QH.env.bIE6Up	= ( parseFloat( navigator.appVersion ) >= 6 );
				QH.env.bIE7Up	= ( parseFloat( navigator.appVersion ) >= 7 );
				QH.env.bIE4	= ( -1 != QH.ua.indexOf("msie 4") );
				QH.env.bIE5	= ( -1 != QH.ua.indexOf("msie 5") );
				QH.env.bIE6	= ( -1 != QH.ua.indexOf("msie 6") );
				QH.env.bIE7	= ( -1 != QH.ua.indexOf("msie 7") );
				QH.env.bIE	= ( -1 != QH.ua.indexOf("msie") );
			}
			else
			{
				if ( document.layers )
				{
					QH.env.bNetscape = true;
				}
			}
		}
		QH.env.bIEBox	= QH.env.bIE && ( document.compatMode == null || document.compatMode != "CSS1Compat" );
		QH.env.bFirefox	= QH.ua.match(/firefox/) ? true : false;
		QH.env.bMac	= QH.ua.match(/mac/) ? true : false;
	}
	catch(e)
	{}
}
qh_init_env();


/**
 *	获取一个元素对象
 */
function qh_ge()
{
	//
	//	...	- [in] 一个或者多个 ID 参数，例如 qh_ge( 'id1', 'id2' );
	//	RETURN	- e1 / Array( e1, e2 )
	//

	var oRet	= [];
	var sid		= "";
	var i		= 0;
	for ( i = 0; i < arguments.length; i++ )
	{
		sid	= arguments[ i ];
		if ( "object" == typeof( sid ) )
		{
			oRet.push( sid );
		}
		else if ( "string" == typeof( sid ) )
		{
			oRet.push( document.getElementById( sid ) );
		}
		if ( 1 == arguments.length )
		{
			return oRet.length ? oRet[ 0 ] : null;
		}
	}
	return oRet;
}
function $(){ return qh_ge.apply( this, arguments ); }

/**
 *	根据 tagname, className 来获取元素对象 getElementsByClassName
 */
function qh_gce( sTagName, sClsName, oNode )
{
	//
	//	sTagName	- [in] tagname
	//	sClsName	- [in] class name
	//	oNode		- [in] 获取目标，默认是 document
	//	RETURN		- Array( e1, e2 )
	//

	var oRet = [];
	try
	{
		var obj	= oNode ? $( oNode ) : document;
		var arr	= obj.getElementsByTagName( sTagName );
		var i	= 0;
		for ( i = 0; i < arr.length; i++ )
		{
			if ( sClsName == arr[ i ].className )
			{
				oRet[ oRet.length ] = arr[ i ];
			}
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_gce : " + err.description );
	}

	return oRet;
}

/**
 *	设置控件的是否有效
 */
function qh_enable_window( vid, benable )
{
	//
	//	vid		- [in] 元素 ID 或则对象
	//	benable		- [in] 是否有效
	//	RETURN		- void
	//
	try
	{
		var obj	= $( vid );
		if ( obj )
		{
			obj.disabled = ! benable;
		}
		else
		{
			throw new Error( "undefined object" );
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_enable_window : " + err.description );
	}
}
function $ew(){ return qh_get_window_text.apply( this, arguments ); }

/**
 *	获取空间的 TEXT
 */
function qh_get_window_text( vid )
{
	//
	//	vid		- [in] 元素 ID 或则对象
	//	RETURN		- window text
	//
	var stext	= "";
	try
	{
		var obj		= qh_ge( vid );
		var i;
		if ( obj )
		{
			if ( obj.length > 1 )
			{
				//	get the value of radio
				if ( "input" == obj[0].tagName.toLowerCase() &&
					"radio" == obj[0].type.toLowerCase() )
				{
					for ( i = 0; i < obj.length; i ++ )
					{
						if ( obj[i].checked )
						{
							stext	= obj[i].value;
							break;
						}
					}
				}
			}
			else
			{
				switch ( obj.tagName.toLowerCase() )
				{
					case "input" :
					case "button" :
					{
						stext	= obj.value;
						break;
					}
					default :
					{
						//	span/font/td and so on ...
						stext	= obj.innerHTML;
						break;
					}
				}
			}
		}
		else
		{
			throw new Error( "undefined object" );
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_get_window_text : " + err.description );
	}
	return stext;
}
function $gwt(){ return qh_get_window_text.apply( this, arguments ); }

/**
 *	设置空间的 TEXT
 */
function qh_set_window_text( vid, stext, bForceText )
{
	//
	//	vid		- [in]     元素 ID 或则对象
	//	stext		- [in]     需要设置的文本
	//	bForceText 	- [in/opt] 是否强制设置为文本
	//	RETURN		- void
  	//
	try
	{
		var obj	= $( vid );
		if ( obj )
		{
			switch ( obj.tagName.toLowerCase() )
			{
				case "input" :
				case "button" :
				{
					obj.value	= stext;
					break;
				}
				default :
				{
					//	span/font/td and so on ...
					if ( bForceText )
						obj.innerText	= stext;
					else
						obj.innerHTML	= stext;
					break;
				}
			}
		}
		else
		{
			throw new Error( "undefined object" );
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_set_window_text : " + err.description );
	}
}
function $swt(){ return qh_set_window_text.apply( this, arguments ); }

/**
 *	获取样式
 */
function qh_get_class( vid )
{
	//
	//	vid		- [in] 元素 ID 或者对象
	//	RETURN		- class name
  	//
	var sClsName	= "";
	try
	{
		var obj	= $( vid );
		if ( obj )
		{
			sClsName = obj.className;
		}
		else
		{
			throw new Error( "undefined object" );
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_get_class : " + err.description );
	}
	return sClsName;
}
function $gc(){ return qh_get_class.apply( this, arguments ); }

/**
 *	设置样式
 */
function qh_set_class( vid, sClsName )
{
	//
	//	vid		- [in] 元素 ID 或者对象
	//	sClsName	- [in] class name
	//	RETURN		- void
  	//
	try
	{
		var obj	= $( vid );
		if ( obj )
		{
			obj.className	= sClsName;
		}
		else
		{
			throw new Error( "undefined object" );
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_set_class : " + err.description );
	}
}
function $sc(){ return qh_set_class.apply( this, arguments ); }

/**
 *	为控件添加样式
 */
function qh_add_class( vid, sClsName )
{
	//
	//	vid		- [in] object / object id
	//	sClsName	- [in] class name
	//	RETURN		- void
	//
	try
	{
		var obj = $( vid );
		var sCls = "";
		if ( obj )
		{
			sCls = " " + obj.className + " ";
			if ( -1 == sCls.indexOf( " " + sClsName + " " ) )
			{
				obj.className = ( obj.className + ( obj.className.length ? " " : "" ) + sClsName );
			}
		}
		else
		{
			throw new Error( "undefined object" );
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_set_class : " + err.description );
	}
}
function $ac(){ return qh_add_class.apply( this, arguments ); }

/**
 *	删除控件的某些样式
 */
function qh_rm_class( vid, sClsName )
{
	//
	//	vid		- [in] object / object id
	//	sClsName	- [in] class name
	//	RETURN		- void
	//
	try
	{
		var obj = $( vid );
		var sCls = "";
		var arr = [];
		var tmp = [];
		var i	= 0;
		if ( obj && obj.className && obj.className.length )
		{
			sCls = " " + obj.className + " ";
			if ( -1 != sCls.indexOf( " " + sClsName + " " ) )
			{
				arr = obj.className.split( " " );
				tmp = [];
				for ( i = 0; i < arr.length; i ++ )
				{
					if ( sClsName != arr[i] )
					{
						tmp[ tmp.length ] = arr[i];
					}
				}
				obj.className = tmp.join( " " );
			}
		}
		else
		{
			throw new Error( "undefined object" );
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_set_class : " + err.description );
	}
}
function $rc(){ return qh_rm_class.apply( this, arguments ); }

/**
 *	显示某个控件
 */
function qh_show_window( vid, bShow, oPoint )
{
	//
	//	vid		- [in] object / object id
	//	bShow		- [in] 是否显示
	//	oPoint		- [in/opt] 设置对象的显示位置
	//	RETURN		- void
	//
	try
	{
		var obj	= $( vid );
		if ( obj )
		{
			if ( bShow )
			{
				obj.style.display = "";
				if ( oPoint )
				{
					qh_set_window_point( vid, oPoint );
				}
			}
			else
			{
				obj.style.display = "none";
			}
		}
		else
		{
			throw new Error( "undefined object" );
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_show_window : " + err.description );
	}
}
function $sw(){ return qh_show_window.apply( this, arguments ); }

/**
 *	获取某个控件是否显示
 */
function qh_is_window_show( vid )
{
	//
	//	vid	- [in] 元素 ID 或则对象
	//	RETURN	- true / false
	//
	var bShow	= false;
	try
	{
		var obj	= $( vid );
		if ( obj )
		{
			if ( "none" == obj.style.display )
			{
				bShow = false;
			}
			else
			{
				bShow = true;
			}
		}
		else
		{
			throw new Error( "undefined object" );
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_show_window : " + err.description );
	}

	return bShow;
}
function $iws(){ return qh_is_window_show.apply( this, arguments ); }


/**
 *	设置聚焦
 */
function qh_set_window_focus( vid, nIndex )
{
	//
	//	vid		- [in] 元素 ID 或则对象
	//	nIndex		- [in] 如果元素 ID 是个数组，指定要聚焦第几个，0开始
	//	RETURN		- void
	//
	try
	{
		var obj	= null;
		if ( "object" == typeof( vid ) )
		{
			obj	= vid;
		}
		else
		{
			if ( nIndex && nIndex > 0 )
			{
				obj	= document.all( vid )[ nIndex ];
			}
			else
			{
				obj	= $( vid );
			}
		}
		if ( obj )
		{
			obj.select();
			obj.focus();
		}
		else
		{
			throw new Error( "undefined object" );
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_set_window_focus : " + err.description );
	}
}
function $swf(){ return qh_set_window_focus.apply( this, arguments ); }

/**
 *	get windod client size
 */
function qh_get_window_client_size()
{
	var nWidth = 0, nHeight = 0;
	try
	{
		if ( "number" == typeof( window.innerWidth ) )
		{
			nWidth	= window.innerWidth;
			nHeight = window.innerHeight;
		}
		else
		{
			if ( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
			{
				nWidth	= document.documentElement.clientWidth;
				nHeight	= document.documentElement.clientHeight;
			}
			else if ( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
			{
				nWidth	= document.body.clientWidth;
				nHeight	= document.body.clientHeight;
			}
		}
	}
	catch(err)
	{
		VW.debug( err, "error in vw_get_window_client_size : " + err.description );
	}
	return { width : nWidth, height: nHeight };
}
function $gwcs(){ return qh_get_window_client_size.apply( this, arguments ); }

/**
 *	get scroll size
 */
function qh_get_window_scroll_size()
{
	var nWidth = 0, nHeight = 0;
	try
	{
		if ( "number" == typeof( window.innerWidth ) )
		{
			nWidth	= window.innerWidth;
			nHeight = window.innerHeight;
		}
		else
		{
			if ( document.documentElement && ( document.documentElement.scrollWidth || document.documentElement.scrollHeight ) )
			{
				nWidth	= document.documentElement.scrollWidth;
				nHeight	= document.documentElement.scrollHeight;
			}
			else if ( document.body && ( document.body.scrollWidth || document.body.scrollHeight ) )
			{
				nWidth	= document.body.scrollWidth;
				nHeight	= document.body.scrollHeight;
			}
		}
	}
	catch(err)
	{
		VW.debug( err, "error in vw_get_window_client_size : " + err.description );
	}
	return { width : nWidth, height: nHeight };
}
function $gwcs(){ return qh_get_window_scroll_size.apply( this, arguments ); }


/**
 *	get window point
 */
function qh_get_window_point( vid )
{
	//
	//	vid	- [in] 元素 ID 或则对象
	//	RETURN	- { top:, left:, width:, height: }
	//

	function getBorderLeft( el )
	{
		return QH.env.bIE ? el.clientLeft : parseInt( window.getComputedStyle( el, null ).getPropertyValue( "border-left-width" ) );
	}
	function getInnerLeft( el )
	{
		if ( el == null )
		{
			return 0;
		}
		if ( QH.env.bIEBox && el == document.body || ! QH.env.bIEBox && el == document.documentElement )
		{
			return 0;
		}
		return getLeft( el ) + getBorderLeft( el );
	}
	function getLeft( el )
	{
		if ( el == null )
		{
			return 0;
		}
		return el.offsetLeft + getInnerLeft( el.offsetParent );
	}
	function getInnerTop( el )
	{
		if ( el == null )
		{
			return 0;
		}
		if ( QH.env.bIEBox && el == document.body || ! QH.env.bIEBox && el == document.documentElement )
		{
			return 0;
		}
		return getTop( el ) + getBorderTop( el );
	}
	function getBorderTop( el )
	{
		return QH.env.bIE ? el.clientTop : parseInt( window.getComputedStyle( el, null ).getPropertyValue( "border-top-width" ) );
	}
	function getTop( el )
	{
		if ( el == null )
		{
			return 0;
		}
		return el.offsetTop + getInnerTop( el.offsetParent );
	}

	var obj = null;
	var oRet = { top: 0, left: 0, width: 0, height: 0 };
	try
	{
		obj = $( vid );
		if ( obj )
		{
			oRet = { top: getTop( obj ), left: getLeft( obj ), width: obj.offsetWidth, height: obj.offsetHeight };
		}
		else
		{
			throw new Error( "undefined object" );
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_get_window_point : " + err.description );
	}

	return oRet;
}
function $gwp(){ return qh_get_window_point.apply( this, arguments ); }

/**
 *	set window point
 */
function qh_set_window_point( vid, oPoint )
{
	//
	//	vid	- [in] 元素 ID 或则对象
	//	oPoint	- { top:, left:, width:, height: }
	//	RETURN	- void
	//
	try
	{
		var obj	= $( vid );
		if ( obj && oPoint )
		{
			obj.style.left	= oPoint.left + "px";
			obj.style.top	= oPoint.top + "px";
		}
		else
		{
			throw new Error( "undefined object" );
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_set_window_point : " + err.description );
	}
}
function $swp(){ return qh_set_window_point.apply( this, arguments ); }

/**
 *	打开一个中间窗口
 */
function qh_window_open( sUrl, nWidth, nHeight, bNewWin, bCenter )
{
	//
	//	sUrl		- [in]     URL
	//	nWidth		- [in]     宽
	//	nHeight		- [in]     高
	//	bNewWin		- [in/opt] 是否新窗口
	//	bCenter		- [in/opt] 是否居中
	//	RETURN		- window object / null
	//
	if ( sUrl && sUrl.length > 7 )
	{
		if ( bCenter )
		{
			var nleft = screen.width / 2 - nWidth / 2;
			var ntop  = screen.Height / 2 - nHeight / 2;
			return window.open( sUrl, bNewWin ? "_blank" : "_self", "height=" + nHeight + ",width=" + nWidth + ",left=" + nleft + ",top=" + ntop + ",status=yes,toolbar=no,menubar=no,location=no" );
		}
		else
		{
			return window.open( sUrl, bNewWin ? "_blank" : "_self" );
		}
	}
	return null;
}
function $wo(){ return qh_window_open.apply( this, arguments ); }

/**
 *	attach event
 */
function qh_event_attach( vid, sEventName, pfnEventProc )
{
	//
	//	vid		- [in] 元素 ID 或者对象
	//	sEventName	- [in] 事件名称
	//	pfnEventProc	- [in] 事件处理函数
	//
	try
	{
		var obj	= $( vid );
		if ( obj )
		{
			if ( window.ActiveXObject )
			{
				obj.attachEvent( "on" + sEventName, pfnEventProc );
			}
			else
			{
				obj.addEventListener( sEventName, pfnEventProc, false );
			}
		}
		else
		{
			throw new Error( "undefined object" );
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_event_attach : " + err.description );
	}
}
function $ea(){ return qh_event_attach.apply( this, arguments ); }

/**
 *	detach event
 */
function qh_event_detach( vid, sEventName, pfnEventProc )
{
	//
	//	vid		- [in] 元素 ID 或者对象
	//	sEventName	- [in] 事件名称
	//	pfnEventProc	- [in]
	//
	try
	{
		var obj	= $( vid );
		if ( obj )
		{
			if ( window.ActiveXObject )
			{
				obj.detachEvent( "on" + sEventName, pfnEventProc );
			}
			else
			{
				obj.removeEventListener( sEventName, pfnEventProc, false );
			}
		}
		else
		{
			throw new Error( "undefined object" );
		}
	}
	catch(err)
	{
		QH.debug( err, "error in qh_event_detach : " + err.description );
	}
}
function $ed(){ return qh_event_detach.apply( this, arguments ); }

/**
 *	转向指定 URL
 */
function qh_rd( sUrl, nTimeout )
{
	//
	//	sUrl		- [in] URL
	//	nTimeout	- [in] Timeout
	//
	setTimeout( "window.location.href='" + sUrl + "';", nTimeout ? nTimeout : 0 );
}

/**
 *	显示 body 的滚动条
 */
function qh_show_body_scrollbar( bShow )
{
	window.document.body.scroll = bShow ? "yes" : "no";
}


////////////////////////////////////////////////////////////////////////////////
//	字符串处理

function qh_left_trim( str )
{
	return str.replace( /^[\s\t\r\n]*/, "" );
}
function qh_right_trim( str )
{
	return str.replace( /[\s\t\r\n]*$/, "" );
}
function qh_trim( str )
{
	return qh_right_trim( qh_left_trim( str ) );
}





////////////////////////////////////////////////////////////////////////////////



/**
 *	Qihoo Md5 Class
 *	Liuqixing @ 2006-11-04
 */
function CQhMd5()
{
	/**
	 *	@ Public
	 *	Get Md5 Hash Value
	 */
	this.getMd5 = function( str )
	{
		return hex_md5( str );
	};

	/**
	 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
	 * Digest Algorithm, as defined in RFC 1321.
	 * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
	 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
	 * Distributed under the BSD License
	 * See http://pajhome.org.uk/crypt/md5 for more info.
	 */

	/**
	 * Configurable variables. You may need to tweak these to be compatible with
	 * the server-side, but the defaults work in most cases.
	 */
	var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
	var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
	var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */

	/**
	 * These are the functions you'll usually want to call
	 * They take string arguments and return either hex or base-64 encoded strings
	 */
	function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
	function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
	function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
	function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
	function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
	function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }

	/**
	 * Perform a simple self-test to see if the VM is working
	 */
	function md5_vm_test()
	{
		return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
	}

	/**
	 * Calculate the MD5 of an array of little-endian words, and a bit length
	 */
	function core_md5(x, len)
	{
		/* append padding */
		x[len >> 5] |= 0x80 << ((len) % 32);
		x[(((len + 64) >>> 9) << 4) + 14] = len;

		var a =  1732584193;
		var b = -271733879;
		var c = -1732584194;
		var d =  271733878;

		for(var i = 0; i < x.length; i += 16)
		{
			var olda = a;
			var oldb = b;
			var oldc = c;
			var oldd = d;

			a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
			d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
			c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
			b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
			a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
			d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
			c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
			b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
			a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
			d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
			c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
			b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
			a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
			d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
			c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
			b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);

			a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
			d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
			c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
			b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
			a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
			d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
			c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
			b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
			a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
			d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
			c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
			b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
			a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
			d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
			c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
			b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);

			a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
			d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
			c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
			b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
			a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
			d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
			c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
			b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
			a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
			d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
			c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
			b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
			a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
			d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
			c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
			b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);

			a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
			d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
			c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
			b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
			a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
			d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
			c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
			b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
			a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
			d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
			c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
			b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
			a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
			d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
			c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
			b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);

			a = safe_add(a, olda);
			b = safe_add(b, oldb);
			c = safe_add(c, oldc);
			d = safe_add(d, oldd);
		}
		return Array(a, b, c, d);

	}

	/*
	* These functions implement the four basic operations the algorithm uses.
	*/
	function md5_cmn(q, a, b, x, s, t)
	{
		return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
	}
	function md5_ff(a, b, c, d, x, s, t)
	{
		return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
	}
	function md5_gg(a, b, c, d, x, s, t)
	{
		return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
	}
	function md5_hh(a, b, c, d, x, s, t)
	{
		return md5_cmn(b ^ c ^ d, a, b, x, s, t);
	}
	function md5_ii(a, b, c, d, x, s, t)
	{
		return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
	}

	/*
	* Calculate the HMAC-MD5, of a key and some data
	*/
	function core_hmac_md5(key, data)
	{
		var bkey = str2binl(key);
		if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);

		var ipad = Array(16), opad = Array(16);
		for(var i = 0; i < 16; i++)
		{
			ipad[i] = bkey[i] ^ 0x36363636;
			opad[i] = bkey[i] ^ 0x5C5C5C5C;
		}

		var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
		return core_md5(opad.concat(hash), 512 + 128);
	}

	/*
	* Add integers, wrapping at 2^32. This uses 16-bit operations internally
	* to work around bugs in some JS interpreters.
	*/
	function safe_add(x, y)
	{
		var lsw = (x & 0xFFFF) + (y & 0xFFFF);
		var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
		return (msw << 16) | (lsw & 0xFFFF);
	}

	/*
	* Bitwise rotate a 32-bit number to the left.
	*/
	function bit_rol(num, cnt)
	{
		return (num << cnt) | (num >>> (32 - cnt));
	}

	/*
	* Convert a string to an array of little-endian words
	* If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
	*/
	function str2binl(str)
	{
		var bin = Array();
		var mask = (1 << chrsz) - 1;
		for(var i = 0; i < str.length * chrsz; i += chrsz)
		bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
		return bin;
	}

	/*
	* Convert an array of little-endian words to a string
	*/
	function binl2str(bin)
	{
		var str = "";
		var mask = (1 << chrsz) - 1;
		for(var i = 0; i < bin.length * 32; i += chrsz)
		str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
		return str;
	}

	/*
	* Convert an array of little-endian words to a hex string.
	*/
	function binl2hex(binarray)
	{
		var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
		var str = "";
		for(var i = 0; i < binarray.length * 4; i++)
		{
			str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
			hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
		}
		return str;
	}

	/*
	* Convert an array of little-endian words to a base-64 string
	*/
	function binl2b64(binarray)
	{
		var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
		var str = "";
		for(var i = 0; i < binarray.length * 4; i += 3)
		{
			var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
			| (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
			|  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
			for(var j = 0; j < 4; j++)
			{
				if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
				else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
			}
		}
		return str;
	}
}





// 2006-11-02 10:56
// Last Function: divdispbtn

QHK = function() {

}

// 检测浏览器类型
var nav = navigator.userAgent.toLowerCase();
QHK.is_ie = ( ( nav.indexOf( "msie" ) != -1 ) || ( nav.indexOf( "opera" ) != -1 ) );

// 公用函数 开始
QHK.getAbsolutePos = function(el) {
	var r = { x: el.offsetLeft, y: el.offsetTop };
	if (el.offsetParent) {
		var tmp = QHK.getAbsolutePos(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
};

QHK.isRelated = function (el, evt) {
	var related = evt.relatedTarget;
	if (!related) {
		var type = evt.type;
		if (type == "mouseover") {
			related = evt.fromElement;
		} else if (type == "mouseout") {
			related = evt.toElement;
		}
	}
	while (related) {
		if (related == el) {
			return true;
		}
		related = related.parentNode;
	}
	return false;
};

QHK.removeClass = function(el, className) {
	if (!(el && el.className)) {
		return;
	}
	var cls = el.className.split(" ");
	var ar = new Array();
	for (var i = cls.length; i > 0;) {
		if (cls[--i] != className) {
			ar[ar.length] = cls[i];
		}
	}
	el.className = ar.join(" ");
};

QHK.addClass = function(el, className) {
	QHK.removeClass(el, className);
	el.className += " " + className;
};

QHK.getElement = function(ev) {
	if (QHK.is_ie) {
		return window.event.srcElement;
	} else {
		return ev.currentTarget;
	}
};

QHK.getTargetElement = function(ev) {
	if (QHK.is_ie) {
		return window.event.srcElement;
	} else {
		return ev.target;
	}
};

QHK.stopEvent = function(ev) {
	if (QHK.is_ie) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	} else {
		ev.preventDefault();
		ev.stopPropagation();
	}
};

QHK.addEvent = function(el, evname, func) {
	if (QHK.is_ie) {
		el.attachEvent("on" + evname, func);
	} else {
		el.addEventListener(evname, func, true);
	}
};

QHK.removeEvent = function(el, evname, func) {
	if (QHK.is_ie) {
		el.detachEvent("on" + evname, func);
	} else {
		el.removeEventListener(evname, func, true);
	}
};

QHK.createElement = function(type, parent) {
	var el = null;
	if (document.createElementNS) {
		// use the XHTML namespace; IE won't normally get here unless
		// _they_ "fix" the DOM2 implementation.
		el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
	} else {
		el = document.createElement(type);
	}
	if (typeof parent != "undefined") {
		parent.appendChild(el);
	}
	return el;
};

QHK.makeElement = function(type) {
	var el = null;
	if (document.createElementNS) {
		// use the XHTML namespace; IE won't normally get here unless
		// _they_ "fix" the DOM2 implementation.
		el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
	} else {
		el = document.createElement(type);
	}
	return el;
};

QHK.centerElement = function(el, parent) {
	var t = parent ? parent : document.body;
	var r = { width:el.offsetWidth, height:el.offsetHeight };
	var p = { width:t.offsetWidth, height:t.offsetHeight };
	var e = { left: Math.abs( p.width - r.width ) / 2, top: Math.abs( p.height - r.height ) / 2 }
	el.style.left = e.left + "px";
	el.style.top = e.top + "px";
	return r;
};

// 公用函数 结束

function add_class( el, classname ) {
	QHK.addClass( el, classname );
}

function remove_class( el, classname ) {
	QHK.removeClass( el, classname );
}

function add_event( el, evname, func ) {
	QHK.addEvent( el, evname, func );
}

// 在 p 上添加新的子结点，t 为字节点的类型，如 table
function create_element( p, t ) {
	return	QHK.createElement( t, p );
}

// 在 p 上添加新的文本结点，t 为文本
function add_text( p, txt ) {
	var el = null;
	el = document.createTextNode(txt);;
	p.appendChild(el);
	return el;
}

// 在 p 上添加新的子结点，t 为字节点的类型，如 table
function add_element( p, t ) {
	return	QHK.createElement( t, p );
}

// 创建结点，t 为字节点的类型，如 table
function make_element( t ) {
	return	QHK.makeElement( t );
}

function append_element( p, el ) {
	if (typeof p != "undefined") {
		p.appendChild(el);
	}
	return el;
}

// 返回当前结点对象
function get_element( e ) {
	return	QHK.getElement( e );
}

/*
 * 生成表格，包括 table 结点和 tbody 结点
 * p_node	表格的父结点
 * table_id	表格ID
 * arr_info	表格数据，二维数组
 * callback_col	生成每个行结点的处理函数，接受2个参数( 数据数组, 单元索引 )
 */
function show_table( p_node, table_id, arr_info, callback_row ) {

	var i, table, tbody, rows, row, col;

	rows	= arr_info.length;
	table	= add_element( p_node,	"table" );
	tbody	= add_element( table,	"tbody" );

	table.setAttribute( "id", table_id );

	return	show_tbody( tbody, callback_row, arr_info, rows );;

}

/*
 * 生成 tbody 结点的子结点
 * callback_row	生成每个行结点的处理函数，接受2个参数( 数据数组, 单元索引 )
 * arr_info	表格数据，二维数组
 * rows		显示的数据数量
 */
function show_tbody( tbody, callback_row, arr_info, rows ) {

	var row = null;

	for( i = 0; i < rows; i++ ) {
		row	= callback_row( arr_info[i], i );
		append_element( tbody, row );
	}

	return tbody;

}

function insert_row( tbody, row, pos ) {
	var o;
	if( tbody && row ) {
		o = tbody.childNodes[pos];
		if( o ) {
			tbody.insertBefore( row, o );
		} else {
			tbody.appendChild( row );
		}
		//alert( tbody.childNodes[pos].innerHTML );
	}
}

function _ge(a) {
	return document.getElementById ? document.getElementById(a) : null;
}

function _gt(a,t) {
	var o = _ge(a);
	return o ? o.getElementsByTagName(t) : null;
}

// 删除 p 结点的单个子结点 n
function remove_child(p, n) {
	if(p && n && p == n.parentNode) {
		p.removeChild(n);
	}
}

// 删除 p_node 结点的所有子结点
function remove_children(p_node) {
	while(p_node.hasChildNodes()) {
		p_node.removeChild(p_node.lastChild);
	}
}

//	2 - 36 进制互转
function base_convert( n, from, to ) {
	var tmp, ret;
	tmp	= parseInt( n, from );
	ret	= tmp.toString( to );
	return	ret;
}

function get_mod(num, b) {
	var t = "";
	if( num < 10 ) {
		t += num;
	} else if ( num < b ) {
		t += String.fromCharCode(num + 87);
	} else {
		t += 0;
	}
	return	t;
}

function convert_36_10( num ) {
	return	parseInt( num, 36 );
}

function convert_10_36( num ) {
	var t = num;
	var base = 36;
	var ret = "";
	var i, d, r;

	do {
		d	= t / base;
		r	= t % base;
		t	= parseInt( d );
		ret	+= get_mod(r, base);
	} while ( t >= base );
	t = get_mod( t, base );
	ret += t ? t : "";
	t	= ret;
	ret	= "";
	for( i = t.length; i > 0; i-- ) {
		ret += t.charAt(i-1);
	}
	return	ret;

}

//Unicode 转 GBK
function unicode_to_gb(str)
{
	var re=/&#[\da-fA-F]{1,5};/ig;
	var arr=str.match(re);
	if(arr==null)return("");
	for(var i=0;i<arr.length;i++) arr[i]=String.fromCharCode(arr[i].replace(/[&#;]/g,""));
	return(arr.toString().replace(/,/g,""))
}

//GBK 转 Unicode
function gb_to_unicode(str)
{
	var arr = new Array();
	for(var i=0;i<str.length;i++) arr[i]="&#" + str.charCodeAt(i) + ";";
	return(arr.toString().replace(/,/g,""));
}

function get_abs_pos(o) {
	return	QHK.getAbsolutePos(o);
}

// 按指定比例重新设置图片尺寸
function izoom( o, scale ) {
	if( o && scale ) {
		var pic_width	= o.width;
		var pic_height	= o.height;
		if ( pic_width > 1 && pic_height > 1 ) {
			o.width		= parseInt( pic_width * scale );
			o.height		= parseInt( pic_height * scale );
		}
	}
}

// 按指定宽、高（px）重新设置图片尺寸
function iresize( o, target_width, target_height ) {
	if( o ) {
		var scale		= null;
		var pic_width	= o.width;
		var pic_height	= o.height;

		var pic_scale	= pic_width / pic_height;
		var target_scale	= target_width / target_height;

		if ( pic_scale >= target_scale ) {
			scale	= target_width / pic_width;
		} else {
			scale	= target_height / pic_height;
		}
		izoom( o, scale );
	}
}

// 按最大宽、搞（px）测量图片，如果有一项超出最大值，则重新设置图片尺寸
function imax( o, max_width, max_height ) {
	if( o && max_width && max_height ) {
		var pic_width	= o.width;
		var pic_height	= o.height;
		if ( pic_width > max_width || pic_height > max_height ) {
			iresize( o, max_width, max_height );
		} else {
		}
	}
}

// 替补图片
function isubstitute( o, surl ) {
	if( o, surl ) {
		o.src = surl;
	}
}

// 合并数组
function array_merge( arr1, arr2 ) {
	if( typeof arr1 == "object" && typeof arr2 == "object" ) {
		var i;
		var ret	= new Array();
		for( i = 0; i < arr1.length; i++ ) {
			ret.push( arr1[i] );
		}
		for( i = 0; i < arr2.length; i++ ) {
			ret.push( arr2[i] );
		}
		return	ret;
	}
}

// 设定一组 div 块的隐藏或显示 支持按 索引 或按 ID 设置显示状态
function divdisp() {
	var i			= 0;
	var m_curr_idx		= 0;
	var m_disp		= "";
	var m_id		= "";
	var m_div_string	= new Array();
	var m_div_array		= new Array();

	this.init = function( n ) {
		m_div_string = n.split( "|" );
		for( i = 0; i < m_div_string.length; i++ ) {
			m_div_array[m_div_array.length] = _ge( m_div_string[i] );
		}
	}

	this.display = function( idx ) {
		m_curr_idx	= idx;
		m_id		= m_div_string[idx];
		this.displayid( m_id );
	}

	this.displayid = function( divid ) {
		for( i = 0; i < m_div_array.length; i++ ) {
			if( m_div_array[i].id == divid ) {
				m_disp	= "";
			} else {
				m_disp	= "none";
			}
			m_div_array[i].style.display	= m_disp;
		}
	}

	this.get_curr_idx = function() {
		return	m_curr_idx;
	}

	this.len = function() {
		return	m_div_array.length;
	}
}

function divdispbtn() {

	var i			= 0;
	var m_active_idx	= 0;
	var m_default_idx	= 0;
	var m_disp		= "";
	var m_id		= "";
	var m_css_over		= "";
	var m_css_out		= "";
	var m_btn_array		= new Array();
	var m_btn_obj		= new Array();
	var m_self		= null;
	var m_func		= null;
	var m_obj		= null;
	var m_tmp		= null;

	// 设置样式 ommouseover = over, onmouseout = out
	this.set_css = function( over, out ) {
		m_css_over	= over;
		m_css_out	= out;
	}

	// 激活当前元素
	this.set_active = function( idx ) {
		m_active_idx	= idx;
		for( i = 0; i < m_btn_obj.length; i++ ) {
			remove_class( m_btn_obj[i], m_css_over );
			remove_class( m_btn_obj[i], m_css_out );
			if( i == m_active_idx ) {
				add_class( m_btn_obj[i], m_css_over );
			} else {
				add_class( m_btn_obj[i], m_css_out );
			}
		}
	}

	// 设置联合函数，与 divdisp 的实例关联
	this.set_action = function ( func, obj ) {
		m_func	= func;
		m_obj	= obj;
	}

	// 初始化，需要传入实例的 指针，和按钮的 id 列表
	this.init = function( myself, n ) {
		m_self		= myself;
		m_btn_array	= n.split( "|" );
		for( i = 0; i < m_btn_array.length; i++ ) {
			m_tmp				= m_btn_obj.length;
			m_btn_obj[m_tmp]		= _ge( m_btn_array[i] );
			add_event( m_btn_obj[m_tmp], "click", this.click );
			add_event( m_btn_obj[m_tmp], "mouseover", this.over );
			add_event( m_btn_obj[m_tmp], "mouseout", this.out );
		}
	}

	this.click = function( event ) {
		i	= m_self.get_idx( event );
		m_self.set_active(i);
		if( m_func && m_obj ) {
			m_func( m_obj, m_active_idx );
		}
	}

	this.over = function( event ) {
		i	= m_self.get_idx( event );

		if( i == m_active_idx ) {
			return;
		}

		remove_class( m_btn_obj[i], m_css_over );
		remove_class( m_btn_obj[i], m_css_out );
		add_class( m_btn_obj[i], m_css_over );

	}

	this.out = function( event ) {
		i	= m_self.get_idx( event );

		if( i == m_active_idx ) {
			return;
		}

		remove_class( m_btn_obj[i], m_css_over );
		remove_class( m_btn_obj[i], m_css_out );
		add_class( m_btn_obj[i], m_css_out );
	}

	this.get_idx = function( event ) {
		var e		= get_element( event );
		var idx		= m_self.id_to_idx( e.id );
		return		idx;
	}

	this.id_to_idx = function( str_id ) {
		for( i = 0; i < m_btn_array.length; i++ ) {
			if( str_id == m_btn_array[i] ) {
				return	i;
			}
		}
	}
}

// 返回某个范围内的值，就近取边界值，需要预先对 m_var 进行类型转换
function default_range( m_var, m_min, m_max, auto ) {
	if( m_var < m_min ) {
		return	auto ? m_max : m_min;
	} else if( m_var > m_max ) {
		return	auto ? m_min : m_max;
	} else {
		return	m_var;
	}
}

// 获取 url 中的参数，不支持 form 编码
function url_decode( str ) {
    return	decodeURI( str );
}

function url_request( n ) {
	var i, tmp, qs_tmp;
	var ret		= "";
	var m_href	= window.location.href;
	var m_ppos	= m_href.indexOf( "?" );
	var m_qs	= m_href.substr( m_ppos + 1 );

	tmp		= m_qs.split( "&" );
	for( i = 0; i < tmp.length; i++ ) {
		qs_tmp	= tmp[i].split( "=" );
		if( qs_tmp[0].toUpperCase() == n.toUpperCase() ) {
			ret	= url_decode( qs_tmp[1] );
		}
	}
	return		ret;
}

var static_level = 0;
function DumpObject() {

	var br		= "";
	var tab		= "";
	var arr		= " => ";

	this.make = function( object, indent ) {

		if( static_level < 10 ) {
		} else {
			return;
		}

		if( "string" == typeof indent ) {
			indent	+= this.tab;
		} else {
			indent	= this.tab;
		}

		if( "object" != typeof object ) {return object;}

		var ret		= "Array (" + this.br;

		for( val in object ) {
			if( "string" == typeof val ) {
				if( "object" == typeof object[val] ) {
					static_level++;
					ret	+= this.br + indent + val + arr + this.make( object[val], indent + this.tab ) + this.br;
					static_level--;
				} else {
					ret	+= indent + val + this.tab + arr + object[val] + "," + this.br;
				}
			}
		}
		return	ret + indent + ")";
	}

	this.print = function( object ) {
		this.br		= "<br />";
		this.tab	= "    ";
		var out		= this.make( object );
		document.write( '<pre style="font-family:Verdana; font-size:14px;">' );
		document.write( out );
		document.write( '</pre>' );
	}

	this.alert = function( object ) {
		this.br		= "\n";
		this.tab	= "  ";
		var out	= this.make( object );
		alert( out );
	}
}