188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project/**
288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project * jQuery history event v0.1
388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project * Copyright (c) 2008 Tom Rodenberg <tarodenberg gmail com>
488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project * Licensed under the GPL (http://www.gnu.org/licenses/gpl.html) license.
588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project */
688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project(function($) {
788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    var currentHash, previousNav, timer, hashTrim = /^.*#/;
888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    var msie = {
1088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        iframe: null,
1188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        getDoc: function() {
1288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            return msie.iframe.contentWindow.document;
1388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        },
1488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        getHash: function() {
1588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            return msie.getDoc().location.hash;
1688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        },
1788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        setHash: function(hash) {
1888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            var d = msie.getDoc();
1988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            d.open();
2088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            d.close();
2188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            d.location.hash = hash;
2288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        }
2388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    };
2488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
2588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    var historycheck = function() {
2688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        var hash = msie.iframe ? msie.getHash() : location.hash;
2788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        if (hash != currentHash) {
2888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            currentHash = hash;
2988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            if (msie.iframe) {
3088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project                location.hash = currentHash;
3188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            }
3288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            var current = $.history.getCurrent();
3388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            $.event.trigger('history', [current, previousNav]);
3488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            previousNav = current;
3588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        }
3688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    };
3788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
3888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $.history = {
3988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        add: function(hash) {
4088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            hash = '#' + hash.replace(hashTrim, '');
4188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            if (currentHash != hash) {
4288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project                var previous = $.history.getCurrent();
4388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project                location.hash = currentHash = hash;
4488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project                if (msie.iframe) {
4588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project                    msie.setHash(currentHash);
4688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project                }
4788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project                $.event.trigger('historyadd', [$.history.getCurrent(), previous]);
4888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            }
4988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            if (!timer) {
5088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project                timer = setInterval(historycheck, 100);
5188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            }
5288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        },
5388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        getCurrent: function() {
5488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            if (currentHash) {
5588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project              return currentHash.replace(hashTrim, '');
5688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            } else {
5788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project              return "";
5888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            }
5988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        }
6088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    };
6188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
6288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $.fn.history = function(fn) {
6388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        $(this).bind('history', fn);
6488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    };
6588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
6688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $.fn.historyadd = function(fn) {
6788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        $(this).bind('historyadd', fn);
6888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    };
6988b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project
7088b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    $(function() {
7188b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        currentHash = location.hash;
7288b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        if ($.browser.msie) {
7388b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            msie.iframe = $('<iframe style="display:none" src="javascript:false;"></iframe>').prependTo('body')[0];
7488b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            msie.setHash(currentHash);
7588b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project            currentHash = msie.getHash();
7688b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project        }
7788b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project    });
7888b607994a148f4af5bffee163e39ce8296750c6The Android Open Source Project})(jQuery);
79