/*
0.1  - initial
0.11 - change args around
*/
function setupOnEndListeners(map,handlers) {
	if(typeof(map.__onEndListenersCurrentZoom) != 'undefined')
		return;

  // unpack handlers
  var zoomInHandler  = handlers.zoomIn  || function(){};
  var zoomOutHandler = handlers.zoomOut || function(){};
  var moveEndHandler = handlers.moveEnd || function(){};

  // called as a method of the map onzoomend and onmoveend
  // calls appropriate handler/s depending on the type of move/zoom performed
  function onEndHandler(oldZoom,newZoom) {
    if(arguments.length == 0) {
      var thisZoom = this.getZoom();
      if(this.__onEndListenersCurrentZoom != thisZoom)
        this.__onEndListenersCurrentZoom = thisZoom;
      else
        this.__onEndListenersOnMoveEnd();
    } else if(oldZoom < newZoom) {
      this.__onEndListenersOnZoomIn(oldZoom,newZoom);
    } else { // newZoom < oldZoom
      this.__onEndListenersOnZoomOut(oldZoom,newZoom);
    }
  }

  // store the current zoom
  map.__onEndListenersCurrentZoom = map.getZoom();

  // store the handlers
  map.__onEndListenersOnZoomIn  = zoomInHandler;
  map.__onEndListenersOnZoomOut = zoomOutHandler;
  map.__onEndListenersOnMoveEnd = moveEndHandler;

  // store the listeners
	map.__onEndListenersZoomEndListener = GEvent.addListener(map,'moveend',onEndHandler);
	map.__onEndListenersZoomEndListener = GEvent.addListener(map,'zoomend',onEndHandler);
}
setupOnEndListeners.version = 0.1;

function removeOnEndListeners(map) {
  // remove the listeners
  GEvent.removeListener(map.__onEndListenersMoveEndListener);
  GEvent.removeListener(map.__onEndListenersZoomEndListener);

  // delete the current zoom, the handlers, and the listeners
  delete map.__onEndListenersCurrentZoom;
  delete map.__onEndListenersMoveEndListener;
  delete map.__onEndListenersZoomEndListener;
  delete map.__onEndListenersOnZoomIn;
  delete map.__onEndListenersOnZoomOut;
  delete map.__onEndListenersOnMoveEnd;
}