var _map_loaded = false;
var _map_data_source = "scripts/php/local/map_data.php";
var _map = null;
var _map_markers = [];
var _map_bounds;

var _result_html = "<div class='result-title Praxis-Light'></div>\
                    <div class='result-details'></div>\
                    <div class='result-hours'></div>\
                    <div class='clear'></div>";

function map_start_search(){
  var city_name = $('city').value;
  if(city_name != -1){
    new Request.HTML({onSuccess:on_map_data_answer}).get(_map_data_source + "?city=" + city_name);
  }
}

var _stores;
var _open_element;

function on_map_data_answer(responseTree, responseElements, responseHTML, responseJavaScript){
  init_map();
  
  var xml = GXml.parse("<data>" + responseHTML + "</data>");
  
  _stores = [];
  
  var storesNode = xml.getElementsByTagName("result");
  for(var i = 0; i <= storesNode.length - 1; i++){
    _stores.push(storesNode[i]);
  }

  _open_element = (_stores.length == 1);
  
  $('locator-results').empty();
  
  add_next_store();
  
  return;
}

function add_next_store(){
  
  if(_stores.length > 0){
    var data = _stores[0];
    
    _stores.splice(0, 1);
    
    var data_id = GXml.value(data.getElementsByTagName('data_id')[0]);
    var cat_name = GXml.value(data.getElementsByTagName('cat_name')[0]);
    var loc = GXml.value(data.getElementsByTagName('loc')[0]);
    var name = GXml.value(data.getElementsByTagName('name')[0]);
    var details = GXml.value(data.getElementsByTagName('details')[0]);
    var hours = GXml.value(data.getElementsByTagName('hours')[0]);
    var adress = GXml.value(data.getElementsByTagName('map_label')[0]);
    
    var map_tag_data = new Element('div', {'class':'map-popup', 'html':adress});
    var map_geocoder = new GClientGeocoder();
    
    var func = function(point){
      create_geodata(point, map_tag_data, _open_element);
    }
    
    map_geocoder.getLatLng(loc, func);
    
    var res_text = new Element('div', {'class':'result', 'html':_result_html});
    
    $(res_text).getChildren('.result-title').set('html', "<div>" + name + "</div><div class='result-title-catname'>" + cat_name + "</div>");
    $(res_text).getChildren('.result-details').grab(new Element('div', {'html':(adress + "<br /><br />" + details)}));
    $(res_text).getChildren('.result-hours').grab(new Element('div', {'html':hours}));
    
    $('locator-results').grab(res_text);
    
  }else{
    Cufon.refresh();
  }
}

function init_map(){
  _map_bounds = new GLatLngBounds();
  if(_map == null){
     $('locator-map').setStyle('display', 'block');
     $('locator-results').setStyle('display', 'block');
     $('locator-map-instructions').setStyle('display', 'none');
  
     _map = new google.maps.Map2($("locator-map"));
     
     _map.addControl(new GLargeMapControl3D());
     _map.addControl(new GMapTypeControl());
     _map.addControl(new GScaleControl());
     
  }else{
    $each(_map_markers, function(marker, index){
      _map.removeOverlay(marker);
    });
    _map_markers = [];
  }
}

function create_geodata(point, data, auto_open){
  _map_bounds.extend(point);
  
  var map_marker = new GMarker(point);
  _map.addOverlay(map_marker);
  _map_markers.push(map_marker);
  
  var zoomlevel = _map.getBoundsZoomLevel(_map_bounds);
  if(zoomlevel > 14){
    zoomlevel = 14;
  }
  _map.setCenter(_map_bounds.getCenter(), zoomlevel);
  
  map_marker.bindInfoWindow(data);
  if(auto_open){
    map_marker.openInfoWindow(data);
  }
  
  add_next_store();
  
}

window.addEvent('domready', function() {
    $('locator-map').setStyle('display', 'none');
    $('locator-results').setStyle('display', 'none');
    $('city').addEvent('change', function() {map_start_search();});
});
