/* Requires SelectionList.js */
/* Requires RouteLocation.js */
/* Requires gui */

function isNum(value) {
	value = value.toString();
	for (var n = 0; n < value.length; n++){
		if (value.substring(n, n+1) < "0" || value.substring(n, n+1) > "9"){
			return false;
			}
	}
	return true;
}



function SearchFrame(mainElement,
		     suggestionList)
{
  this.getRouteLocation =
  function()
  {
    return _location;   
  };

  this.setRouteLocation =
  function(routeLocation)
  {
    if(routeLocation === null){
      return;
    }
  
      label = routeLocation.getName();      

    _addressElement.value = label;
    _previousQueryKey = label;

    _suggestionList.setState(SelectionList.STATE_INVISIBLE);
    _suggestionList.clear();  
 	
		var x = parseFloat(routeLocation.getX());
		var y = parseFloat(routeLocation.getY());
		var minx = parseFloat(routeLocation.getAttribute("minx"));
		var miny = parseFloat(routeLocation.getAttribute("miny"));
		var maxx = parseFloat(routeLocation.getAttribute("maxx"));
		var maxy = parseFloat(routeLocation.getAttribute("maxy"));
		var lmo_name = routeLocation.getAttribute("lmo_name");
		var stroke_color = routeLocation.getAttribute("stroke_color");
		var id = routeLocation.getAttribute("id");
		var zoom = routeLocation.getAttribute("zoom");
		var type = routeLocation.getType();
		
	if(x != null && y != null){
	
		if(type == 'area'){			
		   setMapEnvelope(x,y,minx,maxx,miny,maxy);	   
		   addShape(id,stroke_color,'',lmo_name);
	   }
	   if(type == 'line'){
	   		var width = 2 + parseInt(routeLocation.getAttribute("stroke_width"));
	   	  	addRouteShape(id,stroke_color,width,minx,maxx,miny,maxy);
			setMapEnvelope(x,y,minx,maxx,miny,maxy,AjaxMapsConfig.MAX_ZOOMINDEX_TO_SHOW_LINE_OBJECTS);
	   }
	   else{
	   	if(zoom!=null && zoom != 'undefined')
	   		setView(x,y,zoom);
		else
			setMapEnvelope(x,y,minx,maxx,miny,maxy);	
	   }	   
	}
 	  
    //_changeRouteLocation(routeLocation);
	
	window.scrollTo(0, 0);
	insertMarkToCheckBox("mapLayerMenuList",routeLocation.getAttribute("maplayer"));	
  };

  this.setSuggestions =
  function(locations)
  {
    if(locations.length < 1){
	 _suggestionList.clear();
      _suggestionList.setState(SelectionList.STATE_INVISIBLE); 
	  if(_addressElement.value.length > 2 && !isNum(_addressElement.value)){	  
	  	_addressElement.style.backgroundColor = '#FF6666';
	  }
	  else{
	  	 _addressElement.style.backgroundColor = '#FFFFFF';
		  }
    }
    else if(locations.length == 1 &&
	    _location !== null &&
	    _previousQueryKey == _addressElement.value){
	 _suggestionList.clear();
	  _addressElement.style.backgroundColor = '#FFFFFF';
      _suggestionList.setState(SelectionList.STATE_INVISIBLE); 
    }
    else{
	  _addressElement.style.backgroundColor = '#FFFFFF';
      _suggestionList.clear();
  
      var selectionListItems = new Array();

      for(var i in locations){

	label = locations[i].getName();
	
	if(locations[i].getNumber() !== null){
	  label += ' ';
	  label += locations[i].getNumber();
	}
	


	var elem = document.createElement('div');
	elem.appendChild(document.createTextNode(label));
	
	var category = locations[i].getCategory();
	if(category != null){
		elem.style.backgroundImage = "url(/"+AjaxMapsConfig.MAP_IMAGEPATH+"/"+ category +".png)";
		elem.style.backgroundPosition = "left";
		elem.style.backgroundRepeat = "no-repeat";
		//elem.style.paddingLeft = 15;
	}

	var selectionListItem = new SelectionList.Item(elem, locations[i], SelectionList.Item.STATE_ENABLED);

	


	selectionListItem.addMouseClickCBF(_selectionClickEvent);
	_suggestionListItemSM.addSelectionListItem(selectionListItem);
	selectionListItems.push(selectionListItem);
      }

      _suggestionList.addArrayOfItems(selectionListItems);
      _suggestionList.setSelectedIndex(0);
      _suggestionList.setState(SelectionList.STATE_ENABLED);

      _changeRouteLocation(_suggestionList.getSelectedItem().getData());
    }
  };

  this.addRouteLocationChangeCBF =
  function(routeLocationChangeCBF)
  {
    _routeLocationChangeCallbackFunctions.push(routeLocationChangeCBF);
  }

  /* Private part below! */	

  var _changeRouteLocation =
  function(routeLocation)
  {
    if(routeLocation === _location){
      return;
    }
    
    _location = routeLocation;

    for(var i in _routeLocationChangeCallbackFunctions){
      _routeLocationChangeCallbackFunctions[i](routeLocation);
    }
  }



  var _suggestionQueryResponseHandler =
  function(id, key, locations, status)
  {
    if(_addressElement.value == _currentQueryKey){

      if(status != 0){
        _this.setSuggestions(new Array());
      }
      else{
        _this.setSuggestions(locations);
      }
    }

    _previousQueryKey = _currentQueryKey;
    _currentQueryKey = null;
    _checkInput();
  };


  var _queryAddressSuggestions =
  function(key)
  {
    naviciAjaxApi.getAddressByKey(null,
                                  key,
                                  100,
                                  getNameSearchAttributes(),
                                  _suggestionQueryResponseHandler);
  };


  var _checkInput =
  function()
  {
    if(_currentQueryKey !== null){

      //   debug.appendChild(document.createTextNode("[PENDING]"));
      /* QUERY PENDING -> DO NOTHING */
    }
    else if(_addressElement.value == _previousQueryKey){
      //   debug.appendChild(document.createTextNode("[NO CHANGE]"));
      /* NO CHANGE IN INPUT -> DO NOTHING */
    }
	
	// Special case, municipality called 'Ii';
    else if(_addressElement.value.length < 3 && _addressElement.value.toLowerCase() != "ii"){
      //  debug.appendChild(document.createTextNode("[TOO SHORT]"));
      /* TOO SHORT INPUT -> CLEAR SUGGESTION LIST */
      _currentQueryKey = null;
      _previousQueryKey = null;
      if(_location !== null){
	_changeRouteLocation(null);
      }
      _this.setSuggestions(Array());
    }
    else{
      //  debug.appendChild(document.createTextNode("[QUERY]"));
      _currentQueryKey = _addressElement.value;  
      _queryAddressSuggestions(_currentQueryKey);
    }
  };

  var _delayedInputCheck =
  function()
  {
    return _checkInput;
  };

  var _selectionClickEvent =
  function(guiItem)
  {  	
    _suggestionList.setState(SelectionList.STATE_INVISIBLE);
    _this.setRouteLocation(guiItem.getData());
  };

  var _selectionChangeHandler =
  function(selectionList)
  {
    var _item = selectionList.getSelectedItem();

    if(_item !== null)
    {
      _changeRouteLocation(_item.getData());     
    }
    else{
     
    }  
  }


  var _startScrollDown =
  function()
  {
    if(_scrollDownData['timer'] === null){

      _scrollDownData['timer'] = setInterval(_scrollDownData['CBF'],
					     _scrollDownData['interval']);
    }
  };

  var _startScrollUp =
  function()
  {
    if(_scrollUpData['timer'] === null){

      _scrollUpData['timer'] = setInterval(_scrollUpData['CBF'],
					   _scrollUpData['interval']);
    }
  };

  var _stopScrollDown =
  function()
  {
    if(_scrollDownData['timer'] !== null){
      clearInterval(_scrollDownData['timer']);
      _scrollDownData['timer'] = null;
    }
  };

  var _stopScrollUp =
  function()
  {
    if(_scrollUpData['timer'] !== null){
      clearInterval(_scrollUpData['timer']);
      _scrollUpData['timer'] = null;
    }
  };

  var _this = this;

  var _mainElement = mainElement;
  var _addressElement = _mainElement.getElementsByTagName('input')[0];

  /* HACK FOR OPERA */
  _addressElement.autocomplete = 'off';

  var _currentQueryKey = null;
  var _previousQueryKey = null;

  var _suggestionList = suggestionList;
  _suggestionList.setState(SelectionList.STATE_INVISIBLE);
  _suggestionList.addSelectionChangeCBF(_selectionChangeHandler);

  var _location = null;

  var _routeLocationChangeCallbackFunctions = new Array();

  var _delayedInputCheckTimer = null;
  var _delayedInputCheckTimeout = 50;

  var _scrollInterval = 100;

  var _scrollDownData = {'CBF' : _suggestionList.selectNextItem,
			 'interval' : _scrollInterval,
			 'timer' : null};

  var _scrollUpData = {'CBF' : _suggestionList.selectPreviousItem,
		       'interval' : _scrollInterval,
		       'timer' : null};


  var _suggestionListItemSM = new SelectionList.Item.StyleManager(Settings['suggestionList']['item']['style']);

  /*_addressElement.onfocus =
  function(e)
  {
    // debug.appendChild(document.createTextNode('[ONFOCUS]'));
    _checkInput();
  };*/

  _addressElement.onblur =
  function(e)
  {
    //  debug.appendChild(document.createTextNode('[ONBLUR]'));
    _checkInput();	
  };

  _addressElement.onchange =
  function(e)
  {
    //   debug.appendChild(document.createTextNode('[ONCHANGE]'));
    _checkInput();
  };

  _addressElement.onclick =
  function(e)
  {
    //  debug.appendChild(document.createTextNode('[ONCLICK]'));
    _checkInput();
  };

  _addressElement.onmouseover =
  function(e)
  {
    //  debug.appendChild(document.createTextNode('[ONMOUSEOVER]'));
    _checkInput();
  };

  _addressElement.onmouseout =
  function(e)
  {
    //   debug.appendChild(document.createTextNode('[ONMOUSEOUT]'));
    _delayedInputCheckTimer = setTimeout(_delayedInputCheck(), 1000);
    _delayedInputCheckTimer = setTimeout(_delayedInputCheck(), 2000);
    _delayedInputCheckTimer = setTimeout(_delayedInputCheck(), 3000);
    _delayedInputCheckTimer = setTimeout(_delayedInputCheck(), 5000);
    _delayedInputCheckTimer = setTimeout(_delayedInputCheck(), 10000);
    _delayedInputCheckTimer = setTimeout(_delayedInputCheck(), 15000);
    _delayedInputCheckTimer = setTimeout(_delayedInputCheck(), 20000);
  };

  _addressElement.onselect =
  function(e)
  {
    //  debug.appendChild(document.createTextNode('[ONSELECT]'));
    _checkInput();
  };

  _addressElement.onkeyup =
  function(e)
  {
    //  debug.appendChild(document.createTextNode('[ONKEYUP]'));

    _stopScrollUp();
    _stopScrollDown();
    _checkInput();
  };

  _addressElement.onkeydown =
  function(evt)
  { 
    _delayedInputCheckTimer = setTimeout(_delayedInputCheck(), _delayedInputCheckTimeout);

    var keyCode = null;
    var e = null;
    
    if(!evt){
      e = window.event; 
    }
    else{
      e = evt;
    }

    if(e.keyCode){
      keyCode = e.keyCode;
    }
    else if(e.which){
      keyCode = e.which;
    }


    if(keyCode != 40){ /* not down arrow */
      _stopScrollDown();
    }
    if(keyCode != 38){ /* not up arrow */
      _stopScrollUp();
    }

    //    debug.appendChild(document.createTextNode('[KEYDOWN=' + keyCode + ']'));   

    if(keyCode == 40){ /* down arrow */
    
      if(_suggestionList.getState() != SelectionList.STATE_ENABLED){
	 if(_suggestionList.getLength() > 0){
	   _suggestionList.setState(SelectionList.STATE_ENABLED);
	 }
      }
      else{

	if(_scrollDownData['timer'] === null){

	  _suggestionList.selectNextItem();
	  _startScrollDown();
	}
      }
    }

    else if(keyCode == 38){ /* up arrow */
    
      if(_suggestionList.getState() != SelectionList.STATE_ENABLED){
	// DO NOTHING 
      }
      else if(_suggestionList.getSelectedIndex() === null){
	//	_suggestionList.setState(SelectionList.STATE_INVISIBLE);
      }
      else{

	if(_scrollUpData['timer'] === null){

	  _suggestionList.selectPreviousItem();
	  _startScrollUp();
	}

      }
    }

    else if(keyCode == 13){ /* enter */

      if(_suggestionList.getSelectedIndex() === null){
	if(_suggestionList.getState() != SelectionList.STATE_INVISIBLE){
	  _suggestionList.setState(SelectionList.STATE_INVISIBLE);
	}
	else{
	  _suggestionList.setState(SelectionList.STATE_INVISIBLE);
	}
      }
      else{	  	
	   _this.setRouteLocation(_suggestionList.getSelectedItem().getData());
      }
    }
  };  
  
}
