/*************************************************
Validator v1.06
原作者          code by           我佛山人 
修改优化        change by chenjia 我上海人

修正内容
1  改良了 长度算法  增加了实用方法类  再次感谢原作者 
2  原作日期 判断有错 无效日期 都可以输入  而且 润年2月未考虑
  已经修改 并添加了2种日期格式
  的验证 yyyy-mm-dd(年-月-日) yyyy-mm(年-月) 的格式判断
3 增加了一种错误验证模式   可以对单对象进行错误验证 返回单条信息并定位
4 去除了 无效代码  
5 添加了Jscomm 类的方法  从HELUO的以前JS抽象出来 可以单独使用
6 修改了RANGE 判断 无法精确到小数位的BUG
7 2008-1-24 增加过滤文本多余空格子的功能拉
8 2010-5-10 增加手机号码的验证（13开头和158，159开头，共11位）
*************************************************/
Validator = {
Require : /.+/,
Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
Phone : /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/,
//Mobile : /^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$/,
Mobile :/^(13[0-9]{9})|(15[89][0-9]{8})$/,
Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
IdCard : "this.IsIdCard(value)",
Currency : /^\d+(\.\d+)?$/,
Number : /^[-]?\d+$/,
Zip : /^[1-9]\d{5}$/,
QQ : /^[1-9]\d{4,8}$/,
Integer : /^[-\+]?\d+$/,
Double : /^[-\+]?\d+(\.\d+)?$/,
English : /^[A-Za-z]+$/,
Chinese : /^[\u0391-\uFFE5]+$/,
Username : /^[a-z]\w{3,}$/i,
UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
IsSafe : function(str){return !this.UnSafe.test(str);},
SafeString : "this.IsSafe(value)",
Filter : "this.DoFilter(value, getAttribute('accept'))",
Limit : "this.limit(value.length,getAttribute('min'), getAttribute('max'))",
LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
Date : "this.IsDate(value, getAttribute('format'))",
Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
Range : "this.judgeRage(getAttribute('min') , getAttribute('max'), value)",
Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
Custom : "this.Exec(value, getAttribute('regexp'))",
Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
ErrorItem : [document.forms[0]],
ErrorMessage : ["以下原因导致提交失败：\t\t\t\t"],
Validate : function(theForm, mode){
var obj = theForm || event.srcElement;
var count = obj.elements.length;
this.ErrorMessage.length = 1;
this.ErrorItem.length = 1;
this.ErrorItem[0] = obj;
for(var i=0;i<count;i++){
with(obj.elements[i]){
var _dataType = getAttribute("dataType");
if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined") continue;
this.ClearState(obj.elements[i]);
if(getAttribute("require") == "false" && value == "") continue;
if(getAttribute("type") == "text" && value != ""&&value!=undefined&&value!=null)value=this.r_trim(value);
switch(_dataType){
case "IdCard" :
case "Date" :
case "Repeat" :
case "Range" :
case "Compare" :
case "Custom" :
case "Group" : 
case "Limit" :
case "LimitB" :
case "SafeString" :
case "Filter" :
if(!eval(this[_dataType])) {
this.AddError(i, getAttribute("msg"));
}
break;
default :
if(!this[_dataType].test(value)){
this.AddError(i, getAttribute("msg"));
}
break;
}
}
}
if(this.ErrorMessage.length > 1){
mode = mode || 1;
var errCount = this.ErrorItem.length;
switch(mode){
case 4 :
	alert((this.ErrorMessage[1]).substr((this.ErrorMessage[1]).indexOf(":")+1), (this.ErrorMessage[1]).length);
	this.ErrorItem[1].focus();
	break;
case 2 :
for(var i=1;i<errCount;i++)
this.ErrorItem[i].style.color = "red";
case 1 :
alert(this.ErrorMessage.join("\n"));
this.ErrorItem[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.ErrorItem[i].parentNode.appendChild(span);
span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
}
catch(e){alert(e.description);}
}
this.ErrorItem[1].focus();
break;
default :
alert(this.ErrorMessage.join("\n"));
break;
}
return false;
}
return true;
},
limit : function(len,min, max){
min = min || 0;
max = max || Number.MAX_VALUE;
return min <= len && len <= max;
},
LenB : function(str){
return str.replace(/[^\x00-\xff]/g,"**").length;
},
ClearState : function(elem){
with(elem){
if(style.color == "red")
style.color = "";
var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
if(lastNode.id == "__ErrorMessagePanel")
parentNode.removeChild(lastNode);
}
},
AddError : function(index, str){
this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
},
Exec : function(op, reg){
return new RegExp(reg,"g").test(op);
},
compare : function(op1,operator,op2){
switch (operator) {
case "NotEqual":
return (op1 != op2);
case "GreaterThan":
return (op1 > op2);
case "GreaterThanEqual":
return (op1 >= op2);
case "LessThan":
return (op1 < op2);
case "LessThanEqual":
return (op1 <= op2);
default:
return (op1 == op2); 
}
},
MustChecked : function(name, min, max){
var groups = document.getElementsByName(name);
var hasChecked = 0;
min = min || 1;
max = max || groups.length;
for(var i=groups.length-1;i>=0;i--)
if(groups[i].checked) hasChecked++;
return min <= hasChecked && hasChecked <= max;
},
DoFilter : function(input, filter){
return new RegExp("^.+\.(?=EXT)(EXT)$".replace(/EXT/g, filter.split(/\s*,\s*/).join("|")), "gi").test(input);
},
IsIdCard : function(number){
var date, Ai;
var verify = "10x98765432";
var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
var area = ['','','','','','','','','','','','北京','天津','河北','山西','内蒙古','','','','','','辽宁','吉林','黑龙江','','','','','','','','上海','江苏','浙江','安微','福建','江西','山东','','','','河南','湖北','湖南','广东','广西','海南','','','','重庆','四川','贵州','云南','西藏','','','','','','','陕西','甘肃','青海','宁夏','新疆','','','','','','台湾','','','','','','','','','','香港','澳门','','','','','','','','','国外'];
var re = number.match(/^(\d{2})\d{4}(((\d{2})(\d{2})(\d{2})(\d{3}))|((\d{4})(\d{2})(\d{2})(\d{3}[x\d])))$/i);
if(re == null) return false;
if(re[1] >= area.length || area[re[1]] == "") return false;
if(re[2].length == 12){
Ai = number.substr(0, 17);
date = [re[9], re[10], re[11]].join("-");
}
else{
Ai = number.substr(0, 6) + "19" + number.substr(6);
date = ["19" + re[4], re[5], re[6]].join("-");
}
if(!this.IsDate(date, "ymd")) return false;
var sum = 0;
for(var i = 0;i<=16;i++){
sum += Ai.charAt(i) * Wi[i];
}
Ai += verify.charAt(sum%11);
return (number.length ==15 || number.length == 18 && number == Ai);
},
IsDate : function(op, formatString){
formatString = formatString || "yyyy-mm-dd";
var m, year, month, day;
switch(formatString){
case "yyyy-mm-dd" :
m =op.match(new RegExp("^(\\d{4})([-./])(\\d{1,2})([-./])(\\d{1,2})$"));
//alert(m);
if(m == null ) return false;
if(m[5]==31)
{
	 m[5] =(Number(m[5])-1);
}
var d= new Date(m[1], m[3], m[5]); 

year = Number(m[1]);
month= Number(m[3]);
day = Number(m[5]);


 return (year>=1900&&year<=2100&&month<=12&&month>=1&&day && !(isNaN(day)) && day>=1 
 && (month==2?(this.judgeLeapYear(year)?day<=29:day<=28):(this.judgeSmallMonth(month)?day<=30:day<=31)));

break;
case "yyyy-mm" :
m =op.match(new RegExp("^(\\d{4})([-./])(\\d{1,2})$"));
if(m == null ) return false;
var d= new Date(m[1], m[3], 1); 
return (d.getFullYear()==m[1]&&d.getMonth()==m[3]&&d.getDate()==1);
break;
default :
break;
}
},
judgeLeapYear : function (yearStr){
	// 判断闰年。
	if(!(isNaN(yearStr)) && yearStr.toString().length==4 && (yearStr%100==0?yearStr%400==0:yearStr%4==0))
		return true;
	return false;
},
judgeSmallMonth : function (monthStr){
	// 判断小月。
	if(monthStr==4||monthStr==6||monthStr==9||monthStr==11)
		return true;
	return false;
},
judgeRage:function(min,max,value)
{
       //alert("min="+min +"max="+max+"value="+value);
       
      //alert(Number(min)<=Number(value) && Number(max)>=Number(value));
	    if(Number(min)<=Number(value) && Number(max)>=Number(value))
	    {
			return true;
		}
		return false;
},
l_trim:function (str){
    return str;//用户自己故意空格忽略
},
r_trim:function (str){
  var str_length= str.length;
  while(true)
  {
      if (str.charAt(str_length-1)==" ")
      {
          str = str.slice(0,str_length-1);
          str_length   = str.length;
      }
      else{
          break;
      }
  }
   return str;
},
trim:function (str){return r_trim(this.l_trim(str));}
}

WorkFlow=
{
 	_comChg:function (mytab,state,lock)
   {
   	 var objTgt;
   	 var cm_st=state;	  
   	 var us_st;
   	 for(var i=0;i<mytab.all.length;i++)
	 {
	   objTgt = mytab.all.item(i);  
	 
	   if(typeof(objTgt.ignored)!="undefined")
	   {
	   	  continue;
	   }
	   
	   if(typeof(objTgt.mysl)=="undefined")
   	   us_st=cm_st;
   	   else
   	   us_st=objTgt.mysl;
	   switch (objTgt.type){
			   case "button":
				eval("objTgt."+us_st+"="+lock);
			   break;
			   case "submit":
			   	eval("objTgt."+us_st+"="+lock);
			   break;
			   case "checkbox":
			   	eval("objTgt."+us_st+"="+lock);
			   break;
			   case "radio":
			   	eval("objTgt."+us_st+"="+lock);
			   break;
			   case "text":
			    eval("objTgt."+us_st+"="+lock);
			   break;
			   case "radio":
			   eval("objTgt."+us_st+"="+lock);
			   break;
			   default:
			   if (objTgt.tagName.toUpperCase()=="SELECT")
			   eval("objTgt."+us_st+"="+lock);
			   else if(objTgt.tagName.toUpperCase()=="TEXTAREA")
			   eval("objTgt."+us_st+"="+lock);
			   break;}
		
	 }
   },
   lockOrUnlock:function(c_obj,c_mode,c_lockKey)
   {

   	  if(c_mode==1)
   	  {
   	 		this._comChg(c_obj,"disabled",c_lockKey)
   	  }
   	  else
   	  {
   	  	   this._comChg(c_obj,"readOnly",c_lockKey);
   	  }
   }
}

Jscomm =
{
l_trim:function (str){
  //删除字符串左边的空格
  if (str.charAt(0)==" "){
    str = str.slice(1);
    str = l_trim(str);
  }
  return str;
},
r_trim:function (str){
//删除字符串右边的空格
  var str_length;
  str_length = str.length;
  if (str.charAt(str_length-1)==" "){
    str = str.slice(0,str_length-1);
    str = r_trim(str)
  }
  return str;
},
trim:function (str){
//删除字符串左右2边的空格
  return this.r_trim(this.l_trim(str));
},
isNotNull:function (fieldname,formObj){
  formObj.value=trim(formObj.value);
  if (formObj.value == "") {
    alert(fieldname+"不能为空！");
    formObj.focus();
    return false;
  }else{
    return true;
  }
},
isNotSelect:function (fieldname,formObj){
//判断单项目是否未选择
  formObj.value=trim(formObj.value);
  if (formObj.value == "") {
    alert("请选择"+fieldname+"！");
    formObj.focus();
    return false;
  }else{
    return true;
  }
},
isNumNoNull:function (fieldname,string){
//是否未数字类型
  str=trim(string.value);
  if (str=="" || isNaN(str)==true) {
    alert(fieldname + "必须为半角数字！");
    string.focus();
    return false;
  }else
    return true;
}
}


//-----------------------------公共方法以后抽象 用于表格自生成---------------------------------
	function getTr(obj)
 	{
			//alert(obj.tagName);
		 	if(obj.tagName=="tr"||obj.tagName=="TR")
			{
				return obj;
			}
			else
			{
				var tmpobj = obj.parentElement;		
				if(tmpobj=="undefined"||tmpobj==null)
				{
					tmpobj = obj.parentNode;//兼容FIREFOX
				}
				return getTr(tmpobj);
			}
 	}

	  function getTableRowIdByEvent(tabname)
	  {
	  	 var myTr =getTr(event.srcElement);
	  	 return myTr.indexId;
	  }


	  function getTableLastRowId(tabname)
	  {
	  	 var myTab = window.document.getElementById(tabname);
	  	 if(myTab.rows.length==1)
		 {
		 	return 0;
		 }
		 var myRow = myTab.rows[myTab.rows.length-1];
		 if(myRow.indexId==undefined)
		 {
		 	myRow.indexId=0;
		 }
		 return Number(myRow.indexId);
	  }


	 function getTableNextRowId(tabname)
	 {
		 return  Number(getTableLastRowId(tabname))+ Number(1);
	 }
	//-----------------------------公共方法以后抽象---------------------------------

    //下拉或者 其他点点截面抽象

var left = 0;
var top = 0;
var width = 0;
var height = 0;
var tableWidth = 0;
var sign=true;
var showsign=true;
var obj;
var type;
var bool;
var offsetX = 7;
var offsetY = 17;

function _showSelect(p_selname,p_ctrlname,p_width,p_height){
	obj = $(p_selname);
	if(obj.style.display == ""){
		obj.style.display = "none";
		document.body.focus();
		return;
	}
	bool = true;
	type = p_selname;
    var txtObj =  $(p_ctrlname);
	var txtwid  = txtObj.clientWidth;
   	var x=event.clientX-event.offsetX-txtwid;
   	var y=event.clientY-event.offsetY;

	left = x - offsetX;
	width = p_width;
	height = p_height;
	tableWidth = width - offsetY;

	obj.style.left=left;
		//在这里判断是否向上翻还是向下翻

	 var opp = ((500-event.y)-height);
	 if(opp<0)
	 {
	 	//向上显示
		 obj.style.top=event.clientY-event.offsetY-height-2;

		top =event.clientY-event.offsetY-height-2;
	 }
	 else
	 {
	 	    //向下显示
	   obj.style.top=y+offsetY;
	   top =y+offsetY;
	 }

	obj.style.width = width;
	obj.style.height = height;
	obj.style.display="";
}

function move(row){
	row.style.backgroundColor='#0055AA';
	row.style.color='#ffffff';
}
function out(row){
	row.style.backgroundColor='#ffffff';
	row.style.color='';
}

function cmpDate(begin,over)
{
		  var ass,aD,aS;
          var bss,bD,bS;
		  ass=begin.split("-");         //以"-"分割字符串，返回数组；
          aD=new Date(ass[0],ass[1],ass[2]);   //格式化为Date对像;
          aS=aD.getTime(); //得到从 1970 年 1 月 1 日开始计算到 Date 对象中的时间之间的毫秒数

          bss=over.split("-");
          bD=new Date(bss[0],bss[1],bss[2]);
          bS=bD.getTime();
           if(aS>bS){
            	return true;
			}
			return false;
}

	/***
	*用于检查 增加KM 日期 
	*检查结束日期是否比开始日期小
	*/
	function compareTextDate(startTime,endTime)
    {	
			var startTime = startTime.replace(/-/g, "/");
			var  endTime = endTime.replace(/-/g, "/");
			startTime = new Date(startTime);
			endTime = new Date(endTime);
			//alert( startTime.getTime());
			if(endTime.getTime() - startTime.getTime()>=0) 
			{
			return true;}
			else {return false;}
    }



