function CLASS_CHECK(){
 this.pass  = true;  
 this.showAll = true;  
 this.alert  = false; 
 this.message = "";  

 this.first  = null;  
 this.cancel  = false; 

 

 var aUsage = {
  "int":"^([+-]?)//d+$",           //整数
  "int+":"^([+]?)//d+$",           //正整数
  "int-":"^-//d+$",            //负整数
  "num":"^([+-]?)//d*//.?//d+$",         //数字
  "num+":"^([+]?)//d*//.?//d+$",         //正数
  "num-":"^-//d*//.?//d+$",          //负数
  "float":"^([+-]?)//d*//.//d+$",         //浮点数
  "float+":"^([+]?)//d*//.//d+$",         //正浮点数
  "float-":"^-//d*//.//d+$",          //负浮点数
                  //邮件
  "email":"^//w+((-//w+)|(//.//w+))*//@[A-Za-z0-9]+((//.|-)[A-Za-z0-9]+)*//.

[A-Za-z0-9]+$", 
  "color":"^#[a-fA-F0-9]{6}",          //颜色
  "url":"^http[s]?://([//w-]+//.)+[//w-]+([//w-./?%&=]*)?$", //联接
  "chinese":"^[//u4E00-//u9FA5//uF900-//uFA2D]+$",    //仅中文
  "ascii":"^[//x00-//xFF]+$",          //仅ACSII字符
  "zipcode":"^//d{6}$",           //邮编
  "mobile":"^0{0,1}13[0-9]{9}$",         //手机
  "ip4":"^/(([0-1]?//d{0,2})|(2[0-5]{0,2}))//.(([0-1]?//d{0,2})|(2[0-5]

{0,2}))//.(([0-1]?//d{0,2})|(2[0-5]{0,2}))//.(([0-1]?//d{0,2})|(2[0-5]

{0,2}))$",    //ip地址
  "notempty":"^[^ ]+$",           //非空
  "picture":"(.*)//.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$", //图片
  "rar":"(.*)//.(rar|zip|7zip|tgz)$",        //压缩文件
  "date":"^//d{4}(//-|///|/.)//d{1,2}//1//d{1,2}$"        //日期
 };

 //缺省消息
 var aMessage = {
  "int" :"请输入整数",           //整数
  "int+" :"请输入正整数",           //正整数
  "int-" :"请输入负整数",           //负整数
  "num" :"请输入数字",           //数字
  "num+" :"请输入正数",           //正数
  "num-" :"请输入负整数",           //负数
  "float" :"请输入浮点数",           //浮点数
  "float+":"请输入正浮点数",          //正浮点数
  "float-":"请输入负浮点数",          //负浮点数
  "email" :"请输入正确的邮箱地址",         //邮件
  "color" :"请输入正确的颜色",          //颜色
  "url" :"请输入正确的连接地址",         //联接
  "chinese":"请输入中文",           //中文
  "ascii" :"请输入ascii字符",          //仅ACSII字符
  "zipcode":"请输入正确的邮政编码",         //邮编
  "mobile":"请输入正确的手机号码",         //手机
  "ip4" :"请输入正确的IP地址",          //ip地址
  "notempty":"不能为空",           //非空
  "picture":"请选择图片",           //图片
  "rar" :"请输入压缩文件",          //压缩文件
  "date" :"请输入正确的日期"          //日期
 }

 var me = this;

 me.checkForm = function(oForm){
  me.pass  = true;
  me.message = "";
  me.first = null;
  
  if(me.cancel==true){
   return true;
  }
  
  var els = oForm.elements;
  //遍历所有表元素
  for(var i=0;i<els.length;i++){
   //取得格式
   var sUsage = els[i].getAttribute("Usage"); 
   var sReg = "";
   
   //如果设置Usage,则使用内置正则表达式,忽略Exp
   if(typeof(sUsage)!="undefined"&&sUsage!=null){
    //如果Usage在表达室里找到,则使用内置表达式,无则认为是表达式;表达式可以

是函数;
    if(aUsage[sUsage]!=null){   
     sReg = aUsage[sUsage];
    } else {
     try {
      if(eval(sUsage)==false){ 
       me.pass  = false;
       if(me.first==null){
        me.first = els[i];
       }

       addMessage(getMessage(els[i]));       

       if(me.showAll==false){
        setFocus(els[i]);
        break;
       }
      }
     } catch(e){ 
      alert("表达式[" + sUsage +"]错误:" + e.description)
      return false;
     }
    }
   } else {   
    sReg = els[i].getAttribute("Exp");
   }

   if(typeof(sReg)!="undefined"&&sReg!=null){
    //对于失效状态不验证
    if(isDisabled(els[i])==true){
     continue;
    }

    //取得表单的值,用通用取值函数
    var sVal = getValue(els[i]);
    //字符串->正则表达式,不区分大小写
    var reg = new RegExp(sReg,"i");
    if(!reg.test(sVal)){
     me.pass  = false;
     if(me.first==null){
      me.first = els[i];
     }

     //alert(reg);
     //验证不通过,弹出提示warning
     var sTip = getMessage(els[i]);
     if(sTip.length==0&&typeof(sUsage)!="undefined"&&sUsage!=null&&aMessage

[sUsage]!=null){
      sTip = aMessage[sUsage];
     }
     addMessage(sTip);

     if(me.showAll==false){
      //该表单元素取得焦点,用通用返回函数
      setFocus(els[i]);
      break;
     }
    }
   }        
  }

  if(me.pass==false){
   showMessage();

   if(me.first!=null&&me.showAll==true){
    setFocus(me.first);
   }
  }

  return me.pass;
 }

 /*
  * 添加错误信息
  */
 function addMessage(msg){
  if(me.alert==true){
   me.message += msg + "/n";
  } else {
   me.message += msg + "<br>";
  }
 }

 /*
  * 显示错误
  */
 function getMessage(els){
  var sTip = els.getAttribute("tip");
  if(typeof(sTip)!="undefined"&&sTip!=null){
   return sTip;
  } else {
   return "";
  }
 }


 /*
  * 显示错误
  */
 function showMessage(){
  //外接显示错误函数
  if(typeof(me.showMessageEx)=="function"){
   return me.showMessageEx(me.message);
  }

  if(me.alert==true){
   alert(me.message);
  } else {
   var divTip;
    divTip = document.getElementById("divErrorMessage");
   try {
    if(typeof(divTip)=="undefined"||divTip==null){
      divTip = document.createElement("div");
      divTip.id   = "divErrorMessage";
      divTip.name   = "divErrorMessage";
      divTip.style.color = "red";
      document.body.appendChild(divTip);
    }

    divTip.innerHTML = me.message;
   }catch(e){}
  }
 }

 /*
  * 获得元素是否失效(失效的元素不做判断)
  */
 function isDisabled(el){
  //对于radio,checkbox元素,只要其中有一个非失效元素就验证
  if(el.type=="radio"||el.type=="checkbox"){
   //取得第一个元素的name,搜索这个元素组
   var tmpels = document.getElementsByName(el.name);
   for(var i=0;i<tmpels.length;i++){
    if(tmpels[i].disabled==false){
     return false;
    }
   }
   return true;
  }else{
   return el.disabled;
  }
 }


 /*
  * 取得对象的值(对于单选多选框把其选择的个数作为需要验证的值)
  */
 function getValue(el){
  //取得表单元素的类型
  var sType = el.type;
  switch(sType){
   //文本输入框,直接取值el.value
   case "text":
   case "hidden":
   case "password":
   case "file":
   case "textarea": return el.value;
   //单多下拉菜单,遍历所有选项取得被选中的个数返回结果"0"表示选中一个,"00"表

示选中两个
   case "checkbox":
   case "radio": return getRadioValue(el);
   case "select-one":
   case "select-multiple": return getSelectValue(el);
  }
  //取得radio,checkbox的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通

过0{1,}来表示选中个数
  function getRadioValue(el){
   var sValue = "";
   //取得第一个元素的name,搜索这个元素组
   var tmpels = document.getElementsByName(el.name);
   for(var i=0;i<tmpels.length;i++){
    if(tmpels[i].checked){
     sValue += "0";
    }
   }
   return sValue;
  }
  //取得select的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通过0{1,}

来表示选中个数
  function getSelectValue(el){
   var sValue = "";
   for(var i=0;i<el.options.length;i++){
    //单选下拉框提示选项设置为value=""
    if(el.options[i].selected && el.options[i].value!=""){
     sValue += "0";
    }
   }
   return sValue;
  }
 }

 /*
  * 对没有通过验证的元素设置焦点
  */
 function setFocus(el){
  //取得表单元素的类型
  var sType = el.type;
  switch(sType){
   //文本输入框,光标定位在文本输入框的末尾
   case "text":
   case "hidden":
   case "password":
   case "file":
   case "textarea": 
    try{el.focus();var rng = el.createTextRange(); rng.collapse(false); 

rng.select();}catch(e){};
    break;
   
   //单多选,第一选项非失效控件取得焦点
   case "checkbox":
   case "radio": 
    var els = document.getElementsByName(el.name);
    for(var i=0;i<els.length;i++){
     if(els[i].disabled == false){
      els[i].focus();
      break;
     }
    }
    break;
   case "select-one":
   case "select-multiple":
    el.focus();
    break;
  }
 }

 
 //自动绑定到所有form的onsubmit事件
 if(window.attachEvent){
  window.attachEvent("onload",function()
         {
          for(var i=0;i<document.forms.length;i++){
           var theFrom = document.forms[i]; 
            function mapping(f){ 
             f.attachEvent("onsubmit",function(){return me.checkForm(f);}); 
            } 

            if(theFrom){
             mapping(theFrom); 
             theFrom.attachEvent("onclick",function(){
                        var o = event.srcElement;
                        if(typeof(o.type)!="undefined"){
                         var check = o.getAttribute("check");
                         if(typeof(check)!="undefined"&&check!

=null&&check.toLowerCase()=="false"){
                          me.cancel = true;
                         }                         
                        }
                       }
                  ); 
            }
          }
         }
       );
  
 }
 else
 {
  window.onsubmit = function(e){var theFrom = e.target;if(theFrom){return 

me.checkForm(theFrom);}}
  window.addEventListener("click",function(e){var o = e.target;
             if(typeof(o.type)!="undefined"){
              var check = o.getAttribute("check");
              if(typeof(check)!="undefined"&&check!=null&&check.toLowerCase

()=="false"){me.cancel = true;}                         
              }
             }
        ,false);
  
 }

 this.keyCheck = function(){
  if(window.attachEvent){
   window.attachEvent("onload",function(){for(var 

i=0;i<document.forms.length;i++){var theFrom = document.forms[i]; if

(theFrom){myKeyCheck(theFrom);}}});
  }else{   
   window.addEventListener("load",function(e){for(var 

i=0;i<document.forms.length;i++){var theFrom = document.forms[i]; if

(theFrom){myKeyCheck(theFrom);}}},false);
  }

  function myKeyCheck(oForm){
   var els = oForm.elements;
   //遍历所有表元素
   for(var i=0;i<els.length;i++){
    //取得格式
    var sUsage = els[i].getAttribute("Usage"); 
    
    //如果设置Usage,则使用内置正则表达式,忽略Exp
    if(typeof(sUsage)!="undefined"&&sUsage!=null){
     switch(sUsage.toLowerCase ()){
      case "zipcode":
      case "int":
       els[i].onkeypress = function(e){var chr;if(e)chr=e.charCode; else 

chr=window.event.keyCode;if(chr==0)return true; else return //d/.test

(String.fromCharCode(chr))||(this.value.indexOf('+')<0?String.fromCharCode

(chr)=="+":false)||(this.value.indexOf('-')<0?String.fromCharCode(chr)

=="-":false);}
       els[i].onpaste  = function(e){if(e==null)return !

clipboardData.getData('text').match(//D/); else return false;}
       els[i].ondragenter = function(e){return false;}
       els[i].style.imeMode= "disabled";
       break;
      case "mobile":
      case "int+":
       els[i].onkeypress = function(e){var chr;if(e)chr=e.charCode; else 

chr=window.event.keyCode;if(chr==0)return true; else return //d/.test

(String.fromCharCode(chr))||(this.value.indexOf('+')<0?String.fromCharCode

(chr)=="+":false);}
       els[i].onpaste  = function(e){if(e==null)if(e==null)return !

clipboardData.getData('text').match(/[^/d/+]/); else return false; else 

return false;}
       els[i].ondragenter = function(e){return false;}
       els[i].style.imeMode= "disabled";
       break;
      case "int-":
       els[i].onkeypress = function(e){var chr;if(e)chr=e.charCode; else 

chr=window.event.keyCode;if(chr==0)return true; else return //d/.test

(String.fromCharCode(chr))||(this.value.indexOf('-')<0?String.fromCharCode

(chr)=="-":false);}     
       els[i].onpaste  = function(e){if(e==null)return !

clipboardData.getData('text').match(/[^/d/-]/); else return false;}
       els[i].ondragenter = function(e){return false;}
       els[i].style.imeMode= "disabled";
       break;
      case "float":
      case "num":
       els[i].onkeypress = function(e){var chr;if(e)chr=e.charCode; else 

chr=window.event.keyCode;if(chr==0)return true; else return /[/+/-/.]

|/d/.test(String.fromCharCode(chr));}     
       els[i].onpaste  = function(e){if(e==null)return !

clipboardData.getData('text').match(/[^/d/./+/-]/); else return false;}
       els[i].ondragenter = function(e){return false;}
       els[i].style.imeMode= "disabled";
       break;
      case "float+":
      case "num+":
       els[i].onkeypress = function(e){var chr;if(e)chr=e.charCode; else 

chr=window.event.keyCode;if(chr==0)return true; else return /[/+/.]|/d/.test

(String.fromCharCode(chr));}     
       els[i].onpaste  = function(e){if(e==null)return !

clipboardData.getData('text').match(/[^/d/./+]/); else return false;}
       els[i].ondragenter = function(e){return false;}
       els[i].style.imeMode= "disabled";
       break;
      case "float-":
      case "num-":
       els[i].onkeypress = function(e){var chr;if(e)chr=e.charCode; else 

chr=window.event.keyCode;if(chr==0)return true; else return /[/-/.]|/d/.test

(String.fromCharCode(chr));}     
       els[i].onpaste  = function(e){if(e==null)return !

clipboardData.getData('text').match(/[^/d/./-]/); else return false;}
       els[i].ondragenter = function(e){return false;}
       els[i].style.imeMode= "disabled";
       break;
      case "ascii":
       els[i].style.imeMode= "disabled";
       break;
      case "ip4":
       els[i].onkeypress = function(e){var chr;if(e)chr=e.charCode; else 

chr=window.event.keyCode;if(chr==0)return true; else return /[/.]|/d/.test

(String.fromCharCode(chr));}     
       els[i].onpaste  = function(e){if(e==null)return !

clipboardData.getData('text').match(/[^/d/.]/); else return false;}
       els[i].ondragenter = function(e){return false;}
       els[i].style.imeMode= "disabled";
       els[i].maxLength = 15;
       break;
      case "color":
       els[i].onkeypress = function(e){var chr;if(e)chr=e.charCode; else 

chr=window.event.keyCode;if(chr==0)return true; else return /[a-fA-Z]

|/d/.test(String.fromCharCode(chr))||(this.value.indexOf('#')<0?

String.fromCharCode(chr)=="#":false);}     
       els[i].onpaste  = function(e){if(e==null)return !

clipboardData.getData('text').match(/[^/d/#]/); else return false;}
       els[i].ondragenter = function(e){return false;}
       els[i].maxLength = 7;
       els[i].style.imeMode= "disabled";
       break;
      case "date":
       els[i].onkeypress = function(e){var chr;if(e)chr=e.charCode; else 

chr=window.event.keyCode;if(chr==0)return true; else return /[///-/.]

|/d/.test(String.fromCharCode(chr));}     
       els[i].onpaste  = function(e){if(e==null)return !

clipboardData.getData('text').match(/[^/d/./-]/); else return false;}
       els[i].ondragenter = function(e){return false;}
       els[i].style.imeMode= "disabled";
       break;       
     }
    }
   }
  }
 }

}

//初始化
var g_check = new CLASS_CHECK();
 g_check.keyCheck();