/*
	Copyright (c) 2004-2010, 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.ServiceStore"]){
dojo._hasResource["dojox.data.ServiceStore"]=true;
dojo.provide("dojox.data.ServiceStore");
dojo.declare("dojox.data.ServiceStore",dojox.data.ClientFilter||null,{service:null,constructor:function(_1){
this.byId=this.fetchItemByIdentity;
this._index={};
if(_1){
dojo.mixin(this,_1);
}
this.idAttribute=(_1&&_1.idAttribute)||(this.schema&&this.schema._idAttr);
},schema:null,idAttribute:"id",labelAttribute:"label",syncMode:false,estimateCountFactor:1,getSchema:function(){
return this.schema;
},loadLazyValues:true,getValue:function(_2,_3,_4){
var _5=_2[_3];
return _5||(_3 in _2?_5:_2._loadObject?(dojox.rpc._sync=true)&&arguments.callee.call(this,dojox.data.ServiceStore.prototype.loadItem({item:_2})||{},_3,_4):_4);
},getValues:function(_6,_7){
var _8=this.getValue(_6,_7);
if(_8 instanceof Array){
return _8;
}
if(!this.isItemLoaded(_8)){
dojox.rpc._sync=true;
_8=this.loadItem({item:_8});
}
return _8 instanceof Array?_8:_8===undefined?[]:[_8];
},getAttributes:function(_9){
var _a=[];
for(var i in _9){
if(_9.hasOwnProperty(i)&&!(i.charAt(0)=="_"&&i.charAt(1)=="_")){
_a.push(i);
}
}
return _a;
},hasAttribute:function(_b,_c){
return _c in _b;
},containsValue:function(_d,_e,_f){
return dojo.indexOf(this.getValues(_d,_e),_f)>-1;
},isItem:function(_10){
return (typeof _10=="object")&&_10&&!(_10 instanceof Date);
},isItemLoaded:function(_11){
return _11&&!_11._loadObject;
},loadItem:function(_12){
var _13;
if(_12.item._loadObject){
_12.item._loadObject(function(_14){
_13=_14;
delete _13._loadObject;
var _15=_14 instanceof Error?_12.onError:_12.onItem;
if(_15){
_15.call(_12.scope,_14);
}
});
}else{
if(_12.onItem){
_12.onItem.call(_12.scope,_12.item);
}
}
return _13;
},_currentId:0,_processResults:function(_16,_17){
if(_16&&typeof _16=="object"){
var id=_16.__id;
if(!id){
if(this.idAttribute){
id=_16[this.idAttribute];
}else{
id=this._currentId++;
}
if(id!==undefined){
var _18=this._index[id];
if(_18){
for(var j in _18){
delete _18[j];
}
_16=dojo.mixin(_18,_16);
}
_16.__id=id;
this._index[id]=_16;
}
}
for(var i in _16){
_16[i]=this._processResults(_16[i],_17).items;
}
var _19=_16.length;
}
return {totalCount:_17.request.count==_19?(_17.request.start||0)+_19*this.estimateCountFactor:_19,items:_16};
},close:function(_1a){
return _1a&&_1a.abort&&_1a.abort();
},fetch:function(_1b){
_1b=_1b||{};
if("syncMode" in _1b?_1b.syncMode:this.syncMode){
dojox.rpc._sync=true;
}
var _1c=this;
var _1d=_1b.scope||_1c;
var _1e=this.cachingFetch?this.cachingFetch(_1b):this._doQuery(_1b);
_1e.request=_1b;
_1e.addCallback(function(_1f){
if(_1b.clientFetch){
_1f=_1c.clientSideFetch({query:_1b.clientFetch,sort:_1b.sort,start:_1b.start,count:_1b.count},_1f);
}
var _20=_1c._processResults(_1f,_1e);
_1f=_1b.results=_20.items;
if(_1b.onBegin){
_1b.onBegin.call(_1d,_20.totalCount,_1b);
}
if(_1b.onItem){
for(var i=0;i<_1f.length;i++){
_1b.onItem.call(_1d,_1f[i],_1b);
}
}
if(_1b.onComplete){
_1b.onComplete.call(_1d,_1b.onItem?null:_1f,_1b);
}
return _1f;
});
_1e.addErrback(_1b.onError&&function(err){
return _1b.onError.call(_1d,err,_1b);
});
_1b.abort=function(){
_1e.cancel();
};
_1b.store=this;
return _1b;
},_doQuery:function(_21){
var _22=typeof _21.queryStr=="string"?_21.queryStr:_21.query;
return this.service(_22);
},getFeatures:function(){
return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true,"dojo.data.api.Schema":this.schema};
},getLabel:function(_23){
return this.getValue(_23,this.labelAttribute);
},getLabelAttributes:function(_24){
return [this.labelAttribute];
},getIdentity:function(_25){
return _25.__id;
},getIdentityAttributes:function(_26){
return [this.idAttribute];
},fetchItemByIdentity:function(_27){
var _28=this._index[(_27._prefix||"")+_27.identity];
if(_28){
if(_28._loadObject){
_27.item=_28;
return this.loadItem(_27);
}else{
if(_27.onItem){
_27.onItem.call(_27.scope,_28);
}
}
}else{
return this.fetch({query:_27.identity,onComplete:_27.onItem,onError:_27.onError,scope:_27.scope}).results;
}
return _28;
}});
}
