/*
 * <copyright>
 *  Copyright (c) 2009 by IICM, Graz University of Technology, Austria
 * </copyright>
 *
 *  This software is the confidential information of IICM,
 *  Graz University of Technology, Austria. You shall not disclose such
 *  confidential information and shall use it only in accordance with
 *  the IICM.
 *
 *  IICM MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
 *  SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 *  PURPOSE, OR NON-INFRINGEMENT. IICM SHALL NOT BE LIABLE FOR ANY DAMAGES
 *  SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
 *  THIS SOFTWARE OR ITS DERIVATIVES.
 *
 */ 

/* ==================================================================================== */
/* ============================ ADVANCED SEARCH-ITEMS ================================= */
/* ==================================================================================== */

var languageKey = "";
var advancedMessages= new Array(); // Named Array containing Language Keys
var fieldListGeneral = new Array();
var fieldListSpecific = new Array();

var fieldTypeText = new Array();
var fieldTypeDate = new Array();
var fieldTypeRange = new Array('plusMinus0|||&plusmn;0','plusMinus1|||&plusmn;1','plusMinus2|||&plusmn;2','plusMinus3|||&plusmn;3','plusMinus4|||&plusmn;4','plusMinus5|||&plusmn;5','fromTo|||XX-YY');
var fieldTypeRegion = new Array();

var boolOperationList = new Array();

var defaultValuesGeneral = new Object();
var defaultValuesSpecific = new Object();
var selectedValues = new Object();


/* ------------------------------------------------------------- */
/* 				Initialisation Advanced Search   				 */
/* ------------------------------------------------------------- */

/* Initialises Arrays of Advanced Search Clauses */
function initAdvancedMessages(advancedMessages) {
	this.advancedMessages=advancedMessages;
}


function initAdvancedSearchEnvironment(languageKey, selectedDatabases) {
	this.languageKey=languageKey;
	this.selectedDatabases = selectedDatabases;
}

function initAdvancedSearchClauses( searchFieldsGeneral, searchFieldsSpecific, textTypes, dateTypes, regionTypes, boolOperations ) {
	this.fieldListGeneral = searchFieldsGeneral.split("_,_");
	this.fieldListSpecific = searchFieldsSpecific.split("_,_");
	this.fieldTypeText = textTypes.split("_,_");
	this.fieldTypeDate = dateTypes.split("_,_");	
	this.fieldTypeRegion = regionTypes.split("_,_");
	this.boolOperationList = boolOperations.split("_,_");
}

/* Initialises default Values of General Search */
function initDefaultValuesGeneral( field, fieldType, boolOp ) {
	defaultValuesGeneral['field'] = field;
	defaultValuesGeneral['fieldType'] = fieldType;
	defaultValuesGeneral['boolOp'] = boolOp;
}

/* Initialises default Values of Specific Search */
function initDefaultValuesSpecific( field, fieldType, boolOp ) {
	defaultValuesSpecific['field'] = field;
	defaultValuesSpecific['fieldType'] = fieldType;
	defaultValuesSpecific['boolOp'] = boolOp;
}

/* Initalizes the selected values of current Item */
function initSelectedValues(field, searchTerm, addSearchTerm, fieldType, boolOp) {	
	if (searchTerm != '') {  }
	selectedValues['field'] = field;
	selectedValues['searchTerm'] = trim(fixText(searchTerm));
	selectedValues['addSearchTerm'] = trim(fixText(addSearchTerm));	
	selectedValues['fieldType'] = fieldType;
	selectedValues['boolOp'] = boolOp;		
}

// NOT IMPLEMENTED YET
// Checks Advanced Input Field on Enter and submits formular if pressed
function checkOnAutoSubmit(event,obj) {
	if (! document.getElementById ) { return;}	
	if ( checkKeyOnEnter(event)) {  
		document.getElementById('idAction').value='DoSearch'; 
		document.formCatalogSearch.submit() ;
	}
}

/* ------------------------------------------------------------- */
/* Adds a general or specific Search Clause for advanced Search  */
/* ------------------------------------------------------------- */
function addSearchClause(currentIndex, searchType) {
	var tableElem,tbodyElem,trElem,tdElem;
	if ( !document.getElementById || !document.createElement ) { return; }

	// ------- ROW SELECT BOOLEAN OPERATION --------	
	if ( searchType == '' ) { searchType = 'general'; } 
	var pElement = document.getElementById('idSearchClausePosition');
	/* Add a new node with searchClauseGeneral and Boolean Operations */
	if (currentIndex>0) {
		var newBooleanOperation = createBooleanOperation('boolOp', currentIndex, searchType, this.selectedValues['boolOp'] );
		pElement.appendChild( newBooleanOperation );	
	}
	
	// ------- ROW INPUT SEARCHCLAUSE --------	
	/* Create Select-Box with Searchfields */
	var selectElement = createSelect('field', currentIndex, searchType, this.selectedValues['field']);
	selectElement.onchange = new Function("updateSearchClause('fieldType','"+indexButton+"','"+currentIndex+"','"+searchType+"');");
	pElement.appendChild(selectElement);		
	var anchorElement = createAnchor("anchorSearchItem",currentIndex);
	anchorElement.appendChild(createSpacer(10)); // Spacer
	/* Create Input Field */	
	var inputElement = createInput('searchTerm', currentIndex, searchType, this.selectedValues['searchTerm'], this.selectedValues['fieldType']);
	//-- inputElement.onkeypress= new Function('checkOnAutoSubmit(window.event)'); // NOT IMPLEMENTET YET	
	anchorElement.appendChild(inputElement);
	/* Create Element SearchTerm-Unit */
	var searchTermUnit = createSearchTermUnit('searchTermUnit', currentIndex, searchType);
	anchorElement.appendChild(searchTermUnit);
	/* Create Reset-Region-Button */
	var resetButton = createResetRegionButton('resetRegion', currentIndex);
	anchorElement.appendChild(resetButton);
	anchorElement.appendChild(createSpacer(5)); // Spacer
	/* Create indexed hyphen*/
	var textElement = createIndexedTextNode("hyphen",currentIndex,"-  ");
	anchorElement.appendChild(textElement);	
	/* Create Additinal Input Field */		
	var inputElement = createInput('addSearchTerm', currentIndex, searchType, this.selectedValues['addSearchTerm']);
	anchorElement.appendChild(inputElement);
	/* Create Element AddSearchTerm-Unit */	
	var searchTermUnit = createSearchTermUnit('addSearchTermUnit', currentIndex, searchType);
	anchorElement.appendChild(searchTermUnit);
	anchorElement.appendChild(createIndexedSpacer("spacerAddTerm",currentIndex,10)); // Indexed Spacer
	/* Create Option SearchFieldType */
	var fieldTypeElement = createFieldTypeSelect('fieldType', currentIndex, searchType, this.selectedValues['fieldType']);	
	anchorElement.appendChild(fieldTypeElement);
	anchorElement.appendChild(createSpacer(10)); // Spacer	
	/* Create Index Button */
	var indexButton = createIndexButton('indexButton', currentIndex, searchType);
	anchorElement.appendChild(indexButton);	
	anchorElement.appendChild(createSpacer(10)); // Spacer	
	/* Create Region Button */
	var regionButton = createRegionButton('regionButton', currentIndex, searchType);
	anchorElement.appendChild(regionButton);		
	anchorElement.appendChild(createSpacer(10)); // Spacer
	/* Create DeleteButton */
	var deleteButton = createDeleteButton('deleteButton', currentIndex, searchType);
	anchorElement.appendChild(deleteButton);		
	pElement.appendChild(anchorElement);	
	/* SearchType HiddenField */	
	var searchTypeElement = createSearchTypeHidden('searchType', currentIndex, searchType);
	pElement.appendChild(searchTypeElement);	
	
	// ------ LAST ITEM and FIELD ATTRIBUTES ------
	/* Increase idLastItemIndex after adding SearchTerm*/
	document.getElementById('idLastItemIndex').value=currentIndex; 	
	/* Set Attributes of SearchItem-Elements depending on SearchFieldType */
	var indexPattern = '000';
	var formattedIndex = indexPattern.substring(0,indexPattern.length-currentIndex.toString().length)+currentIndex.toString();	
	fieldType=document.getElementById("idfieldType"+formattedIndex).value;	
	setFieldAttributes( currentIndex, searchType, fieldType );

	// ---------- ROW ADD SEARCHCLAUSE ------------
	/* LineFeed Element */	
	var brElement = createLineFeedElement(currentIndex);
	pElement.appendChild(brElement);
	/* AnchorElement for Thesaurus-Autocomplete */	
	var anchorElement = createAnchorAutocomplete( currentIndex );	
	pElement.appendChild(anchorElement);	
	/* Add SearchClause-Links */		
	currentIndex++; //increase CurrentIndex in addSearchClause-Links
	if ( document.getElementById('idClauseLinkGeneral') ) {
		if ( checkOnContUpdate('idContUpdate') == true ) {
			if (currentIndex > 2) { checkOnEmptySearchTermWarning( true); }
			document.getElementById('idClauseLinkGeneral').href = 'javascript:addSearchClause(' + currentIndex + ',\'general\'); if (!isPresentAdvancedSearchTerm) { document.formCatalogSearch.submit(); }';
			document.getElementById('idClauseLinkSpecific').href = 'javascript:addSearchClause(' + currentIndex + ',\'specific\');if (!isPresentAdvancedSearchTerm) { document.formCatalogSearch.submit(); }';
		}
		else {
			document.getElementById('idClauseLinkGeneral').href = 'javascript:addSearchClause(' + currentIndex + ',\'general\');';
			document.getElementById('idClauseLinkSpecific').href = 'javascript:addSearchClause(' + currentIndex + ',\'specific\');';		
		}
	}	
}


/* Sets Field Attribitutes 'hidden' and 'readOnly' depending on fieldType and searchType */
function setFieldAttributes( currentIndex, searchType, currentFieldType ) {
	if ( !document.getElementById ) { return; }
	var indexPattern = '000';
	var formattedIndex = indexPattern.substring(0,indexPattern.length-currentIndex.toString().length)+currentIndex.toString();
	var defaultArray = new Object();
	if ( searchType == 'general') { defaultArray=this.defaultValuesGeneral; } else { defaultArray=this.defaultValuesSpecific; }
	if ( currentFieldType == '' ) { currentFieldType = defaultArray['fieldType']; }	

	idSearchTerm='idsearchTerm'+formattedIndex;	
	idAddSearchTerm='idaddSearchTerm'+formattedIndex;
	idSpacerAddTerm='idspacerAddTerm'+formattedIndex;
	idhyphen = 'idhyphen'+formattedIndex;
	idaddSearchTermUnit='idaddSearchTermUnit'+formattedIndex;
	idfieldType="idfieldType"+formattedIndex;
	idresetRegion = "idresetRegion"+formattedIndex;
	if (currentFieldType == 'fromTo' || currentFieldType =='yearFromTo') {		
		setStyle(document.getElementById(idAddSearchTerm),"width:50px;display:inline;");
		setStyle(document.getElementById(idaddSearchTermUnit),"display:inline;");
		setStyle(document.getElementById(idhyphen),"display:inline;");		
		setStyle(document.getElementById(idSearchTerm),"width:50px;");
	}
	else {
		setStyle(document.getElementById(idAddSearchTerm),"display:none;");
		setStyle(document.getElementById(idaddSearchTermUnit),"display:none;");	
		setStyle(document.getElementById(idhyphen),"display:none;");	
		if (currentFieldType.substr(0,9)=="plusMinus" || currentFieldType.substr(0,9)=="yearExact") {
			setStyle(document.getElementById(idSearchTerm),"width:50px;"); 			
		}
		else {	
			setStyle(document.getElementById(idSearchTerm),"width:300px;"); 
			if (currentFieldType != 'region') {
				document.getElementById(idAddSearchTerm).value='';	
				document.getElementById(idSearchTerm).readOnly = false;
				setStyle(document.getElementById(idSearchTerm),"background-color:#f9eed4;");
			}
			else {
				setStyle(document.getElementById(idresetRegion),"display:inline;");		
				setStyle(document.getElementById(idfieldType),"display:none;");
				document.getElementById(idSearchTerm).readOnly = true;
				setStyle(document.getElementById(idSearchTerm),"background-color:#C0C0C0;");			
			}	
		}		
	}
	
}


/* Creates Anchor with indexed id = id<name><currentIndex> */
function createAnchor(name,currentIndex) {
	var indexPattern = '000';
	var formattedIndex = indexPattern.substring(0,indexPattern.length-currentIndex.toString().length)+currentIndex.toString();
	var spanElement = document.createElement("span");
	spanElement.id = 'id'+name+formattedIndex;
	return spanElement;
}


/* Creates Spacer - spacerWidth in pixels */
function createSpacer(spacerWidth) {
	var spanElement = document.createElement("span");
	spacerWidth=parseInt(spacerWidth/2);	
	setStyle(spanElement,"padding-left:"+spacerWidth+"px; padding-right:"+spacerWidth+"px;padding-top:0px;padding-bottom:0px; border:none;")
	return spanElement;
}


/* Creates indexed Spacer - spacerWidth in pixels */
function createIndexedSpacer(name,currentIndex,spacerWidth) {
	var spanElement = document.createElement("span");
	if (name != '') {
		var indexPattern = '000';
		var formattedIndex = indexPattern.substring(0,indexPattern.length-currentIndex.toString().length)+currentIndex.toString();
		spanElement.id = "id"+name+formattedIndex;
	}
	spacerWidth=parseInt(spacerWidth/2);	
	setStyle(spanElement,"padding-left:"+spacerWidth+"px; padding-right:"+spacerWidth+"px;padding-top:0px;padding-bottom:0px; border:none;")
	return spanElement;
}


/* Creates indexed textElement */
function createIndexedTextNode(name,currentIndex,content) {
	var spanElement = document.createElement("span");
	
	if (name != '') {
		var indexPattern = '000';
		var formattedIndex = indexPattern.substring(0,indexPattern.length-currentIndex.toString().length)+currentIndex.toString();
		spanElement.id = "id"+name+formattedIndex;
	}	
	setStyle(spanElement,"padding:0px;border:none;");
	var textElement = document.createTextNode(content);
	spanElement.appendChild(textElement);
	return spanElement;
}


/* Creates new RadioButtons for boolean Operation with id='boolOperation<currentIndex>' */
function createBooleanOperation( name, currentIndex, searchType, selectedOption ) {	
	var defaultArray = new Object();
	if ( searchType == 'general') { defaultArray=this.defaultValuesGeneral; } else { defaultArray=this.defaultValuesSpecific; }
	if ( selectedOption == '' ) { selectedOption=defaultArray['boolOp']; }	
	name+= '000';	
	name=name.substring(0,name.length-currentIndex.toString().length)+currentIndex.toString();
	var divElement = document.createElement('div');
	divElement.id = 'id'+name;
	divElement.setAttribute('class', 'boolOperation');
	var boolOperations = new Array();
	for (var i=0; i<boolOperationList.length; i++) {
		var dataArray = boolOperationList[i].split('|||');
		if (!dataArray[0]) { dataArray[0] = '';}
		if (!dataArray[1]) { dataArray[1] = '';}
		boolOperations[i] = '<input type="radio" name="mapAdvancedSearch[\''+name+'\']" value="'+dataArray[0]+'" ';
		if ( dataArray[0] == selectedOption ) { boolOperations[i] += 'checked '; }
		boolOperations[i] += '>'+dataArray[1];		
	} 
	divElement.innerHTML = boolOperations.join('\n');
	return divElement;
}


/* Creates hidden Input for searchTypeElement (general or specific) */
function createSearchTypeHidden(name, currentIndex, searchType) {
	name+= '000';	
	name=name.substring(0,name.length-currentIndex.toString().length)+currentIndex.toString();
	var inputElement = document.createElement('input');
	inputElement.name= 'mapAdvancedSearch[\''+name+'\']';
	inputElement.id = 'id'+name;
	inputElement.type= 'hidden'; 
	if (trim(searchType) == '') {searchType='general';}
	inputElement.value = searchType.toLowerCase();	
	return inputElement;
}

/* Creates Button for displaying Index */
function createIndexButton( name, currentIndex, searchType ) {
	// Check if CatalogSearchIndex is enabled
	var indexEnabled = 'no';
	var indexButtonDisabled = "true"; 
	var searchFieldData = getSearchFieldDataFromArray(currentIndex, searchType);
	if ( searchFieldData ) { indexEnabled = searchFieldData['sfIndexEnabled']; }
	// Get id of SearchTerm for Filter
	var idSearchTerm = "idsearchTerm000";
	idSearchTerm=idSearchTerm.substring(0,idSearchTerm.length-currentIndex.toString().length)+currentIndex.toString();
	// Create SearchIndexButton
	name+= '000';	
	name=name.substring(0,name.length-currentIndex.toString().length)+currentIndex.toString();		
	searchFieldKey = searchFieldData['sfKey'];	
	var spanElement = document.createElement('span');
	var buttonElement = document.createElement('input');
	buttonElement.setAttribute("type","button");
	if ( indexEnabled.toLowerCase() != 'yes') {	buttonElement.setAttribute("disabled","true"); }
	buttonElement.className="advancedItem_button";	
	buttonElement.setAttribute("name",name);
	buttonElement.setAttribute("id","id"+name);
	buttonElement.setAttribute("value",this.advancedMessages['indexButton']);
	// Get CatalogSearchIndex
	buttonElement.onclick= new Function( "getSearchIndex('"+searchFieldKey+"','"+idSearchTerm+"','','next',[],{},'"+languageKey+"','"+selectedDatabases+"') ");
	spanElement.appendChild(buttonElement);	
 	return spanElement;
}


/* Creates Button for displaying Index */
function createResetRegionButton( name, currentIndex ) {
	// Create RegionButton
	var indexPattern = '000';
	var formattedIndex = indexPattern.substring(0,indexPattern.length-currentIndex.toString().length)+currentIndex.toString();	
	name = name+formattedIndex;	
	var spanElement = document.createElement('span');	
	var buttonElement = document.createElement('input');
	buttonElement.setAttribute("type","button");
	buttonElement.className="advancedItem_button";	
	setStyle(buttonElement,"display:none;")
	buttonElement.setAttribute("name",name);
	buttonElement.id = "id"+name;
	buttonElement.setAttribute("value",this.advancedMessages['resetButton']);
	buttonElement.onclick= new Function( "resetRegions('"+formattedIndex+"');");
	spanElement.appendChild(buttonElement);	
 	return spanElement;
}


function resetRegions(formattedIndex) {
	idfieldType="idfieldType"+formattedIndex;
	idresetRegion = "idresetRegion"+formattedIndex;
	idsearchTerm = "idsearchTerm"+formattedIndex;
	document.getElementById(idfieldType).value="all";
	document.getElementById(idfieldType).style.display="inline";
	document.getElementById(idresetRegion).style.display="none";
	document.getElementById(idsearchTerm).value='';	
	document.getElementById(idSearchTerm).readOnly = false;
	//setStyle(document.getElementById(idSearchTerm),"background-color:#f9eed4;"); 	
	document.getElementById(idSearchTerm).style.backgroundColor="#f9eed4";
}


/* Creates Button for displaying Regions */
function createRegionButton( name, currentIndex, searchType ) {
	// Check if CatalogSearchIndex is enabled
	var regionEnabled = 'no';
	var searchFieldData = getSearchFieldDataFromArray(currentIndex, searchType);
	if ( searchFieldData ) { 
		if (searchFieldData['sfDataType'] == 'region') { regionEnabled='yes'; }
	}
	// Create RegionButton
	var indexPattern = '000';
	var formattedIndex = indexPattern.substring(0,indexPattern.length-currentIndex.toString().length)+currentIndex.toString();	
	name+=formattedIndex;	
	var spanElement = document.createElement('span');	
	var buttonElement = document.createElement('input');
	buttonElement.setAttribute("type","button");
	//if ( regionEnabled != 'yes') { buttonElement.setAttribute("disabled","true"); }
	if ( regionEnabled != 'yes') { setStyle(buttonElement,"display:none;"); }
	buttonElement.className="advancedItem_button";	
	buttonElement.setAttribute("name",name);
	buttonElement.setAttribute("id","id"+name);
	buttonElement.setAttribute("value",this.advancedMessages['regionButton']);
	buttonElement.onclick= new Function( "initRegions('"+formattedIndex+"');getRegions('idAnchorAutocomplete"+formattedIndex+"','"+formattedIndex+"',0,'','"+languageKey+"');");
	spanElement.appendChild(buttonElement);	
 	return spanElement;
}


// Initialisation of SearchTerm and SearchType if User selects Region
function initRegions(formattedIndex) {

	var idresetRegion = "idresetRegion"+formattedIndex;
	document.getElementById(idresetRegion).style.display="inline";

	var idfieldType="idfieldType"+formattedIndex;
	document.getElementById(idfieldType).style.display="none"; 

	var inputElem=document.getElementById("idsearchTerm"+formattedIndex);
	inputElem.value="";
	inputElem.readOnly = "true";
	setStyle(inputElem,"background-color:#C0C0C0;");

	inputElem=document.getElementById("idaddSearchTerm"+formattedIndex);
	inputElem.value="";
	document.getElementById(idfieldType).value="region";
}



/* Creates Button for delete searchTerm */
function createDeleteButton( name, currentIndex, searchType ) {	
	if (currentIndex > 0) {
		var indexPrevious = currentIndex-1;
		patternPrev = name+'000';		
		idPrevButton ='id'+patternPrev.substring(0,patternPrev.length-indexPrevious.toString().length)+indexPrevious.toString();
		document.getElementById(idPrevButton).style.display='none';			
	}
	// Create DeleteButton
	name+= '000';	
	name=name.substring(0,name.length-currentIndex.toString().length)+currentIndex.toString();		
		
	var spanElement = document.createElement('span');
	var buttonElement = document.createElement('input');
	buttonElement.setAttribute("type","button");
	if (currentIndex == 0) {
		setStyle(buttonElement,"display:none;");
	}
	buttonElement.className="advancedItem_button";	
	buttonElement.setAttribute("name",name);
	buttonElement.setAttribute("id","id"+name);
	buttonElement.setAttribute("value"," x ");
	// Get CatalogSearchIndex
	buttonElement.onclick= new Function( "deleteSearchItem('"+currentIndex+"','id"+name+"') ");
	spanElement.appendChild(buttonElement);	
 	return spanElement;
}



/* Creates Select for SearchFieldType */
function createFieldTypeSelect( name, currentIndex, searchType, selectedFieldType ) {
	var defaultArray = new Object();
	var searchFieldType = "";
	if ( searchType == 'general') { defaultArray=this.defaultValuesGeneral; } else { defaultArray=this.defaultValuesSpecific; }
	if ( selectedFieldType == '' ) { selectedFieldType = defaultArray['fieldType']; }	
	name+= '000';	
	name=name.substring(0,name.length-currentIndex.toString().length)+currentIndex.toString();		
	var selectElement = document.createElement('select');
	selectElement.name = 'mapAdvancedSearch[\''+name+'\']';			
	selectElement.id = 'id'+name;
	selectElement.className="advancedItem_fieldType";
	selectElement.setAttribute("style","width:100px;");	
	var fieldTypeList = new Array();	
	var searchFieldData = getSearchFieldDataFromArray(currentIndex, searchType);
	if ( searchFieldData ) { searchFieldType = searchFieldData['sfDataType']; }
	fieldTypeList = fieldTypeText;
	if ( searchFieldType == 'numeric') { fieldTypeList = fieldTypeRange;	}
	if ( searchFieldType == 'date') { fieldTypeList = fieldTypeDate;}
	if ( searchFieldType == 'region') { fieldTypeList = fieldTypeRegion; }
	for (var i=0; i < fieldTypeList.length; i++){
		var fieldData = fieldTypeList[i].split('|||')
		var optionElem = document.createElement('option')
		optionElem.value = fieldData[0];			
		optionElem.innerHTML = fieldData[1];		
		if (fieldData[0] == selectedFieldType) { optionElem.selected = 'selected'; }			
		selectElement.appendChild(optionElem);
	}
	if (selectedFieldType == 'region') { selectElement.value="region"; }	
	selectElement.onchange = new Function("setFieldAttributes( '"+currentIndex+"','"+searchType+"', this.value );");
	return selectElement;
}

/* Create Anchor-Element for Thesaurus-Autocomplete */
function createAnchorAutocomplete( currentIndex ) {
	var indexPattern = '000';
	var formattedIndex = indexPattern.substring(0,indexPattern.length-currentIndex.toString().length)+currentIndex.toString();
	var anchorElement = document.createElement("div");
	anchorElement.id="idAnchorAutocomplete"+formattedIndex;
	if (document.all) { // Browser=IE -> set positon to relative
		setStyle(anchorElement,"position:relative;");
	}
	else {
		setStyle(anchorElement,"position:absolute;");	
	}	
	return anchorElement;
}

/* Create LineFeed-Element */
function createLineFeedElement( currentIndex ) {
	var indexPattern = '000';
	var formattedIndex = indexPattern.substring(0,indexPattern.length-currentIndex.toString().length)+currentIndex.toString();
	var brElement = document.createElement("br");	
	brElement.id="idLineFeed"+formattedIndex;
	return brElement;
}

/* Handels event Thesaurus-AutoComplete of Inputfield */
function doEventAutocomplete(currentIndex, searchType, idSearchTerm, idAnchor, lgKey ) {
	searchFieldProps = getSearchFieldDataFromArray( currentIndex, searchType );
	fieldDataType = searchFieldProps['sfDataType'];
	if (fieldDataType != 'string') { return; }	// Enable Thesaurus only for dataType 'string'
	var currentWordObj = getCurrentTypedWord(idSearchTerm);
	if ( autocompleteActive ) { window.clearTimeout(autocompleteActive); }
	autocompleteActive = window.setTimeout('getListForAutoComplete(\'idUseThesaurus\',\''+idAnchor+'\',\''+idSearchTerm+'\',\''+currentWordObj['currentWord']+'\','+currentWordObj['idxStart']+','+currentWordObj['idxEnd']+',\''+lgKey+'\')',700 );
}

/* Creates Input-Box containing SerchTerm*/
function createInput( name, currentIndex, searchType, currentSearchTerm){	
	// By default set visibility of searchterm to 'visible' and visibility of addSearchTerm to 'hidden' 
	var inputDisplay = "inline";
	if ( name == 'addSearchTerm' ) { inputDisplay="none" } 
	// Create indexed name and id
	var indexPattern = '000';
	var formattedIndex = indexPattern.substring(0,indexPattern.length-currentIndex.toString().length)+currentIndex.toString();
	name += formattedIndex;
	// Get dataType
	var inputFieldDataType="";
	var inputFieldData = getSearchFieldDataFromArray(currentIndex, searchType);
	if ( inputFieldData ) { inputFieldDataType = trim(inputFieldData['sfDataType']); }
	// Create Input Element
	var inputElement = document.createElement('input');	
	inputElement.className="advancedItem_searchTerm";
	inputElement.name = 'mapAdvancedSearch[\''+name+'\']';
	inputElement.id = 'id'+name;
	inputElement.value = currentSearchTerm;	
	if (inputFieldDataType=="numeric") { width="50px;"} else (width="150px;")
	setStyle(inputElement,"display:"+inputDisplay+";width:"+width+";");
	inputElement.setAttribute('autocomplete', 'off');
	
	inputElement.onkeydown = checkOnAutoSubmit;

	inputElement.onkeyup = new Function("doEventAutocomplete("+formattedIndex+",'"+searchType+"','id"+name+"','idAnchorAutocomplete"+formattedIndex+"','"+this.languageKey+"')");
	return inputElement;
}


/* Displays the unit of searchfield */
function createSearchTermUnit(name, currentIndex, searchType) {
	var searchfieldUnit = "";
	var indexPattern = '000';
	var formattedIndex = indexPattern.substring(0,indexPattern.length-currentIndex.toString().length)+currentIndex.toString();
	var searchFieldData = getSearchFieldDataFromArray(currentIndex, searchType);
	if ( searchFieldData ) { searchfieldUnit = trim(searchFieldData['sfUnit']); }
	if (searchfieldUnit != '' ) {searchfieldUnit = " "+searchfieldUnit; }
	var unitDisplay = "inline";
	if ( name == 'addSearchTermUnit' ) { unitDisplay="none" } 	
	var spanElement = document.createElement('span');	
	spanElement.className="advancedItem_searchTermUnit";
	spanElement.id="id"+name+formattedIndex;
	setStyle(spanElement,"display:"+unitDisplay+";");
	var textElement = document.createTextNode(searchfieldUnit);
	spanElement.appendChild(textElement);	
	return spanElement;
}


/* Creates Select-Box for CommonFields */
function createSelect( name, currentIndex, searchType, selectedField ){
	var defaultArray = new Object();
	var fieldArray = new Array();
	if ( searchType == 'general') { 
		defaultArray = this.defaultValuesGeneral; 
		fieldArray = this.fieldListGeneral;
	} 
	else { 
		defaultArray=this.defaultValuesSpecific; 
		fieldArray = this.fieldListSpecific;
	}
	if ( selectedField == '' ) { selectedField = defaultArray['field']; }	
	name+= '000';	
	name=name.substring(0,name.length-currentIndex.toString().length)+currentIndex.toString();	
	var selectElement = document.createElement('select');
	selectElement.id = 'id'+name;
  	selectElement.name = 'mapAdvancedSearch[\''+name+'\'];';
	selectElement.setAttribute("style","width:150px;");	
	selectElement.className="advancedItem_searchFields";		
	for (var i=0; i < fieldArray.length; i++){
		var fieldData = fieldArray[i].split('|||')
		var optionElem = document.createElement('option')
		optionElem.value = fieldData[0];
		optionElem.innerHTML = fieldData[1];
		if ( fieldData[0] == selectedField ) {optionElem.selected = 'selected'}
		selectElement.appendChild(optionElem)
	}		
	return selectElement;
}



/* Deletes SearchItem with index 'currentIndex' */
function deleteSearchItem(currentIndex, idDeleteButton) {
	
	var indexPattern = '000';
	var formattedIndex = indexPattern.substring(0,indexPattern.length-currentIndex.toString().length)+currentIndex.toString();
	
	var indexPrev = currentIndex-1;
	var formattedIndexPrev = indexPattern.substring(0,indexPattern.length-indexPrev.toString().length)+indexPrev.toString();
	
	if (indexPrev > 0) {
		var deleteButtonPrev = document.getElementById('iddeleteButton'+formattedIndexPrev);
		setStyle(deleteButtonPrev,"display:inline;");
	}
	
	var indexedAnchorElement = "idanchorSearchItem"+formattedIndex;
	var currentAnchorElement = document.getElementById(indexedAnchorElement);
	currentAnchorElement.parentNode.removeChild(currentAnchorElement);
	var field = document.getElementById('idfield'+formattedIndex);
	field.parentNode.removeChild(field);
	var searchType = document.getElementById('idsearchType'+formattedIndex);
	searchType.parentNode.removeChild(searchType);
	var boolOp = document.getElementById('idboolOp'+formattedIndex);   
	boolOp.parentNode.removeChild(boolOp);
	var lineFeed = document.getElementById('idLineFeed'+formattedIndex);   
	lineFeed.parentNode.removeChild(lineFeed);
	var autocompl = document.getElementById('idAnchorAutocomplete'+formattedIndex);   
	autocompl.parentNode.removeChild(autocompl);

	document.getElementById('idLastItemIndex').value=indexPrev; // Decrease idLastItemIndex 
	
	if ( document.getElementById('idClauseLinkGeneral') ) {
		if ( checkOnContUpdate('idContUpdate') == true ) {
			document.getElementById('idClauseLinkGeneral').href = 'javascript:addSearchClause(' + currentIndex + ',\'general\');document.formCatalogSearch.submit();';
			document.getElementById('idClauseLinkSpecific').href = 'javascript:addSearchClause(' + currentIndex + ',\'specific\');document.formCatalogSearch.submit();';
		}
		else {
			document.getElementById('idClauseLinkGeneral').href = 'javascript:addSearchClause(' + currentIndex + ',\'general\');';
			document.getElementById('idClauseLinkSpecific').href = 'javascript:addSearchClause(' + currentIndex + ',\'specific\');';		
		}
	}		
	if ( checkOnContUpdate('idContUpdate') == true ) {
		document.formCatalogSearch.submit();
	}	
}



/* Returns value of searchfield corresponding to searchField with id 'currentIndex'*/
function getSearchFieldDataFromArray( currentIndex, searchType ) {
	var fieldArray = new Array();
	var searchFieldData = new Object();
	if ( searchType == 'general') { fieldArray=this.fieldListGeneral; } else { fieldArray=this.fieldListSpecific; }
	var correspSearchFieldId = 'idfield000';
	correspSearchFieldId = correspSearchFieldId.substring(0,correspSearchFieldId.length-currentIndex.toString().length)+currentIndex.toString();
	var correspSearchFieldValue = document.getElementById(correspSearchFieldId).value;
	for (var i=0; i< fieldArray.length; i++) {
		var fieldData = fieldArray[i].split('|||');
		if (fieldData[0] == correspSearchFieldValue && fieldData.length == 5) { 
			//return fieldData[2];
			searchFieldData['sfKey'] = fieldData[0];
			searchFieldData['sfDescription'] = fieldData[1];
			searchFieldData['sfDataType'] = fieldData[2];
			searchFieldData['sfIndexEnabled'] = fieldData[3];	
			searchFieldData['sfUnit'] = fieldData[4];			
			return searchFieldData; 
		}
	}
	return null;
}



/* Updates the Select 'FieldType' and 'IndexButton' if User changes searchField*/
function updateSearchClause( nameFieldType, nameIndexButton, currentIndex, searchType ) {
	var indexPattern = '000';
	var formattedIndex = indexPattern.substring(0,indexPattern.length-currentIndex.toString().length)+currentIndex.toString();

	// Store reference to deleteButton if not null
	deleteButtonElement = 'iddeleteButton'+formattedIndex;	
	var currentDeleteButtonElement = null;
	if (document.getElementById(deleteButtonElement) != null ) {
		currentDeleteButtonElement = document.getElementById(deleteButtonElement);
	}
	
	// Anchor - Delete all Childs and include updated fields
	var indexedAnchorElement = "idanchorSearchItem"+formattedIndex;
	var currentAnchorElement = document.getElementById(indexedAnchorElement);
	if ( currentAnchorElement.hasChildNodes() ) {
	    while ( currentAnchorElement.childNodes.length >= 1 ) {
	        currentAnchorElement.removeChild( currentAnchorElement.firstChild );       
	    } 
	}

	currentAnchorElement.appendChild(createSpacer(10));
	// Update SearchTerm	
	var newSearchTermElement = createInput('searchTerm', currentIndex, searchType, this.selectedValues['searchTerm']);
	currentAnchorElement.appendChild(newSearchTermElement);
	// Update Unit of SearchTerm
	var newSearchTermUnit = createSearchTermUnit('searchTermUnit', currentIndex, searchType);
	currentAnchorElement.appendChild(newSearchTermUnit);	
	// Update Region Reset-Button
	var newResetButton = createResetRegionButton('resetRegion', currentIndex);
	currentAnchorElement.appendChild(newResetButton);	
	currentAnchorElement.appendChild(createSpacer(5)); // Spacer
	/* Create indexed hyphen*/
	var newTextElement = createIndexedTextNode("hyphen",currentIndex,"-  ");
	currentAnchorElement.appendChild(newTextElement);		
	// Update Additional SearchTerm	
	var newSearchTermElement = createInput('addSearchTerm', currentIndex, searchType, this.selectedValues['addSearchTerm']);
	currentAnchorElement.appendChild(newSearchTermElement);	
	// Update Unit of AddSearchTerm
	var newAddSearchTermUnit = createSearchTermUnit('addSearchTermUnit', currentIndex, searchType);
	currentAnchorElement.appendChild(newAddSearchTermUnit);
	currentAnchorElement.appendChild(createIndexedSpacer("spacerAddTerm",currentIndex,10)); // Indexed Spacer	
	// Update Select 'fieldType'	
	var newFieldTypeElement = createFieldTypeSelect(nameFieldType, currentIndex, searchType, '');
	currentAnchorElement.appendChild(newFieldTypeElement);
	currentAnchorElement.appendChild(createSpacer(10)); // Spacer	
	// Update IndexButton
	var newButtonElement = createIndexButton('indexButton', currentIndex, searchType);
	currentAnchorElement.appendChild(newButtonElement);
	currentAnchorElement.appendChild(createSpacer(10)); // Spacer	
	// Update RegionButton
	var newButtonElement = createRegionButton('regionButton', currentIndex, searchType);
	currentAnchorElement.appendChild(newButtonElement);
	currentAnchorElement.appendChild(createSpacer(10)); // Spacer	
	// Update DeleteButton
	if (currentDeleteButtonElement != null) {	
		currentAnchorElement.appendChild(currentDeleteButtonElement);
	}
	
	// Update Attributes of SearchItem-Elements
	var idFieldType="id"+nameFieldType+formattedIndex;
	var fieldType = document.getElementById(idFieldType).value	
	setFieldAttributes( currentIndex, searchType, fieldType );
}




/* #################################################################################### */

/* Returns true if at least one searchterm is present, false otherwise */
function isPresentAdvancedSearchTerm() {
	var searchTermPresent = false;
	if ( !document.getElementById ) { return false; }
	var lastItemIndex = Number(document.getElementById('idLastItemIndex').value);
	if (isNaN(Number(lastItemIndex)) ) { return false; }
	searchTermIdPattern = 'idsearchTerm000';	 
	for ( var i=0; i<=lastItemIndex; i++) {
		var currentSearchTermId = searchTermIdPattern.substring(0,searchTermIdPattern.length-i.toString().length)+i.toString();
		var currentTermValue = document.getElementById(currentSearchTermId).value;
		if (trim(currentTermValue) != '') {
			searchTermPresent = true; 	
		} 		
	}
	return searchTermPresent;
}


/* Checks if at least one searchTerm is empty and connected with AND */
function checkOnEmptySearchTermWarning(contUpdate) {
	var searchTermEmpty = false;
	if ( !document.getElementById ) { return false; }
	var lastItemIndex = Number(document.getElementById('idLastItemIndex').value);
	if (isNaN(Number(lastItemIndex)) ) { return false; } 
	if ( contUpdate == true && lastItemIndex > 0) { lastItemIndex--; }
	var searchTermIdPattern = 'idsearchTerm000';
	var boolOpPattern = 'boolOp000';	
	for ( var i=0; i<=lastItemIndex; i++) {
		var currentSearchTermId = searchTermIdPattern.substring(0,searchTermIdPattern.length-i.toString().length)+i.toString();
		var currentTermValue = document.getElementById(currentSearchTermId).value;
		var currentBoolOp = boolOpPattern.substring(0,boolOpPattern.length-i.toString().length)+i.toString();
		var currentBoolOpName = "mapAdvancedSearch[\'"+currentBoolOp+"\']";
		if (i>0) {
			var currentBoolOpGroup = document.getElementsByName(currentBoolOpName);
			var currentBoolOpValue	= this.getSelectedRadioValue(currentBoolOpGroup);
		}
		if (trim(currentTermValue) == '' && trim(currentBoolOpValue) == 'and') {
			searchTermEmpty = true; 	
			var searchTermElement = document.getElementById(currentSearchTermId);
			setStyle(searchTermElement,"background-color: #FF0000;");									
		} 
	}	
	if (searchTermEmpty) { 
		alert(this.advancedMessages['warnigEmptyTerm']); 
	}
	return searchTermEmpty;
}


// returns the value of the selected radio button or "" if no button is selected
function getSelectedRadioValue(buttonGroup) {
   var i = getSelectedRadio(buttonGroup);
   if (i == -1) {
      return "";
   } else {
      if (buttonGroup[i]) { // Make sure the button group is an array (not just one button)
         return buttonGroup[i].value;
      } else { // The button group is just the one button, and it is checked
         return buttonGroup.value;
      }
   }
} 

// returns the array number of the selected radio button or -1 if no button is selected
function getSelectedRadio(buttonGroup) {
   if (buttonGroup[0]) { // if the button group is an array (one button is not an array)
      for (var i=0; i<buttonGroup.length; i++) {
         if (buttonGroup[i].checked) {
            return i
         }
      }
   } else {
      if (buttonGroup.checked) { return 0; } // if the one button is checked, return zero
   }
   return -1;
}

