﻿///<reference path="Extjs_Intellisense.js" />
Ext.namespace('LUL.Admin');

var RIGHTS_ADMIN = 1;
var RIGHTS_USER = 2;
var RIGHTS_GUEST = 3;
var RIGHTS_USE_USERS = -2;
var RIGHTS_ALL_USERS = -1;

var loadedExternalFiles = [];

function loadExternalFile(filename, filetype) {
    // ladda bara om vi inte redan gjort det...
    if (loadedExternalFiles.indexOf(filename) == -1) {
        loadedExternalFiles.push(filename);
        
        if (filetype == "js") { //if filename is a external JavaScript file
            var fileref = document.createElement('script')
            fileref.setAttribute("type", "text/javascript")
            fileref.setAttribute("src", filename)
        }
        else if (filetype == "css") { //if filename is an external CSS file
            var fileref = document.createElement("link")
            fileref.setAttribute("rel", "stylesheet")
            fileref.setAttribute("type", "text/css")
            fileref.setAttribute("href", filename)
        }
        if (typeof fileref != "undefined")
            document.getElementsByTagName("head")[0].appendChild(fileref);
        return false;
    }
    return true;
}

LUL.LoginManager = function() {
    this.addEvents(
        'loggedIn',
        'loggedOut'
    );    
}

Ext.extend(LUL.LoginManager, Ext.util.Observable, {
    loggedIn: false,
    pageRights: 0,
    globalRights: 0,
    username: '',
    reload: false,

    init: function() {
        if (Ext.get('login')) Ext.get('login').on('click', this.toggleLogin, this);
        this.on('loggedIn', this.onLoggedIn, this);
        this.on('loggedOut', this.onLoggedOut, this);
        this.checkStatus();
    },

    editAllowed: function() {
        return (this.pageRights == RIGHTS_ADMIN || this.globalRights == RIGHTS_ADMIN || this.pageRights == RIGHTS_USER);
    },

    toggleLogin: function() {
        if (this.loggedIn)
            this.logout();
        else
            this.login();
    },

    login: function() {

        // ladda css
        var alreadyLoaded = loadExternalFile('Lib/ext-2.2/resources/css/ext-all.css', 'css');
        loadExternalFile('Lib/Admin.css', 'css');

        var delayCall = new Ext.util.DelayedTask(function() {

            var focusInterval;
            var username = new Ext.form.TextField({ xtype: 'textfield', fieldLabel: 'Användarnamn', name: 'username', id: 'username', allowBlank: false, msgTarget: 'under', anchor: '100%' });
            username.on('focus', function() {
                clearInterval(focusInterval);
            });

            var form = new Ext.form.FormPanel({
                url: dataManager.loginURL,
                bodyStyle: 'padding: 10px',
                border: false,
                labelAlign: 'top',
                items: [
                    username,
                    { xtype: 'textfield', fieldLabel: 'Lösenord', name: 'password', id: 'password', inputType: 'password', allowBlank: false, msgTarget: 'under', anchor: '100%' }
                ],
                keys: [
                    { key: Ext.EventObject.ENTER, fn: function() { form.form.submit(); } }
                ],
                bbar: new Ext.StatusBar({
                    text: '',
                    items: [
                        { text: 'Logga in', iconCls: 'icon-ok', handler: function() { form.form.submit() } },
                        { text: 'Avbryt', iconCls: 'icon-cancel', handler: function() { win.close() } }
                    ]
                })
            });

            form.on('actioncomplete', onSubmitted, this);
            function onSubmitted(form, action) {
                if (action.type == 'submit') {
                    win.close();
                    this.loggedIn = true;
                    this.pageRights = action.result.pageRights;
                    this.globalRights = action.result.globalRights;
                    this.username = action.result.username;
                    this.reload = action.result.reload;
                    //this.keepAliveInterval = setInterval('loginModule.keepAlive()', 30000);
                    this.fireEvent('loggedIn');
                }
            }

            var win = new Ext.Window({
                title: 'Inloggning',
                width: 300,
                height: 200,
                modal: true,
                layout: 'fit',
                plain: true,
                resizable: false,
                items: form,
                hideBorders: true,
                focus: Ext.emptyFn // för att fokusering i textrutan ska fungera           
            });
            // sätt fokus på textrutan efter visning
            win.on('show', function() {
                // måste göra upprepade försök, är epa eftersom css laddas när man klickar på logga in
                focusInterval = setInterval('Ext.getCmp("username").focus()', 50);
            });

            win.show('login');
        }, this);

        delayCall.delay(alreadyLoaded ? 1 : 500);
    },

    logout: function() {
        Ext.Ajax.request({
            url: dataManager.logoutURL,
            success: function(result) {
                var res = Ext.util.JSON.decode(result.responseText);
                this.loggedIn = false;
                this.username = '';
                this.pageRights = 0;
                this.globalRights = 0;
                this.reload = res.reload;
                this.fireEvent('loggedOut');
            },
            scope: this
        });
    },

    checkStatus: function() {
        Ext.Ajax.request({
            url: dataManager.checkLoginStatusURL,
            success: function(result) {
                var res = Ext.util.JSON.decode(result.responseText);
                if (res.loggedIn) {
                    loadExternalFile('Lib/ext-2.2/resources/css/ext-all.css', 'css');
                    loadExternalFile('Lib/Admin.css', 'css');
                    this.loggedIn = true;
                    this.pageRights = res.pageRights;
                    this.globalRights = res.globalRights;
                    this.username = res.username;
                    this.fireEvent('loggedIn');
                }
            },
            scope: this
        });
    },

    onLoggedIn: function() {
        Ext.get('login').dom.innerHTML = 'Logga ut (' + loginManager.username + ')';
        // visa sånt som är dolt för ej inloggade
        Ext.select('.hiddenLoggedOut').setStyle('display', 'block');
        // ladda ev om (bara om sidan inte tillåts)
        if (this.reload) window.location.reload();
    },

    onLoggedOut: function() {
        Ext.get('login').dom.innerHTML = 'Logga in';
        // dölj sånt som inte ska visas för ej inloggade
        Ext.select('.hiddenLoggedOut').setStyle('display', 'none');
        // ladda ev om (bara om sidan inte tillåts)
        if (this.reload) window.location.reload();
    },

    fakeLogin: function() {
        Ext.Ajax.request({
            url: dataManager.loginURL,
            success: function(response, options) {
                var res = Ext.util.JSON.decode(response.responseText);
                if (res.success) {
                    loadExternalFile('Lib/ext-2.2/resources/css/ext-all.css', 'css');
                    loadExternalFile('Lib/Admin.css', 'css');
                    this.loggedIn = true;
                    this.username = 'admin';
                    this.pageRights = res.pageRights;
                    this.globalRights = res.globalRights;
                    this.fireEvent('loggedIn');
                }
            },
            scope: this,
            params: { username: 'admin', password: 'luladmin' }
            //            params: { username: 'guest', password: 'guest' }
        });
    },

    // visar ett fönster där användaren får verifiera sitt lösenord
    // t.ex. för att tillåtas öppna administrationen
    verifyPassword: function(animFrom, callback) {
        var password = new Ext.form.TextField({ fieldLabel: 'Lösenord', name: 'password', id: 'password', inputType: 'password', allowBlank: false, msgTarget: 'under', anchor: '100%' });

        // formulär med lösenordsruta
        var form = new Ext.form.FormPanel({
            url: dataManager.verifyPasswordURL,
            bodyStyle: 'padding: 10px',
            border: false,
            labelAlign: 'top',
            items: [
              password
            ],
            keys: [
                { key: Ext.EventObject.ENTER, fn: function() { form.form.submit(); } }
            ],
            bbar: new Ext.StatusBar({
                text: '',
                items: [
                    { text: 'Logga in', iconCls: 'icon-ok', handler: function() { form.form.submit() } },
                    { text: 'Avbryt', iconCls: 'icon-cancel', handler: function() { win.close() } }
                ]
            })
        });

        // anropas när lösenordet har godkännts
        form.on('actioncomplete', function(form, action) {
            if (action.type == 'submit') {
                win.close();
                // anropa ok-funktion
                callback.call(this);
            }
        });

        // fönstret som visar formuläret
        var win = new Ext.Window({
            title: 'Verifiera lösenord',
            width: 300,
            height: 130,
            modal: true,
            layout: 'fit',
            plain: true,
            resizable: false,
            items: form,
            focus: Ext.emptyFn
        });

        // sätt fokus på textrutan efter visning
        win.on('show', function() {
            password.focus();
        });

        win.show(animFrom);
    }
});

// global instans
var loginManager = new LUL.LoginManager();
