var indent = "\xa0\xa0\xa0\xa0";
var empty_text = "\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0";

var finlandRegions = new Array();
var finlandFlag = false;
var foreignflag = false;

/* Alustetaan aluerajauskenttien päivittämisessä tarvittavat funktiot sekä 
maakunta-maakenttä*/
function initAreaSelection() {
	//Tallennetaan checkboxien tila
	if(document.searchform.location_finland.checked) {
		finlandFlag = true;
	}
	if(document.searchform.location_foreign.checked) {
		foreignFlag = true;
	}
	//Etsitään tietorakenteesta Suomen maakunnat sisältävä taulukko
	for(i = 0; i < level_a.length; i++) {
		if(level_a[i][1] == "Suomi") {
			finlandRegions = level_b[level_a[i][0]];
		}
	}
	//Päivitetään alue- ja aluetarkennus-selectit vastaamaan sivupyynnön parametreista
	//kaivettuja valintoja
	updateRegions();
	updateAreas();
}

/* funktio, jolla tallennetaan maa/maakuntavalinnat */
function saveRegionSelections() {
	selectedRegions = new Array();
	//Otetaan alueiden valinnat talteen
	for(var i = 0 ; i < document.searchform.location_region_country.options.length ; i++) {
        if(document.searchform.location_region_country.options[i].selected && 
           document.searchform.location_region_country.options[i].value != "") {
        	selectedRegions[document.searchform.location_region_country.options[i].value] = true;
        } else {
        	selectedRegions[document.searchform.location_region_country.options[i].value] = false;
        }
    }
}

/* Funktio, joka asettaa ja poistaa Suomen maakunnat sekä ulkomaat aluerajauskentästä */
function updateRegions() {
	document.searchform.location_region_country.length = 0;
	if(document.searchform.location_finland.checked) {
		//Selectin kärkeen valinta Koko Suomi (Ei löydy hierarkiasta). Jos Suomi-checkboxin 
		//tila on muuttunut viime päivityksen jälkeen, merkataan "koko suomi" valituksi.
		var opt = new Option("Koko Suomi", "0", false, false);
    	if(selectedRegions['0'] || !finlandFlag) {
    		opt.selected="selected";
    	}
		document.searchform.location_region_country[document.searchform.location_region_country.length] = opt;
		for(i = 0; i < finlandRegions.length; i++) {
	    	opt = new Option(finlandRegions[i][1], finlandRegions[i][0], false, false);
	    	//Jos maakunta valittuna, merkataan se valituksi
	    	if(selectedRegions[finlandRegions[i][0]]) {
	    		opt.selected="selected";
	    	}
			document.searchform.location_region_country[document.searchform.location_region_country.length] = opt;
		}
	}
	//Tyhjä väliin jos on sekä ulkomaat että Suomi valittuna
	if(document.searchform.location_foreign.checked && document.searchform.location_finland.checked) {
		var opt = new Option("-----", "", false, false);
		opt.disabled = "disabled";
		document.searchform.location_region_country[document.searchform.location_region_country.length] = opt;	
	}
	if(document.searchform.location_foreign.checked) {
		for(i = 0; i < level_a.length; i++) {
			if(level_a[i][1] != "Suomi") {
		    	var opt = new Option(level_a[i][1], level_a[i][0], false, false);
		    	//Jos maa oli valittuna, merkataan se valituksi. Jos Ulkomaat-checkboxin
		    	//tila on muuttunut edellisessä päivityksessä tallennetusta, 
		    	//merkataan kaikki ulkomaat valituiksi
		    	if(selectedRegions[level_a[i][0]] || !foreignFlag) {
		    		opt.selected="selected";
		    	}
				document.searchform.location_region_country[document.searchform.location_region_country.length] = opt;	
			}
		}
	}

	//Tallennetaan checkboxien tila
	if(document.searchform.location_finland.checked) {
		finlandFlag = true;
	} else {
		finlandFlag = false;
	}
	if(document.searchform.location_foreign.checked) {
		foreignFlag = true;
	} else {
		foreignFlag = false;
	}
}

/* Funktio, jota kutsutaan Suomi- ja Ulkomaat-checkboxien onClick-eventillä. 
   Tallennetaan maa/maakuntavalinnat ja päivitetää selecti */
function regionCountryUpdate() {
	saveRegionSelections();
	updateRegions();
}

/* Funktio, jolla otetaan talteen aluetarkennuksen valinnat */
function saveAreaSelections() {
	selectedAreas = new Array();
	for(var i = 0 ; i < document.searchform.location_area.options.length ; i++) {
        if(!selectedAreas[document.searchform.location_area.options[i].value]) {
	        if(document.searchform.location_area.options[i].selected && 
	           document.searchform.location_area.options[i].value != "") {
	        	selectedAreas[document.searchform.location_area.options[i].value] = true;
	        } else {
	        	selectedAreas[document.searchform.location_area.options[i].value] = false;
	        }
	    }
    }
}

/* Funktio, joka päivittää Suomen kunnat maakuntavalinnan mukaiseksi */
function updateAreas() {
	//Tyhjätään kuntaselecti
	document.searchform.location_area.length = 0;
	
	var areas = new Array();
	var uusimaaSpecialCases = new Array();
	var regions = new Array();
	
	//Jos maa/maakuntaselecti on tyhjä, ei tarvitse tehdä enää mitään
	if(document.searchform.location_region_country.options.length == 0) {
		return;
	}

	//Jos valkattuna on Koko Suomi, lisätään selectiin kaikki Suomen kunnat
	//(eli asetetaan käsiteltäviksi maakunniksi kaikki riippumatta siitä onko 
	//niitä valittu)
	if(document.searchform.location_region_country.options[0].text == "Koko Suomi" &&
	   	document.searchform.location_region_country.options[0].selected) {
	   	regions = finlandRegions;
	} else {
		//Muuten lisätään vain valittujen maakuntien kunnat
		for(i = 0; i < document.searchform.location_region_country.options.length; i++) {
			var option = document.searchform.location_region_country.options[i];
			if(option.selected) {
				regions[regions.length] = new Array(option.value, option.text);
			}
		}
	}

	//Etsitään valittujen maakuntien kunnat ja kerätään ne taulukkoon areas
	for(var i = 0; i < regions.length; i++) {
		var region = regions[i];
		//Koitetaan hakea maakunnan kunnat (regions-taulukossa olevat alkiot ovat joko
		//maita tai maakuntia -> jos maa, kuntia ei tietenkään löydy level_c-taulukosta.)
		var municipalities = level_c[region[0]];
		
		//Jos kuntia löytyi, asetetaan niitä vastaava optionit taulukkoon
		if(municipalities && municipalities.length && municipalities.length > 0) {
			//Jos valittuna oli Uusimaa, pitää tehdä hieman kikkailua. Nostetaan 
			//Uudenmaan yleisimmät valinnat kärkeen.
//			if(region[1] == "Uusimaa") {
//		        var helsinki;
//		        var helsinkiN;
//		        var helsinkiE;
//		        var helsinkiS;
//		        var helsinkiW;
//		        var espoo;
//		        var vantaa;
//		        var kauniainen;
//	        	for(var k = 0; k < municipalities.length; k++) {
//	        		var city = municipalities[k];
//	        		if(city[1] == "Helsinki") {
//	        			helsinki = new Option(city[1], city[0], false, false);
//				    	//Jos kunta oli valittuna, merkataan se valituksi
//				    	if(selectedAreas[city[0]]) {
//				    		helsinki.selected="selected";
//				    	}
//	        		} else if(city[1] == "Helsinki, pohjoinen") {
//	        			helsinkiN = new Option(city[1], city[0], false, false);
//				    	//Jos kunta oli valittuna, merkataan se valituksi
//				    	if(selectedAreas[city[0]]) {
//				    		helsinki.selected="selected";
//				    	}
//	        		} else if(city[1] == "Helsinki, itä") {
//	        			helsinkiE = new Option(city[1], city[0], false, false);
//				    	//Jos kunta oli valittuna, merkataan se valituksi
//				    	if(selectedAreas[city[0]]) {
//				    		helsinki.selected="selected";
//				    	}
//	        		} else if(city[1] == "Helsinki, länsi") {
//	        			helsinkiW = new Option(city[1], city[0], false, false);
//				    	//Jos kunta oli valittuna, merkataan se valituksi
//				    	if(selectedAreas[city[0]]) {
//				    		helsinki.selected="selected";
//				    	}
//	        		} else if(city[1] == "Helsinki, etelä") {
//	        			helsinkiS = new Option(city[1], city[0], false, false);
//				    	//Jos kunta oli valittuna, merkataan se valituksi
//				    	if(selectedAreas[city[0]]) {
//				    		helsinki.selected="selected";
//				    	}
//	        		} else if(city[1] == "Espoo") {
//	        			espoo = new Option(city[1], city[0], false, false);
//				    	//Jos kunta oli valittuna, merkataan se valituksi
//				    	if(selectedAreas[city[0]]) {
//				    		helsinki.selected="selected";
//				    	}
//	        		} else if(city[1] == "Vantaa") {
//	        			vantaa = new Option(city[1], city[0], false, false);
//				    	//Jos kunta oli valittuna, merkataan se valituksi
//				    	if(selectedAreas[city[0]]) {
//				    		helsinki.selected="selected";
//				    	}
//	        		} else if(city[1] == "Kauniainen") {
//	        			kauniainen = new Option(city[1], city[0], false, false);
//				    	//Jos kunta oli valittuna, merkataan se valituksi
//				    	if(selectedAreas[city[0]]) {
//				    		helsinki.selected="selected";
//				    	}
//	        		}
//	        		//Lisätään kuntaa vastaava optio areas-taulukkoon
//			    	var temp = new Option(city[1], city[0], false, false);
//			    	//Jos kunta oli valittuna, merkataan se valituksi
//			    	if(selectedAreas[city[0]]) {
//			    		temp.selected="selected";
//			    	}
//					areas[areas.length] = temp;
//	        	}
//		        uusimaaSpecialCases = new Array(helsinki, helsinkiS, helsinkiE, helsinkiW, helsinkiN, espoo, vantaa, kauniainen);
//	        } else {
	        	//Jos maakunta != Uusimaa, lisätään sen kuntia vastaavat optiot 
	        	//taulukkoon ilman kikkailuja
		    	for(var j = 0; j < municipalities.length; j++) {
			    	var temp = new Option(municipalities[j][1], municipalities[j][0], false, false);
			    	//Jos kunta oli valittuna, merkataan se valituksi
			    	if(selectedAreas[municipalities[j][0]]) {
			    		temp.selected="selected";
			    	}
					areas[areas.length] = temp;
				}
//			}
		}
	}
	
	//Lopuksi lisätään löydettyjen kuntien optiot varsinaiseen selectiin
   	//Lisätään uudenmaan erikoisvalinnat selectin alkuun
	if(uusimaaSpecialCases.length && uusimaaSpecialCases.length > 0) {
	    for(var j = 0; j < uusimaaSpecialCases.length; j++) {
		  	var temp = uusimaaSpecialCases[j];
		    document.searchform.location_area.options[document.searchform.location_area.options.length] = temp;
		}
		//Erotin. Erottimella ei ole arvoa eikä sitä voi valita.
		temp = new Option("-----", "", false, false);
		temp.disabled = "disabled";
		document.searchform.location_area.options[document.searchform.location_area.options.length] = temp;
	}
	//Sortataan loput kunnat
	areas.sort(compareOptions);
	//Laitetaan loput kunnat selectiin
   	for(var j = 0; j < areas.length; j++) {
		document.searchform.location_area.options[document.searchform.location_area.options.length] = areas[j];
	}
}

/* Funktio, jota kutsutaan alueselectin onChange-eventillä. Päivitetään 
   aluetarkennusselecti */
function areaUpdate() {
	saveAreaSelections();
	updateAreas();
}

/* Selectin optioiden tekstien vertailufunktio sorttausta varten*/
function compareOptions (option1, option2) {
  return option1.text < option2.text ? -1 : option1.text > option2.text ? 1 : 0;
}

//Valittujen alueiden näyttö hakulomakkeella listavalintakenttien alla
var areaForm;	//form
var areaFormAction;	//form action for area get
var areaFormTarget;	//form target for area get
var areaFormOrigAction;	//original form action
var areaFormOrigTarget;	//original form target
var lastSubmitTime=0;	//date of last area submit
var areaRequestInterval=100;	//interval of area requests
var isChanged=true;	//params changed
var isRunning=false;	//timeout thread running

function areaDisplayInit(form, action, target, interval) {
	areaForm = form;
  	areaFormAction = action;
  	areaFormTarget = target;
  	areaRequestInterval = interval;
  	areaFormOrigAction = document.getElementById(form).action;
  	areaFormOrigTarget = document.getElementById(form).target;
}

function areaDisplayUpdate() {
	isChanged=true;
  	areaDisplayUf();
}	

function areaDisplayUf(r) {
  if (r)
	isRunning=false;
  if (isChanged) {
	var t=(new Date()).getTime();
	if (t - lastSubmitTime > areaRequestInterval) {
	  lastSubmitTime = t;
	  document.getElementById(areaForm).action = areaFormAction;
	  document.getElementById(areaForm).target = areaFormTarget;
	  isChanged = false;
	  document.getElementById(areaForm).submit();
	} else if (!isRunning) {
	  isRunning = true;
	  window.setTimeout("areaDisplayUf(true)", areaRequestInterval - (t - lastSubmitTime));
	}
  }
}

function areaDisplayShutdown() {
  lastSubmitTime=new Date(2050,1,1);
  document.getElementById(areaForm).action=areaFormOrigAction;
  document.getElementById(areaForm).target=areaFormOrigTarget;
}	
