/*
文件修改记录：
   2004-06-01  创建文件
   2004-06-02  docCheck()加入了$check域的处理和对password的类型域的校验
   2005-04-06  加入disableForm函数，可写表单提供变为显示表单的功能
*/

/*
判断字符串的字节数
*/
function varcharLength(str) {
	return str.replace(/[^\x00-\xff]/g,'**').length;
}

/*
   把一个可输入数据的表单变为只显示数据的表单
   myform:表单名称
 */
function disableForm(myform){

   for(var i=0;i<myform.length;i++){
     //把文本输入框等变为不可写
     if(myform[i].disabled==false){
       myform[i].disabled=true;
     };
     //不显示所有的按钮
    try{
     if((myform[i].type=="button")||(myform[i].type=="submit")){
    	  myform[i].style.display="none";
     }
     } catch(e){}
   }
}

function trim(str)
/*
用  途:用于去掉一个字符串前后的空格
思  路:
*/
{
  for(var i = 0 ; i<str.length && str.charAt(i)==" " ; i++ ) ;
  for(var j =str.length; j>0 && str.charAt(j-1)==" " ; j--) ;
  if(i>j) return "";
  return str.substring(i,j);
}

function addspace(str,size)
/*
编程人:李子强
用  途:用于向字符串末尾追加HTML中所代表空格的&nbsp字符串
思  路:根据在用户提供的字符串末尾追加size次"&nbsp"字符串
*/
{
  var i=0
  len=str.length
  if (len<size)
    for (i=len+1;i<=size;i++)
       str=str+"&nbsp";
  return(str);
}


function isNumber(string)
/*
编程人:李子强
用  途:用于判断提供的字符串的内容是否为一个数值
思  路:通过isNaN函数来判断一个由字符串生成的数值变量是否有效
*/
{
  if (string==null) return false;
     number = new Number(string);
  if (isNaN(number)) return false;
  return true;
}

function isInteger(str)
/*
编程人:万东迎
用  途:用于判断提供的字符串的内容是否为一个整数
思  路:通过isNaN函数来判断一个由字符串生成的数值变量是否有效
*/
{

	var patrn=/^[-]{0,1}[0-9]{1,}$/;
	if (!patrn.exec(str))
		return false;
	return true;
}

function isDate(DateString,full,Dilimeter)
/*
编程人:李子强
用  途:用于判断字符串内容是否为日期。
思  路:将字符串分离成年月日，并用"/"号分隔，产生新日期型变量，并现次获得其中的年月日，再次比较。         还要考虑到，用户输入的1位的月或日的情况。
参  数:DateString 要判断的字符串值
       full 如果此值为真,则日期必须为10位,即yyyy-mm-dd，默认为false
       Dilimeter 分隔符，默认为"-"
被调用: docSearch()函数
        docCheck()函数
*/
{
  var tempArray,tempDate;

  if (DateString==null) return false;
  if (Dilimeter=='' || Dilimeter==null)   Dilimeter = '-';
  if (full==null) full=false;
  if (DateString.length<8 && DateString.length>10)   return false;
  tempArray = DateString.split(Dilimeter);
  if (tempArray.length!=3)  return false;
  if (full&& (tempArray[0].length<4||tempArray[1].length<2|| tempArray[2].length<2)) return false; //如果函数设为月和日是两位，则进行判断
  var instr=parseInt(tempArray[0],10)+'/'+parseInt(tempArray[1],10)+'/'+parseInt(tempArray[2],10) //生成新的字符串格式，并且去掉前置的0。

  tempDate=new Date(instr);
  var y=tempDate.getFullYear();
  var m=tempDate.getMonth()+1;
  var d=tempDate.getDate();
  var newday=y + "/" + m + "/" + d;
  if (newday!=instr)
  {
    return false;
   }
   return true;

}

function isTime(str)
/*
编程人:李子强
日  期:2004-02-13
用  途:用于判断一个字符串的值是否为合法的时间
参  数:str
返回值:合法时间返回真,否则返回假
*/
{
  var i,tmp;
  var hhmmss=new Array();
  hhmmss=str.split(":");
  for(i=0;i<hhmmss.length;i++)
  {
    tmp=parseInt(hhmmss[i]) //获得分段值
    if (i>2||isNaN(hhmmss[i])||""==hhmmss[i]||tmp<0)
       return false; //如果多于三段/非数值/空值/小于0则返回
    else
       switch (i)
        {
         case 0: if (tmp>23) return false; //判断小时
         case 1: if (tmp>59) return false; //判断分
         case 2: if (tmp>59) return false; //判断秒
         }
  }
    return true;
}

function isDateTime(str)
/*
编程人:李子强
日  期:2004-02-13
用  途:用于判断一个字符串的值是否为合法的日期时间型
参  数:str ,如果字符串中间没有空格,则认为只是日期,无时间
返回值:合法时间返回真,否则返回假
*/
{
  var sDate;
  var sTime;
  var iPos;
  iPos=str.indexOf(" ");
  if (iPos<0) //如果没有时间,则只按日期检测
   {
     sDate=str;
     return(isDate(trim(sDate)));
   }
  else
    {
     sDate=trim(str.substring(0,iPos+1));
     sTime=trim(str.substring(iPos+1,100));
     return (isDate(sDate)&&isTime(sTime));
    }
}


function getValue(s,name,mark)
/*
编程人:李子强
用  途:用于将获得字符串中的指定参数
*/
{
  var iPos1,iPos2 //用于定位指定参数的前后位置

  s=s.toLowerCase();
  name=name.toLowerCase();
  if (mark==null)  mark="&"
  var key=mark+name+"=" //定位名字前面加入分隔号是为定位更准确
  s=s+mark  //在字符串最后面加上分隔标记,以便分隔
  iPos1=s.indexOf(key);
  if (iPos1<0) return "";  //如果没有找到此名字,则返回空串
  iPos2=s.indexOf(mark,iPos1+mark.length); //查找下一个时，起始值要跳过分隔符
  s=s.substring(iPos1+key.length,iPos2);  //s此时的值为指定名字的参数
  return s;
}


function getKeyValue(s,name,key)
/*
编程人:李子强
用  途:用于将获得字符串中的指定名字的指定参数
被调用: docSearch()函数
        docCheck()函数
*/

{
  var iPos1,iPos2 //用于定位指定参数的前后位置

  s=s.toLowerCase();
  name=name.toLowerCase();
  key=key.toLowerCase();

  s=s+";"  //在字符串最后面加上";",以便分隔
  iPos1=s.indexOf(name+":");//定位名字时加入冒号后更准确
  if (iPos1<0) return "";  //如果没有找到此名字,则返回空串
  iPos2=s.indexOf(";",iPos1);
  s=s.substring(iPos1,iPos2);  //s此时的值为指定名字的参数

  s=s+" "  //在字符串最后面加上" ",以便分隔
  iPos1=s.indexOf(key+"=");//定位名字时加入冒号后更准确
  if (iPos1<0) return "";  //如果没有找到此关键字,则返回空串
  iPos2=s.indexOf(" ",iPos1);  //用空格分隔每个参数
  s=s.substring(iPos1+key.length+1,iPos2);  //s此时的值为指定的参数值,加1是因为"="号

  return s;
}


function getValueByIndex(s,index,name,mark)
/*编程人:李子强
  用  途:用于获得指定位置的分隔符分隔的字符串,如果指定name则返回指定的name的值.
  日  期:2004-01-30
*/

{
  var iPos1,iPos2; //用于定位指定参数的前后位置
  var i,fromIndex;
  s=s.toLowerCase();
  if (name!=null) name=name.toLowerCase();
  if (mark==null) mark=";";

  s=s+mark  //在字符串最后面加上";",以便分隔
  i=0;
  fromIndex=0;
  for (i=0;i<index;i++)
  {
    iPos1=s.indexOf(mark,fromIndex);//定位名字时加入冒号后更准确
    if (iPos1<0) return "";  //如果没有找到此名字,则返回空串
    fromIndex=iPos1+1
    return;
  }

  iPos2=s.indexOf(";",iPos1);
  s=s.substring(iPos1,iPos2);  //s此时的值为指定名字的参数

  s=s+" "  //在字符串最后面加上" ",以便分隔
  iPos1=s.indexOf(name+"=");//定位名字时加入冒号后更准确
  if (iPos1<0) return "";  //如果没有找到此关键字,则返回空串
  iPos2=s.indexOf(" ",iPos1);  //用空格分隔每个参数
  s=s.substring(iPos1+key.length+1,iPos2);  //s此时的值为指定的参数值,加1是因为"="号

  return s;
}
/*
编程人:万东迎
日  期:2008-4-9
用  途:用于判断一个字符串的值是否为英文
参  数:str
返回值:合法时间返回真,否则返回假
*/
function isEnglish(str) //英文值检测
{
	var patrn=/^[a-zA-Z]+$/;   
	if (!patrn.exec(str))
		return false;
	return true;
}
/*
编程人:万东迎
日  期:2005-08-01
用  途:用于判断一个字符串的值是否为有效的注册名
	   由数字、26个英文字母或者下划线组成的字符串
参  数:str
返回值:合法用户名返回真,否则返回假
*/
function isRegisterName(str)
{
	var patrn=/^\w+$/;   
	if (!patrn.exec(str))
		return false;
	return true;
}
/*
编程人:万东迎
日  期:2008-4-9
用  途:用于判断一个字符串的值是否为中文
参  数:str
返回值:合法时间返回真,否则返回假
*/
function isChinese(str) //中文值检测
{
	var patrn=/^[^u4e00-u9fa5]+$/;   
	if (!patrn.exec(str))
		return false;
	return true;
}
/*
编程人:万东迎
日  期:2008-4-9
用  途:用于判断一个字符串的值是否为合法的EMAIL
参  数:str
返回值:合法时间返回真,否则返回假
*/
function isEMail(str) // E-mail值检测
{
	var patrn=/^[0-9a-zA-Z]+@[0-9a-zA-Z]+[\.]{1}[0-9a-zA-Z]+[\.]?[0-9a-zA-Z]+$/;   
	if (!patrn.exec(str))
		return false;
	return true;
}

/*
编程人:万东迎
日  期:2008-4-9
用  途:用于判断一个字符串的值是否为合法的手机号码
参  数:str
返回值:合法时间返回真,否则返回假
*/
function isMobil(str)
{
	//var patrn=/^(\+86)?(1[0-9]{10})$/;   
	var patrn=/^(\d{3,11})$/;   
	if (!patrn.exec(str))
		return false;
	return true;
}

/*
编程人:万东迎
日  期:2008-4-9
用  途:用于判断一个字符串的值是否为合法的国内电话
	   匹配形式如 0511-4405222 或 021-87888822
参  数:str
返回值:合法时间返回真,否则返回假
*/
function isPhone(str)
{
var patrn=/^((\d{3}-\d{7,8})|(\d{4}-\d{7,8}))$/;  
	if (!patrn.exec(str))
		return false;
	return true;
}


/*
编程人:万东迎
日  期:2008-4-9
用  途:用于判断一个字符串的值是否为合法的国内邮政编码
	   中国邮政编码为6位数字
参  数:str
返回值:合法时间返回真,否则返回假
*/
function isPostalCode(str)
{
	var patrn=/^\d{6}$/;   
	if (!patrn.exec(str))
		return false;
	return true;
}

/*
编程人:万东迎
日  期:2008-4-9
用  途:用于判断一个字符串的值是否为合法的国内身份证号码
	   中国的身份证为15位或18位
参  数:str
返回值:合法时间返回真,否则返回假
*/
function isIDCard(str)
{
	var patrn=/^(\d{15}|\d{18})$/;   
	if (!patrn.exec(str))
		return false;
	return true;
}

/*
编程人:万东迎
日  期:2008-12-20
用  途:用于判断一个字符串的值是否为合法的JSP文件名
	   规则
参  数:str
返回值:合法时间返回真,否则返回假
*/
function isAvailJspFileName(str)
{
	var patrn=/^\w+\.jsp/;
	//var patrn=/^(\d{15}|\d{18})$/;   
	if (!patrn.exec(str))
		return false;
	return true;
}

function docCheck(isCheckNull)
{
/*
编程人:李子强
用  途:用于获得检查当前文档的域中的值是否有效,
       本函数将从表单中的域$Check域(注意C大写)中获得的相应的值，
       $Check的值要搜索的域的参数：其格式例为
       ItemName:Type=TypeName Null=No Hint=Hint;
       （一组参数中用空格分隔。每组参数之间用分号分隔，最后一组的分号可以不写。

       如果Name忽略则被搜索域名为ItemName,若Type忽略则默认为Text，若Sign忽略，
       则按类型产生相应的默认值,Hint=非数值型字段。

       例：
        "createdate:type=date Null=No Hint=无效的日期;
         mannumber:type=number Null=N hint=人数必须为数字;

        上面两行的代码表示，如果createdate的域值为空或无效的日期时将提示"无效的日期".
                            如果mannumber的域值为空或无效数字时将提示"人数必须为数字".
        在data1和date2指定的日期之间的全部文档。

        注：除了域$Check的名字区分大小写之外，其它的值都不区分大小写

被调用:各表单的onCommit事件

最后修改:
         2003-06-11 为了给由HTML表单转换的Notes表单提供相应功能,form[item.name].focus()改为form[i].focus();
         2004-02-13 增加了时间型和日期时间型的校验
         2004-02-24 加入是否做空判断,已用于只保存不发送的情况
         2004-03-04 在最后加入return true，最终返回真.
         2004-03-15 增加了对当前不可视的域(如其它栏目的域)的只提示不设焦点处理.
         2004-03-21 将所有检验的函数名字is都统一为小写
  	 2004-06-02 加入了$check域的支持
	 2004-06-02 加入了password类型的校验
*/

  var i;
  var item,form,querystr;
  var para; //搜索参数

  var type,hint,isnull,maxlength,minlength;
  var value;

  if (null==isCheckNull)
  {
	  isCheckNull=true; //默认为检查域是否为空.
  }
  form=document.forms[0];
  try{
	  para=form['$Check'].value;  //注意此处的$Check区分大小写
  }
  catch(e){
     try{
	  para=form['$check'].value;  //对小写的支持(2004-06-02日加)
     }catch(e){//没有$check域
       return true;
     }
  }

  for (i=0;i<form.length -1;i++)
  {
    item=form[i];
    if (item.type=="text" || item.type=="password" || item.type=="textarea"||item.type=="select-one" && item.name.toLowerCase()!="$check")
      {
        type=getKeyValue(para,item.name,"type");
        isnull=getKeyValue(para,item.name,"null");
        hint=getKeyValue(para,item.name,"hint");
		maxlength=getKeyValue(para,item.name,"maxlength");
		minlength=getKeyValue(para,item.name,"minlength");
		dotpreminlength=getKeyValue(para,item.name,"dotpreminlen");
		dotpremaxlength=getKeyValue(para,item.name,"dotpremaxlen");
		dotpostminlength=getKeyValue(para,item.name,"dotpostminlen");
		dotpostmaxlength=getKeyValue(para,item.name,"dotpostmaxlen");
		if (""==maxlength) maxlength="unlimited";
		if (""==minlength) minlength="unlimited";
		if (""==dotpreminlength) dotpreminlength="1";
		if (""==dotpremaxlength) dotpremaxlength="dotpremaxlengthunlimited";
		if (""==dotpostminlength) dotpostminlength="1";
		if (""==dotpostmaxlength) dotpostmaxlength="dotpostmaxlengthunlimited";
        if (""==type) type="text";  //默认为text值
		if (""==isnull) isnull="yes"
        if (""==hint)  //设置sign值
          switch(type) //根据类型生成默认的符号
           {
             //case "text":hint="无效的文本";break;
			 case "text":hint="此处的值不能为空";break;
			 case "integer":hint="无效的整数";break;
             case "number":hint="无效的数字";break;
             case "date":hint="无效的日期或日期格式(格式：2008-01-01)";break;
             case "time":hint="无效的时间或时间格式(格式：18:30:00)";break;
             case "datetime":hint="无效的日期时间或格式(格式：2008-01-01 18:30:00)";break;
             case "english":hint="非法的英文名称";break;
			 case "chinese":hint="非法的中文名称";break;
			 case "registername":hint="非法的注册用户名，用户名只能包含数字、26个英文字母和下划线";break;
			 case "email":hint="非法的email格式";break;
			 case "mobil":hint="非法的手机号码";break;
			 case "phone":hint="非法的电话号码";break;
			 case "postalcode":hint="非法的邮政编码";break;
			 case "idcard":hint="非法的身份证号码";break;
			 case "jspfilename":hint="无效的jsp文件名，名称只能包含字母、数字和下划线，后缀必须是.jsp";break;

			}
        //-----------下列代码用于检查各域值的有效性-----------------
        value=trim(item.value);
		if((isnull.indexOf("y")!=-1) || !isCheckNull)//如果可以为空的值为空或者是不做空值检查时
		  {
			  if("" == value)
				continue;
			  else{
			  		  //检查是否有限制长度
					if(maxlength!="unlimited"){
						var maxlen=parseInt(maxlength);
							if(varcharLength(value)>maxlen)
							 {
									alert("此处字符不能超过"+maxlength+"个字符！");
									form[i].focus();
									return false;
							 }
						 }
			  }
		  }

        if((""==value) && (isnull.indexOf("y")==-1) && isCheckNull) //如果不该为空的域值为空时
          {
               if (item.offsetWidth!=0) //如果该域是显示的,则即提示又设焦点,否则只提示(2004-03-15)
                 {
                   alert(hint);
                   form[i].focus();
                 }
               else
                 {
                   alert("在其它栏目中有未填写的项目");
                 }
 	           return false;
          }
        else
          {
             if (type=="integer"&&!isInteger(value)) //如果值为非整数
            {
              if(isnull.indexOf("y")>=0&&value==""){
 			  }else{
		      alert(hint);
                     form[i].focus();
 			         return false;
 				}
	         }else if(type=="integer"&& isInteger(value))//如果值为整数
	         {
	         	/**
				if(value < 0) {
	         		alert("此处不能为负整数");
                     form[i].focus();
 			         return false;
	         	}
				*/
	         }
            else if (type=="number" && !isNumber(value)) //如果值为非数字型
            {
              if(isnull.indexOf("y")>=0&&value==""){
 			}else{
		             alert(hint);
                     form[i].focus();
 			         return false;
 			}
	              }else if(type=="number" && isNumber(value)) {//如果值为数字型
				  /**
	              	if(value < 0) {
		         		alert("此处不能为负数");
	                     form[i].focus();
	 			         return false;
		         	}
					*/
	              }
            else if (type=="date" && !isDate(value)) //如果值为非日期型
            {
              if(isnull.indexOf("y")>=0&&value==""){
 			}else{
		             alert(hint);
                     form[i].focus();
 			         return false;
 			}
	              }
            else if (type=="time" && !isTime(value)) //如果值为非时间型
            {
              if(isnull.indexOf("y")>=0&&value==""){
 			}else{
		             alert(hint);
                     form[i].focus();
 			         return false;
 			}
	              }
            else if (type=="datetime" && !isDateTime(value)) //如果值为非日期时间型
            {
              if(isnull.indexOf("y")>=0&&value==""){
 			}else{
		             alert(hint);
                     form[i].focus();
 			         return false;
 			}
	              }
            else if (type=="english" && !isEnglish(value)) //如果值包含非法的英文字符
            {
              if(isnull.indexOf("y")>=0&&value==""){
 			}else{
		             alert(hint);
                     form[i].focus();
 			         return false;
 			}
            }
            else if (type=="chinese" && !isChinese(value)) //如果值包含非法的中文字符
            {
              if(isnull.indexOf("y")>=0&&value==""){
 			}else{
		             alert(hint);
                     form[i].focus();
 			         return false;
 			}
            }
            else if (type=="registername" && !isRegisterName(value)) //如果值包含非法的注册用户名
            {
              if(isnull.indexOf("y")>=0&&value==""){
 			}else{
		             alert(hint);
                     form[i].focus();
 			         return false;
 			}
            }
			else if (type=="email" && !isEMail(value)) //如果值为非法的email
            {
              if(isnull.indexOf("y")>=0&&value==""){
 				}else{
		             alert(hint);
                     form[i].focus();
 			         return false;
 				}
	        }
			else if (type=="mobil" && !isMobil(value)) //如果值为非法的手机号码
            {
              if(isnull.indexOf("y")>=0&&value==""){
 				}else{
		             alert(hint);
                     form[i].focus();
 			         return false;
 				}
	        }
            else if (type=="phone" && !isPhone(value)) //如果值包含非法的电话号码
            {
              if(isnull.indexOf("y")>=0&&value==""){
 				}else{
		             alert(hint);
                     form[i].focus();
 			         return false;
 				}
	       	}
            else if (type=="postalcode" && !isPostalCode(value)) //如果值包含非法的邮政编码
            {
              if(isnull.indexOf("y")>=0&&value==""){
 				}else{
		             alert(hint);
                     form[i].focus();
 			         return false;
 				}
	       	}
            else if (type=="idcard" && !isIDCard(value)) //如果值包含非法的身份证号码
            {
              if(isnull.indexOf("y")>=0&&value==""){
 				}else{
		             alert(hint);
                     form[i].focus();
 			         return false;
 				}
	       	}
            else if (type=="jspfilename" && !isAvailJspFileName(value)) //如果值包含非法的身份证号码
            {
              if(isnull.indexOf("y")>=0&&value==""){
 				}else{
		             alert(hint);
                     form[i].focus();
 			         return false;
 				}
	       	}
          }
		  //检查是否有限制长度
		  if(maxlength!="unlimited"){
			  var maxlen = parseInt(maxlength);
			  if(varcharLength(value) > maxlen)
			  {
				    alert("此处字符不能超过"+maxlength+"个字符！");
					form[i].focus();
					return false;
			  }
		  }
		  
		   if(minlength!="unlimited"){
			  var minlen=parseInt(minlength);
			  if(varcharLength(value)<minlen)
			  {
				    alert("此处字符不能少于"+minlength+"个字符！");
					form[i].focus();
					return false;
			  }
		  }

		  //检查数字型是否有精度限制，小数点之前。前提是前面已经做过是数字型的判断
		  if(dotpremaxlength!="dotpremaxlengthunlimited"){
			  var dotpreminlen=parseInt(dotpreminlength);
			  var dotpremaxlen=parseInt(dotpremaxlength);
			  var tempvalue=value;
			  var pos = value.indexOf(".");
			  //判断是否存在小数点
			  if(pos!=-1){
				  tempvalue=value.substr(0, pos);
			  }

			  if(tempvalue.length<dotpreminlen)
			  {
				    alert("此处数字精度不准确，小数点前需要"+dotpreminlen+"至"+dotpremaxlength+"位数字！");
					form[i].focus();
					return false;
			  }
			  if(tempvalue.length>dotpremaxlen)
			  {
				    alert("此处数字精度不准确，小数点前需要"+dotpreminlen+"至"+dotpremaxlength+"位数字！");
					form[i].focus();
					return false;
			  }
		  }

		  //检查数字型是否有精度限制，小数点之后
		  if(dotpostmaxlength!="dotpostmaxlengthunlimited"){
			  var dotpostminlen=parseInt(dotpostminlength);
			  var dotpostmaxlen=parseInt(dotpostmaxlength);
			  var tempvalue=value;
			  var pos = value.indexOf(".");
			  //判断是否存在小数点，如果不存在小数点，不做判断
			  if(pos!=-1){//存在
				  tempvalue=value.substr(pos+1);
				  if(tempvalue.length<dotpostminlen){
				       alert("此处数字精度不准确，小数点后需要"+dotpostminlen+"至"+dotpostmaxlen+"位数字！");
					   form[i].focus();
					   return false;
				  }
				  if(tempvalue.length>dotpostmaxlen){
				       alert("此处数字精度不准确，小数点后需要"+dotpostminlen+"至"+dotpostmaxlen+"位数字！");
					   form[i].focus();
					   return false;
				  }
			  }
		  }

      }

  }

  return true;
 }
  function putv(prefix,propertyEleName,value){
  	put(propertyEleName,value);
        put(listid+"."+propertyEleName,value);
}

  function put(eleName,value){
		var ele=document.getElementById(eleName);
		if(ele)ele.innerHTML=value;
}

