/*
Copyright 2005-2007 James Tolley - http://www.bitperfect.com | http://www.gmaptools.com
All rights reserved.
This software is released under the LGPL. (http://www.opensource.org/licenses/lgpl-license.php)

0.1 - only works for things which already can open infoWindows
        GMarkers and BpMarkers

todo:
  make it work for multiple maps on the same page
    no "global" infoWindowOpener var

*/
(function(){
var makers = {};
var infoWindowOpener;
function setupGetInfoWindowOpener(map, maker) {
  if (arguments.length == 1)
    maker = GMarker;

  if(typeof(makers[maker]) != 'undefined')
    return;

  if (typeof(map.getInfoWindowOpener) != 'function') {
    map.getInfoWindowOpener = function() {
      return infoWindowOpener;
    };
  
    map.setInfoWindowOpener = function(iwOpener) {
      infoWindowOpener = iwOpener;
    };
  
    GEvent.addListener(map,'infowindowclose',function(){
      infoWindowOpener = null;
    });
  }
  
  function createCallback(origMethod) {
    return function() {
      if(!map.getInfoWindow().isHidden())
        map.closeInfoWindow();

      infoWindowOpener = this;

      origMethod.apply(this,arguments);
    }
  };

  // go through the openers and install new ones
  var openers = ['openInfoWindow','openInfoWindowTabs','openInfoWindowHtml','openInfoWindowTabsHtml','showMapBlowup'];
  for(var i = 0; i < openers.length; i++) {
    var methodName = openers[i];
    var originalMethod = maker.prototype[methodName];
    if (originalMethod)
      maker.prototype[methodName] = createCallback(originalMethod);
  }

  // hiding the opener makes the infoWindow close
  var originalHideMethod = maker.prototype.hide ? maker.prototype.hide : maker.prototype.prototype.hide;
  maker.prototype.hide = function() {
    if (infoWindowOpener === this)
      map.closeInfoWindow();
      
    originalHideMethod.call(this);
  };

  // make sure that remove closes the infoWindow, if this is the opener
  var originalRemoveMethod = maker.prototype.remove;
  maker.prototype.remove = function() {
    if (infoWindowOpener === this)
      map.closeInfoWindow();

    originalRemoveMethod.call(this);
  };
}
setupGetInfoWindowOpener.version = 0.1;
window.setupGetInfoWindowOpener = setupGetInfoWindowOpener;
})();

