function setPosition(groupKey, pos, submitForm) {
	var theForm = $('FormAjaxSearchResults-'+ groupKey);
	if (theForm && theForm.Pos) {
		theForm.Pos.value=pos;
		if (submitForm)
			submitSearch(theForm, groupKey);
	}
}

function submitSearch(theForm, groupKey) {
	if (!theForm) return false;
	var formId = '#'+theForm.id
	var searchResultsContainerDiv = $$(formId + ' .searchResults' + groupKey);
	var searchFiltersContainerDiv = $$(formId + ' .searchFilters' + groupKey);
	var searchPagingContainerDiv = $$(formId  + ' .searchPaging' + groupKey);
	
	var ajaxWaitingDiv = $$(formId + ' .cms-search-waiting-' + groupKey);
	var ajaxWaitingDivAutoComplete = $$(formId + ' .cms-search-waiting-input-' + groupKey);
	
	var isAutoCompleteModeRequest = theForm.mode.value != '';
	var areSearchResultsDisplayedOnDifferentPage = theForm.externalSearchResultUrl.value != '';
	
	// the form should be submitted without using ajax
	if (areSearchResultsDisplayedOnDifferentPage && !isAutoCompleteModeRequest) {
		theForm.submit();
		return;
	}
	
	theForm.request
	(
		{
			method: 'post',
			requestHeaders:  ['Pragma', 'no-cache', 'Cache-Control', 'must-revalidate','If-Modified-Since', document.lastModified],
			onFailure: function() {
			},
			onCreate: function(transport) {
				if (ajaxWaitingDivAutoComplete && isAutoCompleteModeRequest) {
					ajaxWaitingDivAutoComplete.each(function(item){
						showAjaxWaitingScreen(item.id);
					});
				}
				if (ajaxWaitingDiv) {
					ajaxWaitingDiv.each(function(item){
						showAjaxWaitingScreen(item.id);
					});
				}
				
				if (isAutoCompleteModeRequest && theForm.ajaxActionServletUrl)
					transport.request.url = theForm.ajaxActionServletUrl.value;
				
			},
			onSuccess: function(transport) {
				if (transport && transport.responseText) {

					// Searchresults
					var searchResultsRegExp = new RegExp('<searchResults>([\\s\\S]*)</searchResults>','ig');
					var outputSearchResults = searchResultsRegExp.exec(transport.responseText);
					
					var csrfIdRegExp = new RegExp('csrf_Id="([^"]+)"','ig');
					var theNewcsrfId = csrfIdRegExp.exec(transport.responseText);
					if (theNewcsrfId && theNewcsrfId[1])
						theForm.csrfId.value = theNewcsrfId[1];
					
					if (outputSearchResults && outputSearchResults[1]  && searchResultsContainerDiv) {
						
						if (isAutoCompleteModeRequest) {
							var autocompleteLayerContent = $(groupKey+'-autocompleteLayerContent');
							var autocompleteLayer = $(groupKey+'-autocompleteLayer');
							if (autocompleteLayerContent) autocompleteLayerContent.update(outputSearchResults[1]);
							if (autocompleteLayer) autocompleteLayer.show();
							
							disableAutcompleteRequestMode(theForm);
						}
						else if (!isAutoCompleteModeRequest) {
							searchResultsContainerDiv.each(function(item){
								item.update(outputSearchResults[1]);
							});
						}
					} 
					
					if (!isAutoCompleteModeRequest) {
						// Paging
						var searchPagingRegExp = new RegExp('<searchPaging>([\\s\\S]*)</searchPaging>','ig');
						var outputPagingResults = searchPagingRegExp.exec(transport.responseText);
						if (outputPagingResults && outputPagingResults[1] && searchPagingContainerDiv) {
							searchPagingContainerDiv.each(function(item){
								item.update(outputPagingResults[1]);
							});
						} else if (searchPagingContainerDiv) {
							searchPagingContainerDiv.each(function(item){
								item.update('');
							});
						}

						// Filters 
						var searchFiltersRegExp = new RegExp('<searchFilters>([\\s\\S]*)</searchFilters>','ig');
						var outputFilterResults = searchFiltersRegExp.exec(transport.responseText);
						if (outputFilterResults && outputFilterResults[1] && searchFiltersContainerDiv) {
							searchFiltersContainerDiv.each(function(item){
								item.update(outputFilterResults[1]);
							});
						} 
						
					}

				}
				
				if (ajaxWaitingDivAutoComplete) {
					ajaxWaitingDivAutoComplete.each(function(item){
						hideAjaxWaitingScreen(item.id);
					});
				}
				
				if (ajaxWaitingDiv) {
					ajaxWaitingDiv.each(function(item){
						hideAjaxWaitingScreen(item.id);
					});
				}
			}
		}
	);
	
	return false;
}

function enableAutcompleteRequestMode(theForm) {
	if (theForm) {
		theForm.mode.value = 'autocompleterequestmode';
	}
}

function disableAutcompleteRequestMode(theForm) {
	if (theForm) {
		theForm.mode.value = '';
	}
}

function toggleChildParentQuerys(theCheckedElement, theForm, idOfFilterContainer, position, groupKey) {
	if (!theForm) return null;
	var allFilters = $$('#'+theForm.id + ' .' + idOfFilterContainer);
	if (allFilters) {
		allFilters.each(function(item) {
			// synchronize all filters with the value was set 
			if (item.name == theCheckedElement.name) {
				item.checked = theCheckedElement.checked;
			}
			
			// master/parent filter was checked
			if (position == 1) {
				// uncheck all child items 
				if (!item.name.endsWith("-"+position)) {
					item.checked = false;
				}
			} else {
				// uncheck only the parent filter
				if (item.name.endsWith("-1")) {
					item.checked = false;
				}
			}
		});
		// set paging to default first page
		setPosition(groupKey, 1, false);
	}
}

Event.observe(window, 'load', initAutoComplete);

function initAutoComplete() {
	
	// init only if we found some autocomplete layers
	if ($$('.autocompleteLayerContent').length == 0) return;
	
	var allUserQueryInputFields = $$('.userQueryField');
	if (allUserQueryInputFields) {
		allUserQueryInputFields.each(function(item) {
			item.observe('keydown', myHandler);
		});
	}			
}


function myHandler(event){
	if (typeof myHandler_timer != 'undefined' && myHandler_timer != null){
		clearTimeout(myHandler_timer);
	}
	
	//global vars used here to use inside the timeout function
	myHandler_keycode = event.keyCode;
	myHandler_item = this;
	
	myHandler_timer = setTimeout(function() {
					
		var theFormToSubmit = myHandler_item.up('form');
		if (theFormToSubmit) {

			// remove the name of the form prefix
			var formGroupKey = theFormToSubmit.id.replace(/[a-zA-Z]+-/, ""); 
			var autoCompleteLayer = $(formGroupKey + '-autocompleteLayer');
			
			disableAutcompleteRequestMode(theFormToSubmit);
			
			
			// no layer available just submit the form
			if (!autoCompleteLayer) {
				if (myHandler_item.value && myHandler_item.value.length != 0) {
					submitSearch(theFormToSubmit, formGroupKey);
				}
				return null;
			}
			
			if (//enter
					myHandler_keycode == 13 ||
				// cursor keys
					myHandler_keycode == 39 || myHandler_keycode == 37 || myHandler_keycode == 40 || myHandler_keycode == 38 || 
				// page up / down
					myHandler_keycode == 33 || myHandler_keycode == 34 ||
				//home & end & tab
					myHandler_keycode == 36 || myHandler_keycode == 35 || myHandler_keycode == 9) {
				return null;
			// esacpe key?
			} else if (myHandler_keycode == 27) {
				if (autoCompleteLayer) autoCompleteLayer.hide();
				return null;
			}
			
			$$('body')[0].observe('click', function (evt) {
		        var target = evt.target;
		        if (1==1) {
		        	var insideAutoCompleteLayer = $(target).up('#'+ formGroupKey + '-autocompleteLayerContent');
		        	if(!insideAutoCompleteLayer){
		        		if (autoCompleteLayer) autoCompleteLayer.hide();
		        		$$('body')[0].stopObserving(); // layer is already closed ;-)
		        	}
		        }
			});
			
			if (myHandler_item.value && myHandler_item.value.length != 0) {
				enableAutcompleteRequestMode(theFormToSubmit);
				if (autoCompleteLayer) autoCompleteLayer.hide();
				submitSearch(theFormToSubmit, formGroupKey);
			} else {
				disableAutcompleteRequestMode(theFormToSubmit);
				if (autoCompleteLayer) autoCompleteLayer.hide();
			}
		}
				
		myHandler_timer = null;
	}, 250);
}

// currently not used, because for the ie not all arguments were passed
function throttle(fn, delay) {
  var timer = null;
  return function () {
    var context = this, args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function () {
      fn.apply(context, args);
    }, delay);
  };
}
