Subversion Repositories Applications.papyrus

Rev

Blame | Last modification | View Log | RSS feed

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(/&amp;/gm, "&").replace(/&lt;/gm, "<").replace(/&gt;/gm, ">").replace(/&quot;/gm, "\"");
                str = str.replace(/&#39;/gm, "'"); 
                return str;
        }
});
dojo.extend(dojox.data.PicasaStore,dojo.data.util.simpleFetch);                                                                           

}