﻿Array.prototype.toSecurityList = function () {
    var strJoined = new Array();

    for (var i in this)
        if (typeof i == "string" && i.indexOf("Config") == 0)
            strJoined.push(i + ';' + this[i]);

    return strJoined.join(';');
}

var objSecurityPolicy = new Array();

function LocalMessage(TypeOfMessage, strTitle, strMessage) {
    try {
        $("#dialog-local-message").remove();
    }
    catch (e) { 
    }

    $("form").append("<div id='dialog-local-message' title='" + strTitle + "'><div style='position:absolute; top:45%;'><span class='ui-dialog-icon ui-dialog-icon-" + TypeOfMessage + "' style='float:left;margin-right:.5em;'></span><div class='cssLabel' style='padding-right:.75em'>" + strMessage + "</div></div>");

    $("#dialog-local-message").dialog({
        resizable: false,
        closeText: '',
        width: 480,
        modal: true,
        buttons: {
            "Buttons_Close_Text": function () { $(this).dialog("close"); }
        }
    });

    $('div.ui-dialog-buttonpane button:contains(Buttons_Close_Text)').empty().html("<span class=\"ui-button-text\">" + objSecurityPolicy["Buttons_Close_Text"] + "</span>");
}


//Exibe uma mensagem erro em uma nova janela para o usuário
function ErrorLocalMessage() {
    //Cria a nova janela de erro
    var objWindow = window.open('', '', 'width=600,height=600,menubar=no,titlebar=no,status=no,toolbar=no,location=no,scrollbars=yes')

    //Exibe a mensagem da última mensagem
    objWindow.document.write(lastErrorMessage);

}

function ChangePassword(varReason) {

    //Remove a caixa de dialogo (caso ela tenha sido criada previamente)
    $("#dialog-change-password").remove();

    //Cria o formulário para criação do itinerário
    $("form").append("<div id='dialog-change-password' title='" + objSecurityPolicy["Security_Policy_ChangePassword_Title"] + "'><table cellspacing='4'><tr><td colspan='2'><span class='cssLabel'>" + objSecurityPolicy["Security_Policy_ChangePassword_Instruction_Text"] + "</span></td></tr><tr><td style='width:150px'><label for='password' class='cssLabel'>" + objSecurityPolicy["Security_Policy_NewPassword_Text"] + ":</label></td><td><input type='password' style='width: 120px;' class='cssTextBox' id='txtNewPassword' maxlength='20' /></td></tr><tr><td><label for='confirm' class='cssLabel'>" + objSecurityPolicy["Security_Policy_NewPasswordConfirm_Text"] + ":</label></td><td><input type='password' style='width: 120px;' class='cssTextBox' id='txtNewPasswordConfirm' maxlength='20' /></td></tr></table></div>");

    //Exibe a caixa de dialogo
    $("#dialog-change-password").dialog({
        resizable: false,
        width: 480,
        closeOnEscape: false,
        modal: true,
        open: function (event, ui) { if (varReason != "") { $(".ui-dialog-titlebar-close").hide(); } },
        buttons: {
            "Buttons_Cancel_Text": function () {

                if (varReason == "") {
                    $(this).dialog("close");
                }
                else {
                    LocalMessage('error', objSecurityPolicy["Security_Policy_ChangePassword_Title"], objSecurityPolicy["Security_Policy_Constraint_ChangePassword_Message"].replace('[reason]', varReason))
                }

            },
            "Buttons_Save_Text": function () {
                var blnValid = true;

                //Verifica se a senha e a confirmação são iguais
                if ($('#txtNewPassword').val().length < parseInt(objSecurityPolicy["Security_Policy_MinPasswordLength"])) {
                    LocalMessage('error', objSecurityPolicy["Security_Policy_Constraint_Error"], objSecurityPolicy["Security_Policy_Constraint_NotEqualsMinLength"].replace("[length]", objSecurityPolicy["Security_Policy_MinPasswordLength"]));

                    //Interrompe o método
                    blnValid = false;
                }

                if (blnValid && objSecurityPolicy["Security_Policy_EnforceStrongPassword"] == "1") {
                    var re = new RegExp("(?=.*[0-9])(?=.*[!@#$%-=_+?])(?=.*[A-Z])(?=.*[a-z])(?!.*(.)\\1)(?!.*[^a-zA-Z0-9!@#$%-=_+?])(?!.*\\s).{" + objSecurityPolicy["Security_Policy_MinPasswordLength"] + ",}$");

                    if (!$('#txtNewPassword').val().match(re)) {
                        LocalMessage('error', objSecurityPolicy["Security_Policy_Constraint_Error"], objSecurityPolicy["Security_Policy_Constraint_NotEqualsStrongPolicy"]);

                        //Interrompe o método
                        blnValid = false;
                    }
                }

                if (blnValid && $('#txtNewPassword').val() != $('#txtNewPasswordConfirm').val()) {
                    LocalMessage('error', objSecurityPolicy["Security_Policy_Constraint_Error"], objSecurityPolicy["Security_Policy_Constraint_NotEqualsConfirmation"]);

                    //Interrompe o método
                    blnValid = false;
                }

                if (blnValid) {
                    $.ajax(
                        {
                            url: "/Administration/Security/Handler/SecurityPolicy.ashx",
                            data: {
                                action: "TypeOfChangePassword",
                                newpassword: $('#txtNewPassword').val(),
                                rand: new Date().getTime()
                            },
                            success: function (response) {
                                if (response == "success") {
                                    $(this).dialog("close");

                                    LocalMessage('success', objSecurityPolicy["Security_Policy_Success_ChangePassword_Title"], objSecurityPolicy["Security_Policy_Success_ChangePassword_Message"]);
                                } else {
                                    LocalMessage('error', objSecurityPolicy["Security_Policy_Constraint_Error"], response);
                                }

                            },
                            error: function (response) {
                                //Armazena a mensagem de erro
                                lastErrorMessage = response.responseText;

                                //Alerta o usuário do evento
                                LocalMessage('error', objSecurityPolicy["Security_Policy_Error_Title"], "<a href='#' style='color:red' onclick=\"ErrorLocalMessage();\">" + response.statusText + "</a> - " + objSecurityPolicy["Security_Policy_Error_Message"]);
                            }
                        });
                }
            }
        }
    });

    $('div.ui-dialog-buttonpane button:contains(Buttons_Cancel_Text)').empty().html("<span class=\"ui-button-text\">" + objSecurityPolicy["Buttons_Cancel_Text"] + "</span>");
    $('div.ui-dialog-buttonpane button:contains(Buttons_Save_Text)').empty().html("<span class=\"ui-button-text\">" + objSecurityPolicy["Buttons_Save_Text"] + "</span>");
}

function LoadSecurityPolicy() {
    //Envia a requisição ao servidor
    $.ajax(
        {
            url: "/Administration/Security/Handler/SecurityPolicy.ashx",
            data: {
                action: "TypeOfLoad",
                rand: new Date().getTime()
            },
            success: function (xml) {

                //Interpreta as opções de configuração
                var lstSecurityPolicy = $(xml).find('item');

                if (lstSecurityPolicy.length > 0) {
                    //Recupera a lista de atributos
                    $(lstSecurityPolicy.get(0).attributes).each(function () {
                        objSecurityPolicy[this.nodeName] = this.nodeValue;
                    });
                }
            },
            error: function (response) {
                //Armazena a mensagem de erro
                lastErrorMessage = response.responseText;

                //Alerta o usuário do evento
                LocalMessage('error', objSecurityPolicy["Security_Policy_Error_Title"], "<a href='#' style='color:red' onclick=\"ErrorLocalMessage();\">" + response.statusText + "</a> - " + objSecurityPolicy["Security_Policy_Error_Message"]);
            }
        });
}

function LoadDetail(strDetail) {

    if ($("#dialog-error").length == 0)
        $("#dialog-error").remove();

    $("form").append("<div id='dialog-detail' title='" + objSecurityPolicy["Security_Policy_Detail_Title"] + "'><span class='cssLabel'>" + strDetail + "</span></div>");

    $("#dialog-detail").dialog({
        resizable: false,
        width: 320,
        modal: true,
        buttons: {
            "Buttons_Close_Text": function () { $(this).dialog("close"); }
        }
    });

    $('div.ui-dialog-buttonpane button:contains(Buttons_Close_Text)').empty().html("<span class=\"ui-button-text\">" + objSecurityPolicy["Buttons_Close_Text"] + "</span>");
}

function LoadSecurity() {

    // Enforce strong password policy
    $("#lblEnforceStrongPassword").html(objSecurityPolicy["Security_Policy_EnforceStrongPassword_Text"]);

    $("#lblEnforceStrongPassword_Yes").html(objSecurityPolicy["Security_Policy_EnforceStrongPassword_Yes_Text"]);

    $("#lblEnforceStrongPassword_No").html(objSecurityPolicy["Security_Policy_EnforceStrongPassword_No_Text"]);

    $('input[name="rdbEnforceStrongPassword"]').attr('checked', false);

    if (objSecurityPolicy["ConfigEnforceStrongPassword"] == "1")
        $("#rdbEnforceStrongPassword_Y").attr("checked", true);
    else
        $("#rdbEnforceStrongPassword_N").attr("checked", true);

    $('input[name="rdbEnforceStrongPassword"]').click(function (event) {
        objSecurityPolicy["ConfigEnforceStrongPassword"] = $(this).find('input').attr('value');
    });

    $('#lbtEnforceStrongPassword').click(function (event) {
        LoadDetail(objSecurityPolicy["Security_Policy_EnforceStrongPassword_Detail"]);

        event.preventDefault();
    });

    // Minimum password length
    $("#divMinPasswordLength").slider({
        value: objSecurityPolicy["ConfigMinPasswordLength"],
        min: 4,
        max: 20,
        step: 1,
        slide: function (event, ui) {
            $("#lblMinPasswordLength").html((objSecurityPolicy["Security_Policy_MinPasswordLength_Text"]).replace('[ui_value]', ui.value));
            objSecurityPolicy["ConfigMinPasswordLength"] = ui.value;
        }
    });

    $("#lblMinPasswordLength").html((objSecurityPolicy["Security_Policy_MinPasswordLength_Text"]).replace('[ui_value]', $("#divMinPasswordLength").slider("value")));

    $('#lbtMinPasswordLength').click(function (event) {
        LoadDetail(objSecurityPolicy["Security_Policy_MinPasswordLength_Detail"]);

        event.preventDefault();
    });

    // Max password age
    $("#divMaxPasswordAge").slider({
        value: objSecurityPolicy["ConfigMaxPasswordAge"],
        min: 0,
        max: 180,
        step: 15,
        slide: function (event, ui) {
            $("#lblMaxPasswordAge").html((objSecurityPolicy["Security_Policy_MaxPasswordAge_Text"]).replace('[ui_value]', ui.value));
            objSecurityPolicy["ConfigMaxPasswordAge"] = ui.value;
        }
    });

    $("#lblMaxPasswordAge").html((objSecurityPolicy["Security_Policy_MaxPasswordAge_Text"]).replace('[ui_value]', $("#divMaxPasswordAge").slider("value")));

    $('#lbtMaxPasswordAge').click(function (event) {
        LoadDetail(objSecurityPolicy["Security_Policy_MaxPasswordAge_Detail"]);

        event.preventDefault();
    });
    
    // Min password history
    $("#divMinPasswordHistory").slider({
        value: objSecurityPolicy["ConfigMinPasswordHistory"],
        min: 0,
        max: 12,
        step: 1,
        slide: function (event, ui) {
            $("#lblMinPasswordHistory").html((objSecurityPolicy["Security_Policy_MinPasswordHistory_Text"]).replace('[ui_value]', ui.value));
            objSecurityPolicy["ConfigMinPasswordHistory"] = ui.value;
        }
    });

    $("#lblMinPasswordHistory").html((objSecurityPolicy["Security_Policy_MinPasswordHistory_Text"]).replace('[ui_value]', $("#divMinPasswordHistory").slider("value")));

    $('#lbtMinPasswordHistory').click(function (event) {
        LoadDetail(objSecurityPolicy["Security_Policy_MinPasswordHistory_Detail"]);

        event.preventDefault();
    });

    // Max invalid attempts
    $("#divMaxInvalidAttempts").slider({
        value: objSecurityPolicy["ConfigMaxInvalidAttempts"],
        min: 2,
        max: 12,
        step: 1,
        slide: function (event, ui) {
            $("#lblMaxInvalidAttempts").html((objSecurityPolicy["Security_Policy_MaxInvalidAttempts_Text"]).replace('[ui_value]', ui.value));
            objSecurityPolicy["ConfigMaxInvalidAttempts"] = ui.value;
        }
    });

    $("#lblMaxInvalidAttempts").html((objSecurityPolicy["Security_Policy_MaxInvalidAttempts_Text"]).replace('[ui_value]', $("#divMaxInvalidAttempts").slider("value")));

    $('#lbtMaxInvalidAttempts').click(function (event) {
        LoadDetail(objSecurityPolicy["Security_Policy_MaxInvalidAttempts_Detail"]);

        event.preventDefault();
    });

    // Account lockout duration
    $("#divAccountLockoutDuration").slider({
        value: objSecurityPolicy["ConfigAccountLockoutDuration"],
        min: 5,
        max: 60,
        step: 5,
        slide: function (event, ui) {
            $("#lblAccountLockoutDuration").html((objSecurityPolicy["Security_Policy_AccountLockoutDuration_Text"]).replace('[ui_value]', ui.value));
            objSecurityPolicy["ConfigAccountLockoutDuration"] = ui.value;
        }
    });

    $("#lblAccountLockoutDuration").html((objSecurityPolicy["Security_Policy_AccountLockoutDuration_Text"]).replace('[ui_value]', $("#divAccountLockoutDuration").slider("value")));

    $('#lbtAccountLockoutDuration').click(function (event) {
        LoadDetail(objSecurityPolicy["Security_Policy_AccountLockoutDuration_Detail"]);

        event.preventDefault();
    });

    // Max forgot password requests per day
    $("#divMaxForgotPasswordRequestsPerDay").slider({
        value: objSecurityPolicy["ConfigMaxForgotPasswordRequestsPerDay"],
        min: 3,
        max: 12,
        step: 1,
        slide: function (event, ui) {
            $("#lblMaxForgotPasswordRequestsPerDay").html((objSecurityPolicy["Security_Policy_MaxForgotPasswordRequestsPerDay_Text"]).replace('[ui_value]', ui.value));
            objSecurityPolicy["ConfigMaxForgotPasswordRequestsPerDay"] = ui.value;
        }
    });

    $("#lblMaxForgotPasswordRequestsPerDay").html((objSecurityPolicy["Security_Policy_MaxForgotPasswordRequestsPerDay_Text"]).replace('[ui_value]', $("#divMaxForgotPasswordRequestsPerDay").slider("value")));

    $('#lbtMaxForgotPasswordRequestsPerDay').click(function (event) {
        LoadDetail(objSecurityPolicy["Security_Policy_MaxForgotPasswordRequestsPerDay_Detail"]);

        event.preventDefault();
    });

}

setTimeout(function () {
    $("#btnApplyPolicy").click(function () {
        $.ajax(
            {
                url: "/Administration/Panel/Handler/Control.ashx",
                data: {
                    action: "TypeOfUpdateConfiguration",
                    config: objSecurityPolicy.toSecurityList(),
                    rand: new Date().getTime()
                },
                success: function (xml) {
                    //Alerta o usuário do evento
                    LocalMessage('success', objSecurityPolicy["Security_Policy_Success_Title"], objSecurityPolicy["Security_Policy_Success_Message"]);

                },
                error: function (response) {
                    //Armazena a mensagem de erro
                    lastErrorMessage = response.responseText;

                    //Alerta o usuário do evento
                    LocalMessage('error', objSecurityPolicy["Security_Policy_Error_Title"], "<a href='#' style='color:red' onclick=\"ErrorLocalMessage();\">" + response.statusText + "</a> - " + objSecurityPolicy["Security_Policy_Error_Message"]);
                }
            });
    });
}, 500);

setTimeout(function () {
    $("#lbtLogIn").click(function () {
        var blnValid = true;

        //Verifica se a senha e a confirmação são iguais
        if ($('input[name*="txtLogin"]').val().length == 0 || $('input[name*="txtPassword"]').val().length == 0) {
            LocalMessage('error', objSecurityPolicy["Security_Policy_Error_Authentication_Title"], objSecurityPolicy["Security_Policy_Login_Error_MandatoryFields"]);

            //Interrompe o método
            blnValid = false;
        }

        if (blnValid) {

            $.ajax(
            {
                url: "/Administration/Security/Handler/SecurityPolicy.ashx",
                data: {
                    action: "TypeOfLogIn",
                    login: $('input[name*="txtLogin"]').val(),
                    password: $('input[name*="txtPassword"]').val(),
                    rand: new Date().getTime()
                },
                success: function (response) {
                    if (response == "success") {
                        document.location.href = $('input[name*="hdfReturnUrl"]').val();
                    }
                    else {
                        LocalMessage('error', objSecurityPolicy["Security_Policy_Error_Authentication_Title"], response);
                    }
                },
                error: function (response) {
                    //Armazena a mensagem de erro
                    lastErrorMessage = response.responseText;

                    //Alerta o usuário do evento
                    LocalMessage('error', objSecurityPolicy["Security_Policy_Error_Authentication_Title"], response.responseText);
                }
            });
        }
    });
}, 500);

var l = setTimeout("LoadSecurityPolicy();", 500);
