/************************************************* validator v1.05 code by 我佛山人 wfsr@msn.com *************************************************/ 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}\-))?1(3|5|7|8)\d{9}$/, //gavin修改,增加15、18开头的手机验证 url : /^http:\/\/[a-za-z0-9]+\.[a-za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/, idcard : "this.isidcard(value)", currency : /^\d+(\.\d+)?$/, number : /^\d+$/, zip : /^\d{6}$/, //gavin修改,邮编首位可以为0 qq : /^[1-9]\d{4,11}$/, //gavin修改,qq位数扩展到11位 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('min'), getattribute('format'))", repeat : "value == document.getelementsbyname(getattribute('to'))[0].value", range : "getattribute('min') < (value|0) && (value|0) < getattribute('max')", 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"); //-------------gavin修改,增加新属性allowhtml,msghtml,设置是否允许提交html代码 this.clearstate(obj.elements[i]); if(_datatype == null) { if(getattribute("allowhtml") == "1" && (new regexp(/^(((\n)|(.))*)<(((\n)|(.))*)>(((\n)|(.))*)$/)).test(value)) { this.adderror(i, getattribute("msghtml")); } } //-------------gavin修改结束 if(typeof(_datatype) == "object" || typeof(this[_datatype]) == "undefined") continue; //this.clearstate(obj.elements[i]); if(getattribute("require") == "false" && value == "") continue; 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")); } else //gavin修改,增加新属性allowhtml,msghtml,设置是否允许提交html代码 { if (getattribute("allowhtml") == "1" && (new regexp(/^(((\n)|(.))*)<(((\n)|(.))*)>(((\n)|(.))*)$/)).test(value)) { this.adderror(i, getattribute("msghtml")); } } break; } } } if (this.errormessage.length > 1) { mode = mode || 1; var errcount = this.erroritem.length; switch (mode) { 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; if (max == 0) //gavin修改,最大值为0时不限制最大值 { return min <= len; } else { 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 || "ymd"; var m, year, month, day; switch (formatstring) { case "ymd" : m = op.match(new regexp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$")); if (m == null ) return false; day = m[6]; month = m[5]*1; year = (m[2].length == 4) ? m[2] : getfullyear(parseint(m[3], 10)); break; case "dmy" : m = op.match(new regexp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$")); if (m == null) return false; day = m[1]; month = m[3]*1; year = (m[5].length == 4) ? m[5] : getfullyear(parseint(m[6], 10)); break; default : break; } if (!parseint(month)) return false; month = month == 0 ? 12 : month; var date = new date(year, month-1, day); return (typeof(date) == "object" && year == date.getfullyear() && month == (date.getmonth()+1) && day == date.getdate()); function getfullyear(y) { return ((y < 30 ? "20" : "19") + y) | 0; } } }