
var BrowseDetail = {

  directions: null,
  directions_window_open: false,
  geocoder : null,
  ie6: false,
  ll: null,
  map : null,
  mlsName : null,
  mlsNumber : null,
  streetview: null,
  streetviewInitialized: false,
  view: 'map',

  applyIe6Fixes:function() {

    $("#directions_type").hide();

  },

  closeDirections:function() {

    BrowseDetail.directions_window_open = false;

    $("#map_container").animate({
      marginLeft: "0%",
      width: "100%"
    },
    {
      queue: false,
      duration: 750,
      easing: "cubicEaseOut"
    }, BrowseDetail.map.checkResize);

    $("#get_directions").html("Get Directions");

    if(BrowseDetail.ie6) {
      $("#directions_type").hide();
      $(window).resize();
    }

  },

  getDirections:function(e) {

    $("#route").empty();
    $("#directions_message").empty();

    var from = $("#from").val();
    var to = $("#to").val();
    var panel = $("#route").get(0);

    if(!from.length || !to.length) {
      return(false);
    }

    BrowseDetail.directions = new GDirections(BrowseDetail.map, panel);

    GEvent.addListener(BrowseDetail.directions, "error", function() {
      switch(BrowseDetail.directions.getStatus().code) {

      case G_GEO_UNKNOWN_ADDRESS: 
      case G_GEO_BAD_REQUEST:
        $("#directions_message").html("There are no directions available for those addresses.");
        break;

      }
    });

    switch($("#directions_type").val()) {

    case "car":
      mode = G_TRAVEL_MODE_DRIVING;
      break;

    case "walking":
      mode = G_TRAVEL_MODE_WALKING;
      break;

    }

    BrowseDetail.map.checkResize();
    BrowseDetail.directions.load("from: " + from + " to: " + to, {travelMode:mode});


  },

  init:function(latitude, longitude, source, accuracy) {

    if($.browser.msie && $.browser.version.substr(0,1) < 7) {
      BrowseDetail.ie6 = true;
      BrowseDetail.applyIe6Fixes();
    }

    if(source == "Google" && accuracy < 6) {
  
      switch(accuracy) {
      case '0':
      case '5':
      default:
        which = "ZIP Code";
        break;

      case '1':
        which = "Country";
        break;

      case '2':
        which = "State";
        break;

      case '3':
        which = "County";
        break;

      case '4':
        which = "Town/City";
        break;

      }

      $("#map_options").html("This address could not be accurately located on the map. Below is a map of the listing's " + which + ".").addClass("alert");

    } else if(source == "Yahoo" && accuracy == "ZIP") {

      $("#map_options").html("This address could not be accurately located on the map. Below is a map of the listing's ZIP Code.").addClass("alert");

    }

    $(document.body).unload(GUnload);
    $("#map_toggle").toggle(BrowseDetail.switchToStreetview, BrowseDetail.switchToMap);
    $("#get_directions").toggle(BrowseDetail.openDirections, BrowseDetail.closeDirections);

    if(longitude == null) {
      var ll = latitude;
    } else {
      var ll = new google.maps.LatLng(latitude, longitude);
    }
    BrowseDetail.ll = ll;

    BrowseDetail.map = new GMap2($("#map_container").get(0));
    BrowseDetail.map.setCenter(ll, 13);
    BrowseDetail.map.setUIToDefault();

    BrowseDetail.map.addOverlay(new GMarker(ll));

    $("#directions_submit").click(BrowseDetail.getDirections);
    $("#directions_table input").keyup(function(e)
    {
      if(e.keyCode == 13) {
        BrowseDetail.getDirections();
      }
    });
    $("#directions_type").change(BrowseDetail.getDirections);

    $("#swap_icon").click(BrowseDetail.swapFromAndTo);

    $(window).resize(function(e) {
      $("#directions_menu input[type='text']").each(function(i, o) {
        $(o).css('width', parseInt($("#directions_menu").width()) * .80 + "px");
      });
    });

    BrowseDetail.initializeStreetview(true);

  },

  initializeStreetview:function(testing) {

    BrowseDetail.streetview = new GStreetviewPanorama($("#streetview").get(0));
    GEvent.addListener(BrowseDetail.streetview, "error", BrowseDetail.streetViewError);
    BrowseDetail.streetview.setLocationAndPOV(BrowseDetail.ll);

    if(!testing) {
      BrowseDetail.streetviewInitialized = true;
    }

  },

  loadAddress:function(address, csz, mlsName, mlsNumber) {

    BrowseDetail.mlsName = mlsName;
    BrowseDetail.mlsNumber = mlsNumber;

    BrowseDetail.geocoder = new GClientGeocoder();
    if(BrowseDetail.geocoder) {

      BrowseDetail.geocoder.getLocations(address, function(response) {
        if(response && response.Status.code == 200) {
          var place = response.Placemark[0];
          var point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);

          BrowseDetail.init(point);
          BrowseDetail.saveLatLong(point.lat(), point.lng(), place.AddressDetails.Accuracy, response.Status.code);
        } else {
          $("#map_options").html("This address could not be accurately located on the map. Below is a map of the listing's zip code.").addClass("alert");
          if(response) {
            BrowseDetail.saveLatLong('null', 'null', 0, response.Status.code);
          }
          BrowseDetail.loadZip(csz);
        }
      });

    }

  },

  loadZip:function(csz) {

    if(BrowseDetail.geocoder) {

      BrowseDetail.geocoder.getLatLng(csz, function(point) {
        if(point) {
          BrowseDetail.init(point);
        } else {
          $("#map_options").html("There is no map available for this listing.");
          $("#maps").hide();
        }
      });

    }

  },

  openDirections:function() {

    BrowseDetail.directions_window_open = true;

    $("#streetview").hide();

    if(BrowseDetail.view != "map") {
      $("#map_toggle").click();
    }

    $("#map_container").animate({
      marginLeft: "40%",
      width: "60%"
    },
    {
      queue: false,
      duration: 750,
      easing: "cubicEaseOut"
    }, BrowseDetail.map.checkResize);

    $("#get_directions").html("Close Directions Window");

    if(BrowseDetail.ie6) {
      $("#directions_type").show();
    }

  },

  saveLatLong:function(latitude, longitude, confidence, response) {

    $.get("ajax/save_lat_long.php",
      {
        mls_name: BrowseDetail.mlsName,
        mls_number: BrowseDetail.mlsNumber,
        latitude: latitude,
        longitude: longitude,
        source: 'Google',
        confidence: confidence,
        raw_response: response
      }
    );

  },

  streetViewError:function(err) {

    $("#streetview").hide();
    $("#map_toggle").hide();

  },

  switchToMap:function() {

    BrowseDetail.view = 'map';
    $("#streetview").removeClass('active_map').hide().css('zIndex', '5');
    $("#map_container").addClass('active_map').show();
    $("#directions").show();

    $("#map_toggle").html("Switch to Street View");

  },

  swapFromAndTo:function()
  {

    var tmp = $("#from").val();
    $("#from").val($("#to").val());
    $("#to").val(tmp);

    if(tmp.length && $("#from").val().length) {
      BrowseDetail.getDirections();
    }

  },

  switchToStreetview:function() {

    BrowseDetail.view = 'street';
    $("#map_container").hide();
    $("#directions").hide();
    $("#streetview").show().css('zIndex', '20');

    if(BrowseDetail.directions_window_open) {
      $("#get_directions").click();
    }

    if(!BrowseDetail.streetviewInitialized) {
      BrowseDetail.initializeStreetview();
    }

    $("#map_toggle").html("Switch to Map View");

  }

}
