﻿
/***********************************************************************************************
/*	检查数据的类 
简单框架

*/
//*********************************************定义全局的Css类名字*******************/


//显示input框的样式
var inputWarningClass = "Warning";
var inputErrorClass = "Error";
var inputOkClass	 = "Ok";
var inputNormalClass	= "Normal";

//标记框的样式
var markboxOkClass = "markOkMsg";
var markboxWarningClass = "markWarningMsg";
var markboxErrorClass	= "markErrorMsg";
var markboxHintClass	= "markHintMsg";

//显示信息提示框的样式
var infoboxOkClass = "OkMsg";
var infoboxWarningClass = "WarningMsg";
var infoboxErrorClass	= "ErrorMsg";
var infoboxHintClass	= "HintMsg";




/*********************************************************************
/*
  表单数据检查类
  CheckForm
*/


var CheckForm = Class.create();

CheckForm.prototype = 
{

	//构造函数
	initialize: function(form)
	{
		this.elements = new Array();
		this.isValidate = true;
		this.form = $(form);
		
		//this.postMethod = postMethod;
		//Event.observe(this.form, 'submit',  this.validate.bind(this), false);
		//Event.observe(this.form.goRegister, 'click',  this.validate.bind(this), false);
	},
	
  //给某个元素的某个事件添加一个处理方法
	addEvent: function(el, evt, method)
	{
		Event.observe(el, evt, method.bind(this), false);
	},
	
	//添加一个要检查的元素
	addElement: function(element)
	{
		this.elements[this.elements.length] = element;
	},

	//主要绑定各种事件，初始化对象
	validate: function()
	{

		var flag = true;
		var result = true;
		//alert(this.elements.length);
		for (var i=0; i<this.elements.length; i++)
		{	
			var el= this.elements[i];
			
			//进行验证
			result = el.validate();

			if (flag && !result)
			{
				flag = false;
				
			}
		}
		this.isValidate = flag;
		return flag;
	}
}


/***************************************************************
												*
												*表单元素类
												* Element
												*
***************************************************************/
var MyElement = Class.create();

MyElement.prototype = 
{
	//构造函数
	initialize: function(element, infoBox, markBox)
	{
		this.element = element;
		this.infoBox = infoBox;
		this.markBox = markBox;
		this.checks = new Array();
	},

	//给某个元素的某个事件添加一个处理方法
	addEvent: function(evt, method)
	{
		Event.observe(this.element, evt, method.bind(this), false);
	},
	
	//添加一个检查
	addCheck: function(isRequire, checkType, errorMessage)
	{
		var check = new Check(isRequire, checkType, errorMessage);
		this.checks[this.checks.length] = check;
	},
	
	//改变某个元素和相关元素的样式和内容
	changeStyle: function (inputStyle, markStyle, infoStyle)
	{
		this.element.className = inputStyle ;
		if (this.markBox)
		{
			this.markBox.className = markStyle;
		}
		if (this.infoBox)
		{
		  this.infoBox.className = infoStyle;
		}
		
	},
	
	//获取某个元素的值
	getValue: function()
	{
	  if (this.element.realvalue)
	  {
	    return Form.Element.getValue($(this.element.realvalue));
	  }
	  else
	  {
	     return Form.Element.getValue(this.element);
	  }
	},

  //直接设置正确，不检查
  ok: function()
  {
    this.changeStyle(inputOkClass, markboxOkClass, infoboxOkClass);
    
    if (this.element.checked)
    {
      this.infoBox.innerHTML = "选择正确";
    }
    
  },
  
  
	//进行检查
	validate: function()
	{
		var result = true;
		for (var i=0; i<this.checks.length; i++)
		{
		
		  //alert(this.getValue());
			result = this.checks[i].validate(this.getValue());
			//alert(this.getValue());
			
			
			///////////////////////***由于没有时间，临时增加的功能*******************/
			//临时的验证密码长度
			//alert(this.element.type+this.element.id);
			if (this.element.id.indexOf("user_password") > -1)
			{
			  var rv = $("cache_password").value;
			  if (getBytelength(rv)>16 || getBytelength(rv)<4)
			  {
			    result = false;
			  }
			}
			
			//新设置密码
			if (this.element.id.indexOf("new_password") > -1)
			{
			  var rv = $("cache_new_password").value;
			  if (getBytelength(rv)>16 || getBytelength(rv)<4)
			  {
			    result = false;
			  }
			}
			
			/************************************这部分有空要修改哦*////
			
			//alert("OK" + result);
			if (!result)
			{
				//改变各控件的样式
				this.changeStyle(inputErrorClass, markboxErrorClass, infoboxErrorClass);

				if (this.infoBox != null)
				{
					this.infoBox.innerHTML = this.checks[i].errorMessage;
				}
				
				break;
			}
			else
			{
			  //这里要进行和其他对象的对比工作
		    //下面进行其他验证，比如密码相等之类
		    /*事先约定
		    1、比较对象用sameas
		    2、比较操作用operation
		    */
		    var lastError = "";
		    //如果有其他对象的对比工作
		    
		    //if( form == null || form == "" || typeof(form) == "undefined" );
		    if (typeof(this.element.sameas) != "undefined" && this.element.sameas != null && this.element.sameas != "")
		    {
		      var obj = $(this.element.sameas);
		      var realObj = "";
		      var operation = this.element.operation;
		      lastError = this.element.errormessage;
		      if (this.element.realvalue)
		      {
		        realObj = $(this.element.realvalue);
		        
		      }
		      else
		      {
		         realObj = this.element;
		      }
		      result = this.compare(obj, realObj, operation); 
		    }
			  
			  //进行第2次比较后的结果
			  if(!result)
			  {
			    this.changeStyle(inputErrorClass, markboxErrorClass, infoboxErrorClass);
			    this.infoBox.innerHTML = lastError;
			  }
			  else
			  {
			    this.changeStyle(inputOkClass, markboxOkClass, infoboxOkClass);
				  this.infoBox.innerHTML = "输入正确";
			  }
			  
			}
		}
		return result;
	},
	
	//比较2个值
	compare: function(element1, element2, operation)
	{
	    var value1 = $(element1).value;
      var value2 = $(element2).value;
      var flag = false;
      if (value1 == "" || value2 == "")
      {
        return true;
      }
      switch(operation)
      {
        //判断是否等于
        case "equal":
            if (value1 == value2)
            flag = true;
            break;
        //判断是否不等于
        case "notequal":
            if (value1 != value2)
            flag = true;
            break;
      }
      return flag;
	}
		  
}



/***************************************************************
												*
												*数据检查类
												* Check
												*
***************************************************************/

var Check = Class.create();

Check.prototype = 
{
	initialize: function(isRequire, type, errorMessage)
	{
	  this.isRequire = isRequire;
		this.type = type;
		this.errorMessage = errorMessage;
	},

	validate: function(value)
	{
		var pattern = "";
		var result = true;
		
		//如果不是比填的
		if (!this.isRequire && (value=="" || value == null))
		{
		  return result;
		}
		
		
		switch (this.type)
		{
		case "isnull" :
			pattern = /^.+$/;
			break;
		case "safe" :		
			pattern = /^[^\'\\\,\;\/\<\>\"\&\%\-\+]+$/;
			break;
		case "id" :			
			pattern = /^[1-9](\d*)?$/;
			break;
		case "email" :
			pattern = /^([\w\.\-])+@([\w\-])+(\.([\w\-])+)+$/;
			break;
		case "telephone" :
			pattern = /^(\d{3}-|\d{4}-)?(\d{8}|\d{7}|\d{11})$/;
			break;
		case "float" :
			pattern = /^(-?\d+)(\.\d+)?$/;
			break;
		case "account" :
			pattern = /^\w{4,20}$/;
			break;
		case "password"	:
			pattern = /^[^\'\\\,\;\/\<\>\"\&\%\-\+]{3,16}$/;
			break;
		case "login" :
		  pattern = /^[\w\#\$\@\-\.\u4e00-\u9fa5]{4,20}$/;
		  break;
		case "checkcode":
		  pattern = /^\w{5}$/;
		  break;
		  
	  case "sndamibao":
		  pattern = /^\d{4,8}$/;
		  break;
		  
		case "question":
		case "answer":
		  pattern = /^[^\'\\\,\;\/\<\>\"\&\%\-\+]{6,50}$/;
			break;
		case "idcard":
		  //pattern =  /^\d{15}|\d{17}(?:\d|x)$/; 
		  
		  var idcard = value.toUpperCase();
		  
		  var  Errors=new  Array(		
			true,false,false,false,false
			);
			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("");
			//地区检验
			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  Errors[0];
					else 
						return  Errors[2];
					break;
				case  18:
					//18位身份号码检测
					//出生日期的合法性检查  
					//闰年月日:((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]))
					//平年月日:((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]))
					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  Errors[0];  //检测ID的校验位
						else  
							return  Errors[3];
					}
					else  
						return  Errors[2];
					break;
					
					default:
					
					return  Errors[1];
					break;
				}
	    break;
	    
		case "cardno":
		  pattern =  /^\d{12}$/; 
	    break; 
	  case "cardpassword":
		  pattern =  /^\d{10}$/; 
	    break;
	  case "chinese":
	     pattern =  /^[\u4e00-\u9fa5]+$/; 
	    break;
	  case "realname":
			pattern = /^[\u4e00-\u9fa5]{2,6}$/;
			break;
		case "address":
		  pattern = /^[^\'\\\,\;\/\<\>\"\&\%\-\+]{6,50}$/;
			break;
	  case "zip":
	     pattern =  /^\d{6}$/; 
	     break; 
	  case "cardnumber":
	    pattern = /^[1-9]\d{3,5}$|^[5-9]\d{2,5}$/;
	    break;
	    
	  case "sndacardno":
	    pattern = /^\w{15}$/;
	    break;
	    
	  case "sndacardpassword":
	    pattern = /^\w{8}$/;
	    break;
		}
	  result = pattern.test(value);

		return result;
	}
}


// Function Name: len
// Function Description: 返回字符串的实际长度, 一个汉字算2个长度
// Creation Date: 2004-7-13 9:58
// Last Modify By: N/A
// Last Modify Date: N/A
function getBytelength(str)
{
	return str.replace(/[^\x00-\xff]/g, "**").length;
}

//根据名字获取元素列表
function $N() {
  var results = [];
    element = arguments[0];
    if (typeof element == 'string') {
      results = document.getElementsByName(element);
	}
  return results.length < 2 ? results[0] : results;
}