/*
	Copyright (c) 2004-2008, 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.ClientFilter"]){
dojo._hasResource["dojox.data.ClientFilter"]=true;
dojo.provide("dojox.data.ClientFilter");
dojo.require("dojo.data.util.filter");
(function(){
var _1;
var _2=function(_3,_4,_5){
return function(_6){
_3._updates.push({create:_4&&_6,remove:_5&&_6});
_1.onUpdate();
};
};
_1=dojo.declare("dojox.data.ClientFilter",null,{constructor:function(){
this.onSet=_2(this,true,true);
this.onNew=_2(this,true,false);
this.onDelete=_2(this,false,true);
this._updates=[];
this._fetchCache=[];
},updateResultSet:function(_7,_8){
if(this.isUpdateable(_8)){
for(var i=_8._version||0;i<this._updates.length;i++){
var _a=this._updates[i].create;
var _b=this._updates[i].remove;
if(_b){
for(var j=0;j<_7.length;j++){
if(_7[j]==_b){
_7.splice(j--,1);
var _d=true;
}
}
}
if(_a&&this.matchesQuery(_a,_8)&&dojo.indexOf(_7,_a)==-1){
_7.push(_a);
_d=true;
}
}
if(_8.sort&&_d){
_7.sort(this.makeComparator(_8.sort.concat()));
}
if(_8.count&&_d){
_7.splice(_8.count,_7.length);
}
_8._version=this._updates.length;
return _d?2:1;
}
return 0;
},querySuperSet:function(_e,_f){
if(_e.query==_f.query){
return {};
}
var _10=dojo.mixin({},_f.query);
for(var i in _e.query){
if(_10[i]==_e.query[i]){
delete _10[i];
}else{
if(!(typeof _e.query[i]=="string"&&dojo.data.util.filter.patternToRegExp(_e.query[i]).test(_10[i]))){
return false;
}
}
}
return _10;
},serverVersion:0,cachingFetch:function(_12){
var _13=this;
for(var i=0;i<this._fetchCache.length;i++){
var _15=this._fetchCache[i];
var _16=this.querySuperSet(_15,_12);
if(_16!==false){
var _17=_15._loading;
if(!_17){
_17=new dojo.Deferred();
_17.callback(_15.cacheResults);
}
_17.addCallback(function(_18){
return _13.clientSideFetch({query:_16,sort:_12.sort,start:_12.start,count:_12.count},_18);
});
}
}
if(!_17){
var _19=dojo.mixin({},_12);
var _1a=(_12.queryOptions||0).cache;
if(_1a===undefined?this.cacheByDefault:_1a){
if(_12.start||_12.count){
delete _19.start;
delete _19.count;
_12.clientQuery=dojo.mixin(_12.clientQuery||{},{start:_12.start,count:_12.count});
}
_12=_19;
this._fetchCache.push(_12);
}
_17=_12._loading=this._doQuery(_12);
}
var _1b=this.serverVersion;
_17.addCallback(function(_1c){
delete _12._loading;
if(_1c){
_12._version=_1b;
_13.updateResultSet(_1c,_12);
_12.cacheResults=_1c;
}
return _1c;
});
return _17;
},isUpdateable:function(_1d){
return typeof _1d.query=="object";
},clientSideFetch:function(_1e,_1f){
if(_1e.query){
var _20=[];
for(var i=0;i<_1f.length;i++){
var _22=_1f[i];
if(_22&&this.matchesQuery(_22,_1e)){
_20.push(_1f[i]);
}
}
}else{
_20=_1e.sort?_1f.concat():_1f;
}
if(_1e.sort){
_20.sort(this.makeComparator(_1e.sort.concat()));
}
var _23=_1e.start||0;
return (_23||_1e.count)?_20.slice(_23,_23+(_1e.count||_20.length)):_20;
},matchesQuery:function(_24,_25){
var _26=_25.query;
var _27=_25.queryOptions&&_25.queryOptions.ignoreCase;
for(var i in _26){
var _29=_26[i];
var _2a=this.getValue(_24,i);
if((typeof _29=="string"&&(_29.match(/[\*\.]/)||_27))?!dojo.data.util.filter.patternToRegExp(_29,_27).test(_2a):_2a!=_29){
return false;
}
}
return true;
},makeComparator:function(_2b){
var _2c=_2b.shift();
if(!_2c){
return function(){
};
}
var _2d=_2c.attribute;
var _2e=!!_2c.descending;
var _2f=this.makeComparator(_2b);
var _30=this;
return function(a,b){
var av=_30.getValue(a,_2d);
var bv=_30.getValue(b,_2d);
if(av!=bv){
return av<bv==_2e?1:-1;
}
return _2f(a,b);
};
}});
_1.onUpdate=function(){
};
})();
}
