FlickrRestStore.js 6.6 KB

12345678
  1. /*
  2. Copyright (c) 2004-2009, 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. if(!dojo._hasResource["dojox.data.FlickrRestStore"]){dojo._hasResource["dojox.data.FlickrRestStore"]=true;dojo.provide("dojox.data.FlickrRestStore");dojo.require("dojox.data.FlickrStore");dojo.declare("dojox.data.FlickrRestStore",dojox.data.FlickrStore,{constructor:function(_1){if(_1){if(_1.label){this.label=_1.label;}if(_1.apikey){this._apikey=_1.apikey;}}this._cache=[];this._prevRequests={};this._handlers={};this._prevRequestRanges=[];this._maxPhotosPerUser={};this._id=dojox.data.FlickrRestStore.prototype._id++;},_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){var _5={};if(!_2.query){_2.query=_5={};}else{dojo.mixin(_5,_2.query);}var _6=[];var _7=[];var _8={format:"json",method:"flickr.photos.search",api_key:this._apikey,extras:"owner_name,date_upload,date_taken"};var _9=false;if(_5.userid){_9=true;_8.user_id=_2.query.userid;_6.push("userid"+_2.query.userid);}if(_5.groupid){_9=true;_8.group_id=_5.groupid;_6.push("groupid"+_5.groupid);}if(_5.apikey){_9=true;_8.api_key=_2.query.apikey;_7.push("api"+_2.query.apikey);}else{if(_8.api_key){_9=true;_2.query.apikey=_8.api_key;_7.push("api"+_8.api_key);}else{throw Error("dojox.data.FlickrRestStore: An API key must be specified.");}}_2._curCount=_2.count;if(_5.page){_8.page=_2.query.page;_7.push("page"+_8.page);}else{if(("start" in _2)&&_2.start!==null){if(!_2.count){_2.count=20;}var _a=_2.start%_2.count;var _b=_2.start,_c=_2.count;if(_a!==0){if(_b<_c/2){_c=_b+_c;_b=0;}else{var _d=20,_e=2;for(var i=_d;i>0;i--){if(_b%i===0&&(_b/i)>=_c){_e=i;break;}}_c=_b/_e;}_2._realStart=_2.start;_2._realCount=_2.count;_2._curStart=_b;_2._curCount=_c;}else{_2._realStart=_2._realCount=null;_2._curStart=_2.start;_2._curCount=_2.count;}_8.page=(_b/_c)+1;_7.push("page"+_8.page);}}if(_2._curCount){_8.per_page=_2._curCount;_7.push("count"+_2._curCount);}if(_5.lang){_8.lang=_2.query.lang;_6.push("lang"+_2.lang);}if(_5.setid){_8.method="flickr.photosets.getPhotos";_8.photoset_id=_2.query.setid;_6.push("set"+_2.query.setid);}if(_5.tags){if(_5.tags instanceof Array){_8.tags=_5.tags.join(",");}else{_8.tags=_5.tags;}_6.push("tags"+_8.tags);if(_5["tag_mode"]&&(_5.tag_mode.toLowerCase()==="any"||_5.tag_mode.toLowerCase()==="all")){_8.tag_mode=_5.tag_mode;}}if(_5.text){_8.text=_5.text;_6.push("text:"+_5.text);}if(_5.sort&&_5.sort.length>0){if(!_5.sort[0].attribute){_5.sort[0].attribute="date-posted";}if(this._sortAttributes[_5.sort[0].attribute]){if(_5.sort[0].descending){_8.sort=_5.sort[0].attribute+"-desc";}else{_8.sort=_5.sort[0].attribute+"-asc";}}}else{_8.sort="date-posted-asc";}_6.push("sort:"+_8.sort);_6=_6.join(".");_7=_7.length>0?"."+_7.join("."):"";var _f=_6+_7;_2={query:_5,count:_2._curCount,start:_2._curStart,_realCount:_2._realCount,_realStart:_2._realStart,onBegin:_2.onBegin,onComplete:_2.onComplete,onItem:_2.onItem};var _10={request:_2,fetchHandler:_3,errorHandler:_4};if(this._handlers[_f]){this._handlers[_f].push(_10);return;}this._handlers[_f]=[_10];var _11=null;var _12={url:this._flickrRestUrl,preventCache:this.urlPreventCache,content:_8,callbackParamName:"jsoncallback"};var _13=dojo.hitch(this,function(_14,_15,_16){var _17=_16.request.onBegin;_16.request.onBegin=null;var _18;var req=_16.request;if(("_realStart" in req)&&req._realStart!=null){req.start=req._realStart;req.count=req._realCount;req._realStart=req._realCount=null;}if(_17){var _19=null;if(_15){_19=(_15.photoset?_15.photoset:_15.photos);}if(_19&&("perpage" in _19)&&("pages" in _19)){if(_19.perpage*_19.pages<=_16.request.start+_16.request.count){_18=_16.request.start+_19.photo.length;}else{_18=_19.perpage*_19.pages;}this._maxPhotosPerUser[_6]=_18;_17(_18,_16.request);}else{if(this._maxPhotosPerUser[_6]){_17(this._maxPhotosPerUser[_6],_16.request);}}}_16.fetchHandler(_14,_16.request);if(_17){_16.request.onBegin=_17;}});var _1a=dojo.hitch(this,function(_1b){if(_1b.stat!="ok"){_4(null,_2);}else{var _1c=this._handlers[_f];if(!_1c){return;}this._handlers[_f]=null;this._prevRequests[_f]=_1b;var _1d=this._processFlickrData(_1b,_2,_6);if(!this._prevRequestRanges[_6]){this._prevRequestRanges[_6]=[];}this._prevRequestRanges[_6].push({start:_2.start,end:_2.start+(_1b.photoset?_1b.photoset.photo.length:_1b.photos.photo.length)});dojo.forEach(_1c,function(i){_13(_1d,_1b,i);});}});var _1e=this._prevRequests[_f];if(_1e){this._handlers[_f]=null;_13(this._cache[_6],_1e,_10);return;}else{if(this._checkPrevRanges(_6,_2.start,_2.count)){this._handlers[_f]=null;_13(this._cache[_6],null,_10);return;}}var _1f=dojo.io.script.get(_12);_1f.addCallback(_1a);_1f.addErrback(function(_20){dojo.disconnect(_11);_4(_20,_2);});},getAttributes:function(_21){return ["title","author","imageUrl","imageUrlSmall","imageUrlMedium","imageUrlThumb","link","dateTaken","datePublished"];},getValues:function(_22,_23){this._assertIsItem(_22);this._assertIsAttribute(_23);switch(_23){case "title":return [this._unescapeHtml(_22.title)];case "author":return [_22.ownername];case "imageUrlSmall":return [_22.media.s];case "imageUrl":return [_22.media.l];case "imageUrlOriginal":return [_22.media.o];case "imageUrlLarge":return [_22.media.l];case "imageUrlMedium":return [_22.media.m];case "imageUrlThumb":return [_22.media.t];case "link":return ["http://www.flickr.com/photos/"+_22.owner+"/"+_22.id];case "dateTaken":return [_22.datetaken];case "datePublished":return [_22.datepublished];default:return undefined;}},_processFlickrData:function(_24,_25,_26){if(_24.items){return dojox.data.FlickrStore.prototype._processFlickrData.apply(this,arguments);}var _27=["http://farm",null,".static.flickr.com/",null,"/",null,"_",null];var _28=[];var _29=(_24.photoset?_24.photoset:_24.photos);if(_24.stat=="ok"&&_29&&_29.photo){_28=_29.photo;for(var i=0;i<_28.length;i++){var _2a=_28[i];_2a[this._storeRef]=this;_27[1]=_2a.farm;_27[3]=_2a.server;_27[5]=_2a.id;_27[7]=_2a.secret;var _2b=_27.join("");_2a.media={s:_2b+"_s.jpg",m:_2b+"_m.jpg",l:_2b+".jpg",t:_2b+"_t.jpg",o:_2b+"_o.jpg"};if(!_2a.owner&&_24.photoset){_2a.owner=_24.photoset.owner;}}}var _2c=_25.start?_25.start:0;var arr=this._cache[_26];if(!arr){this._cache[_26]=arr=[];}dojo.forEach(_28,function(i,idx){arr[idx+_2c]=i;});return arr;},_checkPrevRanges:function(_2d,_2e,_2f){var end=_2e+_2f;var arr=this._prevRequestRanges[_2d];return (!!arr)&&dojo.some(arr,function(_30){return ((_2e>=_30.start)&&(end<=_30.end));});}});}