/*
* Copyright (C) 2009 Joel Sutherland.
* Liscenced under the MIT liscense
* TODO:
* 1. Create API
* 2. Address accesibility automatically
* 3. Make object oriented
*/
(function ($) {
	$.fn.zoommap = function (settings) {
		settings = $.extend({
			zoomDuration: 500,
			zoomClass: 'zoomable',
			popupSelector: 'div.popup',
			popupCloseSelector: 'a.close',
			bulletWidthOffset: 10,
			bulletHeightOffset: 10,
			showReturnLink: true,
			returnId: 'returnlink',
			returnText: 'Return to Previous Map'
		}, settings);

		$(this).each(function () {
			var map = $(this);
			$(this).data('currentId', '');

			function showMapById(id) {
				var region = findRegion(settings.map, id);
				if (region != -1) {
					displayMap(region);
				}
			}

			// recursive id find
			function findRegion(root, id) {
				if (root.id == id) {
					return root;
				} else {
					if (root.maps != undefined) {
						for (var i = 0; i < root.maps.length; i++) {
							var possible = findRegion(root.maps[i], id);
							if (possible != -1)
								return possible;
						}
					}
				}
				return -1;
			}

			// region is a map
			// This gets called every time we zoom
			function displayMap(region) {
				//Set Current Region Id
				$(this).data('currentId', region.id);

				//Clear the Map and Set the Background Image
				map.empty().css({
					backgroundImage: 'url(' + region.image + ')',
					width: settings.width,
					height: settings.height
				});
				var check = map.css('background-image');

				//Load RegionData
				loadRegionData(region);
			}
			/************************************************************************************/


			//Show Return Link
			function showReturnLink(region) {
				map.append('<a href="javascript:void(0);" id="' + settings.returnId + '">' + settings.returnText + '</a>');
				$('#' + settings.returnId).hide().fadeIn().click(function () {
					showMapById(region.parent);
				});
			}


			//Load the Bullets 
			function loadRegionData(region) {
				var url = region.data;

				map.load(url, {}, function () {
					//place bullets
					$(this).children('a.bullet').each(function () {
						var coords = $(this).attr('rel').split('-');
						$(this).css({ left: addpx(Number(coords[0]) - settings.bulletWidthOffset), top: addpx(Number(coords[1]) - settings.bulletHeightOffset) })
							   .hide()
							   .click(function () { showPopup($(this).attr('id'), Number(coords[0]), Number(coords[1])) })
							   .fadeIn('fast');
					});
					//Set up each submap as an item to click
					if (region.maps != undefined) {
						for (var i = 0; i < region.maps.length; i++) {
							addZoom(region.maps[i]);
						}
					}
					//Create Return Link
					if (settings.showReturnLink && region.parent != undefined) {
						showReturnLink(region);
					}
					$('#loading').fadeOut();
				});
			}

			function showPopup(id, leftbul, topbul) {
				map.find(settings.popupSelector).fadeOut();
				var boxid = '#' + id + '-box';

				var picid = '#THUMB' + id;
				var picurl = $(picid).attr("data-href");
				$(picid).attr("src", picurl);

				var fheight = topbul - 25 - $(boxid).height();
				$(boxid).css({ left: leftbul, top: fheight });
				$(boxid).fadeIn();
				$(settings.popupCloseSelector).click(function () {
					$(this).parent().fadeOut();
				});
			}

			//add a clickable image for a region on the current map
			function addZoom(region) {
				$('<img />').addClass(settings.zoomClass)
					.attr({
						src: settings.blankImage,
						id: region.id
					}).css({
						position: 'absolute',
						width: region.width,
						height: region.height,
						top: region.top,
						left: region.left,
						cursor: 'pointer'
					}).appendTo(map).click(function () {
						//hide neighboring bullets and zoomables
						var width = settings.width;
						var height = settings.height;
						if (region.scan) {
							width = region.scanwidth;
							height = region.scanheight;
						}

						$(this).hide()
							   .attr('src', region.image).load(function () {
								   $(this).fadeIn('slow')
										   .animate({
											   width: width,
											   height: height,
											   top: '0px',
											   left: '0px'
										   }, settings.zoomDuration, '', function () {
											   displayMap(region);
										   });
							   });
						$(this).siblings().fadeOut();
						$(this).hide().attr('src', region.image);
					});
			}

			function rempx(string) {
				return Number(string.substring(0, (string.length - 2)));
			}

			function addpx(string) {
				return string + 'px';
			}

			function showHash(string) {
				string = string.replace('#', '');
				showMapById(string);
			}

			//initialize map
			var hash = self.document.location.hash;
			if (hash.length > 0)
				showHash(hash);
			else {
				displayMap(settings.map);
			}

			return this;
		});
	}
})(jQuery);
