//非法字符转换函数
/*
 * 函数：
 *     checkFieldsValid(oObject)
 *
 * 功能：
 * 检查数据字段的合法性
 *
 * 输入参数：
 *   oObject    对象，可以是form或单个form控件 也可以是对table中所有form控件的检查
 *

 * 返回值：
 *   true/false
 *


 定义要检查数据字段的属性：
checkName：名称
checkNull：是否可空
checkLength：最大长度
checkBLength: 最大字节长度，非ASCII字符以UTF-8的最大字节数（3）计算
checkNum：输入是否为数字（不支持科学计数法）
checkPlusNil:判断是否为正值 （必须有checkNum属性才生效）
checkGEZero:是否大于等于0（必须有checkNum属性才生效）
checkNil:判断是否为非负值，包含0合法（必须有checkNum属性才生效）
checkIntLth：整数部分最大长度（必须有checkNum属性才生效）
checkDecLth：小数部分最大长度（必须有checkNum属性才生效）
checkInt    整数（必须有checkNum属性才生效）
            BigInt 50 Integer 32 SmallInt 16 TinyInt 8 BigInt本来是64，但是出错，缩小到50
            在这个基础上，再减1
checkFormat：格式化。使用正则表达式，比如定义checkFormat="/D/d/d"，程序将判断输入是否为"字母+数字+数字"
checkDate 日期XXXX-XX-XX
checkChar 为兼容原有程序的属性，新程序中禁止使用该属性。作用是将'转为‘，即半角转全角
checkNegative： 判断是否为负值 （必须有checkNum属性才生效）
checkPlusNegative： 判断是否为非正值 ,小于等于0（必须有checkNum属性才生效）
checkFormatMsg:用正则式格式化时出错的提示信息，如果此属性存在则输出此属性的值，否则使用默认值。


调用方法
--------------------------------------------------
js包含以下两个文件（由于使用alert()输出错误信息，所以要调用Common.js）：
<script type="text/javascript" charset="gb2312" src="/Base/Include/checkFieldsValid.js"></script>
<script type="text/javascript" charset="gb2312" src="/Base/Include/Common.js"></script>

html示例：
<textarea name="check_content" cols="60" rows="5" checkName="工作内容" checkNull="true"></textarea>

if (!checkFieldsValid(oObject)) return false;

 * 修改记录：
 *时间            作者         内容
---------------------------------------------------
2003-4-30       陈镜        创建函数
2003-5-30       陈镜        修改注释
2004-10-12      朱建军      增加checkBLength属性，字节最大长度
2004-10-22      郑旭东      增加对单个表单控件对象或者表格对象的检测，并去掉checkChar属性
2004-10-29      郑旭东      报错时选中控件内容select()
2004-11-1       郑旭东      增加checkDate属性、更改try catch写法
2004-11-9       郑旭东      增加checkInt属性
2004-11-11      郑旭东      为兼容老程序，增加checkChar属性
2004-12-2       郑旭东      对于是非判断的属性，严格写法，只认true，不认false或空，如checkNull="true"为有效，checkNull=""为无效
2004-12-12      郑旭东      由于focus()效果优于select()，取消select()效果，只有无法用focus的对象才用select()
2005-1-3        蔡冠业      增加checkNegative属性
2005-1-3        蔡冠业      增加checkFormatMsg属性,格式错误时的提示信息
2005-1-3        蔡冠业      增加checkNullMsg属性,不能为空时的提示信息
2005-1-13       蔡冠业      checkFieldsValid()函数增加输入参数strForce,可空，数据类型:string,当 strForce=="true"时，强制检查，不论该行有没有被激活
2005-4-8        郑旭东      checkFieldsValid()函数增加输入参数szActionMode，数据类型:sz,当 szActionMode==0时，报非法信息，聚焦，当 szActionMode ==1是，不做任何操作，返回false既可
2005-4-13       陈雄挺      checkFieldsValid()函数增加checkMaxNum,文本的最大值不能超过checkMaxNum
2005-5-19		郑旭东		增加对任意容器内表单控件的检测，但容器不能是table，以后可改进。
2005-6-2		郑旭东		增加参数 szReturnMode，szReturnMode = 0 时return false szReturnMode = 1 时 return object，不传时默认0
2005-6-2		郑旭东		去除try{oObject.focus();}catch(e){oObject.select();}中的oObject.select()语句
2005－8－19 沈阳     	过滤空格并回填 
*/

function checkFieldsValid(oObject,strForce,szActionMode,szReturnMode) {
    var strErrorInfo="checkFieldsValid传入参数必须是对象，包括form、form控件、table";
    if(typeof(oObject)!="object"){
        alert(strErrorInfo);
        return false;
    }else{
        if(!oObject.tagName){
            alert(strErrorInfo);
            return false;
        }
    }
    //如果是form
    if(oObject.tagName=="FORM"){
    	for (i=0;i<oObject.elements.length;i++) {
            var theObject=oObject.elements[i];
            var E = checkFieldValidSingle(theObject,szActionMode,szReturnMode);
            if (E != true) return E;
        }
        return true;
    }
     //如果是表格
    if(oObject.tagName=="TABLE"){
    	for (i=0;i<oObject.tBodies[0].rows.length;i++) {
            var activeFlag=(oObject.tBodies[0].rows[i].active=="true") ? "true" : "false";//默认为行的 active

            if (strForce=="true")
                activeFlag=(oObject.tBodies[0].rows[i].active=="false" && oObject.tBodies[0].rows[i].flag_NorO==1) ? "false" : "true"; //如果是强制检查，则为true;

            //如果是激活行

            if(activeFlag=="true"){
                //循环该行的所有表单控件
                for(j=0;j<oObject.tBodies[0].rows[i].all.length;j++){
                    var theObject=oObject.tBodies[0].rows[i].all[j];
                    if(theObject.tagName=="INPUT" || theObject.tagName=="TEXTAREA" || theObject.tagName=="SELECT"){
                        var E = checkFieldValidSingle(theObject,szActionMode,szReturnMode);
                        if (E != true) return E;
                    }
                }
            }
        }
        return true;
    }
    //如果是单个表单控件
    if(oObject.tagName=="INPUT" || oObject.tagName=="TEXTAREA" || oObject.tagName=="SELECT"){
        var E = checkFieldValidSingle(oObject,szActionMode,szReturnMode);
        return E;
    }

    //普通容器，检查容器内的所有控件，因为TABLE已经被特殊捕捉，所以普通容器不允许使用table对象，以后确有需求可考虑改进。
	for (var i=0;i<oObject.all.length;i++) {
        var theObject = oObject.all[i];
        if(theObject.tagName=="INPUT" || theObject.tagName=="TEXTAREA" || theObject.tagName=="SELECT"){
            var E = checkFieldValidSingle(theObject,szActionMode,szReturnMode)
            if (E != true) return E;
        }
    }

	return true;
}

function checkFieldValidSingle(oObject,szActionMode,szReturnMode){
	var theValue = oObject.value.replace(/^\s+|\s+$/g,"");//trim
	oObject.value = theValue;//过滤空格并回填
	if(szActionMode == null || szActionMode == undefined) szActionMode = 0;
	if(szReturnMode == null || szReturnMode == undefined) szReturnMode = 0;
    if (oObject.checkNum == 'true' && theValue != '') {
    	if (isNaN(theValue) || theValue.indexOf('E')!=-1 || theValue.indexOf('e')!=-1){
    		if(szActionMode == 0){
				alert(oObject.checkName+"应该为数字格式");
       try{oObject.focus();}catch(e){}
	    	}
	    	if(szReturnMode == 0) return false;
    		else return oObject;
    	}
    	if (oObject.checkPlusNil == 'true') {
    		if (parseFloat(theValue) <= 0) {
    			if(szActionMode == 0){
	    			alert(oObject.checkName+"必须填入正值");
                 try{oObject.focus();}catch(e){}
	            }
		    	if(szReturnMode == 0) return false;
				else return oObject;
    		}
    	}
    	if (oObject.checkNegative == 'true') {
    		if (parseFloat(theValue) >= 0) {
    			if(szActionMode == 0){
	    			alert(oObject.checkName+"必须填入负值");
                 try{oObject.focus();}catch(e){}
	            }
		    	if(szReturnMode == 0) return false;
				else return oObject;
    		}
    	}
    	if (oObject.checkPlusNegative == 'true') {
    		if (parseFloat(theValue) > 0) {
    			if(szActionMode == 0){
	    			alert(oObject.checkName+"必须填入小于等于0的值");
                 try{oObject.focus();}catch(e){}
	            }
		    	if(szReturnMode == 0) return false;
				else return oObject;
    		}
    	}
    	if (oObject.checkGEZero == 'true') {
    		if (parseFloat(theValue) < 0) {
    			if(szActionMode == 0){
					alert(oObject.checkName+"必须填入大于等于0的值");
                 try{oObject.focus();}catch(e){}
	            }
		    	if(szReturnMode == 0) return false;
				else return oObject;
    		}
    	}
    	if (oObject.checkNil == 'true') {
    		if (parseFloat(theValue) < 0) {
    			if(szActionMode == 0){
					alert(oObject.checkName+"必须填入正值或者零");
                 try{oObject.focus();}catch(e){}
	            }
		    	if(szReturnMode == 0) return false;
				else return oObject;
    		}
    	}
    	if (oObject.checkIntLth){
            var checkIntLth = oObject.checkIntLth;
           
            if(theValue.split(".")[0].length>checkIntLth){
    			if(szActionMode == 0){
					alert(oObject.checkName+"整数部分超长，最大长度为:"+checkIntLth);
                 try{oObject.focus();}catch(e){}
	            }
		    	if(szReturnMode == 0) return false;
				else return oObject;
    		}
    	}
		
    	if (oObject.checkDecLth){
    		if(theValue.split(".").length>1)
    		if(theValue.split(".")[1].length>oObject.checkDecLth){
    			if(szActionMode == 0){
					alert(oObject.checkName+"小数部分超长，最大长度为:"+oObject.checkDecLth);
                 try{oObject.focus();}catch(e){}
	            }
		    	if(szReturnMode == 0) return false;
				else return oObject;
    		}
    	}
    	if (oObject.checkMaxNum){
    		var checkMaxNum = oObject.checkMaxNum;
    		if(parseFloat(theValue)>parseFloat(oObject.checkMaxNum)){
    			if(szActionMode == 0){
					alert(oObject.checkName+"值不能大于:"+oObject.checkMaxNum);
                 try{oObject.focus();}catch(e){}
	            }
		    	if(szReturnMode == 0) return false;
				else return oObject;
    		}
    	}
        if (oObject.checkInt){
            if(isNaN(oObject.checkInt)){
                alert("调试信息：checkInt属性里面写位数，比如如果该字段为BIGINT，那么checkInt=\"50\"");
                return false;
            }
            nBit = (oObject.checkInt == '') ? 8 - 1 : oObject.checkInt ;
            var maxInt=Math.pow(2,nBit-1 - 1);
            var flag = 0 ;
            if(theValue.indexOf(".") != -1)
                flag = 1;
            else{
                if(theValue > maxInt || theValue < - maxInt){
                    flag = 1;
                }
            }
            if(flag == 1){
    			if(szActionMode == 0){
					alert(oObject.checkName+"必须是整数，且大小应介于 -"+maxInt+" 和 "+maxInt+" 之间");
                 try{oObject.focus();}catch(e){}
	            }
		    	if(szReturnMode == 0) return false;
				else return oObject;
    		}
    	}
    }

    //为兼容老程序而加的属性，新程序中禁止使用该属性，转换单引号
    if (oObject.checkChar) {
    	var re = /'/g;
    	theValue = theValue.replace(re,'\u2019');
    }
 
    if (oObject.checkLength) { 
    	if (theValue.length > parseInt(oObject.checkLength)) {
    		if(szActionMode == 0){
				alert(oObject.checkName+'长度超出'+oObject.checkLength+'字');
       try{oObject.focus();}catch(e){}
	    	}
	    	if(szReturnMode == 0) return false;
			else return oObject;
    	}
    }

	 if (oObject.checkMinLength) { 
    	if (theValue.length < parseInt(oObject.checkMinLength)) {
    		if(szActionMode == 0){
				alert(oObject.checkName+'长度应大于'+oObject.checkMinLength+'字');
       try{oObject.focus();}catch(e){}
	    	}
	    	if(szReturnMode == 0) return false;
			else return oObject;
    	}
    }

    if (oObject.checkNull == 'true') {
    	if (theValue == '') {
        	if(szActionMode == 0){
				if (oObject.checkNullMsg==undefined || oObject.checkNullMsg=='')
	                alert(oObject.checkName+'不能为空');
	            else
	                alert(oObject.checkNullMsg);
	    		try{oObject.focus();}catch(e){}
	    	}

	    	if(szReturnMode == 0) return false;
			else return oObject;
    	}
    }

    if (oObject.checkFormat) {
    	var cf = oObject.checkFormat;
    	var ss = new RegExp(oObject.checkFormat,'g');
    	var fd = theValue;
    	if (!ss.test(fd)){
    	    if(szActionMode == 0){
				if (oObject.checkFormatMsg==undefined || oObject.checkFormatMsg=='')
	                alert(oObject.checkName+'的字符模式不匹配!');
	            else
	                alert(oObject.checkFormatMsg);
       try{oObject.focus();}catch(e){}
	    	}
	    	if(szReturnMode == 0) return false;
			else return oObject;
        }
    }

	 if (oObject.checkMail == 'true') {
    	if (theValue != '') {
				if (!(theValue.indexOf("@") > -1 && theValue.indexOf(".") > -1))
			{
	                alert(oObject.checkName+'格式不对应如abc@emil.com!');
	            
	    		try{oObject.focus();}catch(e){}
				return false;
			}
	    
    	}
    }

    if (oObject.checkBLength) {
        var iLen = 0;
        var tmpValue = theValue;
        for(var j=0; j<tmpValue.length; j++){
            iLen += (tmpValue.charCodeAt(j) > 127) ? 3 : 1;
        }
        if(iLen > parseInt(oObject.checkBLength)){
            if(szActionMode == 0){
				alert(oObject.checkName+'长度超出'+oObject.checkBLength+'字');
       try{oObject.focus();}catch(e){}
	    	}
	    	if(szReturnMode == 0) return false;
			else return oObject;
        }
    }

    if (oObject.checkDate == 'true' && theValue != '') {
        var reg = /^(\d{4})(-)(\d{1,2})\2(\d{1,2})$/;
        result = theValue.match(reg);
        if(result == null){
            if(szActionMode == 0){
				alert(oObject.checkName+'日期格式不匹配，应为yyyy-mm-dd');
       try{oObject.focus();}catch(e){}
	    	}
	    	if(szReturnMode == 0) return false;
			else return oObject;
        }
        var d = new Date(result[1],result[3]-1,result[4])
        if(result[1]!=d.getFullYear() || result[3]!=d.getMonth()+1 || result[4]!=d.getDate()){
            if(szActionMode == 0){
				alert(oObject.checkName+'是无效的日期！');
       try{oObject.focus();}catch(e){}
	    	}
	    	if(szReturnMode == 0) return false;
			else return oObject;
        }

    }
    return true;

}



function IsChar(s)
{ 
 var Number = "0123456789abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ~_";
 for (i = 0; i < s.length;i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (Number.indexOf(c) == -1) return false;
    }
 return true
}

 function CheckRadio(theRadio,HtheRadio){
   for (i=0;i<theRadio.length;i++){
            if (theRadio[i].value==HtheRadio.value){
                 theRadio[i].checked=true;
                break;
            }
        }
}