/**
 * 表单验证类
 * 版权所有
 * @author      
 * @version     $Id: cls_validator.js 3959 2008-08-25 05:01:13Z xiesht $
*/
/**
 * 构造函数，初始化本类中的一些非函数属性
*/
/*** 返回字节数 ***/
String.prototype.lenb = function() {
  return this.replace(/[^\x00-\xff]/g,"**").length;
}

function Validator()
{
  this.errMsg = new Array(); // 错误信息数组
}
var username = false;//用户名
var nickname = false;//昵称（网名）
var nicknameCh = false;//推荐使用中文昵称
var email    = false;//电子邮箱
var password = false;//密码
var question = false;//密码保护问题
var answerStatus = false;//密码保护答案

/**
* 获取ID为el的元素
* @param el
* @return object
*/
Validator.prototype.$ = function (el)
{
	return document.getElementById(el);
}

/**
 * 检查用户输入的是否为合法的邮件地址
 *
 * @param :  elementId   表单元素的ID
 * @param :  required    是否必须
 * @param :  msg    错误提示内容
 * @return:  BOOL        是否通过验证
*/
Validator.prototype.checkEmail = function(elementId, required, msg)
{
  var email = this.trim(this.$(elementId).value);

  var r = /([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)/;

  if(email == '' && required == false)
  {
    return true;
  }

  if(!r.test(email))
  {
    this.addErrMsg(msg);
    return false
  }
  else
  {
    return true;
  }
}

/**
 * 检查用户登陆帐号字符串(只允许字母/数字/下划线的组合)
 *
 * @param :  elementId   表单元素的ID
 * @param :  required    是否必须
 * @param :  min         最少要选择几个
 * @param :  max         最多要选择几个
 * @param :  msg         错误提示内容
 * @return:  BOOL        是否通过验证
*/
Validator.prototype.checkAccount = function(elementId, required, min, max, msg)
{
  var account = this.trim(this.$(elementId).value);
  var r = /^[_a-zA-Z0-9]+$/;

  if(account == '' && required == false)
  {
    return true;
  }

  if(account.length < min || account.length > max)
  {
    this.addErrMsg(msg);
    return false;
  }

  if(!r.test(account))
  {
    this.addErrMsg(msg);
    return false
  }
  else
  {
    return true;
  }
}

/**
 * 检查用户输入的是否为合法字符串
 *
 * @param :  elementId   表单元素的ID
 * @param :  required    是否必须
 * @param :  min    最少要选择几个
 * @param :  max    最多要选择几个
 * @param :  msg    错误提示内容
 * @return:  BOOL        是否通过验证
*/
Validator.prototype.checkStr = function(elementId, required, min, max, msg)
{
  var str = this.trim(this.$(elementId).value);
  var strLen = 0;

  if(str == '' && required == false)
  {
    return true;
  }

  for(i = 0; i < str.length; i++)
  {
    if((str.charCodeAt(i) >= 0) && (str.charCodeAt(i) <= 255))
    {
      strLen = strLen + 1;
    }
    else
    {
      strLen = strLen + 3;  // 汉字记为三个字节
    }
  }

  if(strLen < min || strLen > max)
  {
    this.addErrMsg(msg);
    return false;
  }

  return true;
}

/**
 * 检查用户输入的是否为合法整数
 *
 * @param :  elementId   表单元素的ID
 * @param :  required    是否必须
 * @param :  min    最少要选择几个，可以为0，就是不指定
 * @param :  max    最多要选择几个，可以为0，就是不指定
 * @param :  msg    错误提示内容
 * @return:  BOOL        是否通过验证
*/
Validator.prototype.checkInt = function(elementId, required, min, max, msg)
{
  var integer = this.trim(this.$(elementId).value);
  if(integer== '' && required == false)
  {
    return true;
  }

  for(i = 0; i < integer.length; i++)
  {
  
    if(integer.charAt(i) < "0"  ||  integer.charAt(i) > "9")
    {
	  
	    this.addErrMsg(msg);
      return  false; 
    }
  }

  if((integer < min || integer > max) && (!(min == 0 && max == 0)) || integer.length == 0)
  {
	this.addErrMsg(msg);
    return false;
  }

  return true;
}

/**
 * 检查用户输入的是否为使用HTTP协议的网址
 *
 * @param :  elementId   表单元素的ID
 * @param :  required    是否必须
 * @param :  msg    错误提示内容
 * @return:  BOOL        是否通过验证
*/
Validator.prototype.checkHttpUrl = function(elementId, required, msg)
{
  var url = this.trim(this.$(elementId).value);
  var r = /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/;

  if(url == '' && required == false)
  {
    return true;
  }

  if(!r.test(url))
  {
    this.addErrMsg(msg);
    return false;
  }

  return true;
}

/**
 * 检查用户输入的是否为电话号码
 *
 * @param :  elementId   表单元素的ID
 * @param :  required    是否必须
 * @param :  msg    错误提示内容
 * @return:  BOOL        是否通过验证
*/
Validator.prototype.checkTel = function (elementId, required, msg)
{
	var Letters = "0123456789()+-";
	var tel = this.trim(this.$(elementId).value);

	var telLength = tel.length;

	 if(tel == '' && required == false)
	  {
 	   return true;
  	  }
	//if(lenLength == 0)
	if(telLength == 0)
	{
		this.addErrMsg(msg);
	}
	for (var i=0 ; i< telLength ; i++)
	{
		var charSet = tel.charAt(i);
		if(Letters.indexOf(charSet) == -1)
		{
  		this.addErrMsg(msg);
		return false;
		}
}
return true;
}

/**
 * 检查用户输入的是否为手机号码
 *
 * @param :  elementId   表单元素的ID
 * @param :  required    是否必须
 * @param :  msg    错误提示内容
 * @return:  BOOL        是否通过验证
*/
Validator.prototype.checkMobile = function(elementId, required, msg)
{
  var mobile = this.trim(this.$(elementId).value);

  if(mobile == '' && required == false)
  {
    return true;
  }

  if(mobile.length != 11){
     
    this.addErrMsg(msg);
    return false;  
  }

  for (i=0;i<mobile.length;i++)     
  {     
    if(mobile.charAt(i) < "0"  ||  mobile.charAt(i) > "9"){
	  
	  this.addErrMsg(msg);
      return false;     
    }
  }

  return true;
}

/**
 * 检查用户输入的是否为邮政编码
 *
 * @param :  elementId   表单元素的ID
 * @param :  required    是否必须
 * @param :  msg    错误提示内容
 * @return:  BOOL        是否通过验证
*/
Validator.prototype.checkZipCode = function(elementId, required, msg)
{
  var zipcode = this.trim(this.$(elementId).value);

  if(zipcode == '' && required == false)
  {
    return true;
  }
    
  if(zipcode == '' && required == true)
  {
    this.addErrMsg(msg);
    return false;
  }

  for (i=0;i<zipcode.length;i++)     
  {     
    if(zipcode.charAt(i) < "0"  ||  zipcode.charAt(i) > "9"){
	  
	  this.addErrMsg(msg);
      return false;     
    }
  }

  return true;
}

/**
 * 检查用户输入的是否为身份证号码
 *
 * @param :  elementId   表单元素的ID
 * @param :  required    是否必须
 * @param :  msg    错误提示内容
 * @return:  BOOL        是否通过验证
*/
Validator.prototype.checkIdNum = function(elementId, required, msg)
{
  var idnum = this.trim(this.$(elementId).value);

  if(idnum == '' && required == false)
  {
    return true;
  }

  if(idnum.length ==0)
  {
  	this.addErrMsg(msg);
	return false;
  }
  /*去掉检测imnum的规则，放开检测的范围
  for (i=0;i<idnum.length;i++)     
  {     
    if(idnum.charAt(i) < "0"  ||  idnum.charAt(i) > "9" || idnum.charAt(i) != "x"  || idnum.charAt(i) != "X")
    {
	    this.addErrMsg(msg);
      return false;     
    }
  }
 */
  return true;
}

/**
 * 检查开始时间是否小于结束时间
 *
 * @param :  elementId   表单元素的ID
 * @param :  firstElementId   first表单元素的ID
 * @param :  secElementId    sec表单元素的ID
 * @param :  msg    错误提示内容
 * @return:  BOOL        是否通过验证
*/
Validator.prototype.checkTimeRange = function(firstElementId, secElementId, msg)
{
  var firsttime = this.trim(this.$(firstElementId).value);
  var sectime = this.trim(this.$(secElementId).value);

  if(firsttime > sectime){

    this.addErrMsg(msg);
    return false;
  }

  return true;
}

/**
 * 限制具有相同名称的复选框(checkbox)的选中数目
 *
 * @param :  elementId   表单元素的ID
 * @param :  required    是否必须
 * @param :  min    最少要选择几个
 * @param :  max    最多要选择几个
 * @param :  msg    错误提示内容
 * @return:  BOOL        是否通过验证
*/
Validator.prototype.checkSelectedNum = function(elementName, min, max, msg)
{
  var elementName = this.$(elementName).value;

  return true;
}

/**
 * 检查两表单的值是否相等
 *
 * @param :  firstElementId   first表单元素的ID
 * @param :  secElementId    sec表单元素的ID
 * @param :  msg    错误提示内容
 * @return:  BOOL        是否通过验证
*/
Validator.prototype.checkEquation = function(firstElementId, secElementId, msg)
{
  var first = this.trim(this.$(firstElementId).value);
  var sec = this.trim(this.$(secElementId).value);

  if(first != sec){

    this.addErrMsg(msg);
    return false;
  }

  return true;
}

/**
 * 显示错误信息
 *
 * @param :  showEleId  　用来显示错误信息的元素ID
*/
Validator.prototype.showErrMsg = function(showEleId)
{
  if(this.errMsg.length > 0)
  {
    var msg = "";
    for (i = 0; i < this.errMsg.length; i ++ )
    {
      //msg += this.errMsg[i] + "<br />";
	  msg += this.errMsg[i] + "\n";
    }

    //this.$(showEleId).innerHTML = msg;
	alert(msg);
  }
}

/**
 * 将错误信息加入错误信息数组
 *
 * @param :  msg   错误信息
*/
Validator.prototype.addErrMsg = function(msg)
{
  this.errMsg.push(msg);
}

//suzhen 添加的部分

/**
 * 检查用户登陆帐号字符串(只允许字母/数字/下划线的组合)
 *
 * @param :  elementId   表单元素的ID
 * @param :  required    是否必须
 * @param :  min         最少要选择几个
 * @param :  max         最多要选择几个
 * @param :  msg         错误提示内容
 * @return:  BOOL        是否通过验证
*/

Validator.prototype.checkUsername = function(username)
{
    Validator.prototype.username = false;
    var pattern   = /[\u4E00-\u9FA5]+/;//汉字
    var pattern_1 = /[\uFF00-\uFFFF]+/;//全角字符
	var pattern_2 = /\s|　+/;//空格
	var pattern_3 = /\W+/;//特殊字符
    if(username.match(pattern))
    {
        return "用户名中不能含有汉字";
    }
    if(username.match(pattern_1))
    {
        return "用户名中不能含有全角字符";
    }
    if(username.match(pattern_2))
    {
        return "用户名中不能含有空格，请您删除空格";
    }
    if(username.match(pattern_3))
    {
        return "不能输入类似 ~ ! @ # $ % ^ & * ( ) , . < > / \ | - \" ' : ; ` 的特殊字符";
    }    
    if(username.length == 0)
    {
        return "用户名不能为空";
    }
    if(username.length < 4)
    {
        return "用户名太短，长度为4～30位";
    }
    if(username.length > 30)
    {
        return "用户名太长，长度为4～30位";
    }
    Validator.prototype.username = true;
    return true;
}

Validator.prototype.checkNickname1 = function(nickname)
{
    var pattern    = /\s|　+/;//空格
    var pattern_1 = /[\|\+\)\(\*\\\\$\!\=\}\{\]\[\:\?\/&%#@;~><\'\"]+/;//特殊字符
    var pattern_2  = /[\uFF00-\uFFFF]+/;//全角字符
    var pattern_2_1  = /[\uFF00-\uFFFF]/g;//全角字符个数
    var pattern_3  = /[\u4E00-\u9FA5]+/;//汉字
    var pattern_3_1  = /[\u4E00-\u9FA5]/g;//汉字个数
    var pattern_4  = /^[.．_＿]+|[.．_＿]+$/;//第一个和最后一个字符不能为中英文的.和_
    Validator.prototype.nickname   = false;
    Validator.prototype.nicknameCh = false;
    if(nickname.match(pattern))
    {
        return "昵称不能含有空格，请您删除空格";
    }
    if(nickname.match(pattern_1))
    {
        return "不能输入类似 ~ ! @ # $ % ^ & * ( ) , . < > / \ | - \" ' : ; ` 的特殊字符";
    }
    if(nickname.match(pattern_2))
    {
       return "昵称不能含有全角字符";
    }
    if(nickname.match(pattern_4))
    {
       return "昵称不能以 '.'或'_' 开头或结束";
    }
    if(nickname.length == 0)
    {
        return "昵称不能为空";
    }

    var nicknameLen = nickname.length;    
    var nicknameLen3 = nickname.match(pattern_3_1);//汉字

    if(nicknameLen3 != null)
    {
        nicknameLen = nicknameLen + nicknameLen3.length;
    }
    
    if((nicknameLen) < 4)
    {
        return "昵称太短，长度为4～30位";
    }
    if(nicknameLen > 30)
    {
        return "昵称太长，长度为4～30位";
    }
    //推荐使用中文昵称
    if(!nickname.match(pattern_3))
    {
        Validator.prototype.nicknameCh = true;
    }
    Validator.prototype.nickname = true;
    return true;
}

Validator.prototype.checkEmail1 = function(Email)
{
   Validator.prototype.email = false;
    var pattern = /^[a-zA-Z\d]+[\w\.\-@]*$/;
    if(!Email.match(pattern))
    {       
        return "邮箱地址不符合要求";
    }
    Validator.prototype.email = true;
    return true;
}

Validator.prototype.checkPassword1= function(password)
{
    Validator.prototype.password = false;
    var pattern = /[a-zA-Z]+/;//字母
    var pattern_1 = /\d+/;//数字
    var pattern_2 = /[\|\+\)\(\*\\\\$\!\=\}\{\]\[\:\?\/&%#@;~><\'\"]+/;//特殊字符


    if(password.length < 4)
    {
        return "密码太短，长度为4～20位";
    }
    if(password.length > 20)
    {
        return "密码太长，长度为4～20位";
    }

    if(password.length <= 6)
    {
        return "弱";
    }

    //字母 小于20位 弱
    if(password.match(pattern) && !password.match(pattern_1) && !password.match(pattern_2) && password.length <= 20)
    {
        return "弱";
    }
    
    //数字 小于20位 弱
    if(!password.match(pattern) && password.match(pattern_1) && !password.match(pattern_2) && password.length <= 20)
    {
        return "弱";
    }
    
    //特殊字符 小于20位 弱
    if(!password.match(pattern) && !password.match(pattern_1) && password.match(pattern_2) && password.length <= 20)
    {
        return "弱";
    }    
    
    //字母 数字 小于20位 弱
    if(password.match(pattern) && password.match(pattern_1) && !password.match(pattern_2) && password.length <= 20)
    {
        return "中";
    }
    
    //字母 特殊字符 小于20位 中
    if(password.match(pattern) && !password.match(pattern_1) && password.match(pattern_2) && password.length <= 20)
    {
        return "中";
    }
    
    //数字 特殊字符 小于20位 中
    if(!password.match(pattern) && password.match(pattern_1) && password.match(pattern_2) && password.length <= 20)
    {
        return "中";
    }    

    //字母数字特殊字符 小于20位 强
    if(password.match(pattern) && password.match(pattern_1) && password.match(pattern_2) && password.length <= 20)
    {
        return "强";
    }
    
    return true;
}
/**
 * 检查日期类型 ，日期格式：2007-12-12
 * @param string date
 * @param bool required
 * @param string msg
 * @return bool
 */
Validator.prototype.checkDate = function (date, required, msg)
{
	//check this type : 2007-12-12
	var value = this.trim(this.$(date).value);
	var pattern_1 = /^[0-9]{4}$/;
	var pattern_2 = /^[0-9]{4}-[0-9]{1,2}$/;
	var pattern_3 = /^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$/;
	if((!pattern_1.test(value) && !pattern_2.test(value) && !pattern_3.test(value)) && required == true)
	{
		this.addErrMsg(msg);
    	return false;
	}
	return true;
}
/**
 * 验证是否是整数或小数
 * @param object elementId
 * @param string msg
 */
Validator.prototype.checkIntFloat = function(elementId, intLength, floatLength, min, msg)
{
	var integer = this.trim(this.$(elementId).value);
	
	if(isNaN(integer) || integer == "" || integer < min)
	{
		this.addErrMsg(msg);
		return false;
	}
	var point = integer.indexOf(".");
	if(point != -1)
	{
		var integerPart = integer.substr(0, point);
		var floatPart = integer.substr(point + 1, integer.length);
		if(integerPart.length > intLength || floatPart.length > floatLength)
		{
			this.addErrMsg(msg);
			return false;
		}
	}
	return true;
}
/**
 * 验证字符在指定长度没有中文且没有空格的情况下
 * @param object elementId
 * @param int length 字符长度
 * @param int minLength 字符的最小长度
 * @param int maxLength 字符的最大长度
 * @param string msg1 字符长度超过了指定长度的提示
 * @param string msg2 输入信息中不包含中文或空格的提示信息
 */
Validator.prototype.checkMix = function (elementId, length, minLength, maxLength, msg1, msg2){
	var str = this.trim(this.$(elementId).value);
	var strLength = str.length;
	var pattern_chinese  = /[\u4E00-\u9FA5]/;//汉字
	var pattern_space = /\s/;//空格
	var pattern_english = /[a-zA-Z]/;//英文
	var pattern_false = /[^\u4E00-\u9FA5\s]{20,}/;
	if(typeof(length)==undefined)
	{
		var length = 20;
	}
	if(strLength < minLength || strLength > maxLength)
	{
		this.addErrMsg(msg1);
		return false;
	}
	if(pattern_false.test(str))
	{
		this.addErrMsg(msg2);
		return false;
	}
	var includesChinese = pattern_chinese.test(str);
	var includesSpace  = pattern_space.test(str);
	var includesEnglish = pattern_english.test(str);
	if((strLength == 0 || strLength > length) && (!includesChinese && !includesSpace))
	{
		this.addErrMsg(msg2);
		return false;
	}
	return true;
}
/**
 * 去掉首尾空格
 * @param string s
 * @return string 去掉首尾空格后的字符串
 */
Validator.prototype.trim = function (s)
{
	 return s.replace(/(^\s*)|(\s*$)/g,"");
}
/**
 * 检查字符串的长度
 * @param string
 * @param int min
 * @param int max
 * @param string msg
 */
Validator.prototype.checkLength = function (str, min, max, msg)
{
	var s = this.$(str).value;
	if(s.length < min || s.length > max)
	{
		this.addErrMsg(msg);
		return false;
	}
}
/**
 * 检查指定ID的值是否与指定值相等
 * @param object elementId
 * @param string value
 * @param string msg
 */
Validator.prototype.checkEque = function (elementId, value, msg)
{
	if(this.$(elementId).value != value)
	{
		this.addErrMsg(msg);
		return false;
	}
	return true;
}
/**
 * 检查指定ID的值与value相等的话就返回错误
 * @param object elementId
 * @param string value
 * @param string msg
 */
Validator.prototype.checkUnEque = function (elementId, value, msg)
{
	if(this.$(elementId).value == value)
	{
		this.addErrMsg(msg);
		return false;
	}
	return true;
}
/**
 * 验证图片格式
 * @param string value
 */
Validator.prototype.checkPicture = function (value)
{
	var pattern_picture = /\.jpg|\.png|\.gif|\.jpeg$/i;
	if(!pattern_picture.test(value))
	{
		return false;
	}
	return true;
}
/**
 * 验证radio 和checkBox 选中是否大于指定个数
 * @param Object itemName
 * @param int maxChecked
 * @param string msg
 */
Validator.prototype.checkRadio = function(itemName, maxChecked, msg)
{
	var count = 0;				
	var element = document.getElementsByName(itemName);
	for(var i = 0; i < element.length; i++) {
		if(element[i].checked == true) {
			count++;
		}
		}
		if(count < maxChecked) {
			this.addErrMsg(msg);
			return false;
			}
		return true;
}
/**
 * 
 * 向页面中添加图片
 * @param Object nodeId
 * @param String value
 * @param Bool hidden
 * @return Object
 */
Validator.prototype.insertImg = function(nodeId, value, hidden)
{
	if(this.$(nodeId +"_img"))
	{
		this.$(nodeId +"_img").src = this.trim(value);
		return this.$(nodeId +"_img");
	}else{
	img=document.createElement("img");  
	img.style.position="absolute";  
	if(hidden)
	{
		img.style.display = "none";
	}
	img.src=value;
	img.id = nodeId +"_img";
	if(!this.$(nodeId))
	{
		var node = document.createElement("DIV");
		node.id = nodeId;
		node.style.display = "none";
		document.body.appendChild(node);
	}
	this.$(nodeId).appendChild(img);  
	return img; 
	}
}
/**
 * 验证图片的大小
 * @param Object img
 * @return file size (k)
 */
Validator.prototype.checkImageSize = function (img)
{
	return img.fileSize/1024;
}

Validator.prototype.checkOutsideNum = function(elementId, msg)
{
	var pattern_1 = /\D+/;
	 
	var obj = this.$(elementId).value
    if(obj.match(pattern_1))
    {
        this.addErrMsg(msg);
		return false;
    }

    return true;
}


/**
 * 检查用户收款帐号字符串(只允许数字字符串)
 *
 * @param :  elementId   表单元素的ID
 * @param :  required    是否必须
 * @param :  min         最少要选择几个
 * @param :  max         最多要选择几个
 * @param :  msg         错误提示内容
 * @return:  BOOL        是否通过验证
*/
Validator.prototype.checkArAccount = function(elementId, required, min, max, msg)
{
  var account = this.trim(this.$(elementId).value);
  var r = /^[0-9]+$/;

  if(account == '' && required == false)
  {
    return true;
  }

  if(account.length < min || account.length > max)
  {
    this.addErrMsg(msg);
    return false;
  }

  if(!r.test(account))
  {
    this.addErrMsg(msg);
    return false
  }
  else
  {
    return true;
  }
}
