var GoogleMap = {

  create: function(element_or_name, address) {
    element = $(element_or_name);
    element.address = address;
    Event.observe(window, 'load', GoogleMap.load.bindAsEventListener(element));
  },

  load: function(e) {
    var address = this.address;
    var map = new GMap2(this);
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    var geocoder = new GClientGeocoder();
    geocoder.getLatLng(
      address,
      function(point) {
        if (!point) {
          alert(address + " not found");
        } else {
          map.setCenter(point, 13);
          var marker = new GMarker(point);
          map.addOverlay(marker);
          marker.openInfoWindowHtml(GoogleMap.marker_for(address));
        }
      }
    );
    GEvent.addListener(
      map, "click",
      function(marker, point) {
        if (marker) marker.openInfoWindowHtml(GoogleMap.marker_for(address));
      }
    );
  },

  marker_for: function(address) {
    return '<p><b>' + address + '</b><br/><a href="http://www.google.com/maps?q=' + address + '" target="_blank">Open in New Window</a> &mdash; <a href="http://www.google.com/maps?q=' + address + '&f=d" target="_blank">Get Directions</a></p>'
  }

};

var Switchable = {

  create: function(element_or_name) {
    element = $(element_or_name);
    Event.observe(window, 'load', Switchable.switch_event.bindAsEventListener(element));
    Event.observe(element, 'change', Switchable.switch_event.bindAsEventListener(element));
  },

  switch_event: function() {
    if (this.tagName == 'SELECT') {
      Switchable.switch_element(this.id, this.options[this.selectedIndex], this.options);
    }
  },

  switch_element: function(name, selected, options) {
    for (o in options) {
      option = options[o]
      if (option && option.value) {
        class_name = name + '_' + option.value.replace(/ /g, '_');
        elements = document.getElementsByClassName(class_name);
        for (e in elements) {
          element = elements[e];
          if (element && element.style) {
            if (option == selected) {
              Element.show(element);
            } else {
              Element.hide(element);
            }
          }
        }
      }
    }
  }

};
