﻿	var marker = null;
    	var myMap = null; //current map display
	var OSI1Map =null;var OSI2Map=null; //1 = Cached, 2= Dynamic
	var MQMap=null; //alternative if NO OSI or NI if zoom > 4
	var GMMap=null; //alternative if NO OSI
	var OSI_ready=true; // added Dec 2010
	var currentlevel=0;
    	var geocoder = null;
    	var poncode = null;
	var poncok = null;
	var OSI=1; var OSNI=2; var MQ=3; var GM=3;
	var mapType = OSI; // Default to OSI, or OSNI or MAPQUEST
	var dynLayer=null;
	var streetLayer =null;
	var aerialLayer =null;
	var k1Layer = null;
	var mygraphic;
	var loc8position=null;
	var scaleppm=76.0/40000.0; // pixels/metre
	var symbol=null;
	var areasymbol=null;
	var areaSize=0; //size of square in metres
	var country=null;
	var county=null;
	var town="";
	var postcode="";
	var MAXZOOM = 11;
	var MAXMQZOOM = 16;
	var MINZOOM = 0;
	var smallzoom = false;
	var mapLoaded=false;
        var layersLoaded = 0;  //variable to keep track of when all layers have been loaded.
        var loading=null;  //loading image. id
	var customLods = [];
	var loadCount = 0;
	var preloaded = false;
	var allowNewPoint = false;
        var newpointHandle = null;
	var disallowPan = false;
        var clicked_at_maxzoom = false;
        var visited_maxzoom = false;

//each page will provide its own versions of these functions
/*
	function loadmap() {
	}
*/

	function OSI_status(loc8_callback) {
	    var async = false; if(loc8_callback) async = true;
	    api_response = null;
            jQuery.ajax({
                url: api_url+"mapping_status",
                async: async,
		cache: false,
                dataType: 'json',
                data: loc8_access+"&dummy="+new Date().getTime(),
                error: function() {alert("OSI Mapping Status ajax error");if(loc8_callback) {loc8_callback(api_response );}},
                success: function(data) { 
                    	//var response = handleResponse(data);
			api_response = data.osi == "responding"; 
			if(loc8_callback) {loc8_callback(api_response );}
			}
	    });
	    if(!async) return api_response ;
	}



	var cachedLayers = 3;  // 3 if streetLayer
	function loadOSI() {
		if(dynLayer  && aerialLayer){return 2;}
		//OSI_ready = OSI_status();
                //if(!OSI_ready) return 0; // Dec 2010
	   try {
      		dojo.require("esri.map");
		if(symbol == null)
	  		symbol = new esri.symbol.PictureMarkerSymbol('/res/graphics/maps/mapmarker8.gif', 18,28).setOffset(0, 12);
		streetLayer = new esri.layers.ArcGISTiledMapServiceLayer( hybridServiceUrl + "?token=" + token, {opacity:0.05, displayLevels:[9,10]} );
        	if (streetLayer.loaded) {
        		addLods(streetLayer);
        	} else {
          		dojo.connect(streetLayer , "onLoad", addLods);
        	}
		aerialLayer = new esri.layers.ArcGISTiledMapServiceLayer( mapServiceUrl + "?token=" + token, {opacity:0.85, displayLevels:[0,1,2,3,4,5,6,7,8]} );
        	if (aerialLayer.loaded) {
          		addLods(aerialLayer);
        	} else {
          		dojo.connect(aerialLayer , "onLoad", addLods);
        	}
		k1Layer = new esri.layers.ArcGISTiledMapServiceLayer( map1kServiceUrl + "?token=" + token, {opacity:0.05, displayLevels:[11]} );
        	if (k1Layer.loaded){
          		addLods(k1Layer);
        	} else {
          		dojo.connect(k1Layer , "onLoad", addLods);
        	}
		dynLayer = new esri.layers.ArcGISDynamicMapServiceLayer( dynUrl + "?token=" + token, {opacity:0.05} );
//		dynLayer = new esri.layers.ArcGISTiledMapServiceLayer( dynUrl + "?token=" + token, {opacity:0.05, displayLevels:[9,10]} );
//        	if (dynLayer.loaded){
//          		addLods(dynLayer);
//        	} else {
//          		dojo.connect(dynLayer , "onLoad", addLods);
//        	}
		if(dynLayer && aerialLayer) {
			return 1;  //true
		}
		else
			return 0; //false
	   }
	   catch(eosi) {
		alert(" OSI Map error ");
		return false;
	   }
	}
      //Fill array with levels of detail
      function addLods(lyr) {
//        customLods = customLods.concat(lyr.tileInfo.lods);
//	MAXZOOM = customLods.length - 1;
        loadCount++;
//s=lyr.description+":";for(var i=0;i<lyr.tileInfo.lods.length;i++){s=s+lyr.tileInfo.lods[i].level+" "+lyr.tileInfo.lods[i].resolution+"\n";}
//alert(s);
	if (preloaded && loadCount == cachedLayers) {
		setTimeout(delayOSI1Map,1000);
	}
      }
	function delayOSI1Map() {
		showOSI1Map();loadOSI1Map();
	}
	var dynIncluded=false;
	function loadOSI1Map() {
		if(OSI1Map==null) {
			mapLoaded = false;
			OSI1Map = new esri.Map("OSI1mapid", {displayGraphicsOnPan:! dojo.isIE, nav:true });//lods: customLods, 
			mapType = OSI;
			myMap = OSI1Map ;
        		OSI1Map.addLayer( streetLayer ); // Make this the base layer to get correct resolution at level 10
        		OSI1Map.addLayer( aerialLayer );
        		OSI1Map.addLayer( k1Layer );
        		OSI1Map.addLayer( dynLayer );
			dynIncluded=true;
			dojo.connect(OSI1Map , "onZoomEnd", onZoomEnd);
			if (allowNewPoint) newpointHandle = dojo.connect(OSI1Map , "onClick", newPoint);
                        showLoading();
                	dojo.connect(k1Layer , "onUpdate", hideLoading);
                        if ( OSI1Map.loaded ) {
                              initVars(OSI1Map);
                        } else {
			      dojo.connect(OSI1Map , "onLoad", initVars);
                        }
			setTimeout(mapCheck,15000); // was 8000
		}
		else {
			myMap = OSI1Map;
			mapType = OSI;
			delayShowPoint();
		}
	}
        var checkmsgshown=false;
	var checkmsg ="Ordnance Survey map service is temporarily down and will be returned shortly.\nWe will use an alternative mapping service";
        function mapCheck() {
                if (mapLoaded) return;
                showMapAlert();
		OSI1Map=null;
                showPoint(mapCentre, newlevel,  GM);
        }
	function showMapAlert() {
                if ( !checkmsgshown ) {
			alert(checkmsg);
                        checkmsgshown=true;
                }
	}
	function showMapImage(){
		if (document.getElementById("map_header")) document.getElementById("map_header").style.display="none";
		if (document.getElementById("wmk")) document.getElementById("wmk").style.display="none";
		if (document.getElementById("MapImage")) document.getElementById("MapImage").style.display="block";
		if (document.getElementById("MQmapid")) document.getElementById("MQmapid").style.display="none";
		if (document.getElementById("OSI1mapid")) document.getElementById("OSI1mapid").style.display="none";
		if (document.getElementById("map_instructions")) document.getElementById("map_instructions").style.display="none";
		if (document.getElementById("scaleBox")) document.getElementById("scaleBox").style.display="none";
	}
	function showOSI1Map(){
		if (document.getElementById("map_header")) document.getElementById("map_header").style.display="block";
		document.getElementById("OSI1mapid").style.display="block";
		document.getElementById("wmk").style.display="block";  // NO watermark for MQ
		if (document.getElementById("map_instructions")) document.getElementById("map_instructions").style.display="block";
		if (document.getElementById("MapImage")) document.getElementById("MapImage").style.display="none";
		if (document.getElementById("MQmapid")) document.getElementById("MQmapid").style.display="none";
		document.getElementById("scaleBox").style.display="block";
	}
	function initVars(map){	
		mapLoaded = true;
                if(loading) esri.hide(loading);
	        document.getElementById("wmk").style.display="block";
		//map.disableScrollWheelZoom();
		map.graphics.enableMouseEvents();
		map.reposition();
		document.getElementById("scaleBox").style.display="block";
		map.showPanArrows();
		enableDrag(true);
		setTimeout(delayShowPoint,200);
	}
        function showLoading() {
                esri.show(loading);
        }
        function hideLoading() {
            esri.hide(loading);
	    document.getElementById("wmk").style.display="block";
        }
	var newlevel=0;
	function showPoint(position, level, src) {
                if(src) mapType = src;
		mapCentre = position;
		loc8position = position;
		newlevel = level;
		if(mapType!=GM) { // && (country==null || country=="Ireland")){
			var loadstatus = loadOSI();
			if(loadstatus  > 0) { // IS OSI available ?
					//1st time if GMMap preloaded, show GMMap
					if( GMMap ) {
						mapType = GM;
						myMap = GMMap;
						showGMMap();
						var GMpoint = new GLatLng(mapCentre.latitude, mapCentre.longitude);
						GMMap.setCenter(GMpoint, newlevel + 7);
              					GMMap.clearOverlays();
						marker = new GMarker(GMpoint);	
			              		GMMap.addOverlay(marker);
		if (document.getElementById("waitImage")) document.getElementById("waitImage").style.display="block";
						setTimeout(getOSIMap,4000);
						return;
					}
					else {
						setTimeout(getOSIMap,100);
						return;
					}
			}
                        else { 
                                //alert("Error. Could not load OSI maps");
                   		setTimeout(mapCheck,100);
                                return;
                        }
		}
		else {
			if(loadGM(smallzoom))
				showGMMap();
		}
		delayShowPoint();
	}
	function getOSIMap() {
		GMMap = null;
		if (document.getElementById("waitImage")) document.getElementById("waitImage").style.display="none";
	                                if(preloaded) {
        			                if (!mapLoaded) setTimeout(mapCheck,15000);
                	                        return;
                        	        } else {
						showOSI1Map();
						loadOSI1Map();
						return;
					}

	}
	var cumtime=0;
	function delayShowPoint() {
		if(document.getElementById('msg') && document.getElementById('msgcontent').innerHTML.indexOf("Searching for") > -1) {
			hideMsg();
		}
                preloaded = false;
		if(mapType==OSI) {
	  		point = new esri.geometry.Point(mapCentre.easting, mapCentre.northing, myMap.spatialReference);
	  		mygraphic = new esri.Graphic(point, symbol, null,null);// {ponc:"W8T-98-N4R"}, new esri.InfoTemplate("PONC","${ponc}"));
			showPoint2(point, newlevel);
		}
		else {
			document.getElementById("wmk").style.display="none";
			var GMpoint = new GLatLng(mapCentre.latitude, mapCentre.longitude);
			var lvl = Math.max(currentlevel + 7, newlevel + 7);
			myMap.setCenter(GMpoint, lvl);
              		myMap.clearOverlays();
			marker = new GMarker(GMpoint,{bouncy: false, icon: G_DEFAULT_ICON});	
              		myMap.addOverlay(marker);
		}
	}
	function showPoint2(point,level){
		myMap.graphics.clear();
		myMap.graphics.add(mygraphic);
		addAreagraphic();
		if(level==null) level = 5;
                var lvl= Math.max(level, currentlevel);
		myMap.centerAndZoom(point, lvl);
	}
	function resetZoom() {
		var pt = tpoint ? tpoint : point;
		myMap.centerAndZoom(pt, MINZOOM);
	}
//Drag support
	var activeGraphic = null;
	var mouseDragEvent = null, mouseDownHandle = null, mouseUpHandle = null, pointersymbol, dragsymbol;
	dragsymbol = new esri.symbol.PictureMarkerSymbol('/res/graphics/maps/mapmarker_drag.gif', 29,29);
            function graphicsOnMouseDown(evt){
		if(activeGraphic == null || activeGraphic != evt.graphic){return;}
		pointersymbol=evt.graphic.symbol;
		evt.graphic.setSymbol(dragsymbol);
		if (newpointHandle!= null)  {
                     dojo.disconnect(newpointHandle);
                     newpointHandle=null;
		}
                myMap.disableMapNavigation();
                evt.graphic.setGeometry(evt.mapPoint);
                if (mouseDragEvent != null) {
                    dojo.disconnect(mouseDragEvent);
		    mouseDragEvent = null;
                }
                mouseDragEvent = dojo.connect(myMap.graphics, "onMouseDrag", graphicsOnMouseDrag);
            }
            function graphicsOnMouseDrag(evt){
                if (mouseDragEvent) {
                        evt.graphic.setGeometry(evt.mapPoint);
                }
            }
            function graphicsOnMouseUp(evt){
                if (mouseDragEvent != null) {
                    dojo.disconnect(mouseDragEvent);
                    mouseDragEvent=null;
                    myMap.enableMapNavigation();
                    evt.graphic.setSymbol(pointersymbol);
		    newPoint(evt);
                    if (newpointHandle == null)  {
                           newpointHandle = dojo.connect(myMap , "onClick", newPoint);
                    }
                    if (mouseDragEvent != null) {
                    	dojo.disconnect(mouseDragEvent);
		    	mouseDragEvent = null;
                    }
                }
            }
            function enableDrag(bool){
                if (bool) {
                    mouseDownHandle = dojo.connect(myMap.graphics, "onMouseDown", graphicsOnMouseDown);
                    mouseUpHandle = dojo.connect(myMap.graphics, "onMouseUp", graphicsOnMouseUp);
                }
                else {
                    if (mouseDownHandle != null) 
                        dojo.disconnect(mouseDownHandle);
                    if (mouseUpHandle != null) 
                        dojo.disconnect(mouseUpHandle);
                    if (mouseDragEvent != null) {
                        dojo.disconnect(mouseDragEvent);
                    }
		    mouseDragEvent = null; mouseDownHandle = null; mouseUpHandle = null;
                }
            }
//to be defined by those requiring them
/*
	function newPoint(evt) {
	}
*/
	function onZoomEnd(extent, zoomFactor, anchor, level) {
		if(level < MINZOOM) {
			alert("Zoom levels are restricted for this activity");
			setTimeout(resetZoom,100);
			return;
		}
		currentlevel=level;			
		if(level == MAXZOOM) 
			visited_maxzoom = true;
		if (disallowPan) {
			myMap.disablePan();
			myMap.hidePanArrows();
		} else {
			if(level < MAXZOOM) {
				myMap.enablePan();
				myMap.showPanArrows();
                	} else { 
				myMap.disablePan();
				myMap.hidePanArrows();
			}
		}
		var max="40Km";
		scaleppm=76.0/40000.0;
		switch(level)
		{
case 0:
  max="40Km";
  scaleppm=76.0/40000;
  break;
case 1:
  max="12Km";
  scaleppm=76.0/12000;
  break;
case 2:
  max="9Km";
  scaleppm=76.0/9000;
  break;
case 3:
  max="4Km";
  scaleppm=76.0/4000;
  break;
case 4:
  max="2Km";
  scaleppm=76.0/2000;
  break;
case 5:
  max="1Km";
  scaleppm=76.0/1000;
  break;
case 6:
  max="500m";
  scaleppm=76.0/500;
  break;
case 7:
  max="300m";
  scaleppm=76.0/300;
  break;
case 8:
  max="200m";
  scaleppm=76.0/200;
  break;
case 9:
  max="100m";
  scaleppm=76.0/100;
  break;
case 10:
  max="40m";
  scaleppm=76.0/40;
  break;
case 11:
  max="20m";
  scaleppm=76.0/20;
  break;
case 12:
  max="10m";
  scaleppm=76.0/10;
  break;
default:
		}
		document.getElementById("scaleMax").innerHTML = " " + max + " ";

		if(level<9) {
			aerialLayer.setOpacity(0.85);
			streetLayer.setOpacity(0.01);
			k1Layer.setOpacity(0.01);
			dynLayer.setOpacity(0.01);
		}
		else if(level == 11) {
			aerialLayer.setOpacity(0.01);
			streetLayer.setOpacity(0.01);
			dynLayer.setOpacity(0.01);
			k1Layer.setOpacity(0.85);
		}
		else { //9 or 10
			var isROI = country == null || country == "Ireland";
			if(isROI) {
				aerialLayer.setOpacity(0.01);
				streetLayer.setOpacity(0.8);
				dynLayer.setOpacity(0.01);
				k1Layer.setOpacity(0.01);
			}
			else {
				aerialLayer.setOpacity(0.01);
				streetLayer.setOpacity(0.01);
				dynLayer.setOpacity(0.85);
				k1Layer.setOpacity(0.01);
			}
		}

		//add yellow area
		setTimeout(addAreagraphic,500); //longer delay
	}
        var areagraphic=null;
	function addAreagraphic() {}
	function loadGM(smallzoom) {
		if(GMMap==null) {
			if (GBrowserIsCompatible()) {
		        	GMMap = new GMap2(document.getElementById("MQmapid"));
				if(smallzoom)
			        	GMMap.addControl(new GSmallMapControl());
				else
			        	GMMap.addControl(new GLargeMapControl());
		        	GMMap.addControl(new GScaleControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(20,20)));
		        	GMMap.enableScrollWheelZoom();
				if (allowNewPoint) GEvent.addListener(GMMap, "click", newGMPoint);
				GEvent.addListener(GMMap,"dblclick",GMZoomin);
				GEvent.addListener(GMMap, "zoomend", GMZoomEnd);
			}
			else {
				alert("No Mapping Services are available.  Please try again later");
				return false;
			}
		}
		mapType = GM;
		myMap=GMMap;
		return true;
	}
	function showGMMap() {
		if (document.getElementById("map_header")) document.getElementById("map_header").style.display="block";
		document.getElementById("MQmapid").style.display="block";
		if (document.getElementById("map_instructions")) document.getElementById("map_instructions").style.display="block";
		document.getElementById("MapImage").style.display="none";
		document.getElementById("OSI1mapid").style.display="none";
		document.getElementById("scaleBox").style.display="none";
		document.getElementById("wmk").style.display="none";
    	    	var centre = new GLatLng(53.4, -8.5);
		myMap.setCenter(centre, 7);
        	myMap.checkResize();
	}
	function newGMPoint(overlay, latlong, overlaylatlng) {
		var lat = latlong.lat();
		var lng = latlong.lng();
		poncode=PONCfromLL(lat,lng);
		if(!poncode) return null;
		position = new poncPoint();
		position.latitude = lat;
		position.longitude = lng;
		NEfromLatLong(position);
		showPoint(position, myMap.getZoom()-7,  GM);
                if (currentlevel > MAXZOOM - 3) {
                    clicked_at_maxzoom = true;
                }
	}
	function GMZoomEnd(oldLevel, newLevel) {
		currentlevel = newLevel - 7;
                if(currentlevel < 0) { myMap.setZoom(7); return; }	
		if(currentlevel > MAXZOOM - 3) 
			visited_maxzoom = true;
	}
	function GMZoomin(overlay, latlng)  {
		myMap.setCenter(latlng, 1 + myMap.getZoom());
	}
	//default for OK from Dialog
	function nextpage(){}

