mambax7/extgallery

View on GitHub
assets/js/galleria/plugins/history/galleria.history.js

Summary

Maintainability
A
3 hrs
Test Coverage
/**
 * Galleria History Plugin 2012-04-04
 * http://galleria.io
 *
 * Licensed under the MIT license
 * https://raw.github.com/aino/galleria/master/LICENSE
 *
 */

(function ($, window) {

    /*global jQuery, Galleria, window */

    Galleria.requires(1.25, 'The History Plugin requires Galleria version 1.2.5 or later.');

    Galleria.History = (function () {

        var onloads = [],

            init = false,

            loc = window.location,

            doc = window.document,

            ie = Galleria.IE,

            support = 'onhashchange' in window && ( doc.mode === undefined || doc.mode > 7 ),

            iframe,

            get = function (winloc) {
                if (iframe && !support && Galleria.IE) {
                    winloc = winloc || iframe.location;
                } else {
                    winloc = loc;
                }
                return parseInt(winloc.hash.substr(2), 10);
            },

            saved = get(loc),

            callbacks = [],

            onchange = function () {
                $.each(callbacks, function (i, fn) {
                    fn.call(window, get());
                });
            },

            ready = function () {
                $.each(onloads, function (i, fn) {
                    fn();
                });

                init = true;
            },

            setHash = function (val) {
                return '/' + val;
            };

        // always remove support if IE < 8
        if (support && ie < 8) {
            support = false;
        }

        if (!support) {

            $(function () {

                var interval = window.setInterval(function () {

                    var hash = get();

                    if (!isNaN(hash) && hash != saved) {
                        saved = hash;
                        loc.hash = setHash(hash);
                        onchange();
                    }

                }, 50);

                if (ie) {

                    $('<iframe tabindex="-1" title="empty">').hide().attr('src', 'about:blank').one('load', function () {

                        iframe = this.contentWindow;

                        ready();

                    }).insertAfter(doc.body);

                } else {
                    ready();
                }
            });
        } else {
            ready();
        }

        return {

            change: function (fn) {

                callbacks.push(fn);

                if (support) {
                    window.onhashchange = onchange;
                }
            },

            set: function (val) {

                if (isNaN(val)) {
                    return;
                }

                if (!support && ie) {

                    this.ready(function () {

                        var idoc = iframe.document;
                        idoc.open();
                        idoc.close();

                        iframe.location.hash = setHash(val);

                    });
                }

                loc.hash = setHash(val);
            },

            ready: function (fn) {
                if (!init) {
                    onloads.push(fn);
                } else {
                    fn();
                }
            }
        };
    }());

}(jQuery, this));