You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
269 lines
7.8 KiB
269 lines
7.8 KiB
/*!
|
|
* Yox Flickr plugin
|
|
* http://yoxigen.com/yoxview/
|
|
*
|
|
* Copyright (c) 2010 Yossi Kolesnicov
|
|
*
|
|
* Licensed under the MIT license.
|
|
* http://www.opensource.org/licenses/mit-license.php
|
|
*
|
|
* Date: 17th July, 2010
|
|
* Version : 1.6
|
|
*/
|
|
function yox_flickr()
|
|
{
|
|
var $ = jQuery,
|
|
flickrUrl = "http://www.flickr.com/",
|
|
flickrApiUrl = "http://api.flickr.com/services/rest/",
|
|
yoxviewFlickrApikey = "cd6c91f9721f34ead20e6ebe03dd5871",
|
|
flickrUserIdRegex = /\d+@N\d+/,
|
|
flickrUrlRegex = /http:\/\/(?:www\.)?flickr\.com\/(\w+)\/(?:([^\/]+)\/(?:(\w+)\/?(?:([^\/]+)\/?)?)?)?(?:\?(.*))?/,
|
|
self = this,
|
|
fixedOptions = {
|
|
api_key: yoxviewFlickrApikey,
|
|
format: 'json'
|
|
};
|
|
|
|
this.getImagesData = function(options, callback)
|
|
{
|
|
var defaults = {
|
|
imageSize: "medium", // medium/large/original, for large, your images in Flickr must be 1280 in width or more. For original, you must allow originals to be downloaded
|
|
thumbsize: "smallSquare",
|
|
setThumbnail: true,
|
|
setSinglePhotosetThumbnails: true,
|
|
setTitle: true,
|
|
method: 'flickr.photosets.getList',
|
|
extras: 'description'
|
|
};
|
|
|
|
var requireLookup = true;
|
|
var lookupData = {
|
|
method: "flickr.urls.lookupUser",
|
|
onData: function(data)
|
|
{
|
|
return {
|
|
user_id: data.user.id,
|
|
username: data.user.username._content
|
|
};
|
|
}
|
|
};
|
|
|
|
var fromDataUrl = {};
|
|
|
|
if (options.dataUrl)
|
|
{
|
|
var urlMatch = options.dataUrl.match(flickrUrlRegex);
|
|
var queryData;
|
|
if (urlMatch[5])
|
|
{
|
|
queryData = Yox.queryToJson(urlMatch[5]);
|
|
$.extend(fromDataUrl, queryData);
|
|
}
|
|
if (urlMatch && urlMatch.length > 1)
|
|
{
|
|
if (urlMatch[1] == "search")
|
|
{
|
|
fromDataUrl.method = "flickr.photos.search";
|
|
fromDataUrl.text = queryData.q;
|
|
if (queryData.w)
|
|
{
|
|
queryData.w = queryData.w.replace("%40", "@");
|
|
if (queryData.w.match(flickrUserIdRegex))
|
|
fromDataUrl.user_id = queryData.w;
|
|
}
|
|
if (!queryData || !queryData.sort)
|
|
fromDataUrl.sort = "relevance";
|
|
|
|
requireLookup = false;
|
|
}
|
|
else
|
|
{
|
|
switch(urlMatch[3])
|
|
{
|
|
case undefined:
|
|
fromDataUrl.method = "flickr.people.getPublicPhotos";
|
|
break;
|
|
case "sets":
|
|
$.extend(fromDataUrl, {
|
|
method: urlMatch[4] || options.dataSourceOptions.photoset_id ? "flickr.photosets.getPhotos" : "flickr.photosets.getList",
|
|
photoset_id: urlMatch[4]
|
|
});
|
|
break;
|
|
case "galleries":
|
|
$.extend(fromDataUrl, {
|
|
method: urlMatch[4] ? "flickr.galleries.getPhotos" : "flickr.galleries.getList",
|
|
gallery_id: urlMatch[4]
|
|
});
|
|
if (urlMatch[4])
|
|
{
|
|
requireLookup = true;
|
|
lookupData = {
|
|
method: "flickr.urls.lookupGallery",
|
|
onData: function(data)
|
|
{
|
|
return {
|
|
gallery_id: data.gallery.id,
|
|
title: data.gallery.title
|
|
};
|
|
}
|
|
};
|
|
}
|
|
break;
|
|
case "collections":
|
|
$.extend(fromDataUrl, {
|
|
method: "flickr.collections.getTree",
|
|
collection_id: urlMatch[4]
|
|
});
|
|
break;
|
|
default:
|
|
fromDataUrl.method = "flickr.photos.search";
|
|
break;
|
|
}
|
|
$.extend(fromDataUrl, {
|
|
username: urlMatch[2],
|
|
type: urlMatch[3]
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
var datasourceOptions = jQuery.extend({}, defaults, fromDataUrl, options.dataSourceOptions, fixedOptions);
|
|
|
|
datasourceOptions.media = "photos";
|
|
if (datasourceOptions.user && datasourceOptions.photoset_id)
|
|
datasourceOptions.method = "flickr.photosets.getPhotos";
|
|
|
|
var screenSize = screen.width > screen.height ? screen.width : screen.height;
|
|
|
|
// Save resources for smaller screens:
|
|
if (!datasourceOptions.imageSize || (screenSize.width <= 800 && datasourceOptions.imageSize != "medium"))
|
|
datasourceOptions.imageSize = "medium";
|
|
|
|
if (requireLookup)
|
|
{
|
|
$.jsonp({
|
|
url: flickrApiUrl,
|
|
async: false,
|
|
dataType: 'jsonp',
|
|
data: $.extend({ url: options.dataUrl, method: lookupData.method }, fixedOptions),
|
|
callbackParameter: "jsoncallback",
|
|
success: function(data)
|
|
{
|
|
$.extend(datasourceOptions, lookupData.onData(data));
|
|
getData();
|
|
}
|
|
});
|
|
}
|
|
else
|
|
getData();
|
|
|
|
function getData()
|
|
{
|
|
var returnData = {};
|
|
|
|
if (options.onLoadBegin)
|
|
options.onLoadBegin();
|
|
|
|
$.jsonp({
|
|
url: flickrApiUrl,
|
|
async: false,
|
|
dataType: 'jsonp',
|
|
data: datasourceOptions,
|
|
callbackParameter: "jsoncallback",
|
|
success: function(data)
|
|
{console.log(data);
|
|
returnData.images = self.getImagesDataFromJson(data, datasourceOptions);
|
|
|
|
if (data.photosets || data.collections)
|
|
$.extend(returnData, {
|
|
createGroups: true
|
|
});
|
|
|
|
if (returnData.images.length > 0 && ((datasourceOptions.setThumbnail && !datasourceOptions.setSinglePhotosetThumbnails) || options.isSingleLink))
|
|
{
|
|
$.extend(returnData, {
|
|
isGroup: true,
|
|
link: getPhotosetUrl(data.photoset.owner, data.photoset.id),
|
|
thumbnailSrc: options.isSingleLink ? undefined : getImageUrl(data.photoset.photo[0], flickrImageSizes[datasourceOptions.thumbsize]),
|
|
title: "None"
|
|
});
|
|
}
|
|
|
|
if (callback)
|
|
callback(returnData);
|
|
|
|
if (options.onLoadComplete)
|
|
options.onLoadComplete();
|
|
},
|
|
error : function(xOptions, textStatus){
|
|
if (options.onLoadError)
|
|
options.onLoadError("Flickr plugin encountered an error while retrieving data");
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
var flickrImageSizes = {
|
|
smallSquare : "_s", // 75x75
|
|
thumbnail : "_t", // 100px
|
|
small : "_m", // 240px
|
|
medium : "", // 500px
|
|
large : "_b", // 1024px
|
|
original : "_o"
|
|
};
|
|
function getImageUrl(photoData, size)
|
|
{
|
|
return "http://farm" + photoData.farm + ".static.flickr.com/" + photoData.server + "/" + (photoData.primary || photoData.id) + "_" + photoData.secret + size + ".jpg";
|
|
}
|
|
function getPhotosetUrl(userid, photosetId)
|
|
{
|
|
return prepareUrl(flickrUrl + "photos/" + userid + "/sets/" + photosetId + "/");
|
|
}
|
|
// makes sure a string can be used as a Flickr url
|
|
function prepareUrl(url)
|
|
{
|
|
return url.replace(/\s/g, "_");
|
|
}
|
|
this.getImagesDataFromJson = function(data, datasourceOptions)
|
|
{
|
|
var isPhotos = data.photoset || data.photos;
|
|
var photos;
|
|
if (isPhotos)
|
|
photos = data.photoset ? data.photoset.photo : data.photos.photo;
|
|
else if (data.photosets)
|
|
photos = data.photosets.photoset;
|
|
else if (data.collections)
|
|
photos = data.collections.collection[0].set;
|
|
|
|
var imagesData = [];
|
|
var inSet = data.photoset ? "/in/set-" + data.photoset.id : "";
|
|
|
|
// Photos:
|
|
if (photos)
|
|
{
|
|
var thumbSuffix = flickrImageSizes[datasourceOptions.thumbsize];
|
|
var imageSuffix = flickrImageSizes[datasourceOptions.imageSize];
|
|
|
|
jQuery.each(photos, function(i, photo){
|
|
var imageData = {
|
|
thumbnailSrc : getImageUrl(photo, thumbSuffix),
|
|
link: prepareUrl(flickrUrl + "photos/" + (photo.owner || datasourceOptions.user_id) + "/" + photo.id + inSet),
|
|
media: {
|
|
src: getImageUrl(photo, imageSuffix),
|
|
title: isPhotos ? photo.title : photo.title._content + (!isPhotos ? " (" + photo.photos + " images)" : ""),
|
|
alt: photo.title._content || photo.title,
|
|
description: photo.description ? photo.description._content : undefined
|
|
}
|
|
};
|
|
|
|
if (!isPhotos)
|
|
imageData.data = { photoset_id: photo.id };
|
|
|
|
imagesData.push(imageData);
|
|
});
|
|
}
|
|
|
|
return imagesData;
|
|
}
|
|
} |