root / trunk / web / dojo / dojox / data / FlickrRestStore.js @ 9
History | View | Annotate | Download (6.87 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.FlickrRestStore"]){ |
9 |
dojo._hasResource["dojox.data.FlickrRestStore"]=true; |
10 |
dojo.provide("dojox.data.FlickrRestStore");
|
11 |
dojo.require("dojox.data.FlickrStore");
|
12 |
dojo.declare("dojox.data.FlickrRestStore",dojox.data.FlickrStore,{constructor:function(_1){ |
13 |
if(_1){
|
14 |
if(_1.label){
|
15 |
this.label=_1.label;
|
16 |
} |
17 |
if(_1.apikey){
|
18 |
this._apikey=_1.apikey;
|
19 |
} |
20 |
} |
21 |
this._cache=[];
|
22 |
this._prevRequests={};
|
23 |
this._handlers={};
|
24 |
this._prevRequestRanges=[];
|
25 |
this._maxPhotosPerUser={};
|
26 |
this._id=dojox.data.FlickrRestStore.prototype._id++;
|
27 |
},_id:0,_requestCount:0,_flickrRestUrl:"http://www.flickr.com/services/rest/",_apikey:null,_storeRef:"_S",_cache:null,_prevRequests:null,_handlers:null,_sortAttributes:{"date-posted":true,"date-taken":true,"interestingness":true},_fetchItems:function(_2,_3,_4){ |
28 |
var _5={};
|
29 |
if(!_2.query){
|
30 |
_2.query=_5={}; |
31 |
}else{
|
32 |
dojo.mixin(_5,_2.query); |
33 |
} |
34 |
var _6=[];
|
35 |
var _7=[];
|
36 |
var _8={format:"json",method:"flickr.photos.search",api_key:this._apikey,extras:"owner_name,date_upload,date_taken"}; |
37 |
var _9=false; |
38 |
if(_5.userid){
|
39 |
_9=true;
|
40 |
_8.user_id=_2.query.userid; |
41 |
_6.push("userid"+_2.query.userid);
|
42 |
} |
43 |
if(_5.groupid){
|
44 |
_9=true;
|
45 |
_8.group_id=_5.groupid; |
46 |
_6.push("groupid"+_5.groupid);
|
47 |
} |
48 |
if(_5.apikey){
|
49 |
_9=true;
|
50 |
_8.api_key=_2.query.apikey; |
51 |
_7.push("api"+_2.query.apikey);
|
52 |
}else{
|
53 |
if(_8.api_key){
|
54 |
_9=true;
|
55 |
_2.query.apikey=_8.api_key; |
56 |
_7.push("api"+_8.api_key);
|
57 |
}else{
|
58 |
throw Error("dojox.data.FlickrRestStore: An API key must be specified."); |
59 |
} |
60 |
} |
61 |
_2._curCount=_2.count; |
62 |
if(_5.page){
|
63 |
_8.page=_2.query.page; |
64 |
_7.push("page"+_8.page);
|
65 |
}else{
|
66 |
if(("start" in _2)&&_2.start!==null){ |
67 |
if(!_2.count){
|
68 |
_2.count=20;
|
69 |
} |
70 |
var _a=_2.start%_2.count;
|
71 |
var _b=_2.start,_c=_2.count;
|
72 |
if(_a!==0){ |
73 |
if(_b<_c/2){ |
74 |
_c=_b+_c; |
75 |
_b=0;
|
76 |
}else{
|
77 |
var _d=20,_e=2; |
78 |
for(var i=_d;i>0;i--){ |
79 |
if(_b%i===0&&(_b/i)>=_c){ |
80 |
_e=i; |
81 |
break;
|
82 |
} |
83 |
} |
84 |
_c=_b/_e; |
85 |
} |
86 |
_2._realStart=_2.start; |
87 |
_2._realCount=_2.count; |
88 |
_2._curStart=_b; |
89 |
_2._curCount=_c; |
90 |
}else{
|
91 |
_2._realStart=_2._realCount=null;
|
92 |
_2._curStart=_2.start; |
93 |
_2._curCount=_2.count; |
94 |
} |
95 |
_8.page=(_b/_c)+1;
|
96 |
_7.push("page"+_8.page);
|
97 |
} |
98 |
} |
99 |
if(_2._curCount){
|
100 |
_8.per_page=_2._curCount; |
101 |
_7.push("count"+_2._curCount);
|
102 |
} |
103 |
if(_5.lang){
|
104 |
_8.lang=_2.query.lang; |
105 |
_6.push("lang"+_2.lang);
|
106 |
} |
107 |
if(_5.setid){
|
108 |
_8.method="flickr.photosets.getPhotos";
|
109 |
_8.photoset_id=_2.query.setid; |
110 |
_6.push("set"+_2.query.setid);
|
111 |
} |
112 |
if(_5.tags){
|
113 |
if(_5.tags instanceof Array){ |
114 |
_8.tags=_5.tags.join(",");
|
115 |
}else{
|
116 |
_8.tags=_5.tags; |
117 |
} |
118 |
_6.push("tags"+_8.tags);
|
119 |
if(_5["tag_mode"]&&(_5.tag_mode.toLowerCase()==="any"||_5.tag_mode.toLowerCase()==="all")){ |
120 |
_8.tag_mode=_5.tag_mode; |
121 |
} |
122 |
} |
123 |
if(_5.text){
|
124 |
_8.text=_5.text; |
125 |
_6.push("text:"+_5.text);
|
126 |
} |
127 |
if(_5.sort&&_5.sort.length>0){ |
128 |
if(!_5.sort[0].attribute){ |
129 |
_5.sort[0].attribute="date-posted"; |
130 |
} |
131 |
if(this._sortAttributes[_5.sort[0].attribute]){ |
132 |
if(_5.sort[0].descending){ |
133 |
_8.sort=_5.sort[0].attribute+"-desc"; |
134 |
}else{
|
135 |
_8.sort=_5.sort[0].attribute+"-asc"; |
136 |
} |
137 |
} |
138 |
}else{
|
139 |
_8.sort="date-posted-asc";
|
140 |
} |
141 |
_6.push("sort:"+_8.sort);
|
142 |
_6=_6.join(".");
|
143 |
_7=_7.length>0?"."+_7.join("."):""; |
144 |
var _f=_6+_7;
|
145 |
_2={query:_5,count:_2._curCount,start:_2._curStart,_realCount:_2._realCount,_realStart:_2._realStart,onBegin:_2.onBegin,onComplete:_2.onComplete,onItem:_2.onItem}; |
146 |
var _10={request:_2,fetchHandler:_3,errorHandler:_4}; |
147 |
if(this._handlers[_f]){ |
148 |
this._handlers[_f].push(_10);
|
149 |
return;
|
150 |
} |
151 |
this._handlers[_f]=[_10];
|
152 |
var _11=null; |
153 |
var _12={url:this._flickrRestUrl,preventCache:this.urlPreventCache,content:_8,callbackParamName:"jsoncallback"}; |
154 |
var _13=dojo.hitch(this,function(_14,_15,_16){ |
155 |
var _17=_16.request.onBegin;
|
156 |
_16.request.onBegin=null;
|
157 |
var _18;
|
158 |
var req=_16.request;
|
159 |
if(("_realStart" in req)&&req._realStart!=null){ |
160 |
req.start=req._realStart; |
161 |
req.count=req._realCount; |
162 |
req._realStart=req._realCount=null;
|
163 |
} |
164 |
if(_17){
|
165 |
var _19=null; |
166 |
if(_15){
|
167 |
_19=(_15.photoset?_15.photoset:_15.photos); |
168 |
} |
169 |
if(_19&&("perpage" in _19)&&("pages" in _19)){ |
170 |
if(_19.perpage*_19.pages<=_16.request.start+_16.request.count){
|
171 |
_18=_16.request.start+_19.photo.length; |
172 |
}else{
|
173 |
_18=_19.perpage*_19.pages; |
174 |
} |
175 |
this._maxPhotosPerUser[_6]=_18;
|
176 |
_17(_18,_16.request); |
177 |
}else{
|
178 |
if(this._maxPhotosPerUser[_6]){ |
179 |
_17(this._maxPhotosPerUser[_6],_16.request);
|
180 |
} |
181 |
} |
182 |
} |
183 |
_16.fetchHandler(_14,_16.request); |
184 |
if(_17){
|
185 |
_16.request.onBegin=_17; |
186 |
} |
187 |
}); |
188 |
var _1a=dojo.hitch(this,function(_1b){ |
189 |
if(_1b.stat!="ok"){ |
190 |
_4(null,_2);
|
191 |
}else{
|
192 |
var _1c=this._handlers[_f]; |
193 |
if(!_1c){
|
194 |
return;
|
195 |
} |
196 |
this._handlers[_f]=null; |
197 |
this._prevRequests[_f]=_1b;
|
198 |
var _1d=this._processFlickrData(_1b,_2,_6); |
199 |
if(!this._prevRequestRanges[_6]){ |
200 |
this._prevRequestRanges[_6]=[];
|
201 |
} |
202 |
this._prevRequestRanges[_6].push({start:_2.start,end:_2.start+(_1b.photoset?_1b.photoset.photo.length:_1b.photos.photo.length)}); |
203 |
dojo.forEach(_1c,function(i){
|
204 |
_13(_1d,_1b,i); |
205 |
}); |
206 |
} |
207 |
}); |
208 |
var _1e=this._prevRequests[_f]; |
209 |
if(_1e){
|
210 |
this._handlers[_f]=null; |
211 |
_13(this._cache[_6],_1e,_10);
|
212 |
return;
|
213 |
}else{
|
214 |
if(this._checkPrevRanges(_6,_2.start,_2.count)){ |
215 |
this._handlers[_f]=null; |
216 |
_13(this._cache[_6],null,_10); |
217 |
return;
|
218 |
} |
219 |
} |
220 |
var _1f=dojo.io.script.get(_12);
|
221 |
_1f.addCallback(_1a); |
222 |
_1f.addErrback(function(_20){
|
223 |
dojo.disconnect(_11); |
224 |
_4(_20,_2); |
225 |
}); |
226 |
},getAttributes:function(_21){ |
227 |
return ["title","author","imageUrl","imageUrlSmall","imageUrlMedium","imageUrlThumb","imageUrlLarge","imageUrlOriginal","link","dateTaken","datePublished"]; |
228 |
},getValues:function(_22,_23){ |
229 |
this._assertIsItem(_22);
|
230 |
this._assertIsAttribute(_23);
|
231 |
switch(_23){
|
232 |
case "title": |
233 |
return [this._unescapeHtml(_22.title)]; |
234 |
case "author": |
235 |
return [_22.ownername];
|
236 |
case "imageUrlSmall": |
237 |
return [_22.media.s];
|
238 |
case "imageUrl": |
239 |
return [_22.media.l];
|
240 |
case "imageUrlOriginal": |
241 |
return [_22.media.o];
|
242 |
case "imageUrlLarge": |
243 |
return [_22.media.l];
|
244 |
case "imageUrlMedium": |
245 |
return [_22.media.m];
|
246 |
case "imageUrlThumb": |
247 |
return [_22.media.t];
|
248 |
case "link": |
249 |
return ["http://www.flickr.com/photos/"+_22.owner+"/"+_22.id]; |
250 |
case "dateTaken": |
251 |
return [_22.datetaken];
|
252 |
case "datePublished": |
253 |
return [_22.datepublished];
|
254 |
default:
|
255 |
return undefined; |
256 |
} |
257 |
},_processFlickrData:function(_24,_25,_26){ |
258 |
if(_24.items){
|
259 |
return dojox.data.FlickrStore.prototype._processFlickrData.apply(this,arguments); |
260 |
} |
261 |
var _27=["http://farm",null,".static.flickr.com/",null,"/",null,"_",null]; |
262 |
var _28=[];
|
263 |
var _29=(_24.photoset?_24.photoset:_24.photos);
|
264 |
if(_24.stat=="ok"&&_29&&_29.photo){ |
265 |
_28=_29.photo; |
266 |
for(var i=0;i<_28.length;i++){ |
267 |
var _2a=_28[i];
|
268 |
_2a[this._storeRef]=this; |
269 |
_27[1]=_2a.farm;
|
270 |
_27[3]=_2a.server;
|
271 |
_27[5]=_2a.id;
|
272 |
_27[7]=_2a.secret;
|
273 |
var _2b=_27.join(""); |
274 |
_2a.media={s:_2b+"_s.jpg",m:_2b+"_m.jpg",l:_2b+".jpg",t:_2b+"_t.jpg",o:_2b+"_o.jpg"}; |
275 |
if(!_2a.owner&&_24.photoset){
|
276 |
_2a.owner=_24.photoset.owner; |
277 |
} |
278 |
} |
279 |
} |
280 |
var _2c=_25.start?_25.start:0; |
281 |
var arr=this._cache[_26]; |
282 |
if(!arr){
|
283 |
this._cache[_26]=arr=[];
|
284 |
} |
285 |
dojo.forEach(_28,function(i,idx){
|
286 |
arr[idx+_2c]=i; |
287 |
}); |
288 |
return arr;
|
289 |
},_checkPrevRanges:function(_2d,_2e,_2f){ |
290 |
var end=_2e+_2f;
|
291 |
var arr=this._prevRequestRanges[_2d]; |
292 |
return (!!arr)&&dojo.some(arr,function(_30){ |
293 |
return ((_2e>=_30.start)&&(end<=_30.end));
|
294 |
}); |
295 |
}}); |
296 |
} |