var MSearch = new Object();

MSearch.setLocation = function (city, alternative)
{
  this.city = city;
  this.alternative = alternative;
}

MSearch.search = function (address, callBack, guideId)
{
  this.callBack = callBack ? callBack : searchComplete;
  
  this.searchField = document.getElementById(address);
  
  if (!this.searchField.value) return;
  
  this.address = this.searchField.value;
  
  this.searchField.setAttribute('disabled', true);
  
  if (guideId)
  {
      var uri = '/retreivers/search.php?s=' + encodeURIComponent(this.address) + '&guideId=' + guideId; 
      
      GDownloadUrl(uri,  _objectSearchCallBack);
      
  } else
  {
      startGeoSearch();
  }
  
  return false;
}

function _objectSearchCallBack (objectId, httpCode)
{
  if (objectId && parseInt(objectId))
  {
      MMarkerRegistry.goToId(objectId);
      
      MSearch.enableSearchField();
      
  } else
  {
      startGeoSearch();
  }
}

function startGeoSearch (address, callBack)
{  
  var gc = new GClientGeocoder();
  gc.setBaseCountryCode('ru');
  
  gc.getLocations('город ' + MSearch.city + ' ' + MSearch.address, MSearch.callBack);
}

function anyMarkersVisible ()
{
  var n = 0;

  for (var i in MMarkerRegistry.markers)
  {
      if (MMap.getBounds().contains(MMarkerRegistry.markers[i].getLatLng()))
      {
          if (++n == 3 || n == MMarkerRegistry.markers.length) return n;
      }
  }
  
  return false;
}

MSearch.enableSearchField = function ()
{
  this.searchField.removeAttribute('disabled');
}

function searchComplete (point)
{    
  if (!point.Placemark)
  {
      if (point.name.toString().indexOf(MSearch.alternative) == 0)
      {
          MSearch.enableSearchField();
          
          return;
      }
      
      return startAlternativeSearch(point);
  }
  
  var coord = point.Placemark[0].Point.coordinates.toString().split(",", 2);
  var address = point.Placemark[0].address.split(", ");
  
  var latLng = new GLatLng (coord[1], coord[0]);
  
  //prompt('', coord[1] + ' ' + coord[0]);
  
  if (
        point.name.toString().indexOf(MSearch.alternative) != 0 &&
        latLng.lat() == '55.755786' &&
        latLng.lng() == '37.617633'
     )
  {
      return startAlternativeSearch(point);
  }
 
  var zoom = 15;
 
  do
  {
      MMap.setCenter(latLng, zoom--);
      
  } while (MMarkerRegistry.markers.length && !anyMarkersVisible())

  var d = new GDirections ();

    GEvent.addListener(d, 'load', function() {
    
    MMap.openInfoWindowHtml(latLng, d.getGeocode(0).address.toString());
    MSearch.enableSearchField();
  }); 
  
  GEvent.addListener(d, 'error', function() {
  
    MMap.openInfoWindowHtml(latLng, address[address.length - 1]);
    MSearch.enableSearchField();
  }); 
  
  d.loadFromWaypoints( [point.name,point.name],{locale:"ru"});
}

function startAlternativeSearch (point)
{
  var s = point.name.toString().split(' ');

  s.shift();
  s.shift();

  var gc = new GClientGeocoder();
  gc.setBaseCountryCode('ru');

  return gc.getLocations(MSearch.alternative + ' ' + s.join(' '), searchComplete);
}

function searchCompleteAdd (point)
{      
  if (!point.Placemark)
  {
      if (point.name.toString().indexOf(MSearch.alternative) == 0)
      {
          MSearch.enableSearchField();
          
          return;
      }
      
      var s = point.name.toString().split(' ');
    
      s.shift();
      s.shift();
  
      var gc = new GClientGeocoder();
      gc.setBaseCountryCode('ru');
    
      return gc.getLocations(MSearch.alternative + ' ' + s.toString(), searchCompleteAdd);
  }
  
  var coord = point.Placemark[0].Point.coordinates.toString().split(",", 2);
  
  var latLng = new GLatLng (coord[1], coord[0]);
  
  searchCallBackAdd(latLng, '');
}

function searchCallBackAdd (latLng, address)
{
  MMap.setCenter(latLng, 16);
  
  MColumnTabs.marker.setLatLng(latLng);
  
  MWizard.instance('newObject').goToStep(2);

  MSearch.enableSearchField();
}

