// 以下脚本在客户端运行
// 使用时在<head>中包含
// <script language=jscript src="/cmis20/javascripts/funcbase.js"></script>

//正则表达式检验是否全由数字组成
//为了美观，不要报错,开发时屏蔽下面两条语句，发布时打开
//function killerr(){return true;}
//window.onerror = killerr;

function isDigit(s)
{
	var patrn=/^[0-9]{1,20}$/;
	if (!patrn.exec(s))
		return false
	return true
}

//处理时间中的.。/-
function fun_convertDate(obj)
{
	if( typeof(obj)=="object" )
	{
		var str = obj.value;
		var ret="";
		//处理时间中的.。/-
		if( str!=null && str.length>=8 )
		{
			for( var i=0; i<str.length; i++ )
			{
				switch( str.charAt(i) )
				{
					case '-':
					case '/':
					case '。':
						ret += "."; break;
					default:
						ret += str.charAt(i); break;
				}
			}
			if( fun_isDataType(ret,"date",false) )
				obj.value = ret;
		}
		//处理类似于20020405格式的时间
		if( str!=null && str.length==8 )
		{
			ret = str.substring(0,4)+"."+str.substring(4,6)+"."+str.substring(6,8);
			if( fun_isDataType(ret,"date",false) )
				obj.value = ret;
		}
		//处理2002.1.1为2002.01.01
		str = obj.value;
		if( fun_isDataType(str,"date",false) ) {
			var strArray=str.split(".");
			if(strArray[1].length == 1)
				strArray[1] = '0' + strArray[1];
			if(strArray[2].length == 1)
				strArray[2] = '0' + strArray[2];
			ret = strArray[0] + '.' + strArray[1] + '.' + strArray[2];
			obj.value = ret;
		}
	}
	return true;
}
//以空格和^为分隔符，分隔字符串
//返回值为数组
function getSplitStr(str,splitstr)
{
	var theStr="";
	if(str=="")return false;
	if(str.indexOf(splitstr)!=-1)	//空格分隔
	{	
		theStr=new String(str);
		var strArray=theStr.split(splitstr);
	}else{   //其它的按一个字符串处理
		var strArray=new Array(1);
		strArray[0]=str;
	}
	return strArray;	
}



// 获取给定字符串的长度，处理一个汉字为2个字符
function fun_GetStrLen( str )
{
	str = str + "";
	if( str == null ) return -1;
	var count=0;
	for( var i=0; i<str.length; i++ )
	{
		if( str.charCodeAt(i) > 255 ) count += 2; else count++;
	}
	return count;
}

function TrimRight( str )
{
	var i, c, s=0, e;
	if( str!=null ){
		if( typeof( str ) == "string" ){
			e = str.length + 1;
			for( i=str.length - 1; i>=0; i-- ){
				c = str.substr( i, 1 );
				if( c!=" " ){ e = i + 1; break; }
			}
			if(i == -1) { e = 0; }
			str = str.substring( s, e );
			return str;
		}
	}else{
			return str;
	}
}

//2006-7-5用来判断单选按钮和多选按钮的值,varname是变量名，canbeempty是表示是否可为空。
function fun_isDataCheck( varname, canbeempty )
{
	if(canbeempty) return true;
	for(i = 0; i < varname.length; i++){
		if(varname[i].checked){
			return true;
		}
	}
	return false;
}
function fun_isDataRadio( val, valtype, nul, valmin, valmax )
{
	if(typeof(val)=="undefined") return false;
	for(i = 0; i < val.length; i++){
		if(val[i].checked){
			return fun_isDataType(val[i].value,valtype, nul, valmin, valmax );
		}
	}
	return false;
}
function fun_getRadioValue( val)//取得radio的值
{
	if(typeof(val)=="undefined"){
		alert('单选项未定义！');
		return '';
	}else{
		for(i = 0; i < val.length; i++){
			if(val[i].checked){
				return val[i].value;
			}
		}
		alert('单选项未选择！');
		return '';
	}
}
// 返回大写星期
function fun_GetDay( n )
{
	var str="星期";
	switch( Number(n) )
	{
		case 0: str += "一"; break;
		case 1: str += "二"; break;
		case 2: str += "三"; break;
		case 3: str += "四"; break;
		case 4: str += "五"; break;
		case 5: str += "六"; break;
		case 6: str += "日"; break;
		default: str = ""; break;
	}
	return str;
}

// 判别一个日期格式串是否是正确的日期，假定格式：yyyy  mm  dd
// 不做格式判别了，返回真为合法，否则为错误
function fun_isOkDate( year, mon, day ) // 1999  12  31
{
	var d = new Date(Number(year),Number(mon)-1,Number(day));
	if( (d.getYear()==Number(year)||d.getYear()==(Number(year)%100)) && d.getMonth()+1==Number(mon) && d.getDate()==Number(day) ){
		d=null;
		CollectGarbage(); 
		return true;
	}
	d=null;
	CollectGarbage(); 
	return false;
}
// 检查str是否有checkStr中的字符组成
// 例如：checkStrInStr( "asdf23r.asd3", "1234567890." )等于false



function checkStrInStr( str, checkStr )
{
	var bOk = false;
	if( typeof( checkStr ) == "string" && typeof( str ) == "string" ){
		bOk = true;
		for ( var i = 0;  i < str.length;  i++ ){
			var ch = str.charAt(i);
			var j = 0;
			for ( ;  j < checkStr.length;  j++){
				if (ch == checkStr.charAt(j))
					break;
			}
			if (j == checkStr.length){ // 表示不符合
				bOk = false;
				break;
			}
		}
	}
	return bOk;
}

// 判别一个日期格式串是否是正确的日期，假定格式：yyyy-mm-dd
// 不做格式判别了，返回真为合法，否则为错误
function fun_checkDate( str ) 
{
	var r = str.match(/^(\d{1,4})[-|.](\d{1,2})[-|.](\d{1,2})$/); 
	if(r==null)return false;
	var d = new Date(r[1], r[2]-1,r[3]); 
	var result= (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[2]&&d.getDate()==r[3]);
	r=null;
	d=null;
	return result;
}
// 判别一个日期格式串是否是正确的日期，假定格式：hh:mm:ss
// 不做格式判别了，返回真为合法，否则为错误
function fun_checkTime( val ) 
{
	allValid = checkStrInStr( val, "0123456789:" );
	if (!allValid)	return false;

	var hms = val.split(":");
	if( hms.length <2 || hms.length >3) return false;
	if( hms.length == 2){
		if( hms[0].length==0 || hms[0].length>2 ) return false;
		if( Number(hms[0])<0 || Number(hms[0])>23 ) return false;
		if( hms[1].length==0 || hms[1].length>2 ) return false;
		if( Number(hms[1])<0 || Number(hms[1])>59 ) return false;
	}else{
		if( hms[0].length==0 || hms[0].length>2 ) return false;
		if( Number(hms[0])<0 || Number(hms[0])>23 ) return false;
		if( hms[1].length==0 || hms[1].length>2 ) return false;
		if( Number(hms[1])<0 || Number(hms[1])>59 ) return false;
		if( hms[2].length==0 || hms[2].length>2 ) return false;
		if( Number(hms[2])<0 || Number(hms[2])>59 ) return false;
	}
	return true;
}


function fun_isDataType( val, valtype, nul, valmin, valmax )
{
	if( valtype == null ) return false;
	else valtype = valtype + "";
	if(nul&&(val==null||val=="")) return true;//2006-7-18 魏焕军 为空且可以为空，则提前返回真；2007-6-7加val==""部分
	if(!nul&&val==null) return false;//2006-7-18 魏焕军 为空且不可以为空，则提前返回假；
	if( val==null ) val = ""; else val = TrimRight(val + "" );
	var i, j, ch;
	var checkOK;
	var allValid = true;
	var allNum = "";
	var decPoints = 0;
	var myReg;
	var result=false;
	switch( valtype.toLowerCase() )
	{
		case "int":
			myReg = /^[-|+]?\d+$/; 
			result = (myReg.test(val)&&Number(val)>=Number(valmin)&&Number(val)<=Number(valmax)); 
			break;
		case "number":
			myReg = /^[-|+]?\d+.?\d*$/; 
			result =  (myReg.test(val)&&Number(val)>=Number(valmin)&&Number(val)<=Number(valmax)); 
			break;
		case "char":
			result = true;
			if( val.length == 0 && nul == false )
				result =  false;
			if( val.length == 0 && nul == true )
				result = true;
			if( valmin != null )	if( fun_GetStrLen(val) < Number(valmin) ) result = false;
			if( valmax != null )	if( fun_GetStrLen(val) > Number(valmax) ) result = false;
			break;
		case "date":
			result = false;
			if(val.indexOf(" ")<0){//表示只有年月日
				result = fun_checkDate(val);
			}else{
				var strarr=getSplitStr(val,' ');
				var tag=fun_checkDate(strarr[0]);
				if (! tag){
					result = false;
				}else{
					result = fun_checkTime(strarr[1]);
				}
			}
			break;
		case "email":
			myReg = /@{1}/; 
			result = (myReg.test(val)&&fun_GetStrLen(val) >= Number(valmin)&&fun_GetStrLen(val) <= Number(valmax)); 
			break;
		case "time":
			result = fun_checkTime(val);
			break;
		case "url":
			myReg = /^https?:\/\/([\x00-\xff]|[^\x00-\xff])+/;
			result = (myReg.test(val)&&fun_GetStrLen(val) >= Number(valmin)&&fun_GetStrLen(val) <= Number(valmax)); 
			break;
	}
	myReg=null;
	allNum=null;
	return result;
}

// 获取年.月.日
function fun_GetDate()
{
	var d=new Date();
	var dstr= d.getYear() + "." + (d.getMonth()+1) + "." + (d.getDate());
	d=null;
	CollectGarbage();
	return dstr;

}

// 功能：日期串yyyy.m.d与yyyy/m/d之间的互相转化
// 输入：strDate 日期串，flag 标志，为true表示yyyy.m.d->yyyy-m-d，为false表示yyyy-m-d->yyyy.m.d
// 输出：日期串
// 说明：这里不做错误判别，假设格式正确
function fun_FormatDate( strDate,flag)
{
	var str="", i;
	if( typeof(strDate)!="string" ) strDate+="";
	
	for( i=0; i<strDate.length; i++ )
	{
		if( flag ){
			// yyyy.m.d -> yyyy-m-d
			if( strDate.charAt(i)=="." ){	str += "-"; continue; }
		}else{
			// yyyy-m-d -> yyyy.m.d
			if( strDate.charAt(i)=="-" ){	str += "."; continue; }
		}
		str += strDate.charAt(i);
	}
	return str;
}
/*****************************************************************************
* md5.js
*
* A JavaScript implementation of the RSA Data Security, Inc. MD5
* Message-Digest Algorithm.
*
* Copyright (C) Paul Johnston 1999. Distributed under the LGPL.
*****************************************************************************/

/* convert integer to hex string */
function hex(i)
{
var sHex = "0123456789ABCDEF";
h = "";
for(j = 0; j <= 3; j++)
{
h += sHex.charAt((i >> (j * 8 + 4)) & 0x0F) +
sHex.charAt((i >> (j * 8)) & 0x0F);
}
return h;
}

/* add, handling overflows correctly */
function add(x, y)
{
return ((x&0x7FFFFFFF) + (y&0x7FFFFFFF)) ^ (x&0x80000000) ^ (y&0x80000000);
}

/* MD5 rounds functions */
function R1(A, B, C, D, X, S, T)
{
	q = add(add(A, (B & C) | (~B & D)), add(X, T));
	return add((q << S) | ((q >> (32 - S)) & (Math.pow(2, S) - 1)), B);
}

function R2(A, B, C, D, X, S, T){
	q = add(add(A, (B & D) | (C & ~D)), add(X, T));
	return add((q << S) | ((q >> (32 - S)) & (Math.pow(2, S) - 1)), B);
}

function R3(A, B, C, D, X, S, T){
	q = add(add(A, B ^ C ^ D), add(X, T));
	return add((q << S) | ((q >> (32 - S)) & (Math.pow(2, S) - 1)), B);
}

function R4(A, B, C, D, X, S, T){
	q = add(add(A, C ^ (B | ~D)), add(X, T));
	return add((q << S) | ((q >> (32 - S)) & (Math.pow(2, S) - 1)), B);
}

/* main entry point */
function calcMD5(sInp) {
	/* Calculate length in machine words, including padding */
	wLen = (((sInp.length + 8) >> 6) + 1) << 4;
	var X = new Array(wLen);
	var sAscii = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	var sAscii = sAscii + "[]^_`abcdefghijklmnopqrstuvwxyz{|}~";

	/* Convert string to array of words */
	j = 4;
	for (i = 0; (i * 4) < sInp.length; i++){
		X[i] = 0;
		for (j = 0; (j < 4) && ((j + i * 4) < sInp.length); j++){
			X[i] += (sAscii.indexOf(sInp.charAt((i * 4) + j)) + 32) << (j * 8);
		}
	}

	/* Append padding bits and length */
	if (j == 4){
		X[i++] = 0x80;
	}else{
		X[i - 1] += 0x80 << (j * 8);
	}
	for(; i < wLen; i++) { X[i] = 0; }
	X[wLen - 2] = sInp.length * 8;
	var a = 0x67452301;
	var b = 0xefcdab89;
	var c = 0x98badcfe;
	var d = 0x10325476;
	/* Process each 16-word block in turn */
	for (i = 0; i < wLen; i += 16) {
		aO = a;
		bO = b;
		cO = c;
		dO = d;

		a = R1(a, b, c, d, X[i+ 0], 7 , 0xd76aa478);
		d = R1(d, a, b, c, X[i+ 1], 12, 0xe8c7b756);
		c = R1(c, d, a, b, X[i+ 2], 17, 0x242070db);
		b = R1(b, c, d, a, X[i+ 3], 22, 0xc1bdceee);
		a = R1(a, b, c, d, X[i+ 4], 7 , 0xf57c0faf);
		d = R1(d, a, b, c, X[i+ 5], 12, 0x4787c62a);
		c = R1(c, d, a, b, X[i+ 6], 17, 0xa8304613);
		b = R1(b, c, d, a, X[i+ 7], 22, 0xfd469501);
		a = R1(a, b, c, d, X[i+ 8], 7 , 0x698098d8);
		d = R1(d, a, b, c, X[i+ 9], 12, 0x8b44f7af);
		c = R1(c, d, a, b, X[i+10], 17, 0xffff5bb1);
		b = R1(b, c, d, a, X[i+11], 22, 0x895cd7be);
		a = R1(a, b, c, d, X[i+12], 7 , 0x6b901122);
		d = R1(d, a, b, c, X[i+13], 12, 0xfd987193);
		c = R1(c, d, a, b, X[i+14], 17, 0xa679438e);
		b = R1(b, c, d, a, X[i+15], 22, 0x49b40821);

		a = R2(a, b, c, d, X[i+ 1], 5 , 0xf61e2562);
		d = R2(d, a, b, c, X[i+ 6], 9 , 0xc040b340);
		c = R2(c, d, a, b, X[i+11], 14, 0x265e5a51);
		b = R2(b, c, d, a, X[i+ 0], 20, 0xe9b6c7aa);
		a = R2(a, b, c, d, X[i+ 5], 5 , 0xd62f105d);
		d = R2(d, a, b, c, X[i+10], 9 , 0x2441453);
		c = R2(c, d, a, b, X[i+15], 14, 0xd8a1e681);
		b = R2(b, c, d, a, X[i+ 4], 20, 0xe7d3fbc8);
		a = R2(a, b, c, d, X[i+ 9], 5 , 0x21e1cde6);
		d = R2(d, a, b, c, X[i+14], 9 , 0xc33707d6);
		c = R2(c, d, a, b, X[i+ 3], 14, 0xf4d50d87);
		b = R2(b, c, d, a, X[i+ 8], 20, 0x455a14ed);
		a = R2(a, b, c, d, X[i+13], 5 , 0xa9e3e905);
		d = R2(d, a, b, c, X[i+ 2], 9 , 0xfcefa3f8);
		c = R2(c, d, a, b, X[i+ 7], 14, 0x676f02d9);
		b = R2(b, c, d, a, X[i+12], 20, 0x8d2a4c8a);

		a = R3(a, b, c, d, X[i+ 5], 4 , 0xfffa3942);
		d = R3(d, a, b, c, X[i+ 8], 11, 0x8771f681);
		c = R3(c, d, a, b, X[i+11], 16, 0x6d9d6122);
		b = R3(b, c, d, a, X[i+14], 23, 0xfde5380c);
		a = R3(a, b, c, d, X[i+ 1], 4 , 0xa4beea44);
		d = R3(d, a, b, c, X[i+ 4], 11, 0x4bdecfa9);
		c = R3(c, d, a, b, X[i+ 7], 16, 0xf6bb4b60);
		b = R3(b, c, d, a, X[i+10], 23, 0xbebfbc70);
		a = R3(a, b, c, d, X[i+13], 4 , 0x289b7ec6);
		d = R3(d, a, b, c, X[i+ 0], 11, 0xeaa127fa);
		c = R3(c, d, a, b, X[i+ 3], 16, 0xd4ef3085);
		b = R3(b, c, d, a, X[i+ 6], 23, 0x4881d05);
		a = R3(a, b, c, d, X[i+ 9], 4 , 0xd9d4d039);
		d = R3(d, a, b, c, X[i+12], 11, 0xe6db99e5);
		c = R3(c, d, a, b, X[i+15], 16, 0x1fa27cf8);
		b = R3(b, c, d, a, X[i+ 2], 23, 0xc4ac5665);

		a = R4(a, b, c, d, X[i+ 0], 6 , 0xf4292244);
		d = R4(d, a, b, c, X[i+ 7], 10, 0x432aff97);
		c = R4(c, d, a, b, X[i+14], 15, 0xab9423a7);
		b = R4(b, c, d, a, X[i+ 5], 21, 0xfc93a039);
		a = R4(a, b, c, d, X[i+12], 6 , 0x655b59c3);
		d = R4(d, a, b, c, X[i+ 3], 10, 0x8f0ccc92);
		c = R4(c, d, a, b, X[i+10], 15, 0xffeff47d);
		b = R4(b, c, d, a, X[i+ 1], 21, 0x85845dd1);
		a = R4(a, b, c, d, X[i+ 8], 6 , 0x6fa87e4f);
		d = R4(d, a, b, c, X[i+15], 10, 0xfe2ce6e0);
		c = R4(c, d, a, b, X[i+ 6], 15, 0xa3014314);
		b = R4(b, c, d, a, X[i+13], 21, 0x4e0811a1);
		a = R4(a, b, c, d, X[i+ 4], 6 , 0xf7537e82);
		d = R4(d, a, b, c, X[i+11], 10, 0xbd3af235);
		c = R4(c, d, a, b, X[i+ 2], 15, 0x2ad7d2bb);
		b = R4(b, c, d, a, X[i+ 9], 21, 0xeb86d391);

		a = add(a, aO);
		b = add(b, bO);
		c = add(c, cO);
		d = add(d, dO);
	}
	X=null;
	CollectGarbage(); 
	return hex(a) + hex(b) + hex(c) + hex(d);
} 
/*********************************
通过微软的XMLHTTP即时获得一个响应
参数为:sendtype:发送类型，可为get或post,urlstring:请求地址,formstr表单内容，如<name>aaa</name>
返回：XML文档结构
*********************************/
function getQueryXmlResult(sendtype,urlstring,formstr)
{
	var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	xmlhttp.open(sendtype,urlstring,false);
	xmlhttp.send(formstr);
	var xmldom=xmlhttp.responseXML;
	if (xmldom == null){
		alert("无内容或出错，按确定将退出。");
		return "";
	}
	var item = xmldom.documentElement.selectNodes("item");
	return item(0).selectNodes("value")(0).text;
} 
/*********************************
通过微软的XMLHTTP即时获得一个响应
参数为:sendtype:发送类型，可为get或post,urlstring:请求地址,formstr表单内容，如<name>aaa</name>
返回：XML文档结构
*********************************/
function getQueryXml(sendtype,urlstring,formstr)
{
	var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	xmlhttp.open(sendtype,urlstring,false);
	xmlhttp.send(formstr);
	return xmlhttp.responseXML;
} 
/*********************************
通过微软的XMLHTTP即时获得一个响应
参数为:sendtype:发送类型，可为get或post,urlstring:请求地址,formstr表单内容，如<name>aaa</name>
返回：以；；和<#@#>分隔的数据串。
*********************************/
function getResponseString(sendtype,urlstring,formstr)
{
	var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	xmlhttp.open(sendtype,urlstring,false);
	xmlhttp.send(formstr);
	return xmlhttp.responseText;
} 
/*********************************
通过微软的XMLHTTP即时获得一个响应
参数为:sendtype:发送类型，可为get或post,urlstring:请求地址,formstr表单内容，如<name>aaa</name>
返回：以；；和<#@#>分隔的数据串。
*********************************/
function addQueryPostStringEx2(sourcestr,objname,objvalue)
{
	if (sourcestr.length==0)
	{
		return objname+";;"+objvalue;
	}
	return sourcestr+"<#@#>"+objname+";;"+objvalue;
} 
function addQueryPostStringEx1(sourcestr,obj,objvalue)
{
	if (sourcestr.length==0)
	{
		return obj.name+";;"+objvalue;
	}
	return sourcestr+"<#@#>"+obj.name+";;"+objvalue;
} 
function addQueryPostString(sourcestr,obj)
{
	if (sourcestr==null||sourcestr.length==0)
	{
		return obj.name+";;"+obj.value;
	}
	return sourcestr+"<#@#>"+obj.name+";;"+obj.value;
} 
function returnpage(curpage)
{
	if(isDigit(curpage)) {
		pagenavigatorform.CurrentPage.value=curpage;
		document.pagenavigatorform.submit();
		return true;
	}else {
		window.focus();
		alert("请在转向页码处输入数字！");
		pagenavigatorform.CurrentPage1.focus();
		return false;
	}
}
function loginform_onsubmit(){
	if( !fun_isDataType(loginform.loginname.value, "char", false, 1, 64 ) ) {
		alert('请输入用户名！');
		loginform.loginname.focus();
		return false;
	}
	if( !fun_isDataType(loginform.password.value, "char", false, 1, 64 ) ) {
		alert('请输入密码！');
		loginform.password.focus();
		return false;
	}
	loginform.password.value=calcMD5(loginform.password.value);
	return true;
}
function loginform_onsubmitex(){
	if( !fun_isDataType(loginform.loginname.value, "char", false, 1, 64 ) ) {
		alert('请输入用户名！');
		loginform.loginname.focus();
		return false;
	}
	if( !fun_isDataType(loginform.password.value, "char", false, 1, 64 ) ) {
		alert('请输入密码！');
		loginform.password.focus();
		return false;
	}
	if( !fun_isDataType(loginform.randlogincode.value, "char", false, 1, 64 ) ) {
		alert('请输入验证码！');
		loginform.randlogincode.focus();
		return false;
	}
	var randlogincode=calcMD5(loginform.randlogincode.value);
	if(randlogincode!=loginform.randlogincodeex.value){
		alert('输入验证码不正确，请重新输入！');
		loginform.randlogincode.focus();
		return false;
	}
	loginform.password.value=calcMD5(loginform.password.value);
	return true;
}

/*--重画下拉框--*/
function changeSelect(select,source,target,option){ 
	getRemoteData(target,option,"&"+source+"="+select.options[select.selectedIndex].value);
	clearSelect(eval(target));
	fillSelect(eval(target));
}

/*--清空下拉框--*/
function clearSelect(select)
{
	select.options.length = 0;
	// select.options[select.options.length]= new Option("--请选择--","");
}

/*--填充下拉框--*/
function fillSelect(select){
	x.loadXML(oReq.responseText);
	n=x.selectNodes("/root/id");
	if(n!=null){  
		for(i=0;i<n.length;i++){
			select.options[select.options.length]=new Option(n(i).text,n(i).text);
		}
	}
}
function windowmax(){
	if (document.layers){
		var larg=screen.availWidth-10;
		var altez=screen.availHeight-20;
	}else{
		var larg=screen.availWidth+8;
		var altez=screen.availHeight+7;}
		self.resizeTo(larg,altez);
		self.moveTo(-4,-4);
}
function multiply(a,b){
	return a*b;
}
function plus(a,b){
	return a+b;
}
function minus(a,b){
	return a-b;
}
function divide(a,b){
	if(Number(b)==0) return -999999999;
	return a/b;
}
function copyText(obj){  
	var rng = document.body.createTextRange();  
	rng.moveToElementText(obj);  
	rng.scrollIntoView();  
	rng.select();  
	rng.execCommand("Copy");  
	rng.collapse(false);
}  
