SemanticScuttle/includes/js/dojox/storage/tests/test_storage.js

494 lines
14 KiB
JavaScript
Raw Normal View History

dojo.require("dojox.storage");
var TestStorage = {
currentProvider: "default",
currentNamespace: dojox.storage.DEFAULT_NAMESPACE,
initialize: function(){
//console.debug("test_storage.initialize()");
// do we even have a storage provider?
if(dojox.storage.manager.available == false){
var o = document.createElement("option");
o.appendChild(document.createTextNode("None"));
o.value = "None";
o.selected = true;
var selector = dojo.byId("currentStorageProvider");
selector.disabled = true;
selector.appendChild(o);
alert("No storage provider is available on this browser");
return;
}
// what should our starting namespace be?
this._determineCurrentNamespace();
// clear out old values and enable input forms
dojo.byId("storageNamespace").value = this.currentNamespace;
dojo.byId("storageNamespace").disabled = false;
dojo.byId("storageKey").value = "";
dojo.byId("storageKey").disabled = false;
dojo.byId("storageValue").value = "";
dojo.byId("storageValue").disabled = false;
// write out available providers
this._printAvailableProviders();
// write out our available namespaces
this._printAvailableNamespaces();
// write out our available keys
this._printAvailableKeys();
// initialize our event handlers
var providerDirectory = dojo.byId("currentStorageProvider");
dojo.connect(providerDirectory, "onchange", this, this.providerChange);
var namespaceDirectory = dojo.byId("namespaceDirectory");
dojo.connect(namespaceDirectory, "onchange", this, this.namespaceChange);
var directory = dojo.byId("directory");
dojo.connect(directory, "onchange", this, this.directoryChange);
var storageValueElem = dojo.byId("storageValue");
dojo.connect(storageValueElem, "onkeyup", this, this.printValueSize);
// make the directory be unselected if the key name field gets focus
var keyNameField = dojo.byId("storageKey");
dojo.connect(keyNameField, "onfocus", function(evt){
directory.selectedIndex = -1;
});
// add onclick listeners to all of our buttons
var buttonContainer = dojo.byId("buttonContainer");
var currentChild = buttonContainer.firstChild;
while(currentChild.nextSibling != null){
if(currentChild.nodeType == 1){
var buttonName = currentChild.id;
var functionName = buttonName.match(/^(.*)Button$/)[1];
dojo.connect(currentChild, "onclick", this, this[functionName]);
currentChild.disabled = false;
}
currentChild = currentChild.nextSibling;
}
// print out metadata
this._printProviderMetadata();
// disable the configuration button if none is supported for this provider
if(dojox.storage.hasSettingsUI() == false){
dojo.byId("configureButton").disabled = true;
}
},
providerChange: function(evt){
var provider = evt.target.value;
// reload the page with this provider
var query = "";
if(window.location.href.indexOf("forceStorageProvider") == -1){
query = "?";
}else{
query = "&";
}
window.location.href += query + "forceStorageProvider=" + provider;
},
namespaceChange: function(evt){
var ns = evt.target.value;
this.currentNamespace = ns;
// update our available keys
this._printAvailableKeys();
// clear out our key and values
dojo.byId("storageNamespace").value = this.currentNamespace;
dojo.byId("storageKey").value = "";
dojo.byId("storageValue").value = "";
},
directoryChange: function(evt){
var key = evt.target.value;
// add this value into the form
var keyNameField = dojo.byId("storageKey");
keyNameField.value = key;
this._handleLoad(key);
},
load: function(evt){
// cancel the button's default behavior
evt.preventDefault();
evt.stopPropagation();
// get the key to load
var key = dojo.byId("storageKey").value;
if(key == null || typeof key == "undefined" || key == ""){
alert("Please enter a key name");
return;
}
this._handleLoad(key);
},
save: function(evt){
// cancel the button's default behavior
evt.preventDefault();
evt.stopPropagation();
// get the new values
var key = dojo.byId("storageKey").value;
var value = dojo.byId("storageValue").value;
var namespace = dojo.byId("storageNamespace").value;
if(key == null || typeof key == "undefined" || key == ""){
alert("Please enter a key name");
return;
}
if(value == null || typeof value == "undefined" || value == ""){
alert("Please enter a key value");
return;
}
// print out the size of the value
this.printValueSize();
// do the save
this._save(key, value, namespace);
},
clearNamespace: function(evt){
// cancel the button's default behavior
evt.preventDefault();
evt.stopPropagation();
dojox.storage.clear(this.currentNamespace);
this._printAvailableNamespaces();
this._printAvailableKeys();
},
configure: function(evt){
// cancel the button's default behavior
evt.preventDefault();
evt.stopPropagation();
if(dojox.storage.hasSettingsUI()){
// redraw our keys after the dialog is closed, in
// case they have all been erased
var self = this;
dojox.storage.onHideSettingsUI = function(){
self._printAvailableKeys();
}
// show the dialog
dojox.storage.showSettingsUI();
}
},
remove: function(evt){
// cancel the button's default behavior
evt.preventDefault();
evt.stopPropagation();
// determine what key to delete; if the directory has a selected value,
// use that; otherwise, use the key name field
var directory = dojo.byId("directory");
var keyNameField = dojo.byId("storageKey");
var keyValueField = dojo.byId("storageValue");
var key;
if(directory.selectedIndex != -1){
key = directory.value;
// delete this option
var options = directory.childNodes;
for(var i = 0; i < options.length; i++){
if(options[i].nodeType == 1 &&
options[i].value == key){
directory.removeChild(options[i]);
break;
}
}
}else{
key = keyNameField.value;
}
keyNameField.value = "";
keyValueField.value = "";
// now delete the value
this._printStatus("Removing '" + key + "'...");
if(this.currentNamespace == dojox.storage.DEFAULT_NAMESPACE){
dojox.storage.remove(key);
}else{
dojox.storage.remove(key, this.currentNamespace);
}
// update our UI
this._printAvailableNamespaces();
this._printStatus("Removed '" + key);
},
printValueSize: function(){
var storageValue = dojo.byId("storageValue").value;
var size = 0;
if(storageValue != null && typeof storageValue != "undefined"){
size = storageValue.length;
}
// determine the units we are dealing with
var units;
if(size < 1024)
units = " bytes";
else{
units = " K";
size = size / 1024;
size = Math.round(size);
}
size = size + units;
var valueSize = dojo.byId("valueSize");
valueSize.innerHTML = size;
},
saveBook: function(evt){
this._printStatus("Loading book...");
var d = dojo.xhrGet({
url: "resources/testBook.txt",
handleAs: "text"
});
d.addCallback(dojo.hitch(this, function(results){
this._printStatus("Book loaded");
this._save("testBook", results);
}));
d.addErrback(dojo.hitch(this, function(error){
alert("Unable to load testBook.txt: " + error);
}));
if(!typeof evt != "undefined" && evt != null){
evt.preventDefault();
evt.stopPropagation();
}
return false;
},
saveXML: function(evt){
this._printStatus("Loading XML...");
var d = dojo.xhrGet({
url: "resources/testXML.xml",
handleAs: "text"
});
d.addCallback(dojo.hitch(this, function(results){
this._printStatus("XML loaded");
this._save("testXML", results);
}));
d.addErrback(dojo.hitch(this, function(error){
alert("Unable to load testXML.xml: " + error);
}));
if(!typeof evt != "undefined" && evt != null){
evt.preventDefault();
evt.stopPropagation();
}
return false;
},
_save: function(key, value, namespace){
this._printStatus("Saving '" + key + "'...");
var self = this;
var saveHandler = function(status, keyName){
//console.debug("saveHandler, status="+status+", keyName="+keyName);
if(status == dojox.storage.FAILED){
alert("You do not have permission to store data for this web site. "
+ "Press the Configure button to grant permission.");
}else if(status == dojox.storage.SUCCESS){
// clear out the old value
dojo.byId("storageKey").value = "";
dojo.byId("storageValue").value = "";
self._printStatus("Saved '" + key + "'");
if(typeof namespace != "undefined"
&& namespace != null){
self.currentNamespace = namespace;
}
self._printAvailableKeys();
self._printAvailableNamespaces();
}
};
try{
if(namespace == dojox.storage.DEFAULT_NAMESPACE){
dojox.storage.put(key, value, saveHandler);
}else{
dojox.storage.put(key, value, saveHandler, namespace);
}
}catch(exp){
alert(exp);
}
},
_printAvailableKeys: function(){
var directory = dojo.byId("directory");
// clear out any old keys
directory.innerHTML = "";
// add new ones
var availableKeys;
if(this.currentNamespace == dojox.storage.DEFAULT_NAMESPACE){
availableKeys = dojox.storage.getKeys();
}else{
availableKeys = dojox.storage.getKeys(this.currentNamespace);
}
for (var i = 0; i < availableKeys.length; i++){
var optionNode = document.createElement("option");
optionNode.appendChild(document.createTextNode(availableKeys[i]));
optionNode.value = availableKeys[i];
directory.appendChild(optionNode);
}
},
_printAvailableNamespaces: function(){
var namespacesDir = dojo.byId("namespaceDirectory");
// clear out any old namespaces
namespacesDir.innerHTML = "";
// add new ones
var availableNamespaces = dojox.storage.getNamespaces();
for (var i = 0; i < availableNamespaces.length; i++){
var optionNode = document.createElement("option");
optionNode.appendChild(document.createTextNode(availableNamespaces[i]));
optionNode.value = availableNamespaces[i];
if(this.currentNamespace == availableNamespaces[i]){
optionNode.selected = true;
}
namespacesDir.appendChild(optionNode);
}
},
_handleLoad: function(key){
this._printStatus("Loading '" + key + "'...");
// get the value
var results;
if(this.currentNamespace == dojox.storage.DEFAULT_NAMESPACE){
results = dojox.storage.get(key);
}else{
results = dojox.storage.get(key, this.currentNamespace);
}
// jsonify it if it is a JavaScript object
if(typeof results != "string"){
results = dojo.toJson(results);
}
// print out its value
this._printStatus("Loaded '" + key + "'");
dojo.byId("storageValue").value = results;
// print out the size of the value
this.printValueSize();
},
_printProviderMetadata: function(){
var storageType = dojox.storage.manager.currentProvider.declaredClass;
var isSupported = dojox.storage.isAvailable();
var maximumSize = dojox.storage.getMaximumSize();
var permanent = dojox.storage.isPermanent();
var uiConfig = dojox.storage.hasSettingsUI();
var moreInfo = "";
if(dojox.storage.manager.currentProvider.declaredClass
== "dojox.storage.FlashStorageProvider"){
moreInfo = "Flash Version " + dojox.flash.info.version;
}
dojo.byId("currentStorageProvider").innerHTML = storageType;
dojo.byId("isSupported").innerHTML = isSupported;
dojo.byId("isPersistent").innerHTML = permanent;
dojo.byId("hasUIConfig").innerHTML = uiConfig;
dojo.byId("maximumSize").innerHTML = maximumSize;
dojo.byId("moreInfo").innerHTML = moreInfo;
},
_printStatus: function(message){
// remove the old status
var top = dojo.byId("top");
for (var i = 0; i < top.childNodes.length; i++){
var currentNode = top.childNodes[i];
if (currentNode.nodeType == 1 &&
currentNode.className == "status"){
top.removeChild(currentNode);
}
}
var status = document.createElement("span");
status.className = "status";
status.innerHTML = message;
top.appendChild(status);
dojo.fadeOut({node: status, duration: 2000}).play();
},
_determineCurrentNamespace: function(){
// what is current namespace?
var availableNamespaces = dojox.storage.getNamespaces();
if(this.currentNamespace == dojox.storage.DEFAULT_NAMESPACE){
// do we even have the default namespace in our available namespaces?
var defaultPresent = false;
for(var i = 0; i < availableNamespaces.length; i++){
if(availableNamespaces[i] == dojox.storage.DEFAULT_NAMESPACE){
defaultPresent = true;
}
}
if(!defaultPresent && availableNamespaces.length){
this.currentNamespace = availableNamespaces[0];
}
}
},
_printAvailableProviders: function(){
// it is scary that this timeout is needed; if it is not present,
// the options don't appear on Firefox and Safari, even though the
// page is finished loading! it might have to do with some strange
// interaction where our initialize method is called from ExternalInterface,
// which originated inside of Flash. -- Brad Neuberg
window.setTimeout(function(){
var selector = dojo.byId("currentStorageProvider");
var p = dojox.storage.manager.providers;
for(var i = 0; i < p.length; i++){
var name = p[i].declaredClass;
var o = document.createElement("option");
o.appendChild(document.createTextNode(name));
o.value = name;
if(dojox.storage.manager.currentProvider == p[i]){
o.selected = true;
}
selector.appendChild(o);
}
}, 1);
}
};
// wait until the storage system is finished loading
if(dojox.storage.manager.isInitialized() == false){ // storage might already be loaded when we get here
dojo.connect(dojox.storage.manager, "loaded", TestStorage, TestStorage.initialize);
}else{
dojo.connect(dojo, "loaded", TestStorage, TestStorage.initialize);
}