//=============================================
// [插件名称] jQuery formValidator
// [作者网名] 猫冬	
// [邮    箱] wzmaodong@126.com
// [作者博客] http://wzmaodong.cnblogs.com
// [更新日期] 2008-01-24
// [版 本 号] ver3.3
// [修改记录] PHPCMS团队修正用于JQUERY 1.4
//=============================================
var jQuery_formValidator_initConfig;
(function($) {
    $.formValidator = {
        sustainType : function(id, setting) {
            var elem = $("#" + id).get(0);
            var srcTag = elem.tagName;
            var stype = elem.type;
            switch (setting.validatetype) {
                case "InitValidator":
                    return true;
                case "InputValidator":
                    if (srcTag == "INPUT" || srcTag == "TEXTAREA"
                        || srcTag == "SELECT") {
                        return true
                    } else {
                        return false
                    }
                case "CompareValidator":
                    if (srcTag == "INPUT" || srcTag == "TEXTAREA") {
                        if (stype == "checkbox" || stype == "radio") {
                            return false
                        } else {
                            return true
                        }
                    }
                    return false;
                case "AjaxValidator":
                    if (stype == "text" || stype == "textarea" || stype == "file"
                        || stype == "password" || stype == "select-one") {
                        return true
                    } else {
                        return false
                    }
                case "RegexValidator":
                    if (srcTag == "INPUT" || srcTag == "TEXTAREA") {
                        if (stype == "checkbox" || stype == "radio") {
                            return false
                        } else {
                            return true
                        }
                    }
                    return false;
                case "FunctionValidator":
                    return true
            }
        },
        initConfig : function(controlOptions) {
            var settings = {
                debug : false,
                validatorgroup : "1",
                alertmessage : false,
                validobjectids : "",
                forcevalid : false,
                onsuccess : function() {
                    return true
                },
                onerror : function() {
                },
                submitonce : false,
                formid : "",
                autotip : false,
                tidymode : false,
                errorfocus : true,
                wideword : true
            };
            controlOptions = controlOptions || {};
            $.extend(settings, controlOptions);
            if (settings.tidymode) {
                settings.errorfocus = false
            }
            ;
            if (settings.formid != "") {
                $("#" + settings.formid).submit(function() {
                    return $.formValidator.pageIsValid("1")
                })
            }
            ;
            if (jQuery_formValidator_initConfig == null) {
                jQuery_formValidator_initConfig = new Array()
            }
			//console.log(settings);
            jQuery_formValidator_initConfig.push(settings)
        },
        appendValid : function(id, setting) {
            if (!$.formValidator.sustainType(id, setting))
                return -1;
            var srcjo = $("#" + id).get(0);
            if (setting.validatetype == "InitValidator"
                || srcjo.settings == undefined) {
                srcjo.settings = new Array()
            }
            var len = srcjo.settings.push(setting);
            srcjo.settings[len - 1].index = len - 1;
            return len - 1
        },
        getInitConfig : function(validatorgroup) {
            if (jQuery_formValidator_initConfig != null) {
                for (i = 0; i < jQuery_formValidator_initConfig.length; i++) {
                    if (validatorgroup == jQuery_formValidator_initConfig[i].validatorgroup) {
                        return jQuery_formValidator_initConfig[i]
                    }
                }
            }
            return null
        },
        triggerValidate : function(returnObj) {
            switch (returnObj.setting.validatetype) {
                case "InputValidator":
                    $.formValidator.inputValid(returnObj);
                    break;
                case "CompareValidator":
                    $.formValidator.compareValid(returnObj);
                    break;
                case "AjaxValidator":
                    $.formValidator.ajaxValid(returnObj);
                    break;
                case "RegexValidator":
                    $.formValidator.regexValid(returnObj);
                    break;
                case "FunctionValidator":
                    $.formValidator.functionValid(returnObj);
                    break
            }
        },
        setTipState : function(elem, showclass, showmsg) {
            var setting0 = elem.settings[0];
            var initConfig = $.formValidator
            .getInitConfig(setting0.validatorgroup);
            var tip = $("#" + setting0.tipid);
            if (showmsg == null || showmsg == "") {
                tip.hide()
            } else {
                if (initConfig.tidymode) {
                    $("#fv_content").html(showmsg);
                    elem.Tooltip = showmsg;
                    if (showclass != "onError") {
                        tip.hide()
                    }
                }
                tip.removeClass();
                tip.addClass(showclass);
                tip.html(showmsg)
            }
        },
        resetTipState : function(validatorgroup) {
            var initConfig = $.formValidator.getInitConfig(validatorgroup);
            $(initConfig.validobjectids).each(
                function() {
                    $.formValidator.setTipState(this, "onShow",
                        this.settings[0].onshow)
                })
        },
        setFailState : function(tipid, showmsg) {
            var tip = $("#" + tipid);
            tip.removeClass();
            tip.addClass("onError");
            tip.html(showmsg)
        },
        showMessage : function(returnObj) {
            var id = returnObj.id;
            var elem = $("#" + id).get(0);
            var isvalid = returnObj.isvalid;
            var setting = returnObj.setting;
            var showmsg = "", showclass = "";
            var settings = $("#" + id).get(0).settings;
            var intiConfig = $.formValidator
            .getInitConfig(settings[0].validatorgroup);
            if (!isvalid) {
                showclass = "onError";
                if (setting.validatetype == "AjaxValidator") {
                    if (setting.lastValid == "") {
                        showclass = "onLoad";
                        showmsg = setting.onwait
                    } else {
                        showmsg = setting.onerror
                    }
                } else {
                    showmsg = (returnObj.errormsg == "" ? setting.onerror
                        : returnObj.errormsg)
                }
                if (intiConfig.alertmessage) {
                    var elem = $("#" + id).get(0);
                    if (elem.validoldvalue != $(elem).val()) {
                        alert(showmsg)
                    }
                } else {
                    $.formValidator.setTipState(elem, showclass, showmsg)
                }
            } else {
                showmsg = $.formValidator.isEmpty(id) ? setting.onempty
                : setting.oncorrect;
                $.formValidator.setTipState(elem, "onCorrect", showmsg)
            }
            return showmsg
        },
        showAjaxMessage : function(returnObj) {
            var setting = returnObj.setting;
            var elem = $("#" + returnObj.id).get(0);
            if ((elem.settings[returnObj.ajax].cached ? elem.validoldvalue != $(
                elem).val()
                : true)) {
                $.formValidator.ajaxValid(returnObj)
            } else {
                if (setting.isvalid != undefined && !setting.isvalid) {
                    elem.lastshowclass = "onError";
                    elem.lastshowmsg = setting.onerror
                }
                $.formValidator.setTipState(elem, elem.lastshowclass,
                    elem.lastshowmsg)
            }
        },
        getLength : function(id) {
            var srcjo = $("#" + id);
            var elem = srcjo.get(0);
            sType = elem.type;
            var len = 0;
            switch (sType) {
                case "text":
                case "hidden":
                case "password":
                case "textarea":
                case "file":
                    var val = srcjo.val();
                    var initConfig = $.formValidator
                    .getInitConfig(elem.settings[0].validatorgroup);
                    if (initConfig.wideword) {
                        for ( var i = 0; i < val.length; i++) {
                            if (val.charCodeAt(i) >= 0x4e00
                                && val.charCodeAt(i) <= 0x9fa5) {
                                len += 2
                            } else {
                                len++
                            }
                        }
                    } else {
                        len = val.length
                    }
                    break;
                case "checkbox":
                case "radio":
                    len = $("input[type='" + sType + "'][name='"
                        + srcjo.attr("name") + "']:checked").length;
                    break;
                case "select-one":
                    len = elem.options ? elem.options.selectedIndex : -1;
                    break;
                case "select-multiple":
                    len = $("select[name=" + elem.name + "] option:selected").length;
                    break
            }
            return len
        },
        isEmpty : function(id) {
            if ($("#" + id).get(0).settings[0].empty
                && $.formValidator.getLength(id) == 0) {
                return true
            } else {
                return false
            }
        },
        isOneValid : function(id) {
            return $.formValidator.oneIsValid(id, 1).isvalid
        },
        oneIsValid : function(id, index) {
            var returnObj = new Object();
            returnObj.id = id;
            returnObj.ajax = -1;
            returnObj.errormsg = "";
            var elem = $("#" + id).get(0);
            var settings = elem.settings;
            var settingslen = settings.length;
            if (settingslen == 1) {
                settings[0].bind = false
            }
            if (!settings[0].bind) {
                return null
            }
            for ( var i = 0; i < settingslen; i++) {
                if (i == 0) {
                    if ($.formValidator.isEmpty(id)) {
                        returnObj.isvalid = true;
                        returnObj.setting = settings[0];
                        break
                    }
                    continue
                }
                returnObj.setting = settings[i];
                if (settings[i].validatetype != "AjaxValidator") {
                    $.formValidator.triggerValidate(returnObj)
                } else {
                    returnObj.ajax = i
                }
                if (!settings[i].isvalid) {
                    returnObj.isvalid = false;
                    returnObj.setting = settings[i];
                    break
                } else {
                    returnObj.isvalid = true;
                    returnObj.setting = settings[0];
                    if (settings[i].validatetype == "AjaxValidator")
                        break
                }
            }
            return returnObj
        },
        pageIsValid : function(validatorgroup) {
            if (validatorgroup == null || validatorgroup == undefined) {
                validatorgroup = "1"
            }
            ;
            var isvalid = true;
            var thefirstid = "", thefirsterrmsg;
            var returnObj, setting;
            var error_tip = "^";
            var initConfig = $.formValidator.getInitConfig(validatorgroup);
			//console.log(initConfig);
            var jqObjs = $(initConfig.validobjectids);
			//$(initConfig.validobjectids)结果有重复
			//console.log($("#name,#passwd,#confirm_passwd"));
            jqObjs.each(function(i, elem) {
				if(typeof elem.settings=="undefined")return;
                if (elem.settings[0].bind) {
                    returnObj = $.formValidator.oneIsValid(elem.id, 1);
                    if (returnObj) {
                        var tipid = elem.settings[0].tipid;
                        if (!returnObj.isvalid) {
                            isvalid = false;
                            if (thefirstid == "") {
                                thefirstid = returnObj.id;
                                thefirsterrmsg = (returnObj.errormsg == "" ? returnObj.setting.onerror
                                    : returnObj.errormsg)
                            }
                        }
                        if (!initConfig.alertmessage) {
                            if (error_tip.indexOf("^" + tipid + "^") == -1) {
                                if (!returnObj.isvalid) {
                                    error_tip = error_tip + tipid + "^"
                                }
                                $.formValidator.showMessage(returnObj)
                            }
                        }
                    }
                }
            });
            if (isvalid) {
                isvalid = initConfig.onsuccess();
                if (initConfig.submitonce) {
                    $("input[type='submit']").attr("disabled", true)
                }
            } else {
                var obj = $("#" + thefirstid).get(0);
                initConfig.onerror(thefirsterrmsg, obj);
                if (thefirstid != "" && initConfig.errorfocus) {
                    $("#" + thefirstid).focus()
                }
            }
            return !initConfig.debug && isvalid
        },
        ajaxValid : function(returnObj) {
            var id = returnObj.id;
            var srcjo = $("#" + id);
            var elem = srcjo.get(0);
            var settings = elem.settings;
            var setting = settings[returnObj.ajax];
            var ls_url = setting.url;
            if (srcjo.size() == 0 && settings[0].empty) {
                returnObj.setting = settings[0];
                returnObj.isvalid = true;
                $.formValidator.showMessage(returnObj);
                setting.isvalid = true;
                return
            }
            if (setting.addidvalue) {
                var parm = "clientid=" + id + "&" + id + "="
                + encodeURIComponent(srcjo.val());
                if (setting.getdata) {
                    $.each(setting.getdata, function(i, n) {
                        parm += "&" + i + "=" + $('#' + n).val()
                    })
                }
                ls_url = ls_url
                + (ls_url.indexOf("?") > -1 ? ("&" + parm)
                    : ("?" + parm));
                if (typeof (pc_hash) != 'undefined') {
                    ls_url = ls_url
                    + (ls_url.indexOf("?") > -1 ? ("&pc_hash=" + pc_hash)
                        : ("?pc_hash=" + pc_hash))
                }
            }
            $.ajax( {
                mode : "abort",
                type : setting.type,
                url : ls_url,
                cache : setting.cache,
                data : setting.data,
                async : setting.async,
                dataType : setting.datatype,
                success : function(data) {
                    if (setting.success(data)) {
                        $.formValidator.setTipState(elem, "onCorrect",
                            settings[0].oncorrect);
                        setting.isvalid = true
                    } else {
                        $.formValidator.setTipState(elem, "onError",
                            setting.onerror);
                        setting.isvalid = false
                    }
                },
                complete : function() {
                    if (setting.buttons && setting.buttons.length > 0) {
                        setting.buttons.attr( {
                            "disabled" : false
                        })
                    }
                    ;
                    setting.complete
                },
                beforeSend : function(xhr) {
                    if (setting.buttons && setting.buttons.length > 0) {
                        setting.buttons.attr( {
                            "disabled" : true
                        })
                    }
                    ;
                    var isvalid = setting.beforesend(xhr);
                    if (isvalid) {
                        setting.isvalid = false;
                        $.formValidator.setTipState(elem, "onLoad",
                            settings[returnObj.ajax].onwait)
                    }
                    setting.lastValid = "-1";
                    return isvalid
                },
                error : function() {
                    $.formValidator.setTipState(elem, "onError",
                        setting.onerror);
                    setting.isvalid = false;
                    setting.error()
                },
                processData : setting.processdata
            })
        },
        regexValid : function(returnObj) {
            var id = returnObj.id;
            var setting = returnObj.setting;
            var srcTag = $("#" + id).get(0).tagName;
            var elem = $("#" + id).get(0);
            if (elem.settings[0].empty && elem.value == "") {
                setting.isvalid = true
            } else {
                var regexpress = setting.regexp;
                if (setting.datatype == "enum") {
                    regexpress = eval("regexEnum." + regexpress)
                }
                if (regexpress == undefined || regexpress == "") {
                    setting.isvalid = false;
                    return
                }
                setting.isvalid = (new RegExp(regexpress, setting.param))
                .test($("#" + id).val())
            }
        },
        functionValid : function(returnObj) {
            var id = returnObj.id;
            var setting = returnObj.setting;
            var srcjo = $("#" + id);
            var lb_ret = setting.fun(srcjo.val(), srcjo.get(0));
            if (lb_ret != undefined) {
                if (typeof lb_ret == "string") {
                    setting.isvalid = false;
                    returnObj.errormsg = lb_ret
                } else {
                    setting.isvalid = lb_ret
                }
            }
        },
        inputValid : function(returnObj) {
            var id = returnObj.id;
            var setting = returnObj.setting;
            var srcjo = $("#" + id);
            var elem = srcjo.get(0);
            var val = srcjo.val();
            var sType = elem.type;
            var len = $.formValidator.getLength(id);
            var empty = setting.empty, emptyerror = false;
            switch (sType) {
                case "text":
                case "hidden":
                case "password":
                case "textarea":
                case "file":
                    if (setting.type == "size") {
                        empty = setting.empty;
                        if (!empty.leftempty) {
                            emptyerror = (val.replace(/^[ \s]+/, '').length != val.length)
                        }
                        if (!emptyerror && !empty.rightempty) {
                            emptyerror = (val.replace(/[ \s]+$/, '').length != val.length)
                        }
                        if (emptyerror && empty.emptyerror) {
                            returnObj.errormsg = empty.emptyerror
                        }
                    }
                case "checkbox":
                case "select-one":
                case "select-multiple":
                case "radio":
                    var lb_go_on = false;
                    if (sType == "select-one" || sType == "select-multiple") {
                        setting.type = "size"
                    }
                    var type = setting.type;
                    if (type == "size") {
                        if (!emptyerror) {
                            lb_go_on = true
                        }
                        if (lb_go_on) {
                            val = len
                        }
                    } else if (type == "date" || type == "datetime") {
                        var isok = false;
                        if (type == "date") {
                            lb_go_on = isDate(val)
                        }
                        ;
                        if (type == "datetime") {
                            lb_go_on = isDate(val)
                        }
                        ;
                        if (lb_go_on) {
                            val = new Date(val);
                            setting.min = new Date(setting.min);
                            setting.max = new Date(setting.max)
                        }
                    } else {
                        stype = (typeof setting.min);
                        if (stype == "number") {
                            val = (new Number(val)).valueOf();
                            if (!isNaN(val)) {
                                lb_go_on = true
                            }
                        }
                        if (stype == "string") {
                            lb_go_on = true
                        }
                    }
                    setting.isvalid = false;
                    if (lb_go_on) {
                        if (val < setting.min || val > setting.max) {
                            if (val < setting.min && setting.onerrormin) {
                                returnObj.errormsg = setting.onerrormin
                            }
                            if (val > setting.min && setting.onerrormax) {
                                returnObj.errormsg = setting.onerrormax
                            }
                        } else {
                            setting.isvalid = true
                        }
                    }
                    break
            }
        },
        compareValid : function(returnObj) {
            var id = returnObj.id;
            var setting = returnObj.setting;
            var srcjo = $("#" + id);
            var desjo = $("#" + setting.desid);
            var ls_datatype = setting.datatype;
            setting.isvalid = false;
            curvalue = srcjo.val();
            ls_data = desjo.val();
            if (ls_datatype == "number") {
                if (!isNaN(curvalue) && !isNaN(ls_data)) {
                    curvalue = parseFloat(curvalue);
                    ls_data = parseFloat(ls_data)
                } else {
                    return
                }
            }
            if (ls_datatype == "date" || ls_datatype == "datetime") {
                var isok = false;
                if (ls_datatype == "date") {
                    isok = (isDate(curvalue) && isDate(ls_data))
                }
                ;
                if (ls_datatype == "datetime") {
                    isok = (isDateTime(curvalue) && isDateTime(ls_data))
                }
                ;
                if (isok) {
                    curvalue = new Date(curvalue);
                    ls_data = new Date(ls_data)
                } else {
                    return
                }
            }
            switch (setting.operateor) {
                case "=":
                    if (curvalue == ls_data) {
                        setting.isvalid = true
                    }
                    break;
                case "!=":
                    if (curvalue != ls_data) {
                        setting.isvalid = true
                    }
                    break;
                case ">":
                    if (curvalue > ls_data) {
                        setting.isvalid = true
                    }
                    break;
                case ">=":
                    if (curvalue >= ls_data) {
                        setting.isvalid = true
                    }
                    break;
                case "<":
                    if (curvalue < ls_data) {
                        setting.isvalid = true
                    }
                    break;
                case "<=":
                    if (curvalue <= ls_data) {
                        setting.isvalid = true
                    }
                    break
            }
        },
        localTooltip : function(e) {
            e = e || window.event;
            var mouseX = e.pageX
            || (e.clientX ? e.clientX + document.body.scrollLeft : 0);
            var mouseY = e.pageY
            || (e.clientY ? e.clientY + document.body.scrollTop : 0);
            $("#fvtt").css( {
                "top" : (mouseY + 2) + "px",
                "left" : (mouseX - 40) + "px"
            })
        }
    };
    $.fn.formValidator = function(cs) {
        var setting = {
            validatorgroup : "1",
            empty : false,
            submitonce : false,
            automodify : false,
            onshow : "请输入内容",
            onfocus : "请输入内容",
            oncorrect : "输入正确",
            onempty : "输入内容为空",
            defaultvalue : null,
            bind : true,
            validatetype : "InitValidator",
            tipcss : {
                "left" : "10px",
                "top" : "1px",
                "height" : "20px",
                "width" : "250px"
            },
            triggerevent : "blur",
            forcevalid : false
        };
        cs = cs || {};
        if (cs.validatorgroup == undefined) {
            cs.validatorgroup = "1"
        }
        ;
        var initConfig = $.formValidator.getInitConfig(cs.validatorgroup);
        if (initConfig.tidymode) {
            setting.tipcss = {
                "left" : "2px",
                "width" : "22px",
                "height" : "22px",
                "display" : "none"
            }
        }
        ;
        $.extend(true, setting, cs);
        return this
        .each(function(e) {
            var jqobj = $(this);
            var setting_temp = {};
            $.extend(true, setting_temp, setting);
            var tip = setting_temp.tipid ? setting_temp.tipid : this.id
            + "Tip";
            if (initConfig.autotip) {
                if ($("body [id=" + tip + "]").length == 0) {
                    aftertip = setting_temp.relativeid ? setting_temp.relativeid
                    : this.id;
                    $('#' + aftertip).parent().append(
                        "<div id='" + tip + "'></div>")
                }
                if (initConfig.tidymode) {
                    jqobj.showTooltips()
                }
            }
            setting.tipid = tip;
            $.formValidator.appendValid(this.id, setting);
            var validobjectids = initConfig.validobjectids;
            if (validobjectids.indexOf("#" + this.id + " ") == -1) {
                initConfig.validobjectids = (validobjectids == "" ? "#"
                    + this.id : validobjectids + ",#" + this.id)
            }
            if (!initConfig.alertmessage) {
                $.formValidator.setTipState(this, "onShow",
                    setting.onshow)
            }
            var srcTag = this.tagName.toLowerCase();
            var stype = this.type;
            var defaultval = setting.defaultvalue;
            if (defaultval) {
                jqobj.val(defaultval)
            }
            if (srcTag == "input" || srcTag == "textarea") {
                jqobj.focus(function() {
                    if (!initConfig.alertmessage) {
                        var tipjq = $("#" + tip);
                        this.lastshowclass = tipjq.attr("class");
                        this.lastshowmsg = tipjq.html();
                        $.formValidator.setTipState(this, "onFocus",
                            setting.onfocus)
                    }
                });
                jqobj
                .bind(
                    setting.triggerevent,
                    function() {
                        var settings = this.settings;
                        var returnObj = $.formValidator
                        .oneIsValid(this.id, 1);
                        if (returnObj == null) {
                            return
                        }
                        if (returnObj.ajax >= 0) {
                            $.formValidator
                            .showAjaxMessage(returnObj)
                        } else {
                            var showmsg = $.formValidator
                            .showMessage(returnObj);
                            if (!returnObj.isvalid) {
                                var auto = setting.automodify
                                && (this.type == "text"
                                    || this.type == "textarea" || this.type == "file");
                                if (auto
                                    && !initConfig.alertmessage) {
                                    alert(showmsg);
                                    $.formValidator
                                    .setTipState(
                                        this,
                                        "onShow",
                                        setting.onshow)
                                } else {
                                    if (initConfig.forcevalid
                                        || setting.forcevalid) {
                                        alert(showmsg);
                                        this.focus()
                                    }
                                }
                            }
                        }
                    })
            } else if (srcTag == "select") {
                jqobj.bind("focus", function() {
                    if (!initConfig.alertmessage) {
                        $.formValidator.setTipState(this, "onFocus",
                            setting.onfocus)
                    }
                });
                jqobj.bind("blur", function() {
                    jqobj.trigger("change")
                });
                jqobj.bind("change", function() {
                    var returnObj = $.formValidator.oneIsValid(this.id,
                        1);
                    if (returnObj == null) {
                        return
                    }
                    if (returnObj.ajax >= 0) {
                        $.formValidator.showAjaxMessage(returnObj)
                    } else {
                        $.formValidator.showMessage(returnObj)
                    }
                })
            }
        })
    };
    $.fn.inputValidator = function(controlOptions) {
        var settings = {
            isvalid : false,
            min : 0,
            max : 99999999999999,
            type : "size",
            onerror : "输入错误",
            validatetype : "InputValidator",
            empty : {
                leftempty : true,
                rightempty : true,
                leftemptyerror : null,
                rightemptyerror : null
            },
            wideword : true
        };
        controlOptions = controlOptions || {};
        $.extend(true, settings, controlOptions);
        return this.each(function() {
            $.formValidator.appendValid(this.id, settings)
        })
    };
    $.fn.compareValidator = function(controlOptions) {
        var settings = {
            isvalid : false,
            desid : "",
            operateor : "=",
            onerror : "输入错误",
            validatetype : "CompareValidator"
        };
        controlOptions = controlOptions || {};
        $.extend(true, settings, controlOptions);
        return this.each(function() {
            $.formValidator.appendValid(this.id, settings)
        })
    };
    $.fn.regexValidator = function(controlOptions) {
        var settings = {
            isvalid : false,
            regexp : "",
            param : "i",
            datatype : "string",
            onerror : "输入的格式不正确",
            validatetype : "RegexValidator"
        };
        controlOptions = controlOptions || {};
        $.extend(true, settings, controlOptions);
        return this.each(function() {
            $.formValidator.appendValid(this.id, settings)
        })
    };
    $.fn.functionValidator = function(controlOptions) {
        var settings = {
            isvalid : true,
            fun : function() {
                this.isvalid = true
            },
            validatetype : "FunctionValidator",
            onerror : "输入错误"
        };
        controlOptions = controlOptions || {};
        $.extend(true, settings, controlOptions);
        return this.each(function() {
            $.formValidator.appendValid(this.id, settings)
        })
    };
    $.fn.ajaxValidator = function(controlOptions) {
        var settings = {
            isvalid : false,
            lastValid : "",
            type : "GET",
            url : "",
            addidvalue : true,
            datatype : "html",
            data : "",
            async : true,
            cache : false,
            cached : true,
            getdata : '',
            beforesend : function() {
                return true
            },
            success : function() {
                return true
            },
            complete : function() {
            },
            processdata : false,
            error : function() {
            },
            buttons : null,
            onerror : "服务器校验没有通过",
            onwait : "正在等待服务器返回数据",
            validatetype : "AjaxValidator"
        };
        controlOptions = controlOptions || {};
        $.extend(true, settings, controlOptions);
        return this.each(function() {
            $.formValidator.appendValid(this.id, settings)
        })
    };
    $.fn.defaultPassed = function(onshow) {
        return this
        .each(function() {
            var settings = this.settings;
            for ( var i = 1; i < settings.length; i++) {
                settings[i].isvalid = true;
                if (!$.formValidator
                    .getInitConfig(settings[0].validatorgroup).alertmessage) {
                    var ls_style = onshow ? "onShow" : "onCorrect";
                    $.formValidator.setTipState(this, ls_style,
                        settings[0].oncorrect)
                }
            }
        })
    };
    $.fn.unFormValidator = function(unbind) {
        return this.each(function() {
            this.settings[0].bind = !unbind;
            if (unbind) {
                $("#" + this.settings[0].tipid).hide()
            } else {
                $("#" + this.settings[0].tipid).show()
            }
        })
    };
    $.fn.showTooltips = function() {
        if ($("body [id=fvtt]").length == 0) {
            fvtt = $("<div id='fvtt' style='position:absolute;z-index:56002'></div>");
            $("body").append(fvtt);
            fvtt
            .before("<iframe src='about:blank' class='fv_iframe' scrolling='no' frameborder='0'></iframe>")
        }
        return this
        .each(function() {
            jqobj = $(this);
            s = $("<span class='top' id=fv_content style='display:block'></span>");
            b = $("<b class='bottom' style='display:block' />");
            this.tooltip = $(
                "<span class='fv_tooltip' style='display:block'></span>")
            .append(s).append(b).css( {
                "filter" : "alpha(opacity:95)",
                "KHTMLOpacity" : "0.95",
                "MozOpacity" : "0.95",
                "opacity" : "0.95"
            });
            jqobj.mouseover(function(e) {
                $("#fvtt").append(this.tooltip);
                $("#fv_content").html(this.Tooltip);
                $.formValidator.localTooltip(e)
            });
            jqobj.mouseout(function() {
                $("#fvtt").empty()
            });
            jqobj.mousemove(function(e) {
                $("#fv_content").html(this.Tooltip);
                $.formValidator.localTooltip(e)
            })
        })
    }
})(jQuery);