/*
 * <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.
 *
 */
 

	// ####### Globals #######
	var autocompleteActive = false;
	var gotNumberOfResults = new Array();	// holds the 'recieved data'-states of the checked remote databases


	// ####### DWR - Methods ######
	// Sets gotNumberOfRecords - Status of a single Database
	// Possible values: 'yes' or 'no'
	function setStatusGotNumberOfResults(dbKey,value) {
		this.gotNumberOfResults[dbKey] = value;
	}


	// Check if numberOfResult recieved from all checked Databases and returns true on success
	function checkGotAllNumberOfResults( mapDbInfo ){
		var finished=false;	
 
 		for ( dbKey in mapDbInfo) { 
 			if (mapDbInfo[dbKey] == 'yes') {
 				if ( this.gotNumberOfResults[dbKey] == 'yes' ) {
 					finished=true;
 				}
 				else {
 					finished=false;
 					break;
 				}
 			} 		
 		}
 		return finished;
	}		


	// Calls Function 'doGetNumberOfResults' to get the Number of Results from all remote Databases 
	function getNumberOfResults(resultPresentation, mapBaseQueries, mapDbInfo, idSortCriteria1, idSortCriteria2, idHitsPerPage, idLimitationHits, languageKey) {
		for (currentDbKey in mapDbInfo) { setStatusGotNumberOfResults(currentDbKey,"no"); } // Init Array gotNumberOfRecords
		for (currentDbKey in mapDbInfo) {
			doGetNumberOfResults( resultPresentation, mapBaseQueries, currentDbKey, mapDbInfo, idSortCriteria1, idSortCriteria2, idHitsPerPage, idLimitationHits, languageKey )
		}	
	}
	
	
	// Gets the Number of Results from a single remote Database if selected 
	// Sets the Number of Results and Connection-Status Messages
	function doGetNumberOfResults( resultPresentation, mapBaseQueries, currentDbKey, mapDbInfo, idSortCriteria1, idSortCriteria2, idHitsPerPage, idLimitationHits, languageKey  ) {			
	
		if ( !document.getElementById ) { return; }		 
		var dbSelected = mapDbInfo[currentDbKey];
	 	 
	 	searchBaseQuery = '';	
	 	for (key in mapBaseQueries) {
	 		if (trim(mapBaseQueries[key]) != '' ) {searchBaseQuery = 'not empty'; }
	 	}
	 	
	 	
	 	var limitationHits = document.getElementById(idLimitationHits);
	 	if (dbSelected == 'yes') { 	 			
	 		//DWRUtil.useLoadingMessage('Connecting...');	 		
	 		useLoadingImage("resources/appl_images/loadingImage24x24.gif","idCatalogResultListPosition"); // CHECK THIS
	 		CatalogSearch.getNumberOfResults( mapBaseQueries, currentDbKey, languageKey, { 
	 			callback:function(numberOfHits) {
		 			if (numberOfHits >=0) {
	    				/* Set NumberOfHits for current Database */
	    				dwr.util.setValue('idSpanDBConnected'+currentDbKey, numberOfHits);
	    				/* Update Number of Total Hits */
	    				var currentTotalHits = parseInt(dwr.util.getValue('idTotalHits'));
	    				if (isNaN(Number(currentTotalHits)) ) { currentTotalHits = 0; } 
	    				currentTotalHits += numberOfHits;
	    				dwr.util.setValue('idTotalHits',currentTotalHits);    				    				
	    				// Enable 'Show Result'-Button if TotalHits goes below Limitation of hits */
	    				if ((currentTotalHits <= parseInt(limitationHits) || limitationHits=='ALL'  ) && currentTotalHits > 0 && !checkOnContUpdate('idContUpdate') ) 
	    					document.getElementById('idshowresults').disabled=false; 
	    				else
	    					 document.getElementById('idshowresults').disabled=true;
	    				/* Update Percentage for each selected Database */
	    				for ( db in mapDbInfo ) {
	    					var currPercentage = 0;
	                    	var currKeyPercentage = "idSpanPercentage"+db;
	                    	var currHits = dwr.util.getValue('idSpanDBConnected'+db); 
	                    	if (isNaN(Number(currHits)) ) { 
	                    		currPercentage = 0; 
	                    	}
	                    	else {       
	                    	    if (currentTotalHits == 0 ) {
	                    	    	currPercentage = 0;
	                    	    }   
	                    	    else {     	                 	                    	
	                     			currPercentage = (100/currentTotalHits)*currHits;
	                    			currPercentage = (Math.round(currPercentage * 10)) / 10;
	                    			/*currPercentage = (Math.round(currPercentage));*/ 
	                    		}
	                    	}                     	                       	             	                 	
	                      	dwr.util.setValue(currKeyPercentage,currPercentage+'%');
	                    }// End For
	    			}
					else {
						document.getElementById('idSpanDBNotConnected'+currentDbKey).style.display='inline';
						document.getElementById('idSpanDBConnected'+currentDbKey).style.display='none';	
						document.getElementById('idSpanPercentage'+currentDbKey).style.display='none';						
					}
					
					// If Callback-Function from current Database has finished set Status of 'gotNumberOfResults' to 'yes'
					setStatusGotNumberOfResults(currentDbKey,"yes");
									
					// If all NumberOfRecords recieved from remote Databases check on number, limitation
					// and selected Cont. Update and display Resultlist/Statistics/Map
					if ( checkGotAllNumberOfResults( mapDbInfo ) ) { 
						if (resultPresentation == 'list' || resultPresentation == 'statistics' || resultPresentation == 'map') { 
							var statusDisabled = setAttributeDisabledShowResultButton('idshowresults', 'idContUpdate', 'idTotalHits', idLimitationHits, searchBaseQuery );
							if ( resultPresentation == 'list' && checkOnContUpdate('idContUpdate') == true && !checkHitsGreaterLimitation( 'idTotalHits', idLimitationHits ) && getTotalHits('idTotalHits')>0 && searchBaseQuery != '') {
								initCatalogResultList( mapBaseQueries , idSortCriteria1, idSortCriteria2, idHitsPerPage, languageKey, mapDbInfo);
							}
							if ( resultPresentation == 'statistics' && checkOnContUpdate('idContUpdate') == true && !checkHitsGreaterLimitation( 'idTotalHits', idLimitationHits ) && getTotalHits('idTotalHits')>0 && searchBaseQuery!='') {
								initStatisticsSummary( mapBaseQueries , "motif,placeOfUse,depository,date,height,distanceCl",languageKey, mapDbInfo);
							}
							if ( resultPresentation == 'map' && checkOnContUpdate('idContUpdate') == true && !checkHitsGreaterLimitation( 'idTotalHits', idLimitationHits ) && getTotalHits('idTotalHits')>0 && searchBaseQuery!='') {
								initGeoMap( mapBaseQueries, languageKey, mapDbInfo);
							}
							
							// Show Text in ResultList-DIV if hits greater than limitation
							if (document.getElementById("idMessageHitsGreaterLimit")!= null) {
								if ( checkHitsGreaterLimitation( 'idTotalHits', idLimitationHits ) ) {
									document.getElementById("idMessageHitsGreaterLimit").style.display = "inline";
								}
								else {
									document.getElementById("idMessageHitsGreaterLimit").style.display = "none";
								}
							}							
						}
						// If no searchItem supress Message HitsGreaterLimit
						if (searchBaseQuery == '') {
							if (document.getElementById("idMessageHitsGreaterLimit")!= null) {
								document.getElementById("idMessageHitsGreaterLimit").style.display = "none";
							}
						}
					} 
	  		}, errorHandler:function(message) { errorHandlerCatalogSearch(currentDbKey); }, timeout:0 });	// END Callback Function	
	  		  		
  		} // End if Database selected
  		else {
  			document.getElementById('idSpanDBNotConnected'+currentDbKey).style.display='none';
			document.getElementById('idSpanDBConnected'+currentDbKey).style.display='none';	
			document.getElementById('idSpanPercentage'+currentDbKey).style.display='none';															  	
  		}  
 	}
 	
 // Error Handling
function errorHandlerCatalogSearch(currentDbKey) {
	alert ('Connection Timeout (Database: '+currentDbKey+')');						
	setCheckedContUpdate('idContUpdate', 'false'); // Uncheck Cont. Update in Case of Connection Timeout
	document.getElementById('idCheckBoxSelectDB'+currentDbKey).checked = false;
	document.getElementById('idSpanDBNotConnected'+currentDbKey).style.display='inline';
	document.getElementById('idSpanDBConnected'+currentDbKey).style.display='none';	
	document.getElementById('idSpanPercentage'+currentDbKey).style.display='none';	
	document.formCatalogSearch.submit(); // Submit Formular	
}	
 
 
 // ########################### AutoComplete ###########################################
 	
function getListForAutoComplete( idUseThesaurus, idAnchor, idInputField, searchTerm, idxStart, idxEnd, currentLanguage) {
	if ( !document.getElementById || !document.createElement ) { return; }	
	if ( !document.getElementById(idUseThesaurus).checked ) { return;}
	// Clear Selectbox for Autocomplete if exists	
	if ( document.getElementById( idAnchor ) != null) {
		removeAllChildNodes(idAnchor);
	}	
	// Get List from database if seacrchText consists of at least 2 Characters 
	searchTerm = trim(searchTerm);
	if (searchTerm.length >1) {
		useLoadingImageSmall("resources/appl_images/loading_image43x11.gif",idAnchor);
		CatalogSearch.getListForAutoComplete( searchTerm, currentLanguage, 
			{ 	callback:function(AutoCompleteDO){ createSelectAutoComplete(AutoCompleteDO, idAnchor, idInputField, searchTerm, idxStart, idxEnd,currentLanguage);}, 
				errorHandler:function(message) { errorHandlerAutocomplete(); },
				timeout:0
			}		
		 );		
	} 	
}	
 	

// Creates selectbox for thesaurus-autocomplete 	
function createSelectAutoComplete(AutoCompleteDO, idAnchor, idInputField, searchTerm, idxStart, idxEnd,currentLanguage) {
	var tableElement, tbodyElement, trElement, tdElement, textElement, aElement, buttonElement;
	var autocompleteObject = AutoCompleteDO;
	var entries = autocompleteObject.entries;
	var numberOfEntries = entries.length;
	var selectBoxSize = numberOfEntries;
	var messages = autocompleteObject.lgKeys;		
	
	// Clear selectbox for autocomplete if exists
	if (!document.getElementById) { return; }
	if ( document.getElementById( idAnchor ) != null) {
		removeAllChildNodes(idAnchor);
	}
	// Create Table including selection if numberOfEntries>0
	if (numberOfEntries > 0 ) {
		tableElem = document.createElement("table");
		tableElem.className="autocomplete";
		tbodyElem = document.createElement("tbody");
		// First Row (Header)
		trElem = document.createElement("tr");			
		tdElem = document.createElement("td");
		tdElem.className="autocomplete_topLeft";
		textElem = document.createTextNode(messages['thesaurus.thesaurus']);
		tdElem.appendChild(textElem);
		trElem.appendChild(tdElem);				
		tdElem = document.createElement("td");	
		tdElem.className="autocomplete_topRight";
		//textElem = document.createTextNode(messages['thesaurus.close']);
		buttonElement = document.createElement("input");	
		buttonElement.setAttribute("type","button");	
		buttonElement.setAttribute("value","X");
		buttonElement.className = "autocomplete_topRight";
		buttonElement.onclick = new Function("javascript:removeAllChildNodes('"+idAnchor+"');document.getElementById('"+idInputField+"').focus();");
		tdElem.appendChild(buttonElement);
		trElem.appendChild(tdElem);	
		tbodyElem.appendChild(trElem);
		// Second Row (SelectBox)
		trElem = document.createElement("tr");		
		tdElem = document.createElement("td");
		tdElem.colSpan="2";	
		tdElem.className="autocomplete_select";			
		var selectElem = document.createElement('select');
	  	selectElem.name = 'selectAutocomplete';
	  	if (numberOfEntries>10) { selectBoxSize = 10; }
	  	if (numberOfEntries<2) { selectBoxSize = 2; }	  	
	  	selectElem.size=selectBoxSize;
	  	selectElem.className="autocomplete_select";	  	
	  	selectElem.ondblclick= new Function ("setThesaurusText(this.value,'"+idAnchor+"', '"+idInputField+"', "+idxStart+", "+idxEnd+");");	  	
	  	for (var i=0; i < numberOfEntries; i++){
			var optionElem = document.createElement('option');	
			var entryText =	entries[i].text;	
			optionElem.value = entryText;			
			optionElem.innerHTML = "<b>"+entryText.substring(0,searchTerm.length)+"</b>"+entryText.substr(searchTerm.length);
			selectElem.appendChild(optionElem);
		}		
		tdElem.appendChild(selectElem);
		trElem.appendChild(tdElem);
		tbodyElem.appendChild(trElem);
		// Third row (Message doubleclick)
		trElem = document.createElement("tr");	
		tdElem = document.createElement("td");
		tdElem.colSpan="2";
		tdElem.className="autocomplete_bottom";
		textElem = document.createTextNode(messages['thesaurus.dblclick']);							
		tdElem.appendChild(textElem);
		trElem.appendChild(tdElem);
		tbodyElem.appendChild(trElem);
		tableElem.appendChild(tbodyElem);	
		// Append table to Anchor
	  	document.getElementById( idAnchor ).appendChild(tableElem);
	}
}

// Replaces typed text in inputfield with entry from thesaurus-list
function setThesaurusText(textToReplace, idAnchor, idInputField, idxStart, idxEnd) {
	var searchItems = document.getElementById(idInputField).value;
	var replacedSearchItems = searchItems.substr(0,idxStart)+textToReplace+searchItems.substr(idxEnd,searchItems.length);
	document.getElementById(idInputField).value=replacedSearchItems;
	if ( document.getElementById( idAnchor ) != null) {
		removeAllChildNodes(idAnchor);
	}
} 	
 	
 	
 // Error Handling AutoComplete
function errorHandlerAutocomplete() {
	if ( document.getElementById( idAnchor ) != null) {
		removeAllChildNodes(idAnchor);
	}
	return;
}	


 	
 // ############################## TEST AREA ###########################################	
 	var activ=0;
 	
 	function getRecordsTimer() { 
 	if (activ) { clearTimeout(activ); }
 	activ =setTimeout("getRecords()", 1500);
 	}
// END TEST AREA 	
 
	