/**
* @class elFinder.history
* Store visited folders
* and provide "back" and "forward" methods
*
* @author Dmitry (dio) Levashov
*/
elFinder.prototype.history = function(fm) {
"use strict";
var self = this,
/**
* Update history on "open" event?
*
* @type Boolean
*/
update = true,
/**
* Directories hashes storage
*
* @type Array
*/
history = [],
/**
* Current directory index in history
*
* @type Number
*/
current,
/**
* Clear history
*
* @return void
*/
reset = function() {
history = [fm.cwd().hash];
current = 0;
update = true;
},
/**
* Browser native history object
*/
nativeHistory = (fm.options.useBrowserHistory && window.history && window.history.pushState)? window.history : null,
/**
* Open prev/next folder
*
* @Boolen open next folder?
* @return jQuery.Deferred
*/
go = function(fwd) {
if ((fwd && self.canForward()) || (!fwd && self.canBack())) {
update = false;
return fm.exec('open', history[fwd ? ++current : --current]).fail(reset);
}
return $.Deferred().reject();
},
/**
* Sets the native history.
*
* @param String thash target hash
*/
setNativeHistory = function(thash) {
if (nativeHistory && (! nativeHistory.state || nativeHistory.state.thash !== thash)) {
nativeHistory.pushState({thash: thash}, null, location.pathname + location.search + (thash? '#elf_' + thash : ''));
}
};
/**
* Return true if there is previous visited directories
*
* @return Boolen
*/
this.canBack = function() {
return current > 0;
};
/**
* Return true if can go forward
*
* @return Boolen
*/
this.canForward = function() {
return current < history.length - 1;
};
/**
* Go back
*
* @return void
*/
this.back = go;
/**
* Go forward
*
* @return void
*/
this.forward = function() {
return go(true);
};
// bind to elfinder events
fm.bind('init', function() {
if (nativeHistory && !nativeHistory.state) {
setNativeHistory(fm.startDir());
}
})
.open(function() {
var l = history.length,
cwd = fm.cwd().hash;
if (update) {
current >= 0 && l > current + 1 && history.splice(current+1);
history[history.length-1] != cwd && history.push(cwd);
current = history.length - 1;
}
update = true;
setNativeHistory(cwd);
})
.reload(fm.options.reloadClearHistory && reset);
};