// $Revision: 3984 $
function LoadForm(bodyId, doForce, url) {
	if (doForce || !HasTagChildren(UnEscape(bodyId), "div")) {
		Busy(true);
		return LoadScript(url);
	}
	return false;
}

function getFormParameterValues(form, name) {
	var elements = getFormElements(form, name);
	var values = new Array();
	for (var i = 0; i < elements.length; i++) {
		var elem = elements[i];
		if (elem.disabled) {
			continue;
		}
		values = values.concat(getFormElementValues(elem));
	}
	return values;
}

function getFormElements(form, name) {
	var elements = new Array();
	var formElements = form.elements[name];
	if (formElements == null) {
		return elements;
	}
	if (formElements.type == "select-one" || formElements.type == "select-multiple") {
		elements.push(formElements);
		return elements;
	}
	if (formElements.length != null && formElements.length > 0) {
		for (var i = 0; i < formElements.length; i++) {
			elements.push(formElements[i]);
		}
		return elements;
	}
	elements.push(formElements);
	return elements;
}

function getFormElementValues(element) {
	var values = new Array();
	if (element.disabled) {
		return values;
	}
	switch (element.tagName.toLowerCase()) {
		case "select":
			var options = element.getElementsByTagName("option");
			for (var k = 0; k < options.length; k++) {
				if (!options[k].selected) {
					continue;
				}
				var valueNode = options[k].getAttributeNode("value");
				if (valueNode && valueNode.specified) {
					values.push(EncodeURIComponent(options[k].value));
				} else if (options[k].childNodes[0] != null) {
					var value = options[k].childNodes[0].nodeValue;
					values.push(EncodeURIComponent(Trim(value)));
				}
			}
			break;
		case "textarea":
			values.push(EncodeURIComponent(element.value));
			break;
		case "input":
			switch (element.type.toLowerCase()) {
				case "radio":
				case "checkbox":
					if (element.checked) {
						values.push(EncodeURIComponent(element.value));
					}
					break;
				case "text":
				case "password":
				case "file":
				case "hidden":
					values.push(EncodeURIComponent(element.value));
					break;
			}
			break;
	}
	return values;
}

function EncodeURIComponent(s) {
	s = encodeURIComponent(s).replace(/'/g, "%27").replace(/"/g, "%22");
	return s;
}

function SubmitForm(event, formId, doHtmlSubmit, submitButtonId, additionalParameters) {
	if (typeof event == "undefined" || event == null) {
		event = window.event;
	}
	var form = getElement(UnEscape(formId));
	if (form == null || form.tagName.toLowerCase() != "form") {
		return Finish(event);
	}
	if (submitButtonId != null) {
		var submitButton = getElement(unescape(submitButtonId));
		if (submitButton != null && submitButton.disabled) {
			return Finish(event);
		}
	}
	if (DoValidateAllInputs(form)) {
		if (doHtmlSubmit) {
			form.submit();
			return Finish(event);
		}
		var url = new Url(form.action);
		for (var i = 0; i < form.elements.length; i++) {
			url.AppendElementValues(form.elements[i]);
		}
		// additionalParameters is an array of the form [name1, value1, name2, value2...]
		if (additionalParameters != null) {
			for (var i = 0; i < additionalParameters.length; i += 2 - 0) {
				url.Append(additionalParameters[i], additionalParameters[i + 1]);
			}
		}
		window.setTimeout("LoadScript('" + url.toString() + "')", 0);
		Finish(event);
		return true;
	}
	Busy(false);
	MapBusy(false);
	Finish(event);
	return false;
}

function SubmitInputs(formId) {
	var form = getElement(UnEscape(formId));
	if (form == null || form.tagName.toLowerCase() != "form") {
		return false;
	}
	var elems = new Array();
	for (var i = 1; i < arguments.length; i++) {
		elems = elems.concat(getFormElements(form, arguments[i]));
	}
	if (DoValidateInputs(form, elems)) {
		var url = new Url(form.action);
		for (var i = 0; i < elems.length; i++) {
			url.AppendElementValues(elems[i]);
		}
		LoadScript(url.toString());
		return true;
	}
	Busy(false);
	MapBusy(false);
	return false;
}

// onclick function for checkboxes with a master or dependents or both.
function Propagate(checkbox, doUpChecked, doUpUnchecked, doDownChecked, doDownUnchecked) {
	if ((checkbox.checked && doDownChecked) || (!checkbox.checked && doDownUnchecked)) {
		PropagateDown(checkbox);
	}
	if ((checkbox.checked && doUpChecked) || (!checkbox.checked && doUpUnchecked)) {
		PropagateUp(checkbox);
	}
}

// All dependents get checked or unchecked the same as master.
function PropagateDown(master) {
	var dependentNames = (isIE) ? master.dependents : master.getAttribute("dependents");
	if (dependentNames != null) {
		dependentNames = eval(dependentNames);
		for (var i = 0; i < dependentNames.length; i++) {
			var dependent = master.form[dependentNames[i]];
			// var dependent = eval("master.form." + dependentNames[i]);
			if (dependent.checked != master.checked) {
				dependent.checked = master.checked;
				PropagateDown(dependent);
			}
		}
	}
}

// Master gets checked only if all its dependents are checked, else it gets unchecked.
function PropagateUp(dependent) {
	var masterName = (isIE) ? dependent.master : dependent.getAttribute("master");
	if (masterName != null) {
		var master = dependent.form[masterName];
		// var master = eval("dependent.form." + masterName);
		var dependentNames = (isIE) ? master.dependents : master.getAttribute("dependents");
		if (dependentNames != null) {
			dependentNames = eval(dependentNames);
			var checked = dependent.checked;
			for (var i = 0; checked && (i < dependentNames.length); i++) {
				var sibling = master.form[dependentNames[i]];
				// var sibling = eval("master.form." + dependentNames[i]);
				checked &= sibling.checked;
			}
			if (master.checked != checked) {
				master.checked = checked;
				PropagateUp(master);
			}
		}
	}
}

// Dependent's onchange function to set master radio button
function CheckMaster(dependent, masterValue) {
	var masterName = (isIE) ? dependent.master : dependent.getAttribute("master");
	if (masterName != null) {
		var masters = dependent.form[masterName];
		for (var i = 0; i < masters.length; i++) {
			if (masters[i].value == masterValue) {
				masters[i].checked = true;
				return;
			}
		}
	}
}

// Uncheck radio button on CTRL-click
function Uncheck(event) {
	if (!event) {
		event = window.event;
	}	
	if (IsCtrl(event)) {
		var elem = GetTarget(event);
		if (elem != null && elem.type == "radio") {
			elem.checked = false;
			// doesn't work on IE unless it returns nothing
			return;
		}
	}
	return false;
}

function SetFormInputValue(formId, name, value) {
	var form = getElement(UnEscape(formId));
	if (form == null || form.tagName.toLowerCase() != "form") {
		return;
	}
	var input = eval("form." + name);
	if (input == null || input.tagName.toLowerCase() != "input") {
	    return;
	}
	input.value = value;
}

function SetFocus(formId, name) {
	var form = getElement(UnEscape(formId));
	if (form == null || form.tagName.toLowerCase() != "form") {
		return;
	}
	DoSetFocus(form, name);
}

function DoSetFocus(form, name) {
	if (!IsVisibleElement(form, false)) {
		return;
	}
	var input;
	if (name == null) {
		// set focus on first visible non-disabled input
		for (var i = 0; i < form.elements.length; i++) {
			input = form.elements[i];
			if (!IsVisibleElement(input, true)) {
				continue;
			}
			if (input.disabled) {
				continue;
			}
			switch (input.type) {
				case "text":
				case "textarea":
				case "password":
				case "select-one":
				case "select-multiple":
				case "checkbox":
				case "radio":
					if (input.onclick != null) {
						continue;
					}
					// IE seems to need this done twice.
					input.focus();
					input.focus();
					return;
			}
		}
		// if none found, set focus on last visible non-disabled button
		// (which should be submit button)
		for (var i = form.elements.length - 1; i >= 0 ; i--) {
			input = form.elements[i];
			if (!IsVisibleElement(input, true)) {
				continue;
			}
			if (input.disabled) {
				continue;
			}
			switch (input.type) {
				case "button":
					input.focus();
					return;
			}
		}
		return;
	}
	input = form.elements[name];
	if (input.length != null && input.length > 0) {
		input = input[input.length - 1];
	}
	if (input != null && (input.tagName.toLowerCase() == "input" || input.tagName.toLowerCase() == "button")) {
		input.focus();
	}
}

function SubmitOnReturn(formId, event) {
	if (event == null) {
		event = window.event;
	}
	if (Dialogs != null && Dialogs.getDialogByPropertyValue("doCloseOnReturn", true) != null) {
		return true;
	}
	var r;
	var form = getElement(formId);
	if (form == null) {
		return Finish(event);
	}
	switch (event.keyCode) {
		// Return
		case 13:
			var target = GetTarget(event);
			if (target.onclick != null) {
				if (isIE) {
					target.onclick();
				} else {
					target.onclick(event);
				}
				Finish(event);
				return false;
			}
			if (target.tagName != null && target.tagName == "SELECT") {
				// don't allow return on select to submit form, unless it has an onchange script
				Finish(event);
				if (target.onchange != null) {
					target.onchange();
				}
				return false;
			}
			if (form.action == null) {
				DoPropagate(true, event);
				return false;
			}
			if (isIE) {
				form.onsubmit();
			} else {
				form.onsubmit(event);
			}
			return false;
		// Escape
		case 27:
			r = Finish(event);
			form = getElement(formId);
			if (form == null) {
				return r;
			}
			var onescape = form.onescape;
			if (onescape == null) {
				onescape = form.getAttribute("onescape");
			}
			if (onescape != null) {
				eval(onescape);
				return false;
			}
		// Pass on everything else
		default:
			return true;
	}
	return true;
}

function SubmitSearch(formId, keysString) {
	var form = getElement(UnEscape(formId));
	if (form == null || form.tagName.toLowerCase() != "form") {
		return;
	}
	var keysInput = form.searchkeys;
	if (keysInput == null) {
		return;
	}
	keysInput.value = keysString;
	return form.onsubmit();
}
