function GISearchPanel() {
	var me = this;
	me.languages = new Array();
	me.languageList = document.getElementById("cmbSearchPanel");
	me.deepSearchCheckbox = document.getElementById("chkDeepSearch");
	
	// return the function that determines what to show in the autocomplete dropdown
	var populateListCallbackFactory = function(autocompleteObject) {
		return function() {
	        var callback = function( responseText ) {
	            // We'll be getting back the responses in plain text - line by line
	            var matches = responseText.split("\n");
	            autocompleteObject.setChoices( matches, autocompleteObject.getText( ) );
	        };
	
	        var match = encodeURIComponent( autocompleteObject.getText( ) );
	        var url = "AutoCompleteXML?match=" + match + "&language=" + me.languageList.options[me.languageList.selectedIndex].value;
	        url += "&stamp=" + (new Date()).getTime();
	        AjaxClient.invokeGet( url, true, callback );
		}
	}
	
	// make the search textbox into an autocomplete textbox
	me.autoCompleteTextBox = new AutoCompleteTextBox( "txtSearchPanel", populateListCallbackFactory );
	
	// add functionality to the 'translate' button
	me.btnSearchPanel = document.getElementById("btnSearchPanel");
		
	me.languageList.onchange = function(e) {
		if (!e) var e = window.event;
	    var languageText = me.languageList.options[me.languageList.selectedIndex].text.replace(/\[.*?\]/gi, "");
	    if (languageText.charAt(0) == '-')
	    	languageText = me.languageList.options[0].text;
	    var enterWordUIText = document.getElementById("enterWordUIText");
	    var s = enterWordUIText.childNodes[0].data;
	    var olds = me.autoCompleteTextBox.getText();
	    var regex = s.replace("[language]", ".*");

	    // TODO: NASTY HACK
	    if (olds == null || olds == "" || olds.match(regex))
	    	me.autoCompleteTextBox.setText(s.replace("[language]", languageText));
	}
	
	me.autoCompleteTextBox.onkeypress = function(e) {
		var code;
		if (!e) var e = window.event;
		if (e.keyCode) code = e.keyCode;
		else if (e.which) code = e.which;
	
	    if ( code == KeyCodes.KEY_ENTER ) {
	        me.btnSearchPanel.onclick( null );
	    }
	}
	
	me.autoCompleteTextBox.onfocus = function (e) {
		me.autoCompleteTextBox.selectAll();
	}
	
	me.btnSearchPanel.onclick = function(e) {	
		lucky=false;
		
		// log that the user clicked 'translate'
		var url = "LogStatServlet?translate=true";
	    AjaxClient.invokeGet(url, true, function ( responseText ) {} ); 

		// refresh the page if nothing was entered
		var searchWordID = me.getQueryText();
		if (searchWordID.trim() == '') {
			location.reload(true);
			return;
		}
		
		var searchLanguageID = me.getSearchLanguageID();
		if(searchLanguageID==-1) {
			findLanguages();
		} else {
			goDirectly(searchLanguageID);	
		}
	}
	
	// when the user clicks anywhere but on the popup, hide the popup
	var oldClick = (document.onclick) ? document.onclick : function () {};
	document.onclick = function (e) {
		var targ;
		if (!e) var e = window.event;
		if (e.target) targ = e.target;
		else if (e.srcElement) targ = e.srcElement;
		if (targ.nodeType == 3) // defeat Safari bug
			targ = targ.parentNode;
	
		if ( targ.nodeName.toUpperCase() == 'OPTION' )
			targ = targ.parentNode;
	
		if (targ != me.autoCompleteTextBox.listbox &&
			targ != me.autoCompleteTextBox.listboxContainer) {
			me.autoCompleteTextBox.escapeKey();
		} else {
			me.autoCompleteTextBox.complete();
		}
	
		return oldClick(e);
	};
	
	me.autoCompleteTextBox.setFocus();
}

function feelingLucky() {
	lucky = true;
	conjunctive = false;
	
	// log that the user clicked 'show images'
	var url = "LogStatServlet?showimages=true";
	AjaxClient.invokeGet(url, true, function ( responseText ) {} ); 

	var sp = document.searchPanel;
	
	// refresh the page if nothing was entered
	var searchWordID = sp.getQueryText();
	if (searchWordID == '') {
		location.reload(true);
		return;
	}
	
	findLanguages();
}

GISearchPanel.prototype.setSearchLanguageID = function(searchLanguageID) {
    for ( var i = 0; i < this.languageList.options.length; i++) {
        if (this.languageList.options[i].value == searchLanguageID) {
        	this.languageList.selectedIndex = i;
        	this.languageList.onchange();
            break;
        }
    }
}

GISearchPanel.prototype.getSearchLanguages = function() {
	return this.languageList.options;
}

GISearchPanel.prototype.getSearchLanguageID = function() {
	return this.languageList.options[this.languageList.selectedIndex].value;
}

GISearchPanel.prototype.getLanguageText = function() {
	return this.languageList.options[this.languageList.selectedIndex].text;
}

GISearchPanel.prototype.setQueryText = function(queryText) {
	this.autoCompleteTextBox.setText(queryText);
}

GISearchPanel.prototype.getQueryText = function() {
	return this.autoCompleteTextBox.getText();
}

GISearchPanel.prototype.isDeepSearch = function() {
	if (this.deepSearchCheckbox != null)
		return this.deepSearchCheckbox.checked;
	else
		return false;
}

GISearchPanel.prototype.setDeepSearch = function( b ) {
	if (this.deepSearchCheckbox != null) {
		return this.deepSearchCheckbox.checked = b;
	}
}

GISearchPanel.prototype.setFocus = function() {
	return this.autoCompleteTextBox.setFocus();
}

document.searchPanel = new GISearchPanel();
