// JavaScript functions for the PCS effluents query application,
// effluentsquery.cgi
// by Andrew E. Schulman, 2007-01

function CheckLevel1(thisbox)
{
	// Event: a checkbox at level 1 has been checked/unchecked.
	// Inputs: thisbox = reference to the box that was checked/unchecked
	// Response: uncheck all of the other level 1 boxes of the same name;
	//           check/uncheck the corresponding level 2 boxes.

	name = thisbox.name;
	value = thisbox.value;
	valueRE = new RegExp("\\b" + value + "\\b");

	// Make arrays for the checkboxes of same name:
	// objects, HTML classes (className), and level #s
	nboxes = document.queryform[name].length;
	box      = new Array(nboxes);
	boxclass = new Array(nboxes);
	boxlevel = new Array(nboxes);
	for (j = 0; j < nboxes; ++j)
	{
		box[j]      = document.queryform[name][j];
		boxclass[j] = "all " + box[j].className;
		boxlevel[j] = boxclass[j].match(/\blevel(\d)\b/i)[1];
	}

	if (thisbox.checked)
	{
		// Box was checked.
		// Uncheck other level-1 boxes of the same name;
		// and check level-2 boxes of the same name,
		// iff their classes match the value of the checked level-1 box.
		for (j = 0; j < nboxes; ++j)
		{
			if (boxlevel[j] == 1)
			{
				box[j].checked = (box[j] == thisbox);
			}
			else
			{
				box[j].checked = (boxclass[j].search(valueRE) > -1);
			}
		}
	}
	else
	{
		// Box was unchecked
		// => uncheck all level 2 boxes of the same name.
		for (j = 0; j < nboxes; ++j)
		{
			if (boxlevel[j] == 2)
			{
				box[j].checked = 0;
			}
		}
	}
}

function CheckLevel2(thisbox)
{
	// Event: a checkbox at level 2 has been checked/unchecked.
	// Inputs: thisbox = reference to the box that was checked/unchecked
	// Response: check/uncheck the corresponding level-1 boxes.

	// Get the HTML name and class(es) of the checkbox:
	name = thisbox.name;

	// Make arrays for the checkboxes of same name:
	// objects, HTML classes (className), and level #s
	nboxes = document.queryform[name].length;
	box      = new Array(nboxes);
	boxclass = new Array(nboxes);
	boxlevel = new Array(nboxes);
	for (j = 0; j < nboxes; ++j)
	{
		box[j]      = document.queryform[name][j];
		boxclass[j] = "all " + box[j].className;
		boxlevel[j] = boxclass[j].match(/\blevel(\d)\b/i)[1];
	}

	// For each level-1 value:
	for (i = 0; i < nboxes; ++i)
	{
		if (boxlevel[i]!=1) { continue; }
		value = box[i].value;
		valueRE = new RegExp("\\b" + value + "\\b");

		// Check whether all and only the level2 checkboxes
		// of that class are checked.
		for (j = 0; j < nboxes; ++j)
		{
			if (boxlevel[j] == 2)
			{
				boxjisclassi = (boxclass[j].search(valueRE) > -1);
				if (   ( box[j].checked && !boxjisclassi)
			        || (!box[j].checked &&  boxjisclassi) )
				{
					break;
				}
			}
		}
		// if so, then go below to check the corresponding level 1 box:
		if (j==nboxes) { break; }
		// ... otherwise try the next level-1 value.
	}

	// check the first level 1 checkbox, if any, that matches all of
	// the checked level-2 values; uncheck the other level-1 boxes.
	for (j = 0; j < nboxes; ++j)
	{
		if (boxlevel[j] == 1)
		{
			box[j].checked = (j==i);
		}
	}
}

function CheckQuarterTo(from)
{
	// If the "to" quarter is less than the "from" quarter that
	// was just clicked, then reset "to" == "from".

	q1 = document.queryform.quarter1;
	q2 = document.queryform.quarter2;

	switch (q1.type) {

	case 'select-one':
		// <select> options
		if (q2.selectedIndex < q1.selectedIndex)
		{
		    q2.selectedIndex = q1.selectedIndex;
		}
		break;

	case undefined:
		// radio buttons
		for (var to = 0; to < from; ++to)
		{
			if (q2[to].checked)
			{
				q2[from].checked = true;
				return;
			}
		}
		break;
	}
}

function CheckQuarterFrom(to)
{
	// If the "from" quarter is greater than the "to" quarter that
	// was just clicked, then reset "from" == "to".

	q1 = document.queryform.quarter1;
	q2 = document.queryform.quarter2;

	switch (q1.type) {

	case 'select-one':
		// <select> options
		if (q1.selectedIndex > q2.selectedIndex)
		{
		    q1.selectedIndex = q2.selectedIndex;
		}
		break;

	case undefined:
		// radio buttons
		for (var from = q1.length-1; to < from; --from)
		{
			if (q1[from].checked)
			{
				q1[to].checked = true;
				return;
			}
		}
		break;
	}
}

function SubmitFormTo(URL)
{
	// submit the query form to the given URL,
	// if the permit ID is valid.

	document.queryform.action = URL;
	document.queryform.submit();
}

function SubmitOnEnter(field,evt,URL)
{
	// submit the query form to the given URL,
	// IF the user has pressed the enter key in a field where we want
	// that behavior, AND the permit ID is valid.
	var keycode;
	if (window.event)
		keycode = window.event.keyCode;
	else if (evt)
		keycode = evt.which;
	else
		return true;	// event not handled

	if (keycode!=13 || !IsValidPermitID())
		return true;	// event not handled

	SubmitFormTo(URL);	// event handled
}

function ResetForm(permit)
{
	// "Reset" button handler:
	// Unhide permit data, reset the query form, then enable/disable buttons as needed.

	// Unhide code fails in IE6, because IE6 won't let you set the
	// display property more than once.  Stinky piece of s***!
if (0) {
	// Unhide permit data (may have been hidden by ClearForm())
	tds = document.getElementsByTagName("td");
    for (i = 0; i < tds.length; ++i)
	{
		if (tds[i].className.search(permitdataRE) > -1)
		{
			tds[i].style.display = 'table-cell';
		}
	}
}
	document.queryform.reset();
	EnableFormElements(permit);
	document.queryform.permit.focus();
}

var ClearDefaults = [
	['charts',	'viols'],
	['pipe',	'all'],
	['paramtr',	'all'],
	['monlocn',	'effonly'],
	['outt',	'effonly'],
	['period',	'all'],
];
function ClearForm(permit)
{
	// "Clear" button handler:
	// Reset all text fields and selectors to their default values
	// for a virgin form, and hide permitdata fields.  Result
	// looks like a virgin form.

	// Can't use the hiding code, because unhide code fails in
	// IE6.  See the comment in ResetForm().
if (0) {
	// Hide permit data
	tds = document.getElementsByTagName("td");
    for (i = 0; i < tds.length; ++i)
	{
		if (tds[i].className.search(permitdataRE) > -1)
		{
			tds[i].style.display = 'none';
		}
	}
}
	// Reset form values
	document.queryform.permit.value = '';

	for (i = 0; i < document.queryform.elements.length; ++i)
	{
		elem = document.queryform.elements[i];

		switch (elem.type) {

		// text fields
//		case 'text':
//		case 'textarea':
//			elem.value = '';
//			break;

		// radio buttons and checkboxes
		case 'radio':
		case 'checkbox':
			for (j = 0; j < ClearDefaults.length; ++j)
			{
				name = ClearDefaults[j][0];
				value = ClearDefaults[j][1];

				if (elem.name == name)
				{
					if (elem.value == value && !elem.checked)
					{
						elem.click();
					}
					break;
				}
			}
			break;
		}
	}

	// dates
	q1 = document.queryform.quarter1;
	q2 = document.queryform.quarter2;
	if (q1.type == 'select-one')
	{
		// select options
		q1.selectedIndex = q1.length-12;
		q2.selectedIndex = q1.length- 1;
	}
	else if (q1.type == null)
	{
		// radio buttons
		q1[q1.length-12].click();
		q2[q1.length- 1].click();
	}

	EnableFormElements(permit);
	document.queryform.permit.focus();
}

function IsValidPermitID()
{
	// return true iff the contents of the permit field
	// are a valid permit ID
	return document.queryform.permit.value.length == 9;
}

function EnableFormElements(permit)
{
	// after loading, resetting, clearing, or otherwise changing a form,
	// enable/disable the appropriate form elements depending on the
	// current selections.

	EnableFormElementsForPermit(permit);

	// "click on" all checked radio buttons, to make sure
	// the right form elements are enabled/disabled

	for (var i = 0; i < document.queryform.elements.length; ++i)
	{
		elem = document.queryform.elements[i];
		if (elem.type == "radio" && elem.checked)
		{
			elem.click();
		}
	}
}

permitdataRE = new RegExp("\\bpermitdata\\b");
disabledRE   = new RegExp("\\bdisabled\\b");

function EnableFormElementsForPermit(permit)
{
	// enable or disable some input elements in the query form,
	// depending on whether a valid and/or new permit ID has
	// been entered in the permit text field

	isvalid = IsValidPermitID();
	ischanged = (document.queryform.permit.value != permit);

	for (var i = 0; i < document.queryform.elements.length; ++i)
	{
		elem = document.queryform.elements[i];
		if (elem.name == "search")
		{
			elem.disabled = !isvalid;
			elem.style.cursor = isvalid ? "pointer" : "default";
		}
		else if (elem.className.search(permitdataRE) > -1)
		{
			elem.disabled = ischanged ||
				elem.className.search(disabledRE) > -1 ;
		}
	}
	tds = document.getElementsByTagName("td");
    for (i = 0; i < tds.length; ++i)
	{
		if (tds[i].className.search(permitdataRE) > -1)
		{
			if (ischanged)
			{
				if (tds[i].className.search(disabledRE) == -1)
				{
					tds[i].className += " disabled";
				}
			} else {
				tds[i].className 
				= tds[i].className.replace("disabled","");
			}
		}
	}

	document.queryform.update_button.disabled = !isvalid || !ischanged;
	document.queryform.update_button.style.cursor
		= (isvalid && ischanged) ? "pointer" : "default";
}
