/*
* 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:		1000,
			zoomClass:			'zoomable',
			popupSelector:		'div.popup',
			popupCloseSelector:	'a.close',
			bulletWidthOffset:	'10px',
			bulletHeightOffset:	'10px',
			showReturnLink:		true,
			returnId:			'returnlink',
			returnText:			'Return to Previous Map',
			legende:			'Legende',
			standorttitle:		'Die CMCO Standorte dieses Kartenausschnittes befinden sich in:',
			keinestandorte:		'In dieser Region gibt es noch keine Standorte.',
			defaulttitle:		'Ziehen Sie die Maus über die Karte, um einzelne Regionen zu zoomen und genaue Standortinformationen zu erhalten.'
		}, 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.css({
					backgroundImage: 'url(' + region.image + ')',
					width: region.width_zoom,
					height: region.height_zoom,
					top: region.top_zoom,
					left: region.left_zoom
				}).html('');
				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(){
					$('#Standortkarte').html('Lade Kartendaten');
					//place bullets
					var standortkarte_kl = Array();
					$(this).children('a.bullet').each(function(){
						var coords = $(this).attr('rel').split('-');
						$(this).css({left: addpx(Number(coords[0]) - rempx(settings.bulletWidthOffsethalf)), top: addpx(Number(coords[1]) - rempx(settings.bulletHeightOffsethalf))})
							   .hide()
							   .click(function(){showPopup($(this).attr('id'));})
							   .fadeIn('fast');
						
						var kl_flag = true;
						for (i = 0; i < standortkarte_kl.length; i++) {
							if (standortkarte_kl[i] == $(this).attr('Kontinent')) {
								kl_flag = false;
								break;
							}
						}
						if(kl_flag == true) {
							standortkarte_kl.push($(this).attr('Kontinent') + '-' + $(this).attr('Land'));
						}
					});
					standortkarte_kl.sort();
					var standortkarte = '';
					var standortkarte_flag_k = '';
					var standortkarte_flag_l = '';
					for (i = 0; i < standortkarte_kl.length; i++) {
						standortkarte_kl_split = standortkarte_kl[i].split('-');
						if(standortkarte_kl_split[0] != standortkarte_flag_k) {
							standortkarte_flag_k = standortkarte_kl_split[0];
							standortkarte = standortkarte + '<b>' + settings.legende + '</b><br /><br /> - ' + settings.standorttitle + '<br /><br /><b>' + standortkarte_kl_split[0] + '</b><br />';
						}
						if(standortkarte_kl_split[1] != standortkarte_flag_l) {
							standortkarte_flag_l = standortkarte_kl_split[1];
							standortkarte = standortkarte + standortkarte_kl_split[1] + '<br />';
						}
					}
					if(standortkarte == '') {
						standortkarte = settings.keinestandorte;
					}
					$('#Standortkarte').html(standortkarte);
					//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);
					}
					
					if($('#Standortkarte').html() == 'Lade Kartendaten') {
						$('#Standortkarte').html(settings.defaulttitle);
					}						
				});
			}
			
			function showPopup(id, leftbul, topbul){
				map.find(settings.popupSelector).fadeOut(); 
				var boxid = '#' + id + '-box';
				
				$(boxid).fadeIn();
				$(settings.popupCloseSelector).click(function(){
					$(this).parent().fadeOut();
				});
			}
			
			//add a clickable image for a region on the current map
			function addZoom(region){
				$('#Standortkarte').html('Lade Kartendaten');
				$('<div />').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).siblings().fadeOut();
						$(this).replaceWith('<img src="' + region.image + '" id="' + region.id + '" style="position: absolute; width: ' + region.width + '; height: ' + region.height + '; top: ' + region.top + '; left: ' + region.left + ';" />').ready(function(){
							$('#' + region.id).hide().load(function(){
									$(this).fadeIn('slow').animate({
												width: settings.width_zoom,
												height: settings.height_zoom,
												top: settings.top_zoom,
												left: settings.left_zoom
											}, settings.zoomDuration, '', function(){
												$('#' + region.id).ready(function(){
													displayMap(region);
												});
											});
								});
							});
					});
			}
			
			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);
