
var BrowseDetail = {

  directions: null,
  directions_window_open: false,
  geocoder : null,
  ie6: false,
  images: [],
  ll: null,
  map : null,
  markers: {},
  mlsName : null,
  mlsNumber : null,
  streetview: null,
  streetviewInitialized: false,
  view: 'map',
  latitude: null,
  longitude: null,
  source: null,
  accuracy: null,

  applyIe6Fixes:function() {

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

  },

  closeDirections:function() {

    BrowseDetail.directions_window_open = false;

    $("#map_container").animate({
      marginLeft: "0%",
      width: "100%"
    },
    {
      queue: false,
      duration: 750,
      easing: "easeOutCubic"
    }, 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) {

    BrowseDetail.latitude = latitude;
    BrowseDetail.longitude = longitude;
    BrowseDetail.source = source;
    BrowseDetail.accuracy = accuracy;

    $(".thumbnail_image").each(function(i) {
      var image = new Image();
      image.src = $(this).attr('src');
      var w = image.width > image.height ? 80 : (60 / image.height) * image.width;
      var h = image.height > image.width ? 60 : (80 / image.width) * image.height;

      $(this).css({
        width: w + "px",
        height: h + "px"
      });
    });

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

/*
    $("#show_map a").click(function() {
      BrowseDetail.initializeMap(BrowseDetail.latitude, BrowseDetail.longitude, BrowseDetail.source, BrowseDetail.accuracy);
      _gaq.push(['_trackPageview', '/map-view']);
      return false;
    });
*/

  },

  initializeMap:function() {

    latitude = BrowseDetail.latitude;
    longitude = BrowseDetail.longitude;
    source = BrowseDetail.source;
    accuracy = BrowseDetail.accuracy;

    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;

    var map_options = {
      googleBarOptions: {
        style: 'new'
      }
    };

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

    var marker = new GMarker(ll);
/*
    if(address) {
      var popup_content = '<img src="' + image + '" width="50" /><p>' + address + '<br />' + csz;
      marker.popup_content = popup_content;
      GEvent.addListener(marker, "click", function()
      {
        this.openInfoWindowHtml(this.popup_content);
      });
      BrowseDetail.map.addOverlay(marker);
      marker.openInfoWindowHtml(marker.popup_content);
    } else {
*/
      BrowseDetail.map.addOverlay(marker);
//    }

    $("#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);

    $.get("ajax/get_nearby_places.php",
      {
        latitude: ll.lat(),
        longitude: ll.lng()
      }, function(data) 
      {
        eval(data); 
        BrowseDetail.loadSchools(Places); 
      }, 'text'
    );

    $("#toggle_restaurants").click(function() { 
      if(this.checked) { 
        BrowseDetail.show('food'); 
      } else { 
        BrowseDetail.hide('food'); 
      }
    });

    $("#toggle_restaurants").click(function() { 
      if(this.checked) { 
        BrowseDetail.show('food'); 
      } else { 
        BrowseDetail.hide('food'); 
      }
    });

    $("#toggle_schools").click(function() { 
      if(this.checked) { 
        BrowseDetail.show('schools'); 
      } else { 
        BrowseDetail.hide('schools'); 
      }
    });

    $("#toggle_golf_courses").click(function() { 
      if(this.checked) { 
        BrowseDetail.show('golf_courses'); 
      } else { 
        BrowseDetail.hide('golf_courses'); 
      }
    });

    $("#toggle_attractions").click(function() { 
      if(this.checked) { 
        BrowseDetail.show('attractions'); 
      } else { 
        BrowseDetail.hide('attractions'); 
      }
    });

    $("#toggle_shopping").click(function() { 
      if(this.checked) { 
        BrowseDetail.show('shopping'); 
      } else { 
        BrowseDetail.hide('shopping'); 
      }
    });

    $("#toggle_grocery_stores").click(function() { 
      if(this.checked) { 
        BrowseDetail.show('grocery_stores'); 
      } else { 
        BrowseDetail.hide('grocery_stores'); 
      }
    });

    $("#search_submit").click(function() {
      BrowseDetail.show($("#search_string").val());
      $("#search_string").val('');
    });

    $("#search_string").keypress(function(e) {
      if(e.keyCode == 13) {
        BrowseDetail.show($("#search_string").val());
        $("#search_string").val('');
      }
    });

    $("#clear_search").click(function() {
      if(BrowseDetail.markers.custom != null) {
        BrowseDetail.hide('custom');
        BrowseDetail.markers.custom = null;
      }
    });

    _gaq.push(['_trackPageview', '/map-view']);

  },

  hide:function(cacheBy) {

    for(var i = 0; i < BrowseDetail.markers[cacheBy].length; i++) {
      BrowseDetail.map.removeOverlay(BrowseDetail.markers[cacheBy][i]);
    }

  },

  show:function(cacheBy) {

    if(BrowseDetail.markers[cacheBy] == null) {

      switch(cacheBy) {

      case "food":
        BrowseDetail.load('food', cacheBy, 'icon_restaurants.png');
        BrowseDetail.load('restaurant', cacheBy, 'icon_restaurants.png');
        break;

      case "golf_courses":
        BrowseDetail.load('golf course', cacheBy, 'icon_golf.png');
        break;

      case "attractions":
        BrowseDetail.load('attractions', cacheBy, 'icon_attractions.png');
        break;

      case "shopping":
        BrowseDetail.load('shopping', cacheBy, 'icon_shopping.png');
        break;

      case "grocery_stores":
        BrowseDetail.load('groceries', cacheBy, 'icon_grocery.png');
        BrowseDetail.load('grocery store', cacheBy, 'icon_grocery.png');
        break;

      default:
        BrowseDetail.load(cacheBy, 'custom');
        break;

      }

    } else {

      for(var i = 0; i < BrowseDetail.markers[cacheBy].length; i++) {
        BrowseDetail.map.addOverlay(BrowseDetail.markers[cacheBy][i]);
      }

    }

  },

  load:function(query, cacheBy, myIcon) {

    var searchControl = new google.search.SearchControl();
    var localSearch = new google.search.LocalSearch();
    searchControl.addSearcher(localSearch);
    localSearch.setCenterPoint(BrowseDetail.map);

    if(BrowseDetail.markers[cacheBy] == null) {
      BrowseDetail.markers[cacheBy] = [];
    }

    if(myIcon != null) {

      var baseIcon = new GIcon(G_DEFAULT_ICON);
      baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
      baseIcon.iconSize = new GSize(26, 31);
      baseIcon.shadowSize = new GSize(25, 23);
      baseIcon.iconAnchor = new GPoint(13, 31);
      baseIcon.infoWindowAnchor = new GPoint(13, 31);
      baseIcon.imageMap = [0,0,26,0,26,26,0,26];

      icon = new GIcon(baseIcon);
      icon.image = "/main/images/map_images/" + myIcon;

    }

    searchControl.setSearchCompleteCallback(localSearch, function() {
      var results = localSearch.results;

      for(var i = 0; i < results.length; i++) {
        var result = results[i];
        var ll = new google.maps.LatLng(parseFloat(result.lat), parseFloat(result.lng));

        if(myIcon == null) {
          var marker = new google.maps.Marker(ll);
        } else {
          var marker = new GMarker(ll, {
            icon: icon
          });
        }
        marker.bindInfoWindow(result.html.cloneNode(true));
        result.marker = marker;
        BrowseDetail.markers[cacheBy].push(marker);
        BrowseDetail.map.addOverlay(marker);
      }

    });

    searchControl.draw($('#control_container').get(0));
    searchControl.execute(query);

  },

  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, popup_content) {

    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, popup_content);
          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();
        }
      });

    }

  },

  loadSchools:function(point) {

    var baseIcon = new GIcon(G_DEFAULT_ICON);
    baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
    baseIcon.iconSize = new GSize(26, 31);
    baseIcon.shadowSize = new GSize(25, 23);
    baseIcon.iconAnchor = new GPoint(13, 31);
    baseIcon.infoWindowAnchor = new GPoint(13, 31);
    baseIcon.imageMap = [0,0,26,0,26,26,0,26];

    var icon = new GIcon(baseIcon);
    icon.image = "/main/images/map_images/icon_schools.png";

    BrowseDetail.markers['schools'] = [];

    for(var i = 0; i < point.results.length; i++) {
      o = point.results[i];
      ll = new google.maps.LatLng(o.latitude, o.longitude);
      var marker = new GMarker(ll,
      {
        title: o.name,
        icon: icon
      });

      name = "<b>" + o.name + "</b><br />";
      address = o.address1 + "<br />" + o.city + ", " + o.state + " " + o.zip + "<br />";
      if(o.phone1.length) {
        address += o.phone1 + "<br />";
      }
      address += "<br />";

      marker.description = name + address + o.description.replace(/``/g, "<br />");

      GEvent.addListener(marker, "click", function()
      {
        this.openInfoWindowHtml(this.description);
      });

      BrowseDetail.markers['schools'].push(marker);
    }

  },

  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: "easeOutCubic"
    }, 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");

  },

  initializeSlideShow:function(start_index) {

    jQuery.PictureSlides.set({
      // Switches to decide what features to use
      useFadingIn : true,
      useFadingOut : true,
      useFadeWhenNotSlideshow : true,
      useFadeForSlideshow : true,
      useDimBackgroundForSlideshow : true,
      loopSlideshow : false,
      usePreloading : true,
      useAltAsTooltip : true,
      useTextAsTooltip : false,

      // Fading settings
      fadeTime : 400, // Milliseconds 
      timeForSlideInSlideshow : 2000, // Milliseconds

      // At page load
      startIndex : start_index, 
      startSlideShowFromBeginning : true,
      startSlideshowAtLoad : false,
      dimBackgroundAtLoad : false,

      // Large images to use and thumbnail settings
      images : BrowseDetail.images,
      thumbnailActivationEvent : "click",

      // Classes of HTML elements to use
      mainImageClass : "picture-slides-image", // Mandatory
      imageLinkClass : "picture-slides-image-link",
      fadeContainerClass : "picture-slides-fade-container",
      imageTextContainerClass : "picture-slides-image-text",
      previousLinkClass : "picture-slides-previous-image",
      nextLinkClass : "picture-slides-next-image",
      imageCounterClass : "picture-slides-image-counter",
      startSlideShowClass : "picture-slides-start-slideshow",
      stopSlideShowClass : "picture-slides-stop-slideshow",
      thumbnailContainerClass: "picture-slides-thumbnails",
      dimBackgroundOverlayClass : "picture-slides-dim-overlay"
    });


  }

}

