/**
* 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 = $("" + settings.labels.albums + "
").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 = " ";
} else {
tmp = $("").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);