242 lines
5.8 KiB
JavaScript
242 lines
5.8 KiB
JavaScript
|
//>>built
|
||
|
// wrapped by build app
|
||
|
define("dojox/storage/BehaviorStorageProvider", ["dijit","dojo","dojox","dojo/require!dojox/storage/Provider,dojox/storage/manager"], function(dijit,dojo,dojox){
|
||
|
dojo.provide("dojox.storage.BehaviorStorageProvider");
|
||
|
|
||
|
dojo.require("dojox.storage.Provider");
|
||
|
dojo.require("dojox.storage.manager");
|
||
|
|
||
|
dojo.declare(
|
||
|
"dojox.storage.BehaviorStorageProvider",
|
||
|
[dojox.storage.Provider],
|
||
|
{
|
||
|
store: null,
|
||
|
|
||
|
storeName: '__dojox_BehaviorStorage',
|
||
|
|
||
|
keys: [],
|
||
|
|
||
|
initialize: function(){
|
||
|
try{
|
||
|
this.store = this._createStore();
|
||
|
this.store.load(this.storeName);
|
||
|
}catch(e){
|
||
|
throw new Error("Store is not available: " + e);
|
||
|
}
|
||
|
|
||
|
var keys = this.get('keys','dojoxSystemNS');
|
||
|
this.keys = keys || [];
|
||
|
|
||
|
this.initialized = true;
|
||
|
dojox.storage.manager.loaded();
|
||
|
|
||
|
},
|
||
|
|
||
|
isAvailable: function(){ /*Boolean*/
|
||
|
// This is not completely true. UserData may
|
||
|
// be disabled in security settings. To *really*
|
||
|
// check if this is available, one needs to wait
|
||
|
// until the store is successfully initialized...
|
||
|
return dojo.isIE && dojo.isIE >= 5;
|
||
|
},
|
||
|
|
||
|
_createStore: function() {
|
||
|
var storeNode = dojo.create(
|
||
|
'link',
|
||
|
{id: this.storeName + 'Node', style: {'display':'none'}},
|
||
|
dojo.query('head')[0]
|
||
|
);
|
||
|
storeNode.addBehavior('#default#userdata');
|
||
|
|
||
|
return storeNode;
|
||
|
},
|
||
|
|
||
|
put: function( /*string*/ key,
|
||
|
/*object*/ value,
|
||
|
/*function*/ resultsHandler,
|
||
|
/*string?*/ namespace){
|
||
|
|
||
|
this._assertIsValidKey(key);
|
||
|
|
||
|
namespace = namespace||this.DEFAULT_NAMESPACE;
|
||
|
this._assertIsValidNamespace(namespace);
|
||
|
|
||
|
var fullKey = this.getFullKey(key,namespace);
|
||
|
value = dojo.toJson(value);
|
||
|
|
||
|
this.store.setAttribute(fullKey, value);
|
||
|
this.store.save(this.storeName);
|
||
|
|
||
|
var success = this.store.getAttribute(fullKey) === value;
|
||
|
if(success){
|
||
|
this._addKey(fullKey);
|
||
|
this.store.setAttribute('__dojoxSystemNS_keys', dojo.toJson(this.keys));
|
||
|
this.store.save(this.storeName);
|
||
|
}
|
||
|
|
||
|
if(resultsHandler){
|
||
|
resultsHandler(success ? this.SUCCESS : this.FAILED, key, null, namespace);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
get: function(/*string*/ key, /*string?*/ namespace){ /*Object*/
|
||
|
this._assertIsValidKey(key);
|
||
|
|
||
|
namespace = namespace||this.DEFAULT_NAMESPACE;
|
||
|
this._assertIsValidNamespace(namespace);
|
||
|
|
||
|
key = this.getFullKey(key, namespace);
|
||
|
|
||
|
return dojo.fromJson(this.store.getAttribute(key));
|
||
|
},
|
||
|
|
||
|
getKeys: function(/*string?*/ namespace){ /*Array*/
|
||
|
namespace = namespace||this.DEFAULT_NAMESPACE;
|
||
|
this._assertIsValidNamespace(namespace);
|
||
|
|
||
|
namespace = '__'+namespace+'_';
|
||
|
|
||
|
var keys = [];
|
||
|
for(var i = 0; i < this.keys.length; i++){
|
||
|
var currentKey = this.keys[i];
|
||
|
if(this._beginsWith(currentKey,namespace)){
|
||
|
currentKey = currentKey.substring(namespace.length);
|
||
|
keys.push(currentKey);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return keys;
|
||
|
},
|
||
|
|
||
|
clear: function(/*string?*/ namespace){
|
||
|
namespace = namespace||this.DEFAULT_NAMESPACE;
|
||
|
this._assertIsValidNamespace(namespace);
|
||
|
|
||
|
namespace = '__'+namespace+'_';
|
||
|
|
||
|
var keys = [];
|
||
|
for(var i = 0; i < this.keys.length; i++){
|
||
|
var currentKey = this.keys[i];
|
||
|
if(this._beginsWith(currentKey,namespace)){
|
||
|
keys.push(currentKey);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
dojo.forEach(keys, function(key){
|
||
|
this.store.removeAttribute(key);
|
||
|
this._removeKey(key);
|
||
|
}, this);
|
||
|
|
||
|
this.put('keys', this.keys, null, 'dojoxSystemNS');
|
||
|
this.store.save(this.storeName);
|
||
|
},
|
||
|
|
||
|
remove: function(/*string*/ key, /*string?*/ namespace){
|
||
|
this._assertIsValidKey(key);
|
||
|
|
||
|
namespace = namespace||this.DEFAULT_NAMESPACE;
|
||
|
this._assertIsValidNamespace(namespace);
|
||
|
|
||
|
key = this.getFullKey(key, namespace);
|
||
|
this.store.removeAttribute(key);
|
||
|
|
||
|
this._removeKey(key);
|
||
|
this.put('keys', this.keys, null, 'dojoxSystemNS');
|
||
|
this.store.save(this.storeName);
|
||
|
|
||
|
},
|
||
|
|
||
|
getNamespaces: function(){ /*string[]*/
|
||
|
|
||
|
|
||
|
var results = [ this.DEFAULT_NAMESPACE];
|
||
|
|
||
|
var found = {};
|
||
|
found[this.DEFAULT_NAMESPACE] = true;
|
||
|
var tester = /^__([^_]*)_/;
|
||
|
|
||
|
for(var i = 0; i < this.keys.length; i++){
|
||
|
var currentKey = this.keys[i];
|
||
|
if(tester.test(currentKey) == true){
|
||
|
var currentNS = currentKey.match(tester)[1];
|
||
|
if(typeof found[currentNS] == "undefined"){
|
||
|
found[currentNS] = true;
|
||
|
results.push(currentNS);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return results;
|
||
|
|
||
|
},
|
||
|
|
||
|
isPermanent: function(){ /*Boolean*/
|
||
|
return true;
|
||
|
},
|
||
|
|
||
|
getMaximumSize: function(){ /* mixed */
|
||
|
// this *might* be more, depending on the zone
|
||
|
// of the current site. But 64k is guaranteed.
|
||
|
return 64;
|
||
|
},
|
||
|
|
||
|
hasSettingsUI: function(){ /*Boolean*/
|
||
|
return false;
|
||
|
},
|
||
|
|
||
|
isValidKey: function(/*string*/ keyName){ /*Boolean*/
|
||
|
if(keyName === null || keyName === undefined){
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return /^[0-9A-Za-z_-]*$/.test(keyName);
|
||
|
},
|
||
|
|
||
|
isValidNamespace: function(/*string*/ keyName){ /*Boolean*/
|
||
|
|
||
|
if(keyName === null || keyName === undefined){
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return /^[0-9A-Za-z-]*$/.test(keyName);
|
||
|
},
|
||
|
|
||
|
getFullKey: function(key, namespace){
|
||
|
// checks for valid namespace and
|
||
|
// key are already performed.
|
||
|
return "__" + namespace + "_" + key;
|
||
|
},
|
||
|
|
||
|
_beginsWith: function(/* string */ haystack, /* string */ needle) {
|
||
|
if(needle.length > haystack.length) {
|
||
|
return false;
|
||
|
}
|
||
|
return haystack.substring(0,needle.length) === needle;
|
||
|
},
|
||
|
|
||
|
_assertIsValidNamespace: function(/* string */ namespace){
|
||
|
if(this.isValidNamespace(namespace) === false){
|
||
|
throw new Error("Invalid namespace given: " + namespace);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
_assertIsValidKey: function(/* string */ key){
|
||
|
if(this.isValidKey(key) === false){
|
||
|
throw new Error("Invalid key given: " + key);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
_addKey: function(key){
|
||
|
this._removeKey(key);
|
||
|
this.keys.push(key);
|
||
|
},
|
||
|
|
||
|
_removeKey: function(key){
|
||
|
this.keys = dojo.filter(this.keys,function(item){ return item !== key;},this);
|
||
|
}
|
||
|
}
|
||
|
);
|
||
|
|
||
|
dojox.storage.manager.register("dojox.storage.BehaviorStorageProvider", new dojox.storage.BehaviorStorageProvider());
|
||
|
});
|