var epaMapArc = {
	name:'epaMap',
	gMap: null,
	mapToolbar: null,
	goodDown: null,
	goodStatic: null,
	goodUp: null,
	poorStatic: null,
	poorDown: null,
	sufficientDown: null,
	sufficientStatic: null,
	sufficientUp: null,
	clickCallback: null,
	loadedCallback: null,
	resetCallback: null,
	identifyTask: null,
	countyQueryTask: null,
	rbdQueryTask: null,
//	beachQueryTask: null,
	query: null,
	identifyParms: null,
	irelandExtent: null,
	loadingIcon: null,
	lastClicked: { x:-1, y:-1 },
	beachExtents: {},
	beachNames: {},
	rbdKeyMap: {		    // Temporary - until rbdcodes get added to rbd layer
	    'werbd' : 'Western',
	    'earbd' : 'Eastern',
	    'serbd' : 'South Eastern',
	    'swrbd' : 'South Western',
	    'shrbd' : 'Shannon',
	    'nwrbd' : 'North Western',
	    'nbrbd' : 'Neagh Bann'
	},
//	layerIDLA: 17,
	layerIDLA: 15,
//	layerIDRBD: 16,
	layerIDRBD: 14,
	mapLegendHTML:	"<table>"+
			"   <tr>"+
			"	<td><i>Legend:</i></td>"+
			    "<td>"+
				"<a href=\"#\" onClick=\"epaMapArc.infoWindow('Bathing Water Quality', 'legendBathing'); return false\">Bathing Water</a>"+
				" | <a href=\"#\" onClick=\"epaMapArc.infoWindow('River Water Quality', 'legendRiver'); return false\">River Water</a>"+
				" | <a href=\"#\" onClick=\"epaMapArc.infoWindow('Lake Water Quality', 'legendLake'); return false\">Lake Water</a>"+
				" | <a href=\"#\" onClick=\"epaMapArc.infoWindow('Estuarine & Coastal Water', 'legendEstuarine'); return false\">Estuarine & Coastal Water</a>"+
				"</td>"+
			    "</tr>"+
			"</table>",
	mapServiceV8: {serviceAddress: "http://193.1.31.119/ArcGIS/rest/services/BathingWater_v8/MapServer", serviceType: "DYNAMIC"},
	//mapServiceV9: {serviceAddress: "http://193.1.208.41/ArcGIS/rest/services/BathingWater_v9/MapServer", serviceType: "DYNAMIC"},
	mapServiceV9: {serviceAddress: "http://193.1.208.41/ArcGIS/rest/services/BathingTest/BathingTest/MapServer", serviceType: "DYNAMIC"},
	mapServiceV10: {serviceAddress: "http://193.1.208.41/ArcGIS/rest/services/Bathing_2009/MapServer", serviceType: "TILED"},
	serviceConfig: null,
	getBeachExtentWidth: function() {		// Beach extent will be 'area' this width *2*2 (in terms of irish grid)
	    return 600;
	},
	getBeachName: function(str) {
	    DWREngine.setOrdered(false);
	    return epaMapArc.beachNames[str];
	},
	load: function(holderId, clickCallback, loadedCallback, resetCallback) { 

	    // Work around for FF 3.5 icons on map
		
	    // dojo versions later than 1.3.2 should be fine
	    if (dojo.isFF == 3.5 && dojo.version.major == 1 && (dojo.version.minor < 3  || (dojo.version.minor == 3 && dojo.version.patch < 3))) {
		var setRawNode = function(rawNode){
		    // summary:
		    //  assigns and clears the underlying node that will represent this
		    //  shape. Once set, transforms, gradients, etc, can be applied.
		    //  (no fill & stroke by default)
		    var r = this.rawNode = rawNode;
		    if (this.shape.type != "image") {
			r.setAttribute("fill", "none");
		    }
		    r.setAttribute("fill-opacity", 0);
		    r.setAttribute("stroke", "none");
		    r.setAttribute("stroke-opacity", 0);
		    r.setAttribute("stroke-width", 1);
		    r.setAttribute("stroke-linecap", "butt");
		    r.setAttribute("stroke-linejoin", "miter");
		    r.setAttribute("stroke-miterlimit", 4);
		};

		// dojo.addOnLoad(function() {
		  dojox.gfx.Shape.prototype.setRawNode = setRawNode;
		// });
	    }

	    epaMapArc.serviceConfig=epaMapArc.mapServiceV10;

	    // What's the proper way to initialize these?
	    epaMapArc.poorStatic = epaMapArc.getIcon("media/PoorKey.png");
	    epaMapArc.sufficientStatic = epaMapArc.getIcon("media/SufficientKey.png");
	    epaMapArc.goodStatic= epaMapArc.getIcon("media/GoodKey.png");
	    epaMapArc.undefinedStatic= epaMapArc.getIcon("media/UndefinedKey.png");

	    epaMapArc.loadingIcon=dojo.byId('loadingImg');

	    epaMapArc.gMap = new esri.Map(holderId);
	    epaMapArc.clickCallback=clickCallback;

	    var imageParams=new esri.layers.ImageParameters();
            imageParams.layerDefinitions = [''];
            imageParams.visibleLayers = [1];
            imageParams.transparent = true;
            imageParams.format = "jpg";

	    var layer;
	    if (epaMapArc.serviceConfig.serviceType==="DYNAMIC") {
		layer=new esri.layers.ArcGISDynamicMapServiceLayer(epaMapArc.serviceConfig.serviceAddress, 
							    {imageParameters: imageParams}
							    );
	    }
	    else {
		layer=new esri.layers.ArcGISTiledMapServiceLayer(epaMapArc.serviceConfig.serviceAddress, 
							    {imageParameters: imageParams}
							    );
	    }
	    
	 
	    epaMapArc.gMap.addLayer(layer);

	    dojo.connect(layer, "onUpdate", epaMapArc.hideLoading);
/*
	    epaMapArc.gMap.addLayer(
		new esri.layers.ArcGISDynamicMapServiceLayer("http://devgis-whimbrel/ArcGIS/rest/services/BathingWater/MapServer"));
*/
	    epaMapArc.loadedCallback=loadedCallback;
	    epaMapArc.resetCallback=resetCallback;
	    epaMapArc.mapToolbar=new esri.toolbars.Navigation(epaMapArc.gMap);

	    if (dojo.byId("mapLegend") !== undefined && dojo.byId("mapLegend")!== null) {
	    	dojo.byId("mapLegend").innerHTML=epaMapArc.mapLegendHTML;
	    }

	    dojo.connect(epaMapArc.gMap, "onLoad", epaMapArc.mapLoaded);

	    // To cater for IE, we need to call this ourselves if the map is already loaded,
	    // as, apparently, the event may not fire
	    if (epaMapArc.gMap.loaded) {
	    	epaMapArc.mapLoaded(epaMapArc.gMap);
	    }

	    dojo.connect(epaMapArc.gMap, "onZoomStart", epaMapArc.showLoading);
	    dojo.connect(epaMapArc.gMap, "onPanStart", epaMapArc.showLoading);

	},
	mapLoaded: function(map) {
	    epaMapArc.hideLoading();
	    dojo.connect(map, "onClick", epaMapArc.clickedOnBeach);

	    // Just for good luck (and IE), we'll connect to the graphics layer too
	    dojo.connect(map.graphics, "onClick", epaMapArc.clickedOnBeach);

	    epaMapArc.irelandExtent=epaMapArc.gMap.extent;

	    epaMapArc.countyQueryTask = new esri.tasks.QueryTask(epaMapArc.serviceConfig.serviceAddress+"/"+epaMapArc.layerIDLA);
	    epaMapArc.rbdQueryTask = new esri.tasks.QueryTask(epaMapArc.serviceConfig.serviceAddress+"/"+epaMapArc.layerIDRBD);

	    epaMapArc.identifyParms = new esri.tasks.IdentifyParameters();
	    epaMapArc.identifyParms.tolerance = 8;	    // Use this for the mo
	    epaMapArc.identifyParms.returnGeometry =false;
	    // This is original epaMapArc.identifyParms.returnGeometry = true;
	    //selectanble layer ids from rest service. bathing water is 1
	    epaMapArc.identifyParms.layerIds = [1];
	    epaMapArc.identifyParms.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;
	    epaMapArc.gMap.enablePan();
	    epaMapArc.mapButton('deactivate');

	    epaMapArc.loadedCallback();
	},
	getIcon: function(url) {
		return new esri.symbol.PictureMarkerSymbol(url, 10, 10);
	},
	to: function(key, type, lat, lon, zoom) {
	    if (type==='IRELAND') {
	    	epaMapArc.setExtent(epaMapArc.irelandExtent);
	    }
	    else if (type==='COUNTY') {
	    	epaMapArc.getCountyExtent(key);
	    }
	    else if (type==='RBD') {
	    	epaMapArc.getRbdExtent(key);
	    }
	    else {
	    	epaMapArc.getBeachExtent(key);
	    }
	},
	xLevel: function(zoom) {
	    return zoom-1;
	},
	addbeach: function(location, status, trend) {
		if (status !== undefined && status !== null) {
			var icon;
			if (status === common.KEY_POOR) {
			    icon = epaMapArc.poorStatic;
			}
			else if (status === common.KEY_SUFFICIENT) {
			    icon = epaMapArc.sufficientStatic;
			}
			else if (status === common.KEY_GOOD) {
			    icon = epaMapArc.goodStatic;
			} 
			else if (status === common.KEY_UNDEFINED) {
				icon = epaMapArc.undefinedStatic;
			}
			var marker = new esri.Graphic(new esri.geometry.Point(location.position.x, location.position.y), icon);
			marker.data = {beachKey: location.key, status: status};
			epaMapArc.gMap.graphics.add(marker);
		}

		// Calculate extent
		epaMapArc.beachExtents[location.key]=epaMapArc.calcBeachExtent(location.position.x, location.position.y);
		epaMapArc.beachNames[location.key]=location.name;

	},
	clearbeaches: function() {
		epaMapArc.gMap.graphics.clear();
	},

	clickedOnBeach : function(evt) {
		if (evt.graphic !== undefined) {
			var idbw = evt.graphic.data.beachKey;
			var beachName = utils.camelCase(epaMapArc.beachNames[idbw]);
			var status = evt.graphic.data.status;
			if (status === "Undefined") {
				status = "Not available";
			}
			if (epaMapArc.beachExtents[idbw] !== undefined) {
				epaMapArc.gMap.infoWindow.setTitle("Bathing Water Quality");
				epaMapArc.gMap.infoWindow.resize(200, 180);
				epaMapArc.gMap.infoWindow.setContent("<div id=\"infoWindowPane\">" +
					"<table>" +
					"<tr><td colspan='2'><a href=\"#\" onClick=\"epaMapArc.gotoBeach('" + idbw + "'); return false\">" +
					beachName + "</a></td></tr>" +
					"<tr><td>Blue Flag:</td><td><span id='blueFlagPopup'></span></td></tr>" +
					"<tr><td>Water Quality:</td><td>" + status + "</td></tr>" +
					"<tr><td colspan='2'><img src='media/photos/" + idbw + ".jpg' width='80' length='60' /></td></tr>" +
					"</table></div>");
				common.updateBeachPopupInfo(idbw);
				epaMapArc.gMap.infoWindow.show(evt.screenPoint, epaMapArc.gMap.getInfoWindowAnchor(evt.screenPoint));
			}
		} else {
			// Only hide the window if we're not handling a previously handled event
			if (evt.screenX!==epaMapArc.lastClicked.x || evt.screenY!==epaMapArc.lastClicked.y) {
			    epaMapArc.gMap.infoWindow.hide();
			}
		}

		// Record screen points
		epaMapArc.lastClicked.x=evt.screenX;
		epaMapArc.lastClicked.y=evt.screenY;
	},
	gotoBeach: function(idbw) {
	    epaMapArc.gMap.infoWindow.hide();
	    epaMapArc.clickCallback(idbw);
	},
	getCountyExtent: function(key) {
	    var query=new esri.tasks.Query();
	    query.outFields=['EDEN_code','Extent'];
	    query.returnGeometry=false;
	    //query.returnGeometry=true;
	    query.where="where EDEN_code='"+key+"'";
	    epaMapArc.showLoading();
	    epaMapArc.countyQueryTask.execute(query, function(featureSet) {
			if (featureSet.features.length>0) {
			   
			   var myArray= featureSet.features[0].attributes["Extent"].toString().split(",");
			   
			    
			var myextent = new esri.geometry.Extent(myArray[2]-0, myArray[3]-0, myArray[0]-0, myArray[1]-0, epaMapArc.gMap.extent.spatialReference);

			    epaMapArc.setExtent(myextent);
			}
	    });

	},
	getRbdExtent: function(key) {
	    var query=new esri.tasks.Query();
	    query.outFields=['OBJECTID','Extent'];
	    query.returnGeometry=false;
	    //query.returnGeometry=true;
	    query.where="where Name='"+epaMapArc.rbdKeyMap[key]+"'";
	    epaMapArc.showLoading();
	    epaMapArc.rbdQueryTask.execute(query, function(featureSet) {
			if (featureSet.features.length>0) {
			  var myArray= featureSet.features[0].attributes["Extent"].toString().split(",");
			   
			    
			var myextent = new esri.geometry.Extent(myArray[2]-0, myArray[3]-0, myArray[0]-0, myArray[1]-0,epaMapArc.gMap.extent.spatialReference);


				epaMapArc.setExtent(myextent);
			}
	    });
	},
	getBeachExtent: function(key) {
	    if (epaMapArc.beachExtents[key]!==undefined) {
	    	epaMapArc.setExtent(epaMapArc.beachExtents[key]);
	    }
	    else {
	    	console.log("Can't find location of "+key);
	    }
	},
	calcBeachExtent: function(x, y) {
	    var width=epaMapArc.getBeachExtentWidth();
	    var extent=new esri.geometry.Extent(x-width, y-width, x+width, y+width,
		    epaMapArc.gMap.extent.spatialReference);
	    return extent;
	},
	setExtent: function(extent) {
	    epaMapArc.showLoading();
	    epaMapArc.gMap.setExtent(extent);
	},
	showLoading: function() {
	
	esri.hide(epaMapArc.loadingIcon);

	    esri.show(epaMapArc.loadingIcon);
	    epaMapArc.gMap.hideZoomSlider();
	    epaMapArc.gMap.infoWindow.hide();
	},
	hideLoading: function() {
	    esri.hide(epaMapArc.loadingIcon);
	    //epaMapArc.gMap.showZoomSlider();
	},
	mapButton: function(button) {
	    dojo.query('.mapToolbarButton').style('opacity', '0.4');
	    dojo.query('#'+button).style('opacity', '1');

	    // Now combine deactivate and pan
	    if (button==='deactivate') {
		dojo.query('#pan').style('opacity', '1');
	    }
	},
	infoWindow: function(title, id) {
	    var dom=$('#'+id);

	    epaMapArc.gMap.infoWindow.setTitle(title);
	    epaMapArc.gMap.infoWindow.setContent(dom.html());
	    epaMapArc.gMap.infoWindow.resize(250, 250);
	    var point=new esri.geometry.Point(epaMapArc.gMap.width/2, epaMapArc.gMap.height);
	    epaMapArc.gMap.infoWindow.show(point, epaMapArc.gMap.getInfoWindowAnchor(point));
//	    dom.show();
	},
	activate: function(type) {
	    epaMapArc.gMap.disablePan();
	    epaMapArc.mapToolbar.activate(type);
	},
	deactivate: function() {
	    // When user clicks info button
	    epaMapArc.mapToolbar.deactivate();
	    epaMapArc.gMap.enablePan();
	},
	zoomToFullExtent: function() {
	    epaMapArc.mapToolbar.zoomToFullExtent();
	    epaMapArc.resetCallback();
	}
};

