// 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] = "Lots and Dimensions";    // alias to display in overlay dropdown
groupedID[0] = "grouped-dimensions";  // expects format to be "grouped-xxxxxxxx"
groupedType[0] = "optional";  // use "overlay" "orthoimg" or "optional"
groupedIDs[0] = new Array("grouped-dims-text","grouped-dims-lots");
groupedVisible[0] = false;
groupedExpand[0] = false;

groupedName[1] = "Storm Water Utilities";    // alias to display in overlay dropdown
groupedID[1] = "grouped-Storm Water";  // expects format to be "grouped-xxxxxxxx"
groupedType[1] = "optional";  // use "overlay" "orthoimg" or "optional"
groupedIDs[1] = new Array("grouped-storm","grouped-stormpipe");
groupedVisible[1] = false;
groupedExpand[1] = false;

groupedName[2] = "Topographic Contours";    // alias to display in overlay dropdown
groupedID[2] = "grouped-contours";  // expects format to be "grouped-xxxxxxxx"
groupedType[2] = "optional";  // use "overlay" "orthoimg" or "optional"
groupedIDs[2] = new Array("grouped-contours10","grouped-contours2");
groupedVisible[2] = false;
groupedExpand[2] = false;

groupedName[3] = "Water Features";    // alias to display in overlay dropdown
groupedID[3] = "grouped-Water";  // expects format to be "grouped-xxxxxxxx"
groupedType[3] = "optional";  // use "overlay" "orthoimg" or "optional"
groupedIDs[3] = new Array("grouped-water","grouped-hydroname");
groupedVisible[3] = true;
groupedExpand[3] = false;

groupedName[4] = "FEMA with Aerial";  // alias to display in layer menu
groupedID[4] = "grouped-fema";  // expects format to be "grouped-xxxxxxxx"
groupedType[4] = "orthoimg";  // use "overlay" "orthoimg" or "optional"
groupedIDs[4] = new Array("overlay-fema","orthoimg-2007sid");  // list of layers in the group, by ID value from AXL

/*
groupedName[6] = "Main Group";
groupedID[6] = "grouped-test1";
groupedType[6] = "optional";
groupedIDs[6] = new Array("grouped-sections","subgroup-test2","subgroup-test3");
groupedVisible[6] = true;
groupedExpand[6] = false;

groupedName[7] = "Subgroup A";
groupedID[7] = "subgroup-test2";
groupedType[7] = "subgroup";
groupedIDs[7] = new Array("grouped-subdivisions","grouped-addressgrid");
groupedVisible[7] = true;
groupedExpand[7] = true;

groupedName[8] = "Subgroup B";
groupedID[8] = "subgroup-test3";
groupedType[8] = "subgroup";
groupedIDs[8] = new Array("grouped-landmarks","grouped-railroad");
groupedVisible[8] = false;
groupedExpand[8] = false;
*/


//******************************************************************************
// 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();
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] = LayerVisible[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;
	}
	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;
}


