1920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson/**
2920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * jQuery history event v0.1
3920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Copyright (c) 2008 Tom Rodenberg <tarodenberg gmail com>
4920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Licensed under the GPL (http://www.gnu.org/licenses/gpl.html) license.
5920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */
6920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson(function($) {
7920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    var currentHash, previousNav, timer, hashTrim = /^.*#/;
8920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
9920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    var msie = {
10920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        iframe: null,
11920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        getDoc: function() {
12920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            return msie.iframe.contentWindow.document;
13920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        },
14920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        getHash: function() {
15920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            return msie.getDoc().location.hash;
16920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        },
17920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        setHash: function(hash) {
18920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            var d = msie.getDoc();
19920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            d.open();
20920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            d.close();
21920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            d.location.hash = hash;
22920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
23920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    };
24920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
25920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    var historycheck = function() {
26920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        var hash = msie.iframe ? msie.getHash() : location.hash;
27920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if (hash != currentHash) {
28920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            currentHash = hash;
29920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            if (msie.iframe) {
30920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                location.hash = currentHash;
31920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            }
32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            var current = $.history.getCurrent();
33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            $.event.trigger('history', [current, previousNav]);
34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            previousNav = current;
35920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
36920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    };
37920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
38920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    $.history = {
39920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        add: function(hash) {
40920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            hash = '#' + hash.replace(hashTrim, '');
41920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            if (currentHash != hash) {
42920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                var previous = $.history.getCurrent();
43920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                location.hash = currentHash = hash;
44920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                if (msie.iframe) {
45920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                    msie.setHash(currentHash);
46920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                }
47920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                $.event.trigger('historyadd', [$.history.getCurrent(), previous]);
48920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            }
49920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            if (!timer) {
50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson                timer = setInterval(historycheck, 100);
51920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            }
52920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        },
53920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        getCurrent: function() {
54920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            if (currentHash) {
55920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              return currentHash.replace(hashTrim, '');
56920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            } else {
57920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson              return "";
58920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            }
59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    };
61920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
62920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    $.fn.history = function(fn) {
63920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        $(this).bind('history', fn);
64920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    };
65920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
66920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    $.fn.historyadd = function(fn) {
67920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        $(this).bind('historyadd', fn);
68920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    };
69920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
70920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    $(function() {
71920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        currentHash = location.hash;
72920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        if ($.browser.msie) {
73920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            msie.iframe = $('<iframe style="display:none" src="javascript:false;"></iframe>').prependTo('body')[0];
74920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            msie.setHash(currentHash);
75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson            currentHash = msie.getHash();
76920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        }
77920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    });
78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson})(jQuery);
79