
// The g_mapToken variable and init() function referenced in this code must be declared in the calling page.
// The init() function is added to the page onload event using dojo.addOnLoad and is not part of 
// this code set as it will usually contain code that is specific to the calling page.

dojo.require("esri.map");
dojo.addOnLoad(init);

var map;
var extent;

var mapServiceLayer, satelliteServiceLayer, satelliteLabelsServiceLayer;
var copyrightTextGraphic, copyrightMarkerGraphic;
var upperLeftWatermark, lowerLeftWatermark, upperRightWatermark, lowerRightWatermark;

var upperWatermark, lowerWatermark;


var currentView = "map";
var baseMapServiceName = "BaseMap";
var gLayersLoaded = 0;
var satelliteMapServiceName = "BaseMapAerial2006";
var satelliteLabelsMapServiceName = "Aerial_labels"
var arcGisServicesUrlStub = g_ArcGISURLStub;
var mapCopyrightText = "(c)Crown Copyright All Rights Reserved. LBHF Licence LA100019223 (2009)";
var satelliteCopyrightText = "Cities Revealed (The GeoInformation Group)";

function refreshBasicMapWatermark()
{
    refreshBasicMapWatermarkNew();
}

function refreshBasicMapWatermarkOld()
{
    //var watermarkSymbol = new esri.symbol.PictureMarkerSymbol("/BasicMap/images/watermark.gif", 105, 50);
    var watermarkSymbol = new esri.symbol.TextSymbol("h&f", new esri.symbol.Font("55pt", esri.symbol.Font.STYLE_NORMAL, esri.symbol.Font.VARIANT_NORMAL, esri.symbol.Font.WEIGHT_BOLDER), new dojo.Color([209,214,224,0.60]));
    var xMin = map.extent.xmin;
    var xMax = map.extent.xmax;
    var yMin = map.extent.ymin;
    var yMax = map.extent.ymax;

    //Calculate the upper and lower values to use when creating the centre point of each quartile of the current extent ...
    var xLower = ((xMax - xMin) / 4) + xMin;
    var xUpper = xLower + ((xMax - xMin) / 2);
    var yLower = ((yMax - yMin) / 4) + yMin;
    var yUpper = yLower + ((yMax - yMin) / 2);

    //Create 4 centre point objects in BNG projection (27700) ...
    var ptUpperLeft = new esri.geometry.Point(xLower, yUpper, 27700);
    var ptLowerLeft = new esri.geometry.Point(xLower, yLower, 27700);
    var ptUpperRight = new esri.geometry.Point(xUpper, yUpper, 27700);
    var ptLowerRight = new esri.geometry.Point(xUpper, yLower, 27700);

    if (upperLeftWatermark) {
        //The watermark graphic objects already exist, so if on map view just move them to the new location following a pan action ...
        if (currentView == "map" && map.getLevel() > 4) {
            upperLeftWatermark.setGeometry(ptUpperLeft);
            lowerLeftWatermark.setGeometry(ptLowerLeft);
            upperRightWatermark.setGeometry(ptUpperRight);
            lowerRightWatermark.setGeometry(ptLowerRight);
        }
        //The watermark graphic objects already exist, we need to remove them
        else
        {
            map.graphics.remove(upperLeftWatermark);
            map.graphics.remove(lowerLeftWatermark);
            map.graphics.remove(upperRightWatermark);
            map.graphics.remove(lowerRightWatermark);
            upperLeftWatermark = null;
        }
    }
    else {
        //Only add watermark if on the map view and zoomed in past level 4
        if (currentView == "map" && map.getLevel() > 4) {
            //the watermark graphic objects need to be created and added to the gpraphics layer when the map first loads ...
            upperLeftWatermark = new esri.Graphic(ptUpperLeft, watermarkSymbol);
            lowerLeftWatermark = new esri.Graphic(ptLowerLeft, watermarkSymbol);
            upperRightWatermark = new esri.Graphic(ptUpperRight, watermarkSymbol);
            lowerRightWatermark = new esri.Graphic(ptLowerRight, watermarkSymbol);
            map.graphics.add(upperLeftWatermark);
            map.graphics.add(lowerLeftWatermark);
            map.graphics.add(upperRightWatermark);
            map.graphics.add(lowerRightWatermark);
        }
    }
    refreshBasicMapCopyright();
}

function refreshBasicMapWatermarkNew()
{
    //var watermarkSymbol = new esri.symbol.PictureMarkerSymbol("/BasicMap/images/watermark.gif", 105, 50);
    var watermarkSymbol = new esri.symbol.TextSymbol("Hammersmth & Fulham", new esri.symbol.Font("26pt", esri.symbol.Font.STYLE_NORMAL, esri.symbol.Font.VARIANT_NORMAL, esri.symbol.Font.WEIGHT_BOLDER), new dojo.Color([209,214,224,0.70]));
    var xMin = map.extent.xmin;
    var xMax = map.extent.xmax;
    var yMin = map.extent.ymin;
    var yMax = map.extent.ymax;

    //Calculate the upper and lower values to use when creating the centre points ...
    var yLower = ((yMax - yMin) / 4) + yMin;
    var yUpper = yLower + ((yMax - yMin) / 2);
    var xCentre = xMin + ((xMax - xMin) / 2);

    //Create 2 centre point objects in BNG projection (27700) ...
    var ptUpperCentre = new esri.geometry.Point(xCentre, yUpper, 27700);
    var ptLowerCentre = new esri.geometry.Point(xCentre, yLower, 27700);

    if (upperWatermark) {
        //The watermark graphic objects already exist, so if on map view just move them to the new location following a pan action ...
        if (currentView == "map" && map.getLevel() > 4) {
            upperWatermark.setGeometry(ptUpperCentre);
            lowerWatermark.setGeometry(ptLowerCentre);
        }
        //The watermark graphic objects already exist, we need to remove them
        else
        {
            map.graphics.remove(upperWatermark);
            map.graphics.remove(lowerWatermark);
            upperWatermark = null;
        }
    }
    else {
        //Only add watermark if on the map view and zoomed in past level 4
        if (currentView == "map" && map.getLevel() > 4) {
            //the watermark graphic objects need to be created and added to the gpraphics layer when the map first loads ...
            upperWatermark = new esri.Graphic(ptUpperCentre, watermarkSymbol);
            lowerWatermark = new esri.Graphic(ptLowerCentre, watermarkSymbol);
            map.graphics.add(upperWatermark);
            map.graphics.add(lowerWatermark);
        }
    }
    refreshBasicMapCopyright();
}

function refreshBasicMapCopyright()
{
    var copyrightMarkerSymbol = new esri.symbol.PictureMarkerSymbol("/BasicMap/images/CopyrightBar.gif", 415, 10);
    var copyrightTextSymbol = new esri.symbol.TextSymbol(mapCopyrightText, new esri.symbol.Font("5.4pt", esri.symbol.Font.STYLE_NORMAL, esri.symbol.Font.VARIANT_NORMAL, esri.symbol.Font.WEIGHT_NORMAL), new dojo.Color("black"));
    copyrightTextSymbol.setAlign("ALIGN_START");
    var ptExtentOrigin = new esri.geometry.Point(map.extent.xmin, map.extent.ymin, 27700);
    var ptExtentCentreBottom = new esri.geometry.Point(map.extent.xmin + ((map.extent.xmax - map.extent.xmin) / 2), map.extent.ymin + ((map.extent.ymax - map.extent.ymin) * 0.01), 27700);
    if (copyrightTextGraphic) {
        if (currentView == "map") {
            copyrightTextSymbol.setText(mapCopyrightText);
            copyrightTextGraphic.setSymbol(copyrightTextSymbol);
            var copyrightdiv = dojo.byId("copyright");
            if (copyrightdiv != null)
                copyrightdiv.innerHTML = mapCopyrightText;
        }
        else {
            copyrightTextSymbol.setText(satelliteCopyrightText + " & " + mapCopyrightText);
            copyrightTextGraphic.setSymbol(copyrightTextSymbol);
            var copyrightdiv = dojo.byId("copyright");
            if (copyrightdiv != null)
                copyrightdiv.innerHTML = satelliteCopyrightText;
        }
        copyrightMarkerGraphic.setGeometry(ptExtentCentreBottom);
        copyrightTextGraphic.setGeometry(ptExtentOrigin);
    }
    else {
        copyrightMarkerGraphic = new esri.Graphic(ptExtentCentreBottom, copyrightMarkerSymbol);
        copyrightTextGraphic = new esri.Graphic(ptExtentOrigin, copyrightTextSymbol);
        map.graphics.add(copyrightMarkerGraphic);
        map.graphics.add(copyrightTextGraphic);
    }
}

function showBasicMapMapLayer()
{
    currentView = "map";
    mapServiceLayer.show();
    satelliteServiceLayer.hide();
    satelliteLabelsServiceLayer.hide();
    toggleBasicMapButton('mapLayerButton');
    toggleBasicMapButton('satelliteLayerButton');
    refreshBasicMapCopyright();
    refreshBasicMapWatermark();
}

function showBasicMapSatelliteLayer()
{
    currentView = "satellite";
    satelliteServiceLayer.show();
    satelliteLabelsServiceLayer.show();
    mapServiceLayer.hide();
    toggleBasicMapButton('mapLayerButton');
    toggleBasicMapButton('satelliteLayerButton');
    refreshBasicMapCopyright();
    refreshBasicMapWatermark();
}

function showLoading() {
    esri.show(dojo.byId("loading"));
    map.disableMapNavigation();
    map.hideZoomSlider();
    map.disablePan();
    var mapButton = dojo.byId("mapLayerButton");
    mapButton.style.display = "none";
    var satelliteButton = dojo.byId("satelliteLayerButton");
    satelliteButton.style.display = "none";
    var navDiv = dojo.byId("map_navdiv");
    navDiv.style.display = "none";
}

function hideLoading() {
    gLayersLoaded++;
    var visibleLayers = 0;
    for(var i = 0; i < map.layerIds.length; i++)
    {
        var layer = map.getLayer(map.layerIds[i])
        if (layer.visible)
            visibleLayers++;
    }
    if (gLayersLoaded == visibleLayers) {
        esri.hide(dojo.byId("loading"));
        map.enableMapNavigation();
        map.showZoomSlider();
        map.enablePan();
        gLayersLoaded = 0;
        var mapButton = dojo.byId("mapLayerButton");
        mapButton.style.display = "block";
        var satelliteButton = dojo.byId("satelliteLayerButton");
        satelliteButton.style.display = "block";
        var navDiv = dojo.byId("map_navdiv");
        navDiv.style.display = "block";
    }
}


function toggleBasicMapButton(buttonName)
{
    var buttonDiv = dojo.byId(buttonName);
    var innerDiv = buttonDiv.firstChild;
    if (innerDiv.className != null && innerDiv.className == "layerButtonInner selected") {
		innerDiv.className = "layerButtonInner";
	}
	else {
		innerDiv.className = "layerButtonInner selected";		
    }
}

function renderBasicMap()
{
    map = new esri.Map("map", { slider:true, nav:true, displayGraphicsOnPan:! dojo.isIE });

    mapServiceLayer = new esri.layers.ArcGISTiledMapServiceLayer(arcGisServicesUrlStub + "/rest/services/Maps/" + baseMapServiceName + "/MapServer?token=" + g_mapToken);
	map.addLayer(mapServiceLayer);

	satelliteServiceLayer = new esri.layers.ArcGISTiledMapServiceLayer(arcGisServicesUrlStub + "/rest/services/Maps/" + satelliteMapServiceName + "/MapServer?token=" + g_mapToken);
    map.addLayer(satelliteServiceLayer);
    satelliteServiceLayer.hide();

    satelliteLabelsServiceLayer = new esri.layers.ArcGISDynamicMapServiceLayer(arcGisServicesUrlStub + "/rest/services/Maps/" + satelliteLabelsMapServiceName + "/MapServer?token=" + g_mapToken);
    map.addLayer(satelliteLabelsServiceLayer);
    satelliteLabelsServiceLayer.hide();

    //dojo.connect(mapServiceLayer, "onError", handleError);
    //dojo.connect(satelliteServiceLayer, "onError", handleError);
    //dojo.connect(satelliteLabelsServiceLayer, "onError", handleError);
    dojo.connect(map, "onLoad", refreshBasicMapWatermark);
    dojo.connect(map, "onPanEnd", refreshBasicMapWatermark);
    dojo.connect(map, "onZoomEnd", refreshBasicMapWatermark);
    dojo.connect(mapServiceLayer, "onUpdate", hideLoading);
    dojo.connect(satelliteServiceLayer, "onUpdate", hideLoading);
    dojo.connect(satelliteLabelsServiceLayer, "onUpdate", hideLoading);

    map.enableMapNavigation();
    map.showPanArrows();
}

function handleError(error)
{
    var errorDiv = dojo.byId("error")
    errorDiv.innerHTML = error.name;
    if (error.code != null && error.code != '')
        errorDiv.innerHTML += ' ' + error.code;
    if (error.message != null && error.message != '')
        errorDiv.innerHTML += ': ' + error.message
    errorDiv.style.display = "block";
}

function updateBasicMapExtent(pt, factor)
{
  if (extent) {
    //if extent already initialized, union it with point's extent
    extent = extent.union(new esri.geometry.Extent(pt.x - factor, pt.y - factor, pt.x + factor, pt.y + factor, new esri.SpatialReference({wkid:27700})));
  }
  else {
    //if extent not initialized, set it to point's extent
    extent = new esri.geometry.Extent(pt.x - factor, pt.y - factor, pt.x + factor, pt.y + factor, new esri.SpatialReference({wkid:27700}));
  }
}

function zoomBasicMapTo(x, y, infoWindow)
{
  map.centerAt(new esri.geometry.Point(x, y));
  if (infoWindow == "Y") {
    showInfo(x, y);
  }
}

function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}
      
