Google Maps v3 Infobox Plugin

HTML

<script src="http://maps.googleapis.com/maps/api/js?libraries=drawing"></script>
<div id="map"></div>

CSS

#map {
    width:750px;
    height:400px;
}
.context-menu-marker {
    border-style:none;
    border-width:0px;
    position:absolute;
    visibility:hidden;
    background:red;
}

.options-marker {
    width:96%;
    height:18px;
    padding:3px 0px 3px 2px;
    border:1px solid #ccc;
    cursor:pointer;
}

.options-marker:hover {
    background:#ccc;   
}
}

JavaScript

var loc, map, marker, contextMenu;

ContextMenu.prototype = new google.maps.OverlayView();

/**
  * onAdd is called when the map's panes are ready and the overlay has been
  * added to the map.
  */
ContextMenu.prototype.onAdd = function() {
    
    $("<div id='cMenu' class='context-menu-marker'></div>").appendTo(document.body);
    var divOuter = $("#cMenu").get(0);
    
    for(var i=0;i < this.menuItems.length;i++) {
        var mItem = this.menuItems[i];
        $('<div id="' + mItem.id + '" class="options-marker">' +
          mItem.label + '</div>').appendTo(divOuter);
    }
    
    this.div_ = divOuter;
    
    // Add the element to the "overlayLayer" pane.
    var panes = this.getPanes();
    //panes.overlayLayer.appendChild();
    panes.overlayMouseTarget.appendChild(this.div_);
    
    var me = this;
    
    for(var i=0;i < this.menuItems.length;i++) {
        var mItem = this.menuItems[i];
        
        var func = function() {
           me.clickedItem = this.id;
           google.maps.event.trigger(me, 'click');
        };
        
        google.maps.event.addDomListener($("#" + mItem.id).get(0), 'click', $.proxy(func, mItem));
    }
    
    
    google.maps.event.addListener(me, 'click', function() {
       alert(me.clickedItem); 
    });
    
};

ContextMenu.prototype.draw = function() {
    var div = this.div_;
    div.style.left = '0px';
    div.style.top = '0px';
    div.style.width = '100px';
    div.style.height = '50px';
};

// The onRemove() method will be called automatically from the API if
// we ever set the overlay's map property to 'null'.
ContextMenu.prototype.onRemove = function() {
    this.div_.parentNode.removeChild(this.div_);
    this.div_ = null;
};

// Set the visibility to 'hidden' or 'visible'.
ContextMenu.prototype.hide = function() {
  if (this.div_) {
    // The visibility property must be a string enclosed in quotes.
    this.div_.style.visibility = 'hidden';
  }
};

ContextMenu.prototype.show = function(cpx) {
 ...