3
* Copyright(c) 2006-2009, Ext JS, LLC.
6
* http://extjs.com/license
11
* @extends Ext.util.Observable
12
* History management component that allows you to register arbitrary tokens that signify application
13
* history state on navigation actions. You can then handle the history {@link #change} event in order
14
* to reset your application UI to the appropriate state when the user navigates forward or backward through
15
* the browser history stack.
18
Ext.History = (function () {
19
var iframe, hiddenField;
24
var href = top.location.href, i = href.indexOf("#");
25
return i >= 0 ? href.substr(i + 1) : null;
29
hiddenField.value = currentToken;
32
function handleStateChange(token) {
34
Ext.History.fireEvent('change', token);
37
function updateIFrame (token) {
38
var html = ['<html><body><div id="state">',token,'</div></body></html>'].join('');
40
var doc = iframe.contentWindow.document;
50
function checkIFrame() {
51
if (!iframe.contentWindow || !iframe.contentWindow.document) {
52
setTimeout(checkIFrame, 10);
56
var doc = iframe.contentWindow.document;
57
var elem = doc.getElementById("state");
58
var token = elem ? elem.innerText : null;
62
setInterval(function () {
64
doc = iframe.contentWindow.document;
65
elem = doc.getElementById("state");
67
var newtoken = elem ? elem.innerText : null;
69
var newHash = getHash();
71
if (newtoken !== token) {
73
handleStateChange(token);
74
top.location.hash = token;
77
} else if (newHash !== hash) {
79
updateIFrame(newHash);
86
Ext.History.fireEvent('ready', Ext.History);
90
currentToken = hiddenField.value ? hiddenField.value : getHash();
96
setInterval(function () {
97
var newHash = getHash();
98
if (newHash !== hash) {
100
handleStateChange(hash);
105
Ext.History.fireEvent('ready', Ext.History);
111
* The id of the hidden field required for storing the current history token.
115
fieldId: 'x-history-field',
117
* The id of the iframe required by IE to manage the history stack.
121
iframeId: 'x-history-frame',
126
* Initialize the global History instance.
127
* @param {Boolean} onReady (optional) A callback function that will be called once the history
128
* component is fully initialized.
129
* @param {Object} scope (optional) The callback scope
131
init: function (onReady, scope) {
133
Ext.callback(onReady, scope, [this]);
137
Ext.onReady(function(){
138
Ext.History.init(onReady, scope);
142
hiddenField = Ext.getDom(Ext.History.fieldId);
144
iframe = Ext.getDom(Ext.History.iframeId);
146
this.addEvents('ready', 'change');
148
this.on('ready', onReady, scope, {single:true});
154
* Add a new token to the history stack. This can be any arbitrary value, although it would
155
* commonly be the concatenation of a component id and another id marking the specifc history
156
* state of that component. Example usage:
158
// Handle tab changes on a TabPanel
159
tabPanel.on('tabchange', function(tabPanel, tab){
160
Ext.History.add(tabPanel.id + ':' + tab.id);
163
* @param {String} token The value that defines a particular application-specific history state
164
* @param {Boolean} preventDuplicates When true, if the passed token matches the current token
165
* it will not save a new history step. Set to false if the same state can be saved more than once
166
* at the same history stack location (defaults to true).
168
add: function (token, preventDup) {
169
if(preventDup !== false){
170
if(this.getToken() == token){
175
return updateIFrame(token);
177
top.location.hash = token;
183
* Programmatically steps back one step in browser history (equivalent to the user pressing the Back button).
190
* Programmatically steps forward one step in browser history (equivalent to the user pressing the Forward button).
197
* Retrieves the currently-active history token.
198
* @return {String} The token
200
getToken: function() {
201
return ready ? currentToken : getHash();
205
Ext.apply(Ext.History, new Ext.util.Observable());
b'\\ No newline at end of file'