/* *
 * FTWU--飞天舞装备网  信息验证类
 * =================================================================
 * $Author :Haily.Z
 * Email:   haily27@126.com
 * $Date : 2008-05-09 10:27:36 +0800 (星期五, 9 五月 2008) $
 * 版权所有 (C) 2007-2008 FTWU--飞天舞装备网，并保留所有权利。
 * 网站地址 : http://www.ftwu.com.cn http://www.ftwu.cn
 * =================================================================
 */

var Safety = function(name,mode)
{
  this.formItem = [document.forms[name]];  
  this.msgMode = mode || 1;
  this.errMsg = ["以下原因導致提交失敗：\t\t\t\t"];

  /* *
  * 检查输入的内容是否是为空
  *
  * @param :  controlId-表单元素的name;msg-错误提示信息;required-是否必须
  */
  this.isNull = function(controlId, msg)
  {
    var obj = this.formItem[0].elements[controlId];
	this.ClearState(obj);  
    obj.value = Utils.trim(obj.value);

    if (Utils.isEmpty(obj.value))
    {
    	this.addErrorMsg(controlId,msg);
    }
    else
    {
    	return;
    }
  }

  /* *
  * 检查用户是否输入了内容
  *
  * @param :  controlId-表单元素的name;msg-错误提示信息;
  */
  this.required = function(controlId, msg)
  {
    var obj = this.formItem[0].elements[controlId];
    this.ClearState(obj);
    if (typeof(obj) == "undefined" || Utils.trim(obj.value) == "")
    {
    	this.addErrorMsg(controlId,msg);
    }
  }

  /* *
  * 检查用户输入的内容是否符合指定类型
  *
  * @param :  controlId-表单元素的name
  * @param :  dataType-数据类型(number,int,double,currency,safe,url,email,character,chinese,english,phone,mobile,idCard,zip,qq,time)
  * @param :  msg-错误提示信息;required-是否必须
  */
  this.validate = function(controlId,dataType,msg, required)
  {
    var obj = this.formItem[0].elements[controlId];
    this.ClearState(obj);
    obj.value = Utils.trim(obj.value);

    if ( ! required && obj.value == '')
    {
      return;
    }
    else
    {
    	switch(dataType)
    	{
    		case "number"://数字
    			if ( ! Utils.isNumber(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    		case "int"://整数字
    			if ( ! Utils.isInt(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    		case "double"://双精度数字
    			if ( ! Utils.isDouble(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    		case "currency"://货币数字
    			if ( ! Utils.isCurrency(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    		case "safe"://安全字符串
    			if ( ! Utils.isSafe(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    		case "url"://网址
    			if ( ! Utils.isUrl(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    		case "email"://email
    			if ( ! Utils.isEmail(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    		case "character"://中文字与英文字符
    			if ( ! Utils.isCharacter(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    		case "chinese"://中文字符
    			if ( ! Utils.isChinese(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    		case "english"://英文字符
    			if ( ! Utils.isEnglish(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    		case "phone"://电话
    			if ( ! Utils.isPhone(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    		case "mobile"://手机号
    			if ( ! Utils.isMobile(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    		case "idCard"://身份证
    			if ( ! Utils.isIdCard(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    		case "zip"://邮编
    			if ( ! Utils.isZip(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    		case "time"://"2006-11-12 12:00:00"格式
    			if ( ! Utils.isTime(obj.value)) this.addErrorMsg(controlId,msg);
    			break;
    	}
    }	
  }

  /* *
  * 检查输入内容是否符合自定义规则
  *
  * @param :  control-表单元素的name;regexp-自定义的正则表达式;msg-错误提示信息;required-是否必须
  */
  this.custom = function(controlId, regexp, msg,required)
  {
    var obj = this.formItem[0].elements[controlId];
    this.ClearState(obj);    
    obj.value = Utils.trim(obj.value);

    if ( ! required && obj.value == '')
    {
      return;
    }
    if (!Utils.isMatch(obj.value,regexp))
    {
    	this.addErrorMsg(controlId,msg);
    }
  }

  /* *
  * 检查输入内容是否在指定的范围中
  *
  * @param :  controlId-表单元素的name;msg-错误提示信息;min-表最少要选择多少项;max-表最多只能选多少项;
  */	
  this.limit = function(controlId,msg, min, max)
  {
	var obj = this.formItem[0].elements[controlId];
	this.ClearState(obj);    
	obj.value = Utils.trim(obj.value);
	var len = obj.value.length;	
	min = min || 0;
	max = max || Number.MAX_VALUE;
	if( min <= len && len <= max)
	{
		return;
	}
	else
	{
		this.addErrorMsg(controlId,msg);
	}
  }
  /* *
  * 检查指定的checkbox是否选定
  *
  * @param :  controlId-表单元素的name;min-表最少要选择多少项;max-表最多只能选多少项;msg-错误提示信息;
  */
  this.selectRequired = function(controlId,msg,min, max)
  {
	var groups = this.formItem[0].elements[controlId];	
	this.ClearState(groups[groups.length-1]);  		
	var hasChecked = 0;
	min = min || 1;
	max = max || groups.length;
	for(var i=groups.length-1;i>=0;i--)
	{
		//if (groups[i].type.toLowerCase() != "checkbox") continue;
		if(groups[i].checked) hasChecked++;
	}
	if(min <= hasChecked && hasChecked <= max)
	{
		return;
	}
    else
    {
   		this.addErrorMsg(controlId,msg);
  	}
  }
   /* *
  * 对两个表单元素进行比较操作
  *
  * @param :  fstControl,sndControl-表单元素的name;msg-错误提示信息;
  * @param :  handle-比较类型(repeat[=],ue[!=],gt[>],gte[>=],lt[<],lte[<=])
  * @param :  msg-错误提示信息;
  */
  this.compare = function(fstControl,sndControl,handle,msg)
  {
    var fstObj = this.formItem[0].elements[fstControl];
    var sndObj = this.formItem[0].elements[sndControl];
	this.ClearState(sndObj);   
    if (fstObj != null && sndObj != null)
    {
    	switch(handle)
    	{
    		case "repeat"://重复,第二个等于第一个
    			if (fstObj.value == '' || fstObj.value != sndObj.value) this.addErrorMsg(sndControl,msg);
    			break;
    		case "ue"://不等于,第二个不等于第一个
			    if (Utils.isNumber(fstObj.value) && Utils.isNumber(sndObj.value)) 
			    {
			        var v1 = parseFloat(fstObj.value) + 0;
			        var v2 = parseFloat(sndObj.value) + 0;
			    } else {
			        var v1 = Utils.trim(fstObj.value);
			        var v2 = Utils.trim(sndObj.value);
			    }
			    if (v1 == v2) this.addErrorMsg(sndControl,msg);
    			break;
    		case "gt"://大于,第一个大于第二个
			    if (Utils.isNumber(fstObj.value) && Utils.isNumber(sndObj.value)) 
			    {
			        var v1 = parseFloat(fstObj.value) + 0;
			        var v2 = parseFloat(sndObj.value) + 0;
			    } else {
			        var v1 = Utils.trim(fstObj.value);
			        var v2 = Utils.trim(sndObj.value);
			    }
			    if (v1 <= v2) this.addErrorMsg(sndControl,msg);
    			break;
    		case "gte"://大于等于,第一个大于等于第二个
			    if (Utils.isNumber(fstObj.value) && Utils.isNumber(sndObj.value)) 
			    {
			        var v1 = parseFloat(fstObj.value) + 0;
			        var v2 = parseFloat(sndObj.value) + 0;
			    } else {
			        var v1 = Utils.trim(fstObj.value);
			        var v2 = Utils.trim(sndObj.value);
			    }
			    if (v1 < v2) this.addErrorMsg(sndControl,msg);
    			break;
    		case "lt"://小于,第一个小于第二个
			    if (Utils.isNumber(fstObj.value) && Utils.isNumber(sndObj.value)) 
			    {
			        var v1 = parseFloat(fstObj.value) + 0;
			        var v2 = parseFloat(sndObj.value) + 0;
			    } else {
			        var v1 = Utils.trim(fstObj.value);
			        var v2 = Utils.trim(sndObj.value);
			    }
			    if (v1 >= v2) this.addErrorMsg(sndControl,msg);
    			break;
    		case "lte"://小于等于,第一个小于等于第二个
			    if (Utils.isNumber(fstObj.value) && Utils.isNumber(sndObj.value)) 
			    {
			        var v1 = parseFloat(fstObj.value) + 0;
			        var v2 = parseFloat(sndObj.value) + 0;
			    } else {
			        var v1 = Utils.trim(fstObj.value);
			        var v2 = Utils.trim(sndObj.value);
			    }
			    if (v1 > v2) this.addErrorMsg(sndControl,msg);
    			break;
    	}   
    }	
  }

  /* *
  * 数据校验结果
  *
  * @return :  true,false
  */
  this.passed = function()
  {
    if (this.errMsg.length > 1)
    {
		var errCount = this.formItem.length;
		switch(this.msgMode){
			case 1 :
				alert(this.errMsg.join("\n"));
				this.formItem[1].focus();
				break;			
			case 2 :
				for(var i=1;i<errCount;i++)
					this.formItem[i].style.color = "red";
				alert(this.errMsg.join("\n"));
				this.formItem[1].focus();
				break;			
			case 3 :
				for(var i=1;i<errCount;i++){
				try{
					var span = document.createElement("SPAN");
					span.id = "__ErrorMessagePanel";
					span.style.color = "red";
					this.formItem[i].parentNode.appendChild(span);
					span.innerHTML = this.errMsg[i].replace(/\d+:/,"*");
					}
					catch(e){alert(e.description);}
				}
				this.formItem[1].focus();
				break;
			default :
				alert(this.errMsg.join("\n"));
				break;
		}
		return false;
    }
    else
    {
      return true;
    }
  }
  /* *
  * 取消提示信息
  *
  * @param :  elemId
  */
	this.ClearState = function(elemId){
		with(elemId){
			if(style.color == "red")
				style.color = "";
			var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
			if(lastNode.id == "__ErrorMessagePanel")
				parentNode.removeChild(lastNode);
		}
	}
  /* *
  * 增加一个错误信息
  *
  * @param :  elemId-表单元素name;str-提示信息;
  */
  this.addErrorMsg = function(elemId, str)
  {
    var obj = this.formItem[0].elements[elemId];
    if(obj.length > 1)
    {
    	this.formItem[this.formItem.length] = obj[obj.length-1];
    }
    else
    {
    	this.formItem[this.formItem.length] = obj;
    }
    this.errMsg.push(this.errMsg.length + ":" + str);
  }
}



/* *
 * 信息的相关校验
 *
 * @author: Haily.Z < haily27@126.com http://www.ftwu.cn http://www.ftwu.com.cn >
 */

var Utils = new Object();

Utils.htmlEncode = function(text)
{
  return text.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}

Utils.trim = function( text )
{
  if (typeof(text) == "string")
  {
    return text.replace(/^\s*|\s*$/g, "");
  }
  else
  {
    return text;
  }
}

Utils.isEmpty = function( val )
{
  switch (typeof(val))
  {
    case 'string':
      return Utils.trim(val).length == 0 ? true : false;
      break;
    case 'number':
      return val == 0;
      break;
    case 'object':
      return val == null;
      break;
    case 'array':
      return val.length == 0;
      break;
    default:
      return true;
  }
}

Utils.isNumber = function(val)
{
  var reg = /^[\d|\.|,]+$/;
  return reg.test(val);
}
Utils.isInt = function(val)
{
  var reg = /^[-\+]?\d+$/;
  return reg.test(val);
}
Utils.isDouble = function(val)
{
  var reg = /^[-\+]?\d+(\.\d+)?$/;
  return reg.test(val);
}
Utils.isCurrency = function(val)
{
  var reg = /^\d+(\.\d+)?$/;
  return reg.test(val);
}
Utils.isSafe = function(val)//安全字符串
{
  var reg = /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/;
  return reg.test(val);
}
Utils.isEmail = function( email )
{
  //var reg1 = /([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)/;
  var reg1 = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+$/;
  return reg1.test( email );
}
Utils.isUrl = function( url )
{
  var reg1 = /^(\w{3,6}:\/\/)?\w+([-.]\w+)*\.\w+[\/=\?%\-&_~`@\[\]\':+!]*([^<>\"\"])*$/;
  return reg1.test( url );
}
Utils.isCharacter = function ( val )
{
  var reg = /^[A-Za-z\u4E00-\u9FA5]+$/; //中文字与英文字符
  return reg.test( val );
}
Utils.isChinese = function ( val )
{
  //var reg = /^[\u0391-\uFFE5]+$/; //
  var reg = /^[\u4E00-\u9FA5]+$/; //
  return reg.test( val );
}
Utils.isEnglish = function ( val )
{
  var reg = /^[A-Za-z]+$/; //
  return reg.test( val );
}
Utils.isPhone = function ( tel )
{
  //var reg = /^[\d|\-|\s|\_]+$/; //
  var reg = /^((0086|86)([- ]{1})?|(\((0086|86)\)))?((\d{3,4})|(\(\d{3,4}\)))([- ])?[1-9]\d{6,7}$/
  return reg.test( tel );
}
Utils.isMobile = function ( mobile )
{
  //var reg = /^[\d|\-|\s|\_]+$/; //
  var reg = /^((0086|86)([- ]{1})?|(\((0086|86)\)))?(0)?(13|15)\d{9}$/; //
  return reg.test( mobile );
}
Utils.isIdCard = function ( idcard )
{
  var reg = /^\d{6}(19|20)\d{2}[01]\d{1}(([012]\d{1})|3[01])\d{3}[a-zA-Z0-9]$/; 
  return reg.test( idcard );
}
Utils.isZip = function ( zip )
{
  var reg = /^[1-9]\d{5}$/; 
  return reg.test( zip );
}
Utils.isQq = function ( qq )
{
  var reg = /^[1-9]\d{4,8}$/; 
  return reg.test( qq );
}
Utils.isTime = function(val)
{
  var reg = /^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}$/;
  return reg.test(val);
}
Utils.isMatch = function(val,reg)
{
  //var reg1 = new RegExp(reg,"g");
  return reg.test(val);
}
Utils.fixEvent = function(e)
{
  var evt = (typeof e == "undefined") ? window.event : e;
  return evt;
}

Utils.srcElement = function(e)
{
  if (typeof e == "undefined") e = window.event;
  var src = document.all ? e.srcElement : e.target;

  return src;
}



