var geopos_datapoints = new Array();
var geopos_map = null;
var geopos_markers = null;
var geopos_strings = new Array();
var geopos_zoomValue = 11;
var geopos_doCenter = true;
var geopos_openinfo = false;
var geopos_loadgroup = null;
var currentContainer = currentMap = null;
var dragContainer = null;
var dragData = null;
var actNavBox = "info";
var direction = null;

function geopos_showInfo(marker, id) {
	var textPos = geopos_datapoints[id][5];
	var textInfo = geopos_datapoints[id][7];
	var point = new GLatLng(geopos_datapoints[id][2], geopos_datapoints[id][3]);
	var infoArr = [];
	if (textInfo.length > 0) {
		infoArr.push(new GInfoWindowTab(geopos_strings["info"], textInfo));
	}
	if (textPos.length > 0) {
		infoArr.push(new GInfoWindowTab(geopos_strings["about"], textPos));
	}
	marker.openInfoWindowTabsHtml(infoArr);
}

function geopos_createMarker(point, id, icon) {
	var marker = new GMarker(point, icon);
	GEvent.addListener(marker, "click",
		function() {
			geopos_showInfo(marker, id);
		});
	return marker;
}

function geopos_moveToMarker(id, delay) {
   delay = delay || 1000;
	if (geopos_markers && geopos_markers.length>0) {
		var point = new GLatLng(geopos_markers[id][1].lat(), geopos_markers[id][1].lng());
		if (geopos_openinfo) {
			window.setTimeout(function() {
				geopos_showInfo(geopos_markers[id][0], id);
			}, delay);
		}
		else if (geopos_doCenter) {
			geopos_map.panTo(point);
		}
	}
}

function geopos_removePopupMap() {
	var mapbox = document.getElementById(currentContainer);
	var b = document.getElementsByTagName("BODY")[0];
	try {
		GUnload();
		b.removeChild(mapbox);
	}
	catch (err) {
		var terror = err;
	}
	geopos_datapoints = [];
	geopos_map = null;
	geopos_markers = null;
}

function geopos_fillMarkers() {
	(geopos_markers) ? geopos_markers.length=0 : geopos_markers=new Array();
	var iconList = new Array();
	iconList["df"] = new Array(null,"/simage/gp_mark_01.png","/simage/gp_mark_01_shadow.png",11,15,18,15,4,15,4,2);
	iconList["gw"] = new Array(null,"/simage/gp_mark_02.png","/simage/gp_mark_02_shadow.png",11,15,18,15,4,15,4,2);
	iconList["ev"] = new Array(null,"/simage/gp_mark_03.png","/simage/gp_mark_03_shadow.png",11,15,18,15,4,15,4,2);
	iconList["im"] = new Array(null,"/simage/gp_mark_04.png","/simage/gp_mark_04_shadow.png",11,15,18,15,4,15,4,2);
	iconList["nw"] = new Array(null,"/simage/gp_mark_05.png","/simage/gp_mark_05_shadow.png",11,15,18,15,4,15,4,2);
	iconList["st"] = new Array(null,"/simage/gp_mark_06.png","/simage/gp_mark_06_shadow.png",11,15,18,15,4,15,4,2);
	iconList["en"] = new Array(null,"/simage/gp_mark_07.png","/simage/gp_mark_07_shadow.png",11,15,18,15,4,15,4,2);
   iconList["gp"] = new Array(null,"/simage/gp_mark_01.png","/simage/gp_mark_01_shadow.png",11,15,18,15,4,15,4,2);

	var icon = null;
	for (var i in iconList) {
		icon = new GIcon();
		icon.image = iconList[i][1];
		icon.shadow = iconList[i][2];
		icon.iconSize = new GSize(iconList[i][3], iconList[i][4]);
		icon.shadowSize = new GSize(iconList[i][5], iconList[i][6]);
		icon.iconAnchor = new GPoint(iconList[i][7], iconList[i][8]);
		icon.infoWindowAnchor = new GPoint(iconList[i][9], iconList[i][10]);
		iconList[i][0] = icon;
	}

	var marker, point, tpid;
	for(var i=0;i<geopos_datapoints.length;i++) {
		if (geopos_datapoints[i][1]!="dp") {
			tpid = (geopos_datapoints[i][1]!="") ? geopos_datapoints[i][1] : "df";
			point = new GLatLng(geopos_datapoints[i][2], geopos_datapoints[i][3]);
			marker = geopos_createMarker(point, i, iconList[tpid][0]);
			geopos_markers[i] = new Array(marker, point);
			geopos_map.addOverlay(marker);
		}
	}
}

function geopos_displayMap() {
	var id = document.getElementById(currentContainer);
	id.style.display = "block";
	if (!geopos_map || !geopos_markers || geopos_markers.length==0) {
		if (!geopos_map) {
			geopos_map = new GMap2(document.getElementById(currentMap));
			geopos_map.addControl(new GSmallMapControl());

			if (typeof(geopos_navmap_showovmap) != "undefined" && geopos_navmap_showovmap) {
				var ovcontrol = new GOverviewMapControl(new GSize(100,80));
				geopos_map.addControl(ovcontrol);

				var overmap = document.getElementById(currentMap+"_overview");
            if ( overmap ) {
               overmap.firstChild.style.border = "1px solid gray";
               overmap.firstChild.style.width = "100px";
               overmap.firstChild.style.height = "80px";
               overmap.firstChild.firstChild.style.width = "96px";
               overmap.firstChild.firstChild.style.height = "76px";
               overmap.firstChild.firstChild.style.left="1px";
               overmap.firstChild.firstChild.style.top="1px";
            }
			}

			if (typeof(geopos_navmap_hidemapcontrols) != "undefined" && geopos_navmap_hidemapcontrols) {
				geopos_map.hideControls();
				GEvent.addListener(geopos_map, "mouseover", function(){
					geopos_map.showControls();
					});
				GEvent.addListener(geopos_map, "mouseout", function(){
					geopos_map.hideControls();
					});
			}

			geopos_map.setCenter(new GLatLng(geopos_datapoints[0][2], geopos_datapoints[0][3]), geopos_zoomValue, G_NORMAL_MAP);
		}

		geopos_fillMarkers();
	}
	else {
		geopos_map.setZoom(geopos_zoomValue);
	}
	geopos_moveToMarker(0);
}

function geopos_processView() {
	if (actNavBox == "info") {
		var tog = new Array("gpmap_nav_toggleevents1","gpmap_nav_togglenews1","gpmap_nav_togglegenweb1","gpmap_nav_toggleimages1");
		var togstr = "";
		var id = null;
		for (var i=0;i<tog.length;i++) {
			id = document.getElementById(tog[i]);
			if (id && id.checked) {
				togstr += (togstr.length>0) ? "," : "";
				togstr += id.value;
			}
		}

		var bounds = geopos_map.getBounds();
		var ne = bounds.getNorthEast();
		var sw = bounds.getSouthWest();
		var url = geopos_mapurl_bounds+"&bnelt="+ne.lat()+"&bnelg="+ne.lng()+"&bswlt="+sw.lat()+"&bswlg="+sw.lng();

		url += (togstr.length>0) ? "&ibtyp="+togstr : "";
		geopos_map.clearOverlays();
		geopos_doCenter = false;
		perform_Req(url);
	}
	if (actNavBox == "route") {
		var routid = document.getElementById("routes");
		var routval = routid.options[routid.selectedIndex].value;
		var url = geopos_mapurl_route+"&rid="+routval;
		geopos_map.clearOverlays();
		geopos_doCenter = false;
		perform_Req(url);
	}
}

function geopos_initPopupMap() {
	currentContainer = "gpmap_mpc";
	currentMap = currentContainer+"_map";
	dragContainer = currentContainer;
	if (!document.getElementById(currentContainer)) {
		var mapbox = document.createElement("DIV");
		mapbox.setAttribute("id", currentContainer);
		mapbox.style.left =
			(getAgentGeometry("viewright") > mousePos[0]+400) ? mousePos[0]+"px" : eval(mousePos[0]-400)+"px";
		mapbox.style.top =
			(getAgentGeometry("viewbottom") > mousePos[1]+300) ? mousePos[1]+"px" : eval(mousePos[1]-300)+"px";

		var commentfield = document.createElement("DIV");
		commentfield.setAttribute("id", currentContainer+"_comment");
		if (document.addEventListener) {
			commentfield.addEventListener("mousedown", dragSet, false);
			commentfield.addEventListener("mouseup", dragUnset, false);
		}
		else if (document.attachEvent) {
			commentfield.attachEvent("onmousedown", dragSet);
			commentfield.attachEvent("onmouseup", dragUnset);
		}

		var linkfield = document.createElement("A");
		linkfield.setAttribute("id", currentContainer+"_linkclose");
		linkfield.setAttribute("href", "javascript:geopos_removePopupMap()");
		commentfield.appendChild(linkfield);
		mapbox.appendChild(commentfield);

		var mapfield = document.createElement("DIV");
		mapfield.setAttribute("id", currentMap);
		mapbox.appendChild(mapfield);

		var b = document.getElementsByTagName("BODY")[0];
		b.appendChild(mapbox);
	}
}

function geopos_initMap() {
	currentContainer = "gpmap_mc";
	currentMap = currentContainer+"_map";
}

function ws_Callback_GeoPosDirection( response ) {

   if ( !geopos_map ) return false;

   if ( !direction ) {
      direction = new GDirections( geopos_map );
   }
   var pos1 = xml_getSTValue( response, 'posstart' );
   var pos2 = xml_getSTValue( response, 'posend' );

   direction.clear();
   direction.load( 'from:' + pos1 + ' ' + 'to:' + pos2, {
      preserveViewpoint: true
      }
    );

}

function ws_Callback_GeoPosGMapping(response) {
	geopos_datapoints.length = 0;
	(geopos_markers) ? geopos_markers.length=0 : null;
	var strlist = response.getElementsByTagName("strings")[0];
	var geoentry = response.getElementsByTagName("geoentry");
   var zoomFit = [];
	var geoList = new Array();
	for (var i=0;i<geoentry.length;i++) {
		var geopos = geoentry[i].getElementsByTagName("geopos")[0];
		var entry = geoentry[i].getElementsByTagName("entry")[0];
		geoList = new Array(
			xml_getSTValue(geopos, "id"),
			xml_getSTValue(geopos, "ibtp"),
			xml_getSTValue(geopos, "lat"),
			xml_getSTValue(geopos, "long"),
			xml_getSTValue(geopos, "title"),
			xml_getSTValue(geopos, "html"),
			"",
			""
			);
		if (entry) {
			geoList[7] = xml_getSTValue(entry, "html");
		}
		if (geoList[0]!="") {
			geopos_datapoints.push(geoList);
         zoomFit.push( new GLatLng( geoList[2], geoList[3]) );
		}
	}
	geopos_strings["close"] = xml_getSTValue(strlist, "close");
	geopos_strings["about"] = xml_getSTValue(strlist, "about");
	geopos_strings["info"] = xml_getSTValue(strlist, "info");
	geopos_openinfo = xml_getSTValue(response, "opentab") ? true : false;
	if (document.getElementById(currentContainer+"_linkclose")) {
		document.getElementById(currentContainer+"_linkclose").innerHTML = geopos_strings["close"];
	}
   // Check zoom level.
   if ( xml_getSTValue(response, 'zoomlevel' ) ) {

      geopos_zoomValue = parseInt( xml_getSTValue(response, 'zoomlevel' ) );
      
   }
	geopos_displayMap();
   // Check zoom to fit.
   if ( xml_getSTValue(response, 'zoomtofit' ) ) {

      var bounds = new GLatLngBounds();
      for ( var i=0; i< zoomFit.length; i++ ) {
         bounds.extend( zoomFit[i] );
      }
      geopos_map.setZoom( geopos_map.getBoundsZoomLevel( bounds ) );
      geopos_map.setCenter( bounds.getCenter() );

   }

}

var mousePos = [0,0];

function mouseTrap(e) {
	var posx = 0;
	var posy = 0;
	if (!e) var e = window.event;
	if (e.pageX || e.pageY) {
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY) {
		posx = e.clientX;
		posy = e.clientY;
		if (isIE) {
			posx += getAgentGeometry("viewleft");
			posy += getAgentGeometry("viewtop");
		}
	}
	mousePos = [posx,posy];
	if (dragData) {
		var id = document.getElementById(dragData[0]);
		var x = parseInt(id.style.left,10);
		var y = parseInt(id.style.top,10);
		var dx = posx-dragData[1];
		var dy = posy-dragData[2];
		id.style.left = (x+dx) + "px";
		id.style.top = (y+dy) + "px";
		dragData[1] = posx;
		dragData[2] = posy;
	}
	return false;
}

function dragSet(e) {
	if (!e) var e = window.event;
	if (e.pageX || e.pageY) {
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY) {
		posx = e.clientX;
		posy = e.clientY;
		if (isIE) {
			posx += getAgentGeometry("viewleft");
			posy += getAgentGeometry("viewtop");
		}
	}
	dragData = [dragContainer, posx, posy];
}

function dragUnset(e) {
	dragData = null;
}

function getAgentGeometry(type) {
	var ret = null;
	var windowWidth = windowHeight = windowScrolledX = windowScrolledY = null;
	if (typeof(window.innerWidth) == "number") {
		windowWidth = window.innerWidth;
		windowHeight = window.innerHeight;
	}
	else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	}
	else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}
	if (typeof(window.pageXOffset) == "number") {
		windowScrolledX = window.pageXOffset;
		windowScrolledY = window.pageYOffset;
	}
	else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
		windowScrolledX = document.body.scrollLeft;
		windowScrolledY = document.body.scrollTop;
	}
	else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
		windowScrolledX = document.documentElement.scrollLeft;
		windowScrolledY = document.documentElement.scrollTop;
	}
	switch (type) {
		case "viewleft":
			ret = windowScrolledX;
			break;
		case "viewright":
			ret = windowScrolledX+windowWidth-10;
			break;
		case "viewtop":
			ret = windowScrolledY;
			break;
		case "viewbottom":
			ret = windowScrolledY+windowHeight-10;
			break;
	}
	return ret;
}

function initNavLists(type) {
	actNavBox = type;
}

function fetchRouteList(url, type, target) {
	perform_Req(url+"&type="+type+"&tgid="+target);
}
function ws_Callback_DynamicGeoList(response) {
	var id = document.getElementById(response.getElementsByTagName("targetid")[0].firstChild.data);
	for (var i=id.options.length-1;i>=0;i--) {
		id.removeChild(id.options[i]);
	}
	id.selectedIndex = 0;
	var poslist = response.getElementsByTagName("position");
	var nid = ntit = null;
	for (var i=0;i<poslist.length;i++) {
		nid = poslist[i].getElementsByTagName("id")[0].firstChild.data;
		ntit = poslist[i].getElementsByTagName("title")[0].firstChild.data;
		id.options[i] = new Option(ntit, nid);
	}
}

function ws_Callback_DisplayRoute(response) {
	geopos_datapoints.length = 0;
	(geopos_markers) ? geopos_markers.length=0 : null;

	var mode = response.getElementsByTagName("mode")[0].firstChild.data;

	var poslist = response.getElementsByTagName("positions");
	var color = response.getElementsByTagName("color")[0].firstChild.data;
	var numlevels = response.getElementsByTagName("numlevels")[0].firstChild.data;
	var encroute = response.getElementsByTagName("encroute")[0].firstChild.data;
	var enclevels = response.getElementsByTagName("enclevels")[0].firstChild.data;

	var strlist = response.getElementsByTagName("strings")[0];

	var pmarkers = new Array();
	var posinfo = response.getElementsByTagName("posinfo");
	var posdata = new Object();
	var ptype, partyp;
	for (var i=0;i<posinfo.length;i++) {
		ptype = posinfo[i].getElementsByTagName("type")[0].firstChild.data;
		switch (ptype) {
			case "pstart": partyp = "st"; break;
			case "pend": partyp = "en"; break;
		}
		pmarkers.push(
			new Array(
				(xml_getSTValue(posinfo[i], "lat")) ? xml_getSTValue(posinfo[i], "lat") : "",
				(xml_getSTValue(posinfo[i], "lon")) ? xml_getSTValue(posinfo[i], "lon") : "",
				(xml_getSTValue(posinfo[i], "title")) ? xml_getSTValue(posinfo[i], "title") : "",
				(xml_getSTValue(posinfo[i], "html")) ? xml_getSTValue(posinfo[i], "html") : "",
				partyp
				));
	}

	var points = new Array();
	var routebound = new GLatLngBounds();

	var bounds = response.getElementsByTagName("bounds")[0];
	routebound.extend(new GLatLng(xml_getSTValue(bounds, "north"), xml_getSTValue(bounds, "west")));
	routebound.extend(new GLatLng(xml_getSTValue(bounds, "south"), xml_getSTValue(bounds, "east")));

	var geoList = new Array();
	for (var i=0;i<pmarkers.length;i++) {
		geoList = new Array(
			"",
			pmarkers[i][4],
			pmarkers[i][0],
			pmarkers[i][1],
			"",
			pmarkers[i][3],
			"",
			""
			);
		geopos_datapoints.push(geoList);
	}

	if (mode == "pu" || geopos_map) {
		geopos_strings["close"] = xml_getSTValue(strlist, "close");
		if (document.getElementById(currentContainer+"_linkclose")) {
			document.getElementById(currentContainer+"_linkclose").innerHTML = geopos_strings["close"];
		}
		geopos_displayMap();
		var polyline = new GPolyline.fromEncoded({
				color: color,
				weight: 3,
				opacity: 0.5,
				points: encroute,
				levels: enclevels,
				zoomFactor: 2,
				numLevels: numlevels
		});
		geopos_map.addOverlay(polyline);

		geopos_map.panTo(routebound.getCenter());
		setTimeout(function() {
			geopos_map.setCenter(routebound.getCenter(), geopos_map.getBoundsZoomLevel(routebound));
			}, 1500);
	}
}

function geopos_openMarker( id ) {

   for (var i=0;i<geopos_datapoints.length;i++) {

      if ( geopos_datapoints[i][0] == id ) {
         geopos_map.setCenter( geopos_markers[i][1], 9 );
         geopos_showInfo( geopos_markers[i][0], i );
      }

   }
}

function geopos_setGroupLoading( group ) {
   geopos_loadgroup = group;
}

function geopos_preparePopupMap(id, url) {
	geopos_initPopupMap();
	if (geopos_datapoints.length==0) {
		perform_Req(url);
	}
}

function geopos_prepareRouteDisplay( id, url ) {

   perform_Req(url);

}

function geopos_prepareMap() {
	geopos_initMap();
   var loadUrl = '';
   if ( geopos_loadgroup ) {
      loadUrl = geopos_mapurl_group + geopos_loadgroup;
   }
   else {
      loadUrl = geopos_mapurl_single;
   }
	perform_Req( loadUrl );
}

document.onmousemove = mouseTrap;

