/**
 * Module containing search functions
 * @author Priit Kervi (priit.kervi@regio.ee)
 * TODO: 
 * 1. restore active page and scroll (?) when rebuilding search lists
 */
 
searchHandler = {

	geoCodeUrl: "./flash/search.php?q=",
	objectsSearchUrl: "flashconf.php?in=obj_search&search=",
	
	searchInput: '',
	
	searchResults: null,
	resultsOnMap: null,
	resultsOnMapPerPage: null,
	resultsOnMapHasKey: '',
	
	allResultsMode: true,
	
	OBJECTS_NUM_PER_PAGE: 25,
	
	SEARCH_CONTAINER_NAME: '#search-results',
	
	CONTAINER_NAME: '#search-results-content',
	
	ALL_RESULTS_CONTAINER_NAME: '#allResultsList',
	ALL_RESULTS_PAGER_NAME: "#allResultsPager",
	ALL_RESULTS_LINK: "#allResults",
	
	RESULTS_ON_MAP_CONTAINER_NAME: '#resultsOnMapList',
	RESULTS_ON_MAP_PAGER_NAME: "#resultsOnMapPager",
	RESULTS_ON_MAP_LINK: "#resultsOnMap",
	
	SEARCH_FOOTER_NAME: "#search-results-footer",
	
	SEARCH_RESULTS_SYSTEM_LAYER: "searchResults",
	SEARCH_RESULTS_SYSTEM_LAYER_DEPTH: 9,
	
	BOUNDING_BOX_PADDING: 0.1, // (ratio) buffer inside map bounding box, if object is inside that buffet it is not shown in filtered list and, thus, on map
	
	offset: '&nbsp;&nbsp;&nbsp;&nbsp;',
	
	heightDifference: 273,
	windowHeight: 508,
	
	scrollbarMargin: 0,
	
	highlightedObject: undefined,
	numberedObjectHighlightTimeout: undefined,
	
	isFooterVisible: true,
	
	checkUrlForSearchArgument: function() {
		var pairs = location.search.substring(1).split('&');
		for (var i = 0; i < pairs.length; i++) {
			var nameValue = pairs[i].split('=');
			if (nameValue[0] != undefined && nameValue[0] == 'q') {
				var searchInput = decodeURIComponent(nameValue[1]);
				break;
			}
		}
		if (searchInput != undefined) {
			document.searchForm.searchText.value = searchInput;
			document.searchForm.radiogroup01[0].checked = true;
			this.geoCode(searchInput, true);
			return true;
		}
		return false;
	},
	
	geoCode: function(searchInput, addressSearch) {
		try {
			info.hideSearchBoxInfo();
		
			this.searchInput = searchInput;
			window.document.sf.q.value = searchInput;
			FlashApi.run(function(){ 
				FlashApi.addSystemLayer(this.SEARCH_RESULTS_SYSTEM_LAYER, this.SEARCH_RESULTS_SYSTEM_LAYER_DEPTH);
			});
			
			this.showSearchListIfRequired();
			
			this.clearResultsList();
			this.showAllResults();
			$(this.ALL_RESULTS_CONTAINER_NAME).html(this.offset + LANG["_PLEASEWAIT"]);
			
			if (addressSearch) {
				$.ajax({
				    url: this.geoCodeUrl + escape(searchInput),
				    type: 'GET',
				    dataType: 'xml',
				    error: function() {
				        //alert('Error loading XML document');
				    },
				    success: function(xml) {
						searchHandler.parseGeoCodeResponse(xml);
					}
				});
			} else {
				$.ajax({
				    url: this.objectsSearchUrl + searchInput,
				    type: 'GET',
				    dataType: 'xml',
				    error: function() {
				        //alert('Error loading XML document');
				    },
				    success: function(xml) {
						searchHandler.parseObjectsSearchResponse(xml);
					}
				});		
			}
		} catch(e) {
			//alert(e.name + " " + e.message);
		}
	},
	
	parseGeoCodeResponse: function(xml) {
		try {
			var objects = new Array();
			
			$(xml).find('data').each( function() {
				var text = $(this).find('info').text();
				var e = $(this).find('x').text();
				var n = $(this).find('y').text();
				var zoom = searchHandler.convertGcadminZoomLevel(Number($(this).find('z').text()));
				objects.push({e:e, n:n, zoom:zoom, text:text, escapedText:escape(text)});
			});
			
			searchHandler.searchResults = this.removeObjectsWithoutCoordinates(objects);
			searchHandler.buildSearchList(this.searchResults, $(this.ALL_RESULTS_CONTAINER_NAME));
		} catch(e) {
			//alert(e + " " + e.name + " " + e.message);
		}
	},

	removeObjectsWithoutCoordinates: function(objects) {	
		var temp = new Array();
		for (var i = 0; i < objects.length; i++) {
			var obj = objects[i];
			if (obj.e == 0 || obj.n == 0) 
				continue;
			temp.push(obj);
		}

		return temp;
	},
	
	convertGcadminZoomLevel: function(zoom) {
		switch (zoom) {
			case 1: 
			case 2: 
			case 3: 
				return zoom + 3; // maakond, vald ja linn
			case 4:
			case 5:
				return zoom + 6; // tänav ja maja
			case 6:
				return 7; // talu
		}
	},
	
	parseObjectsSearchResponse: function(xml) {	
		var objects = new Array();
		
		$(xml).find('res').each( function() {
			var e = $(this).attr('E');
			var n = $(this).attr('N');
			var zoom = $(this).attr('z');
			var text = $(this).text();
			var lid = $(this).attr('lId');
			objects.push({e:e, n:n, zoom:zoom, text:text, escapedText:escape(text), lid:lid});
		});
		
		this.searchResults = this.removeObjectsWithoutCoordinates(objects);
		this.buildSearchList(this.searchResults, $(this.ALL_RESULTS_CONTAINER_NAME));
	},
	
	hideFooter: function() {
		var footer = $(this.SEARCH_FOOTER_NAME);
		if (footer.css("display") == "block") {
			footer.hide();
			this.isFooterVisible = false;
			if (this.allResultsMode) {
				var listContainer = $(this.ALL_RESULTS_CONTAINER_NAME);
			} else {
				var listContainer = $(this.RESULTS_ON_MAP_CONTAINER_NAME);
			}
			listContainer.height(listContainer.height() + gui.SEARCH_RESULTS_FOOTER_HEIGHT);
		}
	},
	
	showFooter: function() {
		var footer = $(this.SEARCH_FOOTER_NAME);
		if (footer.css("display") != "block") {
			if (this.allResultsMode) {
				var listContainer = $(this.ALL_RESULTS_CONTAINER_NAME);
			} else {
				var listContainer = $(this.RESULTS_ON_MAP_CONTAINER_NAME);
			}
			listContainer.height(listContainer.height() - gui.SEARCH_RESULTS_FOOTER_HEIGHT);
			footer.show();
			this.isFooterVisible = true;
		}
	},
		
	buildSearchList: function(objects, container) {
		dataChanged();
		if (objects != undefined) {
			var n = objects.length;
			if (n > 0) {
				$('#allResults').html(LANG["_ALL"] + '(' + n + ')');
				container.html("");
				this.allResultsPages = Math.ceil(n / this.OBJECTS_NUM_PER_PAGE);
				if (this.allResultsCurrentPage == 0) {
					this.allResultsCurrentPage = 1;
				}
				
				this.setAllResultsPageNumber(this.allResultsCurrentPage, this.allResultsPages);
						
				for (var i = 0; i < this.allResultsPages; i++) {
					container.append('<div id="allResultsPage' + i + '" class="searchResultsPage"></div>');
					var start = i * this.OBJECTS_NUM_PER_PAGE;
					var page = $('#allResultsPage' + i);
					page.html(this.generateAllResultsTable(objects, start, start + this.OBJECTS_NUM_PER_PAGE));
					var height = this.windowHeight - this.heightDifference;
					if (!this.isFooterVisible) {
						height += gui.SEARCH_RESULTS_FOOTER_HEIGHT;
					}
					$('#allResultsPage' + i + ' .scrollableSearchResultsTable').height(height).jScrollPane({showArrows:true, scrollbarWidth: gui.scrollWidth, scrollbarMargin: this.scrollbarMargin});
					page.css('display', 'none');
				}
				
				this.allResultsGoToPage(this.allResultsCurrentPage - 1); // allResultsCurrentPage numbers start from 1, but pages indexes start from 0
				this.filterSearchResults(map_params, true);
			} else { 
				container.html(this.offset + LANG["_NORESULTSFOUND"]);
				this.resetAllResultsPageNumber();
			}
		}
	},

	generateAllResultsTable: function(objects, start, end) {
		var text='';
		
		text += '<div class="scrollableSearchResultsTable">';
		text += '<table class="form">';
		if (end > objects.length)
			end = objects.length;
		for (var i = start; i < end; i++) {
			var obj = objects[i];

			text += '<tr id="allResultsRow' + i + '">';
			text += '<td class="nr">' + (i+1) + '</td>';
				
			if (obj.lid != undefined && obj.lid.length > 0) {
				text += '<td><a href="#" onclick="FlashApi.showSearchResult(' 
					+ obj.e + ',' + obj.n + ',\'' + obj.escapedText + '\',' + obj.zoom + '); FlashApi.checkLayer(\'' + obj.lid + '\',' + 1 + ');">' + obj.text + '</a></td>';
			} else {
				text += '<td><a href="#" onclick="FlashApi.showSearchResult(' 
					+ obj.e + ',' + obj.n + ',\'' + obj.escapedText + '\',' + obj.zoom + ');">' + obj.text + '</a></td>';	
			}
			
			text +=	'<td class="ico"><a href="#" onclick="routing.setStartPoint(' + obj.e + ',' + obj.n + ',\'' + obj.escapedText + '\');"><img class="flagIco" src="gfx/start.gif" title="' + 
				LANG["_PUTSTARTPOINT"] + '" alt="' + LANG["_STARTPOINT"] +'" /></a></td>';
			text +=	'<td class="ico"><a href="#" onclick="routing.setEndPoint(' + obj.e + ',' + obj.n + ',\'' + obj.escapedText + '\');"><img class="flagIco" src="gfx/end.gif" title="' + 
				LANG["_PUTENDPOINT"] + '" alt="' + LANG["_ENDPOINT"] +'" /></a></td>';
			text += '</tr>';
		}
		
		text += '</table>';
		text += '</div>';

		return text;
	},
	
	filterSearchResults: function(bbox, build) {
		dataChanged();
		
		try {
			FlashApi.run(function(){ 
				FlashApi.clearSystemLayer(this.SEARCH_RESULTS_SYSTEM_LAYER);
			});
		} catch(e) {
			// TODO: find the solution to the problem, function is not called sometimes
			//alert(e + " " + e.name + " " + e.message);
		}
		
		if (bbox != undefined && this.searchResults != undefined) {
			// make bbox smaller (add padding or buffer)
			var newKey = this.generateFilteredListHashIndex(bbox);
			if (newKey != this.resultsOnMapHasKey) { // if list will be updated, reset page number, start showing from the first page if list is not empty
				this.resetResultsOnMapPageNumber();
				this.resultsOnMapHasKey = newKey;
			}
			
			var bufferWidth = (bbox.max_e - bbox.min_e) * this.BOUNDING_BOX_PADDING; 
			var buferHeight = (bbox.max_n - bbox.min_n) * this.BOUNDING_BOX_PADDING;
			var minE = bbox.min_e + bufferWidth;
			var maxE = bbox.max_e - bufferWidth;
			var minN = bbox.min_n + buferHeight;
			var maxN = bbox.max_n - buferHeight;
		
			var result;
			this.resultsOnMap = new Array();
			for (var i = 0; i < this.searchResults.length; i++) {
				result = this.searchResults[i];		
				if (result.e > minE && result.e < maxE && result.n > minN && result.n < maxN) {
					this.resultsOnMap.push(result);
				}			
			}

			var n = this.resultsOnMap.length;
			
			if (n > 0) {
				$('#resultsOnMap').html(LANG["_ONMAP"] + '(' + n + ')');
				if (!this.allResultsMode || build) {
					this.buildFilteredList(this.resultsOnMap, $(this.RESULTS_ON_MAP_CONTAINER_NAME));
				}
			} else {
				$('#resultsOnMap').html(LANG["_ONMAP"]);
				 $(this.RESULTS_ON_MAP_CONTAINER_NAME).html(this.offset + LANG["_NORESULTSFOUND"]);
				this.resetResultsOnMapPageNumber();
			}
		}
	},
	
	buildFilteredList: function(objects, container) {
		var n = objects.length;
		this.resultsOnMapPages = Math.ceil(n / this.OBJECTS_NUM_PER_PAGE);
		
		if (this.resultsOnMapCurrentPage == 0) {
			this.resultsOnMapCurrentPage = 1;
		}
		this.resultsOnMapPerPage = new Array();
	
		if (gui.isFirstTabVisible()) {
			this.setResultsOnMapPageNumber(this.resultsOnMapCurrentPage, this.resultsOnMapPages);					
			container.html("");
			for (var i = 0; i < this.resultsOnMapPages; i++) {
				container.append('<div id="resultsOnMapPage' + i + '" class="searchResultsPage"></div>');
				var start = i * this.OBJECTS_NUM_PER_PAGE;
				var page = $('#resultsOnMapPage' + i);
				this.resultsOnMapPerPage.push(new Array());
				page.html(this.generateResultsOnMapTable(objects, start, start + this.OBJECTS_NUM_PER_PAGE, this.resultsOnMapPerPage[i]));
				var height = this.windowHeight - this.heightDifference;
				if (!this.isFooterVisible) {
					height += gui.SEARCH_RESULTS_FOOTER_HEIGHT;
				}
				$('#resultsOnMapPage' + i + ' .scrollableSearchResultsTable').height(height).jScrollPane({showArrows:true, scrollbarWidth: gui.scrollWidth, scrollbarMargin: this.scrollbarMargin});
				page.css('display', 'none');
			}
			this.resultsOnMapGoToPage(this.resultsOnMapCurrentPage - 1); // resultsOnMapCurrentPage numbers start from 1, but pages indexes start from 0
		} else {
			for (var i = 0; i < this.resultsOnMapPages; i++) {
				var start = i * this.OBJECTS_NUM_PER_PAGE;
				this.resultsOnMapPerPage.push(new Array());
				this.splitObjectsPerPages(objects, start, start + this.OBJECTS_NUM_PER_PAGE, this.resultsOnMapPerPage[i]);
			}
			this.showResultsOnMapFromPage(this.resultsOnMapCurrentPage - 1);
		}
	}, 
	
	highlightNumberedObject: function(objectId) {
		FlashApi.callObjectOnRollOver(this.SEARCH_RESULTS_SYSTEM_LAYER, objectId);
		this.numberedObjectMouseOver(objectId);
	},
	
	resetNumberedObjectHighlight: function(objectId) {
		FlashApi.callObjectOnRollOut(this.SEARCH_RESULTS_SYSTEM_LAYER, objectId);
		this.numberedObjectMouseOut(objectId);
	},
	
	numberedObjectMouseOver: function(objectId) {
		this.clearNumberedObjectHighlightTimeout();
		if (this.highlightedObject != undefined) {
			$('#object_row_' + this.highlightedObject).removeClass("mouseover");
		}
		$('#object_row_' + objectId).addClass("mouseover");
		this.highlightedObject = objectId;
	},
	
	numberedObjectMouseOut: function(objectId) {
		this.clearNumberedObjectHighlightTimeout();
		
		// the timeout is used to avoid blinking under IE, as IE throws onmouseout event every time mouse moves from TD to TD in TR
		this.numberedObjectHighlightTimeout = setTimeout(
			function() {
				$('#object_row_' + objectId).removeClass('mouseover');
			}
			, gui.RESET_ROW_HIGHLIGHT_TIMEOUT);
	},
	
	notifyObjectOnMouseOver: function(object) {
		this.numberedObjectMouseOver(object.objectId);
	},
	
	notifyObjectOnMouseOut:function(object) {
		this.numberedObjectMouseOut(object.objectId);
	},
	
	clearNumberedObjectHighlightTimeout: function() {
		if (this.numberedObjectHighlightTimeout != undefined) {
			clearTimeout(this.numberedObjectHighlightTimeout);
		}
	},
	
	generateResultsOnMapTable: function(objects, start, end, objectsOnPage) {	
		var text = '<div class="scrollableSearchResultsTable"><table class="form">';
		
		if (end > objects.length)
			end = objects.length;
		for (var i = start; i < end; i++) {
			var obj = objects[i];
			
			var id = i + 1 + "";
			var symbol = (i < 9) ? id : "label2_" + id;
			var attr = {
				objectId: id,
				geo: [{e: obj.e, n: obj.n}],
				color: "D6951D",
				alpha: 80,
				symbolId: symbol,
				tooltip: obj.text
			};
			objectsOnPage.push(attr);
			
			text += '<tr id="object_row_' + id + '" onmouseover="searchHandler.highlightNumberedObject(' + id + ');"'  +
												'onmouseout="searchHandler.resetNumberedObjectHighlight(' + id + ');">' +
					'<td class="nr2">' + (i+1) + '</td>';
				
			if (obj.lid != undefined && obj.lid.length > 0) {
				text += '<td><a href="#" onclick="FlashApi.showSearchResult(' 
					+ obj.e + ',' + obj.n + ',\'' + obj.escapedText + '\',' + obj.zoom + '); FlashApi.checkLayer(\'' + obj.lid + '\',' + 1 + ');">' + obj.text + '</a></td>';
			} else {
				text += '<td><a href="#" onclick="FlashApi.showSearchResult(' 
					+ obj.e + ',' + obj.n + ',\'' + obj.escapedText + '\',' + obj.zoom + ');">' + obj.text + '</a></td>';	
			}
			
			text +=	'<td class="ico"><a href="#" onclick="routing.setStartPoint(' + obj.e + ',' + obj.n + ',\'' + obj.escapedText + '\');"><img class="flagIco" src="gfx/start.gif" title="' + 
				LANG["_PUTSTARTPOINT"] + '" alt="' + LANG["_STARTPOINT"] +'" /></a></td>' +
					'<td class="ico"><a href="#" onclick="routing.setEndPoint(' + obj.e + ',' + obj.n + ',\'' + obj.escapedText + '\');"><img class="flagIco" src="gfx/end.gif" title="' + 
				LANG["_PUTENDPOINT"] + '" alt="' + LANG["_ENDPOINT"] +'" /></a></td>' +
					'</tr>';
		}

		return text + '</table></div>';
	},
	
	splitObjectsPerPages: function(objects, start, end, objectsOnPage) {	
		if (end > objects.length)
			end = objects.length;
		for (var i = start; i < end; i++) {
			var obj = objects[i];
			var id = i + 1 + "";
			var symbol = (i < 9) ? id : "label2_" + id;
			var attr = {
				objectId: id,
				geo: [{e: obj.e, n: obj.n}],
				color: "D6951D",
				alpha: 80,
				symbolId: symbol,
				tooltip: obj.text
			};
			objectsOnPage.push(attr);
		}
	},
	
	showResultsOnMapFromPage: function(pageIndex) {
		try {
			FlashApi.run(function(){ 
				FlashApi.clearSystemLayer(this.SEARCH_RESULTS_SYSTEM_LAYER);
			});
		} catch(e) {
			// TODO: find the solution to the problem, function is not called sometimes
			//alert(e + " " + e.name + " " + e.message);
		}
		
		if (!this.allResultsMode) {
			var objects = this.resultsOnMapPerPage[pageIndex];
			
			for (var i = 0; i < objects.length; i++) {
				FlashApi.run(function(){ 
					FlashApi.addPointToSystemLayer(this.SEARCH_RESULTS_SYSTEM_LAYER, objects[i]);
				});
			}
		}
	},
		
	showAllResults: function(notButtonClicked) {
		this.showSearchListIfRequired();
		
		gui.collapseList = notButtonClicked;
		
		$(this.RESULTS_ON_MAP_CONTAINER_NAME).css("z-index", 1);
		$(this.ALL_RESULTS_CONTAINER_NAME).css("z-index", 2);
		
		$(this.RESULTS_ON_MAP_PAGER_NAME).hide();
		$(this.ALL_RESULTS_PAGER_NAME).show();
		
		$(this.RESULTS_ON_MAP_LINK).removeClass("active");
		$(this.ALL_RESULTS_LINK).addClass("active");
		
		this.allResultsMode = true;
		this.showAciveSearchList();
	},
	
	showResultsOnMap: function(notButtonClicked) {
		this.showSearchListIfRequired();
		
		gui.collapseList = notButtonClicked;

		$(this.RESULTS_ON_MAP_CONTAINER_NAME).css("z-index", 2);
		$(this.ALL_RESULTS_CONTAINER_NAME).css("z-index", 1);

		$(this.ALL_RESULTS_PAGER_NAME).hide();
		$(this.RESULTS_ON_MAP_PAGER_NAME).show();
	
		$(this.ALL_RESULTS_LINK).removeClass("active");
		$(this.RESULTS_ON_MAP_LINK).addClass("active");
		
		this.allResultsMode = false;
		this.showAciveSearchList();
	},
	
	showAciveSearchList: function() {
		if (this.allResultsMode && this.searchResults) {
			this.buildSearchList(this.searchResults, $(this.ALL_RESULTS_CONTAINER_NAME));
		} else {
			this.filterSearchResults(map_params);
		}
	},
	
	showSearchListIfRequired: function() {
		if (!gui.isSearchListVisible()) {
			gui.collapseRoutingList();
			gui.showSearchList();
		}
	},
	
	getCurrentPageContainer: function() {
		//return $('#allResultsPage' + (this.currentPage - 1) + ' .scrollableSearchResultsTable');
		return $('#allResultsPage' + (this.allResultsCurrentPage - 1) + ' .scrollableSearchResultsTable');
	}, 
	
	allResultsGoNextPage: function() {
		if (this.allResultsCurrentPage < this.allResultsPages) {
			$('#allResultsPage' + (this.allResultsCurrentPage - 1)).css('display', 'none'); // hide current page (page numbers start at 0)
			$('#allResultsPage' + this.allResultsCurrentPage).css('display', 'block'); // show next page
			this.allResultsCurrentPage++;
			this.setAllResultsPageNumber(this.allResultsCurrentPage, this.allResultsPages);
			dataChanged();
		}		
	},
	
	allResultsGoToPage: function(pageNumber) {
		if (pageNumber < this.allResultsPages) {
			for (var i = 0; i < this.allResultsPages; i++) {
				$('#allResultsPage' + i).css('display', 'none'); // hide all pages
			}
			$('#allResultsPage' + pageNumber).css('display', 'block'); // show required page
			this.allResultsCurrentPage = pageNumber + 1; // allResultsCurrentPage numbers start from 1
			this.setAllResultsPageNumber(this.allResultsCurrentPage, this.allResultsPages);
		}		
	},
	
	resultsOnMapGoNextPage: function() {
		if (this.resultsOnMapCurrentPage < this.resultsOnMapPages) {
			$('#resultsOnMapPage' + (this.resultsOnMapCurrentPage - 1)).css('display', 'none'); // hide current page (page numbers start at 0)
			$('#resultsOnMapPage' + this.resultsOnMapCurrentPage).css('display', 'block'); // show next page
			this.resultsOnMapCurrentPage++;
			this.setResultsOnMapPageNumber(this.resultsOnMapCurrentPage, this.resultsOnMapPages);
			this.showResultsOnMapFromPage(this.resultsOnMapCurrentPage - 1);
			dataChanged();
		}		
	},
	
	resultsOnMapGoToPage: function(pageNumber) {
		if (pageNumber < this.resultsOnMapPages) {
			for (var i = 0; i < this.resultsOnMapPages; i++) {
				$('#resultsOnMapPage' + i).css('display', 'none'); // hide all pages
			}
			$('#resultsOnMapPage' + pageNumber).css('display', 'block'); // show required page
			this.resultsOnMapCurrentPage = pageNumber + 1; // resultsOnMapCurrentPage numbers start from 1
			this.setResultsOnMapPageNumber(this.resultsOnMapCurrentPage, this.resultsOnMapPages);
			if (!this.allResultsMode)
				this.showResultsOnMapFromPage(pageNumber);
		}		
	},
	
	allResultsGoPreviousPage: function() {
		if (this.allResultsCurrentPage > 1) {
			this.allResultsCurrentPage--;
			$('#allResultsPage' + this.allResultsCurrentPage).css('display', 'none'); // hide current page (page numbers start at 0)
			$('#allResultsPage' + (this.allResultsCurrentPage - 1)).css('display', 'block'); // show previous page
			
			this.setAllResultsPageNumber(this.allResultsCurrentPage, this.allResultsPages);
			dataChanged();
		}	
	},
	
	resultsOnMapGoPreviousPage: function() {
		if (this.resultsOnMapCurrentPage > 1) {
			this.resultsOnMapCurrentPage--;
			$('#resultsOnMapPage' + this.resultsOnMapCurrentPage).css('display', 'none'); // hide current page (page numbers start at 0)
			$('#resultsOnMapPage' + (this.resultsOnMapCurrentPage - 1)).css('display', 'block'); // show previous page
			
			this.setResultsOnMapPageNumber(this.resultsOnMapCurrentPage, this.resultsOnMapPages);
			this.showResultsOnMapFromPage(this.resultsOnMapCurrentPage - 1);
			dataChanged();
		}	
	},
	
	setAllResultsPageNumber: function(page, total) {
		if (this.allResultsMode) {
			if (total < 2) {
				//console.log("setAllResultsPageNumber: " + total + " -> hiding footer");
				this.hideFooter();
			} else {
				//console.log("setAllResultsPageNumber: " + total + " -> showing footer");
				this.showFooter();
				$('#allResultsPageNumber').html(page + "/" + total);
			}
		}
	},
	
	setResultsOnMapPageNumber: function(page, total) {
		if (!this.allResultsMode) {
			if (total < 2) {
				//console.log("setResultsOnMapPageNumber: " + total + " -> hiding footer");
				this.hideFooter();
			} else {
				//console.log("setResultsOnMapPageNumber: " + total + " -> showing footer");
				this.showFooter();
				$('#resultsOnMapPageNumber').html(page + "/" + total);
			}
		}
	},
	
	clearResultsList: function() {
		$('#allResults').html(LANG["_ALL"]);
		$('#resultsOnMap').html(LANG["_ONMAP"]);
		
		$(this.ALL_RESULTS_CONTAINER_NAME).html("");		
		$(this.RESULTS_ON_MAP_CONTAINER_NAME).html("");	
		
		this.resetAllResultsPageNumber();		
		this.resetResultsOnMapPageNumber();
				
		FlashApi.run(function(){ FlashApi.clearSystemLayer(this.SEARCH_RESULTS_SYSTEM_LAYER); });
		this.searchResults = null;
	},
	
	clear: function(notClearButtonClicked) {
		gui.collapseList = notClearButtonClicked;
		this.resultOnMap = null;
		searchHandler.clearResultsList();
		searchHandler.clearInput();
		info.showSearchBoxInfo();
		dataChanged();
	},
	
	resetAllResultsPageNumber: function() {
		this.allResultsPages = 0;
		this.allResultsCurrentPage = 0;
		this.setAllResultsPageNumber(this.allResultsCurrentPage, this.allResultsPages);
	},

	resetResultsOnMapPageNumber: function() {
		this.resultsOnMapPages = 0;
		this.resultsOnMapCurrentPage = 0;
		this.setResultsOnMapPageNumber(this.resultsOnMapCurrentPage, this.resultsOnMapPages);
	},
	
	clearInput: function() {
		$('#searchInput').attr('value', '');
		this.searchInput = '';
		window.document.sf.q.value='';
	},
	
	resizeSearchLists: function(windowHeight) {
		this.windowHeight = windowHeight;
		$(this.SEARCH_CONTAINER_NAME).height(windowHeight - 228);
		$(this.ALL_RESULTS_CONTAINER_NAME).height(windowHeight - this.heightDifference);
		$(this.RESULTS_ON_MAP_CONTAINER_NAME).height(windowHeight - this.heightDifference);
		$(".scrollableSearchResultsTable").height(windowHeight - this.heightDifference);
		$("#search-results-footer").css("margin-top", windowHeight - this.heightDifference);
		
		this.buildSearchList(this.searchResults, $(this.ALL_RESULTS_CONTAINER_NAME));		
		if (!gui.isSearchListVisible()) {
			gui.collapseSearchList();
		}
	},
	
	/**
	 * Function is used to generate unique key for filtered list (is defined by map bbox and search string)
	 */
	generateFilteredListHashIndex: function(bbox) {
		return "" + bbox.min_e + bbox.min_n + bbox.max_e + bbox.max_n + this.searchInput;
	},
	
	getSearchObject: function() {
		if(this.searchResults){
			return {
				searchInput: this.searchInput, //user input for search
				addressSearch:document.searchForm.radiogroup01[0].checked, //address search mode true or object search mode false
				allResultsMode:this.allResultsMode, //Show all results or results on map
				allResultsCurrentPage:this.allResultsCurrentPage, // Current all results page
				resultsOnMapCurrentPage:this.resultsOnMapCurrentPage, // Current result on map page
				resultOnMap:this.resultOnMap //Result currently on map
			};
		}else{
			return null;
		}
	},
	
	restoreFromSearchObject: function(obj) {
		if (obj) {
			this.geoCode(obj.searchInput, obj.addressSearch);
			
			document.searchForm.searchText.value = obj.searchInput;
			document.searchForm.radiogroup01[0].checked = obj.addressSearch;
			
			this.allResultsMode = obj.allResultsMode;
			
			this.allResultsCurrentPage = obj.allResultsCurrentPage;
			this.allResultsGoToPage(this.allResultsCurrentPage - 1); // allResultsCurrentPage numbers start from 1, but pages indexes start from 0
			this.resultsOnMapCurrentPage = obj.resultsOnMapCurrentPage;
			this.resultsOnMapGoToPage(this.resultsOnMapCurrentPage - 1); // resultsOnMapCurrentPage numbers start from 1, but pages indexes start from 0
			
			this.resultOnMap = obj.resultOnMap;
			obj.resultOnMap.doNotCenter = true;
			FlashApi.run(function(){ 
				FlashApi.searchResultOnMap(obj.resultOnMap);
			});
			
			if (this.allResultsMode) {
				this.showAllResults();
			} else {
				this.showResultsOnMap();
			}			
		}
	},
		
	generateSearchListForPrint: function() {
		var text = '<table class="form">';
		var page = this.resultsOnMapPerPage[this.resultsOnMapCurrentPage - 1];
		if(page){
			for (var i = 0; i < page.length; i++) {
				var obj = page[i];

				text += '<tr>';
				text += '<td class="nr2">' + (i+1) + '.</td>';
				
				text += '<td>' + obj.tooltip + '</td>';
				text += '</tr>';
			}
			text += '</table>';
			return text;
		}else if(this.resultOnMap){
			return this.resultOnMap.name;
		}else{
			return false;
		}
	}
}
