New file |
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); |
|
} |