494 lines
14 KiB
JavaScript
494 lines
14 KiB
JavaScript
|
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);
|
||
|
}
|