Subversion Repositories Applications.papyrus

Rev

Blame | Last modification | View Log | RSS feed

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){
                        alert("No storage provider is available on this browser");
                        return;
                }
                
                // 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 our available namespaces
                this._printAvailableNamespaces();
                
                // write out our available keys
                this._printAvailableKeys();
                
                // initialize our event handlers
                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;   
                }
        },
        
        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){
                        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;
                                }
                                
                                // update the list of available keys and namespaces
                                // put this on a slight timeout, because saveHandler is called back
                                // from Flash, which can cause problems in Flash 8 communication
                                // which affects Safari
                                // FIXME: Find out what is going on in the Flash 8 layer and fix it
                                // there
                                window.setTimeout(function(){ 
                                        self._printAvailableKeys();
                                        self._printAvailableNamespaces();
                                }, 1);
                        }
                };
                
                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];
                        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 Comm Version " + dojo.flash.info.commVersion;
                }
                
                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();
        }
};

// 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);
}