blob: c63aaa5dbde1a4ef0699c4a9795cdad4176ef62d [file] [log] [blame]
/*
Copyright (c) 2004-2009, 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.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.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(typeof (_2.start)!="undefined"&&_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);
}
var url=this._flickrRestUrl;
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 _11=_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 _12={request:_2,fetchHandler:_3,errorHandler:_4};
if(this._handlers[_11]){
this._handlers[_11].push(_12);
return;
}
this._handlers[_11]=[_12];
var _13=null;
var _14={url:this._flickrRestUrl,preventCache:true,content:_8,callbackParamName:"jsoncallback"};
var _15=dojo.hitch(this,function(_16,_17,_18){
var _19=_18.request.onBegin;
_18.request.onBegin=null;
var _1a;
var req=_18.request;
if(typeof (req._realStart)!=undefined&&req._realStart!=null){
req.start=req._realStart;
req.count=req._realCount;
req._realStart=req._realCount=null;
}
if(_19){
var _1c=null;
if(_17){
_1c=(_17.photoset?_17.photoset:_17.photos);
}
if(_1c&&typeof (_1c.perpage)!="undefined"&&typeof (_1c.pages)!="undefined"){
if(_1c.perpage*_1c.pages<=_18.request.start+_18.request.count){
_1a=_18.request.start+_1c.photo.length;
}else{
_1a=_1c.perpage*_1c.pages;
}
this._maxPhotosPerUser[_6]=_1a;
_19(_1a,_18.request);
}else{
if(this._maxPhotosPerUser[_6]){
_19(this._maxPhotosPerUser[_6],_18.request);
}
}
}
_18.fetchHandler(_16,_18.request);
if(_19){
_18.request.onBegin=_19;
}
});
var _1d=dojo.hitch(this,function(_1e){
if(_1e.stat!="ok"){
_4(null,_2);
}else{
var _1f=this._handlers[_11];
if(!_1f){
return;
}
this._handlers[_11]=null;
this._prevRequests[_11]=_1e;
var _20=this._processFlickrData(_1e,_2,_6);
if(!this._prevRequestRanges[_6]){
this._prevRequestRanges[_6]=[];
}
this._prevRequestRanges[_6].push({start:_2.start,end:_2.start+(_1e.photoset?_1e.photoset.photo.length:_1e.photos.photo.length)});
dojo.forEach(_1f,function(i){
_15(_20,_1e,i);
});
}
});
var _22=this._prevRequests[_11];
if(_22){
this._handlers[_11]=null;
_15(this._cache[_6],_22,_12);
return;
}else{
if(this._checkPrevRanges(_6,_2.start,_2.count)){
this._handlers[_11]=null;
_15(this._cache[_6],null,_12);
return;
}
}
var _23=dojo.io.script.get(_14);
_23.addCallback(_1d);
_23.addErrback(function(_24){
dojo.disconnect(_13);
_4(_24,_2);
});
},getAttributes:function(_25){
return ["title","author","imageUrl","imageUrlSmall","imageUrlMedium","imageUrlThumb","link","dateTaken","datePublished"];
},getValues:function(_26,_27){
this._assertIsItem(_26);
this._assertIsAttribute(_27);
switch(_27){
case "title":
return [this._unescapeHtml(_26.title)];
case "author":
return [_26.ownername];
case "imageUrlSmall":
return [_26.media.s];
case "imageUrl":
return [_26.media.l];
case "imageUrlMedium":
return [_26.media.m];
case "imageUrlThumb":
return [_26.media.t];
case "link":
return ["http://www.flickr.com/photos/"+_26.owner+"/"+_26.id];
case "dateTaken":
return [_26.datetaken];
case "datePublished":
return [_26.datepublished];
default:
return undefined;
}
},_processFlickrData:function(_28,_29,_2a){
if(_28.items){
return dojox.data.FlickrStore.prototype._processFlickrData.apply(this,arguments);
}
var _2b=["http://farm",null,".static.flickr.com/",null,"/",null,"_",null];
var _2c=[];
var _2d=(_28.photoset?_28.photoset:_28.photos);
if(_28.stat=="ok"&&_2d&&_2d.photo){
_2c=_2d.photo;
for(var i=0;i<_2c.length;i++){
var _2f=_2c[i];
_2f[this._storeRef]=this;
_2b[1]=_2f.farm;
_2b[3]=_2f.server;
_2b[5]=_2f.id;
_2b[7]=_2f.secret;
var _30=_2b.join("");
_2f.media={s:_30+"_s.jpg",m:_30+"_m.jpg",l:_30+".jpg",t:_30+"_t.jpg"};
if(!_2f.owner&&_28.photoset){
_2f.owner=_28.photoset.owner;
}
}
}
var _31=_29.start?_29.start:0;
var arr=this._cache[_2a];
if(!arr){
this._cache[_2a]=arr=[];
}
dojo.forEach(_2c,function(i,idx){
arr[idx+_31]=i;
});
return arr;
},_checkPrevRanges:function(_35,_36,_37){
var end=_36+_37;
var arr=this._prevRequestRanges[_35];
return (!!arr)&&dojo.some(arr,function(_3a){
return ((_36>=_3a.start)&&(end<=_3a.end));
});
}});
}