/*
 * handle changes in the ActiveLayer
 */
      var activeLayerListeners = new Array();      
      function addActiveLayerListener(fn) {
         log.trace('inside addActiveLayerListener...');
         //don't allow duplicates
         activeLayerListeners.append(fn,true);
      }
      
      function removeActiveLayerListener(fn) {
         log.trace('inside removeActiveLayerListener...');
         activeLayerListeners.remove(fn);
      }
      
      function notifyActiveLayerListeners() {
         log.trace('notifying '+activeLayerListeners.length+' listeners interested in ActiveLayer change...');
         for (var i=0; i<activeLayerListeners.length; i++) {
            activeLayerListeners[i].call();
         }
      }

      
/*
 * handle changes in the Map
 */
      var mapListeners = new Array();      
      function addMapListener(fn) {
         log.trace('inside addMapListener...');
         mapListeners.append(fn,true);
      }
      
      function removeMapListener(fn) {
         log.trace('inside removeMapListener...');
         mapListeners.remove(fn);
      }
      
      function notifyMapListeners() {
         log.trace('notifying '+mapListeners.length+' listeners interested in Map changes...');
         for (var i=0; i<mapListeners.length; i++) {
            mapListeners[i].call();
         }
      }

      
/*
 * handle date range changes
 */
      var dateListeners = new Array();      
      function addDateListener(fn) {
         log.trace('inside addDateListener...');
         dateListeners.append(fn,true);
      }
      
      function removeDateListener(fn) {
         log.trace('inside removeDateListener...');      
         dateListeners.remove(fn);
      }
      
      function notifyDateListeners() {
         log.trace('notifying '+dateListeners.length+' listeners interested in Date changes...');
         for (var i=0; i<dateListeners.length; i++) {
            dateListeners[i].call();
         }
      }
      
      
/*
 * handle ajaxStatus changes
 */
      var ajaxStatusListeners = new Array();      
      function addAjaxStatusListener(fn) {
         log.trace('inside addAjaxStatusListener...');
         ajaxStatusListeners.append(fn,true);
      }
      
      function removeAjaxStatusListener(fn) {
        log.trace('inside removeAjaxStatusListener...');      
         ajaxStatusListeners.remove(fn);
      }
      
      function notifyAjaxStatusListeners() {
         log.trace('notifying '+ajaxStatusListeners.length+' listeners interested in Ajax status change to '+ajaxStatus);
         for (var i=0; i<ajaxStatusListeners.length; i++) {
            ajaxStatusListeners[i].call();
         }
      }
      
      function setAjaxStatus(msg) {
         //log.trace('inside setAjaxStatus w/ msg = '+msg);
         ajaxStatus = msg;
         notifyAjaxStatusListeners();
      }
      
/*
 * handle Area of Interest (AOI) changes
 */
      var aoiListeners = new Array();      
      function addAoiListener(fn) {
         //don't allow duplicates
         aoiListeners.append(fn,true);
         //log.debug('adding listener for AOI events');
      }
      
      function removeAoiListener(fn) {
         aoiListeners.remove(fn);
         //log.debug('removing listener for AOI events'); 
      }
      
      function notifyAoiListeners() {
         //log.debug('notifying '+aoiListeners.length+' listeners interested in AOI changes');
         for (var i=0; i<aoiListeners.length; i++) {
            aoiListeners[i].call();
         }
      }

/*
 * other possible "events" to listen for:
 *   envelope change, area of interest change, featureresponse change, tool/mode change, message,???
 */      
      
