﻿var map_small; 
var map_big;  //to differ between different maps on one page
var bounds = null;
var addresses = null; 
var ov;
var sc;
var lmp;
var mtc;
var arrMarkers = {};
var customIcon = null;


function init(mapId) {
    if (GBrowserIsCompatible()) {
    var map 
    
      if(mapId=="map_small"){
        map = new GMap2(document.getElementById(mapId));
      } else {
        map = new GMap2(document.getElementById(mapId));
      }
        bounds = new GLatLngBounds();
        
        lmp = new GLargeMapControl();
        map.addControl(lmp);
        mtc = new GMapTypeControl();
        map.addControl(mtc);
        
        if(mapId=="map_small"){
            sc = new GScaleControl();
            map.addControl(sc);
            ov = new GOverviewMapControl(new GSize(90,90));
            map.addControl(ov);
            ov.hide();
        }
        //default icon on vorarlberg.com
        customIcon = new GIcon(G_DEFAULT_ICON);
        customIcon.image = "http://www.vorarlberg.com/SysRes/VcomSkin/Icons/greenarrow.png";
        
        //remove Hybrid button
        map.removeMapType(G_HYBRID_MAP); 
        // create a new map type to fix "Gelände" encoding problems in ie
        map.addMapType(new GMapType(G_PHYSICAL_MAP.getTileLayers(),
        G_PHYSICAL_MAP.getProjection(), "Gelände"));  //add Physical button
  
        map.hideControls();
        map.enableScrollWheelZoom();
        map.enableContinuousZoom();
        map.enableDoubleClickZoom(); 

        GEvent.addListener(map, "mouseover", function() {
            map.showControls();
        });
        GEvent.addListener(map, "mouseout", function() {
            map.hideControls();
        });
        GEvent.addListener(map, "infowindowclose", function() {
            map.disableInfoWindow();
        });
        
        if (mapId=="map_small"){map_small = map;}else{map_big=map;}
        
    }
    else {
        
    } 
}


function showAddress(gmapCoords, pointDescription, mapId) {
    var currAddress = null;
    var currGeoPoint = null;
    var currPoint = null;
    var lat = null;
    var lang = null;
    var Exp1 = /(.+), (.+)/
    var map
    
    if (mapId=="map_small"){
      map = map_small;  
    } else {
      map = map_big;
    } 
        
    /* fill arrays with all locations (geopoints and corresponding descriptions) */
    geoPoints = gmapCoords.split('|');               /* check if this is an address or a pair of coordinates (must match format: latitude1, longitude1 | latitude2, longitude2 | latitude<n>, longitude<n>) ) */
    pointDescriptions = pointDescription.split('|'); /* check on a descriptive part (format: description1|description2|description<n>)  */
    
    for (i = 0; i < geoPoints.length; i++) {
        currGeoPoint = geoPoints[i];
        currAddress = pointDescriptions[i];
	    
        if (Exp1.exec(currGeoPoint) != null ) {
            lat 	  = RegExp.$1;
            lang 	  = RegExp.$2;
            currPoint = new GLatLng(parseFloat(lat), parseFloat(lang));
			
            /* add a geocoded point to the map */
            addGeocodedPoint(currPoint, currAddress, map);
        }
        else
        {
            /* fallback if there has not been any activity on the current page, e.g. a city page without any activities */
            //if there is a kmz-file like http://www.vorarlberg.at/wegweiser/kmz/10m.kmz given
            try{
                document.getElementById(map.j.id).style.display = "none";
                document.getElementById('loading').style.display = "none";
            }
            catch (err){}
            
            if (currGeoPoint.indexOf('http://') > -1 && currGeoPoint.indexOf('.kmz') > -1)
            {
                map.disableInfoWindow();
                map.setMapType(G_PHYSICAL_MAP);
                
                //loadingBar = document.getElementById('loading');
                //loadingBar.style.display = 'block';
                var geoXml = new GGeoXml(currGeoPoint, function() {
                    geoXml.hide();
                    if (geoXml.loadedCorrectly()) {
                        geoXml.gotoDefaultViewport(map);
                        geoXml.show();
                        //loadingBar.style.display = 'none';
                        try{
                            document.getElementById(map.j.id).style.display = "block";  
                        }
                        catch (err){}
                    }
                });
                
                map.addOverlay(geoXml);
                map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
            }
            //if there is a gpx-file given
            else if (currGeoPoint.indexOf('http://') > -1 && currGeoPoint.indexOf('.gpx') > -1)
            {
                loadingBar = document.getElementById('loading');
                //loadingBar.style.display = 'block';
                
                var request = GXmlHttp.create();
                request.open("GET", currGeoPoint, true);
                
                request.onreadystatechange = function() {
                  if (request.readyState == 4) {
                    var xmlDoc = request.responseXML;
                    
                    if (!xmlDoc) {
                        
                    }
                    else if (!xmlDoc.documentElement) {
                        
                    }
                    //else if (xmlDoc.documentElement.childNodes.length < 2) {
                    //    debugger
                    //    
                    //}
                    else {
                        var markers = xmlDoc.documentElement.getElementsByTagName("rtept");
                        var gmarkers = [];

                        // we need this for autofit and autozoom level
                        var max_lat = 0;
                        var max_lng = 0;
                        var min_lat = parseFloat(markers[0].getAttribute("lat"));
                        var min_lng = parseFloat(markers[0].getAttribute("lon"));
                        for (var i = 1; i < markers.length; i++) {
                            lat = parseFloat(markers[i].getAttribute("lat"));
                            lng = parseFloat(markers[i].getAttribute("lon"));
                            
                            min_lat = lat < min_lat ? lat : min_lat;
                            min_lng = lng < min_lng ? lng : min_lng;
                            
                            max_lat = lat > max_lat ? lat : max_lat;
                            max_lng = lng > max_lng ? lng : max_lng;
                        }
                        
                        p1 = new GLatLng(min_lat, min_lng);
                        p2 = new GLatLng(max_lat, max_lng);
                        bounds = new GLatLngBounds(p1, p2);
                        map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
                        
                        for (var i = 0; i < markers.length; i++) {
                            var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lon")));
                                                  
                            // Special Points
                            if (i == 0) {  // Start
                                //map.addOverlay(new GMarker(point));
                                addGeocodedPoint(point, markers[0].getElementsByTagName("desc")[0].firstChild.nodeValue, map);
                            } 
                            else if (i == markers.length-1) {  // End
                                //map.addOverlay(new GMarker(point));
                                addGeocodedPoint(point, markers[markers.length-1].getElementsByTagName("desc")[0].firstChild.nodeValue, map);
                            }
    
                            gmarkers.push(point)
                        }
                        var polyline = new GPolyline(gmarkers, "#0000DD", 8);
                        map.addOverlay(polyline);
                        //loadingBar.style.display = 'none';
                        
                        
                        document.getElementById(map.j.id).style.display = "block";     
                    } 
                }
              }
              request.send(null);
            }
            //if there is a address given
            else
            {
                var geocoder = new GClientGeocoder();
                
                if (geocoder) {
                    geocoder.getLatLng(currAddress,
	                    function(point) {
		                    if (!point) {
			                    document.getElementById(mapId).style.display = "none";
			                    //$('#' + mapId).hide();
		                    } else {
		                        document.getElementById(mapId).style.display = "block";
		                        //$('#' + mapId).hide();
			                    map.setCenter(point);
				                
			                    bounds.extend(new GLatLng(point.y, point.x));
                                map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
		                    }
                        });
                }
            }
        }
    }
}   

function addGeocodedPoint(point, description, CorrectMap) {
  var map = CorrectMap;
  

	map.setCenter(point);
	arrMarkers[point] = new GMarker(point, { icon:customIcon });
	map.addOverlay(arrMarkers[point]);

    if (description != "")
    {
	    GEvent.addListener(arrMarkers[point], "click",
		    function() {
		        map.enableInfoWindow();
			    arrMarkers[point].openInfoWindowHtml(description);
	    });
    }
    
	bounds.extend(new GLatLng(point.y, point.x));
	map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
}

              

function unloadMap() {
    GUnload();
}
