﻿var mapBounds;
var mapMinZoom;
var mapMaxZoom;

var opacity = 0.5;
var map;
var hybridOverlay;

var TileL;

function changeOpacity(op) {
//this works as long as there are at least two map types
    var current=map.getCurrentMapType();
    if (current==map.getMapTypes()[0])
    {
    	map.setMapType(map.getMapTypes()[1]);
    }
    else
    {
	    map.setMapType(map.getMapTypes()[0]);
        opacity=op;
        map.setMapType(current); //was map.getMapTypes()[1]
       map.removeOverlay(TileL);
       TileL.getOpacity = function() { return opacity; }
       map.addOverlay(TileL);
        }
    }

    /*
    * Main load function:
    */

    function load() {
       if (GBrowserIsCompatible()) {

            //Decode bound box and zoom levels from XML file
            try //Internet Explorer
            {
                xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
            }
            catch(e)
            {
                try //Firefox, Mozilla, Opera, etc.
                {
                    xmlDoc=document.implementation.createDocument("","",null);
                }
                catch(e)
                {
                    alert(e.message);
                    return;
                }
            }
                
  	xmlDoc.async=false; 
    xmlDoc.load("tilemapresource.xml");
    xmlBoundBox = xmlDoc.getElementsByTagName("BoundingBox")[0].attributes 	
	mapBounds = new GLatLngBounds(new GLatLng(parseFloat(xmlBoundBox.getNamedItem("miny").nodeValue),parseFloat(xmlBoundBox.getNamedItem("minx").nodeValue)), new GLatLng(parseFloat(xmlBoundBox.getNamedItem("maxy").nodeValue),parseFloat(xmlBoundBox.getNamedItem("maxx").nodeValue)));
    xmlzoom = xmlDoc.getElementsByTagName("zoom")[0].attributes
    mapMinZoom = parseInt(xmlzoom.getNamedItem("min").nodeValue);
		  mapMaxZoom = parseInt(xmlzoom.getNamedItem("max").nodeValue);

		      map = new GMap2( document.getElementById("map"));

        // Setup the map options
        map.addControl(new GLargeMapControl());
        map.addControl(new GHierarchicalMapTypeControl());
        map.addControl(new GScaleControl());
        map.enableScrollWheelZoom();
        map.enableContinuousZoom();

        // Create the copyright collection
        var copyCollection = new GCopyrightCollection('Coverage Data');
        var copyright = new GCopyright(1, mapBounds, 0, " Kordia");
        copyCollection.addCopyright(copyright);


		          map.addMapType(G_PHYSICAL_MAP);
		          map.setMapType(G_PHYSICAL_MAP);

		          map.setCenter( mapBounds.getCenter(), 6);

		          hybridOverlay = new GTileLayerOverlay( G_HYBRID_MAP.getTileLayers()[1] );
		          GEvent.addListener(map, "maptypechanged", function() {
		            if (map.getCurrentMapType() == G_HYBRID_MAP) {
		                map.addOverlay(hybridOverlay);
		            } else {
		               map.removeOverlay(hybridOverlay);
		            }
		          } );

		          var tilelayer = new GTileLayer(GCopyrightCollection(''), mapMinZoom, mapMaxZoom);
		          var mercator = new GMercatorProjection(mapMaxZoom+1);
		          tilelayer.getTileUrl = function(tile,zoom) {
		              if ((zoom < mapMinZoom) || (zoom > mapMaxZoom)) {
		                  return "nocov.png";
		              } 
		              var ymax = 1 << zoom;
		              var y = ymax - tile.y -1;
		              var tileBounds = new GLatLngBounds(
		                  mercator.fromPixelToLatLng( new GPoint( (tile.x)*256, (tile.y+1)*256 ) , zoom ),
		                  mercator.fromPixelToLatLng( new GPoint( (tile.x+1)*256, (tile.y)*256 ) , zoom )
		              );
		              if (mapBounds.intersects(tileBounds)) {
		                  return zoom+"/"+tile.x+"/"+y+".png";
		              } else {
		                  return "http://www.maptiler.org/img/none.png";
		              }
		          }
		          // IE 7-: support for PNG alpha channel
		          // Unfortunately, the opacity for whole overlay is then not changeable, either or...
		          tilelayer.isPng = function() { return false;};
		          tilelayer.getOpacity = function() { return opacity; }
		          overlay = new GTileLayerOverlay( tilelayer );
		          TileL = overlay;
		          map.addOverlay(overlay);

		          map.setMapType(G_SATELLITE_MAP);
        // bind a search control to the map, suppress result list
 				var options = {
			      suppressZoomToBounds : true
 											};
				map.addControl(new google.maps.LocalSearch(options), new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(20,20)));
		    }}
		    
		    // Created from source code by Klokan Petr Pridal, klokan at klokan dot cz
				// http://www.klokan.cz/projects/gdal2tiles/
				// http://www.maptiler.org/
				// Modified for coverage data by JB Sauquet, Kordia