Team:TU Munich/jquery.EmbedPicasaGallery.js

From 2011.igem.org

/**************************************************************************

* Name:   EmbedPicasaGallery
* Author: Tobias Oetiker <tobi@oetiker.ch>
* Demo:   http://tobi.oetiker.ch/photo/
* $Id: jquery.EmbedPicasaGallery.js 474 2011-06-16 09:02:45Z oetiker $
**************************************************************************
Description:

This little script asks picasa web for a list of albums and for a list
of pictures in the album. It then emits a series of <div class="pic-thumb"/>
elements containing thumbnail images. The divs are inserted inside the element
marked with a particular id. Clicking on an album will display thumbnails of the
images in the album and clicking on a thumbnail will show the image itself
using slimbox.

The script itself uses jQuery (http://www.jquery.org) and slimbox2
(http://www.digitalia.be/software/slimbox2) to work. So you have to load
these two guys before loading the gallery script. You can load them in the
header or the body of the document, this does not matter.

 <script type="text/javascript" src="js/jquery.js"></script>
 <link rel="stylesheet" href="css/slimbox2.css" type="text/css" media="screen" />
 <script type="text/javascript" src="slimbox2.js"></script>
 <script type="text/javascript" src="js/jquery.EmbedPicasaGallery.js"></script>
Once loaded, call the picasaGallery function. This activates the
code. With the id argument you tell it, where to put the gallery.
 <script type="text/javascript">
 jQuery(document).ready(function() {
 jQuery("#images").EmbedPicasaGallery('oetiker',{
     matcher:            /./,         // string or regexp to match album title
     size:               72,        // thumbnail size (32, 48, 64, 72, 144, 160)
     msg_loading_list :  'Loading album list from PicasaWeb',
     msg_back :          'back',
     msg_more :          'more',
     authkey :           'optional-picasa-authkey',
     albumid :           'go-directly-to-this-album-ignore-matcher',
     auto_open:          false, //opens the first album
     album_title_tag:    '<h2/>',
     hide_back:          false, //hide the back button
     thumb_id_prefix:    'pThumb_',
     show_more:      null,       // show only the first x images when the album gets opened
     loading_animation: 'css/loading.gif',
     thumb_finalizer:    function(){var $a = jQuery(this); ... use this to do something to the anchor AFTER slimbox got there },
     thumb_tuner:        function($img,entry,i){ ... $img is the img of the thumbnail, entry is the picasa image info ...}
     link_mapper: function(el){  // see http://code.google.com/p/slimbox/wiki/jQueryAPI#The_linkMapper_function
           return [
                    el.href,
                    '<a href="'+el.href+'">'+el.title+'</a>'
                  ]
           }
  });
 });
 </script>
Finally inside the document, add a div tag with the id set to the name
chosen above.

                                                                                                                                                                    • /

(function($) {

   // setup a namespace for us
   var nsp = 'EmbedPicasaGallery', authkey;
   // Private Variables and Functions in the _ object
   // note that this will refer to _ unless you
   // call using the call or apply methods
   // Public Variables and Methods
   $[nsp] = {
       defaultOptions: {
           matcher : RegExp('.+'),
           size    : 72,
           msg_loading_list : 'Loading album list from PicasaWeb',
           msg_back : 'back',
           msg_more : 'more',
           album_title_tag: '<h2/>',
           auto_open: false,
           thumb_id_prefix: 'pThumb_',
           thumb_tuner: null,
           thumb_finalizer: null,
           loading_animation: null,
           show_more: null,
           hide_back: false,
           link_mapper: function(el){
                   return [
                       el.href,
                       '<a href="'+el.href+'">'+el.title+'</a>'
                   ]
               }
       } 
   };
   $.fn[nsp] = function(user,opts) {
       var localOpts,
           Cache = {};
       localOpts = $.extend( 
           {}, // start with an empty map
           $[nsp].defaultOptions, // add defaults
           opts // add options
       );
       function showOverview() {
           var $this,
               meta_opts,
               albumCount,
               $album_list,
               authkey = ;
           if ( Cache.__overview ){
                Cache.__overview.show();
                return;
           }
           $this = $(this);
           $this.empty();
           meta_opts = localOpts;
           if ($.meta){
               meta_opts = $.extend({}, localOpts, $this.data());
           }
           albumCount = 0;
           $album_list = $('<div/>')
               .addClass('album-list')
               .css('position','relative')
               .css('overflow','hidden')
               .append($('<div/>').text(meta_opts.msg_loading_list));


           function appendImage(i,item){
               var title,$div,$img;
               title = item.media$group.media$title.$t;
               if (title.match(meta_opts.matcher)){
                   albumCount++;
                   $img = $('<img/>')
                       .attr('title',title)
                       .attr('src',item.media$group.media$thumbnail[0].url)
                   $div = $('<div/>')
                       .addClass('album-cover')
                       .css({
                           'float': 'left',
                           marginRight: '10px',
                           marginBottom: '10px'
                       })
                       .click(function () {
                          $album_list.hide();
                          showAlbum($this,meta_opts,item.gphoto$id.$t,title,item.gphoto$numphotos.$t);
                       })
                       .hover(
                           function () { $(this).css("cursor","pointer")},
                           function () { $(this).css("cursor","default")}
                       )
                       .append( $img )
                       .append(
                           $('<div/>')
                           .addClass('album-title')
                           .css({
                               'font-size': '10px'
                           })
                           .text(title)
                           .width( meta_opts.size )
                       )                    
                   $album_list.append($div);
               };
           }
           
           function renderAlbumList(data){
               var $albums,maxHeight=0;
               $album_list.empty();
       		if (data.feed && data.feed.entry){
   	            $.each(data.feed.entry,appendImage);
       		} else {
         		    $this.text('Warning: No picasa albums found for user ' + user);

}

               Cache.__overview = $album_list;
               $albums = $album_list.children();


               if (meta_opts.auto_open){
                   $albums.eq(0).click();
                   return;
               }
               $('.album-title',$album_list)
               .each(function(){                        
                    var h = $(this).outerHeight();
                    if (h > maxHeight){
                       maxHeight = h
                    }
               })
               .each(function(){
                   $(this).height(maxHeight)
               });
           }


           if (meta_opts.authkey){
               authkey = '&authkey=' + meta_opts.authkey;
           }

   	    if (meta_opts.albumid) {
      	       showAlbum($this,meta_opts,meta_opts.albumid)
   	    }

else {

               $this.prepend($album_list);
               $.getJSON('http://picasaweb.google.com/data/feed/api/user/' 
                   + user + '?kind=album&access=visible' + authkey 
                   + '&alt=json-in-script&thumbsize=' + meta_opts.size + 'c&callback=?',
                   renderAlbumList
              );

}

       };
       function showAlbum($this,meta_opts,album,title,photoCount){                        
           if ( Cache[album] ){
              Cache[album].show();
              return;
           };
           var i,$album,albumPics=[],$picDiv;
           $album = $('<div/>').addClass('album')
               .css('position','relative')
               .css('overflow','hidden');
       
           if (title){
               $album.append($(meta_opts.album_title_tag).text(title))
           }
           function makeDiv(){            
              var $div = $('<div/>')
                  .css({
                       'float': 'left',
                       marginRight: '10px',
                       marginBottom: '10px',
                       width: meta_opts.size+'px',
                       height: meta_opts.size+'px'
                   });
              if (meta_opts.loading_animation){
                  $div.css('background','url(' + meta_opts.loading_animation + ') no-repeat center center');            
              }
              return $div;
           }
           function makeButton(text){
               return $("<div/>")                    
                   .addClass("pic-thumb")
                   .width(meta_opts.size)
                   .height(meta_opts.size)
                   .css({borderWidth: '0px',
                        'float' : 'left',
                        marginRight: '10px',
                        marginBottom: '10px',
                        cursor: 'pointer'
                    })
                   .append($("<div/>")
                       .html('
'+text) .css({'borderStyle':'outset', 'borderWidth':'1px', 'textAlign'  :'center', 'width'  : (meta_opts.size - 2) + 'px', 'height'  : (meta_opts.size - 2) + 'px' }) ); }
           if (Cache.__overview && !meta_opts.hide_back){            
               $album.append(makeButton(meta_opts.msg_back)
                   .click(function(){$album.hide();showOverview()})
               );
           }
           $this.prepend($album);
           
           if (photoCount){
               for (i=0;i<photoCount && (!meta_opts.show_more || i<meta_opts.show_more);i++) {
                   $picDiv = makeDiv();
                   $album.append($picDiv);
                   albumPics.push($picDiv);
               }
           }
           function makeImage(i,item){
              var title = item.media$group.media$description.$t || item.media$group.media$title.$t;  
              var $div = albumPics[i] || makeDiv();
              var $img = $('<img/>')
              	   .css('borderWidth','0px')

.hide()

                  .load(function(){                   
                      if (meta_opts.thumb_tuner){
                          meta_opts.thumb_tuner(this,item);
                      }

$img.show();

                  });



              var thumbs = item.media$group.media$thumbnail;

var gotOne = false;

              for (var i = 0; i<thumbs.length;i++){
                   if (thumbs[i].width == meta_opts.size && thumbs[i].height == meta_opts.size){
                       $img.attr("src", thumbs[i].url);

gotOne = true;

                       break;
                   }
              }

if (!gotOne){ $img.attr("alt","Sorry, no matching thumbnail found."); }

              var $a = $("<a/>")
                  .attr("href",item.content.src)
                  .attr("title",title)
                  .append($img);
              $div
                  .attr("id", meta_opts.thumb_id_prefix + item.gphoto$id.$t )
                  .append($a);


              return $div; 
           }
           function renderAlbum(data){
               var images = data.feed.entry;
               var hiddenImages = [];
               for (var i=0;i<images.length;i++){
                   var $div = makeImage(i,images[i]);
                   if (!meta_opts.show_more || i < meta_opts.show_more){
                       $div.show();
                   }
                   else {
                       $div.hide();
                       hiddenImages.push($div);
                   }
                   $album.append($div);
                   if (meta_opts.show_more && i == meta_opts.show_more){
                       var $moreButton = makeButton(meta_opts.msg_more);
                       $album.append($moreButton
                           .click(function(){
                               var start = 0;
                               jQuery.each(hiddenImages,function(i,$img){
                                   window
                                       .setTimeout(
                                           function(){
                                               $img.fadeIn('fast');
                                           },
                                           50*(start++)
                                       );
                               });
                               $moreButton.hide();
                           })
                       );                        
                   }            
               }
               if ($.fn.slimbox){
                   $('a',$album).slimbox({},meta_opts.link_mapper);
               }
               if (meta_opts.thumb_callback){
                   $('a',$album).each(meta_opts.thumb_callback);
               }
               Cache[album] = $album;
           }
           authkey = ;
           if (meta_opts.authkey){
              authkey = '&authkey=' + meta_opts.authkey;
           }
           $.getJSON('http://picasaweb.google.com/data/feed/api/user/' 
               + user + '/albumid/' 
               + album + '?kind=photo&access=visible' + authkey + '&alt=json-in-script&thumbsize='+meta_opts.size+'c&imgmax=800&callback=?',
               renderAlbum
           );
       };
       return this.each(showOverview);
   };

})(jQuery);