/** * Picasa Webalbum Integration jQuery plugin * This library was inspired aon pwa by Dieter Raber * @name jquery.pwi.js * @author Jeroen Diderik - http://www.multiprof.nl/ * @revision 1.1.13 * @date November 02, 2009 * @copyright (c) 2009 Jeroen Diderik(www.multiprof.nl) * @license Creative Commons Attribution-Share Alike 3.0 Netherlands License - http://creativecommons.org/licenses/by-sa/3.0/nl/ * @Visit http://pwi.googlecode.com/ for more informations, duscussions etc about this library */ (function ($) { var elem, opts = {}; $.fn.pwi = function (opts) { var $self, settings = {}; opts = $.extend({}, $.fn.pwi.defaults, opts); elem = this; function _initialize() { settings = opts; ts = new Date().getTime(); settings.id = ts; $self = $("
").appendTo(elem); $self.addClass('pwi_container'); _start(); return false; } function _start() { if (settings.username === '') { alert('Make sure you specify at least your username.' + '\n' + 'See pwi.googlecode.com for more info'); return; } switch (settings.mode) { case 'latest': getLatest(); break; case 'album': getAlbum(); break; case 'keyword': getAlbum(); break; default: getAlbums(); break; } } function formatDate($dt) { var $today = new Date(Number($dt)), $year = $today.getUTCFullYear(); if ($year < 1000) { $year += 1900; } return (settings.months[($today.getUTCMonth())] + " " + $today.getUTCDate() + ", " + $year); } function formatDateTime($dt) { var $today = new Date(Number($dt)); $year = $today.getUTCFullYear(); if ($year < 1000) { $year += 1900; } if($today == "Invalid Date"){ return $dt; }else{ return ($today.getUTCDate() + "-" + ($today.getUTCMonth() + 1) + "-" + $year + " " + $today.getUTCHours() + ":" + ($today.getUTCMinutes() < 10 ? "0" + $today.getUTCMinutes() : $today.getUTCMinutes())); } } function photo(photo){ var $html, $dt, $d, $img_base = photo.content.src, $id_base = photo.gphoto$id.$t, $c = (photo.summary ? photo.summary.$t : ""); if(settings.showPhotoDate){ if( photo.exif$tags.exif$time ){ $dt = formatDateTime(photo.exif$tags.exif$time.$t); }else if( photo.gphoto$timestamp ){ $dt = formatDateTime(photo.gphoto$timestamp.$t); }else{ $dt = formatDateTime(photo.published.$t); } } $d = $dt + " " + $c.replace(new RegExp("'", "g"), "'"); $html = $("
"); $html.append(""); if(settings.showPhotoDownload){$c += "download";} if (settings.showPhotoCaption){ $html.append("
" + $c);} return $html; } function albums(j) { var $scAlbums = $("
"), i=0; while(i < settings.albumMaxResults && i< j.feed.entry.length){ var $id_base = j.feed.entry[i].gphoto$name.$t, $album_date = formatDate(j.feed.entry[i].gphoto$timestamp.$t), $thumb = j.feed.entry[i].media$group.media$thumbnail[0].url.replace(new RegExp("/s160-c/", "g"), "/"); if ($.inArray($id_base, settings.albums) > -1 || settings.albums.length === 0) { $scAlbum = $("
"); $scAlbum.bind('click.pwi', $id_base, function(e){ e.stopPropagation(); settings.page = 1; settings.album = e.data; if(typeof(settings.onclickAlbumThumb) === "function"){ settings.onclickAlbumThumb(e, settings); return false; }else{ getAlbum(); return false; } }); $scAlbum.append(""); settings.showAlbumTitles ? $scAlbum.append("
" + j.feed.entry[i].title.$t + "
" + (settings.showAlbumdate ? $album_date : "") + (settings.showAlbumPhotoCount ? "    " + j.feed.entry[i].gphoto$numphotos.$t + " " + settings.labels.photos : "")) : false; $scAlbums.append($scAlbum); } i++; } $scAlbums.append("
"); settings.albumstore = j; show(false, $scAlbums); } function album(j) { var $scPhotos, $scPhotosDesc, $np = j.feed.openSearch$totalResults.$t, $loc = j.feed.gphoto$location === undefined ? "" : j.feed.gphoto$location.$t, $ad = j.feed.subtitle === undefined ? "" : j.feed.subtitle.$t, $album_date = formatDate(j.feed.gphoto$timestamp === undefined ? '' : j.feed.gphoto$timestamp.$t), $item_plural = ($np == "1") ? false : true; settings.albumTitle = (j.feed.title === "undefined" || settings.albumTitle.length > 0) ? settings.albumTitle : j.feed.title.$t; $scPhotos = $("
"); $scPhotosDesc = $("
"); if (settings.mode != 'album') { var tmp = $("").bind('click.pwi', function (e) { e.stopPropagation(); getAlbums(); return false; }); $scPhotosDesc.append(tmp); } if (settings.showAlbumDescription) { $scPhotosDesc.append("
" + settings.albumTitle + "
"); $scPhotosDesc.append("
" + $np + " " + ($item_plural ? settings.labels.photos : settings.labels.photo) + (settings.showAlbumdate ? ", " + $album_date : "") + (settings.showAlbumLocation && $loc ? ", " + $loc : "") + "
"); $scPhotosDesc.append("
" + $ad + "
"); if (settings.showSlideshowLink) { if(settings.mode === 'keyword'){ //alert("currently not supported"); }else{ $scPhotosDesc.append(""); } } } $scPhotos.append($scPhotosDesc); if ($np > settings.maxResults) { $pageCount = ($np / settings.maxResults); var $ppage = $("
").text(settings.labels.prev), $npage = $("
").text(settings.labels.next), $navRow = $("
"); if (settings.page > 1) { $ppage.addClass('link').bind('click.pwi', function (e) { e.stopPropagation(); settings.page = (parseInt(settings.page) - 1); getAlbum(); return false; }); } $navRow.append($ppage); for (var p = 1; p < $pageCount + 1; p++) { if (p == settings.page) { tmp = "
" + p + "
"; } else { tmp = $("
" + p + "
").bind('click.pwi', p, function (e) { e.stopPropagation(); settings.page = e.data; getAlbum(); return false }); } $navRow.append(tmp); } if (settings.page < $pageCount) { $npage.addClass('link').bind('click.pwi', function (e) { e.stopPropagation(); settings.page = (parseInt(settings.page) + 1); getAlbum(); return false }); } $navRow.append($npage); $scPhotos.append($navRow); } var i = ((settings.page-1)*settings.maxResults); while(i < (settings.maxResults*settings.page) && i < $np) { var $scPhoto = photo(j.feed.entry[i]); $scPhotos.append($scPhoto); i++; } $scPhotos.append($navRow); $scPhotos.append("
"); //settings.photostore = $scPhotos; settings.photostore[settings.album] = j; var $s = $(".pwi_photo", $scPhotos).css(settings.thumbCss); if (typeof(settings.popupExt) === "function") { settings.popupExt($s.find("a[rel='lb-" + settings.username + "']")); } else if (typeof(settings.onclickThumb) === "function") { $s.find("a[rel='lb-" + settings.username + "']").bind('click.pwi', clickThumb); } else if (typeof(settings.onclickThumb) != "function" && $.slimbox) { $s.find("a[rel='lb-" + settings.username + "']").slimbox(settings.slimbox_config); } show(false, $scPhotos); } function latest(j) { var $scPhotos = $("
"), $len = j.feed ? j.feed.entry.length : 0, i = 0; while (i < settings.maxResults && i < $len) { var $scPhoto = photo(j.feed.entry[i]); $scPhotos.append($scPhoto); i++; } $scPhotos.append("
"); var $s = $("div.pwi_photo", $scPhotos).css(settings.thumbCss); if (typeof(settings.popupExt) === "function") { settings.popupExt($s.find("a[rel='lb-" + settings.username + "']")); } else if (typeof(settings.onclickThumb) === "function") { $s.find("a[rel='lb-" + settings.username + "']").bind('click', clickThumb); } else if (typeof(settings.onclickThumb) != "function" && $.slimbox) { $s.find("a[rel='lb-" + settings.username + "']").slimbox(settings.slimbox_config); } show(false, $scPhotos); } function clickAlbumThumb(ref){ settings.onclickAlbumThumb(ref); return false; } function clickThumb() { settings.onclickThumb.call(this); return false; } function getAlbums() { if (settings.albumstore.feed) { albums(settings.albumstore); } else { show(true, ''); var $url = 'http://picasaweb.google.com/data/feed/api/user/' + settings.username + '?kind=album&access=' + settings.albumTypes + '&alt=json'; $.getJSON($url, 'callback=?', albums); } return $self; } function getAlbum() { if (settings.photostore[settings.album]) { album(settings.photostore[settings.album]); } else { var $si = ((settings.page - 1) * settings.maxResults) + 1; if(settings.mode === 'keyword'){ var $url = 'http://picasaweb.google.com/data/feed/api/user/' +settings.username + '?alt=json&kind=photo&tag=' + settings.keyword +'&max-results=' + settings.maxResults + '&start-index=' + $si +((settings.authKey != "") ? "&authkey=" + settings.authKey : ""); }else{ var $url = 'http://picasaweb.google.com/data/feed/api/user/' + settings.username + '/album/' + settings.album + '?kind=photo&alt=json' + ((settings.authKey != "") ? "&authkey=" + settings.authKey : ""); } show(true, ''); $.getJSON($url, 'callback=?', album); } return $self; } function getLatest() { show(true, ''); var $url = 'http://picasaweb.google.com/data/feed/api/user/' + settings.username + (settings.album != "" ? '/album/' + settings.album : '') + '?kind=photo&max-results='+settings.maxResults+'&alt=json&q=' + ((settings.authKey != "") ? "&authkey=" + settings.authKey : ""); $.getJSON($url, 'callback=?', latest); return $self; } function show(loading, data) { if (loading) { document.body.style.cursor = "wait"; //if ($.blockUI){ $self.block(settings.blockUIConfig);} } else { document.body.style.cursor = "default"; //if ($.blockUI){ $self.unblock(); } $self.html(data); } } _initialize(); } $.fn.pwi.defaults = { mode: 'albums', username: '', album: "", authKey: "", albums: [], albumCrop: 1, albumTitle: "", albumThumbSize: 160, albumMaxResults: 999, albumStartIndex: 1, albumTypes: "public", page: 1, photoSize: 800, maxResults: 50, thumbSize: 72, thumbCrop: 0, thumbCss: { 'margin': '5px' }, onclickThumb: "", onclickAlbumThumb: "", popupExt: "", showAlbumTitles: true, showAlbumdate: true, showAlbumPhotoCount: true, showAlbumDescription: true, showAlbumLocation: true, showSlideshowLink: true, showPhotoCaption: false, showPhotoDownload: true, showPhotoDate: true, labels: { photo: "photo", photos: "photos", albums: "Back to albums", slideshow: "Display slideshow", loading: "PWI fetching data...", page: "Page", prev: "Previous", next: "Next", devider: "|" }, months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], slimbox_config: { loop: false, overlayOpacity: 0.6, overlayFadeDuration: 400, resizeDuration: 400, resizeEasing: "swing", initialWidth: 250, initlaHeight: 250, imageFadeDuration: 400, captionAnimationDuration: 400, counterText: "{x}/{y}", closeKeys: [27, 88, 67, 70], prevKeys: [37, 80], nextKeys: [39, 83] }, blockUIConfig: { message: "
loading...
", css: "pwi_loader" }, albumstore: {}, photostore: {}, token: "" } })(jQuery);