/*  pt_suggestionMenu.js
	style.visibility 		-> style.display
	visibility = 'hidden' 	-> display = 'none'
	visibility = 'visible' 	-> display = 'block'
*/


/*** constants ***/
var s_queryUrl = "db_locations.php";
//page elements: flights
var s_leavingFromElId = "text_fly_from";
var s_goingToElId = "text_fly_to";

var s_suggFromMenuId = "suggFromSelectId";
var s_suggToMenuId = "suggToSelectId";

var s_fromHiddenFieldId = "from_IATA";
var s_toHiddenFieldId = "to_IATA";

var s_f_nextTabStopId = "fly_there_day";

//T-K: lisäsin nämä, kun sugg.menulla pitää olla eri id fh:ssa, koska id on uniikki
//page elements: flight+hotel
var s_fh_fromElId = "fh_text_from";
var s_fh_toElId = "fh_text_to";

var s_fh_suggFromMenuId = "fh_suggFromSelectId";
var s_fh_suggToMenuId = "fh_suggToSelectId";

var s_fh_fromHiddenId = "fh_from_IATA";
var s_fh_toHiddenId = "fh_to_IATA";

var s_fh_nextTabStopId = "fh_there_day";

//public variables
var s_suggestionsArr = new Array();		//the background array
var s_menuRowArr = new Array();			//the array to show
var s_key = "";
var i_oldNoSugg = 0;					//used to empty the select element of old options
var i_maxMenuSize = 10;
var i_searchType = 1;
var i_queryArraySize = 0;
var b_queryready = false;
/********************************************************************************
* Event handlers                                                                *
*********************************************************************************/

function suggMenuOnBodyClick(e, searchCode) {
   if (!e)
      var e = window.event;

   i_searchType = searchCode;
   //get the element in which the event took place
   var targ;
   if (e.target)
      targ = e.target;
   else if (e.srcElement)
      targ = e.srcElement;
   if (targ.nodeType == 3) // defeat Safari bug
      targ = targ.parentNode;

	//flight search
	//if(i_searchType == 1) {
      if(document.getElementById(s_suggFromMenuId) && document.getElementById(s_suggFromMenuId).style.display == "block") {
        hideSuggestionMenu(s_suggFromMenuId, false);
        return;
      }
      else if(document.getElementById(s_suggToMenuId) && document.getElementById(s_suggToMenuId).style.display == "block") {
        hideSuggestionMenu(s_suggToMenuId, false);
        return;
      } //TK: jatketaan, jos kumpikaan ei tärpännyt, ehkä kyse fh suggestionmenusta
      else if(document.getElementById(s_fh_suggFromMenuId) && document.getElementById(s_fh_suggFromMenuId).style.display == "block") {
        hideSuggestionMenu(s_fh_suggFromMenuId, false);
        return;
      }
      else if(document.getElementById(s_fh_suggToMenuId) && document.getElementById(s_fh_suggToMenuId).style.display == "block") {
        hideSuggestionMenu(s_fh_suggToMenuId, false);
        return;
      } else
      	return;
   	//}
/*	//flight+hotel search
	else if(i_searchType == 4) {
  	  if(document.getElementById(s_suggFromMenuId).style.display == "block") {
        hideSuggestionMenu(s_suggFromMenuId, false);
        return;
      }
      else if(document.getElementById(s_suggToMenuId).style.display == "block") {
        hideSuggestionMenu(s_suggToMenuId, false);
        return;
      }
      else
        return;
   	
	}
*/
}

function onMenuClick(s_elId, b_show, searchCode) {
	i_searchType = searchCode;

    updateSuggestionView(s_elId, b_show);
    var e_textField = getTextField(s_elId);
    e_textField.focus();
}

function textField_mouseEventHandler(event, s_elId, searchCode) {
	i_searchType = searchCode;
	s_menuRowArr.length = 0;
	s_suggestionsArr.length = 0;
	onChangePlaceNameField(s_elId);
}

/*****************************************************************
* Key event handlers                                             *
******************************************************************/

function textField_keyEventHandler(e, s_elId, searchCode) {
	i_searchType = searchCode;
	
   if (!e)
      var e = window.event;

   if (e.keyCode)
     code = e.keyCode;
   else if (e.which)
     code = e.which;

 //get the element in which the event took place
   var targ;
   if (e.target)
      targ = e.target;
   else if (e.srcElement)
      targ = e.srcElement;
   if (targ.nodeType == 3) // defeat Safari bug
      targ = targ.parentNode;

   switch (code) {
      //backspace
      //case 8:
      //   onChangePlaceNameField(targ.id);
	  //	 break;
      //tab: hide without changing the selection
	  case 9:          	
		//we're out of these text fields
		if(targ.id == s_goingToElId)
			hideSuggestionMenu(s_suggFromMenuId, false);		
		else if(targ.id = s_fh_toElId)
			hideSuggestionMenu(s_fh_suggFromMenuId, false);		
		break;
      //enter: hide without changing the selection
      case 13:	hideSuggestionMenu(targ.id, false);	 break;
      //esc: hide without changing the selection
      case 27:
         hideSuggestionMenu(targ.id, false);
         var e_textField = getTextField(targ.id);
         e_textField.focus();
         break;
	  //end	
	  case 35:	break;
	  //home
	  case 36:	break;
      //arrow left
      case 37:  break;
      //arrow up
      case 38:  break;
      //arrow right
      case 39: 	break;
      //arrow down
      case 40:   	 		
            var e_select;         
			var b_res = updateSuggestionView(s_elId, true);
         	if(s_suggestionsArr.length > 0){
	        	e_select = getSuggSel(targ.id);
	           	e_select.selectedIndex = 0;
	          	e_select.focus();	       
			}
	        break;
	    default: {
		    onChangePlaceNameField(targ.id); //TK: lisäsin searchcoden ,searchCode
			break;
		}
	}
}


function suggSelect_keyEventHandler(e, s_elId, searchCode) {
	i_searchType = searchCode;

    if (!e)
	  var e = window.event;

	if (e.keyCode)
	  code = e.keyCode;
	else if (e.which)
	  code = e.which;

	//get the element in which the event took place
    var targ;
	if (e.target)
	    targ = e.target;
	else if (e.srcElement)
	    targ = e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;

    var e_select;
    switch (code) {
        //sarkain
        case 9:
			hideSuggestionMenu(targ.id, false);
			//is this needed?
			//document.getElementById(s_f_nextTabStopId).focus();
	        break;
        //enter
	    case 13:
	        updateSuggestionView(targ.id, false);
	        var e_textField = getTextField(targ.id);
	        e_textField.focus();
	        break;
        //esc
        case 27:
            hideSuggestionMenu(targ.id, false);
            var e_textField = getTextField(targ.id);
            e_textField.focus();
            break;
  		//arrow up
      	case 38:
			var e_select = getSuggSel(targ.id);
			if(e_select.selectedIndex == 0) {
				var e_textField = getTextField(targ.id);
            	e_textField.focus();				
				e_select.selectedIndex = -1;
			}
         	break;
	    default:
		    break;
	}
}


/*** suggMenuFix ***/
//this is needed to make the tabulator events work
function suggMenuFix(e, s_elId) {
	if(s_elId == s_f_nextTabStopId) {
		if(document.getElementById(s_suggToMenuId).display != "none") {
 			hideSuggestionMenu(s_suggToMenuId, false);	
			document.getElementById(s_elId).focus();
		}
	}	
	else if(s_elId == s_fh_nextTabStopId) {
		if(document.getElementById(s_fh_suggToMenuId).display != "none") {
 			hideSuggestionMenu(s_fh_suggToMenuId, false);	
			document.getElementById(s_elId).focus();
		}	
	}
}

/************************************************************************************************
* Other functions		                    													*
*************************************************************************************************/

function onChangePlaceNameField(s_elId) {
		
	//text field has changed, empty the hidden IATA-field (or a mouse event has occurred in the text field, and we don't know what has happened to the value in it)
	var e_hidden = getHiddenSendField(s_elId);
	e_hidden.value = "";		
	

	//if making a new query, or if the keyfield has changed, make sure the suggestions array is empty
    if(document.getElementById(s_elId).value.length<3/* || (s_key!="" && !document.getElementById(s_elId).value.match(s_key))*/) {
		if(s_suggestionsArr.length > 0) {
			//alert("nollataan suggarr")
			s_suggestionsArr.length = 0;
			s_menuRowArr.length = 0;
			hideSuggestionMenu(s_elId, false);	  			
		}		
	}
	//else 
	//	alert(document.getElementById(s_elId).value +", "+ s_key);

   	var b_sugg = checkWhetherToSuggest(s_elId);
	//if we do want to give suggestions
   	if(b_sugg) {		
      	i_oldNoSugg = s_suggestionsArr.length;

    	//empty the array to show
    	s_menuRowArr.length = 0;     
    	var b_ok = false;
		//create suggestions
    	b_ok = createSuggestions(s_elId);
		//if there are suggestions
      	if(b_ok)
         	updateSuggestionView(s_elId, true);
      	else 
			hideSuggestionMenu(s_elId, false);
    } 
}

function checkWhetherToSuggest(s_elId) {
   var s_inputText = document.getElementById(s_elId).value;
   if(s_inputText.length >= 3)
      return true;
   else
      return false;  
}

function createSuggestions(s_elId) {
   	s_key = document.getElementById(s_elId).value;

	//modify to not to contain umlaut letters
	var i_u_uml = s_key.search(/ü/i);
	if(i_u_uml > -1)
		s_key.replace(/ü/, "ue");
	
	
	var b_querysuccess = false;

	//empty the array to show
	if(s_menuRowArr)
		s_menuRowArr.lenght = 0;
	
   	//if the query has already been made, select the appropiate suggestions from the s_suggestionsArr
   	if(s_key.length > 3 && s_suggestionsArr.length > 0) {	
		pruneSuggestions(s_elId);
		b_querysuccess = true;		
	//if making a new query	      
   	} else {
		//make a new query and copy all the suggestions to the array to show
      	b_querysuccess = sendSuggestionQuery(s_key);				
		for(l=0; l<s_suggestionsArr.length; l++) {
			s_menuRowArr[l] =  new Array(s_suggestionsArr[l][0], s_suggestionsArr[l][1], s_suggestionsArr[l][2], s_suggestionsArr[l][3], s_suggestionsArr[l][4], s_suggestionsArr[l][5]);
		}
	}
   	return b_querysuccess;
}

function pruneSuggestions(s_elId) {
	//var s_keyFirstLetter = s_key.substring(0,1);
	//var s_keyOtherLetters = s_key.substring(1);
	var s_keyLC = s_key.toLowerCase();

	//var s_keyWithBigFirstLetter = s_keyFirstLetter.toUpperCase() + s_keyOtherLetters.toLowerCase();
	//var s_keyInUpper = s_key.toUpperCase();
	//var s_keyInLower = s_key.toLowerCase();		

	var i_menuRowInd = 0;

	//go through the whole suggestions array in search of a match
    for(n=0; n<s_suggestionsArr.length; n++) {
       	var b_match = false;            
		//check all of the fields of a row
        for(p=0; p<6; p++) {
			//match() is case sensitive, so let's turn the suggestion lower-case
	        s_suggLC = s_suggestionsArr[n][p].toLowerCase();
			if(s_suggLC.match(s_keyLC) != null) {
				b_match = true;
    	        break;
            }
        }

		//if a match, add to the array to show
		if(b_match) {
			s_menuRowArr[i_menuRowInd] = s_suggestionsArr[n]; //new Array(s_suggestionsArr[n][0], s_suggestionsArr[n][1], s_suggestionsArr[n][2], s_suggestionsArr[n][3], s_suggestionsArr[n][4], s_suggestionsArr[n][5]);
			i_menuRowInd++;
		}			 			
    }		 
}

function updateSuggestionView(s_elId, b_show) { 
    var s_text = "";
    var e_suggMenu = getSuggSel(s_elId);

	//alert("update, queryready "+b_queryready)
    /*
    if(s_elId == undefined || s_elId == "" || s_elId == null) {
        // !updateSuggestionView(s_leavingFromElId, false);
        //updateSuggestionView(s_goingToElId, false);
    }
	*/	
   //if we're to show the menu, and there are suggestions
	//alert("begin handling of results, menurow "+s_menuRowArr.length+", suggArr "+s_suggestionsArr.length)
   if(b_show && s_menuRowArr.length > 0) {
		//alert("in, bshow ja length "+s_menuRowArr.length)
      	//set the size of the suggestion menu
		if(s_menuRowArr.length < e_suggMenu.size) {
         	if(s_menuRowArr.length == 1)
 	    		e_suggMenu.size = 2;
 	 		else
   	    		e_suggMenu.size = s_menuRowArr.length;
		}
	 	else if(s_menuRowArr.length > e_suggMenu.size && s_menuRowArr.length <= i_maxMenuSize)
  	    	e_suggMenu.size = s_menuRowArr.length;
		else if(s_menuRowArr.length > e_suggMenu.size)
			e_suggMenu.size = i_maxMenuSize;

		//remove the old options
        if(e_suggMenu.length > 0) {
           	var i_length = e_suggMenu.length;
	    	for(i=0; i<i_length; i++)
    	    	e_suggMenu.remove(0);
        }		

		//read the suggestions to the select and modify the output in the array to show
        for(j=0; j<s_menuRowArr.length; j++){
			var s_row = ""; 
			
			/* what we have is in form "city_en, city_fi, airport_name, iata_code, country_en, country_fi"	
			*/
			//if there is a Finnish city name, and an airport name
	 		if(s_menuRowArr[j][1] != "" && s_menuRowArr[j][2] != "") {
				if(s_menuRowArr[j][2] == "Metropolitan Area" || s_menuRowArr[j][2] == "Metropolian Area" || s_menuRowArr[j][2] == "Tokyo Metropolitan Area")
					s_row = s_menuRowArr[j][1] + ", kaikki kentät (" + s_menuRowArr[j][5] + ") " +  s_menuRowArr[j][3]; 
				else
	    			s_row = s_menuRowArr[j][1]+", "+s_menuRowArr[j][2]+" ("+ s_menuRowArr[j][5]+") "+ s_menuRowArr[j][3];
			}
			//if no airport name, but the Finnish city name is ok
			else if(s_menuRowArr[j][1] != "") {				
	        	s_row = s_menuRowArr[j][1] + " (" + s_menuRowArr[j][5] + ") " + s_menuRowArr[j][3];
			}
			//if no Finnish city name, but the airport is fine
			else if(s_menuRowArr[j][2] != "") {							
				if(s_menuRowArr[j][2] == "Metropolitan Area" || s_menuRowArr[j][2] == "Metropolian Area")
					s_row = s_menuRowArr[j][0] + " kaikki kentät (" + s_menuRowArr[j][5] + ") " +  s_menuRowArr[j][3]; 
				else
					s_row = s_menuRowArr[j][0]+" "+s_menuRowArr[j][2]+" ("+s_menuRowArr[j][5]+") "+s_menuRowArr[j][3];
			}
			//if both are missing, write the English city name, country and airport code
			else  
				s_row = s_menuRowArr[j][0] + " (" + s_menuRowArr[j][5] + ") " + s_menuRowArr[j][3];   	 			
      		 	
			//add the suggestion text to select
			var e_option = document.createElement("option");
           	e_option.text = s_row;

	   		try 		{ e_suggMenu.add(e_option, null);
	   		} catch (e) { e_suggMenu.add(e_option);	}
       	}

       	//if there's only one option, add an empty one for another
       	if(e_suggMenu.size == 1) {
          	var e_option = document.createElement("option");
          	e_option.text = s_menuRowArr[i];

	  		try 		{ e_suggMenu.add(e_option, null); 
	  		} catch (e) { e_suggMenu.add(e_option); }
      	}
      	showSuggestionMenu(s_elId);
   	}

   	//else hide suggestions
   	else {
		//remove old options
        if(s_menuRowArr.length <= 0) {
	    	for(i=0; i<i_oldNoSugg; i++)
        		e_suggMenu.remove(0);
		}
        hideSuggestionMenu(s_elId, true);
    }
}

function showSuggestionMenu(s_elId) {
    var e_suggMenu = getSuggSel(s_elId);	
    e_suggMenu.style.display = "block";
}

function hideSuggestionMenu(s_elId, b_changeSel) {
    if(s_elId == undefined || s_elId == "" || s_elId == null) {
    	try {
       		hideSuggestionMenu(s_leavingFromElId, false);
       		hideSuggestionMenu(s_goingToElId, false);
		} catch (err){;}
		//TK: lisäsin tämän, jotta toimisi myös fh:ssa? voi olla ihan turha, samoin try catch
		try {
       		hideSuggestionMenu(s_fh_fromElId, false);
       		hideSuggestionMenu(s_fh_toElId, false);
		} catch (err){;}
       return;
    }

    var e_textField = getTextField(s_elId);
    var e_suggMenu = getSuggSel(s_elId);
	var e_hidden = getHiddenSendField(s_elId);

   //if(!e_suggMenu)
   //  

	//if the selection should be changed and an option has been selected
	if(b_changeSel && e_suggMenu.selectedIndex >= 0) {
		var s_selectedText = e_suggMenu.options[e_suggMenu.selectedIndex].text;
		if(e_suggMenu.style.display == "block")  {
			e_textField.value = s_selectedText;
			var i_IATAind = s_selectedText.lastIndexOf(")") +2;
			e_hidden.value = s_selectedText.substr(i_IATAind, 3);		
		}
	}

	//TK: välillä kun pyyhkii vanhaa arvoa kentistä pois, tulee virhe, että e_suggMenu has no properties, kun yritin korjata
	//laittamalla tarkistuksen sen olemassolosta, ei menu hävinnyt enää ollenkaan..
   	e_suggMenu.style.display = "none";
   	
}


/***************************************************************
* funktiot getSuggSel, getSuggDiv ja getTextField
*
***************************************************************/

function getSuggSel(s_elId) {
//    if(s_elId == "" || s_elId == "undefined")
//	return;
    var e_suggSel;
	
	if(s_elId == s_suggFromMenuId || s_elId==s_suggToMenuId || s_elId==s_leavingFromElId || s_elId==s_goingToElId) { //TK: i_searchType == 1
    	if(s_elId==s_leavingFromElId || s_elId==s_suggFromMenuId) 
	    	e_suggSel = document.getElementById(s_suggFromMenuId);	
		else if(s_elId ==s_goingToElId || s_elId==s_suggToMenuId) 
        	e_suggSel = document.getElementById(s_suggToMenuId);    
	} 
	else if (s_elId == s_fh_suggFromMenuId || s_elId==s_fh_suggToMenuId || s_elId==s_fh_fromElId ||s_elId==s_fh_toElId) { //TK: i_searchType == 4
    	if (s_elId == s_fh_fromElId || s_elId==s_fh_suggFromMenuId)
        	e_suggSel = document.getElementById(s_fh_suggFromMenuId);	
		else if(s_elId ==s_fh_toElId || s_elId==s_fh_suggToMenuId) 
        	e_suggSel = document.getElementById(s_fh_suggToMenuId);
	}
	return e_suggSel;
}

function getTextField(s_elId) {
    var e_textField;
    
	if(s_elId == s_suggFromMenuId || s_elId==s_suggToMenuId || s_elId==s_leavingFromElId || s_elId==s_goingToElId) { //TK: i_searchType == 1
    	if(s_elId==s_suggFromMenuId || s_elId==s_leavingFromElId) 
	    	e_textField = document.getElementById(s_leavingFromElId);	
		else if(s_elId==s_suggToMenuId || s_elId==s_goingToElId) 
        	e_textField = document.getElementById(s_goingToElId);
	} 
	else if (s_elId == s_fh_suggFromMenuId || s_elId==s_fh_suggToMenuId || s_elId==s_fh_fromElId ||s_elId==s_fh_toElId) { //TK: i_searchType == 4
		if(s_elId==s_fh_suggFromMenuId || s_elId==s_fh_fromElId) 
	    	e_textField = document.getElementById(s_fh_fromElId);	
		else if(s_elId==s_fh_suggToMenuId || s_elId==s_fh_toElId) 
        	e_textField = document.getElementById(s_fh_toElId);	
	}
    
    return e_textField;
}

//TK: tuli virhe e_hiddenistä, koska ei ollut tiedossa i_searchtype, eikä siksi menty ehdollisiin haaroihin
function getHiddenSendField(s_elId) {
	var e_hidden;

	if(s_elId == s_suggFromMenuId || s_elId==s_suggToMenuId || s_elId==s_leavingFromElId || s_elId==s_goingToElId) { //TK: muutin oli ennen i_searchType == 1
		if(s_elId == s_suggFromMenuId || s_elId==s_leavingFromElId) 
	    	e_hidden = document.getElementById(s_fromHiddenFieldId);			
		else if(s_elId==s_suggToMenuId || s_elId==s_goingToElId) 
    	    e_hidden = document.getElementById(s_toHiddenFieldId);    	
	}
   	else if (s_elId == s_fh_suggFromMenuId || s_elId==s_fh_suggToMenuId || s_elId==s_fh_fromElId ||s_elId==s_fh_toElId) { //TK: muutin oli ennen i_searchType == 4
    	if(s_elId == s_fh_suggFromMenuId || s_elId==s_fh_fromElId)
	    	e_hidden = document.getElementById(s_fh_fromHiddenId);		
		else if(s_elId==s_fh_suggToMenuId || s_elId==s_fh_toElId) 
    	    e_hidden = document.getElementById(s_fh_toHiddenId);    	
	}
	return e_hidden;
}

/***************************************
* AJAX
****************************************/

var xmlHttp;

function sendSuggestionQuery(s_key) {
  
   xmlHttp=GetXmlHttpObject();
   	if (xmlHttp==null)
		return false;
	
	var url=s_queryUrl;
	url=url+"?q="+s_key;
	url=url+"&sid="+Math.random();
	xmlHttp.onreadystatechange=stateChanged;	
	xmlHttp.open("GET",url,true);
	xmlHttp.send(null);
	return true;
}

function stateChanged() {   
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
        var response = xmlHttp.responseText;
        a_response = response.split("%#%");
        var i_ind = 0; //table index
        var row = a_response[i_ind];
        while (row != "%EOF%" && row != "EOF" && row != "%EOF") {
           row_results = row.split("%%");
           s_suggestionsArr[i_ind] = new Array(row_results[0], row_results[1], row_results[2], row_results[3], row_results[4], row_results[5]);
           i_ind++;
           row = a_response[i_ind];
		}
		i_queryArraySize = i_ind;		
		b_queryready = true;
 		//alert("query ready, array size "+i_queryArraySize)

	/*	alert("size "+i_queryArraySize)
	*/	return;
    }
/* 	else
 		alert("readyState"+xmlHttp.readyState)*/
}

function GetXmlHttpObject() {
    var objXMLHttp=null;
    if (window.XMLHttpRequest)
       objXMLHttp=new XMLHttpRequest();
    
    //IE
    else if (window.ActiveXObject) 
       objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP");
    
    return objXMLHttp;
}

