'use strict';

pandora.ui.preferencesDialog = function() {

    var isReloading = false,
        tabs = [
            {id: 'account', title: Ox._('Account')},
            {id: 'appearance', title: Ox._('Appearance')},
            {id: 'advanced', title: Ox._('Advanced')}
        ];
    Ox.getObjectById(
        tabs, pandora.user.ui.part.preferences || 'account'
    ).selected = true;
    var $tabPanel = Ox.TabPanel({
            content: function(id) {
                var $content = Ox.Element()
                    .css({overflowY: 'auto'})
                    .append(
                        $('<img>')
                            .attr({src: '/static/png/icon.png'})
                            .css({
                                position: 'absolute',
                                left: '16px',
                                top: '16px',
                                width: '64px',
                                height: '64px'
                            })
                    );
                if (id == 'account') {
                    $content.append(
                        Ox.Form({
                            items: [
                                Ox.Input({
                                    disabled: true,
                                    id: 'username',
                                    label: Ox._('Username'),
                                    labelWidth: 120,
                                    value: pandora.user.username,
                                    width: 320
                                }),
                                Ox.Input({
                                        autovalidate: /.+/,
                                        id: 'password',
                                        label: Ox._('New Password'),
                                        labelWidth: 120,
                                        type: 'text',
                                        validate: pandora.validateNewPassword,
                                        width: 320
                                    })
                                    .attr({
                                        autocomplete: 'new-password'
                                    })
                                    .bindEvent({
                                        focus: function(data) {
                                            this.options({
                                                type: 'password'
                                            })
                                        },
                                        validate: function(data) {
                                            data.valid && pandora.api.editPreferences({password: data.value});
                                        }
                                    }),
                                Ox.Input({
                                        autovalidate: pandora.autovalidateEmail,
                                        id: 'email',
                                        label: Ox._('E-Mail Address'),
                                        labelWidth: 120,
                                        validate: pandora.validateNewEmail,
                                        value: pandora.user.email,
                                        width: 320
                                    })
                                    .bindEvent({
                                        validate: function(data) {
                                            if (data.valid && data.value != pandora.user.email) {
                                                pandora.user.email = data.value;
                                                pandora.api.editPreferences({email: data.value});
                                            }
                                        }
                                    }),
                                Ox.Input({
                                    disabled: true,
                                    id: 'level',
                                    label: Ox._('Level'),
                                    labelWidth: 120,
                                    value: Ox.toTitleCase(pandora.user.level),
                                    width: 320
                                }),
                            ].concat(
                                pandora.user.groups.length ? [
                                    Ox.Input({
                                        disabled: true,
                                        id: 'groups',
                                        label: Ox._('Groups'),
                                        labelWidth: 120,
                                        value: pandora.user.groups.join(', '),
                                        width: 320
                                    })
                                ] : []
                            ).concat([
                                Ox.Checkbox({
                                        id: 'newsletter',
                                        label: Ox._('Newsletter'),
                                        labelWidth: 120,
                                        title: pandora.user.newsletter
                                            ? Ox._('Subscribed')
                                            : Ox._('Unsubscribed'),
                                        value: pandora.user.newsletter,
                                        width: 320
                                    })
                                    .bindEvent({
                                        change: function(data) {
                                            pandora.user.newsletter = data.value;
                                            this.options({
                                                title: pandora.user.newsletter
                                                    ? Ox._('Subscribed')
                                                    : Ox._('Unsubscribed')
                                            });
                                            pandora.api.editPreferences({
                                                newsletter: pandora.user.newsletter 
                                            });
                                        }
                                    })
                                
                            ])
                        })
                        .css({position: 'absolute', left: '96px', top: '16px'})
                    );
                } else if (id == 'appearance') {
                    $content.append(
                        Ox.Form({
                            items: [
                                Ox.Select({
                                        id: 'theme',
                                        items: pandora.site.themes.map(function(theme) {
                                            return {
                                                id: theme,
                                                title: Ox.Theme.getThemeData(theme).themeName
                                            };
                                        }),
                                        label: Ox._('Theme'),
                                        labelWidth: 120,
                                        value: pandora.user.ui.theme,
                                        width: 320
                                    })
                                    .bindEvent({
                                        change: function(data) {
                                            pandora.UI.set({theme: data.value});
                                            pandora.setTheme(data.value);
                                        }
                                    }),
                                Ox.Select({
                                        id: 'locale',
                                        items: pandora.site.languages.map(function(locale) {
                                            return {
                                                id: locale,
                                                title: Ox.LOCALE_NAMES[locale]
                                            };
                                        }),
                                        label: Ox._('Language'),
                                        labelWidth: 120,
                                        value: pandora.user.ui.locale,
                                        width: 320
                                    })
                                    .bindEvent({
                                        change: function(data) {
                                            pandora.UI.set({locale: data.value});
                                            pandora.setLocale(data.value, function() {
                                                isReloading = true;
                                                $dialog.close();
                                                pandora.$ui.appPanel.reload();
                                            });
                                        }
                                    })
                            ]
                        })
                        .css({position: 'absolute', left: '96px', top: '16px'})
                    );
                } else if (id == 'advanced') {
                    $content.append(
                        Ox.Button({
                            title: Ox._('Reset UI Settings...'),
                            width: 160
                        })
                        .bindEvent({
                            click: function() {
                                pandora.$ui.resetUIDialog = pandora.ui.resetUIDialog().open();
                            }
                        })
                        .css({position: 'absolute', left: '96px', top: '16px'})
                    ).append(
                        Ox.Button({
                            title: Ox._('Run Script on Load...'),
                            width: 160
                        })
                        .bindEvent({
                            click: function() {
                                pandora.$ui.scriptDialog = pandora.ui.scriptDialog().open();
                            }
                        })
                        .css({position: 'absolute', left: '96px', top: '40px'})
                    ).append(
                        Ox.Button({
                            title: Ox._('Manage Cache...'),
                            disabled: !pandora.fs.enabled,
                            width: 160
                        })
                        .bindEvent({
                            click: function() {
                                pandora.$ui.cacheDialog = pandora.ui.cacheDialog().open();
                            }
                        })
                        .css({position: 'absolute', left: '96px', top: '64px'})
                    );
                }
                return $content;
            },
            tabs: tabs
        })
        .bindEvent({
            change: function(data) {
                pandora.UI.set({'part.preferences': data.selected});
            }
        }),

        $dialog = Ox.Dialog({
            buttons: [
                Ox.Button({
                    id: 'signout',
                    title: Ox._('Sign Out...')
                }).bindEvent({
                    click: function() {
                        pandora.UI.set({page: 'signout'});
                    }
                }),
                {},
                Ox.Button({
                    id: 'done',
                    title: Ox._('Done')
                }).bindEvent({
                    click: function() {
                        $dialog.close();
                    }
                })
            ],
            closeButton: true,
            content: $tabPanel,
            height: 192,
            minHeight: 192,
            minWidth: 432,
            title: Ox._('Preferences'),
            width: 432
        })
        .bindEvent({
            close: function() {
                if (pandora.user.ui.page == 'preferences' && !isReloading) {
                    pandora.UI.set({page: ''});
                }
            },
            'pandora_part.preferences': function(data) {
                if (pandora.user.ui.page == 'preferences') {
                    $tabPanel.select(
                        data.value == '' ? 'account' : data.value
                    );
                }
            }
        });

    return $dialog;

};