XN.namespace("app.safety");

(function(ns){
    ns._Dialog = null;
    ns.getQuestionUrl = "json.txt";
    ns.postAnswerUrl = "#";
    ns.identifyCodeUrl = "https://passport.baidu.com/?verifypic";
    //获取问题
    ns.getQuestion = function(url, data){
        if (!isString(url)) 
            return;
        new XN.net.xmlhttp({
            url: url,
            data: data || "",
            method: "get",
            useCache: false,
            onSuccess: this.showQuestion,//成功后显示问题
            onError: function(){
                XN.DO.showError("读取出错,请重试");
            }
        })
    }
    //显示问题
    ns.showQuestion = function(r){
        try {
            r = XN.JSON.parse(r.responseText);
            var answerBody = "";//confirm里的表单内容
            var questions = r.question;
            if (r.question) {
                for (var i = 0, len = questions.length; i < len; i++) {
                    answerBody += '<p class="question"><label>问题' + (i + 1) + '：</label>' +
                    '<img src="' +
                    questions[i].src +
                    '" /></p>' +
                    '<p class="answer"><label for="' +
                    questions[i].id +
                    '">回答：</label>' +
                    '<input type="text" class="input-text" name="' +
                    questions[i].id +
                    '" id="' +
                    questions[i].id +
                    '" /></p>';
                }
            }
            var mess = '<p class="gray">请回答以下问题,点击下一步</p>' +
            '<div class="errors_div" id="showError" style="display:none"></div>' +
            '<form action="#" name="questionFrom">' +
            answerBody +
            '</form>' +
            '<p class="changeQ"><a href="' +
            ns.getQuestionUrl +
            '" id="changeQuestion">换一个问题</a></p>';
            if (r.identifyCode == 0) {
                mess += '<p class="identify"><label for="indetifyCode">验证码：</label><input type="text" class="input-text" name="indetifyCode" id="indetifyCode" /><br /><label></label><img id="indetifyCodeImg" src="' + ns.identifyCodeUrl + '" /><a href="#nogo" id="changeIdentifyCode">看不清楚,换一个</a></p>';
            }
            
            ns._Dialog.body.setContent(mess);//设置问题主体
            ns._Dialog.getButton("确定").hide();
            ns._Dialog.delButton("取消");
            if (!ns._Dialog.getButton("上一步")) {
                ns._Dialog.addButton({
                    text: "上一步",
                    onclick: function(){
                        ns.showWay();
                    }
                });
            }
            if (!ns._Dialog.getButton("下一步")) {//下一步后构造json并提交请求
                ns._Dialog.addButton({
                    text: "下一步",
                    onclick: function(){
                        var backJson = [];
                        var myForm = document.forms["questionFrom"];
                        var inputs = myForm.getElementsByTagName("input");
                        for (var i = 0, len = inputs.length; i < len; i++) {
                            if (XN.String.isBlank(inputs[i].value)) {//先检查回答是否为空,为空直接返回false,否则继续
                                $("showError").innerHTML = "回答不能为空";
                                $("showError").style.display = "block";
                                inputs[i].focus();
                                return false;
                            }
                            //backJson.push('"' + inputs[i].name + '":{"id":"' + inputs[i].id + '","answer":"' + inputs[i].value + '"}');
                            backJson.push('{"id:":' + inputs[i].id + ',"answer":"' + inputs[i].value + '"}');
                        }
                        if ($("indetifyCode") && XN.String.isBlank($("indetifyCode").value)) {//检查验证码是否为空,为空直接返回false,否则继续
                            $("showError").innerHTML = "请输入验证码";
                            $("showError").style.display = "block";
                            $("indetifyCode").focus();
                            return false;
                        }
                        backJson = '{"answers":[' + backJson + '],"identityCode":"' + $("indetifyCode").value + '"}';//构造的返回json
                        //alert(backJson);
                        new XN.net.xmlhttp({//提交请求,根据返回结果进行进一步操作
                            url: ns.postAnswerUrl,
                            data: "p=" + backJson,
                            method: "post",
                            onSuccess: function(r){
                                alert(r);
                            }
                        })
                    }
                });
            }
            ns._Dialog.addButton({
                text: "取消",
                onclick: function(){
                    ns._Dialog.hide();
                },
                className: "gray"
            });
            
            $("changeQuestion").onclick = function(){//换一个问题
                ns.changeQuestion(this.href);
                return false;
            }
            $("changeIdentifyCode").onclick = function(){//换一个验证码
                $("indetifyCodeImg").src = ns.identifyCodeUrl + Math.random();
                return false;
            }
        } 
        catch (e) {
            XN.DO.showError({
                message: "问题读取出错,请重试!" + e.message
            })
        }
    }
    //换个问题
    ns.changeQuestion = function(url){
        this.getQuestion(url);
    }
    //显示方式
    ns.showWay = function(){
        var mess = '<p class="gray">请选择修改方式:</p>' +
        '<p><input type="radio" name="way" id="way1" class="input-checkbox" value="way1" checked /><label for="way1">密保问题验证</label></p>' +
        '<p><input type="radio" name="way" id="way2" class="input-checkbox" value="way2" /><label for="way2">手机验证</label></p>';
        this._Dialog = new XN.DO.confirm({
            title: "修改密保问题",
			modal:true,
            message: mess,
            callBack: function(f){
                if (!f) 
                    return;
                if ($("way1").checked) {
                    ns.getQuestion(ns.getQuestionUrl);
                    this.preventHide();
                }
                else 
                    if ($("way2").checked) {
                        ns.checkMobile();
                    }
            }
        });
    }
    
    $extend(ns, {
        ratingMsgs: ["太短", "弱", "中", "强", "极佳"],
        barColors: ["", "#EF5D44", "#FFB472", "#73ABFF", "#5DC83C"],
        barColor: "#E7E7E7",
        minPassLen: 6
    });
    /*
     * 测试密码强度
     */
    ns.checkPassRate = function(passwd){
        if (passwd.length < ns.minPassLen) 
            return 0; //密码太短 
        var rating = 0;
        if (passwd.match(/[0-9]/g)) 
            rating++;
        if (passwd.match(/[a-z]/g)) 
            rating++;
        if (passwd.match(/[A-Z]/g)) 
            rating++;
        if (passwd.match(/[^a-zA-Z0-9]/g)) 
            rating++;
        return rating;
    }
    /*
     * 显示密码强度提示
     */
    ns.displayBar = function(rate){
        var bgBar = $("passRateBar");
        var posBar = bgBar.getElementsByTagName("em")[0];
        var msg = $("rateMsg")
        var barLen = parseInt(bgBar.style.width);
        if (rate >= 0 && rate <= 4) {
            posBar.style.width = barLen / 4 * rate + "px";
            posBar.style.background = ns.barColors[rate];
            msg.innerHTML = ns.ratingMsgs[rate];
        }
    }
    ns.resetBar = function(){
        ns.displayBar(0);
    }
    /*
     * 构造以下结构
     * <span class="pass-rate" id="passRate"><em></em></span><span class="rate-msg" id="rateMsg"></span>
     */
    ns.creatPassRate = function(o){
        var passwd = o.value;
        var passRateBar = $element("span");
        XN.element.addClass(passRateBar, "pass-rate");
        passRateBar.id = "passRateBar";
        passRateBar.style.width = "120px";
        XN.element.addChild(passRateBar, $element("em"));
        if (!$("passRateBar")) 
            XN.DOM.insertAfter(passRateBar, o);
        var msg = $element("span");
        XN.element.addClass(msg, "rate-msg");
        msg.id = "rateMsg";
        if (!$("rateMsg")) 
            XN.DOM.insertAfter(msg, $("passRateBar"));
        if (passwd.length < ns.minPassLen) {//显示密码强度
            if (passwd.length > 0) 
                ns.displayBar(0);
            else 
                ns.resetBar();
        }
        else {
            var rating = ns.checkPassRate(passwd);
            ns.displayBar(rating);
        }
        //alert(this.barColor);
    }
    
    ns.release = function(questionUrl, flag, msg, action){
        msg = msg || "请回答一下问题";
        action = action || "";
        if (!isString(questionUrl)) 
            return;
        new XN.net.xmlhttp({
            url: questionUrl,
            method: "get",
            useCache: false,
            onSuccess: function(r){
                r = XN.JSON.parse(r.responseText);
                var answerBody = "";//confirm里的表单内容
                var mess = "";
                if (r.question) {
                    var questions = r.question;
                    for (var i = 0, len = questions.length; i < len; i++) {
                        answerBody += '<p class="question"><label>问题' + (i + 1) + '：</label>' +
                        '<img src="' +
                        questions[i].src +
                        '" /><input type="hidden" name="qid" value="' + questions[i].id + '" /></p>' +
                        '<p class="answer"><label for="' +
                        questions[i].id +
                        '">回答：</label>' +
                        '<input type="text" class="input-text" name="answer" id="' +
                        questions[i].id +
                        '" /></p>';
                    }
                }
                mess += ''+
                '<div class="errors_div" id="showError">'+ msg+'</div>' +
                '<form action="' +
                action +
                '" name="questionFrom" method="post" id="questionFrom">' +
                answerBody;
                if (r.question) 
                    mess += '<p class="changeQ"><a href="' +
                    questionUrl +
                    '" id="changeQuestion">换一个问题</a></p>';
                if (r.identifyCode) {
                    mess += '<p class="identify"><label for="indetifyCode">验证码：</label><input type="text" class="input-text" name="code" id="indetifyCode" /><br /><label></label><img id="indetifyCodeImg" src="' + r.identifyCode + "&t=" + Math.random() + '" /><a href="#nogo" id="changeIdentifyCode">看不清楚,换一个</a></p>';
                }
                mess += '</form>'
                XN.DO.confirm({
                    title: "请输入验证码:",
                    message: mess,
					modal:flag,
                    callBack: function(f){
                        if (!f) 
                            this.hide();
                        else {
                            this.preventHide();
                            var myForm = document.forms["questionFrom"];
                            var inputs = myForm.getElementsByTagName("input");
                            for (var i = 0, len = inputs.length; i < len; i++) {
                                if (XN.String.isBlank(inputs[i].value) && inputs[i].id != "indetifyCode") {//先检查回答是否为空,为空直接返回false,否则继续
                                    $("showError").innerHTML = "回答不能为空";
                                    $("showError").style.display = "block";
                                    inputs[i].focus();
                                    return false;
                                }
                            }
                            if ($("indetifyCode") && XN.String.isBlank($("indetifyCode").value)) {//检查验证码是否为空,为空直接返回false,否则继续
                                $("showError").innerHTML = "请输入验证码";
                                $("showError").style.display = "block";
                                $("indetifyCode").focus();
                                return false;
                            }
                            //同步方法,暂不可用
                            //myForm.submit();
                            new XN.net.xmlhttp({//提交请求,根据返回结果进行进一步操作
                                url: action,
                                data: XN.FORM.serialize("questionFrom"),
                                method: "post",
                                onSuccess: function(r){
                                    try{
										var json = XN.json.parse(r.responseText);
										if(json.code ==0){
											window.location.reload();
										}
										else{
											$("showError").innerHTML = json.msg;
											$("indetifyCodeImg").src = r.identifyCode + "&t=" + Math.random();
										}
									}catch(e){
										XN.DO.showError("处理出错,请稍候重试!")
									}
                                }
                            })
                        }
                    }
                })
                if ($("changeQuestion")) {
                    $("changeQuestion").onclick = function(){//换一个问题
                        ns.release(questionUrl, flag, msg, action);
                        return false;
                    }
                }
                if ($("changeIdentifyCode")) {
                    $("changeIdentifyCode").onclick = function(){
                        $("indetifyCodeImg").src = r.identifyCode + "&t=" + Math.random();
                        return false;
                    }
                }
            },
            onError: function(){
                XN.DO.showError("读取出错,请重试");
            }
        })
        
    }
})(XN.app.safety);
XN.DOM.readyDo(function(){
    //XN.app.safety.getQuestion("json.txt");
    //XN.app.safety.showWay();//调用方法

    //XN.app.safety.release("json.txt", true, "回答问题", "#");
})

