//
// Filename:	utils.js
// Description:	Provides support for client-side activities
//

var req = '';
var reqInd = false;

//
// trim()
//
// Trims leading and trailing whitespace
//
function trim(initialStr) {
	var str = initialStr;		// Stores modified string
	var len = str.length;		// str's length

	// Trim leading whitespace
	while (str.charAt(0) == " " || escape(str.charAt(0)) == "%0D" || escape(str.charAt(0)) == "%0A" || escape(str.charAt(0)) == "%09")
	{
		str = str.substr(1, len - 1);
		len = str.length;
	}

	// Trim trailing whitespace
	while (str.charAt(len - 1) == " " || escape(str.charAt(len - 1)) == "%0D" || escape(str.charAt(len - 1)) == "%0A" || escape(str.charAt(len - 1)) == "%09")
	{
		str = str.substr(0, len - 1);
		len = str.length;
	}

	return str;
}


// setFocus(fieldName)
// Sets focus to the specified field
function setFocus(fieldName) {
	ele = document.getElementById(fieldName);

	ele.focus();
	if ( (! ele.selectedIndex) & (ele.getAttribute('Type') == 'text') ) {
		document.getElementById(fieldName).select();
	}
}

//
// updateCharCount(ele, maxChars)
//
// Limits ele's content length to maxChars and updates ele's panel with remaining char count
//
function updateCharCount(ele, maxChars) {
	var charCount = ele.value.length;

	// Truncate value if greater than maxChars
	if ( charCount > maxChars ) {
		charCount = maxChars;
		ele.value = ele.value.substr(0, maxChars);
	}

	var remainingChars = maxChars - charCount;
	var eleName = ele.id;
	var panel = eleName + 'Panel';

	document.getElementById(panel).innerHTML = '(' + remainingChars + ' chars)';
}


//
// enableField(id)
//
// Enables the specified form field
//
function enableField(id) {
	// Get reference to field
	var fld = document.getElementById(id);

	// Enable field
	fld.disabled = false;

	// Update styles
	fld.className = fld.className.replace("disabled", "");
	if ( document.getElementById(fld.id + "Label") ) {
		document.getElementById(fld.id + "Label").className = document.getElementById(fld.id + "Label").className.replace("disabled", "");
	}
}


//
// disableField(id)
//
// Disables the specified form field
//
function disableField(id) {
	// Enable field to remove class names
	enableField(id);

	// Get reference to field
	var fld = document.getElementById(id);

	// Disable field
	fld.disabled = true;

	// Update styles
	fld.className += " disabled";
	if ( document.getElementById(fld.id + "Label") ) {
		document.getElementById(fld.id + "Label").className += " disabled";
	}
}


//
// selectAll(fldName, fldCount, checked)
//
// Checks or unchecks all checkboxes on the page
//
function selectAll(fldName, fldCount, checked) {
	var ele = '';

	// Iterate from 1 to fldCount
	for ( var i = 1; i <= fldCount; i++ ) {
		// Get reference to element
		ele = document.getElementById(fldName + i);

		// Set element to checked/unchecked
		ele.checked = checked;
	}
}


//
// swapImage(ele, src)
//
// Swaps the element image's source with the supplied source
//
function swapImage(ele, src) {
	ele.src = src;
}


//
// validateFileName(fld)
//
// Validates that filename in fld does not include non-standard characters
//
function validateFileName(fld) {
	var fnName = fld.value.split('\\');
	var filename = fnName[fnName.length - 1];
	var valid = true;
	var idx = -1; 

	for (var i = 0; i < filename.length; i++ ) {
		if ( filename.charAt(i).search(/[A-Za-z0-9\.\-_ ]/) == -1 ) {
			valid = false;
		}
	}

	if ( ! valid ) {
		alert("ERROR: Filename contains illeagal characters.  Please rename the file and try again.");
	}
}


//
// formatPhoneNumber(ele);
//
// Removes non-numeric characters and formats phone number
//
function formatPhoneNumber(ele) {
	var oldValue = ele.value;
	var tempValue = '';
	var newValue = '';

	// Remove non-numeric characters
	for ( var i = 0 ; i < oldValue.length; i++ ) {
		ch = oldValue.charAt(i);

		if ( (ch.charCodeAt(0) >= 48) && (ch.charCodeAt(0) <= 57) ) {
			tempValue = '' + tempValue + ch;
		}
	}

	// Format string
	for ( var i = 0 ; i < tempValue.length; i++ ) {
		if ( i == 0 ) {
			newValue = '(' + tempValue.charAt(i);
		} else if ( i == 2 ) {
			newValue = newValue + tempValue.charAt(i) + ') ';
		} else if ( i == 5 ) {
			newValue = newValue + tempValue.charAt(i) + '-';
		} else {
			newValue = newValue + tempValue.charAt(i);
		}
	}

	// Return formatted string
	ele.value = newValue;
}


//
// formatNumeric(ele);
//
// Removes non-numeric characters
//
function formatNumeric(ele) {
	var oldValue = ele.value;
	var tempValue = '';

	// Remove non-numeric characters
	for ( var i = 0 ; i < oldValue.length; i++ ) {
		ch = oldValue.charAt(i);

		if ( ((ch.charCodeAt(0) >= 48) && (ch.charCodeAt(0) <= 57) || (ch.charCodeAt(0) == 46)) ) {
			tempValue = '' + tempValue + ch;
		}
	}

	// Return formatted string
	ele.value = tempValue;
}


//
// processSynonymInd()
//
// Checks value of processSynonymInd and enables/disables SynonymID accordingly
//
function processSynonymInd() {
	var indEle = document.getElementById('SynonymInd');
	var idEle = document.getElementById('SynonymID');

	if ( indEle.checked ) {
		enableField(idEle.id);
		setFocus(idEle.id);
	} else {
		disableField(idEle.id);
	}
}


//
// processFormat()
//
// Shows/hides format-specific fields based on format selection
//
function processFormat() {
	var formatEle = document.getElementById('FormatID');
	var formatVal = formatEle.options[formatEle.selectedIndex].text;
	var downloadEle = document.getElementById('FilePath');
	var downloadDiv = document.getElementById('DownloadDiv');
	var urlEle = document.getElementById('URL');
	var urlDiv = document.getElementById('URLDiv');
	var htmlEle = document.getElementById('Content');
	var htmlDiv = document.getElementById('HTMLDiv');

	if ( formatVal == 'Download' ) {
		downloadDiv.style.display = 'block';
		enableField(downloadEle.id);
		urlDiv.style.display = 'none';
		disableField(urlEle.id);
		htmlDiv.style.display = 'none';
		disableField(htmlEle.id);
	} else if ( formatVal == 'URL' ) {
		downloadDiv.style.display = 'none';
		disableField(downloadEle.id);
		urlDiv.style.display = 'block';
		enableField(urlEle.id);
		htmlDiv.style.display = 'none';
		disableField(htmlEle.id);
	} else if ( formatVal == 'HTML' ) {
		downloadDiv.style.display = 'none';
		disableField(downloadEle.id);
		urlDiv.style.display = 'none';
		disableField(urlEle.id);
		htmlDiv.style.display = 'block';
		enableField(htmlEle.id);
	} else {
		downloadDiv.style.display = 'block';
		disableField(downloadEle.id);
		urlDiv.style.display = 'none';
		disableField(urlEle.id);
		htmlDiv.style.display = 'none';
		disableField(htmlEle.id);
	}
}


//
// processFeatured()
//
// Enables/disables featured-specific fields based on featured selection
//
function processFeatured() {
	var featuredEle = document.getElementById('FeaturedID');
	var featuredVal = featuredEle.options[featuredEle.selectedIndex].text;
	var startDateEle = document.getElementById('FeaturedStartDate');
	var endDateEle = document.getElementById('FeaturedEndDate');

	if ( featuredVal == 'Never' || featuredVal == '-- Select --' ) {
		disableField(startDateEle.id);
		disableField(endDateEle.id);
	} else {
		enableField(startDateEle.id);
		enableField(endDateEle.id);
		setFocus(startDateEle.id);
	}
}


//
// enableSubmit()
//
// Checks value of specified select and enables/disables Submit button accordingly
//
function enableSubmit(selEle, btnID) {
	var btnEle = document.getElementById(btnID);

	if ( selEle.options[selEle.selectedIndex].value == 0 ) {
		disableField(btnEle.id);
	} else {
		enableField(btnEle.id);
	}
}


//
// expandFacets()
//
// Hide specified element and shows all subsequent sibling elements
//
function expandFacets(expEle) {
	var liEle = expEle.parentNode;
	var sibEle = '';

	sibEle = liEle.nextSibling;
	while ( sibEle != null ) {
		if ( sibEle.className == 'facetHide' ) {
			sibEle.style.display = 'block';
		}

		sibEle = sibEle.nextSibling;
	}

	liEle.style.display = 'none';
}


// loadXMLDoc() from developer.apple.com
function loadXMLDoc(url, func) {
	// branch for native XMLHttpRequest object
	if ( window.XMLHttpRequest ) {
		req = new XMLHttpRequest();
		req.onreadystatechange = func;
		req.open("GET", url, true);
		req.send(null);
	// branch for IE/Windows ActiveX version
	} else if ( window.ActiveXObject ) {
		req = new ActiveXObject("Microsoft.XMLHTTP");
		if ( req ) {
			req.onreadystatechange = func;
			req.open("GET", url, false);
			req.send();
		}
	}
}


//
// addAuthor()
//
// Adds specified author to list of authors
//
function addAuthor() {
	reqInd = false;

	// Get element references
	var authorEle = document.getElementById('Author');
	var newAuthorIDEle = document.getElementById('NewAuthorID');

	// Get element values
	var authorVal = authorEle.value;
	var newAuthorIDVal = newAuthorIDEle.value;


	// If field is blank
	if ( trim(authorVal) == '' ) {
		alert('ERROR: You must enter an author\'s name before adding it to the list.');
		return;
	}

	// Add new author to system and get ID
	if ( trim(newAuthorIDVal) == '' ) {
		loadXMLDoc('_ajaxAddAuthor.cfm?Author=' + authorVal, addAuthorHold);
	} else {
		addAuthor2();
	}
}

function addAuthorHold() {
	// If newly added author, get new ID
	if ( (req.status == '200') && (trim(req.responseText) != '') ) {
		// Check for errors
		if ( req.responseText.charAt(0) == 'E' ) {
			if ( ! reqInd ) {
				alert(req.responseText);
				reqInd = true;
			}
			return;
		} else {
			document.getElementById('NewAuthorID').value = req.responseText;
			addAuthor2();
		}
	}
}

function addAuthor2() {
	// Get element references
	var authorIDEle = document.getElementById('AuthorID');
	var authorListEle = document.getElementById('ulAuthorList');
	var authorEle = document.getElementById('Author');
	var newAuthorIDEle = document.getElementById('NewAuthorID');

	// Get element values
	var authorIDVal = authorIDEle.value;
	var authorVal = authorEle.value;
	var newAuthorIDVal = newAuthorIDEle.value;


	// Check that we haven't already done this
	if ( (trim(authorVal) != '') && (trim(newAuthorIDVal) != '') ) {
		// Add id to list
		if ( trim(authorIDVal) == '' ) {
			authorIDEle.value = newAuthorIDVal;
		} else {
			authorIDEle.value = authorIDEle.value + "," + newAuthorIDVal;
		}

		// Add name to list
		var newNode = "<li id=\"divAuthorList_" + newAuthorIDVal + "\">";
		newNode = newNode + authorVal;
		newNode = newNode + "<a href=\"\" title=\"Remove " + authorVal + "\" onClick=\"removeAuthor('" + newAuthorIDVal + "'); return false;\">Remove</a>";
		newNode = newNode + "</li>";
		authorListEle.innerHTML = authorListEle.innerHTML + newNode;

		// Clear new author field
		authorEle.value = '';
	}

	// Clear new author field
	newAuthorIDEle.value = '';

	// Set focus to author field
	authorEle.focus();
}


//
// removeAuthor()
//
// Removes specified author from list of authors
//
function removeAuthor(id) {
	// Get element references
	var authorIDEle = document.getElementById('AuthorID');
	var authorListItemEle = document.getElementById('divAuthorList_' + id);

	// Remove list item
	authorListItemEle.parentNode.removeChild(authorListItemEle);

	// Remove id from list
	var arrSplit = authorIDEle.value.split(",");
	authorIDEle.value = '';
	for ( var i = 0; i < arrSplit.length; i++ ) {
		if ( (authorIDEle.value == '') && (arrSplit[i] != '') && (arrSplit[i] != id) ) {
			authorIDEle.value = arrSplit[i];
		} else if ( (arrSplit[i] != '') && (arrSplit[i] != id) ) {
			authorIDEle.value = authorIDEle.value + "," + arrSplit[i];
		}
	}
}


//
// addEditor()
//
// Adds specified editor to list of editors
//
function addEditor() {
	reqInd = false;

	// Get element references
	var editorEle = document.getElementById('Editor');
	var newEditorIDEle = document.getElementById('NewEditorID');

	// Get element values
	var editorVal = editorEle.value;
	var newEditorIDVal = newEditorIDEle.value;


	// If field is blank
	if ( trim(editorVal) == '' ) {
		alert('ERROR: You must enter an editor before adding it to the list.');
		return;
	}

	// Add new editor to system and get ID
	if ( trim(newEditorIDVal) == '' ) {
		loadXMLDoc('_ajaxAddEditor.cfm?Editor=' + editorVal, addEditorHold);
	} else {
		addEditor2();
	}
}

function addEditorHold() {
	// If newly added editor, get new ID
	if ( (req.status == '200') && (trim(req.responseText) != '') ) {
		// Check for errors
		if ( req.responseText.charAt(0) == 'E' ) {
			if ( ! reqInd ) {
				alert(req.responseText);
				reqInd = true;
			}
			return;
		} else {
			document.getElementById('NewEditorID').value = req.responseText;
			addEditor2();
		}
	}
}

function addEditor2() {
	// Get element references
	var editorIDEle = document.getElementById('EditorID');
	var editorListEle = document.getElementById('ulEditorList');
	var editorEle = document.getElementById('Editor');
	var newEditorIDEle = document.getElementById('NewEditorID');

	// Get element values
	var editorIDVal = editorIDEle.value;
	var editorVal = editorEle.value;
	var newEditorIDVal = newEditorIDEle.value;


	// Check that we haven't already done this
	if ( (trim(editorVal) != '') && (trim(newEditorIDVal) != '') ) {
		// Add id to list
		if ( trim(editorIDVal) == '' ) {
			editorIDEle.value = newEditorIDVal;
		} else {
			editorIDEle.value = editorIDEle.value + "," + newEditorIDVal;
		}

		// Add name to list
		var newNode = "<li id=\"divEditorList_" + newEditorIDVal + "\">";
		newNode = newNode + editorVal;
		newNode = newNode + "<a href=\"\" title=\"Remove " + editorVal + "\" onClick=\"removeEditor('" + newEditorIDVal + "'); return false;\">Remove</a>";
		newNode = newNode + "</li>";
		editorListEle.innerHTML = editorListEle.innerHTML + newNode;

		// Clear new editor field
		editorEle.value = '';
	}

	// Clear new editor field
	newEditorIDEle.value = '';

	// Set focus to editor field
	editorEle.focus();
}


//
// removeEditor()
//
// Removes specified editor from list of editors
//
function removeEditor(id) {
	// Get element references
	var editorIDEle = document.getElementById('EditorID');
	var editorListItemEle = document.getElementById('divEditorList_' + id);

	// Remove list item
	editorListItemEle.parentNode.removeChild(editorListItemEle);

	// Remove id from list
	var arrSplit = editorIDEle.value.split(",");
	editorIDEle.value = '';
	for ( var i = 0; i < arrSplit.length; i++ ) {
		if ( (editorIDEle.value == '') && (arrSplit[i] != '') && (arrSplit[i] != id) ) {
			editorIDEle.value = arrSplit[i];
		} else if ( (arrSplit[i] != '') && (arrSplit[i] != id) ) {
			editorIDEle.value = editorIDEle.value + "," + arrSplit[i];
		}
	}
}


//
// addPublisher()
//
// Adds specified publisher to list of publishers
//
function addPublisher() {
	reqInd = false;

	// Get element references
	var publisherEle = document.getElementById('Publisher');
	var newPublisherIDEle = document.getElementById('NewPublisherID');

	// Get element values
	var publisherVal = publisherEle.value;
	var newPublisherIDVal = newPublisherIDEle.value;


	// If field is blank
	if ( trim(publisherVal) == '' ) {
		alert('ERROR: You must enter an publisher before adding it to the list.');
		return;
	}

	// Add new publisher to system and get ID
	if ( trim(newPublisherIDVal) == '' ) {
		loadXMLDoc('_ajaxAddPublisher.cfm?Publisher=' + publisherVal, addPublisherHold);
	} else {
		addPublisher2();
	}
}

function addPublisherHold() {
	// If newly added publisher, get new ID
	if ( (req.status == '200') && (trim(req.responseText) != '') ) {
		// Check for errors
		if ( req.responseText.charAt(0) == 'E' ) {
			if ( ! reqInd ) {
				alert(req.responseText);
				reqInd = true;
			}
			return;
		} else {
			document.getElementById('NewPublisherID').value = req.responseText;
			addPublisher2();
		}
	}
}

function addPublisher2() {
	// Get element references
	var publisherIDEle = document.getElementById('PublisherID');
	var publisherListEle = document.getElementById('ulPublisherList');
	var publisherEle = document.getElementById('Publisher');
	var newPublisherIDEle = document.getElementById('NewPublisherID');

	// Get element values
	var publisherIDVal = publisherIDEle.value;
	var publisherVal = publisherEle.value;
	var newPublisherIDVal = newPublisherIDEle.value;


	// Check that we haven't already done this
	if ( (trim(publisherVal) != '') && (trim(newPublisherIDVal) != '') ) {
		// Add id to list
		if ( trim(publisherIDVal) == '' ) {
			publisherIDEle.value = newPublisherIDVal;
		} else {
			publisherIDEle.value = publisherIDEle.value + "," + newPublisherIDVal;
		}

		// Add name to list
		var newNode = "<li id=\"divPublisherList_" + newPublisherIDVal + "\">";
		newNode = newNode + publisherVal;
		newNode = newNode + "<a href=\"\" title=\"Remove " + publisherVal + "\" onClick=\"removePublisher('" + newPublisherIDVal + "'); return false;\">Remove</a>";
		newNode = newNode + "</li>";
		publisherListEle.innerHTML = publisherListEle.innerHTML + newNode;

		// Clear new publisher field
		publisherEle.value = '';
	}

	// Clear new publisher field
	newPublisherIDEle.value = '';

	// Set focus to publisher field
	publisherEle.focus();
}


//
// removePublisher()
//
// Removes specified publisher from list of publishers
//
function removePublisher(id) {
	// Get element references
	var publisherIDEle = document.getElementById('PublisherID');
	var publisherListItemEle = document.getElementById('divPublisherList_' + id);

	// Remove list item
	publisherListItemEle.parentNode.removeChild(publisherListItemEle);

	// Remove id from list
	var arrSplit = publisherIDEle.value.split(",");
	publisherIDEle.value = '';
	for ( var i = 0; i < arrSplit.length; i++ ) {
		if ( (publisherIDEle.value == '') && (arrSplit[i] != '') && (arrSplit[i] != id) ) {
			publisherIDEle.value = arrSplit[i];
		} else if ( (arrSplit[i] != '') && (arrSplit[i] != id) ) {
			publisherIDEle.value = publisherIDEle.value + "," + arrSplit[i];
		}
	}
}


//
// addCoverage()
//
// Adds specified coverage to list of coverages
//
function addCoverage() {
	reqInd = false;

	// Get element references
	var coverageEle = document.getElementById('Coverage');
	var newCoverageIDEle = document.getElementById('NewCoverageID');

	// Get element values
	var coverageVal = coverageEle.value;
	var newCoverageIDVal = newCoverageIDEle.value;


	// If field is blank
	if ( trim(coverageVal) == '' ) {
		alert('ERROR: You must enter an coverage before adding it to the list.');
		return;
	}

	// Add new coverage to system and get ID
	if ( trim(newCoverageIDVal) == '' ) {
		loadXMLDoc('_ajaxAddCoverage.cfm?Coverage=' + coverageVal, addCoverageHold);
	} else {
		addCoverage2();
	}
}

function addCoverageHold() {
	// If newly added coverage, get new ID
	if ( (req.status == '200') && (trim(req.responseText) != '') ) {
		// Check for errors
		if ( req.responseText.charAt(0) == 'E' ) {
			if ( ! reqInd ) {
				alert(req.responseText);
				reqInd = true;
			}
			return;
		} else {
			document.getElementById('NewCoverageID').value = req.responseText;
			addCoverage2();
		}
	}
}

function addCoverage2() {
	// Get element references
	var coverageIDEle = document.getElementById('CoverageID');
	var coverageListEle = document.getElementById('ulCoverageList');
	var coverageEle = document.getElementById('Coverage');
	var newCoverageIDEle = document.getElementById('NewCoverageID');

	// Get element values
	var coverageIDVal = coverageIDEle.value;
	var coverageVal = coverageEle.value;
	var newCoverageIDVal = newCoverageIDEle.value;


	// Check that we haven't already done this
	if ( (trim(coverageVal) != '') && (trim(newCoverageIDVal) != '') ) {
		// Add id to list
		if ( trim(coverageIDVal) == '' ) {
			coverageIDEle.value = newCoverageIDVal;
		} else {
			coverageIDEle.value = coverageIDEle.value + "," + newCoverageIDVal;
		}

		// Add name to list
		var newNode = "<li id=\"divCoverageList_" + newCoverageIDVal + "\">";
		newNode = newNode + coverageVal;
		newNode = newNode + "<a href=\"\" title=\"Remove " + coverageVal + "\" onClick=\"removeCoverage('" + newCoverageIDVal + "'); return false;\">Remove</a>";
		newNode = newNode + "</li>";
		coverageListEle.innerHTML = coverageListEle.innerHTML + newNode;

		// Clear new coverage field
		coverageEle.value = '';
	}

	// Clear new coverage field
	newCoverageIDEle.value = '';

	// Set focus to coverage field
	coverageEle.focus();
}


//
// removeCoverage()
//
// Removes specified coverage from list of coverages
//
function removeCoverage(id) {
	// Get element references
	var coverageIDEle = document.getElementById('CoverageID');
	var coverageListItemEle = document.getElementById('divCoverageList_' + id);

	// Remove list item
	coverageListItemEle.parentNode.removeChild(coverageListItemEle);

	// Remove id from list
	var arrSplit = coverageIDEle.value.split(",");
	coverageIDEle.value = '';
	for ( var i = 0; i < arrSplit.length; i++ ) {
		if ( (coverageIDEle.value == '') && (arrSplit[i] != '') && (arrSplit[i] != id) ) {
			coverageIDEle.value = arrSplit[i];
		} else if ( (arrSplit[i] != '') && (arrSplit[i] != id) ) {
			coverageIDEle.value = coverageIDEle.value + "," + arrSplit[i];
		}
	}
}


//
// addFunder()
//
// Adds specified funder to list of funders
//
function addFunder() {
	reqInd = false;

	// Get element references
	var funderEle = document.getElementById('Funder');
	var newFunderIDEle = document.getElementById('NewFunderID');

	// Get element values
	var funderVal = funderEle.value;
	var newFunderIDVal = newFunderIDEle.value;


	// If field is blank
	if ( trim(funderVal) == '' ) {
		alert('ERROR: You must enter an funder before adding it to the list.');
		return;
	}

	// Add new funder to system and get ID
	if ( trim(newFunderIDVal) == '' ) {
		loadXMLDoc('_ajaxAddFunder.cfm?Funder=' + funderVal, addFunderHold);
	} else {
		addFunder2();
	}
}

function addFunderHold() {
	// If newly added funder, get new ID
	if ( (req.status == '200') && (trim(req.responseText) != '') ) {
		// Check for errors
		if ( req.responseText.charAt(0) == 'E' ) {
			if ( ! reqInd ) {
				alert(req.responseText);
				reqInd = true;
			}
			return;
		} else {
			document.getElementById('NewFunderID').value = req.responseText;
			addFunder2();
		}
	}
}

function addFunder2() {
	// Get element references
	var funderIDEle = document.getElementById('FunderID');
	var funderListEle = document.getElementById('ulFunderList');
	var funderEle = document.getElementById('Funder');
	var newFunderIDEle = document.getElementById('NewFunderID');

	// Get element values
	var funderIDVal = funderIDEle.value;
	var funderVal = funderEle.value;
	var newFunderIDVal = newFunderIDEle.value;


	// Check that we haven't already done this
	if ( (trim(funderVal) != '') && (trim(newFunderIDVal) != '') ) {
		// Add id to list
		if ( trim(funderIDVal) == '' ) {
			funderIDEle.value = newFunderIDVal;
		} else {
			funderIDEle.value = funderIDEle.value + "," + newFunderIDVal;
		}

		// Add name to list
		var newNode = "<li id=\"divFunderList_" + newFunderIDVal + "\">";
		newNode = newNode + funderVal;
		newNode = newNode + "<a href=\"\" title=\"Remove " + funderVal + "\" onClick=\"removeFunder('" + newFunderIDVal + "'); return false;\">Remove</a>";
		newNode = newNode + "</li>";
		funderListEle.innerHTML = funderListEle.innerHTML + newNode;

		// Clear new funder field
		funderEle.value = '';
	}

	// Clear new funder field
	newFunderIDEle.value = '';

	// Set focus to funder field
	funderEle.focus();
}


//
// removeFunder()
//
// Removes specified funder from list of funders
//
function removeFunder(id) {
	// Get element references
	var funderIDEle = document.getElementById('FunderID');
	var funderListItemEle = document.getElementById('divFunderList_' + id);

	// Remove list item
	funderListItemEle.parentNode.removeChild(funderListItemEle);

	// Remove id from list
	var arrSplit = funderIDEle.value.split(",");
	funderIDEle.value = '';
	for ( var i = 0; i < arrSplit.length; i++ ) {
		if ( (funderIDEle.value == '') && (arrSplit[i] != '') && (arrSplit[i] != id) ) {
			funderIDEle.value = arrSplit[i];
		} else if ( (arrSplit[i] != '') && (arrSplit[i] != id) ) {
			funderIDEle.value = funderIDEle.value + "," + arrSplit[i];
		}
	}
}


//
// parseSearchParameters(name, value)
//
// Parses specified value and returns it in GSA format
//
function parseSearchParameters(name, value) {
	var parsedString = '';
	var termArray = '';
	var spaceChar = '%20';
	var tempPhrase = '';
	var boolOp = '.';

	// Remove any periods from search string
	value = value.replace(/[.]/g, "");

	// Break input into separate terms
	termArray = value.split(' ');

	// Iterate over array and build phrases
	for ( var i = 0; i < termArray.length; i++ ) {
		if ( termArray[i].charAt(0) == '"' ) {
			// IF start of quoted string
			tempPhrase = termArray[i].slice(1,termArray[i].length);

		} else if ( termArray[i].charAt(termArray[i].length - 1) == '"' ) {
			// IF end of quoted string
			tempPhrase = tempPhrase + spaceChar + termArray[i].slice(0,termArray[i].length - 1);

			// Add finished phrase to parsed string
			if ( parsedString == '' ) {
				parsedString = name + ':' + tempPhrase;
			} else {
				parsedString = parsedString + boolOp + name + ':' + tempPhrase;
				boolOp = '.';
			}

			tempPhrase = '';

		} else if ( tempPhrase != '' ) {
			// IF middle of quoted string
			tempPhrase = tempPhrase + spaceChar + termArray[i];

		} else if ( tempPhrase == '' ) {
			// IF non-quoted string
			if ( parsedString == '' ) {
				parsedString = name + ':' + termArray[i];
			} else if ( termArray[i].toUpperCase() == 'OR' ) {
				// IF phrase is the word "OR"
				boolOp = '|';
			} else if ( termArray[i].toUpperCase() == 'AND' ) {
				// IF phrase is the word "AND"
				boolOp = '.';
			} else {
				parsedString = parsedString + boolOp + name + ':' + termArray[i];
				boolOp = '.';
			}
		}
	}

	return encodeURI(parsedString);
}


//
// buildGsaUrl()
//
// Takes the values entered in the advanced search form and builds a GSA search query string
//
function buildGsaUrl() {
	// Indicates if we've already started the partial field parameter
	var advStartInd = false;

	// Value of the StartYear field
	var valStartYear = document.getElementById('StartYear').options[document.getElementById('StartYear').selectedIndex].value;

	// Value of the EndYear field
	var valEndYear = document.getElementById('EndYear').options[document.getElementById('EndYear').selectedIndex].value;

	// An array of text fields to prepare
	var fieldArray = ['author','title','publicationname','abstract','publisher','coverage'];

	// The base URL for the search including the primary query
	var baseURL = 'http://search.bjpa.org/search?client=default_frontend&output=xml_no_dtd&proxystylesheet=default_frontend&filter=0&getfields=*';


	// Check that user entered some search term other than just dates
	var searchTermBlankInd = true;
	if ( document.getElementById('q').value != '' ) {
		searchTermBlankInd = false;
	}
	for ( var i = 0; i < fieldArray.length; i++ ) {
		if ( document.getElementById(fieldArray[i]).value != '' ) {
			searchTermBlankInd = false;
		}
	}
	if ( searchTermBlankInd ) {
		alert("ERROR: Please enter a search term and/or criteria (publication date only searches are not supported.)")
		return false;
	}


	// Append query term
	baseURL = baseURL + '&q=' + encodeURI(document.getElementById('q').value)


	// If query term is blank, populate with an advanced search form term
	var advTerm = '';
	if ( trim(document.getElementById('q').value) == '' ) {
		for ( var i = 0; i < fieldArray.length; i++ ) {
			if ( (advTerm == '') && (document.getElementById(fieldArray[i]).value != '') ) {
				advTerm = document.getElementById(fieldArray[i]).value;
			}
		}

		baseURL = baseURL + advTerm;
	}


	// Append date field parameters as part of query term
	if ( (valStartYear != '') || (valEndYear != '') ) {
		baseURL = baseURL + '+daterange:';

		if ( valStartYear != '' ) {
			baseURL = baseURL + valStartYear + '-01-01';
		}

		baseURL = baseURL + '..';

		if ( valEndYear != '' ) {
			baseURL = baseURL + valEndYear + '-12-31';
		}
	}


	// Append text field parameters
	for ( var i = 0; i < fieldArray.length; i++ ) {
		if ( document.getElementById(fieldArray[i]).value != '' ) {
			if ( ! advStartInd ) {
				baseURL = baseURL + "&partialfields=";
				advStartInd = true;
			} else {
				baseURL = baseURL + ".";
			}

			baseURL = baseURL + parseSearchParameters(fieldArray[i], document.getElementById(fieldArray[i]).value);
		}
	}


	// Append sort/num parameters
	baseURL = baseURL + '&sort=' + encodeURI(document.getElementById('sort').options[document.getElementById('sort').selectedIndex].value);
	baseURL = baseURL + '&num=' + encodeURI(document.getElementById('num').options[document.getElementById('num').selectedIndex].value);


	// Redirect to GSA
	document.location.href = baseURL;
}


//
// parseOperators(ele)
//
// Parses specified search field to capitalize operators
//
function parseOperators(ele) {
	ele.value = ele.value.replace(/ or /ig, " OR ");
}
