(function($){
    
    $.asterion = $.asterion || {};

    $.asterion.mapComponent = {
      setupMap: function(iframeWindow, data) {
        // we use the with() command to get into the iframe's scope. google maps
        // has weird errors if we don't do this.'
        /*jsl:ignore*/
        with(iframeWindow) {
          var map = new GMap2(document.getElementById('google_map_canvas'));
          loc = new GLatLng(data.center[0], data.center[1]);
          map.setCenter(loc, data.zoom);
          map.disableDoubleClickZoom();
          var marker = new GMarker(loc);
          if(data.marker_content){
            var markerHtml = data.marker_content;
            if(data.width) {
              markerHtml = "<div style='max-width: " + (data.width - 100) + "px'>" + markerHtml + "</div>"
            }
            marker.bindInfoWindowHtml(markerHtml);
          }

          if(data.control == "small") { map.addControl(new GSmallMapControl()); }
          if(data.control == "small-zoom") { map.addControl(new GSmallZoomControl()); }
          if(data.control == "large") { map.addControl(new GLargeMapControl()); }

          map.addOverlay(marker);
          GEvent.trigger(marker, 'click');
        }
        /*jsl:end*/
      },
        
      setupAdminMap: function(iframeWindow, data) {
        this.googleFrame = iframeWindow;
        /*jsl:ignore*/
        with(iframeWindow) {
          var map = parent.$j.asterion.mapComponent.adminMap = new GMap2(document.getElementById('google_map_canvas'));
          var loc = new GLatLng(data.center[0], data.center[1]);
          map.setCenter(loc, data.zoom);
          map.enableScrollWheelZoom();
          var marker = parent.$j.asterion.mapComponent.adminMarker = new GMarker(loc, {draggable: true});
          GEvent.addListener(marker, 'dragend', function() {
            parent.$j('input#component_latitude').val(marker.getLatLng().lat());
            parent.$j('input#component_longitude').val(marker.getLatLng().lng());
          });
          GEvent.addListener(map, 'zoomend', function(oldLevel, newLevel) {
            parent.$j('input#component_zoom').val(newLevel);
          });
          map.addControl(new GSmallMapControl());
          map.addOverlay(marker);
        }
        /*jsl:end*/
      },

      lookupAddress: function(address_id) {
        var address = $('#'+address_id).get(0).value;
        var googleFrame = this.googleFrame;
        var geocoder = new googleFrame.GClientGeocoder();
        geocoder.getLocations(address, function (data) {
          if(data.Placemark){
            $j('#geocode_errors').html('');
            var point = new googleFrame.GLatLng(data.Placemark[0].Point.coordinates[1], data.Placemark[0].Point.coordinates[0]);
            $.asterion.mapComponent.adminMap.setCenter(point, 13);
            $.asterion.mapComponent.adminMarker.setLatLng(point);
            googleFrame.GEvent.trigger($.asterion.mapComponent.adminMarker, 'dragend');
            if($('textarea#component_marker_content').length){
                $('textarea#component_marker_content').val(data.Placemark[0].address);
                $.asterion.mapComponent.admin_marker.openInfoWindowHtml(data.Placemark[0].address);
            }
          } else {
            $j('#geocode_errors').html("Could not find address specified");
          }
        });
      }

    };
})(jQuery);