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

(function (ns) {
    var my = {};
    my.logger = gj.logging.getLogger('cmu');

    ns.documentIsReady = false;

    // Called immediately, before document ready; returns false if no further initialization should proceed
    ns.preInit = function () {
        my.logger.debug('preInit()');

        if (!cmu.browser.isSupported()) {
            return false;
        }
        if (!cmu.isMobile() && ns.isEligibleForRedirect()) {
            var redirected = ns.applyRedirect();
            if (redirected) {
                return false; // Don't bother with any further init
            }
        }

        // onready is too late
        AudioPlayer.setup(cmu.mediaUrl + 'audio-player/player.swf', { width: 460 });

        // Fake the underline under "Bezoeken" for mobile
        cmu.mobileOnly(function (isMobile) {
            if (!$('body').hasClass('mobileFakeBezoeken')) {
                return;
            }
            var bezoekenListItem = $('#navigation ul.main li').first();
            bezoekenListItem[isMobile ? 'addClass' : 'removeClass']('active');
        });

        // Hijack treasury exhibition links for non-mobile
        (function () {
            var links = '.treasuryExhibitionLink a, .setCollection a';

            cmu.mobileOnly(function (isMobile) {
                $(links)[isMobile ? 'unbind' : 'bind']('click', cmu.hijack.handlers.genericRedirect);
            });
        })();
    };

    ns.applyRedirect = function () {
        my.logger.debug('applyRedirect()');

        var redirectMatch = cmu.redirect.getMatch(window.location.pathname);

        if (redirectMatch) {
            my.logger.info('Redirecting to: ', redirectMatch);
            window.location.href = redirectMatch;
            return true;
        }
    };

    // Called on document ready
    ns.init = function () {
        my.logger.debug('init()');

        ns.documentIsReady = true;

        // Add the jsEnabled class as quickly as possible
        $('body').addClass('jsEnabled');

        // Provide a CSS hook to fine-tune button styling
        if ($.browser && $.browser.mozilla) {
            $('body').addClass('mozilla');
        }

        if (cmu.isIpad()) {
            $('body').addClass('iPad');
            $('a[href="/ontdekken/tagging/"]')
                .closest('li, .section.highscoreBox').hide();
        }

        if (ns.isGuestbook()) {
            ns.initGuestbook();
            return; // !!!
        }

        if (!cmu.isMobile()) {
            /**/
            ns.initMenu();
            ns.initDot();

            if (!cmu.isIpad()) {
                ns.initDrawer();
            }
            ns.initCarousel();
            ns.initTaggingGame();
            ns.initModalWindow();
            // ns.initPrintLinks();

            if (ns.isTreasury()) {
                ns.initTreasury();
            } else {
                ns.initPageGrid();
            }
            /**/

            /**
            var url = 'http://local.www.cmu.local.goeiejongens.nl/ontdekken/addtoset?object=20447';
            cmu.communicationController.ajax({
                url: url,
                type: 'GET',
                success: function (data, status, xhr) {
                    var $data = $(data);
                    cmu._modalWindow.open();
                    cmu._modalWindow.setContent($data);

                    cmu.setCreationForm({
                        viewNode: $data.find('form')
                    });
                }
            });
            /**/

        }

        // $('#search input[name=q]').focus();
    };

    ns.initDot = function () {
        my.logger.debug('initDot()');
        var dot;
        var constructor = ns.isCanvasSupported() ? 'dot' : 'dotNonCanvas';

        $('#wrapper').each(function () {
            dot = ns[constructor]({
                container: $(this)
            });
        });
        cmu._dot = dot;
        return dot;
    };

    // JavaScript-enriched dropdown menu
    ns.initMenu = function () {
        if (!cmu.browser.isSupported('dropdownMenu')) {
            return;
        }
        my.logger.debug('initMenu()');

        $('#navigation').each(function () {
            cmu.menu({
                viewNode: $(this)
                // hideDelay: 0,
                // speed: 0.5,
                // showSpeed: 300,
                // hideSpeed: 0,
            });
        });
    };

    ns.initDrawer = function () {
        my.logger.debug('initDrawer()');
        $('#drawer').each(function () {
            cmu._drawer = cmu.drawer({
                viewNode: $(this)
            });
        });
    };

    ns.initPageGrid = function () {
        // FIXME (yvdm): duplication with cmu.treasury.js
        var hijackPagers = function (elements, options) {
            my.logger.debug('hijackPagers()', elements);
            options = options || {};

            if (elements.length) {
                $('#drawer').addClass('showFakePager');
            } else {
                $('#drawer').removeClass('showFakePager');
            }

            elements.each(function (i, elm) {
                var $pager = $(elm);
                $pager.addClass('loadMore');

                // Remove the previous button, since we will only keep appending new results
                $pager.find('.previous').remove();

                var $nextButton = $pager.find('.next a');
                $nextButton.text(cmu.messages.moreResults);

                $nextButton.click(function () {
                    loadNewPage($pager, options);
                    return false;
                });
            });
        };

        // FIXME (yvdm): duplication with cmu.treasury.js
        var loadNewPage = function (pager, options) {
            my.logger.debug('loadNewPage()');
            options = options || {};

            var $pager = pager || views.results.find('.pager');
            var url = $pager.find('.next a').attr('href');

            if (!url) {
                my.logger.info('No more pages to load');
                return false;
            }
            $pager.addClass('loading');

            if (options.addDimensions) {
                url = cmu._objectGrid.addClientDimensions(url);
            }
            cmu.communicationController.ajax({
                url: url,
                type: 'GET',
                success: function (data, status, xhr) {
                    var $newData = $(data).children();
                    $pager.replaceWith($newData);

                    // FIXME (yvdm): duplication with objectGrid callback
                    cmu.hijack.click('genericRedirect', 'li a.objectDetail', $newData);
                    cmu.hijack.click('addToSet', 'a.addToSet', $newData);
                    hijackPagers($newData.filter('.pager'), options);
                    cmu.gridInit({viewNode: $newData.filter('ul.images')});

                    if (options.callback) {
                        options.callback.apply($newData);
                    }
                }
            });
        };

        // FIXME (yvdm): duplication with loadNewPage success callback
        var objectGrid = cmu.objectGrid({dataCallback: function () {
            cmu.hijack.click('genericRedirect', 'ul.images li a.objectDetail', this);
            cmu.hijack.click('addToSet', 'a.addToSet', this);
            hijackPagers(this.find('.pager'), {addDimensions: true, callback: function () {
                var scrollTop = $(document).height();
                if (cmu.isIpad()) {
                    scrollTop = scrollTop - $(window).height() - 50;
                }
                $('html, body').animate({scrollTop: scrollTop}, {duration: 2000});
            }});
            cmu.gridInit();
        }});
        cmu._objectGrid = objectGrid;
        var backgroundUrlElm = $('.setCollection .backgroundUrl');

        // Try getting the background URL from the Bezoeken exhibition
        if (!backgroundUrlElm.length) {
            backgroundUrlElm = $('.backgroundUrl');
        }

        if (backgroundUrlElm.length) {
            var url = backgroundUrlElm.find('a').attr('href');
            if (url) {
                objectGrid.setContext({
                    type: 'page',
                    url: url
                });
            }
        } else {
            // Trigger the random background by not specifying an object URL
            objectGrid.setContext({
                type: 'objectDetail'
            });
        }

        /**
        window.setTimeout(function () {
            var $link = $('.treasuryGrid li').eq(2).find('a.addToSet');
            $link.click();
            window.setTimeout(function () {
                cmu.notifySetAdded();
            }, 800);
        }, 400);
        /**/
    };

    ns.initCarousel = function () {
        my.logger.debug('initCarousel()');

        $('.carousel').each(function (i, elm) {
            cmu.carousel({
                viewNode: elm
                // initialIndex: 1,
                // slideTime: 1000,
                // fadeTime: 0,
                // loop: false
                // autoStart: false
            });
        });

        $('.setCollection.enabled:not(.hidden)').each(function (i, elm) {
            cmu.carousel({
                viewNode: elm,
                // initialIndex: 1,
                slideTime: 2700,
                fadeTime: 800
                // loop: false
                // autoStart: false
            });
        });
    };

    ns.initTaggingGame = function () {
        my.logger.debug('initTaggingGame()');

        $('.game.tagging').each(function (i, elm) {
            cmu._taggingGame = cmu.taggingGame({
                viewNode: elm,
                drawer: cmu._drawer
            });
        });
    };

    ns.initModalWindow = function () {
        my.logger.debug('initModalWindow()');

        $('#modalWindow').each(function () {
            cmu._modalWindow = cmu.modalWindow({
                viewNode: $(this)
            })
        });
    };

    ns.initPrintLinks = function ($scope) {
        my.logger.debug('initPrintLinks()');

        $scope = $scope || $(document);
        $scope.find('.printLink').addClass('enabled').click(function () {
            window.print();
            return false;
        });
    };

    ns.initTreasury = function () {
        my.logger.debug('initTreasury()');

        cmu._treasury = cmu.treasury({
            viewNode: $('#content')
        });

        var facetMoreLinks = 'ul.facets li.more.remote a';
        var $facetMoreLinks = $(facetMoreLinks);
        if ($facetMoreLinks.length) {
            $('#foldoutPopup').each(function (i, elm) {
                cmu.foldoutPopup({
                    viewNode: $(elm),
                    activationLinks: facetMoreLinks
                });
            });
        }

        // $('#facetSearchForm input').eq(0).focus();
    };

    ns.initGuestbook = function () {
        my.logger.info('initGuestbook()');

        $('#wrapper').each(function () {
            dot = ns.dot({
                container: $(this),
                radius: 66,
                interactive: false,
                lineOptions: {
                    lineFrom: [-116, 4],
                    lineTo: [-4, 56],
                    lineOffset: [0, 0],
                    canvasWidth: 120,
                    canvasHeight: 60
                }
            });
        });
    };

    ns.isTreasury = function () {
        return $('body').hasClass('treasury');
    };

    ns.isGuestbook = function () {
        return $('body').hasClass('guestbook');
    };

    ns.isEligibleForRedirect = function () {
        return window.cmu && window.cmu.attemptRedirect;
    };

    ns.isCanvasSupported = function () {
        return cmu.browser.isSupported('canvas');
    };

    ns.notifySetAdded = function () {
        cmu._drawer.highlight();

        window.setTimeout(function () {
            cmu._modalWindow.close({fade: true});
        }, 1000);
    };

})(window.cmu);


