﻿/// <reference path="Common.js" />
/// <reference path="ElementStyles.js" />
/// <reference path="messages.js" />
/// <reference path="Messages_en.js" />

/************************************************************************  
VARS
**************************************************************************/
var isResetDialogVisible = false;

/************************************************************************ 
Page Element Enums
**************************************************************************/
var SignInPageElements =
{
    //Sign In Elements
    DivLoginError: 'divLoginError',

    //Forgot Password Dialog Elements
    DlgChangePasswordBehavior: 'dlgChangePasswordBehavior',
    DivChangePasswordError: 'divChangePasswordError',

    // Step 1 Elements  (User Name)
    DivVerifyUserName: 'divVerifyUserName',
    TxtChangePasswordUserName: 'txtChangePasswordUserName',

    // Step 2 Elements (Verify Answer)
    DivVerifyAnswer: 'divVerifyAnswer',
    LblUserName: 'lblUserName',
    LblSecretQuestion: 'lblSecretQuestion',
    TxtSecretAnswer: 'txtSecretAnswer',

    // Step 3 Elements (New Password and Persistence)
    DivVerifyConfirm: 'divVerifyConfirm',
    TxtNewPassword: 'txtNewPassword',
    TxtVerifyPassword: 'txtVerifyPassword',

    // Dialog Buttons
    BtnCancel: 'btnCancel',
    BtnBack: 'btnBack',
    BtnNext: 'btnNext',
    BtnVerify: 'btnVerify',
    BtnConfirm: 'btnConfirm',
    BtnValidate: 'btnValidate',

    // Image Controls
    TimgBack: 'toggleResetPasswordBack'
};

/************************************************************************ 
Functions  
**************************************************************************/
$().ready(function(){
    if ( $.browser.msie )
    {
        try
        {
            //for corner rounding....
            $('.container').corner("bottom 10px");
        }
        catch(e){}
    }
});

function pageLoad()
{
    if (serverSideError.length > 0)
    {
        var problems = new Array();
        problems[problems.length] = serverSideError;
        setErrorInformation($get(SignInPageElements.DivLoginError), problems);
    }
    else
    {
        hideContent($get(SignInPageElements.DivLoginError));
    }

    performPostLoadOperations();
}


/*========================================================================

=========================================================================*/

function signIn(e)
{
    evt = e || window.event;
    if (evt.keyCode == 13)
    {
        validateSignIn();
    }

}

function validateSignIn() {

    if (isResetDialogVisible) {
        return false;
    }
    
    hideContent(divError);
    
    showWaitDialog(InformationMessages.SignIn);

    var userName = getElementText($get(SignInControlElements.TxtUserName), true);
    var password = getElementText($get(SignInControlElements.TxtPassword));
    var btnSignin = $get(SignInControlElements.BtnSignin);
    var retValue = false;
    var divError = $get(SignInPageElements.DivLoginError);
    var problems = new Array();

    if (userName.length == 0)
    {
        retValue = false;
        problems[problems.length] = ErrorMessages.UserNameRequired;
    }
    else
    {
        retValue = true
    }

    if (password.length == 0)
    {
        retValue = false;
        problems[problems.length] = ErrorMessages.PasswordRequired;
    }

    if (!retValue) 
    {
        hideWaitDialog();
        setErrorInformation($get(SignInPageElements.DivLoginError), problems);
        return false;
    }

    if (retValue)
    {
        __doPostBack(btnSignin.id, '');
    }
}


/*========================================================================

=========================================================================*/
function changePasswordDialog()
{
    isResetDialogVisible = true;

    setElementText($get(SignInPageElements.TxtChangePasswordUserName), '');
    setElementText($get(SignInPageElements.TxtSecretAnswer), '');
    setElementText($get(SignInPageElements.TxtNewPassword), '');
    setElementText($get(SignInPageElements.TxtVerifyPassword), '');

    hideContent($get(SignInPageElements.DivChangePasswordError));

    jumpToStep(SignInPageElements.DivVerifyUserName);

    showModalPopup($find(SignInPageElements.DlgChangePasswordBehavior));

    //set focus on the username field
    $get(SignInPageElements.TxtChangePasswordUserName).focus();
}


function onUserSecurityDataError(result)
{
    hideWaitDialog();
    showContent($get(SignInPageElements.DivChangePasswordError));

    var problems = new Array();
    problems[problems.length] = result.get_message();
    setErrorInformation($get(SignInPageElements.DivChangePasswordError), problems);
}


/*========================================================================

=========================================================================*/
function validateSecretAnswer()
{
    var secretAnswer = getElementText($get(SignInPageElements.TxtSecretAnswer), true);
    var userName = getElementText($get(SignInPageElements.TxtChangePasswordUserName), true);

    if (secretAnswer.length == 0)
    {
        showContent($get(SignInPageElements.DivChangePasswordError));

        var problems = new Array();
        problems[problems.length] = ErrorMessages.InvalidSecretAnswer;
        setErrorInformation($get(SignInPageElements.DivChangePasswordError), problems);
    }
    else
    {
        hideContent($get(SignInPageElements.DivChangePasswordError));
        validateSecretAnswerUsingService(userName, secretAnswer);
    }
}

function validateSecretAnswerUsingService(userName, secretAnswer)
{
    showWaitDialog(InformationMessages.ValidatingAnswerToSecretQuestion);
    UserAccountUIService.ValidateSecretAnswer(userName, secretAnswer, onValidateSecretAnswerComplete, onValidateSecretAnswerError);
}

function onValidateSecretAnswerComplete(result)
{
    if (result == true)
    {
        jumpToStep(SignInPageElements.DivVerifyConfirm);

        $get(SignInPageElements.TxtNewPassword).focus();

    }
    else
    {
        showContent($get(SignInPageElements.DivChangePasswordError));

        var problems = new Array();
        problems[problems.length] = ErrorMessages.IncorrectSecretAnswer;
        setErrorInformation($get(SignInPageElements.DivChangePasswordError), problems);
    }

    hideWaitDialog();
}

function onValidateSecretAnswerError(result)
{
    hideWaitDialog();

    showContent($get(SignInPageElements.DivChangePasswordError));

    var problems = new Array();
    problems[problems.length] = result.get_message();
    setErrorInformation($get(SignInPageElements.DivChangePasswordError), problems);
}

/*========================================================================

=========================================================================*/
function changePassword()
{
    var password = getElementText($get(SignInPageElements.TxtNewPassword), true);
    var verifypassword = getElementText($get(SignInPageElements.TxtVerifyPassword), true);

    var errorMessage = '';

    if (password != verifypassword)
    {
        errorMessage = ErrorMessages.PasswordsNotMatching;
        $get(SignInPageElements.TxtNewPassword).className = TextStyles.Error;
        $get(SignInPageElements.TxtVerifyPassword).className = TextStyles.Error;
    }
    else
    {
        var retValue = RegularExpressions.UserPassword.test(password);

        if (retValue != true)
        {
            errorMessage = ErrorMessages.PasswordRequirementsNotMet;
            $get(SignInPageElements.TxtNewPassword).className = TextStyles.Error;
            $get(SignInPageElements.TxtVerifyPassword).className = TextStyles.Error;
        }
        else
        {
            $get(SignInPageElements.TxtNewPassword).className = TextStyles.Blank;
            $get(SignInPageElements.TxtVerifyPassword).className = TextStyles.Blank;
        }
    }

    if (errorMessage != '')
    {
        showContent($get(SignInPageElements.DivChangePasswordError));

        var problems = new Array();
        problems[problems.length] = errorMessage;
        setErrorInformation($get(SignInPageElements.DivChangePasswordError), problems);
    }
    else
    {
        hideContent($get(SignInPageElements.DivChangePasswordError));

        changePasswordUsingService(getElementText($get(SignInPageElements.TxtChangePasswordUserName), true), password, getElementText($get(SignInPageElements.LblSecretQuestion)), getElementText($get(SignInPageElements.TxtSecretAnswer), true));
    }
}

function changePasswordUsingService(userName, password, secretQuestion, secretAnswer)
{
    showWaitDialog(InformationMessages.UpdatingPassword);
    UserAccountUIService.ChangePassword(userName, password, secretQuestion, secretAnswer, onChangePasswordComplete, onChangePasswordError);
}

function onChangePasswordComplete(result)
{
    closeChangePasswordDialog();
    hideWaitDialog();
    showSuccessAlert(InformationMessages.ResetPasswordSuccessful);
}

function onChangePasswordError(result)
{
    showContent($get(SignInPageElements.DivChangePasswordError));

    var problems = new Array();
    problems[problems.length] = result.get_message();
    setErrorInformation($get(SignInPageElements.DivChangePasswordError), problems);

    hideWaitDialog();
}

/*========================================================================

=========================================================================*/
function closeChangePasswordDialog()
{
    $find(SignInPageElements.DlgChangePasswordBehavior).hide();
    isResetDialogVisible = false;
}

/*========================================================================

=========================================================================*/
function validateUserName()
{
    var retValue = true;

    var userName = getElementText($get(SignInPageElements.TxtChangePasswordUserName), true);

    setElementText($get(SignInPageElements.TxtChangePasswordUserName), userName);

//    retValue = RegularExpressions.Email.test(userName);

    if (retValue != true)
    {
        var problems = new Array();
        problems[problems.length] = ErrorMessages.InvalidEmailAddress;
        setErrorInformation($get(SignInPageElements.DivChangePasswordError), problems);
    }
    else
    {
        getResetLoginCredentialsUsingService(userName);
    }
}

function getResetLoginCredentialsUsingService(userName)
{
    showWaitDialog(InformationMessages.ValidatingUserName);
    UserAccountUIService.GetResetLoginCredentials(userName, onGetResetLoginCredentialsComplete, onUserSecurityDataError);
}

function onGetResetLoginCredentialsComplete(strLoginCredential)
{
    var secretQuestion = strLoginCredential;

    if (secretQuestion == null || secretQuestion.length == 0)
    {
        showContent($get(SignInPageElements.DivChangePasswordError));

        var problems = new Array();
        problems[problems.length] = ErrorMessages.UserNotFound;
        setErrorInformation($get(SignInPageElements.DivChangePasswordError), problems);

        hideWaitDialog();
        return;
    }

    setElementText($get(SignInPageElements.LblUserName), getElementText($get(SignInPageElements.TxtChangePasswordUserName), true));
    setElementText($get(SignInPageElements.LblSecretQuestion), strLoginCredential);

    jumpToStep(SignInPageElements.DivVerifyAnswer);
    $get(SignInPageElements.TxtSecretAnswer).focus();


    hideWaitDialog();
}


/*****************************************************************************
Common Functions
******************************************************************************/
function jumpToStep(element)
{
    var steps =
	    [
	        SignInPageElements.DivVerifyUserName,
	        SignInPageElements.DivVerifyAnswer,
	        SignInPageElements.DivVerifyConfirm,
	        SignInPageElements.DivChangePasswordError
	    ];

    for (i = 0; i < steps.length; i++)
    {
        hideContent($get(steps[i]));
    }

    showContent($get(element));

    var backButtonElement = $get(SignInPageElements.BtnBack);
    var nextButtonElement = $get(SignInPageElements.BtnNext);
    var verifyButtonElement = $get(SignInPageElements.BtnVerify);
    var confirmButtonElement = $get(SignInPageElements.BtnConfirm);
    var validateButtonElement = $get(SignInPageElements.BtnValidate);

    hideContent(backButtonElement);
    hideContent(nextButtonElement);
    hideContent(verifyButtonElement);
    hideContent(confirmButtonElement);
    hideContent(validateButtonElement);

    switch (element)
    {
        case SignInPageElements.DivVerifyUserName:
            inlineContent(backButtonElement);
            backButtonElement.disabled = true;

            disableButton(SignInPageElements.BtnBack, SignInPageElements.TimgBack);

            inlineContent(nextButtonElement);
            nextButtonElement.onclick = validateUserName;

            break;
        case SignInPageElements.DivVerifyAnswer:
            inlineContent(backButtonElement);
            backButtonElement.disabled = false;
            backButtonElement.onclick = gotoStepVerifyUserName;

            enableButton(SignInPageElements.BtnBack, SignInPageElements.TimgBack);
            inlineContent(verifyButtonElement);

            break;
        default:
            inlineContent(confirmButtonElement);
            confirmButtonElement.onclick = changePassword;
    }
}

// These "goto" functions are needed in order to change the onclick function of the next and back button
// dynamically depending on what step of the reset login credentials.  You cannot add a parameter
// to a javascript function that is being programmatically assigned to an event (it will actually 
// execute the function instead).
function gotoStepVerifyUserName()
{
    jumpToStep(SignInPageElements.DivVerifyUserName);
}
