]> git.pond.sub.org Git - eow/blobdiff - static/dojo-release-1.1.1/dojox/data/FlickrStore.js
add Dojo 1.1.1
[eow] / static / dojo-release-1.1.1 / dojox / data / FlickrStore.js
diff --git a/static/dojo-release-1.1.1/dojox/data/FlickrStore.js b/static/dojo-release-1.1.1/dojox/data/FlickrStore.js
new file mode 100644 (file)
index 0000000..4f282df
--- /dev/null
@@ -0,0 +1,257 @@
+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 error
+
+               if(!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.html
+               str = str.replace(/&amp;/gm, "&").replace(/&lt;/gm, "<").replace(/&gt;/gm, ">").replace(/&quot;/gm, "\"");
+               str = str.replace(/&#39;/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){};
+}
+
+
+}