
// IPv6 Subnet Calculator UI Routines
// Created 27/10/06
// Rhys Koedijk

var iLevels = Array();
var iBranchCount = 0;

// Add a subnet level
function addLevel(iSubnets) {
	
	// Subnets must be a numeric value above 0
	if(iSubnets > 0) {
	
		// Add the level in at the top of the list
		iLevels[iLevels.length] = iSubnets;
		
		// Update the list
		updateLevels();
	
	}
	
	return;
}

// Remove a subnet level
function removeLevel(iIndex) {

	// Backup the list
	iLevels[iIndex] = 0;
	var iTemp = iLevels;
	iLevels = Array();
	
	// Rebuild the list excluding the one we are to remove
	for(var i = 0; i < iTemp.length; i++) {
		if(iTemp[i] != 0) {
			iLevels[iLevels.length] = iTemp[i];
		}
	}
	
	// Update the list
	updateLevels();
	
	return;
}

// Clear all subnet levels
function clearLevels() {

	// Reinitialize the list
	iLevels = Array();
	
	// Update the list
	updateLevels();
	
	return;
}

// Update the remaining prefix display
function updatePrefix() {

	// Find the current prefix
	var iPrefix = document.getElementById("cmbPrefix").value;
	
	// Calculate the total number of bits required for the list
	var iBitRemainings = 64 - iPrefix;
	for(var i = 0; i < iLevels.length; i++) {
		
		// Find the number of bits required for this subnet level
		var iBits = 1;
		while(iLevels[i] > Math.pow(2, iBits)) {
			iBits++;
		};
		iBitRemainings -= iBits;
		
	}
	
	// Update the remaining prefix display
	var divPrefix = document.getElementById("divPrefix");
	if(iBitRemainings >= 0) {
		document.getElementById("btnCalculate").disabled = false;
		divPrefix.innerHTML = "You have " + iBitRemainings + " bits remaining for subnetting.";
	} else {
		document.getElementById("btnCalculate").disabled = true;
		divPrefix.innerHTML = "<span class=\"styRed\">You do not have enough room for this many subnet levels with this prefix.<br />" +
							  "Try removing some levels or increase the prefix.</span>";
	}
	
	// If there are no subnet levels present disable the calculation button
	if(iLevels.length == 0) {
		document.getElementById("btnCalculate").disabled = true;
	}
	
	return;
}

// Update the subnet level display
function updateLevels() {
	
	// Get the level list and reset it (adding the coloumns)
	var chkAutosize = document.getElementById("chkAutosize");
	var tblLevels = document.getElementById("tblLevels");
	tblLevels.innerHTML = '&nbsp;';
	eleTR = document.createElement("tr");
		eleTD = document.createElement("td");
		eleTD.width = "75";
		eleTD.innerHTML = "<strong>Level</strong>";
	eleTR.appendChild(eleTD);	
		eleTD = document.createElement("td");
		eleTD.width = "100";
		eleTD.innerHTML = "<strong>Subnets</strong>";
	eleTR.appendChild(eleTD);	
		eleTD = document.createElement("td");
		eleTD.width = "100";
		eleTD.innerHTML = "<strong>Bits Required</strong>";
	eleTR.appendChild(eleTD);	
		eleTD = document.createElement("td");
		eleTD.width = "75";
		eleTD.innerHTML = "&nbsp;";
	eleTR.appendChild(eleTD);
	tblLevels.appendChild(eleTR);
	
	for(var i = 0; i < iLevels.length; i++) {
		
		// Find the number of bits required for this subnet level
		var iBits = 1;
		while(iLevels[i] > Math.pow(2, iBits)) {
			iBits++;
		};
		
		// Create a new table entry for this subnet level
		eleTR = document.createElement("tr");
			eleTD = document.createElement("td");
			eleTD.width = "75";
			eleTD.innerHTML = i + 1;
		eleTR.appendChild(eleTD);	
			eleTD = document.createElement("td");
			eleTD.width = "100";
			if(i == iLevels.length - 1 && chkAutosize.checked) {
				eleTD.innerHTML = "> " + iLevels[i];
			} else {
				eleTD.innerHTML = iLevels[i];
			}
		eleTR.appendChild(eleTD);	
			eleTD = document.createElement("td");
			eleTD.width = "100";
			eleTD.innerHTML = iBits;
		eleTR.appendChild(eleTD);	
			eleTD = document.createElement("td");
			eleTD.width = "75";
			eleTD.align = "right";
			eleTD.innerHTML = "<a class=\"styRemoveLink\" herf=\"#\" onclick=\"removeLevel(" + i + ")\">Remove</a>";
		eleTR.appendChild(eleTD);
		tblLevels.appendChild(eleTR);
		
	}
	
	// Uppdate the prefix display
	updatePrefix();
	
	return;
}

// Note:
// divBranchX0 = Closed
// divBranchX1 = Open

// Hide all branches
function hideAllBranches() {
	
	// Loop through all branches and show only the closed container
	for(var iID = 0; iID < iBranchCount; iID++) {
		toggleBranch(iID, false);
	}
	
	return;
}

// Show all branches
function showAllBranches() {
	
	// Loop through all branches and show only the open container
	for(var iID = 0; iID < iBranchCount; iID++) {
		toggleBranch(iID, true);
	}
		
	return;
}

// Toggle the visiblity of a branch
function toggleBranch(iID, bVisible) {

	// If visible show the closed container else show the open container
	if(bVisible) {
		document.getElementById("divBranch" + iID + "0").style.display = "none";
		document.getElementById("divBranch" + iID + "1").style.display = "";
	} else {
		document.getElementById("divBranch" + iID + "0").style.display = "";
		document.getElementById("divBranch" + iID + "1").style.display = "none";
	}
		
	return;
}
