/*
 * @category Java Script Module Pattern
 * @version $Rev$
 * @author Joel Bair <joelb@baseltd.biz>
 *
 */

// reference local blank image
Ext.BLANK_IMAGE_URL = '../extjs/resources/images/default/s.gif';

// create namespace
Ext.namespace('login');

// create application
login = function() {
    // do NOT access DOM from here; elements don't exist yet

    // private variables
    var loginform = new Ext.FormPanel({
        id: 'login_form',
        baseCls: 'x-plain',
        bodyStyle:'padding: 15px',
        frame: false,
        monitorValid: true,
        defaultType: 'textfield',
        items: [{
                id: 'user_field',
                fieldLabel: 'Username',
                name: 'username',
                allowBlank:false
        },{
                id: 'passwd_field',
                fieldLabel: 'Password',
                name: 'passwd',
                allowBlank:false,
                inputType: 'password'
        }],
        keys: [{
                key: Ext.EventObject.ENTER,
                fn: function() { doSubmit(); }
        }],
        buttons: [{
            text: 'Login',
            formBind:true,
            handler: function() { doSubmit(); }
        },{
            text: 'Cancel',
            handler: function() { loginform.getForm().reset(); win.hide(); }
        }]
    });

    var win = new Ext.Window({
        id: 'login-win',
        title: 'Secure Sign-On... / Log-In...',
        layout: 'fit',
        width: 350,
        height: 150,
        closeAction: 'hide',
        hidden: true,
        bodyStyle: "background-color: #D3D3D3",
        items: loginform
    });

    win.on('show', function(){
        Ext.getCmp('user_field').focus(null, 10);
    });

    // private functions
    var doSubmit = function() {
        var form = loginform.getForm();

        var passfld = Ext.getCmp('passwd_field');
        var origpass = passfld.getValue();
        passfld.setRawValue(utils.encodeString(origpass));

        var userfld = Ext.getCmp('user_field');
        var origuser = userfld.getValue();
        userfld.setRawValue(utils.encodeString(origuser));

        form.submit({
            url: '/auth/login',
            timeout: 300,
            params: { page: myPage.name },
            success: function(form, action) { doSuccess(form, action); },
            failure: function(form, action) {
                userfld.setValue(origuser);
                passfld.setValue(origpass);
                doFailure(form, action);
            },
            waitMsg:'Processing...'
        });
    };

    var doSuccess = function(form, action){
        form.reset();
        win.hide();
        window.location="";
    };

    var updateButton = function(action) {
        var button = Ext.get('btn-signon');
        var label = Ext.get('present-user');
        if(login.loggedin) {
            button.update('<div class="ntext"> Sign Off </div>');
            label.update('logged in as ( '+action.result.name+' )');
        } else {
            button.update('<div class="ntext"> Sign On </div>');
            label.update('');
        }
    };

    var doFailure = function(form, action){
        Ext.Msg.show({
            title: 'Failure...',
            msg: action.result.errorMessage,
            modal: true,
            buttons: Ext.Msg.OK,
            icon: Ext.MessageBox.ERROR
        });
    };

    var doLogout = function(){
        Ext.Ajax.request({
            url: '/auth/logout',
            success: function(o){
                if(Ext.decode(o.responseText).success){
                    window.location="";
                }
            },
            failure: function(){
                Ext.MessageBox.alert('Error', 'Server connection broken.');
            },
            scope: this
        });
    };

    var raiseloginwin = function(t) {
        win.setAnimateTarget(t);
        win.show();
    };

    // public space
    return {
        // public properties, e.g. strings to translate
        // methods and varibles defined in here always preface w/ "this."
        loggedin: false,
        username: '',

        // public methods
        init: function() {
            if(!this.loggedin) {
                var button = Ext.get('nav-menu').insertHtml('beforeEnd','<div class="navbutton" id="btn-signon"> <div class="ntext">Sign On | Log In</div></div>',true);
            } else {
                var button = Ext.get('nav-menu').insertHtml('beforeEnd','<div class="navbutton" id="btn-signoff"> <div class="ntext">Sign Out | Log Off</div></div>',true);
            }
            button.removeAllListeners();
            button.on('click', function(event, target, options){
                login.render(target);
            });
            win.render(Ext.getBody());
        },

        render: function(target) {
            if(!this.loggedin) {
                raiseloginwin(target);
            } else {
                Ext.Msg.show({
                    title:'Log Off?',
                    msg: 'Are you sure you want to Sign Out?',
                    buttons: Ext.Msg.OKCANCEL,
                    fn: function(btn) {
                        if(btn == 'yes' || btn == 'ok') { doLogout(); }
                    },
                    animEl: target,
                    icon: Ext.MessageBox.QUESTION
                 });
            }
        }

    };
}();
