window.cmu = window.cmu || {};

(function (ns) {

    ns.drawerTabs = function (spec, my) {
        var that;

        spec = spec || {};

        // ------------------------------------------------------------------
        // Shared properties
        // ------------------------------------------------------------------

        my = my || {};
        my.logger = gj.logging.getLogger('cmu.drawerTabs');

        my.drawer = spec.drawer;
        my.tabIndex = 0;
        my.cookieName = {
            tabIndex: 'cmu_drawerTabs_tabIndex',
            detailUrl: 'cmu_drawerTabs_detailUrl'
        };

        my.activeDetailUrl = null;
        // my.activeDetailUrl = '/ontdekken/drawer/set/4027/';

        my.$viewNode = spec.viewNode;
        my.$navigation = my.$viewNode.find('.navigation ul');
        my.$contentItems = my.$viewNode.find('.content > .inner').children();

        that = {};

        // ------------------------------------------------------------------
        // Private methods
        // ------------------------------------------------------------------

        var init = function () {
            my.logger.debug('init()');
            // my.logger.debug(my.$navigation, my.$content);
            my.$viewNode.addClass('jsEnabled');
            my.$navigation.children().click(tabClickHandler);

            cmu.hijack.click('genericRedirect', '.objectList a', my.$viewNode, closeDrawer);

            cmu.hijack.linkCallback('.setList a.setDetail', my.$viewNode, function (url) {
                setActiveDetailUrl(url);
            });

            my.$viewNode.find('form.lastObjects').submit(function (e) {
                my.logger.debug(e.type);
                my.drawer.close();
                try {
                    gj.ajaxForm(this, $(this).attr('action'), null,
                        function (data) {
                            var $data = $(data);
                            cmu._modalWindow.setContent($(data));
                            cmu._modalWindow.open();
                        });
                } catch (e) {
                    my.logger.warning('Something went wrong', e);
                }
            });

            if (typeof my.drawer.requestedSelectedTab === 'number') {
                my.logger.info('Explicit request from drawer for tab index ' + my.drawer.requestedSelectedTab );
                setTabIndex(my.drawer.requestedSelectedTab);
                my.drawer.requestedSelectedTab = null; // Clear the request
            } else {
                restoreState();
                draw();
            }
        };

        var setActiveDetailUrl = function (url) {
            my.activeDetailUrl = url;
            draw();
            persistState();
        };

        var tabClickHandler = function (e) {
            my.logger.debug(this, e.type);
            setTabIndex($(this).index());
        };

        var setTabIndex = function (tabIndex) {
            my.logger.debug('setTabIndex(' + tabIndex + ')');
            my.tabIndex = tabIndex;
            setActiveDetailUrl(null);
        };

        var draw = function () {
            my.logger.debug('draw()');

            // Select the right tab
            my.$navigation.children().each(function (i) {
                $(this)[i === my.tabIndex ? 'addClass': 'removeClass']('active');
            });

            // Show the proper content
            my.$contentItems.each(function (i, elm) {
                $(elm)[i === my.tabIndex ? 'show': 'hide']();
            });

            if (my.activeDetailUrl) {
                gotoDetailView();
            } else {
                gotoListView();
            }
        };

        var persistState = function () {
            my.logger.debug('persistState()');

            $.cookie(my.cookieName.tabIndex, my.tabIndex, {path: '/', expires: 365});
            $.cookie(my.cookieName.detailUrl, my.activeDetailUrl, {path: '/', expires: 365});
        };

        var restoreState = function () {
            my.logger.debug('restoreState()');

            var tabIndex = $.cookie(my.cookieName.tabIndex);

            if (tabIndex) {
                my.tabIndex = parseInt(tabIndex);
                my.logger.debug('Restored tab index: ', my.tabIndex);
            }

            var detailUrl = $.cookie(my.cookieName.detailUrl);

            if (detailUrl) {
                my.activeDetailUrl = detailUrl;
                my.logger.debug('Restored detail URL: ', my.activeDetailUrl);
            }
        };

        var getActiveContentItem = function () {
            my.logger.debug('getActiveContentItem()');
            return my.$contentItems.eq(my.tabIndex);
        };

        var gotoDetailView = function () {
            my.logger.debug('gotoDetailView()');

            if (!my.activeDetailUrl) {
                my.logger.warning('No URL for detail to load');
                return;
            }

            var $contentItem = getActiveContentItem();

            cmu.communicationController.ajax({
                url: my.activeDetailUrl,
                type: 'GET',
                success: function (data, status, xhr) {
                    var $data = $(data);
                    $contentItem.find('.listView').hide();
                    $contentItem.append($data);

                    cmu.hijack.click('genericRedirect', '.objects dt a', $data, closeDrawer);
                    cmu.hijack.click('genericRedirect', '.setDetailLink a', $data);

                    $data.find('.editSetLink a').click(function (e) {
                        $data.addClass('editMode');
                        e.preventDefault();
                    });
                    $data.find('.removeLink a').click(removeObjectClickHandler);
                }
            });
        };

        var removeObjectClickHandler = function (e) {
            my.logger.debug(this, e.type);
            var url = $(this).attr('href');

            cmu.communicationController.ajax({
                url: url,
                type: 'GET',
                success: function (data, status, xhr) {
                    my.drawer.refresh();
                }
            });
            e.preventDefault();
        };

        var gotoListView = function () {
            my.logger.debug('gotoListView()');
            var $contentItem = getActiveContentItem();
            $contentItem.find('.listView').show().next().remove();
            $contentItem.find('input[type="text"]').first().focus();
        };

        var closeDrawer = function () {
            my.drawer && my.drawer.close();
        };

        // ------------------------------------------------------------------
        // Public methods
        // ------------------------------------------------------------------

        that.setTabIndex = setTabIndex;

        // ------------------------------------------------------------------
        // Constructor
        // ------------------------------------------------------------------

        init();
        return that;
    };

})(window.cmu);

