var searchPane = null;
/// Completer for taxName1
var completer1 = null;
/// Completer for taxName2
var completer2 = null;
/// Completer for taxName3
var completer3 = null;
/// Completer for loBound
var completer4 = null;
/// Completer for upBound
var completer5 = null;
/// Completer for aut1
var completer6 = null;
/// Completer for aut2
var completer7 = null;
/// Completer for geoName1
var completer8 = null;
/// Completer for geoName2
var completer9 = null;
/// Completer for geoName3
var completer10 = null;

/**
 * Custom parse function for the auto completion
 *
 * @access public
 * @param el DOM element
 * @return void
 **/
function myParseChoices(el)
{
	var value = null;
	if (el.getFirst()) {
		value = el.getFirst().innerHTML;
		el.inputValue = value;
		this.addChoiceEvents(el).getFirst().setHTML(this.markQueryValue(value));
	}
}

/**
 * Restrict options of a combo box to values below a given value
 *
 * @access public
 * @param el DOM element
 * @return void
 **/
function restrictOptions(el,value)
{
	// Reset the options
	for (var i = el.options.length; i > 0; i--) {
		el.options[i - 1] = null;
	} // while
	// Copy original options below a certain value
	el.origOptions.each(function (o,i){if (o.value < value) el.options[el.options.length] = o;});
	// Correct the selected value if necessary
	if (el.value >= value) {
		el.value = -1;
		el.fireEvent('change');
	}
}

/**
 * Prepare a combo box for value restriction, i.e. make a backup of the original options
 *
 * @access public
 * @param el DOM element
 * @return void
 **/
function prepareSelect(el)
{
	// Copy the options array into origOptions for backup
	el.origOptions = $A(el.options).copy();
}

/**
 * Event handler for field taxType1
 *
 * @access public
 * @return void
 **/
function onChangeTax1()
{
	var value = $('taxType1').value;
	// Set variables in completer objects for taxName1 and taxName2
	completer1.options.postData['type'] = value;
	completer2.options.postData['parType'] = value;
	// Reset taxName1 value
	$('taxName1').value = '';
	// Adjust visibility of fields according to selected type
	if (value == -1) { // no selection
		$('tax2').setStyle('display','none');
		$('tax3').setStyle('display','none');
		$('taxName1').disabled = true;
		$('taxName2').value = '';
		$('taxName2').disabled = true;
		$('taxName3').value = '';
		$('taxName3').disabled = true;
	}
	else if (value == 0) { // Species
		$('tax2').setStyle('display','none');
		$('tax3').setStyle('display','none');
		$('taxName1').disabled = false;
		$('taxName2').disabled = true;
		$('taxName3').value = '';
		$('taxName3').disabled = true;
	}
	else {
		$('tax2').setStyle('display','');
		$('taxName1').disabled = false;
		restrictOptions($('taxType2'),value);
	}
}

/**
 * Event handler when leaving taxName1
 *
 * @access public
 * @return void
 **/
function onLeaveTax1()
{
	var value = $('taxName1').value;
	// Set parentValue parameter in completer for taxName2
	completer2.options.postData['parValue'] = value;
}

/**
 * Event handler for taxName2
 *
 * @access public
 * @return void
 **/
function onChangeTax2()
{
	var value = $('taxType2').value;
	// Set variables in completer objects for taxName2 and taxName3
	completer2.options.postData['type'] = value;
	completer3.options.postData['parType'] = value;
	// Reset value in taxName2
	$('taxName2').value = '';
	// Set visibility of taxName3 according to selection
	if (value == -1) { // no selection
		$('tax3').setStyle('display','none');
		$('taxName2').disabled = true;
	}
	else if (value == 0) { // Species
		$('tax3').setStyle('display','none');
		$('taxName2').disabled = false;
	}
	else {
		$('tax3').setStyle('display','');
		$('taxName2').disabled = false;
		restrictOptions($('taxType3'),value);
	}
}

/**
 * Event handler when leaving taxName2
 *
 * @access public
 * @return void
 **/
function onLeaveTax2()
{
	var value = $('taxName2').value;
	// Set variable for taxName3 completer
	completer3.options.postData['parValue'] = value;
}

/**
 * Event handler when changing taxType3
 *
 * @access public
 * @return void
 **/
function onChangeTax3()
{
	var value = $('taxType3').value;
	// Set variable for completer of taxName3
	completer3.options.postData['type'] = value;
	// Reset value of taxName3
	$('taxName3').value = '';
	// Set status of taxName3 according to selection
	if (value == -1) { // no selection
		$('taxName3').disabled = true;
	}
	else {
		$('taxName3').disabled = false;
	}
}

/**
 * Event handler when leaving loBound
 *
 * @access public
 * @return void
 **/
function onLeaveLoBound()
{
	var value = $('loBound').value;
	// Set variable for upBound completer
	completer5.options.postData['loBound'] = value;
}

/**
 * Event handler when leaving author1
 *
 * @access public
 * @return void
 **/
function onChangeAut1()
{
	var value = $('author1').value;
	// Set status of author2 according to value
	$('author2').disabled = (value == '') ? true : false;
}

/**
 * Event handler when selecting an entry from the author1 completer
 *
 * @access public
 * @return void
 **/
function onSelectAut1(){
	// Memorizes author id from the completer list in the hidden form field author1id
	$('author1id').value = this.selected ? this.selected.id : '';
}

/**
 * Event handler when selecting an entry ftom the author2 completer
 *
 * @access public
 * @return void
 **/
function onSelectAut2(){
	// Memorizes author id from the completer list in the hidden form field author2id
	$('author2id').value = this.selected ? this.selected.id : '';
}

/**
 * Event handler when geo1Type
 *
 * @access public
 * @return void
 **/
function onChangeGeo1()
{
	var value = $('geoType1').value;
	// Set the completer variable for the corresponding name field to the geo type value
	completer8.options.postData['type'] = value;
	// Set the completer variable 'parent type' for the name field in the next level to the geo type value
	completer9.options.postData['parType'] = value;
	$('geoName1').value = '';
	// Set visibility of fields according to selection
	if (value == -1) { // no selection
		$('geo2').setStyle('display','none');
		$('geo3').setStyle('display','none');
		$('geoName1').disabled = true;
		$('geoName2').value = '';
		$('geoName2').disabled = true;
		$('geoName3').value = '';
		$('geoName3').disabled = true;
	}
	else if (value == 0) { // layer
		$('geo2').setStyle('display','none');
		$('geo3').setStyle('display','none');
		$('geoName1').disabled = false;
		$('geoName2').disabled = true;
		$('geoName3').value = '';
		$('geoName3').disabled = true;
	}
	else { // all other
		$('geo2').setStyle('display','');
		$('geoName1').disabled = false;
		restrictOptions($('geoType2'),value);
	}
}

/**
 * Event handler when leaving geoName1
 *
 * @access public
 * @return void
 **/
function onLeaveGeo1()
{
	var value = $('geoName1').value;
	// Set variable in the completer of the next level
	completer9.options.postData['parValue'] = value;
}

/**
 * Event handler when changing geoType2
 *
 * @access public
 * @return void
 **/
function onChangeGeo2()
{
	var value = $('geoType2').value;
	// Set completer variable for the corresponding name field
	completer9.options.postData['type'] = value;
	// Set completer variable for the name field in the next level
	completer10.options.postData['parType'] = value;
	$('geoName2').value = '';
	if (value == -1) { // no selection
		$('geo3').setStyle('display','none');
		$('geoName2').disabled = true;
	}
	else if (value == 0) { // layer
		$('geo3').setStyle('display','none');
		$('geoName2').disabled = false;
	}
	else { // all other
		$('geo3').setStyle('display','');
		$('geoName2').disabled = false;
		restrictOptions($('geoType3'),value);
	}
}

/**
 * Event handler when leaving geoName2
 *
 * @access public
 * @return void
 **/
function onLeaveGeo2()
{
	var value = $('geoName2').value;
	// Memorize the value in the completer varaible of the next level
	completer10.options.postData['parValue'] = value;
}

/**
 * Event handler when changing geoType3
 * @access public
 * @return void
 **/
function onChangeGeo3()
{
	var value = $('geoType3').value;
	// Memorize the type in the corresponding completer
	completer10.options.postData['type'] = value;
	// Set geoName3 and disable/enable
	$('geoName3').value = '';
	if (value == -1) { // no selection
		$('geoName3').disabled = true;
	}
	else { // all other
		$('geoName3').disabled = false;
	}
}

/**
 * Toogle a group in a search tab
 *
 * @access public
 * @param event
 * @return void
 **/
function toggleGroup(event)
{
	event = new Event(event);
	var group = $(event.target).getParent().getParent();
	if (group.hasClass('exclusive')) {
		// When its an exclusive group
		if (group.hasClass('collapsed')) {
			// and was collapsed before
			// Collapse all groups
			$$('div.group').addClass('collapsed');
			$$('input.searchActive').value = false;
		}
	}
	else {
		//When its not exclusive, collapse only exclusive groups
		$$('div.exclusive').addClass('collapsed');
	}
	// Toggle the collapsed class assignment
	group.toggleClass('collapsed');
	// Set the hidden form field accordingly
	$(group.id + 'Active').value = group.hasClass('collapsed') ? false : true;
}

/**
 * Event handler when mouse cursor is over a tab
 *
 * @access public
 * @param DOM element
 * @return void
 **/
function tabOvr(el)
{
	$(el).addClass('BoxTabHvr');
}

/**
 * Event handler when mouse cursor leaves a tab
 *
 * @access public
 * @param DOM element
 * @return void
 **/
function tabOut(el)
{
	$(el).removeClass('BoxTabHvr');
}

/**
 * Event handler when clicking a tab in the lower pane
 *
 * @access public
 * @param DOM element
 * @return void
 **/
function tabClickLow(el)
{
	// Load a page into the tab using the element id
	searchPane.setUrl(el.id + '.html');
	// Set the new activation state
	$(el.parentNode).getElements('td.BoxTabSel').each(function(el) {el.removeClass('BoxTabSel');});
	$(el.parentNode.parentNode).getElements('td.BoxTabSelSub').each(function(el) {el.removeClass('BoxTabSelSub');});
	el.addClass('BoxTabSel');
	$(el.id + 'Sub').addClass('BoxTabSelSub');
}

/**
 * Initilize tax form
 *
 * @access public
 * @return void
 **/
function taxFormInit()
{
	// Initialize groups
	$$('div.group div.status').addEvent('click',toggleGroup);
	// Initialize widgets in taxonomy group
	// Set up auto completers
	completer1 = new Autocompleter.Ajax.Xhtml($('taxName1'),'/completeCat.html',{'parseChoices': myParseChoices,postData: {},minLength: 2});
	completer2 = new Autocompleter.Ajax.Xhtml($('taxName2'),'/completeCat.html',{'parseChoices': myParseChoices,postData: {},minLength: 0});
	completer3 = new Autocompleter.Ajax.Xhtml($('taxName3'),'/completeCat.html',{'parseChoices': myParseChoices,postData: {},minLength: 0});
	// Set up fields
	$('taxType1').addEvent('change', onChangeTax1);
	$('taxName1').addEvent('blur', onLeaveTax1);
	$('taxType2').addEvent('change', onChangeTax2);
	$('taxName2').addEvent('blur', onLeaveTax2);
	$('taxType3').addEvent('change', onChangeTax3);
	// prepare combo boxes
	prepareSelect($('taxType1'));
	prepareSelect($('taxType2'));
	prepareSelect($('taxType3'));
	// Initialize field values
	$('taxType1').value = 3;
	$('taxName1').value = '';
	completer1.options.postData['type'] = 3;
	completer2.options.postData['parType'] = 3;
	$('taxType2').value = -1;
	$('taxName2').value = '';
	restrictOptions($('taxType2'),3);
	// Initialize widgets in stratigraphy group
	completer4 = new Autocompleter.Ajax.Xhtml($('loBound'),'/completeStrat.html',{'parseChoices': myParseChoices,postData: {},inheritWidth: false});
	completer5 = new Autocompleter.Ajax.Xhtml($('upBound'),'/completeStrat.html',{'parseChoices': myParseChoices,postData: {},inheritWidth: false});
	$('loBound').addEvent('blur', onLeaveLoBound);
}

/**
 * Initilize lit form
 *
 * @access public
 * @return void
 **/
function litFormInit()
{
	// Initialize groups
	$$('div.group div.status').addEvent('click',toggleGroup);
	// Initialize widgets in authors group
	$('author1').addEvent('keyup', onChangeAut1);
	// Set up completers for author fields
	completer6 = new Autocompleter.Ajax.Xhtml($('author1'),'/completeAut.html',{'parseChoices': myParseChoices,postData: {}});
	completer6.addEvent('onSelect',onSelectAut1);
	completer7 = new Autocompleter.Ajax.Xhtml($('author2'),'/completeAut.html',{'parseChoices': myParseChoices,postData: {}});
	completer7.addEvent('onSelect',onSelectAut2);
}

/**
 * Initilize loc form
 *
 * @access public
 * @return void
 **/
function locFormInit()
{
	// Initialize groups
	$$('div.group div.status').addEvent('click',toggleGroup);
	// Initialize widgets in taxonomy group
	// Set up completers for the geography fields
	completer8 = new Autocompleter.Ajax.Xhtml($('geoName1'),'/completeGeo.html',{'parseChoices': myParseChoices,postData: {},minLength: 1});
	completer9 = new Autocompleter.Ajax.Xhtml($('geoName2'),'/completeGeo.html',{'parseChoices': myParseChoices,postData: {},minLength: 0});
	completer10 = new Autocompleter.Ajax.Xhtml($('geoName3'),'/completeGeo.html',{'parseChoices': myParseChoices,postData: {},minLength: 0});
	// Set up event handlers
	$('geoType1').addEvent('change', onChangeGeo1);
	$('geoName1').addEvent('blur', onLeaveGeo1);
	$('geoType2').addEvent('change', onChangeGeo2);
	$('geoName2').addEvent('blur', onLeaveGeo2);
	$('geoType3').addEvent('change', onChangeGeo3);
	// Prepare combo boxes
	prepareSelect($('geoType1'));
	prepareSelect($('geoType2'));
	prepareSelect($('geoType3'));
	// Set initial values for fields
	$('geoType1').value = 3;
	$('geoName1').value = '';
	completer8.options.postData['type'] = 3;
	completer9.options.postData['parType'] = 3;
	$('geoType2').value = -1;
	$('geoName2').value = '';
	restrictOptions($('geoType2'),3);
	// Initialize widgets in stratigraphy group
	// Set up completers for lower and upper bound
	completer4 = new Autocompleter.Ajax.Xhtml($('loBound'),'/completeStrat.html',{'parseChoices': myParseChoices,postData: {},inheritWidth: false});
	completer5 = new Autocompleter.Ajax.Xhtml($('upBound'),'/completeStrat.html',{'parseChoices': myParseChoices,postData: {},inheritWidth: false});
	$('loBound').addEvent('blur', onLeaveLoBound);
}


/**
 * Initilize the selected form
 *
 * @access public
 * @param DOM element
 * @return void
 **/
function formInit(el)
{
	switch (el.url){
		case 'searchFormTax.html':
			taxFormInit();
			break;
		case 'searchFormLit.html':
			litFormInit();
			break;
		case 'searchFormLoc.html':
			locFormInit();
			break;
	} // switch
}

/**
 * Initilize page
 *
 * @access public
 * @return void
 **/
function pageInit()
{
	// Set up tabs
	$('search').getElements('td.BoxTab').each(function(el){el.onmouseover=tabOvr.pass(el);el.onmouseout=tabOut.pass(el);el.onclick=tabClickLow.pass(el);});
	// Set up tab pane
	searchPane = new LoadPane('searchPane');
	searchPane.update = function(e) {formInit(this,e);}
	// Initialize the default search form
	taxFormInit();
}

window.addEvent('domready',pageInit);
