Project

General

Profile

Statistics
| Revision:

root / trunk / web / dojo / dojox / data / CssRuleStore.js

History | View | Annotate | Download (6.63 KB)

1
/*
2
        Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
3
        Available via Academic Free License >= 2.1 OR the modified BSD license.
4
        see: http://dojotoolkit.org/license for details
5
*/
6

    
7

    
8
if(!dojo._hasResource["dojox.data.CssRuleStore"]){
9
dojo._hasResource["dojox.data.CssRuleStore"]=true;
10
dojo.provide("dojox.data.CssRuleStore");
11
dojo.require("dojo.data.util.filter");
12
dojo.require("dojo.data.util.sorter");
13
dojo.require("dojox.data.css");
14
dojo.declare("dojox.data.CssRuleStore",null,{_storeRef:"_S",_labelAttribute:"selector",_cache:null,_browserMap:null,_cName:"dojox.data.CssRuleStore",constructor:function(_1){
15
if(_1){
16
dojo.mixin(this,_1);
17
}
18
this._cache={};
19
this._allItems=null;
20
this._waiting=[];
21
this.gatherHandle=null;
22
var _2=this;
23
function _3(){
24
try{
25
_2.context=dojox.data.css.determineContext(_2.context);
26
if(_2.gatherHandle){
27
clearInterval(_2.gatherHandle);
28
_2.gatherHandle=null;
29
}
30
while(_2._waiting.length){
31
var _4=_2._waiting.pop();
32
dojox.data.css.rules.forEach(_4.forFunc,null,_2.context);
33
_4.finishFunc();
34
}
35
}
36
catch(e){
37
}
38
};
39
this.gatherHandle=setInterval(_3,250);
40
},setContext:function(_5){
41
if(_5){
42
this.close();
43
this.context=dojox.data.css.determineContext(_5);
44
}
45
},getFeatures:function(){
46
return {"dojo.data.api.Read":true};
47
},isItem:function(_6){
48
if(_6&&_6[this._storeRef]==this){
49
return true;
50
}
51
return false;
52
},hasAttribute:function(_7,_8){
53
this._assertIsItem(_7);
54
this._assertIsAttribute(_8);
55
var _9=this.getAttributes(_7);
56
if(dojo.indexOf(_9,_8)!=-1){
57
return true;
58
}
59
return false;
60
},getAttributes:function(_a){
61
this._assertIsItem(_a);
62
var _b=["selector","classes","rule","style","cssText","styleSheet","parentStyleSheet","parentStyleSheetHref"];
63
var _c=_a.rule.style;
64
if(_c){
65
var _d;
66
for(_d in _c){
67
_b.push("style."+_d);
68
}
69
}
70
return _b;
71
},getValue:function(_e,_f,_10){
72
var _11=this.getValues(_e,_f);
73
var _12=_10;
74
if(_11&&_11.length>0){
75
return _11[0];
76
}
77
return _10;
78
},getValues:function(_13,_14){
79
this._assertIsItem(_13);
80
this._assertIsAttribute(_14);
81
var _15=null;
82
if(_14==="selector"){
83
_15=_13.rule["selectorText"];
84
if(_15&&dojo.isString(_15)){
85
_15=_15.split(",");
86
}
87
}else{
88
if(_14==="classes"){
89
_15=_13.classes;
90
}else{
91
if(_14==="rule"){
92
_15=_13.rule.rule;
93
}else{
94
if(_14==="style"){
95
_15=_13.rule.style;
96
}else{
97
if(_14==="cssText"){
98
if(dojo.isIE){
99
if(_13.rule.style){
100
_15=_13.rule.style.cssText;
101
if(_15){
102
_15="{ "+_15.toLowerCase()+" }";
103
}
104
}
105
}else{
106
_15=_13.rule.cssText;
107
if(_15){
108
_15=_15.substring(_15.indexOf("{"),_15.length);
109
}
110
}
111
}else{
112
if(_14==="styleSheet"){
113
_15=_13.rule.styleSheet;
114
}else{
115
if(_14==="parentStyleSheet"){
116
_15=_13.rule.parentStyleSheet;
117
}else{
118
if(_14==="parentStyleSheetHref"){
119
if(_13.href){
120
_15=_13.href;
121
}
122
}else{
123
if(_14.indexOf("style.")===0){
124
var _16=_14.substring(_14.indexOf("."),_14.length);
125
_15=_13.rule.style[_16];
126
}else{
127
_15=[];
128
}
129
}
130
}
131
}
132
}
133
}
134
}
135
}
136
}
137
if(_15!==undefined){
138
if(!dojo.isArray(_15)){
139
_15=[_15];
140
}
141
}
142
return _15;
143
},getLabel:function(_17){
144
this._assertIsItem(_17);
145
return this.getValue(_17,this._labelAttribute);
146
},getLabelAttributes:function(_18){
147
return [this._labelAttribute];
148
},containsValue:function(_19,_1a,_1b){
149
var _1c=undefined;
150
if(typeof _1b==="string"){
151
_1c=dojo.data.util.filter.patternToRegExp(_1b,false);
152
}
153
return this._containsValue(_19,_1a,_1b,_1c);
154
},isItemLoaded:function(_1d){
155
return this.isItem(_1d);
156
},loadItem:function(_1e){
157
this._assertIsItem(_1e.item);
158
},fetch:function(_1f){
159
_1f=_1f||{};
160
if(!_1f.store){
161
_1f.store=this;
162
}
163
var _20=_1f.scope||dojo.global;
164
if(this._pending&&this._pending.length>0){
165
this._pending.push({request:_1f,fetch:true});
166
}else{
167
this._pending=[{request:_1f,fetch:true}];
168
this._fetch(_1f);
169
}
170
return _1f;
171
},_fetch:function(_21){
172
var _22=_21.scope||dojo.global;
173
if(this._allItems===null){
174
this._allItems={};
175
try{
176
if(this.gatherHandle){
177
this._waiting.push({"forFunc":dojo.hitch(this,this._handleRule),"finishFunc":dojo.hitch(this,this._handleReturn)});
178
}else{
179
dojox.data.css.rules.forEach(dojo.hitch(this,this._handleRule),null,this.context);
180
this._handleReturn();
181
}
182
}
183
catch(e){
184
if(_21.onError){
185
_21.onError.call(_22,e,_21);
186
}
187
}
188
}else{
189
this._handleReturn();
190
}
191
},_handleRule:function(_23,_24,_25){
192
var _26=_23["selectorText"];
193
var s=_26.split(" ");
194
var _27=[];
195
for(var j=0;j<s.length;j++){
196
var tmp=s[j];
197
var _28=tmp.indexOf(".");
198
if(tmp&&tmp.length>0&&_28!==-1){
199
var _29=tmp.indexOf(",")||tmp.indexOf("[");
200
tmp=tmp.substring(_28,((_29!==-1&&_29>_28)?_29:tmp.length));
201
_27.push(tmp);
202
}
203
}
204
var _2a={};
205
_2a.rule=_23;
206
_2a.styleSheet=_24;
207
_2a.href=_25;
208
_2a.classes=_27;
209
_2a[this._storeRef]=this;
210
if(!this._allItems[_26]){
211
this._allItems[_26]=[];
212
}
213
this._allItems[_26].push(_2a);
214
},_handleReturn:function(){
215
var _2b=[];
216
var _2c=[];
217
var _2d=null;
218
for(var i in this._allItems){
219
_2d=this._allItems[i];
220
for(var j in _2d){
221
_2c.push(_2d[j]);
222
}
223
}
224
var _2e;
225
while(this._pending.length){
226
_2e=this._pending.pop();
227
_2e.request._items=_2c;
228
_2b.push(_2e);
229
}
230
while(_2b.length){
231
_2e=_2b.pop();
232
this._handleFetchReturn(_2e.request);
233
}
234
},_handleFetchReturn:function(_2f){
235
var _30=_2f.scope||dojo.global;
236
var _31=[];
237
var _32="all";
238
var i;
239
if(_2f.query){
240
_32=dojo.toJson(_2f.query);
241
}
242
if(this._cache[_32]){
243
_31=this._cache[_32];
244
}else{
245
if(_2f.query){
246
for(i in _2f._items){
247
var _33=_2f._items[i];
248
var _34=dojo.isWebKit?true:(_2f.queryOptions?_2f.queryOptions.ignoreCase:false);
249
var _35={};
250
var key;
251
var _36;
252
for(key in _2f.query){
253
_36=_2f.query[key];
254
if(typeof _36==="string"){
255
_35[key]=dojo.data.util.filter.patternToRegExp(_36,_34);
256
}
257
}
258
var _37=true;
259
for(key in _2f.query){
260
_36=_2f.query[key];
261
if(!this._containsValue(_33,key,_36,_35[key])){
262
_37=false;
263
}
264
}
265
if(_37){
266
_31.push(_33);
267
}
268
}
269
this._cache[_32]=_31;
270
}else{
271
for(i in _2f._items){
272
_31.push(_2f._items[i]);
273
}
274
}
275
}
276
var _38=_31.length;
277
if(_2f.sort){
278
_31.sort(dojo.data.util.sorter.createSortFunction(_2f.sort,this));
279
}
280
var _39=0;
281
var _3a=_31.length;
282
if(_2f.start>0&&_2f.start<_31.length){
283
_39=_2f.start;
284
}
285
if(_2f.count&&_2f.count){
286
_3a=_2f.count;
287
}
288
var _3b=_39+_3a;
289
if(_3b>_31.length){
290
_3b=_31.length;
291
}
292
_31=_31.slice(_39,_3b);
293
if(_2f.onBegin){
294
_2f.onBegin.call(_30,_38,_2f);
295
}
296
if(_2f.onItem){
297
if(dojo.isArray(_31)){
298
for(i=0;i<_31.length;i++){
299
_2f.onItem.call(_30,_31[i],_2f);
300
}
301
if(_2f.onComplete){
302
_2f.onComplete.call(_30,null,_2f);
303
}
304
}
305
}else{
306
if(_2f.onComplete){
307
_2f.onComplete.call(_30,_31,_2f);
308
}
309
}
310
return _2f;
311
},close:function(){
312
this._cache={};
313
this._allItems=null;
314
},_assertIsItem:function(_3c){
315
if(!this.isItem(_3c)){
316
throw new Error(this._cName+": Invalid item argument.");
317
}
318
},_assertIsAttribute:function(_3d){
319
if(typeof _3d!=="string"){
320
throw new Error(this._cName+": Invalid attribute argument.");
321
}
322
},_containsValue:function(_3e,_3f,_40,_41){
323
return dojo.some(this.getValues(_3e,_3f),function(_42){
324
if(_42!==null&&!dojo.isObject(_42)&&_41){
325
if(_42.toString().match(_41)){
326
return true;
327
}
328
}else{
329
if(_40===_42){
330
return true;
331
}
332
}
333
return false;
334
});
335
}});
336
}