/**
 * Remote gallery jQuery UI widget.
 * Currently works only with Picasa Web (Google).
 * (c) Olivier Sambourg 2008
 */

(function($){
 
	$.widget("ui.remoteGallery", {
        albums: Object(),
		currentPage: 1,
		pageSize: 9,
        
		init: function() {
                        this.displayAlbums();
		},
        
		loadAlbums: function(callback) {
            var url = this.options.url;
            var self = this;
			//$.getJSON(url + "&callback=?", {thumbsize: '160u', imgmax: '800'},
			$.ajax({
				url: url,
				dataType: 'jsonp',
				scriptCharset: 'utf-8',
				data: {thumbsize: '160u', imgmax: '800'},
				success: function(data) {
						$.each(data.feed.entry, function(i, entry) {
							var album = self.albums[entry.id.$t];
							if (album == undefined || album == null) {
								var urls = $.grep(entry.link, function(link, index) {
									return ((link.rel == "http://schemas.google.com/g/2005#feed") && (link.type == "application/atom+xml"));
								});
								album = {
									url: urls[0].href,
									thumbnail: entry.media$group.media$thumbnail[0].url,
									title: entry.title.$t ? entry.title.$t : "",
									description: entry.summary.$t ? entry.summary.$t.split("\n") : "".split('\n'),
									photos: Object(),
									numPhotos: 0
								};
								self.albums[entry.id.$t] = album;
							}
						});
						callback.call();
					}
			});
        },
		
		loadAlbum: function(albumId, callback) {
			var url = this.albums[albumId].url;
			var self = this;
			//$.getJSON(url + "&callback=?", {thumbsize: '160u', imgmax: '800'} ,
			
			$.ajax({
				url: url,
				dataType: 'jsonp',
				scriptCharset: 'utf-8',
				data: {thumbsize: '160u', imgmax: '800'},
				success:
					function(data) {
				
						$.each(data.feed.entry, function(i, entry) {
							var photo = self.albums[albumId].photos[entry.id.$t];
							if (photo == undefined || photo == null) {
								var lines = entry.summary.$t ? entry.summary.$t.split("\n") : "".split('\n');
								photo = {
									thumbnail: entry.media$group.media$thumbnail[0].url,
									image: entry.media$group.media$content[0].url,
									title: lines[0] ? lines[0] : "",
									description: lines
								};
								self.albums[albumId].photos[entry.id.$t] = photo; self.albums[albumId].numPhotos++;
							}
						});
						callback.call();
					}//);
				});
		},
        
		displayAlbums: function() {
            this.element.empty();
            $(".gallery-title").html(this.options.title);
            var list = $("<ul></ul>");
            list.addClass("remote-gallery-albums");
			var self = this;
            this.loadAlbums(function() {
                $.each(self.albums, function(key, album) {
                    var listItem = $("<li><table><tr class='image'><td><a href='#'><img /></a></td></tr><tr class='caption'><td></td></tr></table></li>");
                    $("img", listItem).attr({src: album.thumbnail, alt: album.title, title: album.title});
                    $("tr.caption td", listItem).html(album.title);
                    $("a", listItem).click(function() {
                        self.displayAlbum(key);
                        return false;
                    });
                    list.append(listItem);
                });

            }); 
			this.element.append(list);
        },
		
        displayAlbum: function(albumId) {
			this.element.empty();
			var album = this.albums[albumId];
			var self = this;
			var backLink = $("<a href='#'>&laquo; " + this.options.title + "</a>");
			backLink.click(function() { self.displayAlbums(); return false;});
			this.element.append(backLink);
			$(".gallery-title").html(album.title);
			var description = $("<div></div>");
			description.html(album.description.join("<br />"));
			this.element.append(description);


			var pager = $("<div class='remote-gallery-pager'></div>");
			var prevLink = $("<a href='#'>&laquo; Pr&eacute;c.</a>");
			prevLink.click(function() { self.displayAlbumPage(albumId, 'previous'); return false; });
			pager.append(prevLink);
			pager.append("&nbsp;-&nbsp;<span>1</span> sur <span>1</span>&nbsp;-&nbsp;");
			var nextLink = $("<a href='#'>Suiv. &raquo;</a>");
			nextLink.click(function() { self.displayAlbumPage(albumId, 'next'); return false; });
			pager.append(nextLink);

			this.element.append(pager);

			var list = $("<ul></ul>");
			list.addClass("remote-gallery-album");
			
			this.loadAlbum(albumId, function() {
				$("div.remote-gallery-pager span:eq(1)").html(Math.ceil(album.numPhotos / self.pageSize));
				var i = 0;
				$.each(album.photos, function(id, photo) {
				    var page = Math.floor((i / self.pageSize) + 1);
					var listItem = $("<li><table><tr class='image'><td><a><img /></a></td></tr><tr class='caption'><td></td></tr></table></li>");
					if (page > 1) {
						listItem.css('display', 'none');
					}
					listItem.addClass("gallery-page-" + page );
					
					var lines = photo.description;
					var formattedTitle = "<strong>" + lines[0] + "</strong><br />";
					var formattedDescription = $.map(lines.slice(1), function(line, index) {
						return line.replace(/(\/[^/]*\/)(.*)/, "<span class='phonetique'>$1</span><em>$2</em>");
					}).join("<br />");
					
					$("tr.caption td", listItem).html(photo.title);
					$("a", listItem).attr({href: photo.image, title: formattedTitle + formattedDescription});
					$("img", listItem).attr({src: photo.thumbnail, alt: photo.title, title: photo.title});
					list.append(listItem);
					i++;
				});
				$("ul.remote-gallery-album li tr.image a", self.element).lightBox({
					txtImage: 'Photo',
					txtOf: 'sur'
				});
			});

			this.element.append(list);

			
		},
		
		displayAlbumPage: function(albumId, page) {
			var album = this.albums[albumId];
			var newPage = this.currentPage;
			var lastPage = Math.ceil(album.numPhotos / this.pageSize);
			switch (page) {
				case 'previous':
					newPage > 1 ? newPage-- : false;
					break;
				case 'next':
					newPage < lastPage ? newPage++ : false;
					break;
				default:
					break;
			}
			
			if (newPage != this.currentPage) {
				this.currentPage = newPage;
				$("div.remote-gallery-pager span:eq(0)").html(newPage);
				$("ul.remote-gallery-album li", this.element).hide();
				$("ul.remote-gallery-album li.gallery-page-" + this.currentPage, this.element).show();
			}
        }
        
        
        
	});
	
})(jQuery); 