/* ***********************************************************
layer.js
Javascript for viewer.asp and find.asp pages in Map Viewer
by Howie Sternberg (howies@snet.net)

Map Viewer is placed in the public domain and is "Freeware". 
Map Viewer may be freely used and redistributed, is provided 
"AS-IS" without warranty of any kind, and there is no technical 
support provided.
--------------------------------------------------------------
Dependencies - DHTMLmapviewer.js  
--------------------------------------------------------------
History
Sep 2004, Initial code for Map Viewer 2nd Edition
May 2005, Revised for Map Viewer 3rd Edition to only support  
		  W3C DOM compatible browsers
Jul 2005, Revised for Map Viewer 3rd Edition update  
************************************************************ */

// Global variables

var zMapLayersForm = new String("document.mapLayersForm.");

/* The onclick script for layer visiblity checkboxes that enforces the 
rule that only visible layers can be identified and show legends. 
Automatically checks 'off' layer identify checkbox when user checks 
of layer visiblity checkbox. */

function setVisible(n) {
	var val = new String("");
	var visibleid = new String("v" + n + "id");
    var legendid = new String("l" + n + "id");
  	var identifyid = new String("i" + n + "id");
	var selectid = new String("s" + n + "id");
	if (!document.getElementById(visibleid).checked) {
		if (document.getElementById(legendid)) {
			document.getElementById(legendid).checked = false;
		}
		if (document.getElementById(identifyid)) {
			document.getElementById(identifyid).checked = false;
		}	
		for (var i = 0; i < document.getElementsByName("s").length; i++) {
			val = document.getElementsByName("s")[i].id;
			if (val == selectid) {
				if (document.getElementsByName("s")[i].checked) {
					document.getElementsByName("s")[i].checked = false;
				}
			}
		}
	}
}

/* The onclick script for layer Legend checkboxes that enforces a rule that only
visible layers can show a legend. Checks on layer visibility checkbox when user 
checks on layer legend checkbox. */

function setVisibleLegend(n) {
	var visibleid = new String("v" + n + "id");
    var legendid = new String("l" + n + "id");
	if (document.getElementById(legendid).checked) {
		if (document.getElementById(visibleid)) {
			document.getElementById(visibleid).checked = true;
		}
	}
}

/* The onclick script for layer Identify checkboxes that enforces a rule that only
visible layers can be identified. Checks on layer visibility and show legend
checkboxes when user checks on layer identify checkbox. */

function setVisibleIdentify(n) {
	var visibleid = new String("v" + n + "id");
    var legendid = new String("l" + n + "id");
  	var identifyid = new String("i" + n + "id");
	if (document.getElementById(identifyid).checked) {
		if (document.getElementById(visibleid)) {
			document.getElementById(visibleid).checked = true;
		}
		if (document.getElementById(legendid)) {
			document.getElementById(legendid).checked = true;
		}
	}
}

/* The onclick script for layer Select radio buttons that enforces a rule
that only visible layers can be selected. Checks on layer visibility, show 
legend, and identify checkboxes when user checks on layer select checkbox. */

function setVisibleSelect(n) {
	var val = new String("")
	var visibleid = new String("v" + n + "id");
    var legendid = new String("l" + n + "id");
  	var identifyid = new String("i" + n + "id");
	var selectid = new String("s" + n + "id"); 
	for (var i = 0; i < document.getElementsByName("s").length; i++) {
		val = document.getElementsByName("s")[i].id;
		if (val == selectid) {
			if (document.getElementById(visibleid)) {
				document.getElementById(visibleid).checked = true;
			}
			if (document.getElementById(legendid)) {
				document.getElementById(legendid).checked = true;
			}
			if (document.getElementById(identifyid)) {
				document.getElementById(identifyid).checked = true;
			}
			break;
		}
	}
}

/* The onclick script for the Apply button associated with Map Layers option.
Turns layers on and off and updates the following form elements: visible, legend,
identify, identifyminscale, identifymaxscale, selectlayerid, selectminscale, 
and selectmaxscale. Map refreshed only if layer  visiblity changed. */

function setMapLayers(f) {
	// show download message
	showDownloadMessage()
	// submit form
	var mapaction = new String("none");
	var mapactionsetactive = new String("none");
	var visible = new String("");
	var avisible = new Array();
	var legend = new String("");
	var alegend = new Array();
	var identify = new String("");
	var aidentify = new Array();
	var layerid = new String("");
	var alayerid = new Array();
	var activelayerindex = new Number(0);
	var activelayerindexprevious = new Number(0);
	var mapoptionlevel3 = new String("");

	visible = objMapForm.layersvisible.value;
	avisible = visible.split("|");
	legend = objMapForm.layerslegend.value;
	alegend = legend.split("|");
	identify = objMapForm.layersidentify.value;
	aidentify = identify.split("|");
	layerid = objMapForm.servicelayerid.value;
	alayerid = layerid.split("|")
	activelayerindex = objMapForm.activelayerindex.value;
	activelayerindexprevious = objMapForm.activelayerindexprevious.value;
	mapoptionlevel3 = objMapForm.mapoptionlevel3.value;
	
	// evaluate checkboxes and radio buttons
	
	var val = new Number(0);
	for (var i = 0; i < f.length; i++) {
		var e = f.elements[i];
		elementid = e.id;
		if (e.type == "checkbox") {
			val = parseInt(e.name);
			visibleid = "v" + val + "id";
  			legendid = "l" + val + "id";
  			identifyid = "i" + val + "id";		
			if (visibleid == elementid) {
				if (e.checked) {
					if (avisible[val] == "false") {
						// window.alert("Layer turned on: " + alayerid[val])
						mapaction = "setlayers";     // refresh map at current extent with different layer visibility
					}
					avisible[val] = true;
					
				} else {
					if (avisible[val] == "true") {
						// window.alert("Layer turned off: " + alayerid[val])
						mapaction = "setlayers"      // refresh map at current extent with different layer visibility
					}
					avisible[val] = false;
				}
			} else if (legendid == elementid) {
     			if (e.checked) {
      				alegend[val] = true;
     			} else {
      				alegend[val] = false;
     			} 
   			} else if (identifyid == elementid) {
     			if (e.checked) {
      				aidentify[val] = true;
     			} else {
      				aidentify[val] = false;
     			} 
   			}							 		
		} else if (e.type == "radio") {
			//window.alert(val)
			selectid = "s" + val + "id";
    		if (selectid == elementid) {
				if (e.checked) {
					// if user checked on the layer, set activelayerindex = radio button's value
					if ([val] != activelayerindex) {
						activelayerindex = [val];
						//window.alert("activelayerindex on = " + activelayerindex)
					  	if ((mapoptionlevel3 == "select") || (mapoptionlevel3 == "autoselect")) {
					   		// refresh map if active layerid is different and there is a selection to unselect 
       						mapactionsetactive = "setlayersandactivelayer"; 
						} else {
							mapactionsetactive = "setactivelayer"; 
						}
      				}
				} else {
					// if user checked off the layer that was previously active, set activelayerindex = -1
					if ([val] == activelayerindex) {
						//window.alert("activelayerindex is off =  " + activelayerindex)
						activelayerindex = -1;
					  	if ((mapoptionlevel3 == "select") || (mapoptionlevel3 == "autoselect")) {
					   		// refresh map if active layerid is different and there is a selection to unselect
       						mapactionsetactive = "setlayersandactivelayer";
						} else {
							mapactionsetactive = "setactivelayer"; 
						}
					}
				}
    		}
		}
 	}
	

	// Override mapaction value with value for mapactionsetactive in the event user changed more than layer visibility
	
	//window.alert("mapaction: " + mapaction + "\nmapactionsetactive: " + mapactionsetactive)
		
	if (mapactionsetactive == "setlayersandactivelayer") {
		mapaction = "setlayersandactivelayer";
	} else if ((mapactionsetactive == "setactivelayer") && (mapaction == "setlayers")) {
		mapaction = "setlayersandactivelayer";
	} else if ((mapactionsetactive == "setactivelayer") && (mapaction == "none")) {
		mapaction = "setactivelayer";
	}
	
	//window.alert("mapaction: " + mapaction)
	
	visible = avisible.toString();
	// replace "," with "|";
	var re = /,/gi;
	visible = visible.replace (re, "|");

	legend = alegend.toString();
	// replace "," with "|";
	var re = /,/gi;
	legend = legend.replace (re, "|");

	identify = aidentify.toString();
	// replace "," with "|";
	var re = /,/gi;
	identify = identify.replace (re, "|");

	objMapForm.reset();
	objMapForm.mapaction.value = mapaction;
	objMapForm.mapoptionlevel2.value = "layers";
	objMapForm.mapoptionlevel3.value = mapoptionlevel3;
	objMapForm.maptool.value = zMapTool;
	objMapForm.mapimgx.value = zImgMinX;
	objMapForm.mapimgy.value = zImgMaxY;
	objMapForm.mapimgx2.value = zImgMaxX;
	objMapForm.mapimgy2.value = zImgMinY;
	objMapForm.layersvisible.value = visible;
	objMapForm.layerslegend.value = legend;
	objMapForm.layersidentify.value = identify;
	setIdentifyLayerScaleThreshold();
	if (activelayerindex != activelayerindexprevious) {
		//window.alert("changed active layer")
		objMapForm.activelayerindex.value = activelayerindex;
		objMapForm.mapoptionlevel3.value = "none";
		//setActiveLayerScaleThreshold(activelayerindex);
	}
	//window.alert("mapaction: " + objMapForm.mapaction.value)
	//window.alert("mapoptionlevel3: " + objMapForm.mapoptionlevel3.value)
	objMapEvent.cursor = "wait";
	objMapForm.submit();
}

/* Sets identifyminscale and identifymaxscale with the smallest minscale
and highest maxscale for the group of layers that can be currently identified. 
This scale range is used to enable and disable the Identify map tool. */

function setIdentifyLayerScaleThreshold() {
	var min = new Number(999999);
	var max = new Number(-1);	
	var min2 = new Number(999999);
	var max2 = new Number(-1);	

	var identify = new String("");
	var aidentify = new Array();
	var layerminscale = new String("");
	var alayerminscale = new Array();  
	var layermaxscale = new String("");
	var alayermaxscale = new Array();  

	identify = objMapForm.layersidentify.value;
	aidentify = identify.split("|");
	layerminscale = objMapForm.servicelayerminscale.value;
	alayerminscale = layerminscale.split("|");
	layermaxscale = objMapForm.servicelayermaxscale.value;
	alayermaxscale = layermaxscale.split("|");

	// get min max scale for all identify layers	
	for (var i = 0; i < aidentify.length; i++) {
		if (aidentify[i] == "true") {
			min2 = parseFloat(alayerminscale[i]);
			max2 = parseFloat(alayermaxscale[i]);
			min = Math.min(min,min2);
			max = Math.max(max,max2);
		}
	}
	
	// set form 
	objMapForm.identifyminscale.value = min;
	objMapForm.identifymaxscale.value = max;
}

/* Sets activeminscale and activemaxscale to the minscale and maxscale values 
for the currently active layer. This scale range is used to enable and disable
the Select Map Features and Auto Select tools. */

function setActiveLayerScaleThreshold(layerindex) {
  	// init variables
	var min = new String("");
	var max = new String("");	
	var layerminscale = new String("");
	var alayerminscale = new Array();  
	var layermaxscale = new String("");
	var alayermaxscale = new Array();  
		
	// make arrays of min and max scales for all layers
	layerminscale = objMapForm.servicelayerminscale.value;
	alayerminscale = layerminscale.split("|");
	layermaxscale = objMapForm.servicelayermaxscale.value;
	alayermaxscale = layermaxscale.split("|");

	// get min max scale for active layer	
	min = alayerminscale[layerindex];
	max = alayermaxscale[layerindex];
	
	// set form 
	objMapForm.activeminscale.value = min;
	objMapForm.activemaxscale.value = max;
}
