(function($) {
	$.fn.gnomonGallery = function(options) {
		var imagesDir = (options.imagesDir ? options.imagesDir : '../../images/experience/facilities/');
		var xmlUrl = (options.xmlUrl ? options.xmlUrl : "../../scripts/campus.xml");
		var sliderXPos = 0;
		var galleryXML;
		var selector;
		var scrollImages = 4;
		
		var pluginDiv;
		var main;
		var details;
		var detailsText;
		var detailsLarger;
		var thumbsActions;
		var thumbsSlider;
		
		this.each(function() {  
			$(this).css({ position:'relative' }).html('');
			pluginDiv = $('<div class="gnomonGallery"><div class="main"><div class="mainDetails"><div class="mainDetailsText"></div><a class="mainDetailsLarger" href="#"></a></div></div><div class="thumbs"><div class="thumbsActions"></div><div class="thumbsSliderMask"><div class="thumbsSlider"></div></div></div></div>').appendTo(this);
			main = $(pluginDiv).find('.main');
			details = $(pluginDiv).find('.mainDetails');
			detailsText = $(pluginDiv).find('.mainDetailsText');
			detailsLarger = $(pluginDiv).find('.mainDetailsLarger');
			thumbsActions = $(pluginDiv).find('.thumbsActions');
			thumbsSlider = $(pluginDiv).find('.thumbsSlider');
			
			$.ajax({ type:"GET", url:xmlUrl+"?r="+Math.random()*1000, dataType:"xml", success:galleryHandler });
		});
		
		function galleryHandler(xml) {
			galleryXML = $(xml).find('image');
			
			$('<img src="'+imagesDir+'preview/'+galleryXML.eq(0).find('filename').text()+'" alt="" />').appendTo(main);
			detailsText.html('<p>'+galleryXML.eq(0).find('summary').text()+'&nbsp;</p>');
			detailsLarger.attr('href',imagesDir+galleryXML.eq(0).find('filename').text()).attr('title',galleryXML.eq(0).find('summary').text());
			adjustDetails();
			
			var rand = Math.random()*1000;
			for(var i=0; i<galleryXML.length; i++) {
				var html = new Array();
				html.push('<a class="imageContainer',(i==0 ? ' selected' : ''),'" rel="',rand,'" rev="',i,'" href="',imagesDir,'/',galleryXML.eq(i).find('filename').text(),'" title="',galleryXML.eq(i).find('summary').text(),'"','>');
				html.push('<img class="color" src="',imagesDir,'thumbs/',galleryXML.eq(i).find('filename').text(),'" alt="" />');
				html.push('<img src="',imagesDir,'/bw/',galleryXML.eq(i).find('filename').text(),'" alt="" />');
				html.push('</a>');
				$(html.join('')).appendTo(thumbsSlider);
			};
			$(thumbsSlider).find('.imageContainer').colorbox().unbind('click.colorbox');
			$().bind('cbox_complete', function(e){
				var filename = String($('#cboxPhoto').attr('src')).split('/');
				filename = filename[filename.length-1]; //-600
			   $(thumbsSlider).find('.imageContainer[href*='+filename+']').click().each(function() { 
					var pos = $(this).position();
					if(-sliderXPos+600 <= pos.left) {
						$(pluginDiv).find('.thumbsNext').click();
					} else if(-sliderXPos > pos.left) {
						$(pluginDiv).find('.thumbsPrev').click();
					};
				}).find('.color').stop().fadeIn(200, function() { $(this).css({ opacity:1 }); });
			});			
			$(detailsLarger).click(largerClickHandler);	
			$(pluginDiv).find('.imageContainer img').not('.color').css({ opacity:.5 });
			$(pluginDiv).find('.imageContainer').not('.selected').find('.color').css({ zIndex:50 }).hide();
			$(pluginDiv).find('.imageContainer').css({ cursor:'pointer', position:'relative' }).click(thumbClickHandler).hover(thumbOverHandler,thumbOutHandler).find('img').css({ position:'absolute', top:0, right:0 });
			setupActions();
			
			selector = $('<a class="thumbsSelector" href="#"></a>').appendTo(thumbsSlider).css({ left:8, zIndex:99 }).click(function() { return false; });
		};
		
		function setupActions() {
		$('<a class="thumbsNext" href="#"></a><a class="thumbsPrev disabled" href="#"></a>').appendTo(thumbsActions);
			$(pluginDiv).find('.thumbsNext').click(nextHandler);
			$(pluginDiv).find('.thumbsPrev').click(prevHandler);
		};
	
		function nextHandler(e) {
			$(thumbsActions).find('.thumbsPrev').removeClass('disabled');
			if(-(galleryXML.length*150-600)<sliderXPos-(scrollImages*150)) sliderXPos -= (scrollImages*150); else sliderXPos = -(galleryXML.length*150-600);
			$(thumbsSlider).animate({ left:sliderXPos }, 450).each(function() {
				if(-(galleryXML.length*150-600)>=sliderXPos) {
					$(e.target).addClass('disabled');
				};
			});
			return false;
		};
		
		function prevHandler(e) {
			$(thumbsActions).find('.thumbsNext').removeClass('disabled');
			if(sliderXPos+(scrollImages*150)<0) sliderXPos += (scrollImages*150); else sliderXPos = 0;
			$(thumbsSlider).animate({ left:sliderXPos }, 450).each(function() {
				if(sliderXPos>=0) {
					$(e.target).addClass('disabled');
				};
			}); 
			return false;
		};
		
		function adjustDetails() {
			var h = getDetailsHeight();
			h = (h<30 ? 30 : h);
			$(details).css({ height:h });
			var dlh = (detailsLarger.height()>0 ? detailsLarger.height() : 11);
			detailsLarger.css({ top:(h-dlh)/2 });
		};
		
		function thumbClickHandler(e) {
			e.preventDefault();
			
			$(pluginDiv).find('.imageContainer').not(this).removeClass('selected').find('.color').fadeOut(200);
			$(this).addClass('selected');
			
			selector.animate({ left:parseInt(this.rev)*150+8 });
			
			var index = parseInt(this.rev);
			details.stop().animate({ bottom:-(getDetailsHeight()) }, 200, function() { 
				detailsText.html('<p>'+galleryXML.eq(index).find('summary').text()+'&nbsp;</p>');
				detailsLarger.attr('href',imagesDir+galleryXML.eq(index).find('filename').text()).attr('title',galleryXML.eq(index).find('summary').text());;
				adjustDetails();
				$(this).animate({ bottom:0 });
			});
			
			$(main).find('img').stop().fadeOut(200, function() { $(this).remove(); });
			var img = new Image();
			img.onload = function() {
				$(img).animate({ top:0 },200).fadeIn(200);
			};
			$(img).appendTo(main).hide();
			img.src = imagesDir+'preview/'+galleryXML.eq(index).find('filename').text();
		};
		
		function largerClickHandler(e) {
			e.preventDefault();
			var filename = String(this.href).split('/');
			filename = filename[filename.length-1];
			$(thumbsSlider).find('.imageContainer[href*='+filename+']').colorbox({ open:true, preloadIMG:false, preloading:false }).unbind('click.colorbox');
		};
		
		function getDetailsHeight() {
			return $(details).find('p').height()+parseInt($(details).find('p').css('marginTop'))+parseInt($(details).find('p').css('marginBottom'));
		};
		
		function thumbOverHandler() {
			$(this).find('.color').stop().fadeIn(200, function() { $(this).css({ opacity:1 }); });
		};
		
		function thumbOutHandler() {
			$(this).not('.selected').find('.color').stop().css({ opacity:1 }).fadeOut(200);
		};
	};
})(jQuery);
