(function($) {
	$.fn.flickrGallery = function(options, fl) {
		var settings = {
			imageContainer: "#main_image",
			thumbnailContainer: "#thumbnails",
			imageTitle: "#image_title",
			imageDescription: "#image_description",
			pageNext: $("<div id='right_arrow' class='thumbnail'>"),
			pagePrev: $("<div id='left_arrow' class='thumbnail'>"),
			setName: null,
			paginator: {},
			loader: $("<img id='loader'>").attr('src','images/gallery/loading.gif')
		}
		
		var flickrSettings = {
	        api_key: "4750b3c77313316afa16b5e5582d58e6", //remove this for wide release
	        type: "photoset",
	        per_page: 6,
			attr:'class="thumbnail"',
			size: "default",
			paginator: null
	    }		
		if (options) $.extend(settings, options);
		if (fl) $.extend(flickrSettings, fl);
		settings.flickrSettings = flickrSettings;
		
		settings.flickrSettings.paginator = settings.paginator;

		return $(this).each(function(){
			//Set up
			settings.currentPage = 1;
			$(settings.pagePrev).click(function(){
				loadPage(settings.paginator.page-1>0 ? settings.paginator.page-1 : settings.paginator.page);
			});
			$(settings.pageNext).click(function(){
				loadPage(settings.paginator.page<settings.paginator.pages ? settings.paginator.page+1 : settings.paginator.page);
			});
			$(settings.imageContainer).append(settings.loader);
			loadPage(1);
		});
		
		function loadPage(pageNumber) {
			hidePage();
			settings.flickrSettings.page = pageNumber;
			getImageData();
		};
		
		function getImageData() {
			settings.flickrSettings.callback = showPage;
			$(settings.thumbnailContainer).flickr(settings.flickrSettings);
		};
		
		function showPage(elements) {
			$(elements).find("a.thumbnail").click(loadImage);
			if(settings.paginator.page < settings.paginator.pages)
				settings.pageNext.appendTo($(settings.thumbnailContainer));
			if(settings.paginator.page > 1)
				settings.pagePrev.prependTo($(settings.thumbnailContainer));
			$("#left_arrow").add('#thumbnails li').add('#right_arrow')
				.filter(function(i){return (i+1)%4==0?true:false;}).css("margin-right","0");
			$(settings.thumbnailContainer).fadeIn(500);
			if($('.gallery_image').length == 0)
				$('a.thumbnail:eq(0)').click();
		};
		
		function hidePage() {
			$(settings.pageNext).add(settings.pagePrev).appendTo(document);
			$(settings.thumbnailContainer).hide().empty();
		};
		
		function loadImage(e) {
			var cachedImage = $(settings.imageContainer).find("img[src="+$(this).attr('href')+"]");
			if(cachedImage.length > 0)
				display(cachedImage);
			else {
				$(settings.loader).show();
				$("<img class='gallery_image' src='"+$(this).attr('href')+"' />").load(imageDidLoad).hide().appendTo(settings.imageContainer);
			}
			$(settings.imageTitle).text($(this).parent().find('.title').text());
			$(settings.imageDescription).html($(this).parent().find('.description').html());
			return false;
		}
		
		function imageDidLoad(e) {
			$(settings.loader).hide();
			display(this);
		}
		
		function display(img) {
			$(settings.imageContainer).find('img').hide();
			$(img).fadeIn(500);
		}
		
		function disableControls() {
			
		};
		
		function enableControls() {
			
		};
	};
})(jQuery);