/* uncomment the following to enable ajax debugging */
//$.ajaxSetup({"error":function(XMLHttpRequest,textStatus, errorThrown) {   
//      alert(textStatus);
//      alert(errorThrown);
//      alert(XMLHttpRequest.responseText);
//}});

function setup()
{
    //var position = new google.maps.LatLng(origin.lat, origin.lng);
  var position = new GLatLng(origin.lat, origin.lng);
  var map = new google.maps.Map2(document.getElementById("map"));

  map.setCenter(position, 14);
  map.addControl(new GLargeMapControl());
  map.addOverlay(create_marker(position));

  update_map(origin, dealers);
}

function create_marker(position, is_origin)
{
  var is_origin    = (is_origin == null) ? false : is_origin;
  var icon         = new google.maps.Icon(G_DEFAULT_ICON);

  if(is_origin) {
    icon.image = "/uploads/markerOrigin.gif";
  } else {
    icon.image = "/uploads/markerDealer.gif";
  }

  icon.transparent = "/uploads/markerTransparent.png";

  var options      = { icon:icon };
  var marker       = new google.maps.Marker(position, options);

  return marker;
}

function update_messages(flash)
{
  // Remove all at first
  $(".messages").remove();

  jQuery.each(flash, function(level, messages)
  {
    if(messages.length > 0)
    {
      var list = $('<ol class="messages '+level+'"/>');
      jQuery.each(messages, function() { $('<li/>').append(''+this).appendTo(list); });
      list.appendTo($("#content-sub"));
    }
  });
}

function update_map(origin_, dealers)
{
  var map      = new google.maps.Map2(document.getElementById("map"));
  var bounds   = new google.maps.LatLngBounds();
  var origin   = new google.maps.LatLng(origin_.lat, origin_.lng);

  map.clearOverlays();

  var markers = $.map(dealers, function(d, index)
  {
    var position  = new google.maps.LatLng(d.latitude, d.longitude);
    var marker    = create_marker(position);

    marker.info_ = $("<div/>")
      .attr("class", "info")
      .append("<h4>"+d.name+"</h4>" + "<p>"+d.address+"</p>");

    // Add handlers

    GEvent.addListener(marker, "click", function() {
      map.panTo(marker.getLatLng());
    });

    GEvent.addListener(marker, "mouseover", function() {
      var pos = map.fromLatLngToDivPixel(marker.getLatLng());

      marker.info_.css({
        position:"absolute", top: pos.y - 32, left: pos.x + 16
      }).appendTo(
        map.getPane(G_MAP_MAP_PANE)
      );
    });

    GEvent.addListener(marker, "mouseout", function() {
      $("#map .info").remove();
    });

    bounds.extend(position);
    return marker;
  });

  // Setup new center
  if(markers.length > 0)
  {
    var center_lat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) / 2;
    var center_lng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) / 2;
    var zoom       = map.getBoundsZoomLevel(bounds) - 1;
  }
  else
  {
    var center_lat = origin_.lat;
    var center_lng = origin_.lng;
    var zoom = 12;
  }

  map.setCenter(new google.maps.LatLng(center_lat, center_lng), zoom);

  // Add dealers' markers and origin marker to map
  if(!origin_.base) {
    map.addOverlay(create_marker(origin, true));
  }

  jQuery.each(markers, function() { map.addOverlay(this); });


  map.addControl(new GLargeMapControl());
}

function update_list(origin_, dealers)
{
  var list = $("#dealers");
  list.empty();

  $.each(dealers, function(index, d)
  {
    var li = $("<li/>");
    li.attr("id", "dealer-" + d.id);
    li.attr("class", index % 2 == 0 ? "even" : "odd");

    if(d.logo != '')
    {
      li.append('<img class="logo" src="' + d.logo + '" + alt="' + d.name + '" />');
    }

    li.append("<h4>" + d.name + "</h4>");

    var overview = $("<dl/>");
    overview.attr("class", "overview clearfix");

    $.each(["services", "scope", "distance"], function()
    {
      var dt = $("<dt/>");
      dt.attr("class", this);
      dt.append(translations[this]);
      dt.appendTo(overview);

      var dd = $("<dd/>");
      dd.attr("class", this);
      dd.append(d[this]);
      dd.appendTo(overview);
    });
    overview.appendTo(li);


    var toggle_details = $("<p/>");
    toggle_details.attr("class", "toggle-details");
    var toggle_link = $("<a/>");
    toggle_link.attr("href", "?dealer=" + d.id).append("Details");

    toggle_link.appendTo(toggle_details);
    toggle_details.appendTo(li);


    var details = $("<dl/>");
    details.attr("class", "details clearfix");

    $.each(["address", "website", "email", "phone", "fax", "description"], function()
    {
      var dt = $("<dt/>");
      dt.attr("class", this);
      dt.append(translations[this]);
      dt.appendTo(details);

      var dd = $("<dd/>");
      dd.attr("class", this);

      if(this == "website")
      {
        $("<a/>").attr("href", d[this]).append(d[this]).appendTo(dd);
      }
      else if(this == "email")
      {
        $("<a/>").attr("href", "mailto:"+d[this]).append(d[this]).appendTo(dd);
      }
      else
      {
        dd.append(d[this]);
      }

      dd.appendTo(details);
    });
    details.appendTo(li);

    li.appendTo(list);
  });
}

function setup_details()
{
  $("#dealers .details").hide();

  $(".toggle-details a").click(function()
  {
    var dealer_id = $(this).attr("href").replace(/^.*=/, "");
    $("#dealers #dealer-"+dealer_id+" .details").toggle();
    return false;
  });
}

$(document).ready(function()
{
    //setup();
  setup_details();

  // ---------------------------------------------------------------------------

  $("#submit-find-dealers").click(function()
  {
    $("#submit-find-dealers").css('visibility', 'hidden');
    $('<img id="ajax-loader" src="/images/ajax-loader.gif"/>')
      .css('position', 'absolute')
      .css('right', '14px')
      .css('border', '0')
      .appendTo($("#find-dealers fieldset"));

    var near   = encodeURI($("#near").val()) || "Bingen am Rhein";
    var radius = parseInt($("#radius").val()) || 100;

    $.getJSON("?near="+near+"&radius="+radius, function(data)
    {
      origin  = {
        lat:  data.origin.latitude,
        lng:  data.origin.longitude,
        base: data.origin.base
      };

      update_map(origin, data.items);
      update_messages(data.flash);
      update_list(origin, data.items);

      setup_details();

      $("#ajax-loader").remove();
      $("#submit-find-dealers").css('visibility', 'visible');
    });

    return false;
  });

});

