;(function($) {
	// JumboGallery static class
	$.jumbogallery = {
		version: '1.0'
	};
	
	var defaults = {
		data:                     	null,
		numImagesPerPage:			25,
		onTransitionIn:            	undefined,
		renderNavControls: 			true,
		prevLinkText:				'<< Previous',
		nextLinkText:				'Next >>',
		maxPagesToShow:				7,
		prevPageLinkText:			'<<',
		nextPageLinkText:			'>>',
		num_edge_entries:			1	
	};

	$.fn.jumbogallery = function(settings) {
		//  Extend Gallery Object
		$.extend(this, {
			// Returns the version of the script
			version: $.jumbogallery.version,
			
			imagePosition: 0, 
			pageIndex: 0, // what page are we on
			
			initializeGallery: function() {
				$LOG.console('initializeGallery');
				
				this.buildPagination();
				this.buildSlidesContainer();
				this.updateMainImage();
				
				// Set forward/backward link hashes
				this.setAdvanceLinks();
			},
			preloadPages: function() {
				/* Maybe to be implemented */
			},
			setAdvanceLinks: function() {
				$('div.nav-controls a.next').attr('href', '#'+this.getNextSlideHash());
				$('div.nav-controls a.prev').attr('href', '#'+this.getPrevSlideHash());
			},
			getNextSlideHash: function() {
				if ((this.imagePosition+1) == this.data.length) {
					return 0;
				}	
				return this.imagePosition+1;
			},
			getPrevSlideHash: function() {
				if (this.imagePosition == 0) {
					return this.data.length-1;
				}
				return this.imagePosition-1;
			},
			getTotalNumPages: function() {
				return Math.ceil(this.data.length / this.numImagesPerPage);
			},
			buildSlidesContainer: function() {
			
				$LOG.console('buildSlidesContainer');
				
				$('.thumbs').html('');
								
				this.imagePosition = this.pageIndex * this.numImagesPerPage;
				$LOG.console('imagePosition: '+this.imagePosition);
				
				var range = (this.imagePosition + this.numImagesPerPage);
				
				$LOG.console('range:'+range);
				if (this.data.length < this.numImagesPerPage) {
					range = this.data.length;
				}
				else if (range > this.data.length) {
					range = this.data.length;
				}
				
								
								
				$LOG.console('range(1):'+range);
				$LOG.console('imagePosition: '+this.imagePosition);
				
				var out = '';
				for (var i = this.imagePosition; i < range; i++) {
					//$LOG.console(this.data[i]);
					out += '<li id="li'+i+'"><a title="" href="#'+i+'" class="thumb" rel="aLink"><img title="" alt="" src="http://arktiskebilleder.dk/image.php?bid='+this.data[i].bid+'&max_width=85&max_height=85" id="thumb'+i+'"></a></li>';	
					
					/*
					out += '<li id="li'+i+'"><a title="" href="#'+i+'" class="thumb" rel="aLink"><img title="" alt="" src="http://arktiskebilleder.dk/assets/images/resizer.php?imgfile=http://www.arktiskebilleder.dk/images/'+this.data[i].gid+'-web.jpg&max_width=85&max_height=85" id="thumb'+i+'"></a></li>';
					*/	
				}
				$('.thumbs').html(out);
				
				// Update pagination
				$('a.current').removeClass('current');
				
				$('#pagination a:eq('+this.pageIndex+')').addClass('current');
				
				// Attach click to each image
				var jumbogallery = this;

				$('.thumb').click(function(e) {
					jumbogallery.clickHandler(e, this);
				});
				 
				if (this.onSlidesContainerChanged) {
					this.onSlidesContainerChanged(this.pageIndex);
				}	
				
			},
			paginationHelper:function() {				
				var ne_half = Math.ceil(this.maxPagesToShow/2);
				var np = this.getTotalNumPages();
				var upper_limit = np-this.maxPagesToShow;
				var start = this.pageIndex>ne_half?Math.max(Math.min(this.pageIndex-ne_half, upper_limit), 0):0;
				var end = this.pageIndex>ne_half?Math.min(this.pageIndex+ne_half, np):Math.min(this.maxPagesToShow, np);
				
				
				return [start,end];
			},
			buildPagination: function() {
				
				$LOG.console('buildPagination');
				$('#pagination').hide();
				$('#pagination').html('');
				
				var interval = this.paginationHelper();
				
				$LOG.console(interval);
				var p = '';
				
				// Generate "Previous"-Link
				if(this.prevLinkText && this.pageIndex > 0 ){
					//appendItem(current_page-1,{text:opts.prev_text, classes:"prev"});
					p += '<a rel="history" href="#'+(this.pageIndex-1)+'" title="'+this.prevPageLinkText+'">'+this.prevPageLinkText+'</a>';
				}
				
				// Generate starting points
				if (interval[0] > 0 && this.num_edge_entries > 0)
				{
					var end = Math.min(this.num_edge_entries, interval[0]);
					for(var i=0; i<end; i++) {
						//appendItem(i);
						p += '<a rel="history" href="#'+i+'" title="'+(i+1)+'">'+(i+1)+'</a>';
					}
					if(this.num_edge_entries < interval[0])
					{
						//jQuery("<span>"+opts.ellipse_text+"</span>").appendTo(panel);
						p += '<span class="ellipsis">&hellip;</span>';
					}
				}
				
				// Generate interval links
				for(var i=interval[0]; i<interval[1]; i++) {
					//appendItem(i);
					
					if (i != this.pageIndex) {
						p += '<a rel="history" href="#'+i+'" title="'+(i+1)+'">'+(i+1)+'</a>';
					}
					else {
						p += '<span class="current">'+(i+1)+'</span>';
					}
				}
				
				// Generate ending points
				if (interval[1] < this.getTotalNumPages() && this.num_edge_entries > 0)
				{
					if(this.getTotalNumPages()-this.num_edge_entries > interval[1])
					{
						//jQuery("<span>"+opts.ellipse_text+"</span>").appendTo(panel);
							p += '<span class="ellipsis">&hellip;</span>';
					}
					var begin = Math.max(this.getTotalNumPages()-this.num_edge_entries, interval[1]);
					for(var i=begin; i<this.getTotalNumPages(); i++) {
						//appendItem(i);
						p += '<a rel="history" href="#'+i+'" title="'+(i+1)+'">'+(i+1)+'</a>';
					}
					
				}
				
				// Generate "Next"-Link
				if(this.pageIndex < this.getTotalNumPages()-1){
					//appendItem(current_page+1,{text:opts.next_text, classes:"next"});
					p += '<a rel="history" href="#'+(this.pageIndex+1)+'" title="'+this.nextPageLinkText+'">'+this.nextPageLinkText+'</a>';
				}
				
				$('#pagination').html(p);
				$('#pagination').show();
				
				var jumbogallery = this;

				$('#pagination').children('a').click(function(e) {
					$LOG.console(e);
					
					jumbogallery.clickHandler(e, this);
				});
				
			},
			clickHandler: function(e, link) {
				$LOG.console('clickHandler');
				
				switch($(link).attr('rel')) {
					case 'aLink':
						var hash = this.normalizeHash($(link).attr('href'));
						this.imagePosition = parseInt(hash);		
						this.updateMainImage();
					
						// Do we need to update the current page ? 
						if (this.imagePosition >= ((this.pageIndex*this.numImagesPerPage)+this.numImagesPerPage) || this.imagePosition < (this.pageIndex*this.numImagesPerPage)) {
							$LOG.console('INIT PAGE CHANGE');
							
							// Find the page to show
							this.pageIndex = Math.floor(this.imagePosition / this.numImagesPerPage);
							
							this.buildSlidesContainer();
							this.buildPagination();			
						}
					break;
					default:
						var hash = this.normalizeHash($(link).attr('href'));
						this.pageIndex = parseInt(hash);
						this.buildSlidesContainer();	
						this.imagePosition = hash * this.numImagesPerPage;
						this.updateMainImage();
						this.buildPagination();					
				}
				
				this.setAdvanceLinks();
				e.preventDefault();	
			},
			normalizeHash: function(hash) {
				return hash.replace(/^.*#/, '').replace(/\?.*$/, '');
			},
			updateMainImage: function() {
				// Clear caption
				//$('#caption').empty();
				
				var newSlide = $('#slideshow')
					.html('<span class="image-wrapper current"><a class="advance-link" rel="aLink" href="#'+this.getNextSlideHash()+'" title="'+this.data[this.imagePosition].d1+'"><img src="http://arktiskebilleder.dk/image.php?bid='+this.data[this.imagePosition].bid+'&amp;max_width=430&amp;max_height=400" alt="'+this.data[this.imagePosition].d1+'" /></a></span>')
					.find('span.current').css('opacity', '0');
					
				newSlide.fadeTo(750, 1.0);	
				
				var jumbogallery = this;
				$(newSlide).children('a').click(function(e) {
					jumbogallery.clickHandler(e, this);
				});
				
				// Put border around the selected thumbnail
				$('.thumbs').children('li').attr('class', '');
				$('#li'+this.imagePosition).attr('class', 'selected');
				
				if (this.onTransitionIn) {
					this.onTransitionIn(this.data[this.imagePosition]);
				}	
			}
		});

		// Now initialize the gallery
		$.extend(this, defaults, settings);
		
		var gallery = this;
		
		// Navigation Controls
		if (this.renderNavControls) {
			$('#controls')
				.html('<div class="nav-controls"><a class="prev" rel="aLink" title="'+this.prevLinkText+'">'+this.prevLinkText+'</a><a class="next" rel="aLink" title="'+this.nextLinkText+'">'+this.nextLinkText+'</a></div>')
				.find('div.nav-controls a')
				.click(function(e) {
					gallery.clickHandler(e, this);
				});
		}
		
		this.initializeGallery();
		
		return this;
	};
})(jQuery);
