blob: ad41cf196586e343d5c3706b0e22dac90b0b1f08 [file] [log] [blame]
/**
* PSFixed PSFixed.js file.
* This plugin is a fake persistent storage backed. It is configured with a
* fixed list of stored objects and presents them to the user for insertion.
* A sample config is below:
*
* PSFixed.config = {
* 'xinha.png': {
* $type: 'image',
* URL: 'http://trac.xinha.org/chrome/common/trac_banner.png'
* },
* 'browser': {
* $type: 'folder',
* 'firefox.png': {
* $type: 'image',
* URL: 'http://www.mozilla.com/img/tignish/firefox/vs-firefox-logo.png'
* }
* }
* }
*/
(function() {
var PSFixed = window.PSFixed = function PSFixed(editor) {
this.editor = editor;
}
PSFixed._pluginInfo = {
name : "PSFixed",
version : "2.0",
developer : "Douglas Mayle",
developer_url : "http://xinha.org",
license : "BSD"
};
PSFixed.prototype.onGenerateOnce = function () {
// We use _prepareDialog to asynchronously load the dialog markup and then
// perform necessary processing.
this._registerBackend();
};
PSFixed.prototype._registerBackend = function(timeWaited) {
var editor = this.editor;
var self = this;
if (!timeWaited) {
timeWaited = 0;
}
// Retry over a period of ten seconds to register. We back off exponentially
// to limit resouce usage in the case of misconfiguration.
var registerTimeout = 10000;
if (timeWaited > registerTimeout) {
// This is most likely a configuration error. We're loaded and
// PersistentStorage is not.
return;
}
if (!editor.plugins['PersistentStorage'] ||
!editor.plugins['PersistentStorage'].instance ||
!editor.plugins['PersistentStorage'].instance.ready) {
window.setTimeout(function() {self._registerBackend(timeWaited ? timeWaited*2 : 50);}, timeWaited ? timeWaited : 50);
return;
}
editor.plugins['PersistentStorage'].instance.registerBackend('PSFixed', this);
}
PSFixed.prototype.loadData = function (asyncCallback) {
// We don't expect the user to set the type on the root folder, so we set it
// ourselves.
if (!this.config.$type) {
this.config.$type = 'folder';
}
asyncCallback(this.config);
}
var treeRecurse = function treeRecurse(tree, callback, root) {
if (typeof root == 'undefined') {
root = '/';
callback('/', '', tree);
}
for (var key in tree) {
callback(root, key, tree[key]);
if (tree[key].$type == 'folder') {
treeRecurse(tree[key], callback, root + key + '/');
}
}
};
PSFixed.prototype.getFilters = function(dirTree) {
var filters = [];
treeRecurse(dirTree, function(path, key, value) {
if (value.$type != 'folder') {
return;
}
var filePath = key.length ? path + key + '/' : path;
filters.push({
value: filePath,
display: filePath
});
});
return filters;
}
PSFixed.prototype.getMetadata = function(dirTree, filterPath) {
var editor = this.editor;
var self = this;
var metadata = [];
treeRecurse(dirTree, function(path, key, value) {
if (!value.$type || !key) {
// This is a builtin property of objects, not one returned by the
// backend.
return;
}
if (path != filterPath) {
return;
}
if (value.$type == 'folder') {
metadata.push({
URL: self.editor.imgURL('folder.gif', 'PersistentStorage'),
name: key,
key: path + key,
$type: value.$type
});
} else {
metadata.push({
URL: value.URL,
name: key,
key: path + key,
$type: value.$type
});
}
});
return metadata;
}
})();