﻿/*
 *
 * 文件名：univerify.js                               
 * 功  能：基于自定义属性的统一检测用Javascript函数库
 * 取得字符串的字节长度
 *
 */
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 isnull(str){
		var i; 
		for (i=0;i<str.length;i++){
			if (str.charAt(i)!=' ') return false;
		} 
		return true;
}

/* 
 * 
 * 检测字符串是否全为数字
 *
 */
function isnumber(str){
	var  patrn=/^[0-9]{1,20}$/; 
	return  patrn.test(str);
}

/* 
 * 
 * 检测字符串是否全为数字
 *
 */
function isnumberordot(str){
	var  patrn=/^[0-9.]{1,20}$/; 
	return  patrn.test(str);
}

/**
 * 将字符型数据转化成整型
 * value：被转化的数据，为字符型
 */
function MyParseInt(value)
{
    if(value=="0")
       return 0;

	var firstchar = value.charAt(0);
	while(firstchar == '0')
	{
		value = value.substr(1);
		firstchar = value.charAt(0);
	}
	return parseInt(value);
}

/**
 * 判断一个字符串是否为数字，原来的isNaN(value)不会测试出：1234ss类型的字符串
 * 本方法可以判断出：1234ss类型的字符串；字符间是否有空格；小数点是不是超过一个；负号“-”是否出现在第一位；
 */
function isNaN_new(value)
{
  var vLen = value.length;
  // 如果多于一个小数点
  if(value.indexOf(".")!=value.lastIndexOf("."))
      return true;
  // 对第一个字符进行判断，因为第一个字符可能是负号“-”
  if(value.charAt(0)==" " || (isNaN(value.charAt(0)) && value.charAt(0)!="." && value.charAt(0)!="-") || value=="-")
      return true;

  for(var i=1;i<vLen;i++)
  {
     if(value.charAt(i)==" " || (isNaN(value.charAt(i)) && value.charAt(i)!="."))
       return true;
  }
      
  return false;
}


/**
 * 判断一个字符串是否为正数、整数或正整数
 * value：要判断的字符串
 * bInt：如果为true表示进行整数的判断；如果为false表示不进行整数的判断
 * bPositive：如果为true表示进行正数的判断；如果为false表示不进行正数的判断
 */
function ValueIsDecimal(value,bInt,bPositive)
{
    var result = MyParseInt(value);
    var mark = value.indexOf(".");

	if(isNaN_new(value))
		return false;

	if(bPositive && result <= 0)
		return false;

	if(bInt && mark >= 0)
		return false;

	return true;
}

/**
 * 判断一个字符串是否为正数、整数或正整数
 * value：要判断的字符串
 * bInt：如果为true表示进行整数的判断；如果为false表示不进行整数的判断
 * bNotNegative：如果为true表示进行非负数的判断；如果为false表示不进行非负数的判断
 */
function ValueIsDecimal2(value,bInt,bNotNegative)
{
    var result = MyParseInt(value);
    var mark = value.indexOf(".");

	if(isNaN_new(value))
		return false;

	if(bNotNegative && result < 0)
		return false;

	if(bInt && mark >= 0)
		return false;

	return true;
}


/* 
 * 
 * 校验普通电话、传真号码：可以“+”开头，除数字外，可含有“-”
 *
function  istel(str) 
{ 
	var  patrn=/^[+]{0,1}(\d){1,3}[  ]?([-]?((\d)|[  ]){1,12})+$/;  
	return  patrn.test(str);
}
 */
// 普通电话、传真号码不校验
function  istel(str) 
{
   return true;
} 

/* 
 * 
 * 校验邮政编码
 *
function  ispostalcode(str) 
{ 
	var  patrn=/^[1-9]\d{5}$/;  
	return  patrn.test(str); 
}
 */
// 邮政编码不校验 
function  ispostalcode(str) 
{ 
	return true;
}

/* 
 * 
 * 校验mail格式
 *
 */ 
function ismail(str){
	var patrn=/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/;
	return  patrn.test(str);
}
/*
 *
 * 校验是否为US-ASCII单词，用于员工编号等
 * 只能为字母或数字
 */
function isAlnum(str) {
	var patrn=/^\w+$/;
	return  patrn.test(str);
}

function isUser(userId, userType, range) {
	var user = getUser(userId, userType, range);
	if(user.id!=null)
		return true;
	return false;
}

/**
  *  檢驗是否爲合法的時間yyyy/MM/dd hh:mm
  */
function isTime(str){
  var r = str.match(/^(\d{1,4})(\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2})$/);
  if(r==null)
      return false; 
  var d = new Date(r[1], r[3]-1,r[4],r[5],r[6]);
     return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]);
}

/**
  *  檢驗時間yyyy/MM/dd hh:mm 是否是在时间范围呢,符合时间间隔的时间
  *  time: 输入的时间字串
  *  interval:指定的时间间隔,如每隔十分钟(以10分钟为单位)
  */
function isRequestInterval(time,interval){
  if(isnull(interval) || interval == 1){  //如果间隔为空或为1,则验证通过
    return true;
  }
  var minStr = time.substring(time.indexOf(":")+1,time.length);  
  //遍历符合条件的分钟数,如果minStr符合,则返回true
  for(var i = 0;i < 60;i = i + parseInt(interval,10)){
     var txt = i;
     if(i < 10)
       txt = "0"+i;
     if(minStr == txt)
       return true;
  }
  return false;
}

/**
  *  檢驗是否爲合法的日期yyyy/MM/dd
  *  如果输入的是数字则转换为yyyy/MM/dd格式,并回显.如:19990908--->1999/09/08
  */
function isDate(input){
  var str = input.value;
  if(str.indexOf("/")==-1){
     str = str.substring(0,4)+"/"+str.substring(4,6)+"/"+str.substring(6,8);
     input.value = str;
  }
   var r = str.match(/^(\d{1,4})(\/)(\d{1,2})\2(\d{1,2})$/);
   if(r==null)
     return false; 
   var d = new Date(r[1], r[3]-1, r[4]);
  
   return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);
}



/* 
 *
 * 检测指定文本框输入是否合法 
 *
 */
function verifyInput(input){
		var image;
		var i;
		var error = false;
		var checkdiv = $('check'+input.id);
		/* 长度校验 */
		if (strlen(input.value)>parseInt(input.maxlength)){
			warning(checkdiv,input.msg+"超出最大长度"+input.maxlength);
			error = true;
			}
		else if (input.nullable=="no"&&isnull(input.value)){/* 非空校验 */
				warning(checkdiv,input.msg+"不能为空");
				error = true;
			}
		else{/* 数据类型校验 */
				var datatype = input.datatype;
				if(datatype!=undefined){
					if (datatype == "number")
					{
						if (!isnull(input.value)&&isnumber(input.value)==false){
							warning(checkdiv,input.msg+"值应该全为数字");
							error = true;
						}
					}
					else if (datatype.indexOf("number(") != -1) /* 形如：number(16,2) */
					{
					    var maxLength = datatype.substring(datatype.indexOf("(")+1,datatype.indexOf(","));
					    var decimalLength = datatype.substring(datatype.indexOf(",")+1,datatype.indexOf(")"));
						if (!isnull(input.value)&&isnumberordot(input.value)==false){
							warning(checkdiv,input.msg+"值应该全为数字");
							error = true;
						}
						if(input.value.trim()=="." || input.value.trim().indexOf(".")!=input.value.lastIndexOf(".") || input.value.trim().indexOf(".")>=(maxLength-decimalLength)){
							warning(checkdiv,"非法的数据格式");
							error=true;
						}	
						if(input.value.trim().indexOf(".")==-1 && input.value.trim().length>=(maxLength-decimalLength)){
							warning(checkdiv,"数据超过最大限制");
							error=true;
						}											
					}else if(datatype=="plusInteger"){
						if (!isnull(input.value)&&ValueIsDecimal(input.value,true,true)==false){
							warning(checkdiv, input.msg + "只能为正整数"); 
							error = true;
						}
					}else if(datatype=="naturalNumber"){
						if (!isnull(input.value)&&ValueIsDecimal2(input.value,true,true)==false){
							warning(checkdiv, input.msg + "只能为自然数"); 
							error = true;
						}
					}								
					else if (datatype == "tel")
					{
						if (!isnull(input.value)&&istel(input.value)==false)
						{
							warning(checkdiv,input.msg+"不是合法电话号码");
							error = true;
						}
					}
					else if (datatype == "postalcode")
					{
						if (!isnull(input.value)&&ispostalcode(input.value)==false)
						{
							warning(checkdiv,input.msg+"不是合法邮编");
							error = true;
						}
					}
					else if (datatype == "mail")
					{
						if (!isnull(input.value)&&ismail(input.value)==false)
						{
							warning(checkdiv,input.msg+"不是合法mail");
							error = true;
						}
					}else if(datatype=="money"){
						if (!isnull(input.value)&&isnumber(input.value)==false){
							warning(checkdiv,"钱币应该全为数字");
							error = true;
						}
						if(input.value.length>11){
							warning(checkdiv,"钱币应少于11位");
							error=true;
						}
					}else if(datatype=="alnum"){
						if (!isnull(input.value)&&isAlnum(input.value)==false){
							warning(checkdiv, input.msg + "只能为字母或数字");
							error = true;
						}
					}else if(datatype.substring(0,datatype.indexOf(":"))=="user"){
					    var userType = datatype.substring(datatype.indexOf(":")+1, datatype.lastIndexOf(":"));
						var range = datatype.substring(datatype.lastIndexOf(":")+1, datatype.length);
						if(!isnull(input.value) && !isUser(input.value, userType, range)){
							warning(checkdiv, input.msg + "不正确");
							error = true;
						}
					}else if(datatype!=null && datatype.indexOf("date")==0){
	                  var dateStyle = datatype.substring(datatype.indexOf(":")+1,datatype.length);
					  if(dateStyle.indexOf("time")==0){
					    var flag = true;
					    if (!isnull(input.value) && isTime(input.value)==false){
							warning(checkdiv, input.msg + "不是合法的日期");
							error = true;
							flag = false;
						}
						var interval = datatype.substring(datatype.lastIndexOf(":")+1,datatype.length);
						if(flag && isRequestInterval(input.value,interval)==false){
							  warning(checkdiv, input.msg + "必须是以" + interval + "分钟为单位");
							  error = true;
						}
					  }else if(dateStyle.indexOf("default")==0){
					    if (!isnull(input.value)&& isDate(input)==false){
							warning(checkdiv, input.msg + "不是合法的日期");
							error = true;
						}
					  }
					}
					/* else if 增加其他类型检验*/
				}
			}
			/* 根据有无错误设置或取消警示标志 */
			if(!error){
			    if(checkdiv!=null){
				    checkdiv.innerHTML = "";
				    checkdiv.style.display = 'none';
				}
			}
			return !error;
}

/* 
 *
 * 检测指定FORM表单所有应被检测的元素（那些具有自定义属性的元素）是否合法
 * 此函数用于表单的onsubmit事件 
 *
 */
function verifyBaseAll(myform){
	var i;
	var sub = true;
	for (i=0;i<myform.elements.length;i++){
		/* 非自定义属性的元素不予理睬 */
		if (myform.elements[i].msg+""=="undefined") 
			continue;
		/* 校验当前元素 */
		if (!isLineClear(myform.elements[i])&&verifyInput(myform.elements[i])==false){
			//myform.elements[i].focus();
			sub = false;
			}
		}
	return sub;
}
//元素所在的列是否被清空（即此元素是否需验证）
//请重载此函数
function isLineClear(input){
	return false;
}
function warning(checkdiv,reason){
	checkdiv.style.display = '';
	checkdiv.innerHTML = "<font color='red'>" + reason + "</font>";
}
