new XmSearchEngine;

function XmSearchEngine() {

	var searchLang; 

	$(document).ready(function() {
		init();
	});

	function init() {
	        searchLang = $('#searchform input[name=lang]').val();
		if (searchLang == null || searchLang == "") {
			searchLang = "de";
		} else if ( searchLang == "ger" ) {
			searchLang = "de";
		} else if ( searchLang == "eng") {
			searchLang = "en";
		}
		
		$("#searchform").submit(function() {
			submitSearchForm();
			return false;
		});
		
		$("input#schlagworte").autocomplete({
			delay: 1000,
			minLength: 3,
		    	search: function(event, ui) { 
				submitSearchForm();	
				return false; 
			}
		});
		
		$('#searchResultContainer').click(function(event) {
			event.stopPropagation();
		});
		
		$('body').click(function() {
			$("#searchResultContainer").fadeOut();
		});
		
		$(document).ajaxStart(function (){
			$('#ajaxBusy').show();
		});
		
		$(document).ajaxStop(function (){
			$('#ajaxBusy').hide();
			checkResultsExist();
		});
	}
	
	function checkResultsExist() {
		var results = false;
		
		$('div.resultPanel').each(function(index){
			if (this.id != "latestQueriesResultPanel" && this.id != "commonQueriesResultPanel" ) {
				if ($(this).text() != null && $(this).text() != "") {
					results = true;
				}
		 	}
		});
		
		if (!results) {
			$('#fulltextResultPanel').html('Es gibt leider keine Treffer zu Ihrer Suche.');
		}
	}
	
	function submitSearchForm() {
		var query = encodeURI($("#schlagworte").val());
		if (query == "") {
			alert('Bitte geben Sie einen Suchbegriff ein.');
			return false;
		} else if (query.length < 3) {
			alert('Bitte geben Sie einen Suchbegriff ein, der mindestens drei Buchstaben enthält.');
			return false;
		}
				
		// Clean results
		$('#dlResultPanel').html('');
		$('#siteResultPanel').html('');
		$('#latestQueriesResultPanel').html('');
		$('#commonQueriesResultPanel').html('');
		$('#fulltextResultPanel').html('');
		$('#fulltextTueResultPanel').html('');
		$('#fulltextTCResultPanel').html('');
		
		// Show result panel
		/*var offset = $("#search").offset();
		$("#searchResultContainer").css({
			'left' : offset.left - $('#searchResultContainer').width() + $('#schlagworte').width() -173,
			'top' : offset.top + $('#search').height() - 15
		});*/
		$("#searchResultContainer").fadeIn();
		
		if (searchLang == "de") {
			// Search DLs
			$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});
			$.getJSON("/search.xm?action=findServices&schlagworte=" + query, function(data){
				 handleDlSearchResults(data);
			});
		}
		
		if (searchLang == "de") {
			// Search sites
			if (query.length > 4) {
				$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});
				$.getJSON("/search.xm?action=findSites&schlagworte=" + query, function(data){
					 handleSiteSearchResults(data);
				});
			}
		}
		
		// Search full text
		$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});
		$.getJSON("/xms/search.json?lang=" + searchLang + "&fuzzy=false&startIndex=0&batchSize=25&collection=tuev-hessen-web&q=" + 
				query , function(data){
			 handleFulltextSearchResults(data);
		});
		
		
		// Search full text TUE Hessen
		$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});
		$.getJSON("/xms/search.json?lang=" + searchLang + "&fuzzy=false&startIndex=0&batchSize=10&collection=tue-hessen&q=" + 
				query , function(data){
		 	handleFulltextTueSearchResults(data);
		});
		
		// Search full text TC
		$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});
		$.getJSON("/xms/search.json?lang=de&fuzzy=false&startIndex=0&batchSize=4&collection=tuev-club&q=" + 
				query , function(data){
		 	handleFulltextTCSearchResults(data);
		});
		
		
		// Get latest queries
		var now = new Date();
		$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});
		$.getJSON('/search.xm?action=getLatestQueries&schlagworte=' + query + '&ts='+ now.getTime(), function(data){
			 handleLatestQueriesResults(data);
		});

		if (searchLang == "de") {
			// Get common queries
			$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});
			$.getJSON('/search.xm?action=getCommonQueries&schlagworte=' + query, function(data){
				 handleCommonQueriesResults(data);
			});
		}
	}
	
	// Services / Dienstleistungen
	function handleDlSearchResults(data) {	
		if (data == null || data.length == null || data.length == 0)
			return;
				
		// Add label and hit panel
		$('#dlResultPanel').html('');
		$('<div id="dlResultLabel" class="resultLabel">Dienstleistungen</div>').appendTo('#dlResultPanel');
		$('<div id="dlResultHitPanel" class="resultHitPanel"></div>').appendTo('#dlResultPanel');
				
		var targetEl = '#dlResultHitPanel';
		for (var i=0; i<data.length; i++) {
			var hit = data[i];
		
			// If more hits than 10, push them to a hidden div
			if (i == 9) {
				$('<div id="dlMoreResultHitLabel" class="moreResultHitLabel"><a href="#" id="dlAdditionalResultHitPanelTrigger">Alle Treffer zeigen</a></div>').appendTo('#dlResultHitPanel');
				$('<div id="dlAdditionalResultHitPanel" class="additionalResultHitPanel"></div>').appendTo('#dlResultHitPanel');
				$('#dlAdditionalResultHitPanelTrigger').click(function(event) {
					event.stopPropagation();
					$("#dlAdditionalResultHitPanel").show();
					$("#dlMoreResultHitLabel").hide();
					return false;
				});
				targetEl = '#dlAdditionalResultHitPanel';
			}
					
			var hitPanel = '<div class="resultHit clerasil">\n';
			hitPanel+= '<div class="resultHitLabel resultHitDescriptionTrigger" name="' + hit.dnr +    '">';
			hitPanel+= '<a id="resultHitTitle' + hit.dnr + '" class="resultHitTitle" href="/eindeutig.tuv?dnr=' + hit.dnr + '" name="' + hit.dnr +    '">' + hit.title + '</a> ';
			hitPanel+= '<div id="resultHitDescription' + hit.dnr + '" class="resultHitDescription">' + hit.description + '</div>';
			hitPanel+= '</div>\n';
			hitPanel+= "</div>\n";
			$(hitPanel).appendTo(targetEl);
			
			
		}
	
		var hoverConfig = {    
		     over: function(event) {
                        var elId = $(this).attr("name");
                        $("#resultHitDescription" + elId).slideToggle(700);
			$("#resultHitTitle" + elId).addClass("hover");
                	},     
		     timeout: 300, // number = milliseconds delay before onMouseOut    
		     out : function(event) {
                        var elId = $(this).attr("name");
                        $("#resultHitDescription" + elId).slideToggle(700);
			$("#resultHitTitle" + elId).removeClass("hover");
                	},
		     interval : 400    
		};
	
		$('.resultHitDescriptionTrigger').hoverIntent(hoverConfig);
	}
	
	// Sites / Standorte
	function handleSiteSearchResults(data) {		
		if (data == null || data.length == null || data.length == 0)
			return;
		
		// Add label and hit panel
		$('#siteResultPanel').html('');
		$('<div id="siteResultLabel" class="resultLabel">Standorte</div>').appendTo('#siteResultPanel');
		$('<div id="siteResultHitPanel" class="resultHitPanel"></div>').appendTo('#siteResultPanel');
				
		for (var i=0; i<data.length; i++) {
			var hit = data[i];
			var hitPanel = '<div class="resultHit clerasil">\n';
			hitPanel+= '<div class="resultHitImage"><img src="../..' + hit.gebaeudebild + '"/></div>\n';
			hitPanel+= '<div class="resultHitLabel"><a href="/standortPage.tuv?standortID=' + hit.id + ((hit.zmsAnchor != null)?hit.zmsAnchor:"") + '">' + hit.unterueberschrift + '</a><br />';
			hitPanel+= hit.strasse + ', ';
			hitPanel+= hit.ort + '</div>\n';
			hitPanel+= "</div>\n";
			
			$(hitPanel).appendTo('#siteResultHitPanel');
		}
	}
	
	function handleLatestQueriesResults(data) {
		if (data == null || data.length == null || data.length == 0)
			return;
	
		// Add label and hit panel
		var langString = "Letzte Suchanfragen";
		if (searchLang == "en") {
			langString = "Latest queries";
		}
		$('#latestQueriesResultPanel').html('');
		$('<div id="latestQueriesResultLabel" class="resultLabel">' + langString + '</div>').appendTo('#latestQueriesResultPanel');
		$('<div id="latestQueriesResultHitPanel" class="resultHitPanel"></div>').appendTo('#latestQueriesResultPanel');
				
		var hitPanel = '<div class="resultHit clerasil">\n';
		hitPanel+= '<div class="resultHitLabel">' 
		for (var i=0; i<data.length; i++) {
			var hit = data[i];
			if (i>0) hitPanel+= '; ';
			hitPanel+= '<a class="latestQuery" href="#">' + hit.name + '</a>';
		}
		hitPanel+= '</div>\n';
		hitPanel+= "</div>\n";
		
		$(hitPanel).appendTo('#latestQueriesResultHitPanel');
		
		// Register event handler
		$('a.latestQuery').click(function() {
			$("#schlagworte").val($(this).html());
			submitSearchForm();	
		});
	}
	
	function handleCommonQueriesResults(data) {
		if (data == null || data.length == null || data.length == 0)
			return;
		
		// Add label and hit panel
		$('#commonQueriesResultPanel').html('');
		$('<div id="commonQueriesResultLabel" class="resultLabel">Meinten Sie</div>').appendTo('#commonQueriesResultPanel');
		$('<div id="commonQueriesResultHitPanel" class="resultHitPanel"></div>').appendTo('#commonQueriesResultPanel');
				
		var hitPanel = '<div class="resultHit clerasil">\n';
		hitPanel+= '<div class="resultHitLabel">' 
		for (var i=0; i<data.length; i++) {
			var hit = data[i];
			if (i>0) hitPanel+= '; ';
			hitPanel+= '<a class="commonQuery" href="#">' + hit.name + '</a>';
		}
		hitPanel+= '</div>\n';
		hitPanel+= "</div>\n";
		
		$(hitPanel).appendTo('#commonQueriesResultHitPanel');
		
		// Register event handler
		$('a.commonQuery').click(function() {
			$("#schlagworte").val($(this).html());
			submitSearchForm();	
		});
	}
	
	// Fulltext results
	function handleFulltextSearchResults(data) {		
		if (data == null || data.hits == null || data.hits.length == null || data.hits.length == 0)
			return;
		
		// Add label and hit panel
		var langString = "Volltext";
		var langSringMoreResults = "Weitere Treffer zeigen";
                if (searchLang == "en") {
                        langString = "Full text";
			langSringMoreResults = "Show more hits";
                }
		$('#fulltextResultPanel').html('');
		$('<div id="fulltextResultLabel" class="resultLabel">' + langString + '</div>').appendTo('#fulltextResultPanel');
		$('<div id="fulltextResultHitPanel" class="resultHitPanel"></div>').appendTo('#fulltextResultPanel');
				
		var targetEl = '#fulltextResultHitPanel';
		for (var i=0; i<data.hits.length; i++) {
			var hit = data.hits[i];
			
			// If more hits than 10, push them to a hidden div
			if (i == 9) {
				$('<div id="ftMoreResultHitLabel" class="moreResultHitLabel"><a href="#" id="ftAdditionalResultHitPanelTrigger">' + langSringMoreResults + '</a></div>').appendTo('#fulltextResultHitPanel');
				$('<div id="ftAdditionalResultHitPanel" class="additionalResultHitPanel"></div>').appendTo('#fulltextResultHitPanel');
				$('#ftAdditionalResultHitPanelTrigger').click(function(event) {
					event.stopPropagation();
					$("#ftAdditionalResultHitPanel").show();
					$("#ftMoreResultHitLabel").hide();
					return false;
				});
				targetEl = '#ftAdditionalResultHitPanel';
			}
			
			var hitPanel = '<div class="resultHit clerasil">\n';
			hitPanel+= '<div class="resultHitLabel resultHitDescriptionTriggerFt" name="ft' + i + '">';
			hitPanel+= '<a id="resultHitTitleft' + i + '" class="resultHitTitle" href="' + hit.dcIdentifier + '">' + '<img border="0" src="/xms/icons/mime_type.' + (hit.dcFormat != null?hit.dcFormat.replace('/','_'):'') + '.gif" />' +  hit.dcTitle + '</a>';
			hitPanel+= '<div id="resultHitDescriptionft' + i + '" class="resultHitDescription">' + hit.fragment + '</div>';
			hitPanel+= '</div>\n';
			hitPanel+= "</div>\n";
			
			$(hitPanel).appendTo(targetEl);
		}
		
		var hoverConfig = {
                     over: function(event) {
                        var elId = $(this).attr("name");
                        $("#resultHitDescription" + elId).slideToggle(700);
			$("#resultHitTitle" + elId).addClass("hover");
                        },
                     timeout: 300, // number = milliseconds delay before onMouseOut    
                     out : function(event) {
                        var elId = $(this).attr("name");
                        $("#resultHitDescription" + elId).slideToggle(700);
			$("#resultHitTitle" + elId).removeClass("hover");
                        },
                     interval : 400
                };

                $('.resultHitDescriptionTriggerFt').hoverIntent(hoverConfig);
	}
	
	// Fulltext results Tue
	function handleFulltextTueSearchResults(data) {		
		if (data == null || data.hits == null || data.hits.length == null || data.hits.length == 0)
			return;

		// Add label and hit panel
		var langString = "Volltext TÜH";
		var langSringMoreResults = "Weitere Treffer zeigen";
                if (searchLang == "en") {
                        langString = "Full text TÜH";
			langSringMoreResults = "Show more hits";
                }
		$('#fulltextTueResultPanel').html('');
		$('<div id="fulltextTueResultLabel" class="resultLabel">' + langString + '</div>').appendTo('#fulltextTueResultPanel');
		$('<div id="fulltextTueResultHitPanel" class="resultHitPanel"></div>').appendTo('#fulltextTueResultPanel');

		var targetEl = '#fulltextTueResultHitPanel';
		for (var i=0; i<data.hits.length; i++) {
			var hit = data.hits[i];

			// If more hits than 5, push them to a hidden div
			if (i == 4) {
				$('<div id="ftTueMoreResultHitLabel" class="moreResultHitLabel"><a href="#" id="ftTueAdditionalResultHitPanelTrigger">' + langSringMoreResults + '</a></div>').appendTo('#fulltextTueResultHitPanel');
				$('<div id="ftTueAdditionalResultHitPanel" class="additionalResultHitPanel"></div>').appendTo('#fulltextTueResultHitPanel');
				$('#ftTueAdditionalResultHitPanelTrigger').click(function(event) {
					event.stopPropagation();
					$("#ftTueAdditionalResultHitPanel").show();
					$("#ftTueMoreResultHitLabel").hide();
					return false;
				});
				targetEl = '#ftTueAdditionalResultHitPanel';
			}

			var hitPanel = '<div class="resultHit clerasil">\n';
			hitPanel+= '<div class="resultHitLabel resultHitDescriptionTriggerFtTue" name="ftTue' + i + '">';
			hitPanel+= '<a id="resultHitTitleft' + i + '" class="resultHitTitle" href="' + hit.dcIdentifier + '" target="_blank">' + '<img border="0" src="/xms/icons/mime_type.' + (hit.dcFormat != null?hit.dcFormat.replace('/','_'):'') + '.gif" />' +  hit.dcTitle + '</a>';
			hitPanel+= '<div id="resultHitDescriptionftTue' + i + '" class="resultHitDescription">' + hit.fragment + '</div>';
			hitPanel+= '</div>\n';
			hitPanel+= "</div>\n";

			$(hitPanel).appendTo(targetEl);
		}
		
		var hoverConfig = {
                     over: function(event) {
                        var elId = $(this).attr("name");
                        $("#resultHitDescription" + elId).slideToggle(700);
			$("#resultHitTitle" + elId).addClass("hover");
                        },
                     timeout: 300, // number = milliseconds delay before onMouseOut    
                     out : function(event) {
                        var elId = $(this).attr("name");
                        $("#resultHitDescription" + elId).slideToggle(700);
			$("#resultHitTitle" + elId).removeClass("hover");
                        },
                     interval : 400
                };

                $('.resultHitDescriptionTriggerFtTue').hoverIntent(hoverConfig);
	}
	
	// Fulltext results TC
	function handleFulltextTCSearchResults(data) {	
		if (data == null || data.hits == null || data.hits.length == null || data.hits.length == 0)
			return;

		// Add label and hit panel
		var langString = "Volltext TÜV KNOW-HOW CLUB";
		var langSringMoreResults = "Weitere Treffer zeigen";
	            if (searchLang == "en") {
	                    langString = "Full text TÜV KNOW-HOW CLUB";
			langSringMoreResults = "Show more hits";
	            }
		$('#fulltextTCResultPanel').html('');
		$('<div id="fulltextTCResultLabel" class="resultLabel">' + langString + '</div>').appendTo('#fulltextTCResultPanel');
		$('<div id="fulltextTCResultHitPanel" class="resultHitPanel"></div>').appendTo('#fulltextTCResultPanel');

		var targetEl = '#fulltextTCResultHitPanel';
		for (var i=0; i<data.hits.length; i++) {
			var hit = data.hits[i];

			// If more hits than 5, push them to a hidden div
			if (i == 4) {
				$('<div id="ftTCMoreResultHitLabel" class="moreResultHitLabel"><a href="#" id="ftTCAdditionalResultHitPanelTrigger">' + langSringMoreResults + '</a></div>').appendTo('#fulltextTCResultHitPanel');
				$('<div id="ftTCAdditionalResultHitPanel" class="additionalResultHitPanel"></div>').appendTo('#fulltextTCResultHitPanel');
				$('#ftTCAdditionalResultHitPanelTrigger').click(function(event) {
					event.stopPropagation();
					$("#ftTCAdditionalResultHitPanel").show();
					$("#ftTCMoreResultHitLabel").hide();
					return false;
				});
				targetEl = '#ftTCAdditionalResultHitPanel';
			}

			var hitPanel = '<div class="resultHit clerasil">\n';
			hitPanel+= '<div class="resultHitLabel resultHitDescriptionTriggerFtTC" name="ftTC' + i + '">';
			hitPanel+= '<a id="resultHitTitleft' + i + '" class="resultHitTitle" href="' + hit.dcIdentifier + '" target="_blank">' + '<img border="0" src="/xms/icons/mime_type.' + (hit.dcFormat != null?hit.dcFormat.replace('/','_'):'') + '.gif" />' +  hit.dcTitle + '</a>';
			hitPanel+= '<div id="resultHitDescriptionftTC' + i + '" class="resultHitDescription">' + hit.fragment + '</div>';
			hitPanel+= '</div>\n';
			hitPanel+= "</div>\n";

			$(hitPanel).appendTo(targetEl);
		}

		var hoverConfig = {
	                 over: function(event) {
	                    var elId = $(this).attr("name");
	                    $("#resultHitDescription" + elId).slideToggle(700);
			$("#resultHitTitle" + elId).addClass("hover");
	                    },
	                 timeout: 300, // number = milliseconds delay before onMouseOut    
	                 out : function(event) {
	                    var elId = $(this).attr("name");
	                    $("#resultHitDescription" + elId).slideToggle(700);
			$("#resultHitTitle" + elId).removeClass("hover");
	                    },
	                 interval : 400
	            };

	            $('.resultHitDescriptionTriggerFtTC').hoverIntent(hoverConfig);
	}
}

