//Copyright 2009 Joshua Saint

function loadPage()
{
	document.getElementById("btnGenerate").disabled = true;
	document.getElementById("cboDesiredLength").options.length = 0;
	addOption("cboDesiredLength", "");
	for (var i=3; i<=15; i++) {
		addOption("cboDesiredLength", i);
		}
	document.getElementById("chkInclude_L").checked = false;
	document.getElementById("chkInclude_U").checked = false;
	document.getElementById("chkInclude_N").checked = false;
	document.getElementById("chkInclude_C").checked = false;
	generateDropDowns(0);
	
	for (var i=1; i<=4; i++)
		showhideHM(i);

}

function showhideHM(ctl)
{
	switch (ctl)
	{
	case 1:
		if (document.getElementById("chkInclude_L").checked)
			document.getElementById("hm1").style.display='block';
		else
			document.getElementById("hm1").style.display='none';
		break;
	case 2:
		if (document.getElementById("chkInclude_U").checked)
			document.getElementById("hm2").style.display='block';
		else
			document.getElementById("hm2").style.display='none';
		break;	
	case 3:
		if (document.getElementById("chkInclude_N").checked)
			document.getElementById("hm3").style.display='block';
		else
			document.getElementById("hm3").style.display='none';
		break;	
	case 4:
		if (document.getElementById("chkInclude_C").checked)
			document.getElementById("hm4").style.display='block';
		else
			document.getElementById("hm4").style.display='none';
		break;	
	default:
		break;
	}
}

function chooseDesiredLength(val)
{
	if (val != "") 
		{
		generateDropDowns(val);
		document.getElementById("checkzone").style.display='block';
		document.getElementById("btnGenerate").disabled = false;
		}
	else
		startOver();
}

function generateDropDowns(max)
{
	document.getElementById("cbo_L_Count").options.length = 0;
	document.getElementById("cbo_U_Count").options.length = 0;
	document.getElementById("cbo_N_Count").options.length = 0;
	document.getElementById("cbo_C_Count").options.length = 0;
	
	for (var i=1; i<=max; i++) {
		addOption("cbo_L_Count", i);
		addOption("cbo_U_Count", i);
		addOption("cbo_N_Count", i);
		addOption("cbo_C_Count", i);
		}
}

function addOption(ctl, val)
{
	var optn = document.createElement("option");
	optn.text = val;
	optn.value = val;
	document.getElementById(ctl).options.add(optn);
}

function showInstructions()
{
	if (document.getElementById("instructions").style.visibility == "hidden")
		{
		document.getElementById("instructions").style.visibility = "visible";
		document.getElementById("show_instruct_label").innerHTML = "Hide Instructions &amp; Tips";
		}
	else
		{
		document.getElementById("instructions").style.visibility = "hidden"
		document.getElementById("show_instruct_label").innerHTML = "Show Instructions &amp; Tips";
		}
}

function highlightme(tf)
{
	if (tf)
		document.getElementById("show_instruct_label").style.color = "#FF0000";
	else
		document.getElementById("show_instruct_label").style.color = "#0000FF";

}
function startOver()
{
	document.getElementById("cboDesiredLength").options[0].selected = true;
	generateDropDowns(0);

	document.getElementById("hm1").style.display='none';
	document.getElementById("hm2").style.display='none';
	document.getElementById("hm3").style.display='none';
	document.getElementById("hm4").style.display='none';
	
	document.getElementById("chkInclude_L").checked = false;
	document.getElementById("chkInclude_U").checked = false;
	document.getElementById("chkInclude_N").checked = false;
	document.getElementById("chkInclude_C").checked = false;
	
	document.getElementById("checkzone").style.display='none';
	document.getElementById("btnGenerate").disabled = true;
}

function d2h(d)
{
	return d.toString(16).toUpperCase();
}

function generatePassword()
{
	
	if (validateForm())
		document.forms.frmPasswordCriteria.submit();
	else {
		//alert("An unknown error has occurred. Please try again.");
		startOver();
		}
}

function validateForm()
{
	var passLength = Number(document.getElementById("cboDesiredLength").value);
	var sumExact = 0;
	var minL = 0;
	var maxL = 0;
	var minU = 0;
	var maxU = 0;
	var minN = 0;
	var maxN = 0;
	var minC = 0;
	var maxC = 0;
	
	if (document.getElementById("chkInclude_L").checked)
		{
		switch (document.getElementById("cbo_L_Type").value) {
			case "0":
				minL = Number(document.getElementById("cbo_L_Count").value);
				maxL = passLength;
				break;
			case "1":
				minL = Number(document.getElementById("cbo_L_Count").value);
				maxL = Number(document.getElementById("cbo_L_Count").value);
				sumExact += minL;
				break;
			default:
				break;
			}
		}

	if (document.getElementById("chkInclude_U").checked)
		{
		switch (document.getElementById("cbo_U_Type").value) {
			case "0":
				minU = Number(document.getElementById("cbo_U_Count").value);
				maxU = passLength;
				break;
			case "1":
				minU = Number(document.getElementById("cbo_U_Count").value);
				maxU = Number(document.getElementById("cbo_U_Count").value);
				sumExact += minU;
				break;
			default:
				break;
			}
		}

	if (document.getElementById("chkInclude_N").checked)
		{
		switch (document.getElementById("cbo_N_Type").value) {
			case "0":
				minN = Number(document.getElementById("cbo_N_Count").value);
				maxN = passLength;
				break;
			case "1":
				minN = Number(document.getElementById("cbo_N_Count").value);
				maxN = Number(document.getElementById("cbo_N_Count").value);
				sumExact += minN;
				break;
			default:
				break;
			}
		}

	if (document.getElementById("chkInclude_C").checked)
		{
		switch (document.getElementById("cbo_C_Type").value) {
			case "0":
				minC = Number(document.getElementById("cbo_C_Count").value);
				maxC = passLength;
				break;
			case "1":
				minC = Number(document.getElementById("cbo_C_Count").value);
				maxC = Number(document.getElementById("cbo_C_Count").value);
				sumExact += minC;
				break;
			default:
				break;
			}
		}

	var sumMin = minL + minU + minN + minC;
	var sumMax = maxL + maxU + maxN + maxC;
	var passCalcLength = passLength - sumExact;	
	
	if (sumMin > passLength)
		{
		alert("You have asked for a password " + passLength + " characters in length, but your criteria require a minimum of " + sumMin + " characters.");
		return false;
		}

	if (sumMax < passLength)
		{
		alert("You have asked for a password " + passLength + " characters in length, but your criteria limit you to a maximum of " + sumMax + " characters.");
		return false;
		}		
	
	maxL = Math.min(maxL, passLength - (minU + minN + minC));
	maxU = Math.min(maxU, passLength - (minL + minN + minC));
	maxN = Math.min(maxN, passLength - (minL + minU + minC));
	maxC = Math.min(maxC, passLength - (minL + minU + minN));

	document.getElementById("hidData").value = d2h(passLength) + d2h(minL) + d2h(maxL) + d2h(minU) + d2h(maxU) + d2h(minN) + d2h(maxN) + d2h(minC) + d2h(maxC);

	return true;	
	
}
