diff options
Diffstat (limited to 'js/dojo/dojox/data/FlickrStore.js')
| -rw-r--r-- | js/dojo/dojox/data/FlickrStore.js | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/js/dojo/dojox/data/FlickrStore.js b/js/dojo/dojox/data/FlickrStore.js new file mode 100644 index 0000000..e020956 --- /dev/null +++ b/js/dojo/dojox/data/FlickrStore.js @@ -0,0 +1,285 @@ +//>>built +define("dojox/data/FlickrStore", ["dojo/_base/lang", "dojo/_base/declare", "dojo/_base/array", "dojo/data/util/simpleFetch", "dojo/io/script", + "dojo/_base/connect", "dojo/date/stamp", "dojo/AdapterRegistry"], + function(lang, declare, array, simpleFetch, scriptIO, connect, dateStamp, AdapterRegistry) { + +var FlickrStore = 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; + } + if(args && "urlPreventCache" in args){ + this.urlPreventCache = args.urlPreventCache?true:false; + } + }, + + _storeRef: "_S", + + label: "title", + + //Flag to allor control of if cache prevention is enabled or not. + urlPreventCache: true, + + _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, defaultValue){ + // summary: + // See dojo.data.api.Read.getValue() + var values = this.getValues(item, attribute); + if(values && values.length > 0){ + return values[0]; + } + return defaultValue; + }, + + 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() + var v = this.getValue(item,attribute); + if(v || v === "" || v === false){ + 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); + var u = lang.hitch(this, "_unescapeHtml"); + var s = lang.hitch(dateStamp, "fromISOString"); + switch(attribute){ + case "title": + return [ u(item.title) ]; + case "author": + return [ u(item.author) ]; + case "datePublished": + return [ s(item.published) ]; + case "dateTaken": + return [ s(item.date_taken) ]; + case "imageUrlSmall": + return [ item.media.m.replace(/_m\./, "_s.") ]; + case "imageUrl": + return [ item.media.m.replace(/_m\./, ".") ]; + case "imageUrlMedium": + return [ item.media.m ]; + case "link": + return [ item.link ]; + case "tags": + return item.tags.split(" "); + case "description": + return [ u(item.description) ]; + default: + return []; + } + }, + + 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 error + + var rq = request.query = request.query || {}; + + //Build up the content to send the request for. + var content = { + format: "json", + tagmode:"any" + }; + + array.forEach( + [ "tags", "tagmode", "lang", "id", "ids" ], + function(i){ + if(rq[i]){ content[i] = rq[i]; } + } + ); + + content.id = rq.id || rq.userid || rq.groupid; + + if(rq.userids){ + content.ids = rq.userids; + } + + //Linking this up to Flickr is a PAIN! + var handle = null; + var getArgs = { + url: dojox.data.FlickrStore.urlRegistry.match(request), + preventCache: this.urlPreventCache, + content: content + }; + var myHandler = lang.hitch(this, function(data){ + if(!!handle){ + connect.disconnect(handle); + } + + //Process the items... + fetchHandler(this._processFlickrData(data), request); + }); + handle = connect.connect("jsonFlickrFeed", myHandler); + var deferred = scriptIO.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){ + connect.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(/*String*/ str){ + // summary: + // 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.html + return str.replace(/&/gm, "&"). + replace(/</gm, "<"). + replace(/>/gm, ">"). + replace(/"/gm, "\""). + replace(/'/gm, "'"); + } +}); + +lang.extend(FlickrStore, simpleFetch); + +var feedsUrl = "http://api.flickr.com/services/feeds/"; + +var reg = FlickrStore.urlRegistry = new AdapterRegistry(true); + +reg.register("group pool", + function(request){ return !!request.query["groupid"]; }, + feedsUrl+"groups_pool.gne" +); + +reg.register("default", + function(request){ return true; }, + feedsUrl+"photos_public.gne" +); + +//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){}; +} + +return FlickrStore; +}); |
