(function(jQuery) {
	jQuery.flickr = {
		collections: function(user, api, collectionid, callback) {
			var url = "http://api.flickr.com/services/rest/?&method=flickr.photosets.getList&api_key="+api+"&user_id="+user+"&format=json&&jsoncallback=?";
			jQuery.getJSON(url, function(adata) {
				
				var url = "http://api.flickr.com/services/rest/?&method=flickr.collections.getTree&api_key="+api+"&user_id="+user+"&collection_id="+collectionid+"&format=json&&jsoncallback=?";
				jQuery.getJSON(url, function(data) {
					var colls = [];
					var coll = null;
					
					jQuery.each(data.collections.collection, function(i, element) {
						coll = {
							id: element.id,
							title: element.title,
							description: element.description,
							iconl: element.iconlarge,
							icons: element.iconsmall,
							albums: []
						}
						jQuery.each(element.set, function(i, album) {
							var objAlbum = { id: album.id, thumb: '' };
							for(var ps in adata.photosets.photoset) {
								if(adata.photosets.photoset[ps].id == album.id) {
									objAlbum.thumb = jQuery.flickr.buildAlbumThumbUrl(adata.photosets.photoset[ps]);
									break;
								}
							}
							coll.albums.push(objAlbum);
						});
						colls.push(coll);
					});
					callback(colls);
				});
			});
		},
		albums: function(user, api, albumid, callback) {
			var url = "http://api.flickr.com/services/rest/?&method=flickr.photosets.getList&api_key="+api+"&user_id="+user+"&format=json&&jsoncallback=?";
			
			jQuery.getJSON(url, function(data) {
				var albums = [];
				var album = null;
				jQuery.each(data.photosets.photoset, function(i, element) {
					album = {
						id: element.id,
						title: element.title["_content"],
						description: element.description["_content"],
						thumb: jQuery.flickr.buildAlbumThumbUrl(element)
					}

					if(albumid) {
						if(albumid == album.id){
							albums.push(album);
						}
					}else{
						albums.push(album);
					}
				});
				callback(albums);
			});
		},
		openalbum: function(user, api, albumid, callback) {
			var galmain = jQuery('<div id="gallery-main"></div>').appendTo('body');
			var galload = jQuery('<div id="gallery-loading"></div>').appendTo('body');
			var url = "http://api.flickr.com/services/rest/?&method=flickr.photosets.getPhotos&api_key="+api+"&photoset_id="+albumid+"&extras=url_m,url_l,url_o,url_sq&format=json&&jsoncallback=?";
			jQuery.getJSON(url, function(data) {
				galload.hide();
				var pages = [];
				var galphoto = jQuery('<div id="gallery-photo"></div>').appendTo(galmain);
				var galnavigation = jQuery('<div id="gallery-navigation"></div>').appendTo(galmain);
				var galthumbs = jQuery('<div id="gallery-thumbs"></div>').appendTo(galnavigation);

				var galprevpage = jQuery('<div id="gallery-prev-page"></div>').appendTo(galthumbs);
				var galnextpage = jQuery('<div id="gallery-next-page"></div>').appendTo(galthumbs);

				var galprevpic = jQuery('<div id="gallery-prev-pic"></div>').appendTo(galmain);
				var galnextpic = jQuery('<div id="gallery-next-pic"></div>').appendTo(galmain);
				
				var galthumbscroll = jQuery('<div id="gallery-thumbscroll"></div>').appendTo(galthumbs);
				var gallistthumbs = jQuery('<ul></ul>').appendTo(galthumbscroll);
				var galclose = jQuery('<div id="gallery-close"></div>').appendTo(galmain).click(function(){
					galmain.remove();
					galload.remove();
					jQuery(document).unbind('keyup');
				});
				var anim = false;
				galprevpage.click(function(){
					//window.getSelection().removeAllRanges();
					var leftsc = (gallistthumbs.offset().left-galthumbscroll.offset().left);
					if(!anim && leftsc < 0){
						anim = true;
						gallistthumbs.animate({'margin-left' : (leftsc+galthumbscroll.width()) + "px"}, 500, function(){ anim = false; });
					}
				});
				galnextpage.click(function(){
					//window.getSelection().removeAllRanges();
					var leftsc = (gallistthumbs.offset().left-galthumbscroll.offset().left);
					if(!anim &&
					(gallistthumbs.find('li:last-child').offset().left+gallistthumbs.find('li:last-child').width()) > (galthumbscroll.width()+galthumbscroll.offset().left)){
						anim = true;
						gallistthumbs.animate({'margin-left' : (leftsc-galthumbscroll.width()) + "px"}, 500, function(){ anim = false; });
					}
				});
				galprevpic.click(function(){
					if(!gallistthumbs.find('li.active').is(':first-child')){
						if(gallistthumbs.find('li.active').prev().offset().left < galthumbscroll.offset().left){
							galprevpage.click();
						}
						gallistthumbs.find('li.active').prev().find('img').click();
					}
				});
				galnextpic.click(function(){
					if(!gallistthumbs.find('li.active').is(':last-child')){
						if(gallistthumbs.find('li.active').next().offset().left >= galthumbscroll.offset().left+galthumbscroll.width()){
							galnextpage.click();
						}
						gallistthumbs.find('li.active').next().find('img').click();
					}
				});
				jQuery.each(data.photoset.photo, function(i, element) {
					var tmb = jQuery('<li class="thumbnail"><img src="'+element.url_sq+'" alt="'+element.title+'" /></li>');
					tmb.find('img').click(function(){
						if(!jQuery(this).parent().hasClass('active')){
							galthumbs.find('.thumbnail').removeClass('active');
							jQuery(this).parent().addClass('active');
							galphoto.html('');
							galload.show();
							var imgurl = (element.url_o) ? element.url_o : element.url_l;
							imgurl = (imgurl) ? imgurl : element.url_m;

							var pic = jQuery('<img src="'+imgurl+'" alt="'+element.title+'"/>').hide();
							galphoto.html(pic);
							
							pic.load(function(){
								pic.show();
								pic.css('max-height', galmain.height()-galthumbs.height()-40);
								galphoto.css('margin-top', ((galmain.height()-pic.height())/2)-30);
								galload.hide();
								if(element.title){
									var pictitle = jQuery('<span>'+element.title+'</span>').appendTo(galphoto);
									pictitle.css({
										'margin-left' : pic.offset().left+10,
										'width' : pic.width(),
										'margin-bottom' : '10px'
									});
								}
							});
						}
					});
					tmb.find('img').load(function(){
						gallistthumbs.append(tmb);
						if(i==0){gallistthumbs.find('li:first img').click()}
					});
				});
			});
			jQuery(document).keyup(function(e){
				if(e.keyCode == 27){jQuery('#gallery-close').click();}
				else if(e.keyCode == 37){jQuery('#gallery-prev-pic').click();}
				else if(e.keyCode == 39){jQuery('#gallery-next-pic').click();}
			});
			jQuery(window).resize(function(){
				jQuery('#gallery-photo img').css('max-height', jQuery('#gallery-main').height()-jQuery('#gallery-thumbs').height()-40);
				jQuery('#gallery-photo').css('margin-top', ((jQuery('#gallery-main').height()-jQuery('#gallery-photo img').height())/2)-30);
				jQuery('#gallery-photo span').css({
					'margin-left' : jQuery('#gallery-photo img').offset().left+10,
					'width' : jQuery('#gallery-photo img').width(),
					'margin-bottom' : '10px'
				});
			});
		},
		buildAlbumThumbUrl: function(element){
			return "http://farm"+element.farm+".static.flickr.com/"+element.server+"/"+element.primary+"_"+element.secret+"_s.jpg";
		}
	};
	jQuery.fn.flickrAlbums = function(options, callback){
		var defaults = {
			user: '',
			api: '',
			albumid: ''
		};
		var opts = jQuery.extend(defaults, options);

		if(!opts.api || !opts.user){
			alert('É necessário definir a chave API e o usuário do Flickr!');
			callback(false);
		}
		var elem = this;
		jQuery.flickr.albums(opts.user, opts.api, opts.albumid, function(albums) {
			var list = jQuery('<ul/>').appendTo(elem);
			jQuery.each(albums, function(index, album) {
				var listitem = jQuery('<li/>').appendTo(list);
				listitem.append(jQuery('<a href="#" class="thumbnail"><img src="'+album.thumb+'" /></a>').click(function(){
					jQuery.flickr.openalbum(opts.user, opts.api, album.id);
					return false;
				}));
				listitem.append('<br />');
				listitem.append('<legend>'+album.title+'</legend>');
			});
		});
	};
	jQuery.fn.flickrCollections = function(options, callback){
		var defaults = {
			user: '',
			api: '',
			collectionid: ''
		};
		var opts = jQuery.extend(defaults, options);

		if(!opts.api || !opts.user){
			alert('É necessário definir a chave API e o usuário do Flickr!');
			callback(false);
		}
		var elem = this;
		var layercol;

		jQuery.flickr.collections(opts.user, opts.api, opts.collectionid, function(collections) {
			jQuery.each(collections, function(index, collection) {
				
				layercol = jQuery('<div class="gallery-collection"></div>').appendTo(elem);
				layercol.append('<h1>'+collection.title+'</h1>');
				jQuery.each(collection.albums, function(index, album) {
					layercol.append(jQuery('<a href="#" class="thumbnail"><img src="'+album.thumb+'" /></a>').click(function(){
						jQuery.flickr.openalbum(opts.user, opts.api, album.id);
						return false;
					}));
				});
			});
		});
	};
})(jQuery);

