var output = null;
var map = null;
var lmc = null;
var icon = null;
var previousMarker = null;
var recommendedTransmitter = null;
var recommendedTransmitter2 = null;
//var recommendedTransmitter3 = null;
var transmitterLine = null;
var transmitterLine2 = null;
//var transmitterLine3 = null;
var infowin = null;
var infowin2 = null;
//var infowin3 = null;
var indoor = null;
var currZoom = 0;
var prevGeocodeMillisec = null;
var geocodeTimeout = null;
var dbgDelay = null;
var geoXml;
var toggleState = 1;
var hybrid = null;
var mapboundsAtZoomStart = null;

var opacity = .50 ;
var currTileLayer = null;
var tilelayerIndoorOverlay = null;
var tilelayerOutdoorOverlay = null;
var IE6 = null; // True if browser the IE6 junk browser
var options = {
    clickable: false
};


G_PHYSICAL_MAP.getMinimumResolution = function () { return MIN_ZOOM_LEVEL };
G_NORMAL_MAP.getMinimumResolution = function () { return MIN_ZOOM_LEVEL };
G_SATELLITE_MAP.getMinimumResolution = function () { return MIN_ZOOM_LEVEL };
G_HYBRID_MAP.getMinimumResolution = function () { return MIN_ZOOM_LEVEL };

G_PHYSICAL_MAP.getMaximumResolution = function () { return MAX_ZOOM_LEVEL };
G_NORMAL_MAP.getMaximumResolution = function () { return MAX_ZOOM_LEVEL };
G_SATELLITE_MAP.getMaximumResolution = function () { return MAX_ZOOM_LEVEL };
G_HYBRID_MAP.getMaximumResolution = function () { return MAX_ZOOM_LEVEL }; 

function getURL(point) {
    var mode;
    if (indoor) {
	mode="indoor";
    }
    else {
	mode = "outdoor";
    }
    var urlWParams =
	rasterconfSUrl + "?lat=" + point.y + "&lng=" + point.x +
	    "&mode=" + mode;
 
    return urlWParams;
}     

function removeSmallOverlays()
{
    map.closeExtInfoWindow();
    if (infowin) {
	map.removeOverlay(infowin);
	infowin = null;
    }
    if (infowin2) {
	map.removeOverlay(infowin2);
	infowin2 = null;
    }

    // if (infowin3) {
// 	map.removeOverlay(infowin3);
// 	infowin3 = null;
//     }

    if (recommendedTransmitter) {
	map.removeOverlay(recommendedTransmitter);
	recommendedTransmitter = null;
    }
    if (transmitterLine) {
	map.removeOverlay(transmitterLine);
	transmitterLine = null;
    }
    if (recommendedTransmitter2) {
	map.removeOverlay(recommendedTransmitter2);
	recommendedTransmitter2 = null;
    }
    if (transmitterLine2) {
	map.removeOverlay(transmitterLine2);
	transmitterLine2 = null;
    }

    //if (recommendedTransmitter3) {
    //	map.removeOverlay(recommendedTransmitter3);
    //	recommendedTransmitter3 = null;
    //}
    //if (transmitterLine3) {
    //	map.removeOverlay(transmitterLine3);
    //	transmitterLine3 = null;
    //}

    if (previousMarker) {
        map.removeOverlay(previousMarker);
    }
}

function reduceMaxZoomForBrokenBrowsers()
{
    IE6=(navigator.userAgent.toLowerCase().indexOf('msie 6') != -1) &&
	(navigator.userAgent.toLowerCase().indexOf('msie 7') == -1);
    if (IE6) {
        // js code for IE6 or down
        MAX_ZOOM_LEVEL = 11;
    }
    else {
        // js code for IE7 and non-IE browsers
    }
}

function setTileOpacity(factor)
{
    if (IE6) {
	// do nothing
    } else {
	opacity = factor;
	map.removeOverlay(currTileLayer);
	map.addOverlay(currTileLayer);
    }
}

function updateBoundingBox(eventname) {
    //GLog.write("got event " + eventname);
    mapboundsAtZoomStart = map.getBounds();
    
//     if (previousMarker != null) {
// 	if ( mapboundsAtZoomStart.contains(
// 		 previousMarker.getPoint()) == true ) {
// 	    GLog.write("red m is inside box");
// 	} else {
// 	    GLog.write("red m is outside box");
// 	}
//     }
}

// For some reason, DR:s Apache2 webserver said "permanently moved"
// when accessing tiles outside tile layer, and redirected to existing
// tiles! This created repeating "ghost" overlays. We solve by
// returning a 100% transparent tile URL instead.
// TODO: Remove Math.pow
function checkTileCoordOK(point,zoom)
{
    // Algorithm: We know/assume that the tile layer at max zoom is
    // covered by any of the tile layers at lower zoom. To find out if
    // a point at a given zoom has a tile, we scale the tile (the
    // point coords together with zoom identifies a tile) to max tile
    // zoom and check if it is partly overlapping with the bounding
    // box of the max zoom tile layer. If so, the tile should exist at
    // the given zoom level.

    var zmdiff = TILE_MAX_ZOOM_LEVEL - zoom;
    var scalefactor = Math.pow(2, zmdiff);
    var leftx = point.x * scalefactor;
    var uppery = point.y * scalefactor;
    var rightx = leftx + scalefactor;
    var bottomy = uppery + scalefactor;
    if (rightx > rasterconfXTileMin && leftx < rasterconfXTileMax &&
        bottomy > rasterconfYTileMin && uppery < rasterconfYTileMax) {
	return true;
    } else {
	return false;
    }
}

function load() {
    output = document.getElementById("output");

    if (GBrowserIsCompatible()) {
	rasterconfInit();
	reduceMaxZoomForBrokenBrowsers();
	configureLanguageData(rasterconfLanguage);
	var div = document.getElementById('container');
	div.style.display='none';
	var discldiv = document.getElementById('disclaimer');
	discldiv.style.display='none';
	indoor = false;
	document.getElementById("map").innerHTML = '';
        map = new GMap2(document.getElementById("map"));
	lmc = new GLargeMapControl3D();
	map.addControl(lmc);
	
	//
	// Simple setup of tile layers
	//
	
        // Set up the copyright information
        // Each image used should indicate its copyright permissions
        var myCopyright = new GCopyrightCollection("coverage tiles (c)2009");
        myCopyright.addCopyright(new GCopyright('',
            new GLatLngBounds(new GLatLng(-90,-180), new GLatLng(90,180)),
            0,'Progira AB'));
	//0,'©2009 Progira AB'));

        // Create the tile layer overlays and 
        // implement the three abstract methods                 
        var tilelayerOutdoor = new GTileLayer(myCopyright);
	var CustomGetTileUrlOutdoor=function(point,zoom)
        {
	    var url;
	    if (checkTileCoordOK(point, zoom) == true) {
		url = rasterconfBasepath +
	        "/images/imagetiles/outdoor/" + zoom + "/x" +
	        point.x + "_y" + point.y + ".png";
	    } else {
		url = rasterconfCommonpath +
		    "/images/blank_tile.png";
	    }
	    return url;
	}
	var CustomGetTileUrlOutdoor_junkbrowser=function(point,zoom)
        {
	    var url;
	    if (checkTileCoordOK(point, zoom) == true) {
		url = rasterconfBasepath +
	        "/images/imagetiles/outdoor_junkbrowser/" + zoom + "/x" +
	        point.x + "_y" + point.y + ".png";
	    } else {
		url = rasterconfCommonpath +
		    "/images/blank_tile.png";
	    }
	    return url;
	}
	if (IE6) {
	    tilelayerOutdoor.getTileUrl = CustomGetTileUrlOutdoor_junkbrowser;
	} else
	{
	    tilelayerOutdoor.getTileUrl = CustomGetTileUrlOutdoor;
	}
        tilelayerOutdoor.isPng = function() { return true; };
	if (IE6) {
	    tilelayerOutdoor.getOpacity = function() { return 1.0; }
	} else {
	    tilelayerOutdoor.getOpacity = function() { return opacity; }
	}
	    
        tilelayerOutdoorOverlay = new GTileLayerOverlay(tilelayerOutdoor);
	
	var tilelayerIndoor = new GTileLayer(myCopyright);
	var CustomGetTileUrlIndoor=function(point,zoom)
        {
	    var url;
	    if (checkTileCoordOK(point, zoom) == true) {
		url = rasterconfBasepath +
	        "/images/imagetiles/indoor/" + zoom + "/x" +
	        point.x + "_y" + point.y + ".png";
	    } else {
		url = rasterconfCommonpath +
		    "/images/blank_tile.png";
	    }
	    return url;
	}

	var CustomGetTileUrlIndoor_junkbrowser=function(point,zoom)
        {
	    var url;
	    if (checkTileCoordOK(point, zoom) == true) {
		url = rasterconfBasepath +
	        "/images/imagetiles/indoor_junkbrowser/" + zoom + "/x" +
	        point.x + "_y" + point.y + ".png";
	    } else {
		url = rasterconfCommonpath +
		    "/images/blank_tile.png";
	    }
	    return url;
	}

	if (IE6) {
	    tilelayerIndoor.getTileUrl = CustomGetTileUrlIndoor_junkbrowser;
	} else
	{
	    tilelayerIndoor.getTileUrl = CustomGetTileUrlIndoor;
	}
        tilelayerIndoor.isPng = function() { return true; };
	if (IE6) {
	    tilelayerIndoor.getOpacity = function() { return 1.0; }
	} else {
	    tilelayerIndoor.getOpacity = function() { return opacity; }
	}
	
        tilelayerIndoorOverlay = new GTileLayerOverlay(tilelayerIndoor);

        currTileLayer = tilelayerOutdoorOverlay;

	// Tile setup done, now the rest
	    
	map.getDragObject().setDraggableCursor("crosshair");
	
        map.addMapType(G_PHYSICAL_MAP);
	map.removeMapType(G_HYBRID_MAP);
	map.addControl(new GMapTypeControl());
	var scale = new GScaleControl();
        map.addControl(scale);
        geocoder = new GClientGeocoder();
	geocoder.setBaseCountryCode(rasterconfCountryCode);
	map.setCenter(new GLatLng(56.0, 11.0), 6);

	map.enableScrollWheelZoom();
	map.enableContinuousZoom();
        
        map.addOverlay(currTileLayer);

	var mapbounds = map.getBounds();
        geocoder.setViewport(mapbounds);

	// NOTE! New zoomto event catches both scroll wheel zoom and
	// zoom via map controls.
	GEvent.addListener(map, "zoomto", function() {
		updateBoundingBox("zoomto");
	    });
	
	//GEvent.addListener(map, "mousemove", function(oldzoom, zoom) {
	//	GLog.write("got mousemove event");
	//	mapboundsAtZoomStart = map.getBounds();
	//    });
	
        GEvent.addListener(map, "click", function(
			       marker, point) {
			       //updateBoundingBox("click");
			       requestInfo(point, 9);
			   }); // End of click event listener

// 	GEvent.addListener(map, "dragend", function() {
// 		//updateBoundingBox("dragend");
// 	    });

// 	// NOTE! zoomstart not triggered when zooming with gui
// 	// controls, but IS triggered at scroll wheel zoom!
// 	GEvent.addListener(map, "zoomstart", function(oldzoom, zoom) {
// 		//updateBoundingBox("zoomstart");
// 	    });

// 	GEvent.addListener(map, "move", function() {
// 		//updateBoundingBox("move (map moved)");
// 	    });
	
	GEvent.addListener(map, "zoomend", function(oldzoom, zoom) {
		currZoom = zoom;
		if (previousMarker != null) {
		    if (mapboundsAtZoomStart == null) {
			return;
		    }
		    if ( mapboundsAtZoomStart.contains(
			     previousMarker.getPoint()) == true ) {
			map.setCenter(previousMarker.getPoint());
		    }
		    if ( map.getBounds().contains(
			     previousMarker.getPoint()) == true ) {
			map.setCenter(previousMarker.getPoint());
		    }
		}
	    }); 
  } else {
	alert(lsNoJavascriptInBrowser);
  }
  return true;

} // end function load()

function getTransmitterIcon(transmitter_imagename) {
    var shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
    icon = new GIcon();		
    icon.shadow = shadow
    icon.image = "images/transmitter_"+transmitter_imagename+".png";	
    icon.iconSize = new GSize(86, 35);
    icon.iconAnchor = new GPoint(22, 35);
    return icon;    
}



