function getFormValue(elem) {
	return $F(elem);
}

function getMdrOptions(mdr_select_elem, mdrListStr, prompt) {
	for (i = mdr_select_elem.options.length - 1; i >= 0; i--) {
		mdr_select_elem.remove(i);
	}

	if (mdrListStr == "") {		
		makeNotRequired(mdr_select_elem, true);
		return;
	} else {
		makeRequired(mdr_select_elem, true);
	}

	var mdrs = new Array();
	addOption(mdr_select_elem, prompt, "");
	mdrs = mdrListStr.split(";;;");
	for (i = 0; i < mdrs.length - 1; i++) {
		var optionEntry = new Array();
		optionEntry = mdrs[i].split("|");
		addOption(mdr_select_elem, optionEntry[0], optionEntry[1]);
	}
}

// This function also exists in commonUtils.js and should eventually be removed from here
// when commonUtils.js is included everywhere. Leaving it for now.
function addOption(selectbox, text, value) {
	var optn = document.createElement("option");
	selectbox.options[selectbox.options.length] = new Option(text, value);
}

function changeSelection(selectbox, value) {
	for (i = selectbox.options.length - 1; i >= 0; i--) {
		if (selectbox.options[i].value == value) {
			selectbox.options[i].selected = true;
		} else {
			selectbox.options[i].selected = false;
		}
	}
}

function changeState(states_elem, districts_elem, schools_elem, freeform_elem,
		mdrtype_elem_name, org_elem, use_mdr_elem, form_name) {
	cleanupOrganization(freeform_elem, org_elem);
	setUseMdr(use_mdr_elem, 'true');
	var mdr_type = get_radio_value(mdrtype_elem_name, form_name);
	var state_id = getFormValue(states_elem);
	if (state_id >= 65) {
		cleanupDistricts(districts_elem, schools_elem);
		toggleFreeFormOrg(freeform_elem, org_elem, 'on', use_mdr_elem);
	} else if (state_id == 0) {
		cleanupDistricts(districts_elem, schools_elem);
		toggleFreeFormOrg(freeform_elem, org_elem, 'off', use_mdr_elem);
	} else {
		if (mdr_type == 'college') {
			new Ajax.Request('/mdrweb/mdr.do', {
				parameters : {
					method : 'getColleges',
					stateId : state_id
				},
				method : 'get',
				asynchronous : false,
				onSuccess : function(transport) {
					getMdrOptions(schools_elem, transport.responseText,
							"-- Select a College --");
					cleanupOrganization(freeform_elem, org_elem);
					setUseMdr(use_mdr_elem, 'true');
					toggleFreeFormOrg(freeform_elem, org_elem, 'off',
							use_mdr_elem);

					getMdrOptions(districts_elem, "", "");
				}
			});
		} else {
			new Ajax.Request('/mdrweb/mdr.do', {
				parameters : {
					method : 'getDistricts',
					stateId : state_id,
					mdrType : mdr_type
				},
				method : 'get',
				asynchronous : false,
				onSuccess : function(transport) {
					getMdrOptions(districts_elem, transport.responseText,
							"-- Select a District --");
					cleanupSchools(schools_elem);

					cleanupOrganization(freeform_elem, org_elem);
					setUseMdr(use_mdr_elem, 'true', use_mdr_elem);
					toggleFreeFormOrg(freeform_elem, org_elem, 'off',
							use_mdr_elem);
				}
			});
		}
	}
}

function changeDistrict(districts_elem, schools_elem, freeform_elem,
		mdrtype_elem_name, org_elem, use_mdr_elem, form_name) {
	makeRequired(schools_elem);
	cleanupOrganization(freeform_elem, org_elem);
	setUseMdr(use_mdr_elem, 'true');
	var mdr_type = get_radio_value(mdrtype_elem_name, form_name);
	var district_mdr_pid = getFormValue(districts_elem);
	if (district_mdr_pid == 'notfound') {
		toggleFreeFormOrg(freeform_elem, org_elem, 'on', use_mdr_elem);
		cleanupSchools(schools_elem);
		makeNotRequired(schools_elem);
	} else if (district_mdr_pid == '') {
		cleanupSchools(schools_elem);
		toggleFreeFormOrg(freeform_elem, org_elem, 'off', use_mdr_elem);
	} else {
		toggleFreeFormOrg(freeform_elem, org_elem, 'off', use_mdr_elem);
		new Ajax.Request('/mdrweb/mdr.do',
				{
					parameters : {
						method : 'getSchools',
						districtId : district_mdr_pid
					},
					method : 'get',
					asynchronous : false,
					onSuccess : function(transport) {
						getMdrOptions(schools_elem, transport.responseText,
								"-- Select a School --");
						cleanupOrganization(freeform_elem, org_elem);
						setUseMdr(use_mdr_elem, 'true');
						toggleFreeFormOrg(freeform_elem, org_elem, 'off',
								use_mdr_elem);
					}
				});
	}
}

function changeSchool(districts_elem, schools_elem, freeform_elem,
		mdrtype_elem_name, org_elem, use_mdr_elem, form_name) {
	var school_mdr_pid = getFormValue(schools_elem);
	cleanupOrganization(freeform_elem, org_elem);
	setUseMdr(use_mdr_elem, 'true');
	if (school_mdr_pid == 'notfound') {
		toggleFreeFormOrg(freeform_elem, org_elem, 'on', use_mdr_elem);
	} else if (school_mdr_pid != '') {
		toggleFreeFormOrg(freeform_elem, org_elem, 'off', use_mdr_elem);
		for ( var i = 0; i < schools_elem.options.length; i++) {
			if (schools_elem.options[i].value == school_mdr_pid) {
				setOrganization(org_elem, districts_elem,
						schools_elem.options[i].text, get_radio_value(
								mdrtype_elem_name, form_name), school_mdr_pid);
				break;
			}
		}
	} else {
		toggleFreeFormOrg(freeform_elem, org_elem, 'off', use_mdr_elem);
	}
}

function setOrganization(org_elem, districts_elem, orgName, mdrType,
		schoolMdrPid) {
	if (orgName == '-- District --') {
		for ( var i = 0; i < districts_elem.options.length; i++) {
			if (districts_elem.options[i].value == schoolMdrPid) {
				orgName = districts_elem.options[i].text;
				break;
			}
		}
	} else if (mdrType == 'private') {
		var pos = orgName.lastIndexOf("(");
		orgName = orgName.substring(0, pos - 1);
	}
	org_elem.value = orgName;
}

function setOrganizationFromFreeFormOrg(org_elem, value) {
	org_elem.value = value;
}

function cleanupOrganization(freeform_elem, org_elem) {
	freeform_elem.value = '';
	org_elem.value = '';
}

function toggleMdrType(states_elem, districts_elem, schools_elem,
		freeform_elem, org_elem, use_mdr_elem, mdr_type, schoolLabel_elem) {
	cleanupOrganization(freeform_elem, org_elem);	
	var state_id = getFormValue(states_elem);			
	
	setupMdrForm(states_elem, districts_elem, schools_elem, freeform_elem, org_elem, use_mdr_elem, mdr_type, true);
	
	if (mdr_type != 'other' && state_id > 0 && state_id < 65) {
		if (mdr_type == 'college') {
			new Ajax.Request('/mdrweb/mdr.do', {
				parameters : {
					method : 'getColleges',
					stateId : state_id
				},
				method : 'get',
				asynchronous : false,
				onSuccess : function(transport) {
					getMdrOptions(schools_elem, transport.responseText,
							"-- Select a College --");
					cleanupOrganization(freeform_elem, org_elem);
					setUseMdr(use_mdr_elem, 'true');
					toggleFreeFormOrg(freeform_elem, org_elem, 'off',
							use_mdr_elem);
					getMdrOptions(districts_elem, "", "");
				}
			});
		} else {
			new Ajax.Request('/mdrweb/mdr.do', {
				parameters : {
					method : 'getDistricts',
					stateId : state_id,
					mdrType : mdr_type
				},
				method : 'get',
				asynchronous : false,
				onSuccess : function(transport) {
					getMdrOptions(districts_elem, transport.responseText,
							"-- Select a District --");
					cleanupSchools(schools_elem);
					cleanupOrganization(freeform_elem, org_elem);
					setUseMdr(use_mdr_elem, 'true');
					toggleFreeFormOrg(freeform_elem, org_elem, 'off',
							use_mdr_elem);
				}
			});
		}
	} else if (state_id >= 65) {
		toggleFreeFormOrg(freeform_elem, org_elem, 'on', use_mdr_elem);
	}
}

function toggleFreeFormOrg(freeform_elem, org_elem, value, use_mdr_elem) {
	if (value == 'on') {
		cleanupOrganization(freeform_elem, org_elem);
		setUseMdr(use_mdr_elem, 'false');
		makeRequired(freeform_elem, true);
	} else {
		setUseMdr(use_mdr_elem, 'true');
		freeform_elem.value = '';
		makeNotRequired(freeform_elem, true);
	}
}

function setUseMdr(use_mdr_elem, value) {
	use_mdr_elem.value = value;
}

function changeContactState(contact_provinces_elem, states_elem,
		districts_elem, schools_elem, freeform_elem, mdrtype_elem_name,
		org_elem, use_mdr_elem, form_name) {
	var contact_state_value = getFormValue(contact_provinces_elem);
	for ( var i = 0; i < states_elem.options.length; i++) {
		if (states_elem.options[i].value == contact_state_value) {
			states_elem.options[i].selected = true;
		}
	}
	changeState(states_elem, districts_elem, schools_elem, freeform_elem,
			mdrtype_elem_name, org_elem, use_mdr_elem, form_name);
}

function getFormElement(element_id) {
	var contact_form = $('longForm');
	return contact_form[element_id];
}

function prepareFreeForm(use_mdr, numOfDistrict, numOfSchool) {
	try {
		if (numOfDistrict == 0)
			getFormElement('mdrQuery.districtId').disabled = true;
		if (numOfSchool == 0)
			getFormElement('mdrQuery.schoolId').disabled = true;
		if (use_mdr) {
			getFormElement('mdrQuery.freeFormOrgName').disabled = true;
		}
	} catch (e) {
	}
}

function applyZip(zip_elem, states_elem, districts_elem, schools_elem,
		freeform_elem, mdrtype_elem_name, org_elem, use_mdr_elem, form_name) {
	var zip_value = getFormValue(zip_elem);
	new Ajax.Request('/mdrweb/mdr.do', {
		parameters : {
			method : 'getZipMdrInfo',
			zipcode : zip_value
		},
		method : 'get',
		asynchronous : false,
		onSuccess : function(transport) {
			applyMdrForZip(transport.responseText, states_elem, districts_elem,
					schools_elem, freeform_elem, mdrtype_elem_name, org_elem,
					use_mdr_elem, form_name);
		}
	});
}

// states_elem can either be a single element or an array of elements
function applyMdrForZip(mdrInfo, states_elem, districts_elem, schools_elem,
		freeform_elem, mdrtype_elem_name, org_elem, use_mdr_elem, form_name) {

	if (mdrInfo != '') {
		var form = $('longForm');

		if (form_name != "undefined" && form_name != null) {
			form = $(form_name);
		}
		var radioArray = form.getInputs('radio', mdrtype_elem_name);
		radioArray.each(function(radio) {
			if (radio.value == 'public') {
				radio.checked = true;
			}
		});

		cleanupOrganization(freeform_elem, org_elem);
		setUseMdr(use_mdr_elem, 'true');
		toggleFreeFormOrg(freeform_elem, org_elem, 'off', use_mdr_elem);

		var mdrs = new Array();
		mdrs = mdrInfo.split("|||");
		if (states_elem != null && Object.isArray(states_elem)) {
			states_elem.each(function(elem) {
				changeSelection(elem, mdrs[0]);
			});
		}else {
			changeSelection(states_elem, mdrs[0]);
		}
		getMdrOptions(districts_elem, mdrs[2], "-- Select a District --");
		changeSelection(districts_elem, mdrs[1]);
		getMdrOptions(schools_elem, mdrs[3], "-- Select a School --");
	}
}

function cleanupSchools(schools_elem) {
	getMdrOptions(schools_elem, "", "");
}

function cleanupDistricts(districts_elem, schools_elem) {
	getMdrOptions(districts_elem, "", "");
	cleanupSchools(schools_elem);
}

function get_radio_value(radio_group_name, form_name) {

	var form = $('longForm');

	if (form_name != "undefined" && form_name != null) {
		form = $(form_name);
	}

	var radio_val = form.getInputs('radio', radio_group_name).find(
			function(radio) {
				return radio.checked;
			}).value;
	return radio_val;
}

/**
 * Expects a span parent element for each input 
 */
function makeRequired(obj, enableInput) {
	if (enableInput) {
		$(obj).enable();
	}
	var objSpan = $(obj).up('span');
	if (objSpan != null && !objSpan.hasClassName('required')) {
		objSpan.addClassName('required');
	}
}

/**
 * Expects a span parent element for each input with the following classes: required, requiredError 
 */
function makeNotRequired(obj, disableInput) {
	if (disableInput) {
		$(obj).disable();		
	}
	var objSpan = $(obj).up('span');
	if (objSpan != null && (objSpan.hasClassName('required') || objSpan.hasClassName('requiredError'))) {
		objSpan.removeClassName('required').removeClassName('requiredError');
	}		
}

function setupMdrForm(states_elem, districts_elem, schools_elem,freeform_elem, org_elem, use_mdr_elem, mdr_type, isMdrTypeChange) {
	switch (mdr_type) {
		case 'other' :					
			if (isMdrTypeChange) {
				cleanupDistricts(districts_elem, schools_elem);
				toggleFreeFormOrg(freeform_elem, org_elem, 'on', use_mdr_elem);
			}else {
				setUseMdr(use_mdr_elem, 'false');
				makeRequired(freeform_elem, true);
			}
			makeNotRequired(states_elem, true);
			makeNotRequired(districts_elem, true);
			makeNotRequired(schools_elem, true);
					
		break;
		
		case 'college' :			
			var stateId = getFormValue(states_elem);
			if (isMdrTypeChange) {
				cleanupDistricts(districts_elem, schools_elem);				
				toggleFreeFormOrg(freeform_elem, org_elem, 'off', use_mdr_elem);
			}else if (schools_elem.value == 'notfound' || stateId >= 65) {
				setUseMdr(use_mdr_elem, 'false');
				makeRequired(freeform_elem, true);
			}
			makeRequired(states_elem, true);
			makeNotRequired(districts_elem, true);
			if (stateId > 0 && stateId < 65) {				
				makeRequired(schools_elem);
			}else {
				if (stateId == 0) {
					toggleFreeFormOrg(freeform_elem, org_elem, 'off', use_mdr_elem);
				}
				makeNotRequired(schools_elem, true);
			}
		break;
		
		default :
			var stateId = getFormValue(states_elem);
			var isSchoolRequired = districts_elem.value == null || districts_elem.value == 0 || districts_elem.value == 'notfound' ? false : true;
			if (isMdrTypeChange) {
				toggleFreeFormOrg(freeform_elem, org_elem, 'off', use_mdr_elem);	
			}else if (districts_elem.value == 'notfound' || schools_elem.value == 'notfound' || stateId >= 65) {
				setUseMdr(use_mdr_elem, 'false');
				makeRequired(freeform_elem, true);
				if (!isSchoolRequired) {
					makeNotRequired(schools_elem, true);					
				}					
			}else {
				makeNotRequired(freeform_elem, true);
			}
			makeRequired(states_elem, true);
			if (stateId > 0 && stateId < 65) {				
				makeRequired(districts_elem);
				if (isSchoolRequired) {
					makeRequired(schools_elem);			
				}else {
					makeNotRequired(schools_elem, true)
				}
			}else {
				if (stateId == 0) {
					toggleFreeFormOrg(freeform_elem, org_elem, 'off', use_mdr_elem);
				}
				makeNotRequired(districts_elem, true);
				makeNotRequired(schools_elem, true);				
			}
		break;
	}
}
