/**

form校验函数
**/


//==============判断一个字符串是否是浮点数===================//
	//str		：待测字符串
	//sign	: 符号，“+”，表示正浮点数 >0的浮点数，“-”表示负浮点数<0的浮点数，没有表示所有浮点数
	//返回如果是true则表示是否则返回false
	function isNumeric(str,sign)
	{
		var reg=/^(-?\d+)(\.\d+)?$/gi;
		if (arguments.length==2 && sign=='+')
		{
			reg=/^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/gi;
		}
		else if (arguments.length==2 && sign=='-')
		{
			reg=/^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/gi;
		}
		
		return reg.test(str);
	}
	
	/**
	校验字符串是否由数字组成
	true是false否
	**/
	function isNumberStr(str){
	  if (str.match(/\D/g,'') != null)
	    {  
		     return false;
	    }
	   
	   return true;
	
	}
	
//============判断一个字符串是否是整数===================//
	//str：待测字符串
	//sign	: 符号，“+”，表示正整数 >0的整数，“-”表示负整数<0的整数，没有表示所有整数
	function isInteger(str,sign)
	{
		var reg=/^-?\d*$/gi;
		if (arguments.length==2 && sign=='+')
		{
			reg=/^[0-9]*[1-9][0-9]*$/gi;
		}
		else if (arguments.length==2 && sign=='-')
		{
			reg=/^-[0-9]*[1-9][0-9]*$/gi;
		}
		return reg.test(str);
	}
	
//=======================================================//

//=============判断一个字符串是否是日期型================//
    //value:待测字符串
	//返回一个布尔型值  true 是 false否
	function isDate(value)
	{
		try
		{
			while (value.indexOf('-')>0)
			{
				value = value.replace('-','/');
			}
			var compDate = new Date(value);
			var index = value.indexOf('/');
			var year = value.substring(0,index)*1;
			value=value.substring(index + 1,100);
			index = value.indexOf('/');
			var month = value.substring(0,index) -1;
			var date=value.substring(index + 1,100) *1;
			if (compDate.getFullYear()!=year | compDate.getMonth()!=month | compDate.getDate()!=date)
			{
				return false;
			}
		}
		catch (e)
		{
			return false;
		}
		return true;
	}
//=======================================================//

//==============判断一个字符串是否是邮件格式===============//
    //str:待测字符串
	//返回一个布尔型值
	function isEmail(str)
	{
		var reg=/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/gi;
		return reg.test(str);
	}
	
	
	//====得到一个字符串的字节数，一个中文算两字节=====//
    //str:待测字符串
	//返回一个整数
	function getBytesLength(str)
	{
		var re=/[\x00-\xff]/g;
		var len=str.length;
		var array=str.match(re);
		if (array==null)
		{
			array="";
		}
		return len*2 - array.length;
	}
	
	
	//======================身份证效验=============//
	//正确返回true
function checkIdCard(value)
{
    //假验证
    return true;

	//身份证号位数判断
	var value=trim(value);
	//obj.warning="身份证号码位数为15位或者18位。"
	if (value.length!=18 && value.length!=15)
	{
		//obj.error="身份证号码位数不正确！";
		return false;
	}
	else if(value.length==18)
	{
		if(identificationCard(value))
			return true;
		else
			return false;
	}
	else if(value.length==15)
	{
		var kk=identificationCard15To18(value);
		if(kk==false)
		{
			return false;
		}
		else
		{
			if(identificationCard(kk))
				return true;
			else
				return false;
		}
	}
	return true;
}

//----18位身份证效验----//
function identificationCard(value)
{

	var verifyCode = new Array("1","0","X","9","8","7","6","5","4","3","2");//校验码
	var verifyGene = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);//校验因子

	//身份证号前十七位均为数字
	var temp = value.substring(0,17);
	if (!isInteger(temp))
	{
		//obj.error="身份证号前十七位均为数字！";
		return false;
	}
	//身份证号前六位为行政区划，应大于100100
	temp = value.substring(0,6);
	if (temp*1<100101)
	{
		//obj.error="身份证号对应的行政区划不正确！";
		return false;
	}
	//第七至十四位为出生日期码，一般认为当前的人出生在1870年以后，今天以前
	temp = value.substring(6,14);
	var birthday=temp.substring(0,4)+"-"+temp.substring(4,6)+"-"+temp.substring(6,8);

	if(!isDate(birthday))	
	{
		//obj.error="身份证出生年月不正确！";
		return false;	
	}
	if (temp*1<18700101)
	{
		//obj.error="身份证出生年月不正确！";
		return false;
	}
	
	var date = new Date();
	var today = date.getFullYear();
	if(date.getMonth()*1+1<10)
	{
		today +="0";
	}

	today +=""+(date.getMonth()*1+1);
	if (date.getDate()<10)
	{
		today +="0";
	}
	today +=""+date.getDate();
	if (temp*1>today*1)
	{
		//obj.error="身份证出生年月不正确！";
		return false;
	}
	//同一行政区划内同年同月同日生的人的顺序号，一般男为奇数，女为偶数
	temp = value.substring(14,17);
	if (temp=='000')
	{
		//obj.error="身份证对应顺序号不正确！";
		return false;
	}
	
	//计算校验码
	var s=0;
	for (var i=0;i<17 ;i++ )
	{
		s += value.substring(i,i+1)*verifyGene[i];
	}
	var y=verifyCode[s % 11];
	if (value.substring(17,18)!=y)
	{
		//obj.error="身份证号不正确！";
		return false;
	}
	return true;
}


//------将15位转为18位----//
/**
功能描述：对15位身份证号进行转换
参数说明：
		value		:待转换的身份证号
		century		:出生年的前两位数
返回   :18位身份证号码
*/
function identificationCard15To18(obj,value,century)
{
	var verifyCode = new Array("1","0","X","9","8","7","6","5","4","3","2");//校验码
	var verifyGene = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);//校验因子
	var newID;
	var temp = value;


	if (!isInteger(temp))
	{
		obj.error="15位身份证号均为数字！";
		return false;
	}
	newID = value.substring(0,6);
	if (newID*1<100101)
	{
		obj.error="身份证号对应的行政区划不正确！";
		return false;
	}

	if (century==null)
	{
		century='19';
	}
	if (century*1<18 || century*1>20)
	{
		obj.error="世纪代码不正确！";
		return false;
	}

	newID += century+value.substring(6,12);

	//第七至十四位为出生日期码，一般认为当前的人出生在1870年以后，今天以前
	//var ss = newID.substring(6,14);

	temp = value.substring(12,15);
	if (temp=='000')
	{
		obj.error="身份证对应顺序号不正确！";
		return false;
	}

	newID +=temp;
	var s=0;
	for (var i=0;i<17 ;i++ )
	{
		s += newID.substring(i,i+1)*verifyGene[i];
	}
	return newID+verifyCode[s % 11];
}

	

/****字符串的截空操作----end-----***/
function trim(str)
	{
		return rtrim(ltrim(str));
	}
function ltrim(str)
	{
		return str.replace(/^\s*/gi,"");
	}

	function rtrim(str)
	{
		return str.replace(/\s*$/gi,"");
	}
	
	
	
	
	/**==================form校验====================================================================**/
	
/**
form元素信息
**/
function formEleInfo(){
  this.name="";//字段名
  this.chinaName="";//中文名称
  this.isRequire="false";//是否必须填写
  //内容数据格式
 /** 
  string 字符串 
  numberStr 数字型字符串如电话号码0283202410
  date日期 
  int整数 +int正整数 -int负整数
  number数字 +number 正数 -number 负数
  email 电子邮件
  sfz   身份正
  **/

  this.contentType="string";
  this.eleType="text"; //form表单的格式 textarea  select radio select checkbox
  this.maxLen="8000";//最大字符,如果是浮点数则是小数点以前的数字最大长度
  this.scale=4;//只对浮点数有效果，小数点后的小数的最大长度
}


/**
校验form表单元素
arrySz：formEleInfo对象的数组
返回一个字符串，如果字符串为空则表示没有错误
**/
function validateForm(arrySz){
  var errMsg="";
   for(var i=0;i<arrySz.length;i++){//循环得到每一个元素
        errMsg+=validateElement(arrySz[i]);
   }
  
  errMsg+=selfValidate();
  return errMsg;
}
/**
检验每一个表单对象
返回一个字符串，如果字符串为空则表示没有错误
**/
function validateElement(obj){
   var err="";
   
   //=====判断为空,先判断是否可以为空
   if(obj.isRequire=="true"){//
      err+=valiateRequire(obj);
   }

   
   //============判断数据类型====================
   err+=validateContType(obj);
    
   //=================判断长度=========================
   
   err+=validateLength(obj);
   return err;
}

/**
校验不能为空的逻辑
返回一个字符串，如果字符串为空则表示没有错误
**/
function valiateRequire(obj){
    var err="";

   if(obj.eleType=="checkbox"){//checkbox必须循环判断
        
         if(document.all(obj.name).length){//box大于1,则要循环检查
             var isempty="";
         	 for(var i=0;i<document.all(obj.name).length;i++){
         	   if(document.all(obj.name)[i].checked){
         	      isempty="1";
         	      break
         	   }
         	 }
         	if(isempty=="")
         	 err="* "+obj.chinaName+": 不能为空<br>";
         }
         else{//box==1
           if(!document.all(obj.name).checked)
              err="* "+obj.chinaName+": 不能为空<br>";
         }
    }
    else{
         if(document.getElementById(obj.name).value=="")
           err="* "+obj.chinaName+": 不能为空<br>";
    }
    return err;

}

/**
校验数据的数据类型的逻辑
返回一个字符串，如果字符串为空则表示没有错误
**/
function validateContType(obj){
   var err="";
   //这4种情况不需要校验
   if(v=="")
       return "";//没有值不做校验
   if(obj.eleType=="checkbox" || obj.eleType=="radio" || obj.contentType=="date")
      return "";
   var  v=document.getElementById(obj.name).value;
   if(v=="")
       return "";//没有值不做校验
   if(obj.contentType=="number"){//数字
      if(!isNumeric(v))
        err="* "+obj.chinaName+": 必须为阿拉伯数字<br>";
   }
   else if(obj.contentType=="+number"){//正数
      if(!isNumeric(v,"+"))
        err="* "+obj.chinaName+": 必须为阿拉伯正数<br>";
   }
   else if(obj.contentType=="-number"){//负数
     if(!isNumeric(v,"+"))
        err="* "+obj.chinaName+": 必须为阿拉伯负数<br>";
   }
   else if(obj.contentType=="int"){//整数
      if(!isInteger(v))
        err="* "+obj.chinaName+": 必须为整数<br>";
   }
   else if(obj.contentType=="+int"){//正整数
      if(!isInteger(v,"+"))
        err="* "+obj.chinaName+": 必须为正整数<br>";
   }
   else if(obj.contentType=="-int"){//负整数
   	  if(!isInteger(v,"-"))
        err="* "+obj.chinaName+": 必须为负整数<br>";
   }
    else if(obj.contentType=="email"){//电子邮件
       if(!isEmail(v))
           err="* "+obj.chinaName+": 必须为电子邮件格式<br>";
   } 
   else if(obj.contentType=="sfz"){//身份证
       if(!checkIdCard(v))
           err="* "+obj.chinaName+": 必须为身份证格式<br>";
   }
   
   else if(obj.contentType=="numberStr"){//数字型字符串
       if(!isNumberStr(v))
          err="* "+obj.chinaName+": 必须全部由数字组成<br>";
   }
   
   return err;

}

/**
校验数据的数据长度的逻辑
返回一个字符串，如果字符串为空则表示没有错误
number
**/
function validateLength(obj){
  var err="";
  var  v=trim(document.getElementById(obj.name).value);
  if(v=="")
       return "";
  if(obj.contentType=="number" ||obj.contentType=="+number" || obj.contentType=="-number"){//数字类型
 
     var splitlen=v.indexOf(".");
     if(splitlen!=-1){//有小数点
        var zs=v.substring(0,splitlen);//获得小数点前的数字
        var xs=v.substring(splitlen+1);//获得小数点后的数字

        if(getBytesLength(zs)>obj.maxLen)
           err="* "+obj.chinaName+": 小数点前的最大长度为"+obj.maxLen+"<br>";
        if(getBytesLength(xs)>obj.scale)
           err+="* "+obj.chinaName+": 小数点后的最大长度为"+obj.scale+"<br>";  
            
     }
     else{//无小数点
     	if(getBytesLength(v)>obj.maxLen)
     	 err="* "+obj.chinaName+": 最大长度为"+obj.maxLen+"<br>";
     }
    
  }
  
  else{
     if(getBytesLength(v)>obj.maxLen)
        err="* "+obj.chinaName+": 最大长度为"+obj.maxLen+"<br>";
  
  }
   
   
  return err;

}

/**
自己写校验函数，如果页面需要自己写校验函数则需要重新覆盖这个函数
返回一个字符串，如果字符串为空则表示没有错误
**/
function selfValidate(){
   return "";

}
/**
显示错误信息
**/
function showError(error,tblid,tdid){
    if(!document.getElementById(tblid)){
        return;
    }
	if(error!=""){
  		document.getElementById(tblid).style.display="";
  		document.getElementById(tdid).innerHTML='<font color="red">'+error+'</font>';
	}
	else{
		document.getElementById(tblid).style.display="none";
	}

}

/**
这个只读函数的限制：
1、checbox,radio的数据无法转换（需要自己写函数处理）
2、要显示的form元素必须在<td>下面，不能用其他东西修饰如<label>
**/

function readonly(){

var es = document.forms[0].elements;//获取所有form元素
for (i=0;i<es.length;i++) {
var val="";
    var e = es[i];//得到一个元素
   
	if(e.type=="hidden" || e.type=="radio" || e.type=="checkbox" || e.type=="button" || e.type=="submit"){//这几个无法操作
	   continue;
	}
	if(e.type=="select-one"){//下拉框
	  val=e.options[e.selectedIndex].text;
	  if(val=="请选择..."){
	    val="";
	  }
	}
    else
	  val=e.value;
	  var po=e.parentElement;
	  if(typeof(po)!="undefined" && po.tagName=="TD"){

	  // e.parentElement.innerHTML=val;
	   hiddenObj_info(e,val);
	   i=i;
	  }
	    
}

//=========隐藏表单对象同时显示它的值==============//
//parentObj父对象,obj当前对象，objValue//当前对象的值
function hiddenObj_info(obj,objValue)
{
	var nod=document.createElement();
	var parentObj=obj.parentElement;
	parentObj.insertBefore(nod, obj);
	if(objValue=="请选择...") objValue="";
	nod.innerText=objValue;
	obj.style.display="none";
}
}

	
