﻿function passwordChecker(newPWDInputBox, confirmNewPWDInuptBox, oldPWDInputBox, userName, callbackHandler) {
    this.newPasswordEle = $(newPWDInputBox);
    this.confirmNewPasswordEle = $(confirmNewPWDInuptBox);
    this.oldPasswordEle = oldPWDInputBox ? $(oldPWDInputBox) : null;
    this.userName = $(userName);
    this.init();
    this.callbackHandler = callbackHandler ? callbackHandler : function() { };
}
passwordChecker.errorMessage = {};
passwordChecker.errorMessage[-1] = "";
passwordChecker.errorMessage[0] = "请输入新密码";
passwordChecker.errorMessage[1] = "请输入确认新密码";
passwordChecker.errorMessage[2] = "确认密码与新密码不相同，请重新输入";
passwordChecker.errorMessage[3] = "请输入6-12个字符，可使用字母、数字和符号的组合，至少包含1个字母和1个数字。";
passwordChecker.errorMessage[4] = "请不要使用过于简单的密码";
passwordChecker.errorMessage[5] = "请不要重复使用同一字符";
passwordChecker.errorMessage[6] = "原密码输入不正确";
passwordChecker.errorMessage[7] = "请输入原密码";
passwordChecker.errorMessage[8] = "修改成功";
passwordChecker.errorMessage[9] = "修改失败";
passwordChecker.errorMessage[10] = "请不要使用最近2次使用过的密码";
passwordChecker.disabledList = ['123456', '654321']; //密码禁用列表
passwordChecker.prototype = {
    incorrectOldPwd: false,
    errorCode: -1,
    validPwdUrl: "/Accounts/ValidatePWD.ashx",
    validPwdUrlParam: "p={0}",
    updatePwdUrl: "/Accounts/ModifyPassword.ashx",
    updatePwdParam: "oldPassword={0}&newPassword={1}",
    init: function() {
        jDoc.addEventHandler(this.newPasswordEle, "blur", this.check.bind(this));
        jDoc.addEventHandler(this.newPasswordEle, "keyup", this.check.bind(this));
        jDoc.addEventHandler(this.confirmNewPasswordEle, "blur", this.checkConfirmPassword.bind(this));
        jDoc.addEventHandler(this.confirmNewPasswordEle, "keyup", this.checkConfirmPassword.bind(this));
        if (this.oldPasswordEle)
            jDoc.addEventHandler(this.oldPasswordEle, "blur", this.validateOldPassword.bind(this));
    },
    validateOldPassword: function() {
        if (this.oldPasswordEle.value.trim() != "") {
            ajaxPostData(this.validPwdUrl, String.format(this.validPwdUrlParam, encodeURIComponent(this.oldPasswordEle.value)), this.validateOldPasswordSucc.bind(this), "");
        } else {
            this.callbackHandler(0, 7, 2);
        }
    },
    validateOldPasswordSucc: function(response) {
        if (response.error == null) {
            if (response.value == "1") {
                this.incorrectOldPwd = false;
                this.callbackHandler(0, -1, 2);
            } else {
                this.incorrectOldPwd = true;
                this.callbackHandler(0, 6, 2);
            }
        }
    },
    validateOldPasswordFail: function() {
    },
    setRate: function(rating, errorCode, type) {//type-- 0:newpassword 1:confirmnewPassword 2:oldPassword
        this.callbackHandler(rating, errorCode, type);
        //$("divShowRating").innerHTML = "rating:" + rating + "  - errorCode:" + errorCode + "--" + passwordChecker.errorMessage[errorCode];
    },
    check: function() {
        var newPassword = this.newPasswordEle.value;
        var txtusername = this.userName.value == undefined ? this.userName.innerHTML : this.userName.value;
        var confirmNewPassword = this.confirmNewPasswordEle.value;
        if (newPassword.trim() == "") {
            this.setRate(0, 0, 0);
            return false;
        }
        //        var regLength = /^[^\u4e00-\u9fa5\s]{6,20}$/;
        //        if (!regLength.test(newPassword)) {
        //            this.setRate(1, 3, 0);
        //            return false;
        //        }
        //修改密码验证规则必须包含一个字母一个数字（或特殊符号）
        //至少包含一个字母
        var regExp = /([a-z]|[A-Z]){1,}/;
        if (!regExp.test(newPassword)) {
            this.setRate(1, 3, 0);
            return false;
        }
        //包含一个数字或者特殊符号
        var regnumExp = /[0-9]/;
        var regcharExp= /[^\u4e00-\u9fa5\sa-zA-Z0-9]/
        //alert("包含数字验证："+ regExp.test(pwdValue));
        if (!regnumExp.test(newPassword)) {
            this.setRate(1, 3, 0);
            return false;
        }
        //检查长度
        var regLength = /^[^\u4e00-\u9fa5\s]{6,20}$/;
        if (!regLength.test(newPassword)) {
            this.setRate(1, 3, 0);
            return false;
        }



        if (passwordChecker.disabledList.contains(newPassword.trim())) {
            this.setRate(1, 4, 0);
            return false;
        }

        var regLetter = /^[A-Za-z]+$/, regNumber = /^[0-9]+$/, regSymbol = /^[^0-9a-zA-Z]+$/;
        if (regLetter.test(newPassword) || regNumber.test(newPassword) || regSymbol.test(newPassword)) {
            if (this.checkSameChar(newPassword)) {
                this.setRate(1, 5, 0);
                return false;
            } else {
                this.setRate(1, -1, 0);
                return true;
            }
        }

        if (txtusername == newPassword) {
            this.setRate(1, -1, 0);
            return true;
        }

        var regNotLetter = /^[^a-zA-Z]+$/, regNotNumber = /^[^0-9]+$/, regNotSymbol = /^[A-Za-z0-9]+$/;
        if (regNotLetter.test(newPassword) || regNotNumber.test(newPassword) || regNotSymbol.test(newPassword)) {
            this.setRate(2, -1, 0);
            return true;
        }
        this.setRate(3, -1, 0);
        return true;
    },
    checkConfirmPassword: function() {
        var newPassword = this.newPasswordEle.value;
        var confirmNewPassword = this.confirmNewPasswordEle.value;
        if (confirmNewPassword.trim() == "") {
            this.setRate(0, 1, 1);
            return false;
        }
        //确认密码先判断格式，测试提
        var regLength = /^[^\u4e00-\u9fa5\s]{6,20}$/;
        if (!regLength.test(confirmNewPassword)) {
            this.setRate(0, 3, 1);
            return false;
        }
        if (this.equal(newPassword, confirmNewPassword) == false) {
            this.setRate(0, 2, 1);
            return false;
        }
        this.setRate(0, -1, 1);
        return true;
    },
    isValid: function() {
        if (this.oldPasswordEle && this.oldPasswordEle.value.trim() == "") {
            this.callbackHandler(0, 7, 2);
            return false;
        }
        if (this.incorrectOldPwd == false && this.check() == true && this.checkConfirmPassword() == true) {
            return true;
        } else {
            if (this.incorrectOldPwd == true) this.validateOldPassword();
            return false;
        }
    },
    equal: function(newPassword, confirmNewPassword) {
        if (newPassword != confirmNewPassword) {
            return false;
        }
        return true;
    },
    checkSameChar: function(value) {
        var charList = value.split('');
        if (charList.length <= 1) return false;
        for (var i = 1, len = charList.length; i < len; i++) {
            if (charList[0] != charList[i]) {
                return false;
            }
        }
        return true;
    },
    modifyPassword: function(callhandlerEvent) {
        var newPwd = this.newPasswordEle.value.trim();
        var oldPwd = this.oldPasswordEle.value.trim();
        var txtusername = this.userName.value == undefined ? this.userName.innerHTML : this.userName.value;
//        if (newPwd == oldPwd) {
//            alert("【新密码】不能与【老密码】相同");
//            return;
//        }
//        if (newPwd == txtusername.trim()) {
//            alert("【新密码】不能与【用户名】相同");
//            return;
//        }
        var param = String.format(this.updatePwdParam, encodeURIComponent(this.oldPasswordEle.value), encodeURIComponent(this.newPasswordEle.value));
        ajaxPostData(this.updatePwdUrl, param, this.modifyPasswordSucc.bind(this), callhandlerEvent);
    },
    modifyPasswordSucc: function(response) {
        if (response.error == null) {
            alert(passwordChecker.errorMessage[response.value]);
            if (typeof response.context == "function")
                response.context();
        }
    }
}
function showPasswordCheckMsg(rating, errorCode, type) {
    var tips = passwordChecker.errorMessage[errorCode];
    var tipsClassName = tips == "" ? "c_ok" : "c_err";
    switch (type) {
        case 0:
            var divNewPwd = $("divNewPasswordTips");
            var className = String.format("pbar pb{0}", rating);
            $("divNewPwdHelp").style.display = "none";
            divNewPwd.innerHTML = tips;
            divNewPwd.className = tipsClassName;
            $("divRageBar").className = className;
            break;
        case 1:
            var divConfrimPwd = $("divConfirmNewPasswordTips");
            divConfrimPwd.innerHTML = tips;
            divConfrimPwd.className = tipsClassName;
            break;
        default:
            var divOldPwd = $("divOldPasswordTips");
            divOldPwd.innerHTML = tips;
            divOldPwd.className = tipsClassName;
            break;
    }
}
function showhelp(bbname, wdh) {
    bbname.style.width = wdh;
    bbname.className = "t_help hpon";
}
function hidehelp(bbname, wdh) {
    bbname.className = "t_help hpof";
}