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

(function (ns) {

    var callbackRegistry = {
        mobile: [],
        notMobile: []
    };
    var resizeDelay = 200;
    var resizeTimeout;
    var isMobile; // Cached for detecting changes;

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

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

        // If possible, we use whether CSS has been applied to detect mobile
        // However, if the document ready has not been called yet, this won't
        // work, so we fall back to measuring the available width.
        if (ns.documentIsReady) {
            return $('#mobileMarker').css('visibility') == 'visible';
        } else {
            /* IMPORTANT: width duplicated in CSS @media directive in main.css */
            return $(window).width() <= 640;
        }
    };

    ns.isIpad = function () {
        return (window.navigator.platform.indexOf('iPad') != -1);
    };

    ns.mobileOnly = function (callbackMobile, callbackNotMobile) {
        callbackRegistry.mobile.push(callbackMobile);

        // If no second callback was specified, use the first callback for "not mobile" as well
        callbackNotMobile = callbackNotMobile || callbackMobile;

        callbackRegistry.notMobile.push(callbackNotMobile);
    };

    ns.doCallbacks = function () {
        my.logger.debug('doCallbacks()');
        var callbacks = callbackRegistry[isMobile ? 'mobile' : 'notMobile'];
        for (var i = 0; i < callbacks.length; i++) {
            callbacks[i].apply(window, [isMobile]);
        }
    };

    ns.handleMobileState = function () {
        var isMobileCurrently = ns.isMobile();
        my.logger.debug('handleMobileState(), currently mobile: ', isMobileCurrently);

        if (isMobileCurrently !== isMobile) {
            isMobile = isMobileCurrently;
            ns.doCallbacks();
        }
    };

    ns.handleResize = function () {
        if (resizeTimeout) {
            window.clearTimeout(resizeTimeout);
            resizeTimeout = null;
        }
        resizeTimeout = window.setTimeout(ns.handleMobileState, resizeDelay);
    };

    // Register resize handler
    $(window).resize(ns.handleResize);

    $(document).ready(ns.handleMobileState);

})(window.cmu);

