var SEARCHRESULTLISTMAXLENGTH = 500;
var KEYPRESSTIMERDELAY = 200;
var SEARCHPHRASEMINLENGTH = 3;

function generateSearchByPlaceContent() {
		var searchByPlaceContent = 
			'<div id="searchbyplaceDiv">'+
			'<input class="leftpanelinput" type="text" name="searchbyplacenameInput" id="searchbyplacenameInput" onkeyup="keyPressed(\'paikannimihaku\', this.value, event);"/>'+
			'<br/>'+
			'<div class="divider"></div>'+

			'<input onchange="filterByCheckboxChanged(this)" class="leftpanelinput" type="checkbox" checked name="chkpaikannimihaku" id="chkvakavesi"  '+
			'value="540,550,560,570,590,500,510"/>'+
			'<span class="leftpanellabel">&nbsp;'+Language.get('municipality')+'</span>'+
			'<br/>'+
			'<div class="divider"></div>'+
				'<input onchange="filterByCheckboxChanged(this)" class="leftpanelinput" type="checkbox" checked name="chkpaikannimihaku" id="chkvirtavesi"  '+
				'value="315,325,330,335,340,345,350,430,390,400,410,415,420,425,435,490"/>'+
				'<span class="leftpanellabel">&nbsp;'+Language.get('landmark')+'</span>'+
			'<br/>'+
			'<div class="divider"></div>'+
				'<input onchange="filterByCheckboxChanged(this)" class="leftpanelinput" type="checkbox" checked name="chkpaikannimihaku" id="chkkoski"  '+
				'value="245,520,600,602,604,610,612,614,620,630,640"/>'+
				'<span class="leftpanellabel">&nbsp;'+Language.get('protectedareas')+'</span>'+
			'<br/>'+
			
			'<div class="divider"></div>'+
			'<input onchange="filterByCheckboxChanged(this)" class="leftpanelinput" type="checkbox" name="chkonlymaparea" id="placename_chkonlymaparea"/>'+
			'<span class="leftpanellabel" id="onlymapareaspan">&nbsp;'+Language.get('maparea')+'</span>'+

			'<br/>'+
			'<br/></div>';
		
		
		document.write(searchByPlaceContent);
}

function generateSearchByNameContent() {

	var searchByNameContent = 
		'<div id="searchbynameDiv">'+
		'<input class="leftpanelinput" type="text" id="searchbynameInput" onkeyup="keyPressed(\'nimihaku\', this.value, event);"/>'+
		'<br/>'+
		'<input onchange="filterByCheckboxChanged(this)" name="chknimihaku" value="922|921|923" checked="checked" onclick="" type="checkbox">'+
		'<img style="width:15px;" class="nameSearchListImage" src="images/fishing_green.gif" alt="fishing_green.gif"><span class="leftpanellabel">'+Language.get('fishing')+'</span><br>'+
		'<input onchange="filterByCheckboxChanged(this)" name="chknimihaku" value="901|950" checked="checked" onclick="" type="checkbox">'+
		'<img style="width:15px;" class="nameSearchListImage" src="images/hunting_green.gif" alt="hunting_green.gif"><span class="leftpanellabel">'+Language.get('hunting')+'</span><br>'+
		'<input onchange="filterByCheckboxChanged(this)" name="chknimihaku" value="201|202|203|204|205|206|207|211|232|302|312|313|940|930" checked="checked" onclick="" type="checkbox">'+
		'<img style="width:15px;" class="nameSearchListImage" src="images/hiking_areas_green.gif" alt="hiking_areas_green.gif"><span class="leftpanellabel">'+Language.get('conservationandhiking')+'</span><br>'+
		'<input onchange="filterByCheckboxChanged(this)" name="chknimihaku" value="441" onclick="" type="checkbox">'+
		'<img style="width:15px;" class="nameSearchListImage" src="images/water_areas_green.gif" alt="water_areas_green.gif"><span class="leftpanellabel">'+Language.get('publicwaters')+'</span><br>'+
		
		/*
		'<input onchange="filterByCheckboxChanged(this)" name="chknimihaku" value="1000" onclick="" type="checkbox">'+
		'<img class="nameSearchListImage" src="images/municipality.png" alt="municipality.png"><span class="leftpanellabel">'+Language.get('municipalities')+'</span><br>'+
		*/
		'<input onchange="filterByCheckboxChanged(this)" name="chknimihaku" value="1212|1213|1214|1217|1218|1219|1220|1311|1312|1313|1314|1315|1317|1318|1399|1611|1612|1613|1614|1615|1699|1911|2111|2112|2117|2211|2212|2213|2214|2215|2216|2217|2221|2222|2223|2224|2225|2226|2229|2230|2233|2234|2238|2239|2240|2241|2242|2243|2244|2311|2313|2314|2317|2411|2412|2413|2499|2513|3111|3118|4111|4112|4113|5118|7111|7112|7113|7114|7115|7116|7117|7118|7119|7120|7199|8211|8212|8213|8214|8215|8216|8217|8299|9111|9112|9113|9114|9118|9119|9120|9121|9122|9124|9125|9126" onclick="" type="checkbox">'+
		'<img class="nameSearchListImage" src="images/hiking_green.gif" alt="hiking_green.gif"><span class="leftpanellabel">'+Language.get('excursionservices')+'</span><br>'+
		'<div class="divider"></div>'+
		'<input onchange="filterByCheckboxChanged(this)" class="leftpanelinput" type="checkbox" name="chkonlymaparea" id="chkonlymaparea"/>'+
		'<span class="leftpanellabel" id="name_chkonlymaparea">&nbsp;'+Language.get('maparea')+'</span>'+
		'<br/>'+
		'</div>';
		
		document.write(searchByNameContent);
}

// Get the HTTP Object
var httpObject;
function getHTTPObject(){
	if (window.ActiveXObject) {return new ActiveXObject("Microsoft.XMLHTTP");}
	else if (window.XMLHttpRequest) {return new XMLHttpRequest();}
	else {
		alert("Your browser does not support AJAX.");
		return null;
	}
}


/*determine which search to use and which*/
function searchByPlace(name) {
	if (activeCombo.comboId == 'nimihaku') {
		nimihakuSearch(name);
	} else {
		paikannimiHakuSearch(name);
	}
}

/*function to use with "regular" nimihaku*/
function nimihakuSearch(name) {

	document.body.style.cursor = 'progress';
	document.getElementById(activeCombo.inputId).style.cursor = 'progress';
//	updateSearchStatus('Haetaan...')
	
	searchPhrase = name;
	var placeName = name;//document.getElementById('searchbyplacenameInput').value;
	
	//The previous request isn't finished but searchphrase has changed -> abort the previous request
	//and create a new one.
	if (httpObject && httpObject.readyState != 4) {
//		alert('ed. pyynt� on viel� kesken. '+httpObject.readyState);
		httpObject.abort();
	}
	
	httpObject = null;

	var poiClassesString = getPoiclassesForActiveCombo('|');
	
	
	//TODO: color the input, in case no poiclasses are selected. 
	if (!poiClassesString || poiClassesString.length == 0) {
//		document.getElementById(activeCombo.inputId).style.backgroundColor = "#FF0000;";
		return;
	} else {
//		document.getElementById(activeCombo.inputId).style.backgroundColor = "#FFFFFF;";
	}
	
	//TODO: rajaa haku n�kym�n alueelle!
	var xmlToSend =
		'<navici_request><ajax_request_object object_id="6" service="Geocoding">'+
		'<address_for_key id="0" '+
		'key="'+name+'" max_results="'+SEARCHRESULTLISTMAXLENGTH+'" language="fi" '+
		'category="'+poiClassesString+'" minx="" maxx="" miny="" maxy="" />'+
		'</ajax_request_object>'+
		'</navici_request>';
	httpObject = getHTTPObject();
	if (httpObject != null) {
			httpObject.open("POST", activeCombo.ajaxUrl, true);
			httpObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			httpObject.send("requestXml=" + xmlToSend);
			httpObject.onreadystatechange = searchByNameCallback;
	}
}

/*function to use with "paikannimihaku*/
function paikannimiHakuSearch(name) {

	document.body.style.cursor = 'progress';
	document.getElementById(activeCombo.inputId).style.cursor = 'progress';
	//	updateSearchStatus('Haetaan...');
	
	searchPhrase = name;
	var placeName = name;//document.getElementById('searchbyplacenameInput').value;
//	var poiClassesArray = [];
	
	//The previous request isn't finished but searchphrase has changed -> abort the previous request
	//and create a new one.
	if (httpObject && httpObject.readyState != 4) {
//		alert('ed. pyynt� on viel� kesken. '+httpObject.readyState);
		httpObject.abort();
	}
	
	httpObject = null;
	var poiClassesString = getPoiclassesForActiveCombo(',');

	/*Bounding box!!!!*/
	
	var boundingBoxXml = '';
//	if (document.getElementById('chkonlymaparea').checked) {
	if (document.getElementById(activeCombo.mapareacheckedInputId).checked) {
	
		var extent = map.getExtent();
	
		boundingBoxXml =
		     '<BoundingBox srid="2393">'+  
			 '<pos>'+extent.left+' '+extent.bottom+'</pos>'+ 
			 '<pos>'+extent.right+' '+ extent.top+'</pos>'+ 
			 '</BoundingBox>'; 
	}


	var xmlToSend =
		 '<navici_request>'+
		  '<ajax_request_object object_id="4" service="Geocoding">'+
		   '<Request methodName="LocationRequest" requestID="0" maximumResponses="'+SEARCHRESULTLISTMAXLENGTH+'">'+
		    '<LocationRequest>'+
		     '<FreeFormLocationName matchMethod="MatchFallbackStart">'+
				placeName+
		     '</FreeFormLocationName>'+
		     
		     boundingBoxXml +
		     
		     '<LocationTypeList>'+
		      '<LocationType name="POI" />'+
		     '</LocationTypeList>'+
		     '<POIProperties>'+
		     '<POIProperty name="POIClass" classIds="'+poiClassesString+'"  />'+
		     '</POIProperties>'+
		     
			'<SortBy>'+ 
			'<OrderElement name="Quality" order="descent" case="insensitive" />'+
			'<OrderElement name="POI" order="ascent" case="sensitive" />'+
			'<OrderElement name="Municipality" order="ascent" case="sensitive" />'+ 
			'</SortBy>'+	     
		    '</LocationRequest>'+
		   '</Request>'+
		  '</ajax_request_object>'+
		 '</navici_request>';

	httpObject = getHTTPObject();
	if (httpObject != null) {
//		httpObject.open("POST", "./php/ajaxRequest.php", true);
		httpObject.open("POST", activeCombo.ajaxUrl, true);
		httpObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		httpObject.send("requestXml=" + xmlToSend);
		httpObject.onreadystatechange = searchByPlacenameCallback;
	}

}


/*
 *	Gets the poiclasses for the request.
 *  Separator = separatorcharacter to use with the string. Nimihaku = |, paikannimihaku ','...
*/
function getPoiclassesForActiveCombo(separator) {
	
	if (!separator)
		separator = ',';
	var boxes = document.getElementsByName(activeCombo.categoryChkGroupName);
	var poiClassesString = '';
	for (var i = 0; i < boxes.length; i++) {
		if (boxes[i].checked) {
			poiClassesString += boxes[i].value+separator;
		}
	}
	//remove the last ' , '
	return poiClassesString.substr(0, poiClassesString.length-1);
	return poiClassesString;
}

function searchByNameCallback() {

	 if(httpObject.readyState == 4) {
		var xml = httpObject.responseXML;
		var locations = xml.getElementsByTagName('location');
		var itemArray = [];
		
		for(var i = 0; i < locations.length; ++i) {
			var item = new Ext.data.Record({

//				displayfield: locations[i].attributes.getNamedItem('name').nodeValue+', '+locations[i].attributes.getNamedItem('category').nodeValue,
				displayfield: 	'<img src="images/'+locations[i].attributes.getNamedItem('category').nodeValue+'_green.gif">&nbsp;'+
								locations[i].attributes.getNamedItem('name').nodeValue,
				lonlat: new OpenLayers.LonLat(locations[i].attributes.getNamedItem('x').nodeValue,
											  locations[i].attributes.getNamedItem('y').nodeValue),
				category: locations[i].attributes.getNamedItem('category').nodeValue,
				locationId: locations[i].attributes.getNamedItem('id').nodeValue,
				
				bounds: new OpenLayers.Bounds(	locations[i].attributes.getNamedItem('minx').nodeValue,
												locations[i].attributes.getNamedItem('miny').nodeValue,
												locations[i].attributes.getNamedItem('maxx').nodeValue,
												locations[i].attributes.getNamedItem('maxy').nodeValue),
				name: locations[i].attributes.getNamedItem('name').nodeValue,
				type: locations[i].attributes.getNamedItem('type').nodeValue,
				maplayer:locations[i].attributes.getNamedItem('maplayer').nodeValue
			});
			itemArray.push(item);
		}
		
		updateSearchCombo(itemArray);
	}
}

function searchByPlacenameCallback() {
	 if(httpObject.readyState == 4) {
		var xml = httpObject.responseXML;
		var pois = xml.getElementsByTagName('POI');
		var itemArray = [];
		
		for(var i = 0; i < pois.length; ++i) {
			var pos = pois[i].getElementsByTagName('pos')[0].firstChild.nodeValue.split(' ');
			var bbox = pois[i].getElementsByTagName('BoundingBox')[0];
			
			var leftbottom = bbox.getElementsByTagName('pos')[0].firstChild.nodeValue.split(' ');
			var righttop = bbox.getElementsByTagName('pos')[1].firstChild.nodeValue.split(' ');
			
			
			var dispField = pois[i].attributes.getNamedItem('POIName').nodeValue;//+ ', '+dispPlace+', '+dispCommunity; 
			
			var POIInfos = pois[i].getElementsByTagName("POIInfo");
			
			var kunta_s, kunta_r, paikka_s, paikka_r; 
			for (var z = 0; z < POIInfos.length; z++) {
			
				if (POIInfos[z].attributes.getNamedItem("name").value == "kunta_s")
					kunta_s = POIInfos[z].attributes.getNamedItem("value").value;
				else if (POIInfos[z].attributes.getNamedItem("name").value == "kunta_r") 
					kunta_r = POIInfos[z].attributes.getNamedItem("value").value;
				else if (POIInfos[z].attributes.getNamedItem("name").value == "paikka_s") 
					paikka_s = POIInfos[z].attributes.getNamedItem("value").value;
				else if (POIInfos[z].attributes.getNamedItem("name").value == "paikka_r") 
					paikka_r = POIInfos[z].attributes.getNamedItem("value").value;
			}
			
			if (LANGUAGE_SELECTION == 'se') {
				dispField = dispField +', '+paikka_r+', '+kunta_r;
			} else {
				dispField = dispField +', '+paikka_s+', '+kunta_s;
			}
				
			
			var item = new Ext.data.Record({
			
					displayfield: dispField,
					locationId: pois[i].attributes.getNamedItem('locationId').nodeValue,
					name: pois[i].attributes.getNamedItem('POIName').nodeValue,
					poiclass: pois[i].attributes.getNamedItem('poiClassId'),
					kunta: LANGUAGE_SELECTION=='se'?kunta_r:kunta_s,//pois[i].getElementsByTagName('Place')[0].firstChild.nodeValue,
					lonlat: new OpenLayers.LonLat(pos[0], pos[1]),
					//			l,b,r,t
					bounds: new OpenLayers.Bounds(leftbottom[0], leftbottom[1], righttop[0], righttop[1])
			});
			itemArray.push(item);
		}
		
		updateSearchCombo(itemArray);
	}
}

function updateSearchCombo(items) {

	//TODO: color the textbox if nothing found!

	if (!items || items.length == 0) {
		document.getElementById(activeCombo.inputId).style.color = "#FF0000"; 
//		document.getElementById(activeCombo.inputId).style.backgroundColor = "#FF0000"; 
	} else {
		document.getElementById(activeCombo.inputId).style.color = "#000000"; 
		//document.getElementById(activeCombo.inputId).style.backgroundColor = "#FFFFFF"; 
	}
	
	activeCombo.store.removeAll();
	activeCombo.store.add(items);
	
	if (activeCombo.isExpanded()) 
		activeCombo.collapse();

	activeCombo.focus();
	activeCombo.expand();
	activeCombo.onLoad();	
	document.body.style.cursor = "auto";
	document.getElementById(activeCombo.inputId).style.cursor = "auto";
//	updateSearchStatus();		
}


/*filter results based on changes in target type checkboxes.*/
function filterByCheckboxChanged(sender) {
	var name = document.getElementById(activeCombo.inputId).value;
	checkIfInputValid(name);
}

/*called, when a key is pressed in the searchbox.*/
var searchPhrase = null;
var keypressTimer = null;
var searchInputName = null;

/*paikannimihaku or nimihaku selectionlist.*/
var activeCombo = null;
function keyPressed(searchName, name, e) 
{
	if (searchName == 'paikannimihaku') {
		activeCombo = placenameCombo;
	} else if (searchName == 'nimihaku') {
		activeCombo = nameCombo;
	}

	/*key pressed in the active combo -> change the forecolor to black, might've been red if nothing was found.*/
	document.getElementById(activeCombo.inputId).style.color = "#000000";
	//Enter pressed -> perform search.
	if (e && checkKeyCode(e, 13)) {
		checkIfInputValid(name);
	}

	if (name != searchPhrase) {
	
		clearTimeout(keypressTimer);
	
		//1.9.2010 - ph - tämä käytössä vain nimihaulle!
		if (name.length >= SEARCHPHRASEMINLENGTH &&
			activeCombo.comboId == 'nimihaku' &&
			activeCombo.store.data.length &&
			activeCombo.store.data.length < SEARCHRESULTLISTMAXLENGTH &&
			name.indexOf(searchPhrase) == 0) {
				return;
		//if 0, the previous fetch results aren't cleared, but that might be a bit misleading... 
		} 
		if (name.length < SEARCHPHRASEMINLENGTH) {
			clearTimeout(keypressTimer);
//			placenameCombo.store.removeAll();
			activeCombo.store.removeAll();
		}
	
		keypressTimer = setTimeout('delayedCall()',KEYPRESSTIMERDELAY);
		searchPhrase = name;
	}
}

function delayedCall() {
	clearTimeout(keypressTimer);
	checkIfInputValid(searchPhrase);
}

//function checkIfInputValid(sender, e) 
function checkIfInputValid(name) 
{
//		var name = searchPhrase; 
		name = name.replace(/^\s+/,"");
		// right
		name = name.replace(/\s+$/,"");
		if (name.length >= SEARCHPHRASEMINLENGTH) {
	//		document.getElementById('buttonsearch').disabled = false;
			searchByPlace(name);
		}
}

function checkKeyCode(e, code) {

	var characterCode; // literal character code will be stored in this variable
	
	if(e && e.which) { //if which property of event object is supported (NN4)
		e = e;
		characterCode = e.which; //character code is contained in NN4's which property
	}
	else{
		e = window.event;
		characterCode = e.keyCode; //character code is contained in IE's keyCode property
	}

	//backspace = 8, enter = 13
	if(characterCode == code){ //if generated character code is equal to ascii 13 (if enter key)
		return true;
	}
	return false;

}


function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

