/*
* Copyright (C) 2009 Joel Sutherland.
* Liscenced under the MIT liscense
* TODO:
* 1. Create API
* 2. Address accesibility automatically
* 3. Make object oriented
*/

var context;
var mousein = false;
var regionMap = new Array(20);
var selectedRegion = null;
var definedSearch  = null;

var lastSelectedMap = null;
var rootRegion = null;
var mouseIsInner = false;
var timeout = null;

function displaycolor(colorid)
{
	if(colorid==0)
	{
		$('.marker1').css({visibility: 'hidden'});
		$('.marker0').css({visibility: 'visible'});
		$('.marker3').css({visibility: 'hidden'});
		$('.marker4').css({visibility: 'hidden'});
	}
	if(colorid==1)
	{
		$('.marker1').css({visibility: 'visible'});
		$('.marker0').css({visibility: 'hidden'});
		$('.marker3').css({visibility: 'hidden'});
		$('.marker4').css({visibility: 'hidden'});
	}
	if(colorid==2)
	{
		$('.marker1').css({visibility: 'visible'});
		$('.marker0').css({visibility: 'visible'});
		$('.marker3').css({visibility: 'visible'});
		$('.marker4').css({visibility: 'visible'});
	}		
	if(colorid==3)
	{
		$('.marker1').css({visibility: 'hidden'});
		$('.marker0').css({visibility: 'hidden'});
		$('.marker3').css({visibility: 'visible'});
		$('.marker4').css({visibility: 'hidden'});
	}		
	if(colorid==4)
	{
		$('.marker1').css({visibility: 'hidden'});
		$('.marker0').css({visibility: 'hidden'});
		$('.marker3').css({visibility: 'hidden'});
		$('.marker4').css({visibility: 'visible'});
	}	




}
(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'
		}, 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({
					background: 'url(' + region.image + ') center center no-repeat',
					//backgroundImage: 'url(' + region.image + ')',
					//backgroundPosition: 'center top',
					width: settings.width,
					height: settings.height
				});
				var check = map.css('background-image');
				
				//Load RegionData
				loadRegionData(region);
			}
			/************************************************************************************/
			

			function toHex(N) {
			 if (N==null) return "00";
			 N=parseInt(N); if (N==0 || isNaN(N)) return "00";
			 N=Math.max(0,N); N=Math.min(N,255); N=Math.round(N);
			 return "0123456789ABCDEF".charAt((N-N%16)/16)
			      + "0123456789ABCDEF".charAt(N%16);
			}


			function getColorFromData(data)
			{
				if (0 == data[3])
					return "#FFFFFF";
				return "#"+toHex(data[0])+toHex(data[1])+toHex(data[2]);
			}

			function isPointInPoly(poly, pt){
			    for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)
			        ((poly[i].y <= pt.y && pt.y < poly[j].y) || (poly[j].y <= pt.y && pt.y < poly[i].y))
			        && (pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x)
			        && (c = !c);					
			    return c;
			}

			
			//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);
					$('#mapPopupLayer').fadeOut('slow').hide();

					$('#italia_layer').show();
				});
			}
			
			$('.mapPopup').mouseover(function(e)  {
				mouseIsInner = 'true';
				clearTimeout(timeout);

			});

			$('.mapPopup').mouseout(function(e) {
				mouseIsInner = 'false';
				timeout = setTimeout(function(){
					if (mouseIsInner == 'false')
						$('#mapPopupLayer').fadeOut('slow').hide();
				}, 2000);
			});

			//Load the Bullets 
			function loadRegionData(region){


				if (rootRegion == null)
					rootRegion = region;
				var url = "./map.php?stateId="+region.id;
				if (rootRegion == region)
					url = url + "&nolink=yes";

				map.load(url, {}, function(){



					$('a.bullet').mouseover(function(e) {
						if ($(this).attr('tooltip') != "")
						{
							mouseIsInner = 'true';
							$('#mapPopupLayer').fadeIn('slow').show();
							$('#mapPopupLayer').css({
								marginTop: addpx(Number($(this).position().top - 120)),
								marginLeft: addpx(Number($(this).position().left  )),
								zIndex: '300' 
							}); 
							$('#mapPopupLayer_data').html( $(this).attr('tooltip'));
							clearTimeout(timeout);
			$('.mapPopup').mouseover(function(e)  {
				mouseIsInner = 'true';
				clearTimeout(timeout);

			});

			$('.mapPopup').mouseout(function(e) {
				mouseIsInner = 'false';
				timeout = setTimeout(function(){
					if (mouseIsInner == 'false')
						$('#mapPopupLayer').fadeOut('slow').hide();
				}, 1000);
			});
						}	
					});

					$('a.bullet').mouseout(function(e) {
						mouseIsInner = 'false';
							timeout = setTimeout(function(){
								if (mouseIsInner == 'false')
									$('#mapPopupLayer').fadeOut('slow').hide();
							}, 1000);
					
					});

					//place bullets
					$(this).children('.bullet').each(function(){
						var coords = $(this).attr('rel').split('-');
						if (!region.clickable)
							$(this).attr('href', "#");
						$val = $(this).attr('zIndex');
						if (region.offsetX)
							coords[0] = coords[0] - region.offsetX;						
						if (region.offsetY)
							coords[1] = coords[1] - region.offsetY;
						if (region.zoomX)
							coords[0] *= region.zoomX;						
						if (region.zoomY)
							coords[1] *= region.zoomY;
						
						$(this).css({zIndex:  $val, left: addpx(Number(coords[0]) - rempx(settings.bulletWidthOffset)), top: addpx(Number(coords[1]) - rempx(settings.bulletHeightOffset))})
							   .hide()
							   .click(function(){if (region.clickable) { showPopup($(this).attr('id')); }})
							   .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);
					}						
				});

				if (!context)
				{
					var img = new Image();
					img.src = $(region).attr('image');
					//context = document.getElementById('canvasmap').getContext('2d');
					//context.drawImage(img, 0, 0);
					reloadMapMouse(region);

				}

				selectedRegion = region;

			}

			function getPos(el) {
			    // yay readability
			    for (var lx=0, ly=0;
			         el != null;
			         lx += el.offsetLeft, ly += el.offsetTop, el = el.offsetParent);
			    return {x: lx,y: ly};
			}



			function reloadMapMouse(region)
			{
				$('#locationsMap').mousemove(function(e) {
					if (selectedRegion.id == 'campus')
					{
					var positionOffsetX = parseInt(getPos(document.getElementById('locationsMap')).x);
				
					$(this).children('img').each(function(){
						var polygons = regionMap[this.id].polygons;
						if (isPointInPoly(polygons, {x: parseInt(e.pageX-positionOffsetX-selectedRegion.mapOffsetX), y: parseInt(e.pageY-selectedRegion.mapOffsetY)}) == true )
						{
							if (lastSelectedMap != null)
							{
								//hide neighboring bullets and zoomables
								$(lastSelectedMap).attr('src', 'design/normal/images/karte/blank.gif').load(function(){});
								lastSelectedMap = null;
								mousein = false;
							}

							//if (!mousein)
							//{		
								mousein  = true;

								var width = settings.width;
								var height = settings.height;
								if(region.scan){
									width = region.scanwidth; 
									height = region.scanheight;
								}
								$(this).attr('src', $(this).attr('image'));

								$(this).css({visibility: 'visible'});
								lastSelectedMap = this;
							//}

						}
						if (lastSelectedMap == this && isPointInPoly(polygons, {x: parseInt(e.pageX-positionOffsetX-selectedRegion.mapOffsetX), y: parseInt(e.pageY-selectedRegion.mapOffsetY)}) == false)
						{
							//hide neighboring bullets and zoomables
							$(lastSelectedMap).attr('src', 'design/normal/images/karte/blank.gif').load(function(){
								
							});
							lastSelectedMap = null;
							mousein = false;	
						}
					});

					}
				});


				


				$('#locationsMap').click(function(e){
					var clickedMap = null;
					$(this).children('img').each(function(){
						var positionOffsetX = parseInt(getPos(document.getElementById('locationsMap')).x);
						var polygons = regionMap[this.id].polygons;
						if (isPointInPoly(polygons, {x: parseInt(e.pageX-positionOffsetX-selectedRegion.mapOffsetX), y: parseInt(e.pageY-selectedRegion.mapOffsetY)}) == true)
						{	
							clickedMap = this;
							
						}
						})

					if (clickedMap != null)
					{
							$('#neu_layer').hide();
							var map = clickedMap;
							region = regionMap[map.id];
							//hide neighboring bullets and zoomables
							var width = '450px';
							var height = '500px';
							if(region.scan){
								width = region.scanwidth;
								height = region.scanheight;
							}
	
							selectedRegion = region;
							$(map).siblings().fadeOut(); 
							//$(lastSelectedMap).attr('src', 'design/normal/images/karte/blank.gif').load(function(){});

//							$(map).hide()
//								   .attr('src', "/"+$(map).attr('image')).load(function(){
										$(map).fadeIn('slow')
											   .animate({
													width: width,
													height: height,
													top:  '68px',
													left: '18px'
												}, settings.zoomDuration, '', function(){
													displayMap(region);
										});
									//});
					}


					lastSelectedMap  = null;
					mousein = false;
					});
			}
			
			function showPopup(id, leftbul, topbul){
				map.find(settings.popupSelector).fadeOut(); 

			}
			

			

			//add a clickable image for a region on the current map
			function addZoom(region){

					Bild01 = new Image();
					Bild01.src = region.image;
					var polygonMap = new Array();

					if (region.poly != undefined) 
					{						
						var arr = new String(region.poly).split(",");
						var lastX, lastY, i = 0;
						for (var x=0; x<arr.length; x++)
						{
							if (x%2 == 0)
								lastX = arr[x];
							else
							{
								polygonMap[i] = {x: lastX*rootRegion.polyScaleX, y: arr[x]*rootRegion.polyScaleY};
								i = i + 1;
							}
						}
					}
					region.polygons = polygonMap;

					regionMap[region.id] = $('<img />').addClass(settings.zoomClass)
					.attr({
						src: settings.blankImage,
						mapColor: region.mapColor,
						image: region.image,
						id: region.id,
						polygons: polygonMap
					}).css({
						position: 'absolute',
						width: region.width,
						height: region.height,
						top: region.top,
						left: region.left,
						cursor: 'pointer',
						visibility: 'hidden'
					}).appendTo(map);

					regionMap[region.id] = 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);
