/** * Galleria Picasa Plugin 2012-04-04 * http://galleria.io * * Licensed under the MIT license * https://raw.github.com/aino/galleria/master/LICENSE * */ (function($) { /*global jQuery, Galleria, window */ Galleria.requires(1.25, 'The Picasa Plugin requires Galleria version 1.2.5 or later.'); // The script path var PATH = Galleria.utils.getScriptPath(); /** @class @constructor @example var picasa = new Galleria.Picasa(); @author http://aino.se @requires jQuery @requires Galleria @returns Instance */ Galleria.Picasa = function() { this.options = { max: 30, // photos to return imageSize: 'medium', // photo size ( thumb,small,medium,big,original ) or a number thumbSize: 'thumb', // thumbnail size ( thumb,small,medium,big,original ) or a number complete: function(){} // callback to be called inside the Galleria.prototype.load }; }; Galleria.Picasa.prototype = { // bring back the constructor reference constructor: Galleria.Picasa, /** Search for anything at Picasa @param {String} phrase The string to search for @param {Function} [callback] The callback to be called when the data is ready @returns Instance */ search: function( phrase, callback ) { return this._call( 'search', 'all', { q: phrase }, callback ); }, /** Get a user's public photos @param {String} username The username to fetch photos from @param {Function} [callback] The callback to be called when the data is ready @returns Instance */ user: function( username, callback ) { return this._call( 'user', 'user/' + username, callback ); }, /** Get photos from an album @param {String} username The username that owns the album @param {String} album The album ID @param {Function} [callback] The callback to be called when the data is ready @returns Instance */ useralbum: function( username, album, callback ) { return this._call( 'useralbum', 'user/' + username + '/album/' + album, callback ); }, /** Set picasa options @param {Object} options The options object to blend @returns Instance */ setOptions: function( options ) { $.extend(this.options, options); return this; }, // call Picasa _call: function( type, url, params, callback ) { url = 'https://picasaweb.google.com/data/feed/api/' + url + '?'; if (typeof params == 'function') { callback = params; params = {}; } var self = this; params = $.extend({ 'kind': 'photo', 'access': 'public', 'max-results': this.options.max, 'thumbsize': this._getSizes().join(','), 'alt': 'json-in-script', 'callback': '?' }, params ); $.each(params, function( key, value ) { url += '&' + key + '=' + value; }); // since Picasa throws 404 when the call is malformed, we must set a timeout here: var data = false; Galleria.utils.wait({ until: function() { return data; }, success: function() { self._parse.call( self, data.feed.entry, callback ); }, error: function() { var msg = ''; if ( type == 'user' ) { msg = 'user not found.'; } else if ( type == 'useralbum' ) { msg = 'album or user not found.'; } Galleria.raise('Picasa request failed' + (msg ? ': ' + msg : '.')); }, timeout: 5000 }); $.getJSON( url, function( result ) { data = result; }); return self; }, // parse image sizes and return an array of three _getSizes: function() { var self = this, norm = { small: '72c', thumb: '104u', medium: '640u', big: '1024u', original: '1600u' }, op = self.options, t = {}, n, sz = [32,48,64,72,94,104,110,128,144,150,160,200,220,288,320,400,512,576,640,720,800,912,1024,1152,1280,1440,1600]; $(['thumbSize', 'imageSize']).each(function() { if( op[this] in norm ) { t[this] = norm[ op[this] ]; } else { n = Galleria.utils.parseValue( op[this] ); if (n > 1600) { n = 1600; } else { $.each( sz, function(i) { if ( n < this ) { n = sz[i-1]; return false; } }); } t[this] = n; } }); return [ t.thumbSize, t.imageSize, '1280u']; }, // parse the result and call the callback with the galleria-ready data array _parse: function( data, callback ) { var self = this, gallery = [], img; $.each( data, function() { img = this.media$group.media$thumbnail; gallery.push({ thumb: img[0].url, image: img[1].url, big: img[2].url, title: this.summary.$t }); }); callback.call( this, gallery ); } }; /** Galleria modifications We fake-extend the load prototype to make Picasa integration as simple as possible */ // save the old prototype in a local variable var load = Galleria.prototype.load; // fake-extend the load prototype using the picasa data Galleria.prototype.load = function() { // pass if no data is provided or picasa option not found if ( arguments.length || typeof this._options.picasa !== 'string' ) { load.apply( this, Galleria.utils.array( arguments ) ); return; } // define some local vars var self = this, args = Galleria.utils.array( arguments ), picasa = this._options.picasa.split(':'), p, opts = $.extend({}, self._options.picasaOptions), loader = typeof opts.loader !== 'undefined' ? opts.loader : $('
').css({ width: 48, height: 48, opacity: 0.7, background:'#000 url('+PATH+'loader.gif) no-repeat 50% 50%' }); if ( picasa.length ) { // validate the method if ( typeof Galleria.Picasa.prototype[ picasa[0] ] !== 'function' ) { Galleria.raise( picasa[0] + ' method not found in Picasa plugin' ); return load.apply( this, args ); } // validate the argument if ( !picasa[1] ) { Galleria.raise( 'No picasa argument found' ); return load.apply( this, args ); } // apply the preloader window.setTimeout(function() { self.$( 'target' ).append( loader ); },100); // create the instance p = new Galleria.Picasa(); // apply Flickr options if ( typeof self._options.picasaOptions === 'object' ) { p.setOptions( self._options.picasaOptions ); } // call the picasa method and trigger the DATA event var arg = []; if ( picasa[0] == 'useralbum' ) { arg = picasa[1].split('/'); if (arg.length != 2) { Galleria.raise( 'Picasa useralbum not correctly formatted (should be [user]/[album])'); return; } } else { arg.push( picasa[1] ); } arg.push(function(data) { self._data = data; loader.remove(); self.trigger( Galleria.DATA ); p.options.complete.call(p, data); }); p[ picasa[0] ].apply( p, arg ); } else { // if flickr array not found, pass load.apply( this, args ); } }; }( jQuery ) );