(function($) {
	$.fn.photos = function (options) {
		
		var settings = {
			photoFrame: null,
			url: 'http://api.flickr.com/services/rest/?format=json&jsoncallback=',
		    api_key: null,
			api_callback: '?',
			user_id: null,
			filter: null,
			thumb_size: 's',
			photo_size: null,
			preload: true,
			size:7,
			speed:500
		  };
		
		if (options) {
			$.extend(settings, options);
		}
		
		settings.url = settings.url + settings.api_callback + '&api_key='+settings.api_key;
			
		return this.each(function () {
			$scrollable = $(this);
			$scrollable.mousedown(function () { return false;});
			$items = $(this).find('.items');
			var $navButtons = $('<div class="buttons"><img class="next" src="/images/index/photos/right-brace.png"/><img class="prev" src="/images/index/photos/left-brace.png"/></div>');
			// console.log($items);
			
			// var api = $(this).scrollable({size:settings.size}).circular();
			
			var photosets = new Array();
			var photos = new Array();
			$.getJSON(settings.url, {method: 'flickr.photosets.getList', user_id: settings.user_id}, function (data) {
				$.each(data.photosets.photoset, function (i, photoset) {
					if (settings.filter) {
						// Keep all photosets in the include array
						if ($.inArray(photoset.id, settings.filter) != -1) {
							return;
						}
					}
					photosets.push(photoset.id);
				});
				
				var activeRequests = 0;
				$('#photos .loading').show();
				$.each(photosets, function(i, photoset_id) {
					activeRequests++;
					$.getJSON(settings.url, {method: 'flickr.photosets.getPhotos', photoset_id: photoset_id}, function (data) {
						activeRequests--;
						$.each(data.photoset.photo, function (j, photo) {
							if (settings.preload) {
								preload(photo);
							}
							// photos.push(photo);
							
							$thumb = $(new Image());
							$photo = $(new Image());
							
							$thumb.attr({src:photoUrl(photo,settings.thumb_size)}).addClass('thumb');
							$photo.attr({title:photoUrl(photo,settings.photo_size)}).addClass('photo').css({display:'none'});					
							
							$('<li/>').append('<div class="glare"></div>')
								.append($thumb)
								.append($photo)
								.appendTo($items);

						});

						// All JSON Calls complete.
						if (activeRequests == 0) {

							// api.reload();//.circular();
							var $frame = $('#photos .frame');
							var $loader = $('#photos .loading');
							
							$loader.hide();
							// $loader.css({opacity:0});
							
							// console.log($frame);
							
							$($scrollable).scrollable({
								size:settings.size, 
								speed:settings.speed
							}).circular();
							
							$items.find('> li').click(function () {
								$navButtons.remove().prependTo(this);
								$newPhoto = $(this).find('.photo');
								
								var loaded = false;
								
								if (!settings.preload) {
									name = $newPhoto.attr('title');
									cookie = $.cookie(name);
									if (cookie != 'loaded') {
										$.cookie(name, 'loaded', {expires:10});
										$loader.show();
										$loader.css({opacity:1});
									} else {
										loaded = true;
										$loader.css({opacity:0});
									}
								}
								
								
								$newPhoto = $newPhoto.clone();
								$newPhoto.attr({src:$newPhoto.attr('title')});
								
								$frame.prepend($newPhoto.load(function() {
									if (!settings.preload && !loaded) {
										$loader.css({opacity:0});
									}
									$oldPhoto = $frame.find('img:gt(0)');
									
									fromWidth = $frame.width();
									fromHeight = $frame.height();
									
									toWidth = $(this).width();
									toHeight = $(this).height();
									
									if (toWidth == fromWidth && toHeight == fromHeight) {
										$oldPhoto.animate({opacity:0},settings.speed, function() {
											$(this).remove();
										});
									} else {
										$newPhoto.css({width:fromWidth,height:fromHeight});

										$frame.animate({width:toWidth,height:toHeight},settings.speed);
										$newPhoto.animate({width:toWidth,height:toHeight},settings.speed);

										$oldPhoto.animate({width:toWidth,height:toHeight,opacity:0},settings.speed, function() {
											$(this).remove();
										});
									}
								}).show());												
							});
							
							$items.find('li[class!=cloned]:first').click();
						}
					});	
				});	
			});
		});
		
		
		function photoUrl(photo, size) {
			var url = 'http://farm'+photo['farm']+'.static.flickr.com/'+photo['server']+'/'+photo['id']+'_'+photo['secret'];
			if (size) {
				url += '_' + size;
			}
			url += '.jpg';
			return url;
		}
		
		function preload (photo) {
			$('<img/>').attr('src', photoUrl(photo, settings.photo_size));
			$('<img/>').attr('src', photoUrl(photo, settings.thumb_size));
		}

	}
})(jQuery);