var WF = window.WF || {};

WF.Gallery = (function($)
{
	var panelExtraWidth = 100;
	var panelExtraHeight = 120;
	var galleryEvents = { zoom: [] };
	var galleries;

	function setGalleryDef(galleryObject)
	{
		galleries = galleryObject;
	}

	function setupZoomControls()
	{
		var gallery = $(this).closest('.gallery');
		if (gallery.length)
		{
			gallery = galleries[$(gallery).get(0).id];

			if (gallery !== undefined)
			{
				var id = this.id;
				var index = $.inArray(id, gallery.images);
				var image = this.getElementsByTagName('img')[0];

				document.getElementById('zo-gt').innerHTML = gallery.title;
				document.getElementById('zo-it').innerHTML = image.getAttribute('alt');
				document.getElementById('zo-ic').innerHTML = 'Image ' + (index + 1) + '/' + gallery.images.length;

				if (index == 0)
				{
					$('#zo-prev').addClass('disabled').unbind('click').click(function(e) { e.preventDefault(); });
				}
				else
				{
					var prevAnchor = $('#' + gallery.images[index - 1]).get(0);
					$('#zo-prev').removeClass('disabled').unbind('click').click(function(e)
					{
						zoom(prevAnchor);
						e.preventDefault();
					});
				}

				if (index == gallery.images.length - 1)
				{
					$('#zo-next').addClass('disabled').unbind('click').click(function(e) { e.preventDefault(); });
				}
				else
				{
					var nextAnchor = $('#' + gallery.images[index + 1]).get(0);
					$('#zo-next').removeClass('disabled').unbind('click').click(function(e)
					{
						zoom(nextAnchor);
						e.preventDefault();
					});
				}

			}
		}
	}

	function runEvents(eventName, o)
	{
		var eventList = galleryEvents[eventName];
		for (var i = 0; i < eventList.length; i++)
		{
			eventList[i].call(o);
		}
	}

	function addEventHandler(eventName, func)
	{
		var eventList = galleryEvents[eventName];
		if (eventList !== undefined)
		{
			eventList.push(func);
			return eventList.length - 1;
		}
		else
		{
			eventList[eventName] = [func];
			return 0;
		}
	}

	function removeEventHandler(eventName, index)
	{
		var eventList = galleryEvents[eventName];
		if (eventList !== undefined)
		{
			var removed = eventList.splice(index, 1);
			return removed;
		}
		else
		{
			return null;
		}
	}

	function calculatePosition(img)
	{
		var scrollTop = 0;
		
		if ($(window).scrollTop() > 0)
		{
			scrollTop = $(window).scrollTop()
		}
	
		var left = (Math.floor($(window).width() / 2) - Math.floor((img.width + panelExtraWidth) / 2)) + 'px';
		//var top = (Math.floor($(window).height() / 2) - Math.floor((img.height + panelExtraHeight) / 2)) + scrollTop + 'px';
		//var top = 72 + scrollTop + 'px';
		var top = 5 + scrollTop + 'px';
		var zoomWidth = img.width + 104 + 'px';
		var imgWidth = img.width + 'px';
		
		// remove jquery dependency if poss
		$('#zoom-panel').css({
			'left': left,
			'top': top,
			'width':zoomWidth
		});
		
		$('#zoom-panel .tools').css({
			'width':img.width
		});
		
		$('#zoom-cover').height($(document).height());
		
		
		$('#zoom-overlay img.zoomed').attr('src', img.src);
		$('#zoom-overlay').show();
	}

	function zoom(element)
	{
		var imageFile = $(element).attr('href');
		var tempImage = new Image();
		tempImage.onload = function()
		{
			calculatePosition(tempImage);
		};
		tempImage.src = imageFile;
		runEvents('zoom', element);
	}

	function initZoom()
	{
		$('#gallery a.zoom,.gallery-page a.zoom').click(function(e)
		{
			zoom(this);
			e.preventDefault();
		});

		$('#zoom-overlay .close').click(function(e)
		{
			$('#zoom-overlay').hide();
			e.preventDefault();
		});
	}

	function selectPage(galleryId, page)
	{
		var gallery = $('#gallery-' + galleryId);
		$('.gallery-page.selected', gallery).removeClass('selected');
		$('#gpage-' + galleryId + '-' + page, gallery).addClass('selected');
	}
	
	function setDivHeight()
	{
		//to make sure the textbox height matches that of the galleries (so there are no scroll bars).
		//the extra pixels are added for IE, because it has to work the size out differently for each browser :-/.
		var gallery_panel_height = $('#gallery-panel').height();
		var text_scroll_height = $('.big').height();
		var ieExtra = 0;
		
		if(jQuery.browser.msie)
		{
			if (Math.floor(jQuery.browser.version) == 6)
			{
				ieExtra = 22; 
			}
			
			if (Math.floor(jQuery.browser.version) == 7)
			{
				ieExtra = 1; 
			}
		}
		
		if (gallery_panel_height && (gallery_panel_height > text_scroll_height))
		{
			if (ieExtra!=0)
			{
				gallery_panel_height+=ieExtra;
			}
		
			$('.big').css({
				'height':gallery_panel_height + 'px'
			});
		}
		
	}
	
	return {
		initZoom: initZoom,
		zoom: zoom,
		selectPage: selectPage,
		addEventHandler: addEventHandler,
		removeEventHandler: removeEventHandler,
		setGalleryDef: setGalleryDef,
		setupZoomControls: setupZoomControls,
		setDivHeight: setDivHeight
	};
})(jQuery);


// initialise
jQuery(function initialiseGallery()
{
	WF.Gallery.initZoom();
	WF.Gallery.addEventHandler('zoom', WF.Gallery.setupZoomControls);
	WF.Gallery.setDivHeight();
});


