var maxNetworkSpeed = 0;

function toggleForms(){
	if(selectedForm == 1){
		document.getElementById('bwdiv').style.display = 'none';
		document.getElementById('bw2div').style.display = '';
		selectedForm = 2;
	}else{
		document.getElementById('bw2div').style.display = 'none';
		document.getElementById('bwdiv').style.display = '';
		selectedForm = 1;
	}//if
}

function recalcSize(){
	var minutes = document.getElementById('minutes');
	var bitrate = document.getElementById('bitrate');
	var filesize = document.getElementById('filesize');

	var numMinutes = minutes.value;
	var bitrateBps = bitrate.value;

	if(numMinutes > 0 && bitrateBps > 0){
		filesize.value = (bitrateBps / 8) * (numMinutes * 60);
		filesizeChangeHandler();
	}
}

function redrawGraphs(){
	var filesize = document.getElementById('filesize');
	var bandwidth = document.getElementById('bandwidth');
	var agentos = document.getElementById('agentos');

	var filesizeBytes = filesize.value;
	var bandwidthBps = bandwidth.value;
	var agentosLabel = agentos.options[agentos.selectedIndex].value;

	document.getElementById('rateSpan').style.display = 'none';
	document.getElementById('timeSpan').style.display = 'none';

	if(bandwidthBps > 0 && agentosLabel != ''){
		var rateGraphUrl = "rateGraph.jsp"
				+ "?bandwidthBps=" + bandwidthBps
				+ "&agentosLabel=" + encodeURIComponent(agentosLabel);

		document.getElementById('rateGraph').src = rateGraphUrl;
		document.getElementById('rateSpan').style.display = '';

		if(filesizeBytes){
			var timeGraphUrl = "timeGraph.jsp"
					+ "?bandwidthBps=" + bandwidthBps
					+ "&agentosLabel=" + encodeURIComponent(agentosLabel)
					+ "&filesizeBytes=" + filesizeBytes;

			document.getElementById('timeGraph').src = timeGraphUrl;
			document.getElementById('timeSpan').style.display = '';
		}//if
	}//if
}

function rebuildTimes(){
	var filesize = document.getElementById('filesize');
	var bandwidth = document.getElementById('bandwidth');
	var agentos = document.getElementById('agentos');

	var filesizeBytes = filesize.value;
	var bandwidthBps = bandwidth.value;
	var agentosLabel = agentos.options[agentos.selectedIndex].value;

	if(filesizeBytes > 0 && bandwidthBps > 0 && agentosLabel != ''){
		var windowSize = operatingSystemWindows[agentosLabel];
		var latencies = operatingSystemLatencies[agentosLabel];

		var udpRates = operatingSystemUdpRates[agentosLabel];
		var tcpRates = operatingSystemTcpRates[agentosLabel];

		var newUdpTable = "";

		newUdpTable += "<thead>";

		newUdpTable += "<tr>";
		newUdpTable += "<th colspan='3'>Rates and Times : Signiant WAN Accelerator</th>";
		newUdpTable += "</tr>";

		newUdpTable += "<tr>";
		newUdpTable += "<th>Latency</th>";
		newUdpTable += "<th>Rate</th>";
		newUdpTable += "<th>Time</th>";
		newUdpTable += "</tr>";
		newUdpTable += "</thead>\n";
		newUdpTable += "<tbody>\n";

		document.getElementById('tables').innerHTML = "<strong>rebuilding</strong>";

		var newTcpTable = "";

		newTcpTable += "<thead>";
		newTcpTable += "<tr>";
		newTcpTable += "<th colspan='3'>Rates and Times : TCP</th>";
		newTcpTable += "</tr>";

		newTcpTable += "<tr>";
		newTcpTable += "<th>Latency</th>";
		newTcpTable += "<th>Rate</th>";
		newTcpTable += "<th>Time</th>";
		newTcpTable += "</tr>";
		newTcpTable += "</thead>\n";
		newTcpTable += "<tbody>\n";

		for(var i = 0; i < latencies.length; i++){
			var thisUdpRate = bandwidthBps;
			var thisTcpRate = bandwidthBps;

			var thisTcpRateTheoretical = bandwidthBps;

			if(udpRates[i] < bandwidthBps) thisUdpRate = udpRates[i];
			if(tcpRates[i] < bandwidthBps) thisTcpRate = tcpRates[i];

			var maxRateWithLatency = windowSize * 1000 / latencies[i];
			if(thisTcpRateTheoretical > maxRateWithLatency) thisTcpRateTheoretical = maxRateWithLatency;

			var rowClass = 'stdGridTableCell';
			if(i % 2 == 0) rowClass = "alt_" + rowClass;

			newUdpTable += "<tr class='" + rowClass + "'>";
			newUdpTable += "<td class='rightalign'>" + latencies[i] + " ms</td>";
			newUdpTable += "<td class='rightalign'>" + niceRate(thisUdpRate, 1) + "</td>";
			newUdpTable += "<td>" + niceTime((filesizeBytes * 8) / thisUdpRate) + "</td>";
			newUdpTable += "</tr>\n";

			newTcpTable += "<tr class='" + rowClass + "'>";
			newTcpTable += "<td class='rightalign'>" + latencies[i] + " ms</td>";
			newTcpTable += "<td class='rightalign'>" + niceRate(thisTcpRate, 1) + "</td>";
			newTcpTable += "<td>" + niceTime((filesizeBytes * 8) / thisTcpRate) + "</td>";
			newTcpTable += "</tr>\n";
		}//for
		newUdpTable += "</tbody>";
		newTcpTable += "</tbody>";

		document.getElementById('tables').innerHTML = "<table class='stdGridTable'>"
				+ newUdpTable
				+ "<tr>"
				+ "<td class='stdGridTableSpacer' colspan='3'></td>"
				+ "</tr>\n"
				+ newTcpTable
				+ "</table>";
	}
}

/* CHANGE HANDLERS */

function minutesChangeHandler(){
	cleanIntBox(document.bw.minutes);
	
	var minutes = document.getElementById('minutes');
	var numMinutes = minutes.value;

	if(numMinutes != 0)
		document.getElementById('minutesDisp').innerHTML = niceTime(numMinutes * 60, 0);
	else
		document.getElementById('minutesDisp').innerHTML = "";

	recalcSize();
	rebuildTimes();
}

function qualityChangeHandler(){
	var quality = document.getElementById('quality');
	var bitrate = document.getElementById('bitrate');
	var qualBps = quality.options[quality.selectedIndex].value;

	if(qualBps != 0){
		bitrate.value = qualBps;
		bitrateChangeHandler("no");
	}//if
	
	recalcSize();
	rebuildTimes();
}

function bitrateChangeHandler(resetCustom){
	cleanIntBox(document.bw.bitrate);

	var bitrate = document.getElementById('bitrate');
	var bitrateVal = bitrate.value;

	if(resetCustom == "yes")
		document.getElementById('quality').selectedIndex = 0;
	
	if(bitrateVal != 0)
		document.getElementById('bitrateDisp').innerHTML = niceRate(bitrateVal, 1);
	else
		document.getElementById('bitrateDisp').innerHTML = "";

	recalcSize();
	rebuildTimes();
}

function filesizeChangeHandler(){
	cleanIntBox(document.bw.filesize);

	var filesize = document.getElementById('filesize');
	var filesizeBytes = filesize.value;
	if(filesizeBytes != 0){
		document.getElementById('filesizeDisp').innerHTML = niceSize(filesizeBytes, 1);
	}else{
		document.getElementById('filesizeDisp').innerHTML = "";
	}//if

	rebuildTimes();
}

function networkChangeHandler(){
	var network = document.getElementById('network');
	var networkBps = network.options[network.selectedIndex].value;
	if(networkBps != 0)
		document.getElementById('bandwidth').value = networkBps;
	
	bandwidthChangeHandler("no");
}

function bandwidthChangeHandler(resetCustom){
	cleanIntBox(document.bw.bandwidth);

	var bandwidth = document.getElementById('bandwidth');
	var bandwidthBps = parseInt(bandwidth.value);

	if(maxNetworkSpeed == 0){
		var network = document.getElementById('network');
		for(var i = 0; i < network.options.length; i++)
			if(parseInt(network.options[i].value) > maxNetworkSpeed)
				maxNetworkSpeed = network.options[i].value;
	}//if
	
	if(bandwidthBps > maxNetworkSpeed){
		bandwidthBps = maxNetworkSpeed;
		bandwidth.value = maxNetworkSpeed;
	}//if

	if(resetCustom == "yes")
		document.getElementById('network').selectedIndex = 0;

	if(bandwidthBps != 0)
		document.getElementById('bandwidthDisp').innerHTML = niceRate(bandwidthBps, 1);
	else
		document.getElementById('bandwidthDisp').innerHTML = "";

	rebuildTimes();
}

function agentosChangeHandler(){
	rebuildTimes();
}

/* CHANGE HANDLERS #2 */

function recalcBwRequired(){
	var minutes = document.getElementById('minutes2');
	var filesize = document.getElementById('filesize2');

	var numMinutes = minutes.value;
	var filesizeBytes = filesize.value;

	if(numMinutes > 0 && filesizeBytes > 0){
		var rateBps = Math.floor((filesizeBytes * 8) / (numMinutes * 60));

		document.getElementById('bandwidthDisp2a').innerHTML = rateBps;
		document.getElementById('bandwidthDisp2b').innerHTML = "<strong>" + niceRate(rateBps, 1) + "</strong>";
	}else{
		document.getElementById('bandwidthDisp2a').innerHTML = "";
		document.getElementById('bandwidthDisp2b').innerHTML = "";
	}//if
}

function minutesChangeHandler2(){
	cleanIntBox(document.bw2.minutes2);
	
	var minutes = document.getElementById('minutes2');
	var numMinutes = minutes.value;

	if(numMinutes != 0)
		document.getElementById('minutesDisp2').innerHTML = niceTime(numMinutes * 60);
	else
		document.getElementById('minutesDisp2').innerHTML = "";

	recalcBwRequired();
}

function filesizeChangeHandler2(){
	cleanIntBox(document.bw2.filesize2);

	var filesize = document.getElementById('filesize2');
	var filesizeBytes = filesize.value;
	if(filesizeBytes != 0){
		document.getElementById('filesizeDisp2').innerHTML = niceSize(filesizeBytes, 2);
	}else{
		document.getElementById('filesizeDisp2').innerHTML = "";
	}//if

	recalcBwRequired();
}

/* UTILS */

function cleanIntBox(formField){
	var re = /[^0-9]/gi;

	var inValue = formField.value;
	var outValue = inValue.replace(re, "");

	formField.value = outValue;
	return(1);
}//function

function cleanNumBox(formField){
	var re = /[^0-9\.]/gi;

	var inValue = formField.value;
	var outValue = inValue.replace(re, "");

	formField.value = outValue;
	return(1);
}//function

function niceSize(sizeBytes, numDecimalPlaces){
	var unit = "Byte";
	var showSize = sizeBytes;

	if(sizeBytes >= (1024 * 1024 * 1024)){
		showSize = showSize / 1024 / 1024 / 1024;
		unit = "gigabyte";
	}else if(sizeBytes >= (1024 * 1024)){
		showSize = showSize / 1024 / 1024;
		unit = "megabyte";
	}else if(sizeBytes >= 1024){
		showSize = showSize / 1024;
		unit = "kilobyte";
	}else{
		numDecimalPlaces = 0;
	}//if
	
	if(numDecimalPlaces == 0){
		showSize = Math.floor(showSize);
	}else{
		var decPosn = (showSize + "").indexOf(".");
		var showSizeStr = new String(showSize);
		var decPosn = showSizeStr.indexOf(".");
		if(decPosn != -1)
			 showSize = showSizeStr.substr(0, decPosn + numDecimalPlaces + 1);

	}//if

	if(showSize > 1) unit += "s";

	outp = showSize + " " + unit;

	return(outp);
}

function niceRate(rateBps, numDecimalPlaces){
	var unit = "bit";
	var showRate = rateBps;
	
	if(isNaN(rateBps)) return("");

	if(rateBps >= (1000 * 1000 * 1000)){
		showRate = showRate / 1000 / 1000 / 1000;
		unit = "gigabit";
	}else if(rateBps >= (1000 * 1000)){
		showRate = showRate / 1000 / 1000;
		unit = "megabit";
	}else if(rateBps >= 1000){
		showRate = showRate / 1000;
		unit = "kilobit";
	}//if

	if(numDecimalPlaces == 0){
		showRate = Math.floor(showRate);
	}else{
		var showRateStr = new String(showRate);
		var decPosn = showRateStr.indexOf(".");
		if(decPosn != -1)
			 showRate = showRateStr.substr(0, decPosn + numDecimalPlaces + 1);
	}//if

	if(showRate > 1) unit += "s";

	outp = showRate + " " + unit + "/s";

	return(outp);
}

function niceTime(timeInSeconds){
	if(isNaN(timeInSeconds)) return("");

	if(timeInSeconds == 0)
		return("0 seconds");
	else if(timeInSeconds < 1)
		return("Less than a second");

	var remain = Math.floor(timeInSeconds);
	var secs = remain % 60;
	var mins = 0;
	var hours = 0;
	var days = 0;
	remain = remain - secs;
	if(remain > 0){
		remain = remain / 60;
		mins = remain % 60;
		remain = remain - mins;
		if(remain > 0){
			remain = remain / 60;
			hours = remain % 24;
			remain = remain - hours;
			if(remain > 0){
				days = remain / 24;
			}//if
		}//if
	}//if
	
	var outp = "";

	if(days == 1)
		outp = "1 day ";
	else if(days > 1)
		outp = days + " days ";

	if(hours == 1)
		outp += "1 hour ";
	else if(hours > 1)
		outp += hours + " hours ";

	if(mins == 1)
		outp += "1 minute ";
	else if(mins > 1)
		outp += mins + " minutes ";

	if(hours == 0)
		if(secs == 1)
			outp += "1 second ";
		else if(secs > 1)
			outp += secs + " seconds ";

	return(outp);
}
