Blame | Last modification | View Log | RSS feed
if(!dojo._hasResource["dojox.data.FlickrStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.dojo._hasResource["dojox.data.FlickrStore"] = true;dojo.provide("dojox.data.FlickrStore");dojo.require("dojo.data.util.simpleFetch");dojo.require("dojo.io.script");dojo.require("dojo.date.stamp");dojo.declare("dojox.data.FlickrStore", null, {constructor: function(/*Object*/args){// summary:// Initializer for the FlickrStore store.// description:// The FlickrStore is a Datastore interface to one of the basic services// of the Flickr service, the public photo feed. This does not provide// access to all the services of Flickr.// This store cannot do * and ? filtering as the flickr service// provides no interface for wildcards.if(args && args.label){this.label = args.label;}},_flickrUrl: "http://api.flickr.com/services/feeds/photos_public.gne",_storeRef: "_S",label: "title",_assertIsItem: function(/* item */ item){// summary:// This function tests whether the item passed in is indeed an item in the store.// item:// The item to test for being contained by the store.if(!this.isItem(item)){throw new Error("dojox.data.FlickrStore: a function was passed an item argument that was not an item");}},_assertIsAttribute: function(/* attribute-name-string */ attribute){// summary:// This function tests whether the item passed in is indeed a valid 'attribute' like type for the store.// attribute:// The attribute to test for being contained by the store.if(typeof attribute !== "string"){throw new Error("dojox.data.FlickrStore: a function was passed an attribute argument that was not an attribute name string");}},getFeatures: function(){// summary:// See dojo.data.api.Read.getFeatures()return {'dojo.data.api.Read': true};},getValue: function(item, attribute){// summary:// See dojo.data.api.Read.getValue()var values = this.getValues(item, attribute);if(values){return values[0];}return undefined;},getAttributes: function(item){// summary:// See dojo.data.api.Read.getAttributes()return ["title", "description", "author", "datePublished", "dateTaken", "imageUrl", "imageUrlSmall", "imageUrlMedium", "tags", "link"];},hasAttribute: function(item, attribute){// summary:// See dojo.data.api.Read.hasAttributes()if(this.getValue(item,attribute)){return true;}return false;},isItemLoaded: function(item){// summary:// See dojo.data.api.Read.isItemLoaded()return this.isItem(item);},loadItem: function(keywordArgs){// summary:// See dojo.data.api.Read.loadItem()},getLabel: function(item){// summary:// See dojo.data.api.Read.getLabel()return this.getValue(item,this.label);},getLabelAttributes: function(item){// summary:// See dojo.data.api.Read.getLabelAttributes()return [this.label];},containsValue: function(item, attribute, value){// summary:// See dojo.data.api.Read.containsValue()var values = this.getValues(item,attribute);for(var i = 0; i < values.length; i++){if(values[i] === value){return true;}}return false;},getValues: function(item, attribute){// summary:// See dojo.data.api.Read.getValue()this._assertIsItem(item);this._assertIsAttribute(attribute);if(attribute === "title"){return [this._unescapeHtml(item.title)];}else if(attribute === "author"){return [this._unescapeHtml(item.author)];}else if(attribute === "datePublished"){return [dojo.date.stamp.fromISOString(item.published)];}else if(attribute === "dateTaken"){return [dojo.date.stamp.fromISOString(item.date_taken)];}else if(attribute === "imageUrlSmall"){return [item.media.m.replace(/_m\./, "_s.")];}else if(attribute === "imageUrl"){return [item.media.m.replace(/_m\./, ".")];}else if(attribute === "imageUrlMedium"){return [item.media.m];}else if(attribute === "link"){return [item.link];}else if(attribute === "tags"){return item.tags.split(" ");}else if(attribute === "description"){return [this._unescapeHtml(item.description)];}return undefined;},isItem: function(item){// summary:// See dojo.data.api.Read.isItem()if(item && item[this._storeRef] === this){return true;}return false;},close: function(request){// summary:// See dojo.data.api.Read.close()},_fetchItems: function(request, fetchHandler, errorHandler){// summary:// Fetch flickr items that match to a query// request:// A request object// fetchHandler:// A function to call for fetched items// errorHandler:// A function to call on errorif(!request.query){request.query={};}//Build up the content to send the request for.var content = {format: "json", tagmode:"any"};if (request.query.tags) {content.tags = request.query.tags;}if (request.query.tagmode) {content.tagmode = request.query.tagmode;}if (request.query.userid) {content.id = request.query.userid;}if (request.query.userids) {content.ids = request.query.userids;}if (request.query.lang) {content.lang = request.query.lang;}//Linking this up to Flickr is a PAIN!var self = this;var handle = null;var getArgs = {url: this._flickrUrl,preventCache: true,content: content};var myHandler = function(data){if(handle !== null){dojo.disconnect(handle);}//Process the items...fetchHandler(self._processFlickrData(data), request);};handle = dojo.connect("jsonFlickrFeed", myHandler);var deferred = dojo.io.script.get(getArgs);//We only set up the errback, because the callback isn't ever really used because we have//to link to the jsonFlickrFeed function....deferred.addErrback(function(error){dojo.disconnect(handle);errorHandler(error, request);});},_processFlickrData: function(data){var items = [];if(data.items){items = data.items;//Add on the store ref so that isItem can work.for(var i = 0; i < data.items.length; i++){var item = data.items[i];item[this._storeRef] = this;}}return items;},_unescapeHtml: function(str){// summary: Utility function to un-escape XML special characters in an HTML string.// description: Utility function to un-escape XML special characters in an HTML string.//// str: String.// The string to un-escape// returns: HTML String converted back to the normal text (unescaped) characters (<,>,&, ", etc,).////TODO: Check to see if theres already compatible escape() in dojo.string or dojo.htmlstr = str.replace(/&/gm, "&").replace(/</gm, "<").replace(/>/gm, ">").replace(/"/gm, "\"");str = str.replace(/'/gm, "'");return str;}});dojo.extend(dojox.data.FlickrStore,dojo.data.util.simpleFetch);//We have to define this because of how the Flickr API works.//This somewhat stinks, but what can you do?if (!jsonFlickrFeed) {var jsonFlickrFeed = function(data){};}}