(function (factory) {
    'use strict';
    define('SBEFolderListingSetup',
        ['Abilian', 'jquery', 'jquery.dataTables', 'bootbox'],
        factory);
}(function (Abilian, $, jqDT, bootbox) {
    'use strict';

    function setupFolderListing() {
        $.fn.dataTableExt.afnFiltering.push(
            function (oSettings, aData, iDataIndex) {
                var filter_value = $("#filter").val();
                var row_text = aData[2].trim();
                return row_text.match(new RegExp(filter_value, "i"));
            }
        );

        var config = document.getElementById('objects-table')
            .parentElement
            .nextElementSibling;
        config = JSON.parse(config.textContent);

        var dtParams = {
                aoColumns: [
                    {asSorting: [], sWidth: '1%'},
                    {bVisible: false, sType: 'cmistype'},
                    {bVisible: false, sType: 'string'},
                    {
                        aDataSort: [1, 2], asSorting: ['asc', 'desc'],
                        sWidth: '31%'
                    },
                    {
                        aDataSort: [1, 4], asSorting: ['asc', 'desc'],
                        sWidth: '8%'
                    },
                    {'bVisible': false},
                    {'bVisible': false},
                    {
                        aDataSort: [5, 6, 1], asSorting: ['asc', 'desc'],
                        sWidth: '18%'
                    },
                    {bVisible: false, sType: 'date'},
                    {
                        aDataSort: [1, 8], asSorting: ['asc', 'desc'],
                        sWidth: '12%'
                    }
                ],
                //{# see http://datatables.net/ref #}
                sPaginationType: "bootstrap",
                bFilter: true,
                bLengthChange: false,
                bStateSave: true,
                iDisplayLength: 50,
                sDom: 'lrtip'
            },
            objectsTable = $('#objects-table').dataTable(dtParams);

        /* on page reload datatable keep previously filtered rows. Force
         refilter with current filter value */
        var filter = $('#filter');
        objectsTable.fnFilter(filter.val());

        /* check / uncheck all */
        function setSelected(checked) {
            $("input[name='object-selected']").prop('checked', checked);
        }

        $("a[href='#select-all']").click(function (e) {
            setSelected(true);
            e.preventDefault();
        });

        $("a[href='#unselect-all']").click(function (e) {
            setSelected(false);
            e.preventDefault();
        });

        /* enter key */
        filter.bind('keypress', function (e) {
            if (e.keyCode == 13) {
                /* let return key for refilter */
                objectsTable.fnFilter(this.value);
                e.preventDefault();
            }
        });

        filter.bind('keyup', function (e) {
            if (e.keyCode == 13) {
                e.preventDefault();
            }
            objectsTable.fnFilter(this.value);
        });

        /* actions */
        function onClickDelete(e) {
            e.preventDefault();
            var $button = $(this),
                buttonForm = $(this.form),
                msg = config.deleteConfirmMsg,
                elements = $(document.forms['folder-listing'])
                    .find('input[name="object-selected"]:checked')
                    .closest('td')
                    .next('td'),
                elList = $('<ul />').attr({'class': 'folder-items'});

            elements.each(function () {
                var li = $('<li />').html($(this).html());
                elList.append(li);
            });
            msg += $('<div />').append(elList).html();

            bootbox.confirm(
                msg,
                function (confirm) {
                    if (confirm) {
                        var actionVal = $('<input />',
                            {
                                'type': 'hidden',
                                'name': 'action',
                                'value': $button.attr('value')
                            });
                        buttonForm.append(actionVal);
                        buttonForm.submit();
                    }
                });
        }

        $('button.btn-danger[value="delete"]').click(onClickDelete);

        /* Move file functions */
        var moveFileFillListing = function (modal, folder_url) {
            var tbody = modal.find('tbody');
            var breadcrumbs = modal.find('ul.breadcrumb');

            $.ajax({
                type: 'GET',
                dataType: "json",
                url: folder_url,
                cache: false,
                success: function (data) {
                    var bc = $(data.breadcrumbs);
                    breadcrumbs.empty();

                    bc.each(function () {
                        var li = $('<li />');
                        var link = $('<a>' + this.title + '</a>')
                            .attr('href', this.url)
                            .attr('data-id', this.id);

                        link.appendTo(li);
                        li.appendTo(breadcrumbs);
                    });

                    var folders = $(data.folders);
                    tbody.empty();

                    folders.each(function () {
                        var tr = $('<tr />');
                        var td = $('<td />');
                        var link = $('<a>' + this.title + '</a>').attr('href', this.url)
                            .attr('data-id', this.id)
                            .appendTo(td);
                        td.append($('<span>/</span>').attr('class', 'divider'));
                        tr.append(td).appendTo(tbody);
                    });

                    var folderSelectable = data['current_folder_selectable'];
                    var button = $('#modal-move-button-submit');
                    button.attr('disabled', !folderSelectable);
                    if (!folderSelectable ^ button.hasClass('disabled')) {
                        button.toggleClass('disabled');
                    }
                }
            });
        };

        $(document).on(
            'click',
            '#modal-move-files-directory-listing a',
            function (e) {
                var self = $(this),
                    folder_id = self.attr('data-id'),
                    modal = $('#modal-move-files'),
                    url = self.attr('href');

                modal.find('input[name="target-folder"]')
                    .attr('value', folder_id);

                moveFileFillListing(modal, url);
                e.preventDefault();
            });

        $('#modal-move-files').on('show.bs.modal', function () {
            var modal = $(this),
                listing_form = $(document.forms["folder-listing"]),
                elements = listing_form.find("input[name='object-selected']:checked"),
                footer_inputs = $("#modal-move-files-inputs");

            footer_inputs.empty();
            elements.clone()
                .attr('type', 'hidden')
                .appendTo(footer_inputs);

            var target = $('<input />')
                .attr({
                    type: 'hidden',
                    name: 'target-folder',
                    value: ''
                });
            target.appendTo(footer_inputs);

            var l = document.location;
            /* don't use document.location + '/json': if anchors in url '/json'
             is ignored, ie http://.../folder#anchor */
            moveFileFillListing(
                modal,
                l.protocol + "//" + l.host + l.pathname + '/json' + l.search
            );
        });
    } // END setupFolderListing

    return setupFolderListing;
}));
