/* Jquery janchie 2010.1 1.02版 */ var validResult = {}; var errorMsg = {}; (function ($) { $.fn.extend({ valid: function () { if (!$(this).is("form")) return; var items = $.isArray(arguments[0]) ? arguments[0] : [], isBindSubmit = typeof arguments[1] === "boolean" ? arguments[1] : true, isAlert = typeof arguments[2] === "boolean" ? arguments[2] : false, rule = { "eng": /^[A-Za-z]+$/, "chn": /^[\u0391-\uFFE5]+$/, "mail": /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/, "url": /^http[s]?:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/, "currency": /^\d+(\.\d+)?$/, "number": /^\d+$/, "int": /^[0-9]{1,30}$/, "double": /^[-\+]?\d+(\.\d+)?$/, "username": /^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){3,19}$/, "password": /^[\w\W]{6,20}$/, "safe": />|<|,|\[|\]|\{|\}|\?|\/|\+|=|\||\'|\\|\"|:|;|\~|\!|\@|\#|\*|\$|\%|\^|\&|\(|\)|`/i, "dbc": /[a-zA-Z0-9!@#¥%^&*()_+{}[]|:"';.,/?<>`~ ]/, "qq": /[1-9][0-9]{4,}/, "date": /^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$/, "year": /^(19|20)[0-9]{2}$/, "month": /^(0?[1-9]|1[0-2])$/, "day": /^((0?[1-9])|((1|2)[0-9])|30|31)$/, "hour": /^((0?[1-9])|((1|2)[0-3]))$/, "minute": /^((0?[1-9])|((1|5)[0-9]))$/, "second": /^((0?[1-9])|((1|5)[0-9]))$/, "mobile": /^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$/, "phone": /^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/, "zipcode": /^[1-9]\d{5}$/, "IDcard": /^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\d{4}((19\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d{2}(0[13578]|1[02])31)|(19\d{2}02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))\d{3}(\d|X|x)?$/, "ip": /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/, "file": /^[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/, "image": /.+\.(jpg|gif|png|bmp)$/i, "word": /.+\.(doc|rtf|pdf)$/i, "port": function (port) { return (!isNaN(port) && port > 0 && port < 65536) ? true : false; }, "eq": function (arg1, arg2) { return arg1 == arg2 ? true : false; }, "gt": function (arg1, arg2) { return arg1 > arg2 ? true : false; }, "gte": function (arg1, arg2) { return arg1 >= arg2 ? true : false; }, "lt": function (arg1, arg2) { return arg1 < arg2 ? true : false; }, "lte": function (arg1, arg2) { return arg1 <= arg2 ? true : false; } }, msgSuffix = { "eng": "only english welcomed", "chn": "only chinese welcomed", "mail": "invalid email format", "url": "invalid url format", "currency": "invalid number format", "number": "only number welcomed", "int": "only integer welcomed", "double": "only float welcomed", "username": "invalid username format,4-20 characters", "password": "warning, you'd better use 6-20 characters", "safe": "forbidden special characters", "dbc": "forbidden full width characters", "qq": "invalid qq format", "date": "invalid date format", "year": "invalid year format", "month": "invalid month format", "day": "invalid day format", "hour": "invalid hour format", "minute": "invalid minute format", "second": "invalid second format", "mobile": "invalid mobile format", "phone": "invalid phone format", "zipcode": "invalid zipcode format", "IDcard": "invalid identity format", "ip": "invalid ip format", "port": "invalid port format", "file": "invalid file format", "image": "invalid image format", "word": "invalid word file format", "eq": "not equal", "gt": "no greater than", "gte": "no greater than or equal", "lt": "no smaller than", "lte": "no smaller than or equal" }, msg = "", formObj = $(this), checkRet = true, isAll, tipname = function (namestr) { return "tip_" + namestr.replace(/([a-zA-Z0-9])/g, "-$1"); }, typeTest = function () { var result = true, args = arguments; if (rule.hasOwnProperty(args[0])) { var t = rule[args[0]], v = args[1]; result = args.length > 2 ? t.apply(arguments, [].slice.call(args, 1)) : ($.isFunction(t) ? t(v) : t.test(v)); } return result; }, showError = function (fieldObj, filedName, warnInfo) { checkRet = false; var tipObj = $("#" + tipname(filedName)); if (tipObj.length > 0) tipObj.remove(); var tipPosition = fieldObj.next().length > 0 ? fieldObj.nextAll().eq(this.length - 1) : fieldObj.eq(this.length - 1); //tipPosition.after(" " + warnInfo + " "); validResult[filedName] = false; errorMsg[filedName] = warnInfo; if (isAlert && isAll) msg = warnInfo; }, showRight = function (fieldObj, filedName) { var tipObj = $("#" + tipname(filedName)); if (tipObj.length > 0) tipObj.remove(); var tipPosition = fieldObj.next().length > 0 ? fieldObj.nextAll().eq(this.length - 1) : fieldObj.eq(this.length - 1); //tipPosition.after("correct"); validResult[filedName] = true; }, findTo = function (objName) { var find; $.each(items, function () { if (this.name == objName && this.simple) { find = this.simple; return false; } }); if (!find) find = $("[name='" + objName + "']")[0].name; return find; }, fieldCheck = function (item) { var i = item, field = $("[name='" + i.name + "']", formObj[0]); if (!field[0]) return; var warnMsg, fv = $.trim(field.val()), isRq = typeof i.require === "boolean" ? i.require : true; if (isRq && ((field.is(":radio") || field.is(":checkbox")) && !field.is(":checked"))) { warnMsg = i.message || "choice needed"; showError(field, i.name, warnMsg); } else if (isRq && fv == "") { warnMsg = i.message || ( field.is("select") ? "choice needed" : "not none" ); showError(field, i.name, warnMsg); } else if (fv != "") { if (i.min || i.max) { var len = fv.length, min = i.min || 0, max = i.max; warnMsg = i.message || (max ? "range" + min + "~" + max + "" : "min length" + min); if ((max && (len > max || len < min)) || (!max && len < min)) { showError(field, i.name, warnMsg); return; } } if (i.type) { var matchVal = i.to ? $.trim($("[name='" + i.to + "']").val()) : i.value; var matchRet = matchVal ? typeTest(i.type, fv, matchVal) : typeTest(i.type, fv); warnMsg = i.message || msgSuffix[i.type]; if (matchVal) warnMsg += (i.to ? findTo(i.to) + "value" : i.value); if (!matchRet) showError(field, i.name, warnMsg); else showRight(field, i.name); } else { showRight(field, i.name); } } else if (isRq) { showRight(field, i.name); } }, validate = function () { $.each(items, function () { isAll = true; fieldCheck(this); }); if (isAlert && msg != "") { alert(msg); msg = ""; } return checkRet; }; $.each(items, function () { var field = $("[name='" + this.name + "']", formObj[0]); if (field.is(":hidden")) return; var obj = this, toCheck = function () { isAll = false; fieldCheck(obj); }; if (field.is(":file") || field.is("select")) { field.change(toCheck); } else { field.blur(toCheck); } }); if (isBindSubmit) { $(this).submit(validate); } else { return validate(); } } }); })(jQuery);