// original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
function in_array(needle, haystack, strict) {
    var found = false, key, strict = !!strict;
 
    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            found = true;
            break;
        }
    }
 
    return found;
}

(function($) {
	// setup a namespace for us
	var nsp = 'EmbedPicasaGallery';
	
	// Public Variables and Methods
	$[nsp] = {
		defaultOptions: {
			url : [],
			img_url : [],
			size : 72,
			msg_loading_list : 'Loading list from PicasaWeb',
			msg_loading_album : 'Loading album from PicasaWeb',
			msg_back : 'Back',
			msg_source : 'View source',
			album_title_tag: '<h2/>',
			slimboxparam: {} // @author ajaxforum
		} 
	};
	
	// Private Variables and Functions in the _ object
	// note that this will refer to _ unless you
	// call using the call or apply methods
	var _ = {
	};
	
	$.fn[nsp] = function(user,opts) {
	var localOpts = $.extend( 
		{}, // start with an empty map
		$[nsp].defaultOptions, // add defaults
		opts // add options
	);
	var Cache = {};
	
	function showOverview() {
		if ( Cache.__overview ){
			Cache.__overview.show();
			return;
		}
		var $this = $(this);
		if ( ! Cache.__original ){
			Cache.__original = $this.clone(true);
		}
		
		$this.after($('<div/>').css('clear','left'));
		
		var meta_opts = localOpts;
		if ($.meta){
			meta_opts = $.extend({}, localOpts, $this.data());
		}
		
		$this.text(meta_opts.msg_loading_list);
		var albumCount = 0;
		function appendImage(i,item){
			var title = item.media$group.media$title.$t;
			var href = item.link[1].href; // @author ajaxforum
			if (meta_opts.url.length == 0 || in_array(href, meta_opts.url)){ // @author ajaxforum
				albumCount++;
				$this.append( $("<div/>")
				.addClass('album_list')
				.click(function () {
					showAlbum($this,meta_opts,item.gphoto$id.$t,title);
				})
				.append(
					$("<img/>")
				.attr("src", item.media$group.media$thumbnail[0].url)
				)
				.append(
				$('<div/>')
				.addClass('album_description')
				.text(title)
				.width( meta_opts.size )
				)
				);
			};
		}
		
		function renderAlbumList(data){
			$this.empty();
			$.each(data.feed.entry,appendImage); 
			if (albumCount == 1){
				$this.children().eq(0).click();
				return;
			}
			
			Cache.__overview = $this;
		}
		
		$.getJSON('http://picasaweb.google.com/data/feed/api/user/' 
		+ user + '?kind=album&access=public&alt=json-in-script&thumbsize=' + meta_opts.size + 'c&callback=?',
		renderAlbumList
		);
	};
	
	function showAlbum($el,meta_opts,album,title){
	$el.hide();
	if ( Cache[album] ){
		Cache[album].show();
		return;
	};
	var $album = Cache.__original.clone(true);
	$el.after($album);
	$album.text(meta_opts.msg_loading_album);
	
	function appendImage(i,item){
		if (meta_opts.img_url.length == 0 || in_array(item.link[1].href, meta_opts.img_url)){ // @author ajaxforum
			var title = (item.media$group.media$description.$t? item.media$group.media$description.$t: item.media$group.media$title.$t); // @author ajaxforum
			var a = $("<a/>")
			.attr("href",item.content.src) 
			.attr("title",title)
			.append(
			$("<img/>")
			.attr("src", item.media$group.media$thumbnail[0].url)
			.attr("title",item.link[1].href ) // @author ajaxforum 
			.css({'border-width': '0px',
				width : meta_opts.size + 'px',
				height : meta_opts.size + 'px' 
			})
			);
			$album.append(
			$("<div/>")
			.addClass('album_image') // @author ajaxforum
			.append(a)
			.append(
					$("<div/>")
			.addClass('album_image_description')
			.append(title)
			) // @author ajaxforum
			);
		}
	}
	
	function renderAlbum(data){
		$album.empty();
		
		if (meta_opts.img_url.length == 0) {
			$album.append($(meta_opts.album_title_tag).text(title))
		}
		
		if (Cache.__overview){
			$album.append($("<div/>")
			.css({
				width : meta_opts.size + 'px',
				height : meta_opts.size + 'px' 
			})
			.html('<br/>'+meta_opts.msg_back)
			.click(function(){$album.hide();showOverview()})
			.addClass('pic-thumb')
			);
		}
		$.each(data.feed.entry,appendImage);
		
		function linkMapper(el){
			return [
				el.href,
				'<span>'+el.title+'</span> (<a href="'+el.childNodes[0].title+'" target="_blank">'+meta_opts.msg_source+'</a>)'
			]
		}
		
		if ($.fn.slimbox){
			$('a',$album).slimbox(meta_opts.slimboxparam,linkMapper); // @author ajaxforum
		}
		
		Cache[album] = $album;
	}
	
	$.getJSON('http://picasaweb.google.com/data/feed/api/user/' 
	+ user + '/albumid/' 
	+ album + '?kind=photo&access=public&alt=json-in-script&thumbsize='+meta_opts.size+'c&imgmax=800&callback=?',
	renderAlbum
	);
	};
	
	return this.each(showOverview);
};
})(jQuery);


/*
	Slimbox v2.02 - The ultimate lightweight Lightbox clone for jQuery
	(c) 2007-2009 Christophe Beyls <http://www.digitalia.be>
	MIT-style license.
*/
(function(w){var E=w(window),u,g,F=-1,o,x,D,v,y,L,s,n=!window.XMLHttpRequest,e=window.opera&&(document.compatMode=="CSS1Compat")&&(w.browser.version>=9.3),m=document.documentElement,l={},t=new Image(),J=new Image(),H,a,h,q,I,d,G,c,A,K;w(function(){w("body").append(w([H=w('<div id="lbOverlay" />')[0],a=w('<div id="lbCenter" />')[0],G=w('<div id="lbBottomContainer" />')[0]]).css("display","none"));h=w('<div id="lbImage" />').appendTo(a).append(q=w('<div style="position: relative;" />').append([I=w('<a id="lbPrevLink" href="#" />').click(B)[0],d=w('<a id="lbNextLink" href="#" />').click(f)[0]])[0])[0];c=w('<div id="lbBottom" />').appendTo(G).append([w('<a id="lbCloseLink" href="#" />').add(H).click(C)[0],A=w('<div id="lbCaption" />')[0],K=w('<div id="lbNumber" />')[0],w('<div style="clear: both;" />')[0]])[0]});w.slimbox=function(O,N,M){u=w.extend({loop:false,overlayOpacity:0.8,overlayFadeDuration:400,resizeDuration:400,resizeEasing:"swing",initialWidth:250,initialHeight:250,imageFadeDuration:400,captionAnimationDuration:400,counterText:"Image {x} of {y}",closeKeys:[27,88,67],previousKeys:[37,80],nextKeys:[39,78]},M);if(typeof O=="string"){O=[[O,N]];N=0}y=E.scrollTop()+((e?m.clientHeight:E.height())/2);L=u.initialWidth;s=u.initialHeight;w(a).css({top:Math.max(0,y-(s/2)),width:L,height:s,marginLeft:-L/2}).show();v=n||(H.currentStyle&&(H.currentStyle.position!="fixed"));if(v){H.style.position="absolute"}w(H).css("opacity",u.overlayOpacity).fadeIn(u.overlayFadeDuration);z();k(1);g=O;u.loop=u.loop&&(g.length>1);return b(N)};w.fn.slimbox=function(M,P,O){P=P||function(Q){return[Q.href,Q.title]};O=O||function(){return true};var N=this;return N.unbind("click").click(function(){var S=this,U=0,T,Q=0,R;T=w.grep(N,function(W,V){return O.call(S,W,V)});for(R=T.length;Q<R;++Q){if(T[Q]==S){U=Q}T[Q]=P(T[Q],Q)}return w.slimbox(T,U,M)})};function z(){var N=E.scrollLeft(),M=e?m.clientWidth:E.width();w([a,G]).css("left",N+(M/2));if(v){w(H).css({left:N,top:E.scrollTop(),width:M,height:E.height()})}}function k(M){w("object").add(n?"select":"embed").each(function(O,P){if(M){w.data(P,"slimbox",P.style.visibility)}P.style.visibility=M?"hidden":w.data(P,"slimbox")});var N=M?"bind":"unbind";E[N]("scroll resize",z);w(document)[N]("keydown",p)}function p(O){var N=O.keyCode,M=w.inArray;return(M(N,u.closeKeys)>=0)?C():(M(N,u.nextKeys)>=0)?f():(M(N,u.previousKeys)>=0)?B():false}function B(){return b(x)}function f(){return b(D)}function b(M){if(M>=0){F=M;o=g[F][0];x=(F||(u.loop?g.length:0))-1;D=((F+1)%g.length)||(u.loop?0:-1);r();a.className="lbLoading";l=new Image();l.onload=j;l.src=o}return false}function j(){a.className="";w(h).css({backgroundImage:"url("+o+")",visibility:"hidden",display:""});w(q).width(l.width);w([q,I,d]).height(l.height);w(A).html(g[F][1]||"");w(K).html((((g.length>1)&&u.counterText)||"").replace(/{x}/,F+1).replace(/{y}/,g.length));if(x>=0){t.src=g[x][0]}if(D>=0){J.src=g[D][0]}L=h.offsetWidth;s=h.offsetHeight;var M=Math.max(0,y-(s/2));if(a.offsetHeight!=s){w(a).animate({height:s,top:M},u.resizeDuration,u.resizeEasing)}if(a.offsetWidth!=L){w(a).animate({width:L,marginLeft:-L/2},u.resizeDuration,u.resizeEasing)}w(a).queue(function(){w(G).css({width:L,top:M+s,marginLeft:-L/2,visibility:"hidden",display:""});w(h).css({display:"none",visibility:"",opacity:""}).fadeIn(u.imageFadeDuration,i)})}function i(){if(x>=0){w(I).show()}if(D>=0){w(d).show()}w(c).css("marginTop",-c.offsetHeight).animate({marginTop:0},u.captionAnimationDuration);G.style.visibility=""}function r(){l.onload=null;l.src=t.src=J.src=o;w([a,h,c]).stop(true);w([I,d,h,G]).hide()}function C(){if(F>=0){r();F=x=D=-1;w(a).hide();w(H).stop().fadeOut(u.overlayFadeDuration,k)}return false}})(jQuery);
