
var map;
var side_bar_html = '';
var gmarkers = [];
var i = 0;
var lastlinkid;

function load() {
    map = new GMap2(document.getElementById("map"));

    /* Restricting the range of Zoom Levels http://econym.googlepages.com/range.htm */
    /* Get the list of map types */
    var mt = map.getMapTypes();
    /* Overwrite the getMinimumResolution() and getMaximumResolution() methods */
    for (var i=0; i<mt.length; i++) {
        mt[i].getMinimumResolution = function() { return zoom_min; }
        mt[i].getMaximumResolution = function() { return zoom_max; }
    }
    if ( typeof usermap != "undefined" && usermap ) {
        if (typeof usermap_mapTypes != "object") { usermap_mapTypes = false;  };
        usermap_loads("http://.../storage/maps/tiles/","Tourist",map,"png",mapSourcePath,"intern",usermap_mapTypes);
    }

    if ( typeof show_map_type_control != "undefined" && show_map_type_control ) {
        map.addControl(new GMapTypeControl());
    }
    if ( typeof show_large_map_control != "undefined" && show_large_map_control ) {
        map.addControl(new GLargeMapControl());
    }
    if ( typeof show_scale_control != "undefined" && show_scale_control ) {
        map.addControl(new GScaleControl());
    }
    if ( typeof show_overview_map_control != "undefined" && show_overview_map_control ) {
        map.addControl(new GOverviewMapControl());
    }
    if ( typeof show_small_zoom_control != "undefined" && show_small_zoom_control ) {
        map.addControl(new GSmallZoomControl());
    }

    var point = new GLatLng(latitude, longitude);
    map.setCenter(point, zoom);
    
    if ( typeof initial_map_type != "undefined" && initial_map_type ) {
        map.setMapType(initial_map_type);
    }

    if ( typeof mini_map_rect != "undefined" && mini_map_rect ) {
        rect = true;
        GEvent.addListener(map, 'infowindowclose', miniMapRectClose);
    }

    if ( typeof mini_map_rect_background_color == "undefined" || !mini_map_rect_background_color ) {
        mini_map_rect_background_color = '#6666CC';
    }

    if ( typeof mini_map_rect_border_color == "undefined" || !mini_map_rect_border_color ) {
        mini_map_rect_border_color = '#4444BB';
    }

    if ( typeof uri_language_prefix == "undefined" || !uri_language_prefix ) {
        uri_language_prefix = '';
    }
}

function createMarker(point,id,label,text,image,link,icontype,showinfowindow) {
    /* info window html formatieren */
    if(image!='') {
        if(link!='') {
            image='<a href="'+link+'" target="_top">'+image+'</a>';
        }
    }
    if(link!='') {
        link='<a href="'+link+'" target="_top">'+locale_read_more+'</a>';
    }

    text='<div class="WTitle"><p>'+label+'</p></div>'+'<div class="WText"><p>'+text+'</p></div>';
    if(link!='') {
        text=text+'<div class="WLink"><p>'+link+'</p></div>';
    }

    if (!document.getElementById("map-zoom")) { 
        var zoom = document.createElement("div");
        zoom.id="map-zoom";
    } else {
        var zoom=document.getElementById("map-zoom");
    };

    var tabZoom = new GInfoWindowTab(locale_zoom, zoom);
    var tabText = new GInfoWindowTab(locale_info, text);
    
    var infoTabs = '';
    if(image!='') {
        var tabImage = new GInfoWindowTab(locale_image, image);
        infoTabs = [tabText,tabImage,tabZoom];
    } else {
        infoTabs = [tabText,tabZoom];
    }

    var marker=new GMarker(point, gicons[icontype]);

    var linkid = 'item'+i;
    gmarkers[i] = marker;

    side_bar_html+='<img class="gicon-mini;" src='+gicons[icontype].image+' /><p><a href="javascript:clickItem('+i+');">'+label+'</a></p>';

    /* bei klick auf den marker fenster oeffnen */
    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowTabsHtml(infoTabs);
        miniMap(marker,point,icontype);
    });

    map.addOverlay(marker);

    if(showinfowindow=='true') {
        tabZoom = new GInfoWindowTab(locale_zoom, zoom);
        if(image!='') {
            tabImage = new GInfoWindowTab(locale_image, image);
            infoTabs = [tabText,tabImage,tabZoom];
        } else {
            infoTabs = [tabText,tabZoom];
        }

        marker.openInfoWindowTabsHtml(infoTabs);

        miniMap(marker,point,icontype);
    }

    i++;
}

/* Click im sidebardiv abfangen */
function clickItem(i) {
    GEvent.trigger(gmarkers[i], "click");
}

function miniMap(marker,point,icontype) {
    if ( typeof window.mini_map_default_zoom == "undefined" ) {
        var mini_map_default_zoom = 15;
    } else {
        var mini_map_default_zoom = window.mini_map_default_zoom;
    }

    /* zoom map http://maps.forum.nu/gm_minimap_in_infowindow.html */
    var dMapDiv = document.getElementById('map-zoom');
    var detailmap = new GMap2(dMapDiv);
    detailmap.addControl(new GSmallZoomControl());
    detailmap.setCenter(point,mini_map_default_zoom);
    marker1 = new GMarker(point, gicons[icontype]);
    detailmap.addOverlay(marker1);
    var CopyDiv = dMapDiv.firstChild.nextSibling;
    var CopyImg = dMapDiv.firstChild.nextSibling.nextSibling;
    CopyDiv.style.display = "none";
    CopyImg.style.display = "none";

    if ( typeof rect != "undefined" && rect ) {
        GEvent.addListener(detailmap, "zoomend", miniMapRectZoom);
        GEvent.addListener(detailmap, "moveend", miniMapRectMove);
        miniMapRect(detailmap);
    }
}

function miniMapRect(detailmap) {
    map.removeOverlay(rect);
    var bounds = detailmap.getBounds();
    var polyPoints = [ bounds.getSouthWest(),
                        new GLatLng(bounds.getSouthWest().lat(),bounds.getNorthEast().lng()),
                        bounds.getNorthEast(),
                        new GLatLng(bounds.getNorthEast().lat(),bounds.getSouthWest().lng()),
                        bounds.getSouthWest() ]
    rect = new GPolygon(polyPoints, mini_map_rect_border_color, 1, 0.9, mini_map_rect_background_color, 0.25);
    map.addOverlay(rect);
}

function miniMapRectZoom(oldZ,newZ) {
	miniMapRect(this);
}

function miniMapRectMove() {
	miniMapRect(this);
}

function miniMapRectClose() {
    map.removeOverlay(rect);
}

/* a function to read the data */
function readMap(url) {
    if ( typeof disable_map_rightpanel == "undefined" || !disable_map_rightpanel ) {
        document.getElementById("map-rightpanel-dynamic").innerHTML = '<p style="text-decoration:blink;margin:10px;text-align:center;"><b>'+locale_loading_data+'</b></p>';
    }

    url = uri_language_prefix+url;

    var request = GXmlHttp.create();
    request.open("GET", url, true);
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            var xmlDoc = request.responseXML;

            /* obtain the array of markers and loop through it */
            var markers = xmlDoc.documentElement.getElementsByTagName("marker");

            /* hide the info window, otherwise it still stays open where the removed marker used to be */
//            map.getInfoWindow().hide();
            map.clearOverlays();

            /* empty the array */
            gmarkers = [];
            /* reset the side_bar */
            side_bar_html = "";
            var type = '';

            for (var i = 0; i < markers.length; i++) {
                /* obtain the attribues of each marker */
                var lat = parseFloat(markers[i].getAttribute("lat"));
                var lng = parseFloat(markers[i].getAttribute("lng"));
                var point = new GLatLng(lat,lng);
//                var point_offset = new GLatLng(lat+0.0009,lng+0.0001);
                var icontype = markers[i].getAttribute("icontype");
                var id = markers[i].getAttribute("id");
                var label = GXml.value(markers[i].getElementsByTagName("label")[0]);
                var text = GXml.value(markers[i].getElementsByTagName("text")[0]);
                var image = GXml.value(markers[i].getElementsByTagName("image")[0]);
                var link = GXml.value(markers[i].getElementsByTagName("link")[0]);
                type = GXml.value(markers[i].getElementsByTagName("type")[0]);

                /* Erzeugen der Markers */
                if (markers.length == 1) {
                    createMarker(point,id,label,text,image,link,icontype,'true');
                } else {
                    createMarker(point,id,label,text,image,link,icontype,'false');
                }
            }

            /* wenn kein einzelner Eintrag dann neues Zoom und Zentrum ermitteln (todo) */
            if (i > 1) {
                /* determine the zoom level from the bounds */
//                map.setZoom(map.getBoundsZoomLevel(bounds));
                /* determine the centre from the bounds */
//                map.setCenter(bounds.getCenter());
                point = new GLatLng(latitude, longitude);
                map.setCenter(point, zoom);
            }

            if( side_bar_html == '' ) {
                side_bar_html = '<p style="margin:10px;text-align:center;"><b>'+locale_no_results_found+'</b></p>';
            }

            /* put the assembled side_bar_html contents into the side_bar div */
            if ( type != '') {
                side_bar_html = '<p class="map-rightpanel-dynamic-type" style="margin: 0 0 7px 0;">'+type+'</p>'+side_bar_html;
            }
            if ( typeof disable_map_rightpanel == "undefined" || !disable_map_rightpanel ) {
                document.getElementById("map-rightpanel-dynamic").innerHTML=side_bar_html;
            }
        }
    }
    request.send(null);
}

/*
	Funktion zum Load der grundsätzlichen Dinge für die Usermap
*/

function usermap_loads (url,name,map,imgtype,mapSourcePath,mapSource,mapTypes){
	
	Array.prototype.contains = function(argument) {
		for (var i = 0; i < this.length; i++) { 
			if (this[i] == argument) {
				return true;
			}
		}
		return false;
	};
	
    if (mapSource == 'extern') {
        CustomGetTileUrl=function(a,b){
            // return url+a.x+"_"+a.y+"_"+(b)+".gif"; // old style without mapcruncher
            return url+TileToQuadKey(a.x,a.y,b) + "."+imgtype;
        }
    } else {
        CustomGetTileUrl=function(a,b){
            return mapSourcePath + TileToQuadKey(a.x,a.y,b) + "."+imgtype;
        }
    }

    var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(54.2136257,12.1981445),new GLatLng(54.8654855,12.9663944) ), 14, 'Look at impressum');
    copyrightCollection = new GCopyrightCollection('Map Data:');
    copyrightCollection.addCopyright(copyright);


    caveHybridLayerNormal = new Array();

    caveHybridLayerNormal[0] = G_NORMAL_MAP.getTileLayers()[0];

    caveHybridLayerNormal[1] = new GTileLayer(copyrightCollection,12,17);
    caveHybridLayerNormal[1].getTileUrl = CustomGetTileUrl;
    caveHybridLayerNormal[1].getOpacity = function () {return 1;}; //of the non transparent part cave
    caveHybridLayerNormal[1].isPng = function() {return true;};

    caveHybridLayerSat = new Array();

    caveHybridLayerSat[0] = G_SATELLITE_MAP.getTileLayers()[0];

    caveHybridLayerSat[1] = new GTileLayer(copyrightCollection,12,17);
    caveHybridLayerSat[1].getTileUrl = CustomGetTileUrl;
    caveHybridLayerSat[1].getOpacity = function () {return 1;}; //of the non transparent part cave
    caveHybridLayerSat[1].isPng = function() {return true;};


    caveHybridMapWithSat = new GMapType(caveHybridLayerSat, G_SATELLITE_MAP.getProjection(), 'Satellite+',{errorMessage:""});
    caveHybridMapWithSat.getMaximumResolution = function () { return 17};

    caveHybridMapWithNormal = new GMapType(caveHybridLayerNormal, G_NORMAL_MAP.getProjection(), name+'+',{errorMessage:""});
    caveHybridMapWithNormal.getMaximumResolution = function () { return 17};

	
	if (typeof mapTypes == "object") {
		map.removeMapType(G_SATELLITE_MAP);
		map.removeMapType(G_HYBRID_MAP);
		if (mapTypes.contains("Normal+")) {map.addMapType(caveHybridMapWithNormal);}
		if (mapTypes.contains("Satellite")) {map.addMapType(G_SATELLITE_MAP);}
		if (mapTypes.contains("Satellite+")) {map.addMapType(caveHybridMapWithSat);}
		map.addMapType(caveHybridMapWithNormal);
		map.setMapType(caveHybridMapWithNormal);
	} else {
		// map.addMapType(G_NORMAL_MAP);
		// map.addMapType(G_SATELLITE_MAP);
		map.addMapType(caveHybridMapWithNormal);
    	map.addMapType(caveHybridMapWithSat);
	    map.setMapType(caveHybridMapWithNormal);
	}

}

/*
	Funktion zur Umrechnung der MapCruncher Bitmaps in GoogleMaps-Standard-Style
*/

function TileToQuadKey ( x, y, zoom){
    var quad = "";
    for (var i = zoom; i > 0; i--){
        var mask = 1 << (i - 1);
        var cell = 0;
        if ((x & mask) != 0)
            cell++;
        if ((y & mask) != 0)
            cell += 2;
        quad += cell;
    }
    return quad;
}
