'use strict';

pandora.ui.folders = function(section) {
    section = section || pandora.user.ui.section;
    var ui = pandora.user.ui,
        that = Ox.Element()
            .css({overflowX: 'hidden', overflowY: 'auto'})
            .bindEvent({
                resize: function() {
                    pandora.resizeFolders();
                }
            }),
        editable = (ui[{
            items: '_list',
            edits: 'edit',
            documents: '_collection',
            texts: 'text'
        }[section]] || '').split(':')[0] == pandora.user.username,
        folderItems = pandora.getFolderItems(section),
        folderItem = folderItems.slice(0, -1),
        canEditFeatured = pandora.hasCapability('canEditFeatured' + folderItems),
        initCounter = 0,
        loadCounter = 0;
    pandora.$ui.allItems = pandora.ui.allItems(section).appendTo(that);
    pandora.$ui.folder = [];
    pandora.$ui.folderBrowser = {};
    pandora.$ui.folderList = {};
    pandora.$ui.folderPlaceholder = {};
    pandora.$ui.findListsElement = {};
    pandora.$ui.findListsSelect = {};
    pandora.$ui.findListsInput = {};
    pandora.$ui.manageListsButton = {};
    pandora.site.sectionFolders[section].forEach(function(folder, i) {
        var extras, $select;
        if (folder.id == 'personal') {
            if (pandora.user.level == 'guest') {
                extras = [infoButton(
                    Ox._('Personal ' + folderItems),
                    section == 'items'
                    ? Ox._('To create and share your own lists of {0}, please sign up or sign in.', [Ox._(pandora.site.itemName.plural.toLowerCase())])
                    : Ox._('To create and share your own {0}, please sign up or sign in.', [section])
                )];
            } else {
                if (Ox.contains(pandora.site.listSections, section)) {
                    extras = [
                        pandora.$ui.personalListsMenu = Ox.MenuButton({
                            items: [
                                { id: 'newlist', title: Ox._('New {0}', [Ox._(folderItem)]), keyboard: 'control n' },
                                {
                                    id: 'newlistfromselection',
                                    title: Ox._('New {0} from Selection',
                                    [Ox._(folderItem)]),
                                    keyboard: 'shift control n',
                                    disabled:  ui.section == 'documents'
                                        ? ui.collectionSelection.length == 0
                                        : ui.listSelection.length == 0
                                },
                                { id: 'newsmartlist', title: Ox._('New Smart {0}', [Ox._(folderItem)]), keyboard: 'alt control n' },
                                { id: 'newsmartlistfromresults', title: Ox._('New Smart {0} from Results', [Ox._(folderItem)]), keyboard: 'shift alt control n' },
                                {},
                                { id: 'duplicatelist', title: Ox._('Duplicate Selected {0}', [Ox._(folderItem)]), keyboard: 'control d', disabled: ui.section == 'documents' ? !ui._collection : !ui._list },
                                { id: 'editlist', title: Ox._('Edit Selected {0}...', [Ox._(folderItem)]), keyboard: 'control e', disabled: !editable },
                                { id: 'deletelist', title: Ox._('Delete Selected {0}...', [Ox._(folderItem)]), keyboard: 'delete', disabled: !editable },
                            ],
                            title: 'edit',
                            tooltip: Ox._('Manage Personal ' + folderItems),
                            type: 'image'
                        })
                        .bindEvent({
                            click: function(data) {
                                var $list = pandora.$ui.folderList[folder.id];
                                // fixme: duplicated
                                if (Ox.contains([
                                    'newlist', 'newlistfromselection', 'newsmartlist', 'newsmartlistfromresults'
                                ], data.id)) {
                                    pandora.addList(data.id.indexOf('smart') > -1, data.id.indexOf('from') > -1);
                                } else if (data.id == 'duplicatelist') {
                                    pandora.addList(ui.section == 'documents' ? ui._collection : ui._list);
                                } else if (data.id == 'editlist') {
                                    pandora.ui.listDialog().open();
                                } else if (data.id == 'deletelist') {
                                    pandora.ui.deleteListDialog().open();
                                }
                            },
                            pandora_collectionselection: function(data) {
                                pandora.$ui.personalListsMenu[
                                    data.value.length ? 'enableItem' : 'disableItem'
                                ]('newlistfromselection');
                            },
                            pandora_find: function() {
                                // fixme: duplicated
                                var action = ui._list
                                    && pandora.getListData(ui._list).user == pandora.user.username
                                    ? 'enableItem' : 'disableItem'
                                pandora.$ui.personalListsMenu[
                                    ui._list ? 'enableItem' : 'disableItem'
                                ]('duplicatelist');
                                pandora.$ui.personalListsMenu[action]('editlist');
                                pandora.$ui.personalListsMenu[action]('deletelist');
                                pandora.$ui.personalListsMenu[
                                    ui.listSelection.length ? 'enableItem' : 'disableItem'
                                ]('newlistfromselection');
                            },
                            pandora_finddocuments: function() {
                                // fixme: duplicated
                                var action = ui._collection
                                    && pandora.getListData(ui._collection).user == pandora.user.username
                                    ? 'enableItem' : 'disableItem'
                                pandora.$ui.personalListsMenu[
                                    ui._collection ? 'enableItem' : 'disableItem'
                                ]('duplicatelist');
                                pandora.$ui.personalListsMenu[action]('editlist');
                                pandora.$ui.personalListsMenu[action]('deletelist');
                                pandora.$ui.personalListsMenu[
                                    ui.collectionSelection.length ? 'enableItem' : 'disableItem'
                                ]('newlistfromselection');
                            },
                            pandora_listselection: function(data) {
                                pandora.$ui.personalListsMenu[
                                    data.value.length ? 'enableItem' : 'disableItem'
                                ]('newlistfromselection');
                            }
                        })
                    ];
                } else if (section == 'edits') {
                    extras = [
                        pandora.$ui.personalListsMenu = Ox.MenuButton({
                            items: [
                                { id: 'newedit', title: Ox._('New Edit'), keyboard: 'control n' },
                                { id: 'neweditfromselection', title: Ox._('New Edit from Selection'), keyboard: 'shift control n', disabled: !ui.edit },
                                { id: 'newsmartedit', title: Ox._('New Smart Edit'), keyboard: 'alt control n'},
                                {},
                                { id: 'duplicateedit', title: Ox._('Duplicate Selected Edit'), keyboard: 'control d', disabled: !ui.edit },
                                { id: 'editedit', title: Ox._('Edit Selected Edit...'), keyboard: 'control e', disabled: !editable },
                                { id: 'deleteedit', title: Ox._('Delete Selected Edit...'), keyboard: 'delete', disabled: !editable }
                            ],
                            title: 'edit',
                            tooltip: Ox._('Manage Personal Edits'),
                            type: 'image'
                        })
                        .bindEvent({
                            click: function(data) {
                                var $list = pandora.$ui.folderList[folder.id];
                                if (data.id == 'newedit') {
                                    pandora.addEdit();
                                } else if (data.id == 'neweditfromselection') {
                                    pandora.addEdit(false, true);
                                } else if (data.id == 'newsmartedit') {
                                    pandora.addEdit(true, false);
                                } else if (data.id == 'duplicateedit') {
                                    pandora.addEdit(ui.edit);
                                } else if (data.id == 'editedit') {
                                    pandora.ui.listDialog().open();
                                } else if (data.id == 'deleteedit') {
                                    pandora.ui.deleteListDialog().open();
                                }
                            }
                        })
                        .bindEvent({
                            pandora_edit: function(data) {
                                var action = ui.edit
                                    && pandora.getListData(ui.edit).user == pandora.user.username
                                    ? 'enableItem' : 'disableItem';
                                pandora.$ui.personalListsMenu[
                                    ui.edit ? 'enableItem' : 'disableItem'
                                ]('duplicateedit');
                                pandora.$ui.personalListsMenu[action]('editedit');
                                pandora.$ui.personalListsMenu[action]('deleteedit');
                            },
                            pandora_editselection: function(data) {
                                pandora.$ui.personalListsMenu[
                                    data.value.length ? 'enableItem' : 'disableItem'
                                ]('neweditfromselection');
                            }
                        })
                    ];
                } else if (section == 'texts') {
                    extras = [
                        pandora.$ui.personalListsMenu = Ox.MenuButton({
                            items: [
                                { id: 'newtext', title: Ox._('New Text'), keyboard: 'control n' },
                                { id: 'newpdf', title: Ox._('New PDF'), keyboard: 'alt control n' },
                                {},
                                { id: 'edittext', title: Ox._('Edit Selected Text...'), keyboard: 'control e', disabled: !editable },
                                { id: 'deletetext', title: Ox._('Delete Selected Text...'), keyboard: 'delete', disabled: !editable }
                            ],
                            title: 'edit',
                            tooltip: Ox._('Manage Personal Texts'),
                            type: 'image'
                        })
                        .bindEvent({
                            click: function(data) {
                                var $list = pandora.$ui.folderList[folder.id];
                                if (data.id == 'newtext') {
                                    pandora.addText({type: 'html'});
                                } else if (data.id == 'newpdf') {
                                    pandora.addText({type: 'pdf'});
                                } else if (data.id == 'edittext') {
                                    pandora.ui.listDialog().open();
                                } else if (data.id == 'deletetext') {
                                    pandora.ui.deleteListDialog().open();
                                }
                            }
                        })
                        .bindEvent('pandora_text', function(data) {
                            var action = ui.text
                                && pandora.getListData(ui.text).user == pandora.user.username
                                ? 'enableItem' : 'disableItem';
                            pandora.$ui.personalListsMenu[action]('edittext');
                            pandora.$ui.personalListsMenu[action]('deletetext');
                        })
                    ];
                } else {
                    extras = [];
                }
            }
        } else if (folder.id == 'favorite') {
            if (pandora.user.level == 'guest') {
                extras = [infoButton(
                    Ox._('Favorite ' + folderItems),
                    Ox._('To browse and subscribe to {0} shared by other users, please sign up or sign in.', [Ox._(folderItems.toLowerCase())])
                )];
            } else {
                extras = [pandora.$ui.manageListsButton['favorite'] = Ox.Button({
                    selectable: true,
                    style: 'symbol',
                    title: 'edit',
                    tooltip: Ox._('Manage Favorite {0}', [Ox._(folderItems)]),
                    type: 'image'
                })
                .bindEvent({
                    change: function(data) {
                        var listData;
                        Ox.Request.clearCache(); // fixme: remove
                        pandora.site.sectionFolders[section][i].showBrowser = !pandora.site.sectionFolders[section][i].showBrowser;
                        this.options({tooltip: data.value ? Ox._('Done') : Ox._('Manage Favorite {0}', [Ox._(folderItems)])});
                        if (pandora.site.sectionFolders[section][i].showBrowser) {
                            pandora.$ui.folderList.favorite.replaceWith(
                                pandora.$ui.folderBrowser.favorite = pandora.ui.folderBrowser('favorite', section)
                            );
                            pandora.$ui.folder[i].options({collapsed: false});
                        } else {
                            listData = pandora.getListData();
                            if (
                                pandora.$ui.folderList.favorite.options('selected').length
                                && !listData.subscribed
                            ) {
                                // the selected list in the favorites browser is not in the favorites folder
                                pandora.$ui.folderList.favorite.options({selected: []});
                                if (Ox.getObjectById(pandora.site.sectionFolders[section], 'featured').showBrowser) {
                                    // but in the featured browser
                                    pandora.$ui.folderList.featured.options({selected: [listData.id]});
                                } else {
                                    // and nowhere else
                                    if (section == 'items') {
                                        pandora.UI.set({
                                            find: pandora.site.user.ui.find
                                        });
                                    } else if (section == 'documents') {
                                        pandora.UI.set({
                                            findDocuments: pandora.site.user.ui.findDocuments
                                        });
                                    } else {
                                        Ox.print('unknown section', section);
                                    }
                                }
                            }
                            pandora.$ui.folderBrowser.favorite.replaceWith(
                                pandora.$ui.folderList.favorite = pandora.ui.folderList('favorite', section)
                            );
                        }
                        pandora.resizeFolders();
                    }
                })];
            }
        } else if (folder.id == 'featured') {
            if (!canEditFeatured) {
                extras = [infoButton(
                    Ox._('Featured ' + folderItems),
                    Ox._('Featured {0} are selected public {0}, picked by the {1} staff.', [Ox._(folderItems.toLowerCase()), pandora.site.site.name])
                )];
            } else {
                extras = [pandora.$ui.manageListsButton['featured'] = Ox.Button({
                    selectable: true,
                    style: 'symbol',
                    title: 'edit',
                    tooltip: Ox._('Manage Featured {0}', [Ox._(folderItems)]),
                    type: 'image'
                })
                .bindEvent({
                    change: function(data) {
                        var listData;
                        Ox.Request.clearCache(); // fixme: remove
                        pandora.site.sectionFolders[section][i].showBrowser = !pandora.site.sectionFolders[section][i].showBrowser;
                        this.options({tooltip: data.value ? Ox._('Done') : Ox._('Manage Favorite {0}', [Ox._(folderItems)])});
                        if (pandora.site.sectionFolders[section][i].showBrowser) {
                            pandora.$ui.folderList.featured.replaceWith(
                                pandora.$ui.folderBrowser.featured = pandora.ui.folderBrowser('featured', section)
                            );
                            pandora.$ui.folder[i].options({collapsed: false});
                        } else {
                            listData = pandora.getListData();
                            Ox.Log('', 'FEATURED', listData)
                            if (
                                pandora.$ui.folderList.featured.options('selected').length
                                && listData.status != 'featured'
                            ) {
                                // the selected list in the featured browser is not in the featured folder
                                pandora.$ui.folderList.featured.options({selected: []});
                                if (listData.user == pandora.user.username) {
                                    // but in the personal folder
                                    pandora.$ui.folderList.personal.options({selected: [listData.id]});
                                } else if (
                                    listData.subscribed
                                    || Ox.getObjectById(pandora.site.sectionFolders[section], 'favorite').showBrowser
                                ) {
                                    // but in the favorites folder or browser
                                    pandora.$ui.folderList.favorite.options({selected: [listData.id]});
                                } else {
                                    // and nowhere else
                                    if (section == 'items') {
                                        pandora.UI.set({
                                            find: pandora.site.user.ui.find
                                        });
                                    } else if (section == 'documents') {
                                        pandora.UI.set({
                                            findDocuments: pandora.site.user.ui.findDocuments
                                        });
                                    } else {
                                        Ox.print('unknown section', section);
                                    }
                                }
                            }
                            pandora.$ui.folderBrowser.featured.replaceWith(
                                pandora.$ui.folderList.featured = pandora.ui.folderList('featured', section)
                            );
                        }
                        pandora.resizeFolders();
                    }
                })];
            }
        } else if (folder.id == 'volumes') {
            if (pandora.user.level == 'guest') {
                extras = [infoButton(
                    Ox._('Local Volumes'),
                    Ox._('To import {0} from a local disk, please sign up or sign in.', [Ox._(pandora.site.itemName.plural.toLocaleLowerCase())])
                )];
            } else {
                extras = [Ox.MenuButton({
                    items: [
                        { id: 'add', title: Ox._('Add Volume...'), disabled: true },
                        { id: 'scan', title: Ox._('Scan Selected Volume...'), disabled: true },
                        { id: 'remove', title: Ox._('Remove Selected Volume...'), disabled: true },
                        {},
                        { id: 'import', title: Ox._('Import {0}...',
                            [Ox._(pandora.site.itemName.plural)]), disabled: true }
                    ],
                    title: 'edit',
                    tooltip: Ox._('Manage Volumes'),
                    type: 'image'
                })
                .bindEvent({
                    click: function(data) {
                    }
                })];
            }
        }
        pandora.$ui.folder[i] = Ox.CollapsePanel({
                id: folder.id,
                collapsed: !ui.showFolder[section][folder.id],
                extras: extras,
                size: 16,
                title: Ox._(folder.title)
            })
            .bindEvent({
                click: function(data) {
                    if (data.id == 'new' || data.id == 'newsmart') {
                        pandora.addFolderItem(section, data.id == 'newsmart', false);
                    } else if (data.id == 'browse') {
                        // ...
                    }
                },
                toggle: function(data) {
                    data.collapsed && pandora.$ui.folderList[folder.id].loseFocus();
                    pandora.UI.set('showFolder.' + section + '.' + folder.id, !data.collapsed);
                    pandora.resizeFolders();
                }
            });
        pandora.$ui.folderList[folder.id] = pandora.ui.folderList(folder.id, section)
            .bindEvent({
                selectnext: function() {
                    // ...
                },
                selectprevious: function() {
                    // ...
                }
            })
            .bindEventOnce({
                init: function(data) {
                    if (++initCounter == pandora.site.sectionFolders[section].length) {
                        pandora.$ui.folder.forEach(function($folder) {
                            that.append($folder);
                        });
                        pandora.resizeFolders(section);
                        pandora.selectList();
                    }
                },
                load: function(data) {
                    if (++loadCounter == pandora.site.sectionFolders[section].length) {
                        pandora.$ui.mainMenu.replaceItemMenu();
                    }
                }
            })
            .appendTo(pandora.$ui.folder[i].$content);
        pandora.$ui.folderPlaceholder[folder.id] = pandora.ui.folderPlaceholder(folder.id, section)
            .hide()
            .appendTo(pandora.$ui.folder[i].$content);
    });
    function infoButton(title, text) {
        return Ox.Button({
            style: 'symbol',
            title: 'info',
            type: 'image'
        }).bindEvent({
            click: function() {
                var $dialog = pandora.ui.iconDialog({
                    buttons: title != Ox._('Featured ' + folderItems) ? [].concat(
                        pandora.site.site.oidc ? []
                        : [
                            Ox.Button({title: Ox._('Sign Up...')}).bindEvent({
                                click: function() {
                                    $dialog.close();
                                    pandora.$ui.accountDialog = pandora.ui.accountDialog('signup').open();
                                }
                            })
                        ],
                        [
                            Ox.Button({title: Ox._('Sign In...')}).bindEvent({
                                click: function() {
                                    $dialog.close();
                                    if (pandora.site.site.oidc) {
                                        pandora.oidcLogin()
                                    } else {
                                        pandora.$ui.accountDialog = pandora.ui.accountDialog('signin').open();
                                    }
                                }
                            }),
                            {},
                            Ox.Button({title: Ox._('Not Now')}).bindEvent({
                                click: function() {
                                    $dialog.close();
                                }
                            })
                        ]
                    ): [
                        Ox.Button({title: Ox._('Close')}).bindEvent({
                            click: function() {
                                $dialog.close();
                            }
                        })
                    ],
                    content: text,
                    title: title
                }).open();
            }
        });
    }
    that.bindEvent({
        pandora_edit: function() {
            var folder = pandora.getListData().folder,
                edit = pandora.user.ui.edit,
                previousEdit = pandora.UI.getPrevious().edit;
            if (edit != previousEdit) {
                Ox.forEach(pandora.$ui.folderList, function($list, id) {
                    id != folder && $list.options('selected', []);
                });
                folder && pandora.$ui.folderList[folder].options({selected: [edit]});
            }
        },
        pandora_find: function() {
            var folder = pandora.getListData().folder,
                list = pandora.user.ui._list,
                previousList = pandora.UI.getPrevious()._list;
            if (list != previousList) {
                Ox.forEach(pandora.$ui.folderList, function($list, id) {
                    id != folder && $list.options('selected', []);
                });
                folder && pandora.$ui.folderList[folder].options({selected: [list]});
            }
            /*
            if (!pandora.user.ui._list && previousUI._list) {
                pandora.$ui.folderList[pandora.getListData(previous)]
                Ox.forEach(pandora.$ui.folderList, function($list) {
                    $list.options({selected: []});
                });
            }
            */
        },
        pandora_finddocuments: function() {
            var folder = pandora.getListData().folder,
                list = pandora.user.ui._collection,
                previousList = pandora.UI.getPrevious()._collection;
            if (list != previousList) {
                Ox.forEach(pandora.$ui.folderList, function($list, id) {
                    id != folder && $list.options('selected', []);
                });
                folder && pandora.$ui.folderList[folder].options({selected: [list]});
            }
        },
        pandora_text: function() {
            if (!pandora.user.ui.text) {
                Ox.forEach(pandora.$ui.folderList, function($list, id) {
                    $list.options('selected', []);
                });
            }
        }
    })
    return that;
};
