diff options
Diffstat (limited to 'includes/js/dojox/data/PicasaStore.js')
-rw-r--r-- | includes/js/dojox/data/PicasaStore.js | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/includes/js/dojox/data/PicasaStore.js b/includes/js/dojox/data/PicasaStore.js new file mode 100644 index 0000000..e1b96b0 --- /dev/null +++ b/includes/js/dojox/data/PicasaStore.js @@ -0,0 +1,254 @@ +if(!dojo._hasResource["dojox.data.PicasaStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.data.PicasaStore"] = true; +dojo.provide("dojox.data.PicasaStore"); + +dojo.require("dojo.data.util.simpleFetch"); +dojo.require("dojo.io.script"); +dojo.require("dojo.date.stamp"); + +dojo.declare("dojox.data.PicasaStore", null, { + constructor: function(/*Object*/args){ + // summary: + // Initializer for the PicasaStore store. + // description: + // The PicasaStore is a Datastore interface to one of the basic services + // of the Picasa service, the public photo feed. This does not provide + // access to all the services of Picasa. + // This store cannot do * and ? filtering as the picasa service + // provides no interface for wildcards. + if(args && args.label){ + this.label = args.label; + } + }, + + _picasaUrl: "http://picasaweb.google.com/data/feed/api/all", + + _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.PicasaStore: 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.PicasaStore: 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 ["id", "published", "updated", "category", "title$type", "title", "summary$type", "summary", "rights$type", "rights", "link", "author", "gphoto$id", "gphoto$name", "location"]; + }, + + 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[0].name)]; + }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.thumbnail[1].url]; + }else if(attribute === "imageUrl"){ + return [item.content$src]; + }else if(attribute === "imageUrlMedium"){ + return [item.media.thumbnail[2].url]; + }else if(attribute === "link"){ + return [item.link[1]]; + }else if(attribute === "tags"){ + return item.tags.split(" "); + }else if(attribute === "description"){ + return [this._unescapeHtml(item.summary)]; + } + 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 picasa 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 = {alt: "jsonm", pp: "1", psc: "G"}; + content['start-index'] = "1"; + if(request.query.start){ + content['start-index'] = request.query.start; + } + if(request.query.tags){ + content.q = request.query.tags; + } + if(request.query.userid){ + content.uname = request.query.userid; + } + if(request.query.userids){ + content.ids = request.query.userids; + } + if(request.query.lang){ + content.hl = request.query.lang; + } + if(request.count){ + content['max-results'] = request.count; + }else{ + content['max-results'] = "20"; + } + + //Linking this up to Picasa is a JOY! + var self = this; + var handle = null; + var myHandler = function(data){ + if(handle !== null){ + dojo.disconnect(handle); + } + + //Process the items... + fetchHandler(self._processPicasaData(data), request); + }; + var getArgs = { + url: this._picasaUrl, + // preventCache: true, + content: content, + callbackParamName: 'callback', + handle: myHandler + }; + var deferred = dojo.io.script.get(getArgs); + + deferred.addErrback(function(error){ + dojo.disconnect(handle); + errorHandler(error, request); + }); + }, + + _processPicasaData: function(data){ + var items = []; + if(data.feed){ + items = data.feed.entry; + //Add on the store ref so that isItem can work. + for(var i = 0; i < items.length; i++){ + var item = 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(/&/gm, "&").replace(/</gm, "<").replace(/>/gm, ">").replace(/"/gm, "\""); + str = str.replace(/'/gm, "'"); + return str; + } +}); +dojo.extend(dojox.data.PicasaStore,dojo.data.util.simpleFetch); + +} |