/*! * Yox Picasa plugin * http://yoxigen.com/yoxview/ * * Copyright (c) 2010 Yossi Kolesnicov * * Licensed under the MIT license. * http://www.opensource.org/licenses/mit-license.php * * Date: 13th November, 2010 * Version : 1.55 */ function yox_picasa() { var $ = jQuery; var picasaRegex = /http:\/\/picasaweb\.google\.\w+\/([^\/#\?]+)\/?([^\/#\?]+)?(\?([^#]*))?/ var self = this; this.getImagesData = function(options, callback) { var defaults = { url: "http://picasaweb.google.com/data/feed/api/", setThumbnail: true, setSingleAlbumThumbnails: true, setTitle: true, // Whether to add a header with user and/or album name before thumbnails alt: 'json', thumbsize: 64 }, picasaThumbnailSizes = [32, 48, 64, 72, 104, 144, 150, 160], picasaImgMaxSizes = [94, 110, 128, 200, 220, 288, 320, 400, 512, 576, 640, 720, 800, 912, 1024, 1152, 1280, 1440, 1600], fromDataUrl = {}; function getFeedUrl() { var feedUrl = datasourceOptions.url; if (datasourceOptions.user && datasourceOptions.user != "lh") { feedUrl += "user/" + datasourceOptions.user; if (datasourceOptions.album) feedUrl += "/album/" + datasourceOptions.album; } else feedUrl += "all"; return feedUrl; } function picasa_getMaxSize(size, sizesArray, roundSizeUp) { size = parseInt(size); for(var i=sizesArray.length - 1; i >= 0; i--) { var pSize = sizesArray[i]; if (size >= pSize) return roundSizeUp ? i < sizesArray.length - 1 ? sizesArray[i + 1] : pSize : pSize; } return size; } function getImagesDataFromJson(data, kind) { var entry = data.feed.entry; var isAlbum = kind === "album"; var imagesData = []; jQuery.each(data.feed.entry, function(i, image){ var imageTitle = isAlbum ? image.title.$t + " (" + image.gphoto$numphotos.$t + " images)" : image.summary.$t; if (!datasourceOptions.filter || imageTitle.match(datasourceOptions.filter)) { var mediaData = image.media$group.media$content[0]; var imageData = { thumbnailSrc : image.media$group.media$thumbnail[1].url, link: image.link[1].href, media: { src: mediaData.url, title: imageTitle, alt: imageTitle, width: mediaData.width, height: mediaData.height } }; if (isAlbum) imageData.data = { album: image.gphoto$name.$t }; imagesData.push(imageData); } }); if (fromDataUrl.filter) { var dataUrlObj = Yox.getUrlData(options.dataUrl); delete dataUrlObj.queryFields.filter; options.dataUrl = Yox.urlDataToPath(dataUrlObj); } if (options.dataSourceOptions && options.dataSourceOptions.filter) delete options.dataSourceOptions.filter; return imagesData; } if (options.dataUrl) { var urlMatch = options.dataUrl.match(picasaRegex); if (urlMatch && urlMatch.length > 1) { fromDataUrl.user = urlMatch[1]; if (urlMatch[2]) fromDataUrl.album = urlMatch[2] if (urlMatch[4]) $.extend(fromDataUrl, Yox.queryToJson(urlMatch[4])); } } var datasourceOptions = jQuery.extend({}, defaults, fromDataUrl, options.dataSourceOptions); if (datasourceOptions.user && !datasourceOptions.album && !datasourceOptions.q) datasourceOptions.thumbsize = 104; // Picasa web uses 'tags', while the API uses 'tag': if (datasourceOptions.tags) datasourceOptions.tag = datasourceOptions.tags; if (datasourceOptions.album == "") delete datasourceOptions.album; var screenSize = screen.width > screen.height ? screen.width : screen.height; var unknownSize = datasourceOptions.imgmax && $.inArray(datasourceOptions.imgmax, picasaImgMaxSizes) == -1 ? datasourceOptions.imgmax : null; // Save resources for smaller screens: if (!datasourceOptions.imgmax || unknownSize || screenSize < datasourceOptions.imgmax) datasourceOptions.imgmax = picasa_getMaxSize(unknownSize || screenSize, picasaImgMaxSizes, datasourceOptions.roundSizeUp); if (datasourceOptions.filter){ if (typeof datasourceOptions.filter === "string") datasourceOptions.filter = new RegExp(datasourceOptions.filter, "i"); } var feedUrl = getFeedUrl(datasourceOptions); var returnData = {}; if (options.onLoadBegin) options.onLoadBegin(); $.jsonp({ url: feedUrl, async: false, dataType: 'jsonp', data: datasourceOptions, callbackParameter: "callback", success: function(data) {console.log(data); if (!data.feed.entry || data.feed.entry.length == 0) { if (options.onNoData) options.onNoData(); return; } var kind = data.feed.entry[0].category[0].term.match(/.*#(.*)/)[1]; // album or photo if (kind === "album") $.extend(returnData, { title: data.feed.title.$t, createGroups: true }); returnData.images = getImagesDataFromJson(data, kind); if (data.feed.title) returnData.title = data.feed.title.$t; if (returnData.images.length > 0 && datasourceOptions.setThumbnail && !datasourceOptions.setSingleAlbumThumbnails) { $.extend(returnData, { isGroup: true, link: data.feed.link[1].href, thumbnailSrc: data.feed.icon.$t, title: data.feed.title.$t }); } if (callback) callback(returnData); if (options.onLoadComplete) options.onLoadComplete(); }, error : function(xOptions, textStatus){ if (options.onLoadError) options.onLoadError("Picasa plugin encountered an error while retrieving data"); } }); } }