// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

function submit_search_form(address, lat, lng, beds, baths, min, max, within, sortby, page) {
  frm = $('search_form');
  frm.address.value = address;
  frm.lat.value = lat;
  frm.lng.value = lng;
  frm.beds.value = beds;
  frm.baths.value = baths;
  frm.min.value = min;
  frm.max.value = max;
  frm.within.value = within;
  frm.sortby.value = sortby;
  frm.page.value = page;
  frm.submit();
}

function geocodeAddress(frm) {
  geocoder = new GClientGeocoder();
  
  if (geocoder) {
    geocoder.getLatLng(
      frm.address.value,
      function(point) {
        if (point) {
          frm.lat.value = point.lat();
          frm.lng.value = point.lng();
        }
        frm.submit();
      }
    );
  } else {
    frm.submit();
  }
}

// helper function to create markers
function createMarker(point, html, index) {
  var marker = new GMarker(point,forsaleIcon);
  
  GEvent.addListener(marker, "click", function() {
    selectedItem = index;
    setColors();
    loadDetails(index);
    marker.openInfoWindowHtml(html);
    moveTo('property_list', 'item_' + index);
  });
  gmarkers[index] = marker;

  return marker;
}

function createOverlayMarker(point,desc,image,shadow){
  overlayIcon.image = image;
  overlayIcon.shadow = shadow;

  var marker = new GMarker(point,overlayIcon);
  GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(desc); });
  // GEvent.addListener(marker, "mouseover", function() { marker.openInfoWindowHtml(desc); });
  // GEvent.addListener(marker, "mouseout", function() { marker.closeInfoWindow(); });
  return marker;
}

function LoadOverlays(overlay){
  /*
  alert(overlay.IconURL);
  alert(overlay.SearchValue);
  alert(overlay.Title);
  */

  if(overlay.OverlayList.length > 0){
    //OverlayList exists so remove markers from map
    for (var index = 0; index < overlay.OverlayList.length; index++) {
         map.removeOverlay(overlay.OverlayList[index]);
       }
    //Empty Overlay object marker array
    overlay.OverlayList.length = 0;
    }else{
    //Overlay object marker array is empty so populate it
    SelectedOverlay = overlay;
    /*
    alert(SelectedOverlay.IconURL);
    alert(SelectedOverlay.SearchValue);
    alert(SelectedOverlay.Title);
    */
    gLocalSearch = new GlocalSearch();
      gLocalSearch.setCenterPoint(map);
      gLocalSearch.setSearchCompleteCallback(null, OnLocalSearchOverlay);
      gLocalSearch.setResultSetSize(GSearch.LARGE_RESULTSET);
      gLocalSearch.execute(SelectedOverlay.SearchValue);

    }
}

function OnLocalSearchOverlay(){
  var point;
  var desc;
  var OverlayMarkers = [];
  
  if (!gLocalSearch.results) return;
  
  /*
  alert("results " + gLocalSearch.results.length);
  alert(SelectedOverlay.IconURL);
  alert(SelectedOverlay.SearchValue);
  alert(SelectedOverlay.Title);
  */
  for (var index = 0; index < gLocalSearch.results.length; index++) {
    point = new GLatLng(gLocalSearch.results[index].lat, gLocalSearch.results[index].lng);
    desc = '<div style="font: 11px sans-serif; color: #333333;"><a href="' + gLocalSearch.results[index].url + '" target="_blank">' + gLocalSearch.results[index].titleNoFormatting + '</a><br/>' + gLocalSearch.results[index].streetAddress + '<br/>' + gLocalSearch.results[index].city + ', ' + gLocalSearch.results[index].region + '<br/>' + gLocalSearch.results[index].phoneNumbers[0].number + '</div>';
    OverlayMarkers[index] = createOverlayMarker(point,desc,SelectedOverlay.IconURL,SelectedOverlay.IconShadowURL);
    map.addOverlay(OverlayMarkers[index]);
  }
  //Assign array of overlay markers to the Selected Overlay
  SelectedOverlay.setOverlayResults(OverlayMarkers);
}

Effect.Scroll = Class.create();
Object.extend(Object.extend(Effect.Scroll.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    var options = Object.extend({
      x:    0,
      y:    0,
      mode: 'absolute'
    } , arguments[1] || {}  );
    this.start(options);
  },
  setup: function() {
    if (this.options.continuous && !this.element._ext ) {
      this.element.cleanWhitespace();
      this.element._ext=true;
      this.element.appendChild(this.element.firstChild);
    }
   
    this.originalLeft=this.element.scrollLeft;
    this.originalTop=this.element.scrollTop;
   
    if(this.options.mode == 'absolute') {
      this.options.x -= this.originalLeft;
      this.options.y -= this.originalTop;
    } else {
   
    }
  },
  update: function(position) {   
    this.element.scrollLeft = this.options.x * position + this.originalLeft;
    this.element.scrollTop  = this.options.y * position + this.originalTop;
  }
});

// This function picks up the click and opens the corresponding info window
function clickItem(index) {
  GEvent.trigger(gmarkers[index], "click");
}

function moveTo(container, element) {
  Position.prepare();
  container_y = Position.cumulativeOffset($(container))[1];
  element_y = Position.cumulativeOffset($(element))[1];
  new Effect.Scroll(container, {x:0, y:(element_y - container_y - 150)});
  return false;
}

function loadDetails(index) {
  var totalImages = detailsImages[index].length;
  var nextIndex = (totalImages - 1) == 0 ? 0 : 1;
  var prevIndex = totalImages - 1;
  
  $("details_info").innerHTML = detailsInfo[index];
  $("details_images").innerHTML = '<img src="' + detailsImages[index][0] +'"/><br/><a href="" onclick="prevImage(' + index + ', ' + prevIndex + '); return false;">&#9668;</a> 1 of ' + totalImages + ' <a href="" onclick="nextImage(' + index + ', ' + nextIndex + '); return false;">&#9658;</a>';
 
  // Preload next and previous image
  var nextImage = new Image();
  nextImage.src = detailsImages[index][nextIndex];
  var prevImage = new Image();
  prevImage.src = detailsImages[index][prevIndex];
}

function prevImage(index, imageIndex) {
  var totalImages = detailsImages[index].length;
  var nextIndex = imageIndex == (totalImages - 1) ? 0 : imageIndex + 1;
  var prevIndex = imageIndex == 0 ? totalImages - 1 : imageIndex - 1;

  $("details_images").innerHTML = '<img src="' + detailsImages[index][imageIndex] + '"/><br/><a href="" onclick="prevImage(' + index + ', ' + prevIndex + '); return false;">&#9668;</a> ' + (imageIndex + 1) + ' of ' + totalImages + ' <a href="" onclick="nextImage(' + index + ', ' + nextIndex + '); return false;">&#9658;</a>';

  // Preload previous image
  var prevImage = new Image();
  prevImage.src = detailsImages[index][prevIndex];
}

function nextImage(index, imageIndex) {
  var totalImages = detailsImages[index].length;
  var nextIndex = imageIndex == (totalImages - 1) ? 0 : imageIndex + 1;
  var prevIndex = imageIndex == 0 ? totalImages - 1 : imageIndex - 1;

  $("details_images").innerHTML = '<img src="' + detailsImages[index][imageIndex] +'"/><br/><a href="" onclick="prevImage(' + index + ', ' + prevIndex + '); return false;">&#9668;</a> ' + (imageIndex + 1) + ' of ' + totalImages + ' <a href="" onclick="nextImage(' + index + ', ' + nextIndex + '); return false;">&#9658;</a>';
  
  // Preload next image
  var nextImage = new Image();
  nextImage.src = detailsImages[index][nextIndex];
}

function switchRightDivs() {
  var sequence=Sortable.sequence('right_frame');
  var temp=sequence[0];
  sequence[0]=sequence[1];
  sequence[1]=temp;
  Sortable.setSequence('right_frame', sequence);
  
  if (sequence[0] == 1) {
    $("switch_frame_1").innerHTML = '<img src="/images/controls/frame_down.png" title="Move map to the bottom window."/>';
  } else {
    $("switch_frame_1").innerHTML = '<img src="/images/controls/frame_up.png" title="Move map to the top window."/>';
  }
}

function setColors() {
  var sequence=Sortable.sequence('property_list');

  if (sequence.length > 1) for (var i = 0; i < sequence.length; i++) {
    $('item_' + sequence[i]).className='property_item color_' + (sequence[i] == selectedItem ? 3 : (i % 2));
  }
}

// This makes the property list and map to grow and shrink based on browser window size.
function resizeDivs() {  
  var windowHeight = getWindowHeight() - 20;  

  var adjustHeight = windowHeight - 645;
  adjustHeight = adjustHeight < 0 ? 0 : adjustHeight > 300 ? 300 : adjustHeight;

  $("wrapper").style.height = (510 + adjustHeight) + 'px';
  $("left_frame").style.height = (510 + adjustHeight) + 'px';
  $("property_frame").style.height = (500 + adjustHeight) + 'px';
  $("property_list").style.height = (450 + adjustHeight) + 'px';
  $("right_frame").style.height = (510 + adjustHeight) + 'px';
  $("frame_1").style.height = (245 + adjustHeight) + 'px';
  $("map").style.height = (233 + adjustHeight) + 'px';

  $("property_list").setStyle({ position: 'static' });
  $("property_list").setStyle({ position: 'relative' });
	$("right_frame").setStyle({ position: 'static' });
	$("right_frame").setStyle({ position: 'relative' });
	$("track-distance").setStyle({ position: 'static' });
	$("track-distance").setStyle({ position: 'relative' });
	$("handle-distance").setStyle({ position: 'static' });
	$("handle-distance").setStyle({ position: 'relative' });
	$("track-beds").setStyle({ position: 'static' });
	$("track-beds").setStyle({ position: 'relative' });
	$("handle-beds").setStyle({ position: 'static' });
	$("handle-beds").setStyle({ position: 'relative' });
	$("track-baths").setStyle({ position: 'static' });
	$("track-baths").setStyle({ position: 'relative' });
	$("handle-baths").setStyle({ position: 'static' });
	$("handle-baths").setStyle({ position: 'relative' });
	$("track-price").setStyle({ position: 'static' });
	$("track-price").setStyle({ position: 'relative' });
	$("handle-min").setStyle({ position: 'static' });
	$("handle-min").setStyle({ position: 'absolute' });
	$("handle-max").setStyle({ position: 'static' });
	$("handle-max").setStyle({ position: 'absolute' });
}

function getWindowHeight() {
  var windowHeight = 0;
  
  if (typeof(window.innerHeight) == 'number') {
    windowHeight = window.innerHeight;
  } else if (document.documentElement && document.documentElement.clientHeight) {
    windowHeight = document.documentElement.clientHeight;
  } else if (document.body && document.body.clientHeight) {
    windowHeight = document.body.clientHeight;
  }
  
  return windowHeight;
}

function currency(nStr, prefix)
{
  if (nStr <= 0) {
    return 'no min';
  } else if (nStr >= 1400000) {
    return 'no max';
  } else {
    nStr += '';
    x = nStr.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
      x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return prefix + x1 + x2;
  }
}

function Overlay(image,shadow,value,title) {
  this.IconURL=image;
  this.IconShadowURL=shadow;
  this.SearchValue = value;
  this.Title = title;
  this.setOverlayResults = setOverlayResults;
  this.OverlayList = [];
}

function setOverlayResults(results) {
  this.OverlayList = results;
}

function initializeOverlays() {
  OverlayTypes[0] = new Overlay("/images/overlays/school.png","/images/overlays/school_shadow.png","school","Show Schools");
  OverlayTypes[1] = new Overlay("/images/overlays/grocery.png","/images/overlays/grocery_shadow.png","grocery","Show Grocery Stores");
  OverlayTypes[2] = new Overlay("/images/overlays/restaurant.png","/images/overlays/restaurant_shadow.png","restaurant","Show Restaurants");
  OverlayTypes[3] = new Overlay("/images/overlays/bank.png","/images/overlays/bank_shadow.png","bank","Show Banks");
  OverlayTypes[4] = new Overlay("/images/overlays/gas.png","/images/overlays/gas_shadow.png","gas","Show Gas Stations");
  OverlayTypes[5] = new Overlay("/images/overlays/church.png","/images/overlays/church_shadow.png","church","Show Churches");
  OverlayTypes[6] = new Overlay("/images/overlays/cafe.png","/images/overlays/cafe_shadow.png","cafe","Show Cafes");
  // OverlayTypes[7] = new Overlay("/images/overlays/park.png","/images/overlays/park_shadow.png","park","Show Parks");
}

// From http://jumk.de/nospam/stopspam.html probably derived from Typo3
function UnCryptMailto(s) {
  var n = 0;
  var r = "";
  for (var i = 0; i < s.length; i++) {
    n = s.charCodeAt(i);
    if (n >= 8364) {
      n = 128;
    }
    r += String.fromCharCode(n - 1);
  }
  return r;
}

function linkTo_UnCryptMailto(s) {
  location.href=UnCryptMailto(s);
}

