﻿﻿/**
 * 功　　能：JavaScript进行提交表单验证。
 * 功能说明：验证表单格式合法性，并且能够除错返回错误消息[未完成]。
 *
 * 创建日期：(2004-03-28)
 * @author：牛晓娜
 * 修改日期：(2002-09-13)
 * @author：牛晓娜
 * @copyRight：
 *
 * @para  obj :表单域对象，包括text、textarea
 * @return false/true
 *
 * 表单格式说明:
 * HTML应用：附加扩展属性用法
 * <input type="text" value="" name="" datatype="" caption="" minsize="" maxsize="" nillable="" minvalue="" maxvalue="">
 * <input type="password" value="" name="" types="" caption="" minsize="" maxsize="" nillable="" minvalue="" maxvalue="">
 *
 * Motheds:
 * checkLength(obj);
 * checkValue(obj);
 * checkDateValue(obj);
 * checkDate(value);
 * checkChar(value);
 * checkStrictChar(value);
 */

/*
 * 功能：检查对象最大最小值是否合法
 * @para
 * @return
 */
function checkValue(obj)
{
	if (obj.minvalue!="" && Number(obj.value)<Number(obj.minvalue))
	{
		alert("["+obj.caption+"]的值不能小于"+obj.minvalue+"!");
		return false;
	}
	if (obj.maxvalue!="" && Number(obj.value)>Number(obj.maxvalue))
	{
		alert("["+obj.caption+"]的值不能大于"+obj.maxvalue+"!");
		return false;
	}			
	return true;
}

/*
 * 功能：检查对象日期最大最小值是否合法
 * @para
 * @return
 */
function checkDateValue(n_obj,v_obj)
{
	if (!checkDate(n_obj.value))
		{
		alert("["+n_obj.caption+"]日期格式不对！");
		return false;			
		}
	if (!checkDate(v_obj.value))
		{
		alert("["+v_obj.caption+"]日期格式不对！");
		return false;			
		}

	date1 = toDate(n_obj.value);
	date2 = toDate(v_obj.value);
	if (date1 < date2)
	{
		alert("日期["+n_obj.caption+"]不能小于["+v_obj.caption+"]的日期！");
		n_obj.focus();
		return false;
	}
	return true;
}

/*
 * 功能：检查对象是否整数
 * @para
 * @return
 */
function checkInteger(obj){
var rext = /^(\s*[-]?[0-9]+\s*)$/;
if (!rext.test(obj.value)) {
	alert("["+obj.caption+"]输入的整数格式不对！"); 
	return false;}
//对整型数值的判断，如果没有定义最大值和最小值，就默认int类型的最大值和最小值
if (obj.minvalue==null || obj.minvalue=="")	obj.minvalue = "-2147483648"; 
if (obj.maxvalue==null || obj.maxvalue=="")	obj.maxvalue = "2147483647"; 

if (!checkValue(obj)) return false;
return true;
}

function toDate(s)
{
	if (checkDate(s))
	{
		p = s.indexOf("-");
		year = s.substring(0,p);
		s1 = s.substring(p+1);
		p = s1.indexOf("-");
		month=s1.substring(0,p);
		day = s1.substring(p+1);
		return new Date(year,parseInt(month)-1,day)
	}
	else 
		return new Date();
}

//检查身份证号
/*
function checkPCode(s)
{
    var s=trim(s);
	var rex = /^(\s*[0-9]+\s*)$/;
	var rexs = /^(\s*([0-9]+)|([a-z]+)|([A-Z]+)\s*)$/;
	if (trim(s).length == 15 )	 { if (rex.test(s)) return true;	}
	else if (trim(s).length ==18) { if (rex.test(s.substring(0,17)) && rexs.test(s.substring(17))) return true;	}
	return false;
}
*/
//检查身份证号
function checkPCode(idcard)
{ 
var Errors=new Array("验证通过!","身份证号码位数不是18位!","身份证号码出生日期超出范围或含有非法字符!", "身份证号码校验错误!","身份证地区非法!","身份证号不能为空!");
     var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"} 
     var idcard,Y,JYM;
     var S,M;
     var idcard_array = new Array();
     idcard_array = idcard.split("");
     //地区检验 
//alert(area[parseInt(idcard.substr(0,2))])
if(idcard=="")
return Errors[5]
if (trim(idcard).length != 18)
return Errors[1]
     if(area[parseInt(idcard.substr(0,2))]==null)
return Errors[4]; 
     //身份号码位数及格式检验
     switch(idcard.length)
     {
         case 15: 
         if ( (parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 ))
    { 
     ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性        
     } 
   else 
    { 
     ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
     }
   if(ereg.test(idcard))
    {
     return true;
     }
   else
    {
     return Errors[2];
     }
         break;
         case 18: 
   if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 ))
    {
     ereg=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
    }
   else 
    {
     ereg=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式
     }
         if(ereg.test(idcard))
    {//测试出生日期的合法性
     //计算校验位
     S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7 + (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9 + (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10 + (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5 + (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8 + (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4 + (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2 + parseInt(idcard_array[7]) * 1 + parseInt(idcard_array[8]) * 6 + parseInt(idcard_array[9]) * 3 ;
     Y = S % 11;
     M = "F";
     JYM = "10X98765432";
     M = JYM.substr(Y,1);//判断校验位
     if(M == idcard_array[17])
      {
       return true; //检测ID的校验位
      }
     else
      {
       return Errors[3];
      }
    }
         else
    {
     return Errors[2];
    }
         break;
         default:
			 return true;
         //return Errors[1];
         break;
     }
}

//检查字母和数字
function checkChar(s)
{
    var s=trim(s);
	//var rexs = /^(\s*([0-9]+)|([a-z]+)|([A-Z]+)\s*)$/;
	var rexs = /^(\s*([0-9a-zA-Z]+)\s*)$/;
	if (rexs.test(s)) return true;	
	return false;
}

//对特殊字符的限制
function checkStrictChar(s)
{
	var	vcharlist="-*/,.)({}@!~`$%=|><'\"";
	for(i=0;i<vcharlist.length;i++)	{
		if(s.indexOf(vcharlist.substring(i,i+1))!=-1)	return false;
	}
	return true;
}

function trim(sString)
{
var strTmp ;
strTmp = JHshRTrim(JHshLTrim(sString)) ;
return strTmp ;
} 

function JHshRTrim(sString)
{ 
var sStr,i,sResult = "",sTemp = "" ;
// if (sString.length == 0) { return "" ;} // 参数sString是空串
sStr = sString.split("");
for (i = sStr.length - 1 ; i >= 0 ; i --)  // 将字符串进行倒序
{ 
sResult = sResult + sStr[i]; 
}
sTemp = JHshLTrim(sResult) ; // 进行字符串前空格截除

if (sTemp == "") { return "" ; }
sStr = sTemp.split("");
sResult = "" ;
for (i = sStr.length - 1 ; i >= 0 ; i--) // 将经处理后的字符串再进行倒序
{
sResult = sResult + sStr[i];
}
return sResult ;
} 

function JHshLTrim(sString)
{ 
var sStr,i,iStart,sResult = "";

sStr = sString.split("");
iStart = -1 ;
for (i = 0 ; i < sStr.length ; i++)
{
if (sStr[i] != " ") 
{
iStart = i;
break;
}
}
if (iStart == -1) { return "" ;}    //表示sString中的所有字符均是空格,则返回空串
else { return sString.substring(iStart) ;}
}
 
//判断一个日期字符串是否为一个有效的日期。
//这里规定正确的日期格式为：yyyy/mm/dd或者yyyy-mm-dd
function checkDate(d)
{
    if (d.length > 0){
	var first,second,yy,mm,dd;
	
	if(d.indexOf("/")!=-1)
	{
		first=d.indexOf("/");
		second=d.lastIndexOf("/");}
	else if(d.indexOf("-")!=-1)
	{		
		first=d.indexOf("-");
		second=d.lastIndexOf("-");
	}
	else return false;

	if(second==first) return false;
	yy=parseInt(d.substring(0,first));
	if ( d.substr(first + 1, 1) == '0' )
		mm=parseInt(d.substring(first+2,second));
	else
		mm=parseInt(d.substring(first+1,second));
	if ( d.substr(second + 1, 1) == '0' )
		dd=parseInt(d.substring(second+2,d.length));
	else
		dd=parseInt(d.substring(second+1,d.length));
	if (isNaN(yy)) return false;
	if (yy < 70) 
		yy += 2000;
	else if (yy < 100 && yy >= 70)
		yy += 1900;
	if (isNaN(mm) || mm < 1 || mm > 12) return false;
	if (isNaN(dd) || dd < 1 || dd > 31) return false;
	
	d = new Date(yy, mm - 1, dd); 
	if (isNaN(d)) return false;
	if (d.getMonth() != mm - 1 || d.getDate() != dd) return false;
	return true;  
	//return d.toLocaleString();  
	}
	else return false;
}

//判断一个短日期字符串是否为一个有效的日期。
//这里规定正确的日期格式为：yyyy/mm或者yyyy-mm-dd
function checkShortDate(d)
{
    if (d.length > 0){
	var first,second,yy,mm,dd;
	
	if(d.indexOf("/")!=-1)	first=d.indexOf("/");
	else if(d.indexOf("-")!=-1)	first=d.indexOf("-");
	else return false;

	yy=parseInt(d.substring(0,first));
	if ( d.substr(first + 1, 1) == '0' )
		mm=parseInt(d.substring(first+2,d.length));
	else
		mm=parseInt(d.substring(first+1,d.length));

	if (isNaN(yy)) return false;
	if (yy < 70) 
		yy += 2000;
	else if (yy < 100 && yy >= 70)
		yy += 1900;
	if (isNaN(mm) || mm < 1 || mm > 12) return false;
	
	d = new Date(yy, mm - 1, 1); 
	if (isNaN(d)) return false;
	if (d.getMonth() != mm - 1) return false;
	return true;  
	//return d.toLocaleString();  
	}
	else return false;
}

/* 判断是否是有效是数字 */
function checkNumber(n)
{
var rext = /^(\s*[-]?([0-9]+)|([-]?[0-9]*[.]{1}[0-9]*)\s*)$/;
if (!rext.test(n)) return false;
else return true;
}

/* 取得字符串的字节长度 */
function strlen(str)
{var i;
var len;
len = 0;
for (i=0;i<str.length;i++)
{
if (str.charCodeAt(i)>255) len+=2; else len++;
}
return len;
}

/* 判断是否是有效是数字 */
function checkNum(obj)
{
var rext = /^(\s*[-]?([0-9]+)|([-]?[0-9]*[.]{1}[0-9]*)\s*)$/;
if (!rext.test(obj.value)) {
	alert("["+obj.caption+"]输入的数字格式不对！"); 
	return false;}
var d=obj.value;

//对于负数，计算精度时把负号去掉
if(d.substring(0,1)=="-") d=d.substring(1,d.length);
if (obj.dataPrecision == null) obj.dataPrecision = "0";
var len1 = parseInt(obj.dataLength)- parseInt(obj.dataPrecision);
//对是否有小数点的情况的判断
if(d.indexOf(".")==-1){
	//if(!isNaN(obj.dataLength) && d.length > obj.dataLength){
	if(!isNaN(obj.dataLength) && d.length > len1){
		alert("["+obj.caption+"]的整数长度不能超过"+len1+"位！");
		return false;
	}
}else{
	if(!isNaN(obj.dataLength) && d.indexOf(".") > len1 ){
		alert("["+obj.caption+"]的整数长度不能超过"+len1+"位！");
		return false;
	}
	//小数部分的判断
	if(obj.dataPrecision == "0"){
		alert("["+obj.caption+"]不能输入小数部分或小数点！");
		return false;
	}
	if(!isNaN(obj.dataPrecision) && (d.length-d.indexOf(".")-1) > parseInt(obj.dataPrecision) ){
		alert("["+obj.caption+"]的小数位数不能超过"+obj.dataPrecision+"位！");
		return false;
	}
}

if (!checkValue(obj)) return false;
return true;
}

//判断一个email字符串是否为一个有效的email地址。
function checkEmail(str) {
    if (str.length > 0){
    	var a=str.indexOf("@")+1;
    	var p=str.lastIndexOf(".")+1;    
	
    	if ((str.indexOf("'") >= 0)||(str.indexOf('"') >= 0)||(a<2) || (p<1)||(p<a+2)||(str.length==p)){
             return false;
    	}    
    	else	
    		return true; 
    }
    return true;
}

/* 功能：检查对象是否为空 */
function checkNull(obj)
{
	if (obj.nillable=="false" && trim(obj.value).length <= 0)
	{
		alert("["+obj.caption+"]不能为空！");
		return false;
	}
	return true;
}

/* 功能：检查对象内容长度是否合法 */
function checkLength(obj)
{
	if (strlen(trim(obj.value))<obj.minsize)
		{
		alert("["+obj.caption+"]的长度不能少于"+obj.minsize+"字符！");
		return false;
		}
	if (obj.maxsize=="") obj.maxsize = "999";
	if (strlen(trim(obj.value))>obj.maxsize)
	{
		alert("["+obj.caption+"]的长度不能多于"+obj.maxsize+"字符！");
		return false;
	}
	return true;
}

/* 检测指定文本框输入是否合法 */
function verifyInput(obj)
{
if (obj.datatype == null) obj.datatype = "text";//设置输入的数据类型
if (obj.caption == null) obj.caption = obj.name;//设置输入的标识名称
if (obj.nillable == null) obj.nillable="true";//设置是否为空

if (!checkNull(obj))  return false;

//对于有输入内容的文本框进行判断
if (obj.value.length>0){

/* 数据类型校验 */
switch(obj.datatype)
{
	case "text": 
		if (!checkLength(obj)) return false;
		break;
	case "int":
		if (!checkInteger(obj))	return false;
		break;
	case "number":
		if (!checkNum(obj))	return false;
		break;
	case "date":
		if (!checkDate(obj.value))
		{
		alert("["+obj.caption+"]日期格式不对！");
		return false;
		}
		break;
	case "meno":
		if (!checkTextArea(obj.value))	return false;
		break;
	case "char": 
		if (!checkLength(obj)) return false;
		if (!checkChar(obj.value))
		{
		alert("["+obj.caption+"]只能是字母和数字！");
		return false;	
		}
		break;
	case "strictchar": 
		if (!checkLength(obj)) return false;
		if (!checkStrictChar(obj.value))
		{
		alert("["+obj.caption+"]不能输入特殊字符！");
		return false;	
		}
		break;
	case "email": 
		if (!checkLength(obj)) return false;
		if (!checkEmail(obj.value))
		{
		alert("["+obj.caption+"]Email地址格式不对！");
		return false;	
		}
		break;
	case "personalcode":
		var msg=checkPCode(obj.value);
		if (msg!=true)
		{
		alert("["+obj.caption+"]身份证编号格式不对！"+msg);
		return false;
		}
		break;
	case "shortdate":
		if (!checkShortDate(obj.value))
		{
		alert("["+obj.caption+"]日期格式不对！");
		return false;
		}
		break;
	default	: 
		break;
}
}
}

/* 检测指定FORM表单所有应被检测的元素
（那些具有自定义属性的元素）是否合法，此函数用于表单的onsubmit事件 */
function verifyAll(obj)
{
var i;
for (i=0;i<obj.elements.length;i++)
{
	if (verifyInput(obj.elements[i])==false)
		{
		obj.elements[i].focus();
		return false;
	}
}
return true;
}

/*
删除指定项目内所有空格
*/

function killempty(obj){
	var isempty = obj.value;
	while(/[\ ]/.test(isempty)){
		isempty = isempty.replace(" ","");
	}
	
	while(/[\　]/.test(isempty)){
		isempty = isempty.replace("　","");
	}
	obj.value = isempty;
}

/*
ajax
*/

var http_request = false;

var host_url = location.href.substring(0,location.href.lastIndexOf("/")+1);
	function createAjax(){
        http_request = false;

        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
                // zu dieser Zeile siehe weiter unten
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {
					alert(e);
				}
            }
        }
        if (!http_request) {
            alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
            return false;
        }
		return true;
	}
    function ajax(url,run) {
		if(!createAjax())return false;
        http_request.onreadystatechange = function() { exput(run) } ;
        http_request.open('GET', host_url+url, true);
        http_request.send(null);

    }
    function ajax_post(url,query,run) {
		if(!createAjax())return false;
		http_request.onreadystatechange = function() { exput(run) } ;
        http_request.open('POST', host_url+url, true);
		http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        http_request.send(query);
    }
function postInfo(action,obj,run)
{
	var frm = document.all(obj);
	var url = action;
	var postStr = "";
	if(frm!=null&&frm.tagName=="FORM"&&verifyAll(frm)){
		
		//获取接受返回信息层
		//var msg = document.getElementById("msg");
		var url = action;

		for(var i=0;i<frm.elements.length;i++){
			if(frm.elements[i].name!=""){
				postStr += frm.elements[i].name+"="+frm.elements[i].value+"&"
			}
		}
		postStr = encodeURI(post);
		postStr = encodeURI(post);//
		ajax_post(url,postStr,function(){run});
	}
}
/*
提交用户表单
*/
function saveInfo(action,obj,id)
{
	var frm = document.all(obj);
	var url = action;
	var postStr = "";
	if(frm!=null&&frm.tagName=="FORM"&&verifyAll(frm)){		
		//获取接受返回信息层
		//var msg = document.getElementById("msg");
		//var url = action;

		for(var i=0;i<frm.elements.length;i++){
			if(frm.elements[i].name!=""){
				postStr += frm.elements[i].name+"="+frm.elements[i].value+"&"
			}
		}
		//postStr = encodeURI(post);
		//postStr = escape(post);//
		ajax_post(url,postStr,id);
	}

	/*
	String v = request.getParameter(h);
   String mm =  java.net.URLDecoder.decode(v, "UTF-8");
	*/
}

function exput(id){
        if (http_request.readyState == 4) {
            if (http_request.status == 200) {
myElement = document.getElementById(id);
if(myElement != null){myElement.innerHTML=http_request.responseText;
eval(myElement.innerText);
}

            } else {
                alert('Bei dem Request ist ein Problem aufgetreten.');
            }
        }
	}