﻿// CivXplorer Code to support custom TOC
// Suzanne Fliege, Allied Information Solutions, Inc

// TOC display controls
var mapAutoUpdate = true;
var tocOverlayList = new Array(); //(group or layer ID, group or layer type (image/overlay), group or layer array index)
var tocOverlayCurrent = "base";
var tocOptionalList = new Array();

// initialize Overlay layers
function initializeOverlays() {
    // add individual layers
    for (var i=0; i<LayerID.length; i++){
        if (LayerTypeUser[i] == "image" || LayerTypeUser[i] == "overlay"){
            tocOverlayList[tocOverlayList.length] = new Array(LayerID[i],LayerTypeUser[i],i);
            LayerVisible[i] = false;
        }
    }
    // add groups
    for (var i=0; i<groupID.length; i++) {
        if (groupType[i] == "image" || groupType[i] == "overlay") {
            tocOverlayList[tocOverlayList.length] = new Array(groupID[i],"group",i);
            // initialize visibility
			for (var k=0;k<groupLayerIndexes[i].length;k++) {
			    LayerVisible[groupLayerIndexes[i][k]] = false;
			}
        }
    }
    // sort alphabetically
	var tempSortedLayers = tocOverlayList.sort();
	tocOverlayList = tempSortedLayers;
    return false;    
}

// initialize Optional layers
function initializeOptionals() {
    // add individual layers
    for (var i=0; i<LayerID.length; i++){
        if (LayerTypeUser[i] == "optional"){
            tocOptionalList[tocOptionalList.length] = new Array(LayerID[i],"layer",i);
        }
    }
    // add groups
    for (var i=0; i<groupID.length; i++) {
        if (groupType[i] == "optional") {
            tocOptionalList[tocOptionalList.length] = new Array(groupID[i],"group",i);
            // initialize visibility
			for (var k=0;k<groupLayerIndexes[i].length;k++) {
			    if (!groupVisible[i]){ LayerVisible[groupLayerIndexes[i][k]] = false; }
			}
        }
    }
    // sort alphabetically
	var tempSortedLayers = tocOptionalList.sort();
	tocOptionalList = tempSortedLayers;
    return false;    
}

// set variable for updating
function setMapUpdateStatus() {
	mapAutoUpdate = document.MapLayerControls.AutoUpdateMap.checked;
	return false;
}

// create the layer list for user control
function createTOC() {
	var tocContent = "";
	tocContent += '<form name="MapLayerControls">';
	tocContent += '<table cellpadding="0" cellspacing="1" width="100%" >';
	//tocContent += '<tr><td align="center" colspan="2"><input type="button" class="toolButtonNormal" value="Update the Map!" onclick="JavaScript:UpdateLayers();" onmouseover="JavaScript:this.className=\'toolButtonHighlight\';" onmouseout="JavaScript:this.className=\'toolButtonNormal\';"></td></tr>';
	// automatically update map
	//tocContent += '<tr><td style="width:30px;text-align:right;valign:center;"><input type="checkbox" onclick="setMapUpdateStatus();" class="tocInput" name="AutoUpdateMap"';
	//if (mapAutoUpdate) tocContent += ' checked';
	//tocContent += '>';
	//tocContent += '<td class="tocLayer" valign="center">Update Map Automatically</td></tr>';
	// overlay and image layers
	tocContent += '<tr><td class="tocHighlight" align="center" colspan="2">Images and Overlays</td></tr>';
	tocContent += '<tr><td align="center" colspan="2"><select id="OverlayLayerList" onchange="JavaScript:if (mapAutoUpdate) UpdateLayers();" class="tocSelect">';
	tocContent += '<option value="base"';
	if (tocOverlayCurrent == "base") tocContent += ' selected';
	tocContent += '>Base Map</option>';
	for (var i=0;i<tocOverlayList.length;i++) {
		tocContent += '<option value="' + i + '" ';
		if (tocOverlayList[i][0] == tocOverlayCurrent) { tocContent += ' selected'; }
		tocContent += '>' + tocOverlayList[i][0] + '</option>';
	}
	tocContent += '</select></td></tr>';
	tocContent += '<tr><td class="tocSmall" align="center" colspan="2"><hr><i>Some layers may only be visible at certain scales!<br><b>(like Aerial Photography)</b><br>Zoom in on the map if you cannot see a layer you have turned on.</i><hr></td></tr>';
	tocContent += '</table><table cellpadding="0" cellspacing="1" width="100%">';
	// optional layers
	tocContent += '<tr>';
	tocContent += '<td class="tocHighlight" align="center" colspan="3">Optional Layers</td>';
	tocContent += '</tr>';
	tocContent += '</table><table cellpadding="0" cellspacing="0" width="100%" >';
	for (var i=0;i<tocOptionalList.length;i++) {
		if (tocOptionalList[i][1] == "group") { // is a group
			tocContent += getOptionalGroupList(tocOptionalList[i][2]);
		} else { // is a single layer
			tocContent += '<tr>';//<td align="right"><img src="Images/foldercontent.gif" align="middle"></td>';
			tocContent += '<td class="tocLayer"><input type="checkbox" onclick="JavaScript:if (mapAutoUpdate) UpdateLayers();" class="tocInput" id="OptionalLayerList" value="layer:' + tocOptionalList[i][2] + ':' + i + '" ';
			if (LayerVisible[tocOptionalList[i][2]]) tocContent += 'checked';
			tocContent += '></td><td class="tocLayer" colspan="2">';
			tocContent += tocOptionalList[i][0];
			tocContent += '</td>';
			tocContent += '</tr>';
		}
	}
	//tocContent += '<tr><td align="center" colspan="3"><input type="button" class="toolButtonNormal" value="Update the Map!" onclick="JavaScript:UpdateLayers();" onmouseover="JavaScript:this.className=\'toolButtonHighlight\';" onmouseout="JavaScript:this.className=\'toolButtonNormal\';"></td></tr>';
	tocContent += '</table></form>';
	updateContent('cxSidebar1',tocContent);
	return false;
}

// TOC content string for group
function getOptionalGroupList(tempGroupIdx) {
	var tempString = ""
	// main layer heading
	tempString += '<tr><td class="tocLayer" align="left"><input type="checkbox" onclick="setGroupVisibility(' + tempGroupIdx + ',this.checked);" class="tocInput" id="OptionalLayerList" value="group:' + tempGroupIdx + '" ';
	if (groupVisible[tempGroupIdx] == true) { tempString += 'checked'; }
	tempString += '></td>';
	if (groupExpand[tempGroupIdx]) {
		tempString += '<td class="tocLayer" align="left"><img src="Images/folderopened.jpg" align="top" class="toolButton" onClick="groupExpand[\'' + tempGroupIdx + '\']=false;createTOC();" alt="Click to close group"></td><td class="tocLayer" align="left">' + groupID[tempGroupIdx] + '</td></tr>';
		// layer list
		for (var i=0;i<groupLayerIndexes[tempGroupIdx].length;i++) {
		    var lyrIndex = parseInt(groupLayerIndexes[tempGroupIdx][i]);
			tempString += '<tr><td></td><td width="12"><img src="Images/foldercontent.gif" align="middle"></td>';
			tempString += '<td class="tocLayer" align="left"><input type="checkbox" onclick="setGroupLayerVisibility(' + tempGroupIdx + ',' + lyrIndex + ',this.checked);" class="tocInput" id="OptionalLayerList" value="grouplayer:' + tempGroupIdx + ":" + lyrIndex + '" ';
			if (LayerTOCtoggle[lyrIndex]) tempString += 'checked';
			tempString += '>' + LayerID[lyrIndex] + '</td>';	
			tempString += '</tr>';
		}
	} else {
		tempString += '<td class="tocLayer" align="left"><img src="Images/folderclosed.jpg" align="top" class="toolButton" onClick="groupExpand[\'' + tempGroupIdx + '\']=true;createTOC();" alt="Click to open group"></td><td class="tocLayer" align="left">' + groupID[tempGroupIdx] + '</td></tr>';
	}
	return tempString;
}

// update layer visibility on the map
function UpdateLayers() {
	// get selected overlay
	var tempOverlays = document.MapLayerControls.OverlayLayerList;
	var tempIndex = tempOverlays.options[tempOverlays.selectedIndex].value;
    var tempOverlayIdx = parseInt(tempIndex);
	// reset all overlays
	for (var i=0;i<tocOverlayList.length;i++) {
	    if (tocOverlayList[i][1] != "group") { LayerVisible[tocOverlayList[i][2]] = "false"; }
	}
	TurnGroupOverlaysOff();
	// set selected overlay layer(s) visible
	if (tempIndex == "base") {
		tocOverlayCurrent = "base";
	} else {  // is a layer/group
	    if (tocOverlayList[tempOverlayIdx][1] == "group") {
		    TurnGroupOverlayOn(tocOverlayList[tempOverlayIdx][2]);
	    } else { // is a single overlay/image layer
		    LayerVisible[tocOverlayList[tempOverlayIdx][2]] = "true";
		    tocOverlayCurrent = tocOverlayList[tempOverlayIdx][0];
	    }
	}
	// optional single layers
	var tempOptional = document.MapLayerControls.OptionalLayerList;
	for (var i=0;i<tempOptional.length;i++) {
		var tempAry = tempOptional[i].value.split(":");
	    if (tempAry[0] == "layer") {
		    LayerVisible[parseInt(tempAry[1])] = tempOptional[i].checked;
		} //else { // is a group
		    //groupVisible[parseInt(tempAry[1])] = tempOptional[i].checked;
		//}
	}
	// redraw map
	var layerString = "";
	var visibleString = "";
	for (var i=0;i<LayerID.length;i++) {
	    layerString += LayerID[i] + "!";
	    visibleString += LayerVisible[i] + "!";
	}
    UpdateMapLayersHandler(layerString,visibleString);
}

// turn off all grouped overlay layers
function TurnGroupOverlaysOff() {
	for (var j=0;j<groupID.length;j++) {
		if ((groupType[j] == "overlay") || (groupType[j] == "image")) {
		    groupVisible[j] = false;
			for (var k=0;k<groupLayerIndexes[j].length;k++) {
				LayerVisible[groupLayerIndexes[j][k]] = false;
			}
		}
	}
	return false;
}

// turn on specified group overlay layer
function TurnGroupOverlayOn(theGroupIndex) {
	tocOverlayCurrent = groupID[theGroupIndex];
	for (var k=0;k<groupLayerIndexes[theGroupIndex].length;k++) {
		LayerVisible[groupLayerIndexes[theGroupIndex][k]] = true;
	}
	return false;
}

// set visibility variables for optional group & its layers
function setGroupVisibility(idxGroup,isOn) {
	groupVisible[idxGroup] = isOn;
	if (isOn) { // visibility based on TOCtoggle
	    for (var j=0;j<groupLayerIndexes[idxGroup].length;j++) {
	        LayerVisible[groupLayerIndexes[idxGroup][j]] = LayerTOCtoggle[groupLayerIndexes[idxGroup][j]];
	    }
	} else { // turn all group layers off
	    for (var j=0;j<groupLayerIndexes[idxGroup].length;j++) {
	        LayerVisible[groupLayerIndexes[idxGroup][j]] = false;
	    }
	}
	if (mapAutoUpdate) {
		UpdateLayers();
	} else {
		return false;
	}
}

// set visibility variables for individual optional group layer
function setGroupLayerVisibility(idxGroup,idxGroupLayer,isOn) {
    LayerTOCtoggle[idxGroupLayer] = isOn;
	if (groupVisible[idxGroup] && isOn) {
		LayerVisible[idxGroupLayer] = true;
	} else {
		LayerVisible[idxGroupLayer] = false;
	}
	if (mapAutoUpdate) {
		UpdateLayers();
	} else {
		return false;
	}
}
