// CivXplorer Advanced Layer Grouping
// Suzanne Fliege
// PlanSight, LLC
// contains functions to supported grouped layers

//******************************************************************************
// master variables - don't change here
groupedlayersAvailable = true;
var groupedName = new Array();  // alias to display in layer menu
var groupedID = new Array();  // expects format to be "grouped-xxxxxxxx" or "subgroup-xxxxxxxxx"
var groupedType = new Array();  // use "overlay" "orthoimg" "optional" or "subgroup" (if using UserMgmt module, can also use "overlay-restricted", "orthoimg-restricted", "optional-restricted" and "subgroup-restricted")
var groupedIDs = new Array();  // list of layers by ID in AXL, or subgroup name(s)
var groupedVisible = new Array(); // whether group starts as visible (optional only!), if not specified, then false by default
var groupedExpand = new Array(); // whether group starts expanded in menu (optional only!), if not specified then false by default
//******************************************************************************
// SUBGROUPS are only allowed for OPTIONAL layers!!!  Not overlay or orthoimg!!!

//******************************************************************************
// Customizable variables containing groups related info
groupedName[0] = "Parcels";  // alias to display in layer menu
groupedID[0] = "grouped-parcels";  // expects format to be "grouped-xxxxxxxx"
groupedType[0] = "optional";  // use "overlay" "orthoimg" or "optional"
groupedIDs[0] = new Array("grouped-parcels-norow","grouped-parcels-withrow","grouped-txt-parid","grouped-txt-parown","grouped-txt-paracre","grouped-parcel-e911","grouped-parcels-crp","grouped-parcels-bowser");  // list of layers in the group, by ID value from AXL
groupedVisible[0] = true;

groupedName[1] = "Roads and Highways";  // alias to display in layer menu
groupedID[1] = "grouped-roads";  // expects format to be "grouped-xxxxxxxx"
groupedType[1] = "optional";  // use "overlay" "orthoimg" or "optional"
groupedIDs[1] = new Array("grouped-roads-roads","grouped-roads-hwys","grouped-txt-roads","grouped-txt-highway");  // list of layers in the group, by ID value from AXL
groupedVisible[1] = true;

groupedName[2] = "Water";  // alias to display in layer menu
groupedID[2] = "grouped-water";  // expects format to be "grouped-xxxxxxxx"
groupedType[2] = "optional";  // use "overlay" "orthoimg" or "optional"
groupedIDs[2] = new Array("grouped-water-lakes","grouped-water-streams","grouped-txt-lakename","grouped-water-watershed","grouped-water-shorelandline","grouped-water-shorelandpoly");  // list of layers in the group, by ID value from AXL
groupedVisible[2] = true;

groupedName[3] = "PLSS";  // alias to display in layer menu
groupedID[3] = "grouped-plss";  // expects format to be "grouped-xxxxxxxx"
groupedType[3] = "optional";  // use "overlay" "orthoimg" or "optional"
groupedIDs[3] = new Array("grouped-plss-townrange", "grouped-plss-towncivil", "grouped-plss-sections","grouped-plss-forty","grouped-plss-corner");  // list of layers in the group, by ID value from AXL
groupedVisible[3] = false;

groupedName[4] = "Indian Reservations";  // alias to display in layer menu
groupedID[4] = "grouped-reservation";  // expects format to be "grouped-xxxxxxxx"
groupedType[4] = "optional";  // use "overlay" "orthoimg" or "optional"
groupedIDs[4] = new Array("grouped-reservation-current","grouped-reservation-old");  // list of layers in the group, by ID value from AXL
groupedVisible[4] = false;

groupedName[5] = "Plats";  // alias to display in layer menu
groupedID[5] = "grouped-plat";  // expects format to be "grouped-xxxxxxxx"
groupedType[5] = "optional";  // use "overlay" "orthoimg" or "optional"
groupedIDs[5] = new Array("grouped-plat-plats","grouped-plat-names");  // list of layers in the group, by ID value from AXL
groupedVisible[5] = false;

groupedName[6] = "Points of Interest";  // alias to display in layer menu
groupedID[6] = "grouped-landmark";  // expects format to be "grouped-xxxxxxxx"
groupedType[6] = "optional";  // use "overlay" "orthoimg" or "optional"
groupedIDs[6] = new Array("grouped-landmark-airport","grouped-landmark-hospital","grouped-landmark-curling","grouped-landmark-cemetery", "grouped-landmark-boatlanding");  // list of layers in the group, by ID value from AXL
groupedVisible[6] = false;

groupedName[7] = "Voter Information";  // alias to display in layer menu
groupedID[7] = "grouped-voter";  // expects format to be "grouped-xxxxxxxx"
groupedType[7] = "optional";  // use "overlay" "orthoimg" or "optional"
groupedIDs[7] = new Array("grouped-voter-pollinglocation", "grouped-voter-pollingtype");  // list of layers in the group, by ID value from AXL
groupedVisible[7] = false;

groupedName[8] = "Minor Civil Divisions";  // alias to display in layer menu
groupedID[8] = "grouped-municipal";  // expects format to be "grouped-xxxxxxxx"
groupedType[8] = "optional";  // use "overlay" "orthoimg" or "optional"
groupedIDs[8] = new Array("grouped-municipal-towncivil","grouped-municipal-municipality","grouped-municipal-village");  // list of layers in the group, by ID value from AXL
groupedVisible[8] = true;

//******************************************************************************
// do not edit below here
//******************************************************************************
// get indexes for group layers, set visibility and expansion if not already
var groupedIndexes = new Array();
var groupedLayerVisible = new Array();
var groupedHasAvailableLayers = new Array();
var groupedVisibleAtStart = new Array();
function getGroupedIndexes() {
	for (var j=0;j<groupedIDs.length;j++) {
		var tempIdxAry = new Array();
		var tempVisAry = new Array();
		for (var k=0;k<groupedIDs[j].length;k++) {
			if (groupedIDs[j][k].indexOf("subgroup") == -1) {
				for (var i=0;i<LayerID.length;i++) {
					if (groupedIDs[j][k] == LayerID[i]) {
						tempIdxAry[k] = i;
						tempVisAry[k] = LayerVisibleAtStart[i];
					}
				}
			} else {
				tempIdxAry[k] = -1;
				tempVisAry[k] = "";
			}
		}
		groupedIndexes[j] = tempIdxAry;
		groupedLayerVisible[j] = tempVisAry;
		if (groupedVisible[j] == null) groupedVisible[j] = false;
		if (groupedExpand[j] == null) groupedExpand[j] = false;
		groupedVisibleAtStart[j] = groupedVisible[j];
	}
	updateGroupedLayerVisibility();
	return false;
}

// reset group visibility from "home" button
function resetGroupedOptionalVisibility() {
	for (var j=0;j<groupedIDs.length;j++) {
		groupedVisible[j] = groupedVisibleAtStart[j];
		groupedExpand[j] = false;
		var tempVisAry = new Array();
		for (var k=0;k<groupedIDs[j].length;k++) {
			if (groupedIndexes[j][k] > -1) {
				tempVisAry[k] = LayerVisibleAtStart[groupedIndexes[j][k]];
			} else {
				tempVisAry[k] = "";
			}
		}
		groupedLayerVisible[j] = tempVisAry;
	}
	updateGroupedLayerVisibility();
	return false;
}

// add grouped layers to TOC lists
function AddGroupedLayers() {
	for (i=0;i<groupedID.length;i++) {
		if ((groupedType[i] == "overlay") || (groupedType[i] == "orthoimg")) {
			tocOverlayList[tocOverlayList.length] = new Array(groupedName[i],groupedID[i],groupedType[i],groupedID[i]);
			groupedVisible[i] = false;
		} else { // optional
			if (groupedType[i] == "optional") tocOptionalList[tocOptionalList.length] = new Array(groupedName[i],groupedID[i],groupedID[i],"true");
		} // don't load subgroups or restricted groups
	}
	return false;
}

// turn off all grouped overlay layers
function TurnGroupOverlaysOff() {
	for (var j=0;j<groupedID.length;j++) {
		if ((groupedType[j] == "overlay") || (groupedType[j] == "orthoimg")) {
			for (var k=0;k<groupedIndexes[j].length;k++) {
				LayerVisible[groupedIndexes[j][k]] = "false";
			}
		}
	}
	return false;
}

// turn on specified group overlay layer
function TurnGroupOverlayOn(theGroup) {
	for (var i=0;i<groupedID.length;i++) {
		if (groupedID[i] == theGroup) {
			tocOverlayCurrent = theGroup;
			tocOverlayCurrentType = groupedType[i];
			for (var k=0;k<groupedIndexes[i].length;k++) {
				LayerVisible[groupedIndexes[i][k]] = "true";
			}
		}
	}
	return false;
}

// turn on specified group optional layer
function TurnGroupOptionalOn(theGroup) {
	for (var i=0;i<groupedID.length;i++) {
		if (groupedID[i] == theGroup) {
			groupedVisible[i] = true;
			updateGroupedLayerVisibility();
		}
	}
	return false;
}

// add layers to optional list
function getOptionalGroupList(theOptionalIndex) {
	var tempString = ""
	for (var j=0;j<groupedID.length;j++) {
		if (groupedID[j] == tocOptionalList[theOptionalIndex][1]) var tempGroupIdx = j;
	}
	var tempGroupIndexes = groupedIndexes[tempGroupIdx];
	if (groupedHasAvailableLayers[tempGroupIdx]) {
		// main layer heading
		tempString += '<tr><td width="12"><img src="images/CXfoldercontent.gif" align="middle"></td>';
		tempString += '<td class="tocLayer" align="left" colspan="3"><input type="checkbox" onclick="setGroupVisibility('+tempGroupIdx+',this.checked);" class="tocInput" name="OptionalLayerList" value="group:' + tempGroupIdx + '" ';
		if (groupedVisible[tempGroupIdx] == true) tempString += 'checked';
		tempString += '>';
		if (groupedExpand[tempGroupIdx]) {
			tempString += '<img src="images/CXfolderopened.gif" align="top" onClick="groupedExpand[\'' + tempGroupIdx + '\']=false;createTOC();">' + groupedName[tempGroupIdx] + '</td></tr>';
			// sub listings
			for (var l=0;l<tempGroupIndexes.length;l++) {
				if (tempGroupIndexes[l] == -1) { // is a subgroup
					// get subgroup index and layer index list
					var tempGroupIDs = groupedIDs[tempGroupIdx];
					for (var j=0;j<groupedID.length;j++) {
						if (groupedID[j] == tempGroupIDs[l]) var tempSubGroupIdx = j;
					}
					tempSubGroupIndexes = groupedIndexes[tempSubGroupIdx];
					if ((groupedType[tempSubGroupIdx].indexOf("restricted") == -1) && (groupedHasAvailableLayers[tempSubGroupIdx])) { // is an UNRESTRICTED subgroup
						tempString += '<tr><td></td><td width="12"><img src="images/CXfoldercontent.gif" align="middle"></td>';
						// opening checkbox and subgroup name
						tempString += '<td class="tocLayer" align="left" colspan="2"><input type="checkbox" onclick="setGroupVisibility('+tempSubGroupIdx+',this.checked);" class="tocInput" name="OptionalLayerList" value="subgroup:' + tempSubGroupIdx + '" ';
						if (groupedVisible[tempSubGroupIdx] == true) tempString += 'checked';
						tempString += '>';
						if (groupedExpand[tempSubGroupIdx]) { // expand subgroup
							tempString += '<img src="images/CXfolderopened.gif" align="top" onClick="groupedExpand[\'' + tempSubGroupIdx + '\']=false;createTOC();">' + groupedName[tempSubGroupIdx] + '</td></tr>';
							// subgroup layer list
								for (var m=0;m<tempSubGroupIndexes.length;m++) {
								if (LayerAvailable[tempSubGroupIndexes[m]] == "true") {
									tempString += '<tr><td></td><td></td><td width="12"><img src="images/CXfoldercontent.gif" align="middle"></td>';
									tempString += '<td class="tocLayer" align="left"><input type="checkbox" onclick="setGroupLayerVisibility('+tempSubGroupIdx+','+m+',this.checked);" class="tocInput" name="OptionalLayerList" value="sublayer:' + tempSubGroupIndexes[m] + '" ';
									if (groupedLayerVisible[tempSubGroupIdx][m] == "true") tempString += 'checked';
									tempString += '>' + LayerName[tempSubGroupIndexes[m]] + '</td></tr>';
								}
							}
						} else { // just subgroup listing (unexpanded)
							tempString += '<img src="images/CXfolderclosed.gif" align="top" onClick="groupedExpand[\'' + tempSubGroupIdx + '\']=true;createTOC();">' + groupedName[tempSubGroupIdx] + '</td></tr>';
						}
					}
				} else { // is a single layer
					if (LayerAvailable[tempGroupIndexes[l]] == "true") {
						tempString += '<tr><td></td><td width="12"><img src="images/CXfoldercontent.gif" align="middle"></td>';
						tempString += '<td class="tocLayer" align="left" colspan="2"><input type="checkbox" onclick="setGroupLayerVisibility('+tempGroupIdx+','+l+',this.checked);" class="tocInput" name="OptionalLayerList" value="grouplayer:' + tempGroupIndexes[l] + '" ';
						if (groupedLayerVisible[tempGroupIdx][l] == "true") tempString += 'checked';
						tempString += '>' + LayerName[tempGroupIndexes[l]] + '</td>';	
						tempString += '</tr>';
					}
				}
			}
		} else {
			tempString += '<img src="images/CXfolderclosed.gif" align="top" onClick="groupedExpand[\'' + tempGroupIdx + '\']=true;createTOC();">' + groupedName[tempGroupIdx] + '</td></tr>';
		}
	}
	return tempString;
}

// set visibility variables for group
function setGroupVisibility(idxGroup,isOn) {
	groupedVisible[idxGroup] = isOn;
	updateGroupedLayerVisibility();
	if (mapAutoUpdate) {
		UpdateLayers();
	} else {
		return false;
	}
}

// set visibility variables for group layer
function setGroupLayerVisibility(idxGroup,idxGroupLayer,isOn) {
	if (isOn) {
		groupedLayerVisible[idxGroup][idxGroupLayer] = "true";
	} else {
		groupedLayerVisible[idxGroup][idxGroupLayer] = "false";
	}
	updateGroupedLayerVisibility();
	if (mapAutoUpdate) {
		UpdateLayers();
	} else {
		return false;
	}
}

// update all (sub)group layer visibilities after (sub)group visibility change
function updateGroupedLayerVisibility() {
	for (var i=0;i<groupedID.length;i++) {
		if (groupedType[i] == "optional") {
			var tempGroupHasData = false;
			var tempGroupIndexes = groupedIndexes[i];
			var tempGroupIDs = groupedIDs[i];
			for (var j=0;j<tempGroupIndexes.length;j++) {
				if (tempGroupIndexes[j] == -1) { // is a subgroup
					// get subgroup index and layer index list
					for (var k=0;k<groupedID.length;k++) {
						if (tempGroupIDs[j] == groupedID[k]) var tempSubGroupIdx = k;
					}
					var tempSubGroupHasData = false;
					var tempSubGroupIndexes = groupedIndexes[tempSubGroupIdx];
					// go through subgroup layers
					for (var k=0;k<tempSubGroupIndexes.length;k++) {
						if (LayerAvailable[tempSubGroupIndexes[k]] == "true") tempSubGroupHasData = true;
						if ((groupedVisible[i]) && (groupedVisible[tempSubGroupIdx]) && (groupedLayerVisible[tempSubGroupIdx][k] == "true")) { // group, subgroup and layer are on, turn on layer on map
							LayerVisible[tempSubGroupIndexes[k]] = "true";
						} else {
							LayerVisible[tempSubGroupIndexes[k]] = "false";
						}
					}
					groupedHasAvailableLayers[tempSubGroupIdx] = tempSubGroupHasData;
					if (tempSubGroupHasData) tempGroupHasData = true;
				} else { // is a layer
					if (LayerAvailable[tempGroupIndexes[j]] == "true") tempGroupHasData = true;
					if ((groupedVisible[i]) && (groupedLayerVisible[i][j]) == "true") { // group and layer are on, turn on layer on map
						LayerVisible[tempGroupIndexes[j]] = "true";
					} else {
						LayerVisible[tempGroupIndexes[j]] = "false";
					}
				}
			}
			groupedHasAvailableLayers[i] = tempGroupHasData;
		}
	}
	return false;
}

