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

(function (ns) {

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

        spec = spec || {};
        spec.header = spec.header || '.header';
        spec.main = spec.main || '.main';

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

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

        my.$viewNode = spec.viewNode;
        my.$header = spec.viewNode.find(spec.header);
        my.$main = spec.viewNode.find(spec.main);

        my.userCookie = 'user';
        my.loadingClass = 'loading';

        my.initialized = false;
        my.isOpen = false;
        my.tabs = null;
        my.pendingLoginCallback = null;

        that = {};

        that.requestedSelectedTab = null;

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

        var init = function () {
            my.logger.debug('init()');
            my.$viewNode.addClass('jsEnabled');
            my.$viewNode.find('.closeButton a').click(function (e) {
                close();

                /*
                Important: prevent the click from propagating further, to
                prevent the handler on the full header (bound on close) from
                toggling again.
                */
                e.stopPropagation();
            });

            my.$header.find('.anonymous').click(function () {
                if (my.isOpen) {
                    my.tabs.setTabIndex(0);
                } else {
                    that.requestedSelectedTab = 0;
                }
            });

            my.$header.find('.lastObjects').click(function (e) {
                that.requestedSelectedTab = isLoggedIn() ? 0 : 1;
            });

            my.$header.find('.fakePager').click(function (e) {
                my.$viewNode.removeClass('showFakePager');
                var nextButton = $('.treasuryGrid .pager .next a');
                nextButton.click();
                return false;
            });

            my.$viewNode.bind('loadStart', function (e) {
                my.logger.info(e.type);

                my.$viewNode.addClass(my.loadingClass);

                // Hide previously loaded content
                // (don't remove, since gj.ajaxForm() will replace it)
                getContent().hide();
            });

            my.$viewNode.bind('loadEnd', function (e) {
                my.logger.info(e.type);

                my.$viewNode.removeClass(my.loadingClass);

                initDrawer();
                updateLoginStatus();
            });

            draw();
            my.initialized = true;

            updateLoginStatus();

            return that;
        };

        var updateLoginStatus = function () {
            var user = $.cookie(my.userCookie);
            my.logger.debug('updateLoginStatus()', user);

            my.$viewNode.find('.username').text(user);

            my.$viewNode.addClass(user ? 'authenticated' : 'anonymous');
            my.$viewNode.removeClass(user ? 'anonymous' : 'authenticated');

            if (user) {
                loginComplete();
            }
        }

        var isLoggedIn = function () {
            var loggedIn = Boolean($.cookie(my.userCookie));
            my.logger.debug('isLoggedIn()', loggedIn);
            return loggedIn;
        };

        var toggle = function () {
            my.logger.debug('toggle()');
            my.isOpen = !my.isOpen;
            draw();
        };

        var draw = function () {
            my.logger.debug('draw()');
            if (my.isOpen) {
                open();
            } else {
                close();
            }
        };

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

            my.pendingLoginCallback = callback;

            if (isLoggedIn()) {
                loginComplete();
                return;
            }
            open();
        };

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

            if (my.pendingLoginCallback) {
                my.pendingLoginCallback();
                my.pendingLoginCallback = null;
                close();
            }
        };

        var open = function () {
            my.logger.debug('open()');
            my.$viewNode[my.initialized ? 'animate' : 'css']({'bottom': 0});
            my.$viewNode.addClass('open');
            $('body').addClass('drawerOpen');
            my.$header.unbind('click', toggle);
            my.$viewNode.bind('clickoutside', close);

            loadData();

            my.isOpen = true;
        };

        var close = function () {
            my.logger.debug('close()');
            my.isOpen = false;
            that.requestedSelectedTab = null;
            my.pendingLoginCallback = null;

            var properties = {'bottom': -505};
            if (my.initialized) {
                my.$viewNode.animate(properties, closeFinish);
            } else {
                my.$viewNode.css(properties);
                closeFinish();
            }

            my.$viewNode.removeClass('open');
            my.$header.bind('click', toggle);
            my.$viewNode.unbind('clickoutside', close);
        };

        var closeFinish = function () {
            my.logger.debug('closeFinish()');
            if (my.isOpen) {
                my.logger.info('Opened again, ignoring');
                return;
            }
            removeContent();
            $('body').removeClass('drawerOpen');
        };

        var removeContent = function () {
            my.logger.debug('removeContent()');
            getContent().remove();
        };

        var loadData = function () {
            var url = cmu.urls.drawer;
            my.$viewNode.addClass(my.loadingClass);

            // Remove previously loaded content
            removeContent();

            cmu.communicationController.ajax({
                url: url,
                type: 'GET',
                success: function (data, status, xhr) {
                    my.$viewNode.removeClass(my.loadingClass);
                    var $newData = $(data);
                    my.$main.append($newData);
                    initDrawer();
                }
            });
        };

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

            var $drawerContent = getContent();

            if (!$drawerContent.length) {
                my.logger.warning('No drawer content found to initalize');
                return;
            }

            my.tabs = ns.drawerTabs({
                viewNode: $drawerContent,
                drawer: that
            });
            $drawerContent.find('.removeLink a').click(function (e) {
                var url = $(this).attr('href');

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

        var getContent = function () {
            return my.$main.children('.inner:not(.loader)');
        };

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

            // my.$viewNode.effect('highlight', {color:'#b1b1b1'}, 3000);

            /**/
            my.$viewNode.fadeOut();

            window.setTimeout(function () {
                my.$viewNode.fadeIn();
            }, 500);
            /**/

            /*
            window.setTimeout(function () {
                my.$viewNode.fadeOut();
            }, 1000);

            window.setTimeout(function () {
                my.$viewNode.fadeIn();
            }, 1500);
            */
        };

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

        that.open = open;
        that.close = close;
        that.highlight = highlight;
        that.initDrawer = initDrawer;
        that.updateLoginStatus = updateLoginStatus;
        that.login = login;
        that.isLoggedIn = isLoggedIn;

        that.refresh = function () {
            draw();
        };

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

        return init();
    };

})(window.cmu);

