/*
 * @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: 'Clear',
            handler: function() { doClear() }
        }]
    });

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

    // private functions
    var doClear = function(){
        loginform.getForm().reset();
    };

    var doSubmit = function() {
        loginform.getForm().submit({
            url: '/auth/login',
            params: { page: myPage.name },
            success: function(form, action) { doSuccess(form, action) },
            failure: function(form, action) { doFailure(form, action) },
            waitMsg:'Processing...'
        });
    };

    var doSuccess = function(form, action){
        form.reset();
        win.hide();
        //login.loggedin = true;
        //updateButton(action);
        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() {
        win.show();
        var fld = Ext.get('user_field');
        fld.focus.defer(1, fld);
    };

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

        // public methods
        init: function() {
            return;
        },

        render: function() {
            if(!this.loggedin) {
                raiseloginwin();
            } else {
                Ext.MessageBox.confirm(
                    'Confirm...', 'Are you sure you want to Sign Out...',
                    function(btn) {
                        if(btn == 'yes') doLogout();
                    }
                );
            }
        }

    };
}();
