try
{
	var dummy = EventDispatcher;
}
catch(e)
{ 

     EventDispatcher = function() {} 
     
     EventDispatcher.prototype.version = "1.0";


     var c = EventDispatcher ; // class 
     var p = EventDispatcher.prototype ; // prototype 

     c.initialize = function (target /*Object*/ ) { 
             if (target == undefined) return null ; 
             var attributes = [ 
                  "addEventListener"   , "dispatchEvent", "eventListenerExists" , 
                  "removeAllEventListeners" , "removeEventListener" , "updateEvent" 
             ] ; 
             var i = new EventDispatcher ; 
             var l = attributes.length ; 
             while(--l > -1) { 
                   var prop = attributes[ l ] ; 
                  target [prop] = i[prop] ; 
             } 
     } 

     c.toString = function() /*String*/ { 
             return "[EventDispatcher]" ; 
     } 

     p._listeners = null ; 

     p.addEventListener = function ( eventName /*String*/ , obj /*Object*/, func ) /*Void*/ { 
             if (typeof(eventName) == "string") { 
                   if (this._listeners == null) this._listeners = {} ; 
                   var a = this._listeners[eventName] ; 
                   if (a == undefined) this._listeners[eventName] = a = [] ; 
                   if (EventDispatcher.indexOf( a , obj , func) == -1) { 
                        a.push( { o:obj , f:func } ) ; 
                   } 
             } 
     } 
      
     p.dispatchEvent = function ( ev /*Object*/ ) /*Void*/{
     	try{ 
             if ( typeof (ev.type) == "string") { 
                   if ( ev.type == "ALL") return ; 
                   var a ; 
                   if (ev.target == undefined) ev.target = this ; 
                   var f = this[ev.type + "_handler"] ; 
                   if (f != undefined ) f(ev) ; 
                   if( this._listeners ) a   = this._listeners[ev.type] ; 
                   if (a != undefined ) EventDispatcher.dispatch(ev.target, a, ev) ; 
                   if( this._listeners ) a   = this._listeners["ALL"] ; 
                   if (a != undefined) EventDispatcher.dispatch(ev.target, a, ev) ; 
             }
     	}
     	catch( err )
     	{
     		for( var i in err )
     		{
     			trace( i + ":" +  err[i] );
     		}
     	} 
     } 
      
     p.eventListenerExists = function (eventName/*String*/, obj /*Object*/, func/*Object*/) /*Boolean*/ { 
             var a = _listeners[eventName] ; 
             if (a == undefined) return false ; 
             return (EventDispatcher.indexOf(a, obj, func) > -1) ; 
     } 

     p.removeAllEventListeners = function(eventName/*String*/) /*Void*/ { 
             if (eventName) delete this._listeners[eventName] ; 
             else delete this._listeners ; 
     } 

     p.removeEventListener = function ( eventName /*String*/ , obj /*Object*/ , func /*Object*/ ) /*Void*/ { 
             var a = this._listeners[eventName] ; 
             if (a == undefined) return ; 
             var id = EventDispatcher.indexOf(a, obj, func) ; 
             if (id > -1) a.splice(id, 1) ; 
     } 
      
     p.updateEvent = function ( eventName/*String*/, oInit/*Object*/) /*Void*/ { 
             var ev = {} ; 
             ev.dynamic = true ; 
             ev.type = eventName ; 
             ev.target = this ; 
             if ( oInit != undefined ) for (var each in oInit) ev[each] = oInit[each] ; 
             this.dispatchEvent( ev ) ; 
     } 


     c.dispatch = function ( target /*Object*/ , a /*Array*/ , ev /*Object*/ ) /*Void*/ { 
             for (var each in a) { 
                   var item = a[each] ; 
                   var o = item.o ; 
                   var f = item.f ; 
                   var tof = typeof(o) ; 
                   if (tof == "object") { 
                        if (f instanceof Function) { 
                             var f = Proxy.create(o, f) ; 
                             if (f != undefined) f(ev) ; 
                        } else if (o["handleEvent"] != undefined && f == undefined) { 
                              o ["handleEvent"](ev) ; 
                        } else { 
                             if (f == undefined) f = ev.type ; 
                             if (typeof(f) == "string" && o[f] != undefined) { 
                                   o [f].apply(o, [ev]) ; 
                             } 
                        } 
                  }   else { // function 
                       if( o ) o.apply(target, [ev]) ; 
                   } 
             }      
      } 
      
     c.indexOf = function ( a /*Array*/ , o /*Object*/ , f /*Object*/ ) /*Number*/ { 
             var l = a.length ; 
             while (--l > -1) { 
                   var item = a[ l ] ; 
                   if (item.o == o && item.f == f) return l ; 
             } 
             return -1; 
     } 

     delete c ; 
     delete p ;       
} 