function createRequestObject() {
	var xmlhttp=false;
	/*@cc_on @*/
	/*@if (@_jscript_version >= 5)
	// JScript gives us Conditional compilation, we can cope with old IE versions.
	// and security blocked creation of the objects.
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
		}
	}
	@end @*/
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		xmlhttp = new XMLHttpRequest();
	}
	return xmlhttp;
}

function requestDropdownItems(step, guid) {
	var http = createRequestObject();
	var url = "/jcore/hallpass/util/HallPassAjaxUtil.jsp?step=" + step + "&";
	if (guid.indexOf('|') != -1) {
		var guids = guid.split('|');
		url += "orgtypeguid=" + guids[1];
	} else {
		url += "objectguid=" + guid;
	}
    http.onreadystatechange = function() {
		if (http.readyState == 4){
			if (http.status == 200) {
				var response = http.responseText;
				var patternBegin = new RegExp("/^\s+/", "g");
				var patternEnd = new RegExp("/\s+$/", "g");
				
				if (response.indexOf('|') != -1) {
					data = response.split('|');
					var cbo = document.getElementById(data[0]);
					cbo.options.length = 1;
					
					for (var i = 1; i < data.length; i++) {
						var option = data[i].split('::');
						cbo.options[cbo.options.length] = new Option(TrimString(option[1]), TrimString(option[0]));
					}
				} else {
					// An error was returned
					data = response.split('^');
					var div = document.getElementById(data[0]);
					div.setAttribute('class', 'PageErrorMessages');
					div.style.width = '525px';
					
					var span = document.getElementById('errorCode');
					if (span == null) {
						span = document.createElement('span');
						span.setAttribute('id', 'errorCode');
						div.appendChild(span);
					}
					span.innerHTML = '<br /><br />' + data[1];
				}
			} else {
				alert("There was a problem retrieving the data: " + http.status);
			}
		}
    }
    http.open("GET", url, true);
    http.send(null);
}

function orgSearch(page) {
	var i = 0;
	var x = null;

	page = (page == null || page.length == 0) ? '1' : page;
	
	var searchText = document.getElementById('txtSearch').value;
	var searchOption = document.getElementById('cboSearchOption').value;
	var positionGuid = document.getElementById('cboPosition').value;
	var orgCategoryGuid = '';
	var orgTypeGuid = '';
	
	// Get selected optOrgTypeCategory
	x = document.getElementsByName('optOrgTypeCategory');
	for (i = 0; i < x.length; i++) {
		if (x[i].checked) {
		    orgCategoryGuid = x[i].value;
		}
	}
	
	// Get selected optOtherTypeCategory
	x = document.getElementsByName('optOtherTypeCategory');
	for (i = 0; i < x.length; i++) {
		if (x[i].checked) {
		    orgTypeGuid = x[i].value;
		}
	}
	
	var searchingTable = '<table border="0" cellpadding="0" cellspacing="0" width="575" align=center>'
	                   + '<tr class="PageBodyListClear"><td colspan=3><br /></td></tr>'
	                   + '<tr class="ListHeader">'
	                   + '<td class="PageBodyList" nowrap>IRN/ID</td>'
	                   + '<td class="PageBodyList" align="center" nowrap>Name</td>'
	                   + '<td class="PageBodyList" align="center" nowrap>County</td>'
	                   + '</tr>'
	                   + '<tr class="ListOdd">'
	                   + '<td class="PageBodyList" colspan="3" nowrap><b><span class="Alert2">Searching...</span></b></td>'
	                   + '</tr>'
	                   + '</table>';
	document.getElementById("searchResults").innerHTML = searchingTable;
	
	var http = createRequestObject();
	var url = "/jcore/hallpass/util/HallPassAjaxUtil.jsp?step=orgsearch&page=" + page 
	        + "&searchText=" + searchText 
	        + "&searchOption=" + searchOption 
	        + "&positionGuid=" + positionGuid 
	        + "&orgCategoryGuid=" + orgCategoryGuid 
	        + "&orgTypeGuid=" + orgTypeGuid;
	
    http.onreadystatechange = function() {
		if (http.readyState == 4){
			document.getElementById("searchResults").innerHTML = http.responseText;
			changeClass("searchResults", "VisibleContent");
		}
    }
    http.open("GET", url, true);
    http.send(null);
}

function personSearch(page) {
	var i = 0;
	var x = null;

	page = (page == null || page.length == 0) ? '1' : page;
	
	var lastName = document.getElementById('txtLastName').value;
	var lastNameOption = document.getElementById('cboLastNameOption').value;
	var firstName = document.getElementById('txtFirstName').value;
	var firstNameOption = document.getElementById('cboFirstNameOption').value;
	var screenName = document.getElementById('txtScreenName').value;
	var screenNameOption = document.getElementById('cboScreenNameOption').value;
	var primaryEmail = document.getElementById('txtPrimaryEmail').value;
	var primaryEmailOption = document.getElementById('cboPrimaryEmailOption').value;
	var positionGuid = document.getElementById('cboPositionGuid').value;
	var statusGuid = document.getElementById('cboStatus').value;
	var orgGuid = document.getElementById('hdnOrgGuid').value;
	var fieldRepGuid = document.getElementById('cboFieldRepGuid').value;
	var pageSize = document.getElementById('txtPageSize').value;
	
	var searchingTable = '<table border=0 cellpadding=0 cellspacing=0 width=650 align=center>'
	                   + '<tr><td nowrap><b><span class=Alert2>Searching...</span></b></td></tr>'
	                   + '</table>';
	document.getElementById("searchResults").innerHTML = searchingTable;
	
	var http = createRequestObject();
	var url = "/jcore/hallpass/util/HallPassAjaxUtil.jsp?step=personsearch&page=" + page 
	        + "&lastName=" + lastName 
	        + "&lastNameOption=" + lastNameOption 
	        + "&firstName=" + firstName 
	        + "&firstNameOption=" + firstNameOption 
	        + "&screenName=" + screenName 
	        + "&screenNameOption=" + screenNameOption 
	        + "&primaryEmail=" + primaryEmail 
	        + "&primaryEmailOption=" + primaryEmailOption 
	        + "&positionGuid=" + positionGuid 
	        + "&statusGuid=" + statusGuid 
	        + "&orgGuid=" + orgGuid
	        + "&fieldRepGuid=" + fieldRepGuid
	        + "&pageSize=" + pageSize;
	
    http.onreadystatechange = function() {
		if (http.readyState == 4){
			document.getElementById("searchResults").innerHTML = http.responseText;
			changeClass("searchResults", "VisibleContent");
		}
    }
    http.open("GET", url, true);
    http.send(null);
}

function getOrgTypesList() {
	var positionGuid = document.getElementById('cboPosition').value;
	var orgCategoryGuid = '';
	
	if (positionGuid.length > 0) {
		var searchHelp = document.getElementById("searchHelp");
		searchHelp.innerHTML = '';
		
		// Get selected optOrgTypeCategory
		var x = document.getElementsByName('optOrgTypeCategory');
		for (var i = 0; i < x.length; i++) {
			if (x[i].checked) {
			    orgCategoryGuid = x[i].value;
			}
		}
		
		var http = createRequestObject();
		var url = "/jcore/hallpass/util/HallPassAjaxUtil.jsp?step=orgtypelist"
		        + "&positionGuid=" + positionGuid 
		        + "&orgCategoryGuid=" + orgCategoryGuid;
		
	    http.onreadystatechange = function() {
			if (http.readyState == 4){
				var searchHelpText = '';
				if (http.responseText.length > 0) {
					// Build search help text
					searchHelpText = TrimString(http.responseText) + '.<br /><br />';
				}
				searchHelp.innerHTML = searchHelpText;
			}
	    }
	    http.open("GET", url, true);
	    http.send(null);
	}
}

/* *** Begin Course Management Ajax Functions *** */
function displayAjaxForm(formType, objType, objGuid) {
	if (objGuid.length > 0 && objType.length > 0 && formType.length > 0) {
		var url = "/jcore/coursemgmt/util/CourseMgmtAjaxUtil.jsp?step=DisplayAjaxForm"
		        + "&objectGuid=" + objGuid
		        + "&formType=" + formType
		        + "&objectType=" + objType;
		        
		if (objType.toLowerCase() == 'courserequirement') {
		    url += "&courseSessionGuid=" + document.getElementById('hdnCourseSessionGuid').value;
		}
		
		var http = createRequestObject();
	    http.onreadystatechange = function() {
			if (http.readyState == 4) {
				if (http.responseText.length > 0) {
					// Response is not blank, so change the object's text to the result
					if (formType.toLowerCase() == 'courserequirementattribute' 
						|| (formType.toLowerCase() == 'courseattribute' && objType.toLowerCase() == 'courseattribute')
						|| (formType.toLowerCase() == 'coursesessionattribute' && objType.toLowerCase() == 'coursesessionattribute')
						|| (formType.toLowerCase() == 'coursefield' && objType.toLowerCase() == 'coursefield')
						|| (formType.toLowerCase() == 'termattribute' && objType.toLowerCase() == 'termattribute')) {
						document.getElementById(objGuid).innerHTML = http.responseText;
					} else {
						document.getElementById(formType + 'Form').innerHTML = http.responseText;
						if (formType.toLowerCase() != 'mentor') {
							document.getElementById(formType + 'Link').style.display = 'none';
						}
					}
				}
			}
	    }
	    http.open("GET", url, true);
	    http.send(null);
	}
	return false;
}

function cancelAjaxForm(formType, objType, objGuid) {
	if (objGuid.length > 0 && objType.length > 0 && formType.length > 0) {
		var http = createRequestObject();
		var url = "/jcore/coursemgmt/util/CourseMgmtAjaxUtil.jsp?step=CancelAjaxForm"
		        + "&objectGuid=" + objGuid
		        + "&formType=" + formType
		        + "&objectType=" + objType;
		
	    http.onreadystatechange = function() {
			if (http.readyState == 4) {
				if (http.responseText.length > 0) {
					// Response is not blank, so change the object's text to the result
					if (formType.toLowerCase() == 'courserequirementattribute' 
						|| (formType.toLowerCase() == 'courseattribute' && objType.toLowerCase() == 'courseattribute')
						|| (formType.toLowerCase() == 'termattribute' && objType.toLowerCase() == 'termattribute')
						|| (formType.toLowerCase() == 'coursesessionattribute' && objType.toLowerCase() == 'coursesessionattribute')
						|| (formType.toLowerCase() == 'coursefield' && objType.toLowerCase() == 'coursefield')) {
						document.getElementById(objGuid).innerHTML = http.responseText;
					} else {
						document.getElementById(formType + 'Form').innerHTML = http.responseText;
						if (formType.toLowerCase() != 'mentor') {
							document.getElementById(formType + 'Link').style.display = 'inline';
						}
					}
				}
			}
	    }
	    http.open("GET", url, true);
	    http.send(null);
	}
	return false;
}

function submitAjaxForm(formType, objType, objGuid) {
	var proceed =  (objGuid.length > 0) && (objType.length > 0) && (formType.length > 0);
	if (proceed) {
		var parameters = '';
		var parametersArray = new Array();
		var formObj = document.getElementById('frm' + formType);
	
		if (formType.toLowerCase() == 'position' || formType.toLowerCase() == 'orgtype') {
			
			// Create an array of query string parameters collections, with each
			// collection limited to 1500 characters because of IE's 2083 char
			// limit on *total* URL length.
			var formEl = formObj.getElementsByTagName("input");
			var maxParametersLength = 1500;
			var i = 0;
			while (true) {
				var count = 0;
				for (; i < formEl.length; i++) {
					if (formEl[i].checked) {
						var currParameter = "&" + formType + "Guid" + count + "=" + formEl[i].value;
						if (parameters.length + currParameter.length > maxParametersLength) {
							break;
						}
						parameters += currParameter;
						count++;
					}
				}
				parameters += "&count=" + count;
				if (parametersArray.length > 0 ) {
					parameters += "&adding=true";
				}
				parametersArray.push(parameters);
				parameters = '';
				if (i >= formEl.length)
					break;
			}
		} else if (formType.toLowerCase() == 'prerequisite' || formType.toLowerCase() == 'courserequirement') {
			var guid = document.getElementById('cbo' + formType).value;
			if (guid.length > 0) {
				parameters = '&' + formType + 'Guid=' + guid;
			} else {
				alert('A value must be selected');
				return false;
			}
			if (parameters.length > 0)
				parametersArray.push(parameters);
 		} else if (formType.toLowerCase() == 'courserequirementattribute') {
			var value = document.getElementById('txt' + objGuid).value;
			if (value.length > 0) {
				parameters = '&' + formType + 'Value=' + value;
				if (objType.toLowerCase() == 'courserequirement') {
				    parameters += "&courseSessionGuid=" + document.getElementById('hdnCourseSessionGuid').value;
				}
				var surveyDateObj = document.getElementById('chkSetSurveyDates');
				if (surveyDateObj != null && surveyDateObj.checked) {
					parameters += '&courserequirementattributeguid=' + surveyDateObj.value;
				}
			} else {
				alert('Value can not be empty');
				return false;
			}
			if (parameters.length > 0)
				parametersArray.push(parameters);
		} else if (formType.toLowerCase() == 'facilitator') {
			parameters = '&' + formType + 'Guid=' + document.getElementById('hdn' + formType + 'Guid').value;
			parametersArray.push(parameters);
		} else if (formType.toLowerCase() == 'mentor') {
			parameters = '&' + formType + 'Guid=' + document.getElementById('hdn' + formType + 'Guid').value;
			parametersArray.push(parameters);
		} else if (formType.toLowerCase() == 'instructionaldesigner') {
			parameters = '&' + formType + 'Guid=' + document.getElementById('hdn' + formType + 'Guid').value;
			parametersArray.push(parameters);
		} else if (formType.toLowerCase() == 'subjectmatterexpert') {
			parameters = '&' + formType + 'Guid=' + document.getElementById('hdn' + formType + 'Guid').value;
			parametersArray.push(parameters);
		} else if (formType.toLowerCase() == 'courseattribute' || formType.toLowerCase() == 'coursesessionattribute') {
			if (objType.toLowerCase() == 'course' || objType.toLowerCase() == 'coursesession') {
				var enumType = document.getElementById('cbo' + formType).value;
				if (enumType.length > 0) {
					parameters = '&' + formType + 'Type=' + enumType;
				} else {
					alert('A value must be selected');
					return false;
				}
			}
			var value = document.getElementById('AttributeValue').value;
			if (value.length > 0) {
				parameters += '&' + formType + 'Value=' + value;
			} else {
				alert('A value must be entered');
				return false;
			}
			if (parameters.length > 0)
				parametersArray.push(parameters);
		} else if (formType.toLowerCase() == 'coursefield') {
			var enumType = document.getElementById('cbo' + formType).value;
			if (enumType.length > 0) {
				parameters = '&' + formType + 'Type=' + enumType;
			} else {
				alert('A value must be selected');
				return false;
			}
			var value = document.getElementById('txaCourseFieldValue').value;
			if (value.length > 0) {
				parameters += '&' + formType + 'Value=' + escape(value);
			} else {
				alert('A value must be entered');
				return false;
			}
			if (parameters.length > 0)
				parametersArray.push(parameters);
		} else if (formType.toLowerCase() == 'courseattribute' || formType.toLowerCase() == 'coursesessionattribute' || formType.toLowerCase() == 'termattribute') {
			if (objType.toLowerCase() == 'course' || objType.toLowerCase() == 'coursesession'|| objType.toLowerCase() == 'term') {
				var enumType = document.getElementById('cbo' + formType).value;
				if (enumType.length > 0) {
					parameters = '&' + formType + 'Type=' + enumType;
				} else {
					alert('A value must be selected');
					return false;
				}
			}
			var value = document.getElementById('AttributeValue').value;
			if (value.length > 0) {
				parameters += '&' + formType + 'Value=' + value;
			} else {
				alert('A value must be entered');
				return false;
			}
			if (parameters.length > 0)
				parametersArray.push(parameters);
		} else {
			return false;
		}
		
		// It is generally accepted that asynchronous XMLHttpRequest calls are
		// better than synchronous ones. However, in cases where we need to
		// perform more than one call to complete a single transaction (e.g.,
		// when performing an Eligible Positions update whose URL exceeds the max
		// allowed by IE), we will do them synchronously in order to serialize
		// the calls so that the persistence layer doesn't get confused.
		var asynchFlag = true;
		if (parametersArray.length > 1)
			asynchFlag = false;

		// Perform an HTTP request for each collection of query string parameters		
		var requestCount = 0;
		for (var i = 0; i < parametersArray.length; i++) {
		
			// Create the request object and URL
			var http = createRequestObject();
			var url = "/jcore/coursemgmt/util/CourseMgmtAjaxUtil.jsp?step=SubmitAjaxForm"
			        + "&objectGuid=" + objGuid
			        + "&formType=" + formType
			        + "&objectType=" + objType
			        + parametersArray[i];

			// If performing an asynchronous request, setup a callback function to update the page
			if (asynchFlag == true) {
			    http.onreadystatechange = function() {
					if (http.readyState == 4) {
						if (http.responseText.length > 0) {
							if (formType.toLowerCase() == 'courserequirementattribute') {
								document.getElementById(objGuid).innerHTML = http.responseText;
							} else if (requestCount == parametersArray.length) {
								document.getElementById(formType + 'Form').innerHTML = http.responseText;
								if (formType.toLowerCase() != 'mentor') {
									document.getElementById(formType + 'Link').style.display = 'inline';
								}
							}
						}
					}
			    }
		    }
		    
		    // Make the request
		    requestCount++;
		    http.open("GET", url, asynchFlag);
		    http.send(null);
		    
		    // if performing synchronous requests, update the page after the last one
		    if (asynchFlag == false && requestCount == parametersArray.length) {
				document.getElementById(formType + 'Form').innerHTML = http.responseText;
				document.getElementById(formType + 'Link').style.display = 'inline';
			}
		}
	}
	return false;
}

function deleteAjaxForm(formType, objType, objGuid, deleteObjGuid) {
	if (objGuid.length > 0 && objType.length > 0 && formType.length > 0 && deleteObjGuid.length > 0) {
		if (confirm('Are you sure you want to delete this item?\n\nIf YES, click OK.\nIf NO, click CANCEL')) {
			var http = createRequestObject();
			var url = "/jcore/coursemgmt/util/CourseMgmtAjaxUtil.jsp?step=DeleteAjaxForm"
			        + "&objectGuid=" + objGuid
			        + "&formType=" + formType
			        + "&objectType=" + objType
			        + "&deleteObjectGuid=" + deleteObjGuid;
			
		    http.onreadystatechange = function() {
				if (http.readyState == 4) {
					if (http.responseText.length > 0) {
					    if (formType.toLowerCase() == 'facilitator'
							|| formType.toLowerCase() == 'mentor'
							|| formType.toLowerCase() == 'instructionaldesigner'
							|| formType.toLowerCase() == 'subjectmatterexpert'
					    	|| formType.toLowerCase() == 'coursesessionattribute'
					    	|| formType.toLowerCase() == 'courseattribute'
					    	|| formType.toLowerCase() == 'termattribute'
					    	|| formType.toLowerCase() == 'coursefield'
					    	|| formType.toLowerCase() == 'prerequisite'
					    	|| formType.toLowerCase() == 'courserequirement') {
							document.getElementById(formType + 'Form').innerHTML = http.responseText;
							if (formType.toLowerCase() != 'mentor') {
								document.getElementById(formType + 'Link').style.display = 'inline';
							}
						} else if (formType.toLowerCase() == 'courserequirementattribute') {
							document.getElementById(objGuid).innerHTML = http.responseText;
						}
					}
				}
		    }
		    http.open("GET", url, true);
		    http.send(null);
		}
	}
	return false;
}

function getCourseRequirementOptionList(courseGuid) {
	if (courseGuid.length > 0) {
		var url = "/jcore/coursemgmt/util/CourseMgmtAjaxUtil.jsp?step=CourseRequirementOptionList"
		        + "&courseGuid=" + courseGuid;
		
		var http = createRequestObject();
	    http.onreadystatechange = function() {
			if (http.readyState == 4) {
				if (http.responseText.length > 0) {
					document.getElementById('AttributeValueCol').innerHTML = http.responseText;
				}
			}
	    }
	    http.open("GET", url, true);
	    http.send(null);
	}
	return false;
}

function getCourseAttributeProgramOptionList() {
	var url = "/jcore/coursemgmt/util/CourseMgmtAjaxUtil.jsp?step=CourseAttributeProgramOptionList";
		
	var http = createRequestObject();
	http.onreadystatechange = function() {
		if (http.readyState == 4) {
			if (http.responseText.length > 0) {
				document.getElementById('AttributeValueCol').innerHTML = http.responseText;
			}
		}
	}
	http.open("GET", url, true);
	http.send(null);
	return false;
}

function recordCourseSessionApplicationAttendance(courseSessionApplicationGuid) {
	if (courseSessionApplicationGuid.length > 0) {
		var url = "/jcore/coursemgmt/util/CourseMgmtAjaxUtil.jsp?step=RecordAttendance"
		        + "&courseSessionApplicationGuid=" + courseSessionApplicationGuid;
		
		var http = createRequestObject();
	    http.onreadystatechange = function() {
			if (http.readyState == 4) {
				if (http.responseText.length > 0) {
					document.getElementById('attendance').innerHTML = http.responseText;
				}
			}
	    }
	    http.open("GET", url, true);
	    http.send(null);
	}
	return false;
}
/* *** End Course Management Ajax Functions *** */

/* *** Begin Opp Tracking Ajax Functions *** */
function displayAjaxFormOTT(formType, objType, objGuid) {
	if (objGuid.length > 0 && objType.length > 0 && formType.length > 0) {
		if (objGuid.toLowerCase() == 'none') {
			objGuid = document.getElementById('cboOpportunityGroup').value;
		}
		
		if (objGuid.length > 0) {
			var url = "/jcore/opptrack/util/OppTrackAjaxUtil.jsp?step=DisplayAjaxForm"
					+ "&objectGuid=" + objGuid
					+ "&formType=" + formType
					+ "&objectType=" + objType;
			
			var http = createRequestObject();
			http.onreadystatechange = function() {
				if (http.readyState == 4) {
					//alert("|" + http.responseText + "|");
					if (http.responseText.length > 0) {
						if (http.responseText.indexOf('^') > -1) {
							alert(http.responseText.substr(http.responseText.indexOf('^') + 1));
						} else {
							document.getElementById(formType).innerHTML = http.responseText;
						}
					}
				}
			}
			http.open("GET", url, true);
			http.send(null);
		} else {
			if (document.getElementById('cboPrimaryOpportunity') != null) {
				document.getElementById('PrimaryOpportunity').innerHTML = '<i>Select an Opportunity Group</i>';
			}
			if (document.getElementById('cboSecondaryOpportunity') != null) {
				document.getElementById('SecondaryOpportunity').innerHTML = '<i>Select an Opportunity Group</i>';
			}
		}
	}
}

function loadEligibleOrganizationTypes(opportunityGroupSelectId, organizationTypeSelectId) {
	var opportunityGroupSelect = document.getElementById(opportunityGroupSelectId);
	var organizationTypeSelect = document.getElementById(organizationTypeSelectId);
	
	if ('' == opportunityGroupSelect.value) {
		//No Subject Area is selected, so clear the subject select
		removeSelectOptions(organizationTypeSelect, 1);
		organizationTypeSelect.disabled = true;
	} else {
		//A Subject Area has been selected, so use AJAX to load the values
		var http = createRequestObject();
		var url = "/jcore/opptrack/util/OppTrackAjaxUtil.jsp?step=EligibleOrgTypes"
			+ '&opportunityGroupGuid=' + opportunityGroupSelect.value; 
		http.onreadystatechange = function() {
			if (http.readyState == 4) {
				if (http.status == 200) {
					var response = http.responseText;
					if (response.indexOf('|') != -1) {
						var currentValue = organizationTypeSelect.options[organizationTypeSelect.selectedIndex].value;
						
						data = response.split('|');
						organizationTypeSelect.options.length = 1;

						for (var i = 1; i < data.length; i++) {
							var optionData = data[i].split('::');
							var option = new Option(TrimString(optionData[1]), TrimString(optionData[0]));
							if (option.value == currentValue) {
								option.selected = true;
							}
							organizationTypeSelect.options[organizationTypeSelect.options.length] = option;
						}
						organizationTypeSelect.disabled = false;
					}
				}
			}
		}
		http.open('GET', url, true);
		http.send(null);
	} 
}
/* *** End Opp Tracking Ajax Functions *** */

/* *** Begin EMIS Subect Ajax Functions *** */
function handleEmisSubjectAreaChange(subjectAreaSelectId, subjectSelectId, includeCode) {
	var subjectAreaSelect = document.getElementById(subjectAreaSelectId);
	var subjectSelect = document.getElementById(subjectSelectId);
	if (includeCode == undefined) {
		includeCode = true;
	}
	
	
	if ('' == subjectAreaSelect.value) {
		//No Subject Area is selected, so clear the subject select
		removeSelectOptions(subjectSelect, 1);
		subjectSelect.disabled = true;
	} else {
		//A Subject Area has been selected, so use AJAX to load the values
		var http = createRequestObject();
		var url = '/jcore/eto/EmisSubjectSelector.jsp'
			+ '?step=SUBJECT_LOOKUP'
			+ '&emisSubjectAreaCode=' + subjectAreaSelect.value 
			+ '&fieldId=' + subjectSelectId
			+ '&includeCode=' + includeCode;
		http.onreadystatechange = function() {
			if (http.readyState == 4) {
				if (http.status == 200) {
					var response = http.responseText;
					if (response.indexOf('|') != -1) {
						data = response.split('|');
						var cbo = document.getElementById(data[0]);
						cbo.options.length = 1;

						for (var i = 1; i < data.length; i++) {
							var option = data[i].split('::');
							cbo.options[cbo.options.length] = new Option(TrimString(option[1]), TrimString(option[0]));
						}
						subjectSelect.disabled = false;
					}
				}
			}
		}
		http.open('GET', url, true);
		http.send(null);
	} 
}
/* *** End EMIS Subect Ajax Functions *** */


/* *** Begin OSIC Selector Ajax Functions *** */

/**
 * This class provides the javascript functionality for the OSICSelector class.
 */  
function OsicSelector(baseSelectorUrl, multiSelect, updateOsicsMethod, selectedOsics, currentOsic, editedOsic, htmlSelectIds, unselectableLevels) {
	this._baseSelectorUrl = baseSelectorUrl;
	this._multiSelect = multiSelect;
	this._updateOsicsMethod = updateOsicsMethod;
	this._selectedOsics = selectedOsics;
	this._currentOsic = currentOsic;
	
	this._htmlSelectIds = htmlSelectIds;
	this._unselectableLevels = unselectableLevels;
}
	
OsicSelector.prototype = {	
	/**
	 * Sets the visibility and enabling of the various buttons based on the 
	 * current selection and configuration.
	 */
	initializeButtons : function() {
		var selectableLevels
        var disableSelectionButtons = false;
        if (!osicSelector._currentOsic) {
        	disableSelectionButtons = true;
        } else {
        	//Only enable the buttons for certain OSIC levels
        	var osicLevel = OSIC.getLevel(osicSelector._currentOsic);
        	for (var i = 0; i < this._unselectableLevels.length; i++) {
        		if (osicLevel == this._unselectableLevels[i]) {
        			disableSelectionButtons = true;
        		}
        	}
        }
        
        if (this._multiSelect) {
	        document.getElementById('cmdAdd').disabled = disableSelectionButtons;
        } else {
        	document.getElementById('cmdSelect').disabled = disableSelectionButtons;
        }
	}, 

	/**
	 * Responds to changes in the OSIC select boxes.
	 */
	handleOsicChange : function(changedOsicSelect) {
		var lastSelectId = this._htmlSelectIds[this._htmlSelectIds.length - 1];; 
		var clearOptions = false;
		var selectToUpdateId = null;

		//Clear the current OSIC since we repopulate it based on the 
		//changed selection 
		this._currentOsic = '';
		
		//Loop throught the selection controls.  Controls that are above than the 
		//the changed select are left untouched.  Controls below the select are 
		//enabled or disabled based on their position of the value of the changed select. 
		for (var i = 0; i < this._htmlSelectIds.length; i++) {
			var osicSelect = document.getElementById(this._htmlSelectIds[i]);

			if (clearOptions) {
				//We are below the changed select, so remove all of the current options
				//and disable the select if it is not flagged for an ajax update
				removeSelectOptions(osicSelect, 1);
				osicSelect.disabled = (osicSelect.id != selectToUpdateId);
			} else {
				if (osicSelect != changedOsicSelect) {
					this._currentOsic = osicSelect.value;
				} else {
					clearOptions = true;
					if ('' != changedOsicSelect.value) {
						//The changed select has a value, so we need to load
						//the options for the next OSIC level
						this._currentOsic = changedOsicSelect.value;
						if (osicSelect.id != lastSelectId) {
							selectToUpdateId = this._htmlSelectIds[i + 1];
						}
					}
				}
			}
		}  

		//Update the displayed value for the current OSIC
		if (0 == this._currentOsic.length) { 
			document.getElementById('currentOsic').innerHTML = '&lt;None&gt;';
		} else {
			document.getElementById('currentOsic').innerHTML = this._currentOsic;
		}

		if (null != selectToUpdateId) {
			//Execute an AJAX call to retrieve the select options of the updated level
			var http = createRequestObject();
			var url = this._baseSelectorUrl 
				+ '?step=OSIC_LOOKUP'
				+ '&osic=' + changedOsicSelect.value
				+ '&fieldId=' + selectToUpdateId;
			http.onreadystatechange = function() {
				if (http.readyState == 4) {
					if (http.status == 200) {
						var response = http.responseText;
						if (response.indexOf('|') != -1) {
							data = response.split('|');
							var cbo = document.getElementById(data[0]);
							cbo.options.length = 1;

							for (var i = 1; i < data.length; i++) {
								var option = data[i].split('::');
								cbo.options[cbo.options.length] = new Option(TrimString(option[1]), TrimString(option[0]));
							}
						}
					}
				}
			}
			http.open('GET', url, true);
			http.send(null);
		}

		this.initializeButtons();
	},

	/**
	 * Populates the selected OSICs tables based on the contents of the
	 * _selectedOsics array.
	 */
	renderSelectedOsicsTable : function() {
		if (!this._multiSelect) {
			return;
		}
	
		var table = document.getElementById('tblSelectedOsics');
		removeTableRows(table, 0);

		if (this._selectedOsics.length > 1) {	
			try {
				this._selectedOsics.sort(OSIC.compareOsics);
			} catch (e) {
				//IE doesn't seem to like our sort function
			}
		}
		
		if (0 == this._selectedOsics.length) {
			var row = table.insertRow(-1);
			var messageCell = row.insertCell(0);
			messageCell.className = 'ALERT3';
			messageCell.appendChild(document.createTextNode('You have no selected OSICs.'));
		} else {
			for (var i = 0; i < this._selectedOsics.length; i++) {
				var osic = this._selectedOsics[i];
				var row = table.insertRow(-1);
				row.id = 'row_' + this._selectedOsics[i];
	
				var osicCell = row.insertCell(0);
				osicCell.innerHTML = this._selectedOsics[i];
				row.appendChild(osicCell);
	
				var actionCell = row.insertCell(0);
				var removeLink = document.createElement('a');
				removeLink.href='#';
				removeLink.appendChild(document.createTextNode('Remove'));
				removeLink.onclick = function(selector, osic) { return function() { selector.removeSelectedOsic(osic); return false; }} (this, this._selectedOsics[i]);
				actionCell.appendChild(removeLink);
	
				row.appendChild(actionCell);
			}
		}
	},

	/**
	 * Removes a Selected OSIC from the list.
	 */
	removeSelectedOsic : function(osic) {
		for (var i = 0; i < this._selectedOsics.length; i++) {
			if (this._selectedOsics[i] == osic) {
				this._selectedOsics.splice(i, 1);
				break;
			}
		}
		
		this.renderSelectedOsicsTable();
		this.initializeButtons();
	},

	/**
	 * Adds the _currentOsic value to the _selectedOsics list
	 * and updates the table.
	 */
	addSelectedOsic : function() {
		for (var i = 0; i < this._selectedOsics.length; i++) {
			if (this._selectedOsics[i] == this._currentOsic) {
				alert(this._currentOsic + ' is already selected.');
				return;
			}
		}

		this._selectedOsics[this._selectedOsics.length] = this._currentOsic;
		this.renderSelectedOsicsTable();
	}
}
/* *** End OSIC Selector Ajax Functions *** */

/* *** Begin Simple OSIC Selector Ajax Functions *** */
/**
 * This is a simplifed version of the OSICSelector class that only handles updating descendent select
 * controls.
 */  
function SimpleOsicSelector(baseSelectorUrl, htmlSelectIds) {
	this._baseSelectorUrl = baseSelectorUrl;
	this._htmlSelectIds = htmlSelectIds;
}
	
SimpleOsicSelector.prototype = {	
	/**
	 * Responds to changes in the OSIC select boxes.
	 */
	handleOsicChange : function(changedOsicSelect) {
		var lastSelectId = this._htmlSelectIds[this._htmlSelectIds.length - 1];; 
		var clearOptions = false;
		var selectToUpdateId = null;
		
		//Loop throught the selection controls.  Controls that are above than the 
		//the changed select are left untouched.  Controls below the select are 
		//enabled or disabled based on their position of the value of the changed select. 
		for (var i = 0; i < this._htmlSelectIds.length; i++) {
			var osicSelect = document.getElementById(this._htmlSelectIds[i]);

			if (clearOptions) {
				//We are below the changed select, so remove all of the current options
				//and disable the select if it is not flagged for an ajax update
				removeSelectOptions(osicSelect, 1);
				osicSelect.disabled = (osicSelect.id != selectToUpdateId);
			} else {
				if (osicSelect != changedOsicSelect) {
					this._currentOsic = osicSelect.value;
				} else {
					clearOptions = true;
					if ('' != changedOsicSelect.value) {
						//The changed select has a value, so we need to load
						//the options for the next OSIC level
						this._currentOsic = changedOsicSelect.value;
						if (osicSelect.id != lastSelectId) {
							selectToUpdateId = this._htmlSelectIds[i + 1];
						}
					}
				}
			}
		}  

		if (null != selectToUpdateId) {
			//Execute an AJAX call to retrieve the select options of the updated level
			var http = createRequestObject();
			var url = this._baseSelectorUrl 
				+ '?step=OSIC_LOOKUP'
				+ '&osic=' + changedOsicSelect.value
				+ '&fieldId=' + selectToUpdateId;
			http.onreadystatechange = function() {
				if (http.readyState == 4) {
					if (http.status == 200) {
						var response = http.responseText;
						if (response.indexOf('|') != -1) {
							data = response.split('|');
							var cbo = document.getElementById(data[0]);
							cbo.options.length = 1;

							for (var i = 1; i < data.length; i++) {
								var option = data[i].split('::');
								cbo.options[cbo.options.length] = new Option(TrimString(option[1]), TrimString(option[0]));
							}
						}
					}
				}
			}
			http.open('GET', url, true);
			http.send(null);
		}
	}
}
/* *** End Simple OSIC Selector Ajax Functions *** */