/**
    isZero          ??????????????????????????????????????????
    isEqual         ????????????????????????????,????????????????
    doubleToString  ????????????????????????????????????????String.valueOf()??????????????????????????
    formatDouble    ????????????????????????????????????????
    popupHandle     ??????????????????
    checkIsNull     ??????????????????
    checkIsNumAndLetter     ??????????????????????????
    checkIsBigEnglishLetter   ????????????????????????????
    checkDate       ??????????????????
    compareTwoDate
    CheckDecnum     ????????????????????
    
    verifyNumber    ????????????????????????????????????input ??onkeyup????????????????
    checkNumber     ????????????????????????????
    isNumber        ??????????????????
    verifyDate      ????????????????????????????????????input ??onkeyup????????????????
    getDays         ??????????????????
    checkDateFormat ??????????????????????????????????????"-"??????
    getUserDate     ???????????????? ????"-"??????
    getUserTime     ???????????????? ????"-"??????    
    verifyTime      ????????????????????????????????????input ??onkeyup????????????????
    checkTimeFormat ???????????????????????????????? ????":"??????
    nextFocus       move the focus to the next component
    isFocusable     ??????????????????????focus
    setFocus        set the focus to the right component
    keyAction       ????????????
    addEventHandler ??????????????????????????????????????Function????
                    eg: addSenToEventHandle("window.onload","alert('????');");
    strTrim         trim ????
    reloadDocument  reloadDocument
    initDocument    Initialize the document on load, including key listener,
    
    deleteConfirm   ????????????????
    isSymbol        ??????????????????????
    isEnglishLetter ??????????????????????
    count           ????????????????????????????????2??
    verifyCount     ??????????????????????????
    checkCount      ??????????????????????????????????????
    
    multipage_form_jump  multi_page ToolBar??????????
    
    setDateEditorValue ????????????
    setTimeEditorValue ????????????

    getStdDate     ??????????8??????????--YYYYMMDD

    addDate		??????????????????????????????????????8??????????????
 */

    //Double ????????????????
    var MIN_DIGIT=6; //
    //Double??????????
    var MIN_DOUBLE=0.0000005; //
    //Double??????????
    var MAX_DOUBLE=9999999999999998.0;

    /**
     * Name:    isZero
     * Desc:    ??????????????????????????????????????????
     * Author:   
     * @param   dValue ??????????
     * @return  boolean
     */
    function isZero(dValue)
    {
        if ( Math.abs(dValue) <= MIN_DOUBLE )
            return true;
        else
            return false;
    }

    /**
     * Name:    isEqual
     * Desc:    ????????????????????????????,????????????????
     * Author:   
     * @param   d1 ??????????1
     * @param   d2 ??????????2
     * @return  boolean
     */
    function isEqual(d1,d2)
    {
        return isZero(d1-d2);
    }


    /**
     * Name:    doubleToString
     * Desc:    ????????????????????????????
     *          ????????????String.valueOf()??????????????????????????
     * Author:   
     * @param   dValue ??????????
     * @return  ??????????????
     */
    function doubleToString(dValue)
    {
        if (Math.abs(dValue) > MAX_DOUBLE)
        {
            if (dValue > 0 )
                dValue = MAX_DOUBLE;
            else 
                dValue = -MAX_DOUBLE;
        }
        if (Math.abs(dValue) <= MIN_DOUBLE) dValue = 0;
        return dValue.toString();
        
        /*

        //????????
        var strSign="";

        //????????????????????
        var lLeft; 
        var dRight;

        //??????????????????????
        var strLeft=""; 
        var strRight="";

        if (dValue<0)
        {
            dValue= 0 - dValue;
            strSign = "-";
        }

        lLeft=parseInt(dValue);
        dRight=(dValue*1000000-lLeft*1000000)/1000000;

        //??????????????????
        strLeft=lLeft.toString();

        //??????????????????
        if (isEqual(dRight,0))
            strRight="";
        else
        {
            for (var i=0;i<MIN_DIGIT;i++)
            {
                var k=parseInt((dRight + MIN_DOUBLE)*10);
                strRight = strRight + k.toString();
                if (isZero(dRight - 1))
                    break;
                dRight = dRight * 10 - k;
            }
            var j=strRight.length;
            for ( var k = j-1 ;k>=0 && strRight.charAt(k)=='0';k--)
                strRight = strRight.substring(0,k);
            if (!strRight == "")
                strRight="."+strRight;
        }
        return strSign+strLeft+strRight;
        */
    }


/**
     * Name:    roundDouble
     * Desc:    ????????????
     * Author:   
     * @param   dValue ??????????
     * @param   nDecimal ????????????????
     * @return  ????????????
*/
    function roundDouble(dValue,nDecimal)
    {
        return parseFloat(formatDouble(dValue,nDecimal,false));
    }
    


/**
     * Name:    formatDouble
     * Desc:    ????????????????????????????????????????
     * Author:   
     * @param   dValue ??????????
     * @param   nDecimal ????????????????
     * @param   blZero ??????????????
     * @return  ??????????????
*/
    function formatDouble(dValue,nDecimal,blZero)
    {
        if (typeof(dValue) == "string") dValue = parseFloat(dValue);
        if (nDecimal == null || isNaN(nDecimal)) nDecimal = 2;
        if (blZero == null ) blZero = false;        

        var s;
        var strSign = "";
        var pre;
        var i,j,point,k,oldlen=0;
        var dValue0=0,dValue1=0;
        var res;

        if (dValue<0)
        {
            dValue=0-dValue;
            strSign="-";
        }

        if (dValue>MAX_DOUBLE)  //??
            dValue=MAX_DOUBLE;   //omit??

	    pre=10;
	    
	    for(i=0; i<nDecimal; i++) pre=pre*10;

        dValue=(dValue*(pre/10.0)+0.5)/(pre/10.0);
        
        s=doubleToString(dValue);
        
	    for(i=0; i<s.length; i++)
        {
	        if(s.charAt(i)=='.')
            break;
        }
        point=i;
        j=s.length;
        if (j>point+nDecimal+1)
            s=s.substring(0,point+nDecimal+1);
        j=s.length;

        if (blZero)
        {
            if (nDecimal>0)
            {
                for (k=j;k<point+nDecimal+1;k++)
                    s=s.concat("0");
            }
            else
            {
                s=s.substring(0,point);
            }
        }
        else
        {
            if (nDecimal>0)
            {
                for (k=j-1;k>point&&s.charAt(k)=='0';k--)
                    s=s.substring(0,k);

                if (s.charAt(k)=='.')
                s=s.substring(0,k);
            }
            else
            {
                s=s.substring(0,point);
            }
        }

        res=strSign.concat(s);
        return res;
    }



/**
 * Name:    checkIsNull
 * Desc:    ??????????????????
 * Author:   
 * @param   strTemp  ??????
 * @return  True:????	False:????
 */
function checkIsNull(strTemp) {
	var strValue = strTemp;
    if (strValue == null) {
        return true;
    }
    while (strValue.indexOf(" ")!=-1) {
    	var nIndex = strValue.indexOf(" ");
    	if (nIndex > 0) {
    		strValue = strValue.substring( 0, nIndex) + strValue.substring( nIndex+1, strValue.length );
    	} else {
    		strValue = strValue.substring( nIndex+1, strValue.length );
    	}
    }
    if ((strValue == "") || (strValue == null)) {
        return true;
    }
    return false;
}

function popupHandle(strName,strHandler)
{
    if (event.type=="click"&&event.srcElement.tagName=="INPUT")
        return;
    else if (event.type=="dblclick"&&event.srcElement.tagName=="BUTTON")
        return;
    else if (event.type=="keydown"&&event.keyCode!=113)
        return;
    eval(strHandler);
}


/**
 * Name:    checkIsNumAndLetter
 * Desc:    ??????????????????????????
 * Author:   
 * @param   strTemp  ?????? 
 * @return  True:????????????	False:????????????
 */
function checkIsNumAndLetter(strTemp) {
	var strValue = strTemp;
	var strCollection = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    if (strValue == null || strValue == "") {
        return true;
    }
    for ( i = 0 ; i < strValue.length ; i ++) {
    	strSubstr = strValue.substring( i, i+1);
    	if (strCollection.indexOf(strSubstr) < 0) {
    		return false;
    	} 
   	}

   	return true;

}

/**
 * Name:    checkIsBigEnglishLetter
 * Desc:    ????????????????????????????
 * Author:   yangguoxue
 * @param   strTemp  ?????? 
 * @return  True:??????????	False:??????????
 */
function checkIsBigEnglishLetter(strTemp) {
	var strValue = strTemp;
	var strCollection = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    if (strValue == null || strValue == "") {
        return true;
    }
    for ( i = 0 ; i < strValue.length ; i ++) {
    	strSubstr = strValue.substring( i, i+1);
    	if (strCollection.indexOf(strSubstr) < 0) {
    		return false;
    	} 
   	}
   	return true;
}


/**
 *  add by limf
 * Name:    checkIsNum
 * Desc:    ????????????????????
 * Author:   
 * @param   strTemp  ?????? 
 * @return  True:????????????	False:????????????
 */
function checkIsNum(strTemp) {
	var strValue = strTemp;
	var strCollection = "0123456789";
    if (strValue == null || strValue == "") {
        return true;
    }
    for ( i = 0 ; i < strValue.length ; i ++) {
    	strSubstr = strValue.substring( i, i+1);
    	if(i==1&&i!=(strValue.length-1)){
    	 strCollection = "0123456789.";
    	 }
    	if (strCollection.indexOf(strSubstr) < 0) {
    		return false;
    	}
    	strCollection = "0123456789";
   	}

   	return true;

}




/**
 * Name:    checkDate
 * Desc:    ??????????????????
 * Author:   
 * @param   sDate  10????"YYYY-MM-DD")????????????
 * @return  True:????????	False:????????
 */
function checkDate(sDate) {
	if((sDate==null) || (sDate=="")) {
		return true;
	}
	var intLen = sDate.length;
	if(intLen != 10) {
		return false;
	}
	sYear = sDate.substring(0,4);
	sMonth = sDate.substring(5,7)-1;
	sDay = sDate.substring(8,10);
    if(isNaN(sYear) || isNaN(sMonth) || isNaN(sDay)) {
        return false;
	}
	var tmpDate = new Date(sYear,sMonth,sDay);
    if (1900 <= sYear && sYear < 2000) {
        sYear = sYear - 1900;
	}
    if(tmpDate.getYear() != sYear) {
        return false;
	}
	if(tmpDate.getMonth() != sMonth) {
         return false;
	}
	return true;
}

/**
 * Name:    checkDate
 * Desc:    ??????????????????
 * Author:   
 * @param   sDate  10????"YYYY-MM-DD")????????????
 * @return  True:????????	False:????????
 */
function compareTwoDate(sDateBegin,sDateEnd) {
	var intLen;
	intLen = sDateBegin.length;
	if(intLen != 10) {
		return false;
	}
	intLen = sDateEnd.length;
	if(intLen != 10) {
		return false;
	}
	sYear1 = sDateBegin.substring(0,4);
	sMonth1 = sDateBegin.substring(5,7);
	sDay1 = sDateBegin.substring(8,10);
	sYear2 = sDateEnd.substring(0,4);
	sMonth2 = sDateEnd.substring(5,7);
	sDay2 = sDateEnd.substring(8,10);
	if (sYear1>sYear2) {
		return false;
	}
	if ((sYear1==sYear2) && (sMonth1>sMonth2)) {
		return false;
	} else if ((sYear1==sYear2) && (sMonth1==sMonth2) && (sDay1>sDay2)) {
		return false;
	}
	return true;
}

/**
 * Name:    compareTwoDate1
 * Desc:    ????????????????????????
 * Author:  
 * @param   sDate  8????"YYYYMMDD")????????????
 * @return  1:??????	-1:??????
 */
function compareTwoDate1(sDateBegin,sDateEnd) {
	var intLen;
	intLen = sDateBegin.length;
	if(intLen != 8) {
		return false;
	}
	intLen = sDateEnd.length;
	if(intLen != 8) {
		return false;
	}
	sYear1 = sDateBegin.substring(0,4);
	sMonth1 = sDateBegin.substring(4,6);
	sDay1 = sDateBegin.substring(6,8);
	sYear2 = sDateEnd.substring(0,4);
	sMonth2 = sDateEnd.substring(5,6);
	sDay2 = sDateEnd.substring(6,8);
	if (sYear1>sYear2) {
		return 1;
	}
	if ((sYear1==sYear2) && (sMonth1>sMonth2)) {
		return 1;
	} else if ((sYear1==sYear2) && (sMonth1==sMonth2) && (sDay1>sDay2)) {
		return 1;
	}
	return -1;
}

/**
 * Name:    CheckDecnum
 * Desc:    ????????????????????
 * Author:   
 * @param   sNum  ????????
 * @param   n  ????????????
 * @param   m  ????????????
 * @param   s  ??????	0??????????1??????????
 * @return  True:????	False:????
 */
function CheckDecnum(sNum,n,m,s){

    if( (isNaN( sNum )) || (sNum.indexOf(" ")!=-1) ) {
       alert("??????????????????");
       return false;
	}
    var sFirstChar=sNum.charAt(0);
    var sSencondChar=".";
    if(sNum.length>1) sSencondChar=sNum.charAt(1);
    if(sNum.indexOf("-")!=-1) {
		sFirstChar=sNum.charAt(1);
		if(sNum.length>2)
			sSencondChar=sNum.charAt(2);
    }
    var sEndChar=sNum.charAt(sNum.length-1);
    if(sNum.length>1) {
	   	if((sFirstChar=='0' && sSencondChar!='.') || sFirstChar=='.' || sFirstChar=='+' || sEndChar=='.') {
	   	   	alert("??????????????????");
		   	return false;
	   	}

	}
    if( s == '1' && sNum < 0) {
    	alert("????????????");
    	return false;
    }
    var nIndex = sNum.indexOf( "." );
    if ( nIndex == -1 ) {
    	var sShosu = "";
   	} else  {
   		var sShosu = sNum.substring( nIndex+1, sNum.length );
   	}
    if( sShosu.length >  m ) {
    	alert("????????????" + m +"????");
        return false;
    }
    var str = "" + parseInt(sNum);
	var intSeisuLen=str.length;
	if(str.indexOf("-")!=-1)
		intSeisuLen=str.length-1;
    if ( intSeisuLen > n ) {
    	alert("????????????" + n +"????");
    	return false;
    }
  	return true;
}


/**
 * Name:    verifyNumber
 * Desc:    deprecated
 *          ????????????????????
 *          ??????????????input ??onkeyup????????????????
 * Author:   
 * @param   digit ????????
 * @param   minValue ????????????
 * @param   maxValue ????????????
 * @param   blEnableQuery ????????????????,??????????"*"
 */
function verifyNumber(digit,minValue,maxValue,blEnableQuery)
{
	//deprecated
	try
	{
    	var element = event.srcElement;
        if (isNaN(digit)&&isNaN(minValue)&&isNaN(maxValue)&&blEnableQuery==null)
        {
            digit = element.getAttribute("_digit");
            minValue = element.getAttribute("_min_value");
            maxValue = element.getAttribute("_max_value");
            blEnableQuery = element.getAttribute("_enable_query");
        }
    	var strPrevValue = element.getAttribute("prev_value");
    	strCurrentValue = element.value;
    
        if (event.keyCode == 9 || event.keyCode ==13) return true;
    
        if (blEnableQuery &&strCurrentValue.indexOf("*")>=0)
        {
            strCurrentValue = "*";
    	    element.setAttribute("prev_value",strCurrentValue);
            return true;
        }
    
        if(strPrevValue != strCurrentValue || strCurrentValue=="")
        {
    		nLength = strCurrentValue.length;
    		var strNewString ="";
    		for ( var i = 0 ; i < nLength ; i ++)
    		{
    			currentChar = strCurrentValue.charAt(i);
    			if ( i ==0)
    			{
    				if(currentChar == '-' || (currentChar> '0' && currentChar <= '9'))
    				{
    					strNewString = ""+currentChar;
    				}
    				else if(currentChar == '.')
    				{
    					strNewString =  "0.";
    				}
    				else if(currentChar=='0')
    				{
    					nextChar = strCurrentValue.charAt(i+1);
    					if(nextChar=='.'|| nLength==1)
    					{
    						strNewString = ""+currentChar;
    					}
    				}
    			}
    			else
    			{
    				if(currentChar>='0' && currentChar <='9')
    				{
    					strNewString = strNewString+currentChar;
    				}
    				else if(currentChar == '.' && strNewString.indexOf(".") < 0 )
    				{
    					prevChar = strCurrentValue.charAt(i-1);
    					if(i==1&&prevChar=='-')
    						strNewString = strNewString +"0";
    					strNewString = strNewString+currentChar;
    				}
    			}
    		}
    		if(!isNaN(digit))
    		{
    			dot = strNewString.indexOf(".");
    			if(digit==0 && dot > 0)
    				strNewString = strNewString.substring(0,dot);
    			else if(digit>0 && dot > 0)
    				strNewString = strNewString.substring(0,dot+digit+1);
    		}
    		
    		if ((!isNaN(minValue)) && minValue>parseFloat(strNewString))
    		{
    			strNewString = minValue;
    		}
    		if ((!isNaN(maxValue)) && maxValue<parseFloat(strNewString))
    		{
    			strNewString = maxValue;
    		}
    //		if(strNewString=="")
    //		{
    //		    if((!isNan(minValue)) && minValue>0)
    //		        strNewString=minValue;
    //            else if((!isNan(maxValue)) && maxValue<0)
    //		        strNewString=maxValue;
    //            else
    //                strNewString="0";
    //		}
    		element.setAttribute("prev_value",strNewString.toString());
      		element.value = strNewString;
    	}
    }
    catch(e)
    {
        alert(e.description);
    }
    return true;
}

/**
 * Name:    checkNumber
 * Desc:    ????????????????????????????
 * Author:   
 */
function checkNumber(blShowWarning)
{
    try
    {
        if (event.srcElement.value == "*") return true;
        var blOK = isNumber(event.srcElement.value);
        var strMsg="??????????????????????";
    
        if((!blOK)&&blShowWarning)
        {
            alert(strMsg);
            event.srcElement.focus();
            event.srcElement.select();
        }
    }
    catch(e)
    {
        alert(e.description);
    }
    return blOK;
}

/**
 * Name:    checkNumber_1
 * Desc:    ????????????????????????????
 *          ??????????????input ??onblur????????????????
 * Author:   
 * @param   digit ????????
 * @param   minValue ????????????
 * @param   maxValue ????????????
 * @param   blEnableQuery ????????????????,??????????"*"
 */
function checkNumber_1(digit,minValue,maxValue,blEnableQuery)
{
    try
    {
        if (event.srcElement.value == "*") return true;
        var tmpValue = event.srcElement.value;

        var strMsg = "";    
                
        if(blEnableQuery && tmpValue == "*")
        {
            ;
        }
        else if(!isNumber(tmpValue))
        {
            var strMsg="??????????????????????";
        }
        else if (!isNaN(minValue) && tmpValue < minValue )
        {
            var strMsg = "????????????????" + minValue;            
        }
        else if (!isNaN(maxValue) && tmpValue > maxValue )
        {
            var strMsg = "????????????????" + maxValue;            
        }
        
        if (strMsg!="")
        {
            alert(strMsg);
            event.srcElement.focus();
            event.srcElement.select();
            return false;
        }
        
        //if(! (blEnableQuery && tmpValue == "*"))
        //{
        //    
        //}
        return true;
    }
    catch(e)
    {
        alert(e.description);
    }
    return blOK;
}

/**
 * Name:    isNumber
 * Desc:    ??????????????????
 * Author:   
 * @param   value ????????????
 * @return  boolean
 */
function isNumber(value)
{
	if(isNaN(parseFloat(value)))
	{
	    return false;
	}

    nLength = value.length;

	for ( i = 0 ; i < nLength ; i ++)
	{
		currentChar = value.charAt(i);
		if ( i ==0)
		{
			if(currentChar != '-' && (currentChar< '0' || currentChar > '9')
			    && currentChar!=".")
			{
                return false;
			}
		}
		else
		{
			if((currentChar< '0' || currentChar > '9')
			    && currentChar!=".")
			{
                return false;
			}
		}
	}
	return true;
}


/**
 * Name:    verifyDate
 * Desc:    ????????????????????
 *          ??????????????input ??onkeyup????????????????
 * @param:  blEnableQuery
 * @param:  strDateType
 * Author:   
 */
function verifyDate(blEnableQuery,strDateType)
{
    var element = event.srcElement;
	if (!blEnableQuery)
	{
        blEnableQuery = element.getAttribute("enable_query");
        strDateType = element.getAttribute("date_type");
	}

    var strPrevValue = element.getAttribute("prev_value");
	var strSeparator = "-";
	strCurrentValue = element.value;

    //??????????????8(????),????46(backspace)????????????????????
	if (event.keyCode==8||event.keyCode==46) return;

    //????????????????"*"????????????
    if (blEnableQuery &&strCurrentValue.indexOf("*")>=0)
    {
        strCurrentValue = "*";
	    element.setAttribute("prev_value",strCurrentValue);
        return;
    }

    //??????????????????????: ??????, ????, ??
    if(!strDateType || (strDateType!="YYYYMM" && strDateType!="YYYY")) strDateType= "YYYYMMDD";

    //??????????????????????????????????, ??????, ??????????.
    //if (checkDateFormat(false))
    //{
	//    element.setAttribute("prev_value",strCurrentValue);
    //    return;
    //}
    if(strPrevValue != strCurrentValue)
    {
		var strNewString ="";
		var nLength = strCurrentValue.length;

        //??????????????????????
		for ( i = 0 ; i < nLength ; i ++)
		{
			currentChar = strCurrentValue.charAt(i);
			if((currentChar>='0' && currentChar <='9')||currentChar==strSeparator)
			{
				strNewString = strNewString+currentChar;
			}
		}

		//??????????????????
		var strNewString2 = "";

		var arrDate = strNewString.split(strSeparator);
		var nYear = -1;
		var nMonth = -1;
		var nDate = -1;

		switch (arrDate.length)
		{
		    case 3:
		        nDate = parseInt(arrDate[2],10);
        		if (nDate >= 100) nDate = parseInt(nDate/10);
		    case 2:
		        nMonth = parseInt(arrDate[1],10);
        		if (nMonth >= 100) nMonth = parseInt(nMonth/10);
		    case 1:
		        nYear = parseInt(arrDate[0],10);
		}

        if (nYear >=0)
        {
			if(nYear>=10000)
		    {
				strNewString2 = nYear.toString().substring(0,4);
				nYear = parseInt(strNewString2,10);
			}
            else
				strNewString2 = nYear.toString();

			if(strNewString2.length==4 || arrDate.length>1)
                strNewString2 = strNewString2 + strSeparator;
        }
        if (nMonth >=0)
        {
            if(nMonth>=10)
            {
                if(nMonth>12) nMonth=12;
                strNewString2 = strNewString2 + nMonth.toString() + strSeparator;
            }
			else if(nMonth>=2 || arrDate[1]=="01")
				strNewString2 = strNewString2 + "0"+ nMonth.toString() + strSeparator;
			else
            {
                strNewString2 = strNewString2 + nMonth.toString();
                if ( arrDate.length > 2)
                    strNewString2 = strNewString2 + strSeparator;
            }
        }
        if (nDate >=0)
        {
			var nDays = getDays(nYear,nMonth);
			if(nDate>=10)
			{
				if (nDate>nDays)nDate = nDays;
				strNewString2 = strNewString2 + nDate.toString().substring(0,2);
			}
            else if( nDate>=4 || arrDate[2]=="01"
                ||arrDate[2]=="02" || arrDate[2]=="03" )
            {
				strNewString2 = strNewString2 + "0"+ nDate.toString();
            }
			else if(!isNaN(nDate))
			{
                strNewString2 = strNewString2 + nDate.toString();
			}
        }

        if (strDateType=="YYYY")
        {
            if (strNewString2.length > 4)
                strNewString2 = strNewString2.substring(0,4);
        }
        else if (strDateType=="YYYYMM")
        {
            if (strNewString2.length > 7) strNewString2 = strNewString2.substring(0,7);
        }
        else
        {
            if (strNewString2.length > 10) strNewString2 = strNewString2.substring(0,10);
        }
		element.setAttribute("prev_value",strNewString2);
  		element.value = strNewString2;
	}
}

/**
 * Name:    getDays
 * Desc:    ??????????????????
 * Author:   
 * @param   nYear ????
 * @param   nMonth ????
 */
function getDays(nYear,nMonth)
{
    if(nMonth<=0||nMonth>12) return 0;
    var day_tab=new Array(
        new Array(0,31,28,31,30,31,30,31,31,30,31,30,31),
        new Array(0,31,29,31,30,31,30,31,31,30,31,30,31));
    var leap;
        leap=nYear%4==0 && nYear%100!=0 || nYear%400==0;
    if (leap)
        return(day_tab[1][nMonth]);
    else
        return(day_tab[0][nMonth]);
}


/**
 * Name:    checkDateFormat
 * Desc:    ????????????????????????????????
 *          ????"-"??????
 * Author:   
 */
function checkDateFormat(blShowWarning,strDateType)
{
    element = event.srcElement;
    if (!blShowWarning)
	{
        blShowWarning = element.getAttribute("show_warning");
        strDateType = element.getAttribute("date_type");
	}

    var strMsg = "????????????????'YYYY-MM-DD'!";
    sDate = event.srcElement.value;
    var blOK = true;

    //??????????????????????: ??????, ????, ??
    if(!strDateType || (strDateType!="YYYYMM" && strDateType!="YYYY")) strDateType= "YYYYMMDD";

    if(strDateType == "YYYYMM")
        strMsg = "????????????????'YYYY-MM'!";
    if(strDateType == "YYYY")
        strMsg = "????????????????'YYYY'!";


    if(sDate!=null && sDate.length > 0 && sDate!="*")
    {
        var arrDate = sDate.split("-");
		var nYear = -1;
		var nMonth = -1;
		var nDate = -1;

		switch (arrDate.length)
		{
		    case 3:
		        nDate = parseInt(arrDate[2],10);
                if (isNaN(nDate)) nDate = -1;
        		if (nDate >= 100) nDate = parseInt(nDate/10);
		    case 2:
		        nMonth = parseInt(arrDate[1],10);
                if (isNaN(nMonth)) nMonth = -1;
        		if (nMonth >= 100) nMonth = parseInt(nMonth/10);
		    case 1:
		        nYear = parseInt(arrDate[0],10);
                if (isNaN(nYear)) nYear = -1;
		}

        if (strDateType == "YYYY")
        {
            if (nYear < 0)
                blOK = false;
            if (nYear > 9999)
                blOK = false;
            if (blOK)
                sDate = nYear;
        }
        else if(strDateType == "YYYYMM")
        {
            if(nYear < 0 || nMonth < 0)
                blOK = false;
            if(nMonth<1 || nMonth > 12)
                blOK = false;
            if (blOK)
            {
                if (nMonth<10)
                    sDate = nYear+"-0"+nMonth;
                else
                    sDate = nYear+"-"+nMonth;
            }
        }
        else
        {
            if(nYear < 0 || nMonth < 0 || nDate< 0)
                blOK = false;
            var nDays = getDays(nYear,nMonth);
            if(nMonth<1 || nMonth > 12)
            {
                blOK = false;
            }
            if(nDate > nDays || nDate < 1)
            {
                blOK = false;
            }
            if (blOK)
            {
                if (nMonth<10)
                    sDate = nYear+"-0"+nMonth;
                else
                    sDate = nYear+"-"+nMonth;
                if (nDate < 10)
                    sDate = sDate+"-0"+nDate;
                else
                    sDate = sDate+"-"+nDate;
            }
        }
    }

    if((!blOK)&&blShowWarning)
    {
        if(!(document.activeElement.tagName == "INPUT"&&document.activeElement.type=="reset"))
        {
            alert(strMsg);
            event.srcElement.focus();
            event.srcElement.select();
        }
    }
    else if (blOK)
    {
        event.srcElement.value = sDate;
    }
    return blOK;
}

/**
 * Name:    getUserDate
 * Desc:    ????????????????
 *          ????"-"??????
 * Author:   
 */
function getUserDate(strStdDate,strDateType)
{
    if (strStdDate==null) return "";
    
    strStdDate = strStdDate.replace(/-/g,"");

    //??????????????????????: ??????, ????, ??
    if(!strDateType || (strDateType!="YYYYMM" && strDateType!="YYYY")) strDateType= "YYYYMMDD";

    if(strDateType=="YYYYMMDD")
    {
        if (strStdDate.length<8) return "";
        var strReturn = strStdDate.substring(0,4)+"-"
                        + strStdDate.substring(4,6) + "-"
                        + strStdDate.substring(6,8);
        return strReturn;
    }
    else if (strDateType=="YYYYMM")
    {
        if (strStdDate.length<6) return "";
        var strReturn = strStdDate.substring(0,4)+"-"
                        + strStdDate.substring(4,6);
        return strReturn;
    }
    else if (strDateType=="YYYY")
    {
        if (strStdDate.length<4) return "";
        var strReturn = strStdDate.substring(0,4);
        return strReturn;
    }
}

/**
 * Name:    getUserTime
 * Desc:    ????????????????
 *          ????"-"??????
 * Author:   
 */
function getUserTime(strStdTime,strTimeType)
{
    if (strStdTime==null) return "";
    
    strStdTime = strStdTime.replace(/:/g,"");

    //??????????????????????: ??????, ????, ??
    if(!strTimeType || (strTimeType!="HHMMSS" && strTimeType!="HH")) strTimeType= "HHMMSS";

    if(strTimeType=="HHMMSS")
    {
        if (strStdTime.length<6) return "";
        var strReturn = strStdTime.substring(0,2)+":"
                        + strStdTime.substring(2,4) + ":"
                        + strStdTime.substring(4,6);
        return strReturn;
    }
    else if (strTimeType=="HHMM")
    {
        if (strStdTime.length<4) return "";
        var strReturn = strStdTime.substring(0,2)+":"
                        + strStdTime.substring(2,4);
        return strReturn;
    }
    else if (strTimeType=="HH")
    {
        if (strStdTime.length<2) return "";
        var strReturn = strStdTime.substring(0,2);
        return strReturn;
    }
}

/**
 * Name:    getStdDate
 * Desc:    ??????????8??????????--YYYYMMDD
 * Author:   
 */
function getUserDate(strStdDate)
{
    if (strStdDate==null) return "";    
    strStdDate = strStdDate.replace(/-/g,"");
    return strStdDate;
}

/**
 * Name:    verifyTime
 * Desc:    ????????????????????
 *          ??????????????input ??onkeyup????????????????
 * @param:  blEnableQuery
 * @param:  strTimeType
 * Author:   
 */
function verifyTime(blEnableQuery,strTimeType)
{
	var element = event.srcElement;
	if (!blEnableQuery)
	{
        blEnableQuery = element.getAttribute("enable_query");
        strTimeType = element.getAttribute("time_type");
	}

    
    var strPrevValue = element.getAttribute("prev_value");
	var strSeparator = ":";
	strCurrentValue = element.value;

    //??????????????8(backspace),????46(del??)????????????????????
	if (event.keyCode==8||event.keyCode==46||event.keyCode==13) return;

    //????????????????"*"????????????
    if (blEnableQuery &&strCurrentValue.indexOf("*")>=0)
    {
        strCurrentValue = "*";
	    element.setAttribute("prev_value",strCurrentValue);
        return;
    }

    //??????????????????????: ??????, ????, ??
    if(!strTimeType || (strTimeType!="HHMM" && strTimeType!="HH"))
        strTimeType= "HHMMSS";

    if(strPrevValue != strCurrentValue)
    {
		var strNewString ="";
		var nLength = strCurrentValue.length;

        //??????????????????????
		for ( i = 0 ; i < nLength ; i ++)
		{
			currentChar = strCurrentValue.charAt(i);
			if((currentChar>='0' && currentChar <='9')||currentChar==strSeparator)
			{
				strNewString = strNewString+currentChar;
			}
		}

		//??????????????????
		var strNewString2 = "";

		var arrTime = strNewString.split(strSeparator);

		var nHour = -1;
		var nMinute = -1;
		var nSecond = -1;

		switch (arrTime.length)
		{
		    case 3:
		        nSecond = parseInt(arrTime[2],10);
        		if (nSecond >= 100) nSecond = parseInt(nSecond/10);
		    case 2:
		        nMinute = parseInt(arrTime[1],10);
        		if (nMinute >= 100) nMinute = parseInt(nMinute/10);
		    case 1:
		        nHour = parseInt(arrTime[0],10);
        		if (nHour >= 100) nHour = parseInt(nHour/10);
		}

        if (nHour >=0)
        {
			if(nHour>= 10 )
		    {
				if (nHour>23) nHour = 23;
				strNewString2 = ""+nHour;
			}
            else if (nHour >=3 || arrTime[0].length==2)
				strNewString2 = "0"+nHour;
			else
			    strNewString2 = ""+nHour ;

			if(strNewString2.length==2 || arrTime.length > 1)
			    strNewString2 = strNewString2 + strSeparator;
        }
        if (nMinute >=0)
        {
            if(nMinute>=10)
            {
                if (nMinute>59) nMinute = 59;
                strNewString2 = strNewString2 + nMinute.toString() + strSeparator;
            }
			else if(nMinute>=6 || arrTime[1].length==2)
				strNewString2 = strNewString2 + "0"+ nMinute.toString() + strSeparator;
			else
			{
				strNewString2 = strNewString2 + nMinute.toString();
				if ( arrTime.length > 2)
				    strNewString2 = strNewString + strSeparator;
			}
        }
        if (nSecond >=0)
        {
            if(nSecond>=10)
            {
                if (nSecond>59) nSecond = 59;
                strNewString2 = strNewString2 + nSecond.toString();
            }
			else if(nMinute>=6 || arrTime[2].length==2)
				strNewString2 = strNewString2 + "0"+ nMinute.toString();
			else
			{
				strNewString2 = strNewString2 + nMinute.toString();
			}
        }

		element.setAttribute("prev_value",strNewString2);
  		element.value = strNewString2;
	}
}

/**
 * Name:    checkTimeFormat
 * Desc:    ????????????????????????????????
 *          ????":"??????
 * Author:   
 */
function checkTimeFormat(blShowWarning,strTimeType)
{
    element = event.srcElement;
    if (!blShowWarning)
	{
        blShowWarning = element.getAttribute("show_warning");
        strTimeType = element.getAttribute("time_type");
	}

    var strMsg = "????????????????'HH:MM:SS'!";
    sTime = event.srcElement.value;
    var blOK = true;

    var strSeparator = ":";

    //strTimeType: ??????, ????, ??
    if(!strTimeType || (strTimeType!="HHMM" && strTimeType!="HH")) strTimeType= "HHMMSS";

    if(strTimeType == "HHMM")
        strMsg = "????????????????'HH:MM'!";
    if(strTimeType == "HH")
        strMsg = "????????????????'HH'!";


    if(sTime!=null && sTime.length > 0 && sTime!="*")
    {
        var arrTime = sTime.split(strSeparator);
		var nHour = -1;
		var nMinute = -1;
		var nSecond = -1;

		switch (arrTime.length)
		{
		    case 3:
		        nSecond = parseInt(arrTime[2],10);
        		if (nSecond >= 100) nSecond = parseInt(nSecond/10);
		    case 2:
		        nMinute = parseInt(arrTime[1],10);
        		if (nMinute >= 100) nMinute = parseInt(nMinute/10);
		    case 1:
		        nHour = parseInt(arrTime[0],10);
        		if (nHour >= 100) nHour = parseInt(nHour/10);
		}

        if (strTimeType == "HH")
        {
            if (nHour < 0)
                blOK = false;
            if (nHour > 23)
                blOK = false;
            if (blOK)
            {
                if (nHour < 10)
                    sTime = "0"+nHour
                else
                    sTime = ""+nHour;
            }

        }
        else if(strTimeType == "HHMM")
        {
            if(nHour < 0 || nHour > 23)
                blOK = false;
            if(nMinute<0 || nMinute > 59)
                blOK = false;
            if (blOK)
            {
                if (nHour < 10)
                    sTime = "0"+nHour
                else
                    sTime = ""+nHour;

                if (nMinute<10)
                    sTime = sTime+strSeparator+"0"+nMinute;
                else
                    sTime = sTime+strSeparator+nMinute;
            }
        }
        else
        {
            if(nHour < 0 || nHour > 23)
                blOK = false;
            if(nMinute<0 || nMinute > 59)
                blOK = false;
            if(nSecond<0 || nSecond > 59)
                blOK = false;
            if (blOK)
            {
                if (nHour < 10)
                    sTime = "0"+nHour
                else
                    sTime = ""+nHour;

                if (nMinute<10)
                    sTime = sTime+strSeparator+"0"+nMinute;
                else
                    sTime = sTime+strSeparator+nMinute;

                if (nSecond<10)
                    sTime = sTime+strSeparator+"0"+nSecond;
                else
                    sTime = sTime+strSeparator+nSecond;
            }
        }
    }

    if((!blOK)&&blShowWarning)
    {
        if(!(document.activeElement.tagName == "INPUT"&&document.activeElement.type=="reset"))
        {
            alert(strMsg);
            event.srcElement.focus();
            event.srcElement.select();
        }
    }
    else if (blOK)
    {
        event.srcElement.value = sTime;
    }
    return blOK;
}


/**
 * Name:    nextFocus
 * Desc:    move the focus to the next component
 * Author:   
 */
function nextFocus()
{
	//srcElement = event.srcElement;
	srcElement = document.activeElement;

	//deselect the src element value
	srcElement.value = srcElement.value;

	//focus the right component
	index = srcElement.sourceIndex;
	for (i = index + 1 ; i < document.all.length ; i++)
	{
        var tmpElement = document.all(i);

        if (isFocusable(tmpElement))
		{
			index = i;
			break;
		}
	}
	
	if (index == srcElement.sourceIndex)
	{
		index = 0;
        for (i = 0 ; i < srcElement.sourceIndex ; i++)
        {
            var tmpElement = document.all(i);
            if (isFocusable(tmpElement))
            {
                index = i;
                break;
            }
        }
	}
	document.all(index).focus();

    //make the value to be selected
	var ctlType2 = "file"+"-"+"password"+"-"+"text";
	if ((document.all(index).tagName == "INPUT" && ctlType2.indexOf(document.all(index).type) >=0)
        ||document.all(index).tagName== "TEXTAREA")
    	document.all(index).select();
}

/**
    ??????????????????????focus
*/
function isFocusable(element)
{
    if (element.offsetHeight<=0) 
    {
        return false;
    }
    if (element.tagName == "INPUT"
        ||element.tagName== "TEXTAREA"
        )
    {
        if (element.type=="button")
        {
            if (element.disabled) 
                return false;
            else 
                return true;
        }
        else if (element.disabled || element.readOnly)
            return false;
        else
            return true;
    }
    else if (element.tagName== "SELECT" || element.tagName== "BUTTON")
    {
        if (element.disabled)
            return false;
        else
            return true;
    }
    return false;
}

/**
 * Name:    setFocus
 * Desc:    set the focus to the right component
 * @param:  index   source index of the component
 * Author:   
 */
function setFocus(index)
{
	if (index != null && isNaN(index)) {
		index.focus();
    
      	var ctlType2 = "file"+"-"+"password"+"-"+"text";
	    if ((index.tagName=="INPUT"&&ctlType2.indexOf(index.type) >=0)
            ||index.tagName== "TEXTAREA")
        {    
        	try
        	{
        	    index.select();
        	}
        	catch(e){}
        }
		return;
	}

    if(index==null) index = 0;


	for (i = index ; i < document.all.length ; i++)
	{
        var tmpElement = document.all(i);

        if (isFocusable(tmpElement))
		{
			index = i;
			break;
		}
	}
	if (!isFocusable(document.all(index))) return;
  	document.all(index).focus();

    document.all(index).blur();
    document.all(index).focus();
    element = document.all(index);
    //make the value to be selected
    var ctlType2 = "file"+"-"+"password"+"-"+"text";
    if ((element.tagName=="INPUT"&&ctlType2.indexOf(element.type) >=0)
        ||element.tagName== "TEXTAREA")
    {
        element.select();
    }
}

/**
 * Name:    keyAction
 * Desc:    ????????????
 * Author:   
 */
function keyAction()
{
	keyCode = event.keyCode;
	
    //????????Enter??????????????????????
	switch (keyCode)
	{
        case 13:
        {
    		if (event.shiftKey || event.ctrlKey) return true;

    		var srcElement = document.activeElement;

            if((srcElement.tagName=="INPUT"&&
                    (srcElement.type=="button"
                        ||srcElement.type=="reset"
                        ||srcElement.type=="submit"
                        ||srcElement.type=="image"))
               ||srcElement.tagName=="BUTTON")
            {
                return true;
            }
            
            var newEvent = document.createEventObject(event);
            
            //event.returnValue = false;
            //event.cancelBubble = true;

            //alert(1);
            newEvent.returnValue = true;
            newEvent.cancelBubble = false;
            
            newEvent.keyCode = 9;
            event.keyCode = 9;
            //srcElement.fireEvent("onkeydown",event);            
            
            
            /*            
    		var ctlType = "checkbox"+"-"+"file"+"-"+"image"+"-"+"password"
    				+"-"+"radio"+"-"+"text";
    		srcElement = document.activeElement;
    		
    		if (srcElement.tagName=="SELECT"
    			||srcElement.tagName=="TEXTAREA"
    			||ctlType.indexOf(srcElement.type) >=0)
    		{
                nextFocus();
                //try
                //{
                //    srcElement.fireEvent("onchange");
                //}
                //catch(e){}
    		}
    		*/
    		break;
    	}
        /*
        case 19:
        {
            //????????form
    		var srcElement = document.activeElement;
            
            while(true)
            {
                if(srcElement == null)
                    break;
                if (srcElement.tagName=="FORM")
                {
                    srcElement.fireEvent("onsubmit");
                    //srcElement.submit();
                    break;
                }
                srcElement = srcElement.parentElement;
            }
    		break;
    	}
    	*/
        default:
        {
         //   if(event.ctrlKey)
         //       alert(event.keyCode);
         //   if(event.enterKey)
         //       alert(event.keyCode);
        }
    	
	}
    	
	

}

/**
 * Name:    addEventHandler
 * Desc:    ??????????????????????????????????????Function????
 *          eg: addSenToEventHandle("window.onload","alert('????');");
 * Author:   
 */
function addEventHandler(strEvent,strNewHandler)
{
    var preSen;
    if (strEvent!=null)
    {
        preSen=eval(strEvent+".toString();");
    }
    else
    {
        preSen="";
    }
    var reg=/^(function +[\w|\$|\.]+ *\([\w|\$|\,|\.]*\) *\n*\{)([\W|\w]*)(\})$/;
    var preBody=preSen.replace(reg,"$2");
    var newFunObj=new Function(preBody+"\n"+strNewHandler);
    eval(strEvent+"=newFunObj;");
}

/**
 * Name:    strTrim
 * Desc:    trim ????
 *          remove leading and trailing spaces
 * Author:   
 */
function strTrim(s) {
    if(typeof(s)!="string") return null;
    s=s.replace(/^ +/, "");
    s=s.replace(/ +$/, "");
    return s;
}


/**
 * Name:    reloadDocument
 * Desc:    reloadDocument
 * Author:   
 */
function reloadDocument()
{
    document.location.reload();
}


/**
 * Name:    initDocument
 * Desc:    Initialize the document on load, including key listener,
 * and init focus object
 * Author:   
 */
function initDocument()
{
	//document.onkeydown=keyAction;
    //setFocus();

}

/**
 * Name:    deleteConfirm
 * Desc:    ????????????????
 * @param:  strMsg   Message????
 * @param:  strTemp  ????????????????
 * Author:   
 */
function deleteConfirm(strMsg,strTemp)
{
    if(confirm(strMsg))
    {
        goto(strTemp);
        return;
    }
    else
    {
        return;
    }
}

/**
 * Name:    isSymbol
 * Desc:    ??????????????????????
 * @param:  strTemp????????????????
 * Author:   
 */
function isSymbol(strTemp) {
	var strValue = strTemp;
	var strCollection = "`~#$%^&*|\\;',/{}:<>?\"";
    if (strValue == null || strValue == "") {
        return false;
    }
    for ( i = 0 ; i < strValue.length ; i ++) {
    	strSubstr = strValue.substring( i, i+1);
    	if (strCollection.indexOf(strSubstr) > 0) {
    		return true;
    	}
   	}

   	return false;

}

/**
 * Name:    checkSymbol
 * Desc:    ????????????????????????????
 * @param:  obj??????????????
 * Author:   
 */
function checkSymbol(obj) {
	if(obj == null) return;
	if(isSymbol(obj.value)) {
		alert("??????????????????????????????????");
		obj.focus();
	}
}


/**
 * Name:    checkInput
 * Desc:    ????????????????????????????????????
 * @param:  obj??????????????
 * Author:  lujunjie
 * returnValue:  -1????????????????????????????0?????????????? 
 * Comment: ????????????????????????????????????onBlur????????????????Form????????????????????????????????????????????
 *          ????????????????????????????????
 */
function checkInput(obj) {
	if(obj == null) return -1;
	if(isSymbol(obj.value)) {
		obj.focus();
		obj.select();
		alert("??????????????????????????????????");
		return -1;
	}
	return 0;
}


/**
 * Name:    isEnglishLetter
 * Desc:    ??????????????????????
 * @param:  strTemp????????????????
 * Author:   
 */
function isEnglishLetter(strTemp) {
	var strValue = strTemp;	
    if (isSymbol(strValue) || checkIsNumAndLetter(strValue)) {
        return true;
    } else {
    	return false;	
    }   
}
  
  /**
 * Name:    count
 * Desc:    ????????????????????????????????2??
 * @param:  sCheck????????????????
 * Author:   
 */  
 function count(sCheck) {
    var str = sCheck;
    var len = str.length;
    var n = 0;
    var i;
    for(i = 0; i < len; i++) {
       n += isEnglishLetter(str.charAt(i)) ? 1 : 2;
	}
	return n;
}

/**
 * Name:    verifyCount
 * Desc:    ??????????????????????????
 * @param:  intCount????????????
 * Author:   
 */
function verifyCount(intCount)
{
    var n = 0;
    var i;
	var element = event.srcElement;
	var strPrevValue = element.getAttribute("prev_value");
	var strCurrentValue = element.value;

	//??????????????32(space??)??????????????"",??????????
	//??????????????????????????	
	if (checkIsNull(strCurrentValue)) {
		element.setAttribute("prev_value","");
  		element.value = "";
		return;		
	}
	
    if(strPrevValue != strCurrentValue)
    {
		var strNewString ="";
		strNewString = strCurrentValue;
		var len = strNewString.length;
		if (count(strNewString) > intCount) {    
		    if (count(strPrevValue) == intCount) {  
		    	strNewString = strPrevValue;
		    } else {
			    for(i = 0; i < len; i++) {
			       n += isEnglishLetter(strNewString.charAt(i)) ? 1 : 2;
			       if (n > intCount) break;
				}
				strNewString = strNewString.substring(0,i);
			}
			element.value = strNewString;
		}		
		element.setAttribute("prev_value",strNewString);  		
	}
}

/**
 * Name:    checkCount
 * Desc:    ??????????????????????????????????????
 *          ??????????2??
 * @param:  intcount????????????
 * Author:   
 */
function checkCount(intcount)
{
    var strMsg = "??????????????"+intcount+"??!";
    sDate = event.srcElement.value;
    	
    
    if(count(sDate)>intcount)
    {
        if(!(document.activeElement.tagName == "INPUT"&&document.activeElement.type=="reset"))
        {
	        alert(strMsg);
	        event.srcElement.focus();
	        event.srcElement.select();
        } 
        return false;
    }
        
    return true;
}


/**
 * Name:    setDateEditorValue
 * Desc:    ????????????
 * @param:  dateElement 
 * @param:  strStdDate
 * Author:  
 */
function setDateEditValue(dateElement,strStdDate)
{
    if ( dateElement == null) return;
    
    if ( dateElement == document.activeElement)
    {
        dateElement.value = strStdDate;
    }
    else
    {
        dateElement.real_value = strStdDate;
        dateElement.value = getUserDate(strStdDate,dateElement.getAttribute("date_type"));
    }
} 

/**
 * Name:    setTimeEditValue
 * Desc:    ????????????
 * @param:  timeElement 
 * @param:  strStdTime
 * Author:  
 */
function setTimeEditValue(timeElement,strStdTime)
{
    if ( timeElement == null) return;
    if ( timeElement == document.activeElement)
    {
        timeElement.value = strStdTime;
    }
    else
    {
        timeElement.real_value = strStdTime;
        timeElement.value = getUserTime(strStdTime,timeElement.getAttribute("time_type"));
    }
} 


/**
 * Name:    multipage_form_jump
 * Desc:    multi_page ToolBar??????????
 * param:   nPageNo ????????????0??????
 * Author:   
 * Date:    20021230
 */
function multipage_form_jump(nPageNo) 
{
    document.multipage_form.pageno.value=nPageNo;
    document.multipage_form.submit();
}

function popupCalendarDlg(ROOT_PATH,strElement)
{
    if (event.type=="click"&&event.srcElement.tagName=="INPUT")
        return;
    else if (event.type=="dblclick"&&event.srcElement.tagName=="BUTTON")
        return;
    else if (event.type=="keydown"&&event.keyCode!=113)
        return;
	var showx = event.screenX - event.offsetX; // + deltaX;
	var showy = event.screenY - event.offsetY + 18; // + deltaY;
	var newWINwidth = 210 + 4 + 18;

	var dateCtrl = document.all(strElement);
	
	var retval = window.showModalDialog(ROOT_PATH+"/bss/js/popup_calendar.html", "", "dialogWidth:197px; dialogHeight:210px; dialogLeft:"+showx+"px; dialogTop:"+showy+"px; status:no; directories:yes;scrollbars:no;Resizable=no; "  );
	if( retval != null && (!dateCtrl.readOnly)&& (!dateCtrl.disabled)){
		dateCtrl.real_value = retval;
        dateCtrl.focus();
	}else{
		//alert("canceled");
	}
}

/**
 * Name:    addDate_sys
 * Desc:    ??????????????????????????????????????8??????????????
 * param:   strDate ?????? 8???????? iDays ?????????? 
 * Author:   
 * Date:    20031225
 *  ??????????????????????????????????????????????????
 */
function addDate_sys(strDate,iDays)
{	
    var strReturn ="";
    
    
    var d = new Date();   
    
    d.setFullYear(strDate.substring(0,4));     
    d.setMonth(strDate.substring(4,6));                         
    d.setDate(strDate.substring(6,8));        

    //d.setUTCFullYear(strDate.substring(0,4));     
    //d.setUTCMonth(strDate.substring(4,6));                         
    //d.setUTCDate(strDate.substring(6,8));        
    
   d.setTime( d.getTime() + iDays*24*60*60*1000);    
   
    var year = String(d.getUTCFullYear());    
    var month = String(d.getUTCMonth());     
    var day = String(d.getUTCDate()); 

    if (month.length <2 ) {
   	month = "0"+month     ;    	
    }
    if (month =="00"){
    	month ="12";
    	year = parseInt(year)-1;
    }

    if (day.length <2 ) {
   	day = "0"+day     ;    	
    }
   
   strReturn  = year+month+day ;
   
    return strReturn;
}

/**
 * Name:    addDate
 * Desc:    ??????????????????????????????????????8??????????????
 * param:   strDate ?????? 8???????? iDays ?????????? iDays ????????
 * Author:   
 * Date:    20031225
 */
function addDate(strDate,iDays)
{
   var	year1 =strDate.substring(0,4);     
   var  month1=strDate.substring(4,6);                         
   var  day1=strDate.substring(6,8);    
   
   var	year2 =strDate.substring(0,4);     
   var  month2=strDate.substring(4,6);                         
   var  day2=strDate.substring(6,8);    

   var nYear = -1;
   var nMonth = -1;
   var nDate = -1;
   
   //??????????????????	     
   var nDays =iDays;   
   var nCurrentDays =getDays(parseInt(year1),parseInt(month1));  
   
  if (parseInt(iDays)>=0) {  
    nCurrentDays =  parseInt(nCurrentDays) -  parseInt(day1); 
    while  (parseInt(nDays)> parseInt(nCurrentDays)){     
        month2 =  parseInt(month2)+1;   
        nDays= parseInt(nDays) - parseInt(nCurrentDays)  ;    
        if (parseInt(month2)>12){
         month2=1;
         year2 = parseInt(year2)+1;
        }
        nCurrentDays = getDays(parseInt(year2),parseInt(month2));                  
   }   
   if (parseInt(year1)==parseInt(year2) && parseInt(month1)==parseInt(month2)){
        day2 =parseInt(day2)+parseInt(iDays);
    }
    else{      
        day2 =parseInt(nDays);      
    }   
  } // iDays>=0
  else{
   nCurrentDays =  parseInt(0)- parseInt(day1); 
   while  (parseInt(nDays) <= parseInt(nCurrentDays)){     
        month2 =  parseInt(month2)-1;   
        nDays= parseInt(nDays) - parseInt(nCurrentDays)  ;    
        if (parseInt(month2)<1){
         month2=12;
         year2 = parseInt(year2)-1;
        }        
        nCurrentDays = parseInt(0) - parseInt(getDays(parseInt(year2),parseInt(month2)) );                  
   }   
   
   if (parseInt(year1)==parseInt(year2) && parseInt(month1)==parseInt(month2)){
        day2 =parseInt(day2)+parseInt(iDays);
    }
    else{      
        day2 =(parseInt(0)-parseInt(nCurrentDays))+parseInt(nDays);      
    }
  }// iDays<0
  
   
   year2 =""+year2;
   month2 =""+month2;
   day2 =""+day2;
   
    if (month2.length <2 ) {
   	month2 = "0"+month2     ;    	
    }
    
    if (day2.length <2 ) {
   	day2 = "0"+day2     ;    	
    }
   strReturn  = year2+month2+day2 ;
   return strReturn;
	
}

initDocument();


function ChkEMail(email)
{
	invalid = ""; 
	
	if (!email)
		invalid = "请输入您的Email地址。";
	else {
	
		if ((email.indexOf("@") == -1) || (email.indexOf(".") == -1) ) 
			invalid += "\n\nEmail地址不合法。应当包含'@'和'.'；例如('.com')。请检查后再递交。";
	
		if (email.indexOf("your email here") > -1)
			invalid += "\n\nEmail地址不合法，请检测您的Email地址，在域名内应当包含'@'和'.'；例如('.com')。";
	
		if (email.indexOf("\\") > -1) 
			invalid += "\n\nEmail地址不合法，含有非法字符(\\)。";
	
		if (email.indexOf("/") > -1) 
			invalid += "\n\nEmail地址不合法，含有非法字符(/)。";
	
		if (email.indexOf("'") > -1) 
			invalid += "\n\nEmail地址不合法，含有非法字符(')。";
	
		if (email.indexOf("!") > -1) 
			invalid += "\n\nEmail地址不合法，含有非法字符(!)。";
	
		if ( (email.indexOf(",") > -1) || (email.indexOf(";") > -1) )
			invalid += "\n\n只输入一个Email地址，不要含有分号和逗号。";
	
		if (email.indexOf("?subject") > -1) 
			invalid += "\n\n不要加入'?subject=...'。";
	}
	
	if (invalid == "")
	{
		return true;
	}
	else 
	{ 
		alert("输入的Email可能包含错误：" + invalid);
		return false;
	}
	
	
}