blob: b85904a06991c08e09b5ac2b3571d26bebe3961c [file] [log] [blame]
/*
Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
if(!dojo._hasResource["dojox.data.KeyValueStore"]){
dojo._hasResource["dojox.data.KeyValueStore"]=true;
dojo.provide("dojox.data.KeyValueStore");
dojo.require("dojo.data.util.filter");
dojo.require("dojo.data.util.simpleFetch");
dojo.declare("dojox.data.KeyValueStore",null,{constructor:function(_1){
if(_1.url){
this.url=_1.url;
}
this._keyValueString=_1.data;
this._keyValueVar=_1.dataVar;
this._keyAttribute="key";
this._valueAttribute="value";
this._storeProp="_keyValueStore";
this._features={"dojo.data.api.Read":true,"dojo.data.api.Identity":true};
this._loadInProgress=false;
this._queuedFetches=[];
if(_1&&"urlPreventCache" in _1){
this.urlPreventCache=_1.urlPreventCache?true:false;
}
},url:"",data:"",urlPreventCache:false,_assertIsItem:function(_2){
if(!this.isItem(_2)){
throw new Error("dojox.data.KeyValueStore: a function was passed an item argument that was not an item");
}
},_assertIsAttribute:function(_3,_4){
if(!dojo.isString(_4)){
throw new Error("dojox.data.KeyValueStore: a function was passed an attribute argument that was not an attribute object nor an attribute name string");
}
},getValue:function(_5,_6,_7){
this._assertIsItem(_5);
this._assertIsAttribute(_5,_6);
var _8;
if(_6==this._keyAttribute){
_8=_5[this._keyAttribute];
}else{
_8=_5[this._valueAttribute];
}
if(_8===undefined){
_8=_7;
}
return _8;
},getValues:function(_9,_a){
var _b=this.getValue(_9,_a);
return (_b?[_b]:[]);
},getAttributes:function(_c){
return [this._keyAttribute,this._valueAttribute,_c[this._keyAttribute]];
},hasAttribute:function(_d,_e){
this._assertIsItem(_d);
this._assertIsAttribute(_d,_e);
return (_e==this._keyAttribute||_e==this._valueAttribute||_e==_d[this._keyAttribute]);
},containsValue:function(_f,_10,_11){
var _12=undefined;
if(typeof _11==="string"){
_12=dojo.data.util.filter.patternToRegExp(_11,false);
}
return this._containsValue(_f,_10,_11,_12);
},_containsValue:function(_13,_14,_15,_16){
var _17=this.getValues(_13,_14);
for(var i=0;i<_17.length;++i){
var _18=_17[i];
if(typeof _18==="string"&&_16){
return (_18.match(_16)!==null);
}else{
if(_15===_18){
return true;
}
}
}
return false;
},isItem:function(_19){
if(_19&&_19[this._storeProp]===this){
return true;
}
return false;
},isItemLoaded:function(_1a){
return this.isItem(_1a);
},loadItem:function(_1b){
},getFeatures:function(){
return this._features;
},close:function(_1c){
},getLabel:function(_1d){
return _1d[this._keyAttribute];
},getLabelAttributes:function(_1e){
return [this._keyAttribute];
},_fetchItems:function(_1f,_20,_21){
var _22=this;
var _23=function(_24,_25){
var _26=null;
if(_24.query){
_26=[];
var _27=_24.queryOptions?_24.queryOptions.ignoreCase:false;
var _28={};
for(var key in _24.query){
var _29=_24.query[key];
if(typeof _29==="string"){
_28[key]=dojo.data.util.filter.patternToRegExp(_29,_27);
}
}
for(var i=0;i<_25.length;++i){
var _2a=true;
var _2b=_25[i];
for(var key in _24.query){
var _29=_24.query[key];
if(!_22._containsValue(_2b,key,_29,_28[key])){
_2a=false;
}
}
if(_2a){
_26.push(_2b);
}
}
}else{
if(_24.identity){
_26=[];
var _2c;
for(var key in _25){
_2c=_25[key];
if(_2c[_22._keyAttribute]==_24.identity){
_26.push(_2c);
break;
}
}
}else{
if(_25.length>0){
_26=_25.slice(0,_25.length);
}
}
}
_20(_26,_24);
};
if(this._loadFinished){
_23(_1f,this._arrayOfAllItems);
}else{
if(this.url!==""){
if(this._loadInProgress){
this._queuedFetches.push({args:_1f,filter:_23});
}else{
this._loadInProgress=true;
var _2d={url:_22.url,handleAs:"json-comment-filtered",preventCache:this.urlPreventCache};
var _2e=dojo.xhrGet(_2d);
_2e.addCallback(function(_2f){
_22._processData(_2f);
_23(_1f,_22._arrayOfAllItems);
_22._handleQueuedFetches();
});
_2e.addErrback(function(_30){
_22._loadInProgress=false;
throw _30;
});
}
}else{
if(this._keyValueString){
this._processData(eval(this._keyValueString));
this._keyValueString=null;
_23(_1f,this._arrayOfAllItems);
}else{
if(this._keyValueVar){
this._processData(this._keyValueVar);
this._keyValueVar=null;
_23(_1f,this._arrayOfAllItems);
}else{
throw new Error("dojox.data.KeyValueStore: No source data was provided as either URL, String, or Javascript variable data input.");
}
}
}
}
},_handleQueuedFetches:function(){
if(this._queuedFetches.length>0){
for(var i=0;i<this._queuedFetches.length;i++){
var _31=this._queuedFetches[i];
var _32=_31.filter;
var _33=_31.args;
if(_32){
_32(_33,this._arrayOfAllItems);
}else{
this.fetchItemByIdentity(_31.args);
}
}
this._queuedFetches=[];
}
},_processData:function(_34){
this._arrayOfAllItems=[];
for(var i=0;i<_34.length;i++){
this._arrayOfAllItems.push(this._createItem(_34[i]));
}
this._loadFinished=true;
this._loadInProgress=false;
},_createItem:function(_35){
var _36={};
_36[this._storeProp]=this;
for(var i in _35){
_36[this._keyAttribute]=i;
_36[this._valueAttribute]=_35[i];
break;
}
return _36;
},getIdentity:function(_37){
if(this.isItem(_37)){
return _37[this._keyAttribute];
}
return null;
},getIdentityAttributes:function(_38){
return [this._keyAttribute];
},fetchItemByIdentity:function(_39){
_39.oldOnItem=_39.onItem;
_39.onItem=null;
_39.onComplete=this._finishFetchItemByIdentity;
this.fetch(_39);
},_finishFetchItemByIdentity:function(_3a,_3b){
var _3c=_3b.scope||dojo.global;
if(_3a.length){
_3b.oldOnItem.call(_3c,_3a[0]);
}else{
_3b.oldOnItem.call(_3c,null);
}
}});
dojo.extend(dojox.data.KeyValueStore,dojo.data.util.simpleFetch);
}