﻿///<reference path="Extjs_Intellisense.js" />
Ext.override(LUL.Admin.Manager, {
    // administration
    showAdmin: function() {
        // bekräfta lösenord så ingen går in och ändrar användare mm utan lov...
        loginManager.verifyPassword('adminShowAdminLink', function() {
            function close() {
                win.close();
                //if (usersPanel.askClose() && rightsPanel.askClose()) win.close();
            }

            var statusBar = new Ext.StatusBar({
                text: '',
                items: [
                        { text: 'Stäng', iconCls: 'icon-ok', handler: close, scope: this }
                    ]
            });

            var usersPanel = new LUL.Admin.AdminUsersPanel();
            var rightsPanel = new LUL.Admin.AdminRightsPanel();

            var tabs = new Ext.TabPanel({
                activeTab: 0,
                hideBorders: true,
                items: [
                    rightsPanel,
                    usersPanel
                ]
            });

            var win = new Ext.Window({
                title: 'Administration',
                width: 400,
                height: 360,
                layout: 'fit',
                hideBorders: true,
                modal: true,
                bodyStyle: 'text-align: left',

                items: tabs,
                bbar: statusBar
            });
            win.on('beforeclose', function() {
                // låt innehållspanelerna avgöra om fönstret ska stängas
                if (!win.pendingClose && (usersPanel.askClose() || rightsPanel.askClose())) {
                    Ext.Msg.show({
                        title: 'Osparade ändringar',
                        msg: 'Du har osparade ändringar, vill du ändå stänga fönstret?<br />Ändringarna kommer att förloras',
                        buttons: Ext.Msg.YESNO,
                        icon: Ext.Msg.QUESTION,
                        fn: function(button) {
                            if (button == 'yes') {
                                win.pendingClose = true;
                                win.close();
                            }
                        }
                    });
                    return false;
                }
            });

            win.show('adminShowAdminLink');
        }, this);
    }
});

LUL.Admin.AdminRightsPanel = Ext.extend(Ext.Panel, {

    title: 'Rättigheter (för sidan)',
    layout: 'fit',

    initComponent: function() {
        LUL.Admin.AdminUsersPanel.superclass.initComponent.call(this);

        function renderUsername(value, meta, record) {
            if (record.data.userid == 0) return '';
            return usersStore.getAt(
                usersStore.findBy(function(r) {
                    return (r.data.id == record.data.userid);
                })
            ).data.username;
        }

        function renderRights(value) {
            switch (value) {
                case RIGHTS_ADMIN:
                    return 'Administratör';
                case RIGHTS_USER:
                    return 'Användare';
                case RIGHTS_GUEST:
                    return 'Gäst';
                case RIGHTS_USE_USERS:
                    return 'Använd inloggad';
            }
            return 'Ogiltig';
        }

        var store = new Ext.data.JsonStore({
            url: dataManager.fetchPageRightsURL,
            root: 'rows',
            fields: ['id', 'userid', 'rights', 'isAllUsers', 'isAllVisitors']
        });

        this.addButton = new Ext.Toolbar.Button({ text: 'Lägg till', iconCls: 'icon-plus', handler: this.addUser, scope: this });
        this.saveButton = new Ext.Toolbar.Button({ text: 'Spara', iconCls: 'icon-save', disabled: true, handler: this.save, scope: this });
        this.undoButton = new Ext.Toolbar.Button({ text: 'Ångra', iconCls: 'icon-undo', disabled: true, handler: this.undo, scope: this });
        this.deleteButton = new Ext.Toolbar.Button({ text: 'Ta bort', iconCls: 'icon-minus', handler: this.deleteUser, scope: this });

        this.checkbox = new Ext.form.Checkbox({ boxLabel: 'Ärv rättigheter', anchor: '100%', name: 'inherit' });
        this.checkbox.on('check', this.inheritRightsChanged, this);

        // innehåller rättigheter
        this.rightsCombo = new Ext.form.ComboBox({
            editable: false,
            valueField: 'rights',
            displayField: 'title',
            triggerAction: 'all',
            typeAhead: true,
            forceSelection: true,
            mode: 'local',
            store: new Ext.data.SimpleStore({
                fields: ['rights', 'title'],
                data: [[RIGHTS_ADMIN, 'Administratör'], [RIGHTS_USER, 'Användare'], [RIGHTS_GUEST, 'Gäst'], [RIGHTS_USE_USERS, 'Använd inloggad']]
            })
        });

        // innehåller användare
        var usersStore = new Ext.data.JsonStore({
            url: dataManager.fetchUsersURL,
            root: 'rows',
            fields: ['id', 'username']
        });

        this.usersCombo = new Ext.form.ComboBox({
            editable: false,
            valueField: 'id',
            displayField: 'username',
            triggerAction: 'all',
            typeAhead: true,
            forceSelection: true,
            store: usersStore
        });

        var grid = new Ext.grid.EditorGridPanel({
            border: false,
            store: store,
            selModel: new Ext.grid.RowSelectionModel({
                singleSelect: true
            }),
            columns: [
                { header: 'Användarnamn', dataIndex: 'userid', renderer: renderUsername, editor: this.usersCombo },
                { header: 'Rättigheter', dataIndex: 'rights', renderer: renderRights, editor: this.rightsCombo }
            ],
            tbar: [
                this.addButton,
                this.deleteButton,
                { xtype: 'tbseparator' },
                this.saveButton,
                this.undoButton,
                { xtype: 'tbseparator' },
                this.checkbox
            ]
        });

        grid.on('beforeedit', function(e) {
            // tillåt inte redigering av 'Alla'
            if (e.record.data.isAllVisitors) e.cancel = true;
            // tillåt bara rättigheten 'Använd inloggad' för gruppen 'Användare'           
            if (!e.record.data.isAllUsers) {
                this.rightsCombo.store.filterBy(function(record) {
                    if (record.data.rights < 0) return false;
                    return true;
                });
            }
            else {
                if (e.field == 'userid') e.cancel = true;
                this.rightsCombo.store.clearFilter();
            }
        }, this);

        grid.on('afteredit', function(e) {
            this.deleteButton.setDisabled(e.record.data.id == 1);
            this.saveButton.enable();
            this.undoButton.enable();
        }, this);

        grid.getSelectionModel().on('rowselect', function(sm, row, record) {
            this.deleteButton.setDisabled(record.data.id == 1);
            this.saveButton.setDisabled(!record.dirty);
            this.undoButton.setDisabled(!record.dirty);
        }, this);

        this.add(grid);
        this.grid = grid;

        // bocka i eller ur "ärv rättigheter" (kör händelsehanteringen ovan)
        this.checkbox.setValue(adminManager.pageData.inheritRights);

        // startsidor kan inte ärva rättigheter
        if (adminManager.pageData.parent == 0) this.checkbox.disable();

        // ladda först användare, sen rättigheter
        this.usersCombo.store.on('load', function() {
            if (!this.usersLoaded) {
                store.load({ params: { inheritRights: adminManager.pageData.inheritRights} });
                this.usersLoaded = true;
            }
        });
        this.usersCombo.store.load();

        this.initialized = true;
    },


    askClose: function() {
        return (this.grid.getStore().getModifiedRecords().length > 0);
    },

    // "ärv rättigheter" har ändrats (kryssats i eller ur)
    inheritRightsChanged: function(box, checked) {
        var g = this.grid;

        // lagrar ändringen
        function storeSetting(copyRights) {
            Ext.Ajax.request({
                url: dataManager.changeInheritRightsURL,
                success: function(res) {
                    // uppdatera
                    adminManager.pageData.inheritRights = checked
                    g.getStore().load({ params: { inheritRights: checked} });
                },
                params: { inheritRights: checked, copyRights: copyRights }
            });
        }

        if (checked) {
            // lås redigering
            this.addButton.disable();
            this.deleteButton.disable();
            if (g.rendered)
                g.getGridEl().mask('Rättigheterna ärvs');
            else
                g.on('render', function() { g.getGridEl().mask('Rättigheterna ärvs'); });

            // ibockad av användaren?
            if (this.initialized) {
                // bekräfta arv
                Ext.Msg.confirm('Ärv rättigheter', 'Vill du verkligen ärva rättigheterna från ovanliggande sida? Eventuella unika rättigheter som satts för denna sida kommer att tas bort permanent', function(btn) {
                    if (btn == 'yes')
                        storeSetting(false);
                    else {
                        this.skipStore = true;
                        this.checkbox.setValue(false);
                    }
                }, this);
            }
        } else {
            // lås upp redigering
            this.addButton.enable();
            this.deleteButton.enable();
            if (g.rendered) g.getGridEl().unmask();

            // urbockad av användaren?
            if (this.initialized && !this.skipStore) {
                // kopiera rättigheter?
                Ext.Msg.confirm('Kopiera rättigheter', 'Vill du kopiera ärvda rättigheter?', function(btn) {
                    storeSetting((btn == 'yes'));
                }, this);
            }
            this.skipStore = false;

        }
    },

    // spara markerad rad
    save: function() {
        var record = this.grid.getSelectionModel().getSelected();
        if (record) {
            Ext.Ajax.request({
                url: dataManager.editPageRightsURL,
                success: function(response) {
                    var res = Ext.util.JSON.decode(response.responseText);
                    if (res.success) {
                        // uppdatera posten så ändringen sparas lokalt
                        this.saveButton.disable();
                        this.undoButton.disable();
                        if (res.id) record.data.id = res.id;
                        record.commit();
                    } else {
                        // visa meddelande om vad som gick galet
                        switch (res.msg) {
                            case 'exists':
                                Ext.Msg.alert('Finns redan', 'Den valda användaren har redan rättigheter på denna sida');
                                break;
                            case 'not found':
                                Ext.Msg.alert('Hittades inte', 'Valda rättigheter hittades inte och kunde därmed inte redigeras. Eventuellt har rättigheterna tagits bort, uppdatera och försök igen');
                                break;
                            case 'invalid data':
                                Ext.Msg.alert('Ogiltig data', 'Datan som angetts är ogiltig och kan inte användas');
                                break;
                        }
                    }
                },
                scope: this,
                params: { user: Ext.util.JSON.encode(record.data) }
            });
        }
    },

    // ångra ändringar av markerad rad
    undo: function() {
        this.grid.getSelectionModel().getSelected().reject();
        this.saveButton.disable();
        this.undoButton.disable();
    },

    // lägg till ny rad
    addUser: function() {
        var store = this.grid.getStore();
        var UserRecord = Ext.data.Record.create(store.fields.items);
        var user = new UserRecord({ id: 0, userid: '', rights: 2, isAllVisitors: false, isAllUsers: false });
        store.add(user);
        this.grid.getSelectionModel().selectLastRow();
        this.grid.startEditing(store.indexOf(user), 0);
    },

    // ta bort markerad rad
    deleteUser: function() {
        var record = this.grid.getSelectionModel().getSelected();
        if (record) {
            var store = this.grid.getStore();
            // sparad rad?
            if (record.data.id > 0) {
                Ext.Msg.confirm('Bekräfta borttagning', 'Vill du verkligen ta bort markerad rättighet? Åtgärden kan inte ångras senare', function(button) {
                    if (button == 'yes') {
                        Ext.Ajax.request({
                            url: dataManager.removePageRightsURL,
                            params: { user: Ext.util.JSON.encode(record.data) },
                            success: function(response) {
                                var res = Ext.util.JSON.decode(response.responseText);
                                if (res.success) {
                                    store.remove(record);
                                    // kan inte ändra på borttagen rad... :)
                                    this.saveButton.disable();
                                    this.undoButton.disable();
                                }
                            },
                            scope: this
                        });
                    }
                }, this);
            } else {
                store.remove(record);
                // kan inte ändra på borttagen rad... :)
                this.saveButton.disable();
                this.undoButton.disable();
            }
        }
    }

});

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

LUL.Admin.AdminUsersPanel = Ext.extend(Ext.Panel, {

    title: 'Användare (global)',
    layout: 'fit',

    initComponent: function() {
        LUL.Admin.AdminRightsPanel.superclass.initComponent.call(this);

        function renderPassword(value, meta, record) {
            if (record.data.rights < 0) return '------';
            return '******';
        }

        function renderRights(value) {
            switch (value) {
                case RIGHTS_ADMIN:
                    return 'Administratör';
                case RIGHTS_USER:
                    return 'Användare';
                case RIGHTS_GUEST:
                    return 'Gäst';
                case RIGHTS_USE_USERS:
                case RIGHTS_ALL_USERS:
                    return 'Grupp';
            }
            return 'Ogiltig';
        }

        var store = new Ext.data.JsonStore({
            url: dataManager.fetchUsersURL,
            root: 'rows',
            fields: ['id', 'username', 'password', 'rights']
        });

        this.saveButton = new Ext.Toolbar.Button({ text: 'Spara', iconCls: 'icon-save', disabled: true, handler: this.save, scope: this });
        this.undoButton = new Ext.Toolbar.Button({ text: 'Ångra', iconCls: 'icon-undo', disabled: true, handler: this.undo, scope: this });
        this.deleteButton = new Ext.Toolbar.Button({ text: 'Ta bort', iconCls: 'icon-minus', handler: this.deleteUser, scope: this });

        this.rightsCombo = new Ext.form.ComboBox({
            editable: false,
            valueField: 'rights',
            displayField: 'title',
            triggerAction: 'all',
            typeAhead: true,
            forceSelection: true,
            mode: 'local',
            store: new Ext.data.SimpleStore({
                fields: ['rights', 'title'],
                data: [[RIGHTS_ADMIN, 'Administratör'], [RIGHTS_USER, 'Användare'], [RIGHTS_GUEST, 'Gäst']]
            })
        });

        var grid = new Ext.grid.EditorGridPanel({
            border: false,
            store: store,
            selModel: new Ext.grid.RowSelectionModel({
                singleSelect: true
            }),
            columns: [
                { header: 'Användarnamn', dataIndex: 'username', editor: new Ext.form.TextField() },
                { header: 'Lösenord', dataIndex: 'password', renderer: renderPassword, editor: new Ext.form.TextField() },
                { header: 'Rättigheter', dataIndex: 'rights', renderer: renderRights, editor: this.rightsCombo }
            ],
            tbar: [
                { text: 'Lägg till', iconCls: 'icon-plus', handler: this.addUser, scope: this },
                this.deleteButton,
                { xtype: 'tbseparator' },
                this.saveButton,
                this.undoButton
            ]
        });

        grid.on('beforeedit', function(e) {
            if (e.record.data.rights < 0) e.cancel = true;
        }, this);

        grid.on('afteredit', function(e) {
            this.deleteButton.setDisabled(e.record.data.id == 1 || e.record.data.rights < 0);
            this.saveButton.enable();
            this.undoButton.enable();
        }, this);

        grid.getSelectionModel().on('rowselect', function(sm, row, record) {
            this.deleteButton.setDisabled(record.data.id == 1 || record.data.rights < 0);
            this.saveButton.setDisabled(!record.dirty);
            this.undoButton.setDisabled(!record.dirty);
        }, this);
        this.grid = grid;

        this.add(grid);

        store.load();
    },

    // tillåt stängning om inga ändringar
    askClose: function() {
        return (this.grid.getStore().getModifiedRecords().length > 0);
    },

    // spara markerad rad
    save: function() {
        var record = this.grid.getSelectionModel().getSelected();
        if (record) {
            Ext.Ajax.request({
                url: dataManager.editUserURL,
                success: function(response) {
                    var res = Ext.util.JSON.decode(response.responseText);
                    if (res.success) {
                        // uppdatera posten så ändringen sparas lokalt
                        this.saveButton.disable();
                        this.undoButton.disable();
                        if (res.id) record.data.id = res.id;
                        record.commit();
                    } else {
                        // visa meddelande om vad som gick galet
                        switch (res.msg) {
                            case 'exists':
                                Ext.Msg.alert('Användarnamnet upptaget', 'Det valda användarnamnet är upptaget. Byt ut det och försök igen!');
                                break;
                            case 'not found':
                                Ext.Msg.alert('Hittades inte', 'Vald användare hittades inte och kunde därmed inte redigeras. Eventuellt har användaren tagits bort, uppdatera och försök igen');
                                break;
                            case 'invalid data':
                                Ext.Msg.alert('Ogiltig data', 'Datan som angetts är ogiltig och kan inte användas');
                                break;
                        }
                    }
                },
                scope: this,
                params: { user: Ext.util.JSON.encode(record.data) }
            });
        }
    },

    // ångra ändringar av markerad rad
    undo: function() {
        this.grid.getSelectionModel().getSelected().reject();
        this.saveButton.disable();
        this.undoButton.disable();
    },

    // lägg till ny rad
    addUser: function() {
        var store = this.grid.getStore();
        var UserRecord = Ext.data.Record.create(store.fields.items);
        var user = new UserRecord({ id: 0, username: '', password: '', rights: 2 });
        store.add(user);
        this.grid.getSelectionModel().selectLastRow();
        this.grid.startEditing(store.indexOf(user), 0);

    },

    // ta bort markerad rad
    deleteUser: function() {
        var g = this.grid;
        var record = this.grid.getSelectionModel().getSelected();
        if (record) {
            var store = this.grid.getStore();
            // sparad rad?
            if (record.data.id > 0) {
                Ext.Msg.confirm('Bekräfta borttagning', 'Vill du verkligen ta bort markerad användare? Åtgärden kan inte ångras senare', function(button) {
                    if (button == 'yes') {
                        Ext.Ajax.request({
                            url: dataManager.removeUserURL,
                            params: { user: Ext.util.JSON.encode(record.data) },
                            success: function(response) {
                                var res = Ext.util.JSON.decode(response.responseText);
                                if (res.success) {
                                    store.remove(record);
                                    // kan inte ändra på borttagen rad... :)
                                    this.saveButton.disable();
                                    this.undoButton.disable();
                                }
                            },
                            scope: this
                        });
                    }
                }, this);
            } else {
                store.remove(record);
                // kan inte ändra på borttagen rad... :)
                this.saveButton.disable();
                this.undoButton.disable();
            }
        }
    }

});
