
/**
 * ----------------------------------------------------------------------------
 * Copyright (c) 2009 by Hansadigit
 * Hamburg, Germany
 * ----------------------------------------------------------------------------
 * Original Author of file: Oliver Oestrup <info@hansadigit.de>
 * ----------------------------------------------------------------------------
 **/

function tx_lumogooglemaps_draw(mapId, cfg, browserAlert) {
	
	var siteLoaded = false;
	
	window.onload = addEvents(window.onload, function() {
		siteLoaded = true;
		init();
	});
	
	window.onshowmap = addEvents(window.onshowmap, function() {
		init();
	});
	
	function init() {
		
		if(!siteLoaded || !window.showmap) {
			return;
		}
		
		var loading = true;
		
		if(GBrowserIsCompatible()) {
			
			window.onunload = addEvents(window.onunload, GUnload);
			
			// Force SVG on also on Linux and BSD machines
			if(navigator.platform.match(/linux|bsd/i)) {
				_mSvgEnabled = _mSvgForced = true;
			}
			
			var defaultIcon = new GIcon(G_DEFAULT_ICON);
			defaultIcon.image = 'fileadmin/templates/imgs/gmap/marker.png';
			defaultIcon.shadow = 'fileadmin/templates/imgs/gmap/marker_shadow.png';
			defaultIcon.iconSize = new GSize(29, 51);
			defaultIcon.shadowSize = new GSize(54, 50);
			defaultIcon.iconAnchor = new GPoint(14, 51);
			defaultIcon.infoWindowAnchor = new GPoint(14, 2);
			defaultIcon.printImage = 'fileadmin/templates/imgs/gmap/marker_ie.gif';
			defaultIcon.mozPrintImage = 'fileadmin/templates/imgs/gmap/marker_ff.gif';
			defaultIcon.printShadow = 'fileadmin/templates/imgs/gmap/marker_shadow_dith.gif';
			defaultIcon.transparent = 'fileadmin/templates/imgs/gmap/marker_trans.png';
			defaultIcon.imageMap = [12,0, 13,0, 14,0, 15,0, 16,0, 17,1, 18,1, 19,1, 20,2, 21,2, 22,3, 23,4, 24,4, 24,5, 25,6, 26,7, 26,8, 27,9, 27,10, 27,11, 28,12, 28,13, 28,14, 28,15, 28,16, 27,17, 27,18, 27,19, 26,20, 26,21, 25,22, 25,23, 24,24, 23,25, 22,26, 21,27, 20,28, 20,29, 19,30, 19,31, 18,32, 18,33, 17,34, 17,35, 17,36, 17,37, 16,38, 16,39, 16,40, 16,41, 15,42, 15,43, 15,44, 15,45, 15,46, 15,47, 14,48, 14,49, 14,48, 14,47, 13,46, 13,45, 13,44, 13,43, 13,42, 12,41, 12,40, 12,39, 12,38, 12,37, 11,36, 11,35, 11,34, 10,33, 10,32, 9,31, 9,30, 8,29, 8,28, 7,27, 6,26, 5,25, 4,24, 4,23, 3,22, 2,21, 2,20, 1,19, 1,18, 1,17, 0,16, 0,15, 0,14, 0,13, 0,12, 1,11, 1,10, 1,9, 2,8, 2,7, 3,6, 4,5, 5,4, 6,3, 7,2, 8,2, 9,1, 10,1, 11,1];


			var icon = new GIcon(defaultIcon);
			icon.image = 'fileadmin/templates/imgs/gmap/marker1.png';
			
			
			var icon50 = new GIcon(defaultIcon);
			icon50.image = 'fileadmin/templates/imgs/gmap/marker1_50.png';
			icon50.shadow = 'fileadmin/templates/imgs/gmap/marker_shadow_50.png';
			
			var moImage = 'fileadmin/templates/imgs/gmap/marker1_mo.png';
			
			var color1 = {color:'#00ff00', icon:icon, icon50:icon50, moImage:moImage};
			
			
			var icon = new GIcon(defaultIcon);
			icon.image = 'fileadmin/templates/imgs/gmap/marker2.png';
			
			var icon50 = new GIcon(defaultIcon);
			icon50.image = 'fileadmin/templates/imgs/gmap/marker2_50.png';
			icon50.shadow = 'fileadmin/templates/imgs/gmap/marker_shadow_50.png';
			
			var moImage = 'fileadmin/templates/imgs/gmap/marker2_mo.png';
			
			var color2 = {color:'#ff0000', icon:icon, icon50:icon50, moImage:moImage};
			
			
			var polyColors = [color1, color2, color2, color2];
			var polyList = [];
			
			var map = new GMap2(document.getElementById(mapId), {draggableCursor:'auto', draggingCursor:'move'});
			map.setCenter(new GLatLng(cfg.feldX, cfg.feldY), cfg.feldZ);
			// map.addMapType(G_PHYSICAL_MAP);
			map.setMapType(G_SATELLITE_MAP);
			//var hierarchy = new GHierarchicalMapTypeControl();
			//hierarchy.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, "Labels", true);
			map.addControl(new GMapTypeControl());
			map.addControl(new GLargeMapControl());
			map.disableDoubleClickZoom();
			
			for(var x in cfg.polies) {
				addPoly(cfg.polies[x].id, cfg.polies[x].pts, cfg.polies[x].status);
			}

			setMarkers();
			
			/*var search_submit = document.getElementById('hainSearch_submit');
			var search_id = document.getElementById('hainSearch_id');
			if(search_submit && search_id) {
				search_id.form.onsubmit = function() {
					searchPoly(search_id.value);
					return false;
				}
				search_submit.onclick = search_id.form.onsubmit;
			}*/
		}
		else {
			alert(browserAlert);
		}
		
		function addPoly(id, pts, status) {
			
			var info = '<div style="text-align: center; padding: 20px;"><img src="fileadmin/templates/imgs/gmap/loader.gif" width="32" height="32" /></div>';
			var infoLoaded = false;
			
			var x = 0;
			var y = 0;
			
			for(var i = 0; i < pts.length; i++) {
				x += pts[i].lat();
				y += pts[i].lng();
			}
			
			x /= pts.length;
			y /= pts.length;
			
			var pt = new GLatLng(x, y);
			var ptUp = new GLatLng(pt.lat() + 0.00005, pt.lng());
			
			var lines = [];
			
			for(var i = 0; i < pts.length; i++) {
				var line = new GPolyline([ptUp, pts[i]], '#000000', 1.3, 1, {clickable:false});
				//line.hide();
				lines.push(line);
				//map.addOverlay(line);
			}
			
			var marker = new GMarker(pt, {icon:polyColors[status].icon});
			
			var moTimer;
			var mode = 1;
			var infoClose = true;
			
			GEvent.addListener(marker, "click", function() {
				if(loading) return;
				if(mode == 4) {
					setMode(3);
				}
				else {
					setMode(4);
				}
			});
			
			GEvent.addListener(marker, "mouseover", function() {
				if(mode == 1) {
					setMode(2);
				}
				moTimer = window.setTimeout(function() {
					if(mode == 2) {
						setMode(3);
					}
				}, 1000);
			});
			
			GEvent.addListener(marker, "mouseout", function() {
				window.clearTimeout(moTimer);
				if(mode == 2) {
					setMode(1);
				}
			});
			
			GEvent.addListener(marker, "infowindowclose", function() {
				if(infoClose) {
					setMode(1);
				}
			});
			
			
			var poly = {id:id, pts:pts, setMode:setMode, marker:marker};
			polyList.push(poly);
			
			
			function setMode(newMode) {
				if(newMode > mode + 1) {
					setMode(newMode - 1);
				}
				if(newMode < mode - 1) {
					setMode(newMode + 1);
				}
				var oldMode = mode;
				if(newMode < oldMode) {
					switch(mode) {
						case 1:
							marker.hide();
							break;
							
						case 2:
							marker.setImage(polyColors[status].icon.image);
							break;
						
						case 3:
							closeInfo();
							break;
						
						case 4:
							for(var x in polyList) {
								if(polyList[x] != poly) {
									polyList[x].setMode(1);
								}
							}
							for(var x in lines) {
								//lines[x].hide();
								map.removeOverlay(lines[x]);
							}
							marker.setLatLng(pt);
							showInfo();
							break;
					}
				}
				mode = newMode;
				if(newMode > oldMode) {
					switch(mode) {
						case 1:
							marker.show();
							break;
						
						case 2:
							marker.setImage(polyColors[status].moImage);
							break;
							
						case 3:
							showInfo();
							break;
						
						case 4:
							for(var x in lines) {
								//lines[x].show();
								map.addOverlay(lines[x]);
							}
							for(var x in polyList) {
								if(polyList[x] != poly) {
									polyList[x].setMode(0);
								}
							}
							marker.setLatLng(ptUp);
							showInfo();
							break;
					}
				}
			}
			
			function showInfo() {
				if(mode < 3) {
					return;
				}
				if(!infoLoaded) {
					infoLoaded = true;
					var ajax = new Ajax;
					ajax.response = function() {
						info = this.data;
						showInfo();
					};
					ajax.request('', {hainInfo:id});
				}
				infoClose = false;
				marker.openInfoWindowHtml(info);
				infoClose = true;
			}
			
			function closeInfo() {
				infoClose = false;
				marker.closeInfoWindow();
				infoClose = true;
			}
		}
		
		function setMarkers(x) {
			if(typeof x == 'undefined') {
				x = 0;
			}
			for(var y = x; y < polyList.length && y - x <= 15; y++) {
				map.addOverlay(polyList[y].marker);
			}
			if(y < polyList.length) {
				window.setTimeout(function() {
					setMarkers(y);
				}, 1);
			}
			else {
				loading = false;
				if(typeof cfg.showHain != 'undefined') {
					showPoly(cfg.showHain);
				}
			}
		}
		
		function searchPoly(id) {
			id = id.replace(/^\s*|\s*$/, '');
			
			if(id.search(/\D/) == -1) {
				return showPoly(Number(id));
			}
			else {
				var geo = id.split(',');
				if(geo.length == 2) {
					var x = Number(geo[0].replace(/^\s*|\s*$/, ''));
					var y = Number(geo[1].replace(/^\s*|\s*$/, ''));
					for(var i = 0; i < polyList.length; i++) {
						var ok = true;
						for(var j1 = 0; j1 < polyList[i].pts.length; j1++) {
							
							var j2 = (j1 + 1 < polyList[i].pts.length)? j1 + 1 : 0;
							var j3 = (j2 + 1 < polyList[i].pts.length)? j2 + 1 : 0;
							
							var x1 = polyList[i].pts[j1].lat();
							var y1 = polyList[i].pts[j1].lng();
							var x2 = polyList[i].pts[j2].lat();
							var y2 = polyList[i].pts[j2].lng();
							var x3 = polyList[i].pts[j3].lat();
							var y3 = polyList[i].pts[j3].lng();
							
							if(x1 == x2 && y1 == y2) continue;
							
							var p1 = testPoint(x, y, x1, y1, x2, y2);
							var p2 = testPoint(x3, y3, x1, y1, x2, y2);
							
							if((p2 > 0)? (p1 < 0) : (p1 > 0)) {
								ok = false;
								break;
							}
						}
						if(ok) {
							polyList[i].setMode(3);
							return true;
						}
					}
				}
			}
			
			return false;
		}
		
		function testPoint(x, y, x1, y1, x2, y2) {
			return (x1 < x2)? (y2 - y1) * (x - x1) / (x2 - x1) + y1 - y : (x2 - x1) * (y - y1) / (y2 - y1) + x1 - x;
		}
		
		function showPoly(id) {
			for(var i = 0; i < polyList.length; i++) {
				if(polyList[i].id == id) {
					polyList[i].setMode(3);
					return true;
				}
			}
			return false;
		}
	}
	
	function addEvents() {
		var events = (typeof arguments != 'undefined')? arguments : addEvents.arguments;
		return function(e) {
			for(var x = 0; x < events.length; x++) {
				if(typeof events[x] == 'function') {
					var r1 = events[x](e);
					if(typeof r1 == 'boolean' && !r1) {
						return false;
					}
				}
			}
			return true;
		}
	}
}
