Type.registerNamespace('Devy.UI');

Devy.UI.UsersLogin = function () {
    Devy.UI.UsersLogin.initializeBase(this);

    //Miembros
    this._Container = null;

    this._RedirectTo = "";
    this._LinkLoginUrl = "";
    this._ChangeAvatarUrl = "";
    this._ChangePasswordUrl = "";

    this._Authenticated = false;

    this._DontRenderForm = false;

    this._AuthenticatedUserName = "";
    this._AuthenticatedUserFullName = "";
    this._AuthenticatedUserAvatarUrl = "";
    this._AuthenticatedUserRoles = "";

    this._UserRegistrationLinkUrl = "";
    this._UserRegistrationLinkText = "Registrarme";

    this._UserPasswordRecoveryLinkUrl = "";
    this._UserPasswordRecoveryLinkText = "Recordar mi contraseña";

    this._UserAccountEditLinkUrl = "";
    this._UserAccountEditLinkText = "Mi perfil";


    this._AuthenticatedPanelJQ = null;
    this._NonAuthenticatedPanelJQ = null;

    this._cmdLogin = null;

    this._txtUserName = null;
    this._txtPassword = null;
    this._chkRememberMe = null;

    this._cmdLogout = null;

    this._events = null;
}

Devy.UI.UsersLogin.prototype = {
    //*********************************************************************
    //Publicos
    set_Container: function (value) { this._Container = value; },
    get_Container: function () { return this._Container; },

    set_RedirectTo: function (value) { this._RedirectTo = value; },
    get_RedirectTo: function () { return this._RedirectTo; },

    set_Authenticated: function (value) { this._Authenticated = value; },
    get_Authenticated: function () { return this._Authenticated; },

    set_LinkLoginUrl: function (value) { this._LinkLoginUrl = value; },
    get_LinkLoginUrl: function () { return this._LinkLoginUrl; },

    set_ChangeAvatarUrl: function (value) { this._ChangeAvatarUrl = value; },
    get_ChangeAvatarUrl: function () { return this._ChangeAvatarUrl; },

    set_ChangePasswordUrl: function (value) { this._ChangePasswordUrl = value; },
    get_ChangePasswordUrl: function () { return this._ChangePasswordUrl; },

    set_DontRenderForm: function (value) { this._DontRenderForm = value; },
    get_DontRenderForm: function () { return this._DontRenderForm; },

    set_UserRegistrationLinkUrl: function (value) { this._UserRegistrationLinkUrl = value; },
    get_UserRegistrationLinkUrl: function () { return this._UserRegistrationLinkUrl; },
    set_UserRegistrationLinkText: function (value) { if (value) this._UserRegistrationLinkText = value; },
    get_UserRegistrationLinkText: function () { return this._UserRegistrationLinkText; },

    set_UserPasswordRecoveryLinkUrl: function (value) { this._UserPasswordRecoveryLinkUrl = value; },
    get_UserPasswordRecoveryLinkUrl: function () { return this._UserPasswordRecoveryLinkUrl; },
    set_UserPasswordRecoveryLinkText: function (value) { if (value) this._UserPasswordRecoveryLinkText = value; },
    get_UserPasswordRecoveryLinkText: function () { return this._UserPasswordRecoveryLinkText; },

    set_UserAccountEditLinkUrl: function (value) { this._UserAccountEditLinkUrl = value; },
    get_UserAccountEditLinkUrl: function () { return this._UserAccountEditLinkUrl; },
    set_UserAccountEditLinkText: function (value) { this._UserAccountEditLinkText = value; },
    get_UserAccountEditLinkText: function () { return this._UserAccountEditLinkText; },


    set_AuthenticatedUserName: function (value) { this._AuthenticatedUserName = value; },
    get_AuthenticatedUserName: function () { return this._AuthenticatedUserName; },

    set_AuthenticatedUserFullName: function (value) { this._AuthenticatedUserFullName = value; },
    get_AuthenticatedUserFullName: function () { return this._AuthenticatedUserFullName; },

    set_AuthenticatedUserAvatarUrl: function (value) { this._AuthenticatedUserAvatarUrl = value; },
    get_AuthenticatedUserAvatarUrl: function () { return this._AuthenticatedUserAvatarUrl; },

    set_AuthenticatedUserRoles: function (value) { this._AuthenticatedUserRoles = value; },
    get_AuthenticatedUserRoles: function () { return this._AuthenticatedUserRoles; },

    initialize: function () {
        Devy.UI.UsersLogin.callBaseMethod(this, 'initialize');

        this._initInterface();

        this._atachEvents();
    },

    dispose: function () {
        this._detachEvents();

        Devy.UI.UsersLogin.callBaseMethod(this, 'dispose');
    },

    _atachEvents: function () {
        var contexto = this;

        if (this._cmdLogin) {
            $addHandler(this._cmdLogin, "click", function (evt) {
                evt.preventDefault();
                contexto._Login();
            });
        }

        if (this._cmdLogout) {
            $addHandler(this._cmdLogout, "click", function (evt) {
                evt.preventDefault();
                contexto._Logout();
            });
        }

        if (this._txtPassword) {
            $addHandler(this._txtPassword, "keydown", function (evt) {
                if (evt.keyCode == 13)
                    contexto._Login();
            });
        }
    },

    _detachEvents: function () {
        if (this._cmdLogin)
            $clearHandlers(this._cmdLogin);

        if (this._cmdLogout)
            $clearHandlers(this._cmdLogout);

        if (this._txtPassword)
            $clearHandlers(this._txtPassword);
    },

    //*********************************************************************
    //Mis eventos    
    get_events: function () {
        if (!this._events) {
            this._events = new Sys.EventHandlerList();
        }
        return this._events;
    },
    add_SuccessfulLogin: function (handler) {
        this.get_events().addHandler('SuccessfulLogin', handler);
    },
    remove_SuccessfulLogin: function (handler) {
        this.get_events().removeHandler('SuccessfulLogin', handler);
    },
    add_SuccessfulLogout: function (handler) {
        this.get_events().addHandler('SuccessfulLogout', handler);
    },
    remove_SuccessfulLogout: function (handler) {
        this.get_events().removeHandler('SuccessfulLogout', handler);
    },
    _raiseEvent: function (eventName, eventArgs) {
        var handler = this.get_events().getHandler(eventName);

        var theEventArgs = null;
        if (handler) {
            if (!eventArgs) {
                theEventArgs = Sys.EventArgs.Empty;
            }
            else {
                theEventArgs = eventArgs;
            }

            handler(this, theEventArgs);
        }
    },



    _initInterface: function () {
        if (this._Authenticated)
            this._initAuthenticatedPanel();
        else
            this._initNonAuthenticatedPanel();
    },

    _initAuthenticatedPanel: function () {
        this._AuthenticatedPanelJQ = $('<div class="Panel Authenticated"></div>');

        //Vista de usuario
        if (this._AuthenticatedUserAvatarUrl) {
            this._AuthenticatedPanelJQ.append('<img src="' + this._AuthenticatedUserAvatarUrl + '" class="Avatar" />');
        }
        this._AuthenticatedPanelJQ.append('<a class="Command ChangeAvatar" href="' + this._ChangeAvatarUrl + '"><span></span></a>');

        this._AuthenticatedPanelJQ.append('<p class="UserName">' + this._AuthenticatedUserFullName + ' (' + this._AuthenticatedUserName + ')' + '</p>');
        this._AuthenticatedPanelJQ.append('<p class="UserRoles">' + this._AuthenticatedUserRoles + '</p>');

        this._cmdLogout = $('<a title="Cerrar sesión" class="Command Logout" href="#"><span>Logout</span></a>')[0];
        this._AuthenticatedPanelJQ.append(this._cmdLogout);

        if (this._UserAccountEditLinkUrl)
            this._AuthenticatedPanelJQ.append('<a href="' + this._UserAccountEditLinkUrl + '" class="Link UserAccountEdit"><span>' + this._UserAccountEditLinkText + '</span></a>');

        this._AuthenticatedPanelJQ.append('<a href="' + this._ChangePasswordUrl + '" class="Link ChangePassword"><span>Cambiar Contraseña</span></a>');

        //Finalmente...
        $(this._Container).append(this._AuthenticatedPanelJQ);
    },

    _initNonAuthenticatedPanel: function () {
        this._NonAuthenticatedPanelJQ = $('<div class="Panel NonAuthenticated"></div>');

        if (this._DontRenderForm) {
            this._NonAuthenticatedPanelJQ.append('<a href="' + this._LinkLoginUrl + '" class="Link Login NoForm"><span>Login</span></a>');
        }
        else {
            this._NonAuthenticatedPanelJQ.append('<label for="LoginCtrlFrm_txtUserName" id="LoginCtrlFrm_txtUserName_Label">Usuario</label>');
            this._txtUserName = $('<input type="text" id="LoginCtrlFrm_txtUserName" class="Textbox UserName"></input>')[0];
            this._NonAuthenticatedPanelJQ.append(this._txtUserName);

            this._NonAuthenticatedPanelJQ.append('<label for="LoginCtrlFrm_txtPassword" id="LoginCtrlFrm_txtPassword_Label">Contraseña</label>');
            this._txtPassword = $('<input type="password" id="LoginCtrlFrm_txtPassword" class="Textbox Password"></input>')[0];
            this._NonAuthenticatedPanelJQ.append(this._txtPassword);

            this._NonAuthenticatedPanelJQ.append('<label for="LoginCtrlFrm_chkRememberMe" id="LoginCtrlFrm_chkRememberMe_Label">Recordar mi contraseña</label>');
            this._chkRememberMe = $('<input type="checkbox" id="LoginCtrlFrm_chkRememberMe" class="Checkbox RememberMe"></input>')[0];
            this._NonAuthenticatedPanelJQ.append(this._chkRememberMe);
            this._NonAuthenticatedPanelJQ.append('<em id="LoginCtrlFrm_chkRememberMe_Warning">No recomendado para equipos públicos</em>');

            this._cmdLogin = $('<a title="Iniciar sesión" class="Command Login" href="#"><span>Login</span></a>')[0];
            this._NonAuthenticatedPanelJQ.append(this._cmdLogin);
        }

        if (this._UserRegistrationLinkUrl)
            this._NonAuthenticatedPanelJQ.append('<a href="' + this._UserRegistrationLinkUrl + '" class="Link UserRegistration"><span>' + this._UserRegistrationLinkText + '</span></a>');

        if (this._UserPasswordRecoveryLinkUrl)
            this._NonAuthenticatedPanelJQ.append('<a href="' + this._UserPasswordRecoveryLinkUrl + '" class="Link UserPasswordRecovery"><span>' + this._UserPasswordRecoveryLinkText + '</span></a>');

        //Finalmente...
        $(this._Container).append(this._NonAuthenticatedPanelJQ);
    },

    _Login: function () {
        var userName = this._txtUserName.value;
        var userPass = this._txtPassword.value;
        var rememberMe = this._chkRememberMe.checked;

        //Validamos
        if (!userName) {
            Devy.Notifications.ShowError("Error", "Debe ingresar un nombre de usuario");
            $(this._txtUserName).focus();
            return;
        }

        if (!userPass) {
            Devy.Notifications.ShowError("Error", "Debe ingresar una contraseña");
            $(this._txtPassword).focus();
            return;
        }

        //Invocamos el servicio
        var ServiceData = new Array();
        ServiceData.Requester = this;
        ServiceData.Login = true;

        Devy.UI.MembershipService.Login(userName, userPass, rememberMe,
                    this._onMembershipServerSuccess, this._onMembershipServerError, ServiceData);

    },

    _Logout: function () {
        //Invocamos el servicio
        var ServiceData = new Array();
        ServiceData.Requester = this;
        ServiceData.Logout = true;

        Devy.UI.MembershipService.Logout(this._onMembershipServerSuccess, this._onMembershipServerError, ServiceData);
    },

    _onMembershipServerSuccess: function (result, context, methodName) {
        if (context.Login && !result) {
            Devy.Notifications.ShowError("Error de inicio de sesión", "Nombre de usuario o contraseña incorrecta");

            if (context.Requester._txtPassword) $(context.Requester._txtPassword).focus();
        }
        else {
            context.Requester._Authenticated = result;

            if (result)
                context.Requester._raiseEvent("SuccessfulLogin");
            else
                context.Requester._raiseEvent("SuccessfulLogout");

            if (context.Requester._RedirectTo) {
                window.location = context.Requester._RedirectTo;
            }
        }
    },

    _onMembershipServerError: function (error, context, methodName) {
        Devy.Notifications.ShowError("Error en el sistema de cuentas de usuario",
        "Ocurrió un error inesperado al intentar procesar su petición");
    }
}


Devy.UI.UsersLogin.registerClass('Devy.UI.UsersLogin', Sys.Component);

