blob: ef96ec39d76b186b20ad1425f2259b3c02962f38 [file] [log] [blame]
The Android Open Source Project88b60792009-03-03 19:28:42 -08001/**
2 * jQuery history event v0.1
3 * Copyright (c) 2008 Tom Rodenberg <tarodenberg gmail com>
4 * Licensed under the GPL (http://www.gnu.org/licenses/gpl.html) license.
5 */
6(function($) {
7 var currentHash, previousNav, timer, hashTrim = /^.*#/;
8
9 var msie = {
10 iframe: null,
11 getDoc: function() {
12 return msie.iframe.contentWindow.document;
13 },
14 getHash: function() {
15 return msie.getDoc().location.hash;
16 },
17 setHash: function(hash) {
18 var d = msie.getDoc();
19 d.open();
20 d.close();
21 d.location.hash = hash;
22 }
23 };
24
25 var historycheck = function() {
26 var hash = msie.iframe ? msie.getHash() : location.hash;
27 if (hash != currentHash) {
28 currentHash = hash;
29 if (msie.iframe) {
30 location.hash = currentHash;
31 }
32 var current = $.history.getCurrent();
33 $.event.trigger('history', [current, previousNav]);
34 previousNav = current;
35 }
36 };
37
38 $.history = {
39 add: function(hash) {
40 hash = '#' + hash.replace(hashTrim, '');
41 if (currentHash != hash) {
42 var previous = $.history.getCurrent();
43 location.hash = currentHash = hash;
44 if (msie.iframe) {
45 msie.setHash(currentHash);
46 }
47 $.event.trigger('historyadd', [$.history.getCurrent(), previous]);
48 }
49 if (!timer) {
50 timer = setInterval(historycheck, 100);
51 }
52 },
53 getCurrent: function() {
54 if (currentHash) {
55 return currentHash.replace(hashTrim, '');
56 } else {
57 return "";
58 }
59 }
60 };
61
62 $.fn.history = function(fn) {
63 $(this).bind('history', fn);
64 };
65
66 $.fn.historyadd = function(fn) {
67 $(this).bind('historyadd', fn);
68 };
69
70 $(function() {
71 currentHash = location.hash;
72 if ($.browser.msie) {
73 msie.iframe = $('<iframe style="display:none" src="javascript:false;"></iframe>').prependTo('body')[0];
74 msie.setHash(currentHash);
75 currentHash = msie.getHash();
76 }
77 });
78})(jQuery);