Event.Publisher=Class.create()
Object.extend(Event.Publisher,{
_ls_event_targets: null,
_event_source_id: null,
_fl_trace_events: false,
getEventSourceId: function(){
if(typeof this._event_source_id=='function')
return this._event_source_id()
else
return this._event_source_id
},
getEventTarget: function(event_name){
if(! this._ls_event_targets)
this._ls_event_targets=new Array()
if(! this._ls_event_targets[ event_name ])
document.body.appendChild(
this._ls_event_targets[ event_name ]=document.createElement('A')
)
return this._ls_event_targets[ event_name ]
},
addEventListener: function(event_name,callback_func,capturing){
var targ=this.getEventTarget(event_name)
Event.observe(targ,'click',callback_func,capturing)
if(this._fl_trace_events){
var data={
publisher: this.getEventSourceId(),
event_name: event_name,
listener: callback_func,
capturing: capturing,
event_source_proxy: targ}
this.dispatchEvent('eventListenerAdded',data,true,true)}
},
removeEventListener: function(event_name,callback_func,capturing){
var targ=this.getEventTarget(event_name)
Event.stopObserving(targ,'click',callback_func,capturing)
if(this._fl_trace_events){
var data={
publisher: this.getEventSourceId(),
event_name: event_name,
listener: callback_func,
capturing: capturing,
event_source_proxy: targ}
this.dispatchEvent('eventListenerRemoved',data,true,true)}
},
dispatchEvent: function(event_name,data,can_bubble,cancelable){
var targ=this.getEventTarget(event_name)
var event_data={
event_name: event_name,
event_target: this,
data: data ? data : null}
if(! can_bubble)can_bubble=false
if(! cancelable)cancelable=false
var event=Event.create(event_data,can_bubble,cancelable,true,targ)
if(this._fl_trace_events){
if(event_name.match(/event(?:ListenerAdded|ListenerRemoved|Dispatched|Received)/))
return
var data={
publisher: this.getEventSourceId(),
event_name: event_name,
event_data: event_data,
can_bubble: can_bubble,
cancelable: cancelable,
event_source_proxy: targ,
result: event}
this.dispatchEvent('eventDispatched',data,true,true)}
},
toggleEventsTrace: function(){
var trace=Event.Tracer.findTracer()
if(! trace || ! this._fl_trace_events){
this._fl_trace_events=true
trace=Event.Tracer.startTrace()
trace.registerPublisher(this)}
else{
this._fl_trace_events=false
if(trace)
trace.unregisterPublisher(this)}
return this._fl_trace_events
},
isEventsTraceActive: function(){
return this._fl_trace_events}
})
Event.Listener=Class.create()
Object.extend(Event.Listener,{
_listens: null,
getEventHandlerName: function(event_name){
var onEvent_name=event_name.split(/[ _]/).join('-').camelize()
return "on"+onEvent_name.charAt(0).toUpperCase()+onEvent_name.substr(1)
},
listenForEvent: function(event_source,event_name,use_capture,onEvent_name){
if(! onEvent_name)
onEvent_name=this.getEventHandlerName(event_name)
if(! this._listens)this._listens=new Array()
var eventHandler=this[onEvent_name]
if(typeof(onEvent_name)=='function'){
eventHandler=onEvent_name}
var cb=eventHandler.bindAsEventListener(this)
this._listens.push([ event_source,event_name,use_capture,onEvent_name,cb ])
event_source.addEventListener(event_name,cb,use_capture)
},
stopListeningForEvent: function(event_source,event_name,use_capture,onEvent_name){
if(! this._listens)return false
if(! onEvent_name)
onEvent_name=this.getEventHandlerName(event_name)
var ix_item=-1
var ls=this._listens.detect(function(val,ix){
if((val[ 0 ]==event_source)
&&(val[ 1 ]==event_name)
&&(val[ 2 ]==use_capture)
&&(val[ 3 ]==onEvent_name)){
ix_item=ix
return true}
})
if(ix_item>=0){
this._listens.splice(ix_item,1)
event_source.removeEventListener(event_name,ls[ 4 ],use_capture)
return true}
return false}
})
Object.extend(Event,{
create: function(event_data,can_bubble,cancelable,fl_dispatch,target){
var event
if(document.createEvent){
if(! can_bubble)can_bubble=false
if(! cancelable)cancelable=false
if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){
event=document.createEvent('HTMLEvents')
event.initEvent('click',can_bubble,cancelable)}
else{
event=document.createEvent('MouseEvents')
event.initMouseEvent("click",can_bubble,cancelable,
window,0,0,0,0,0,
false,false,false,false,0,null)}}
else{
event=document.createEventObject()
event.event_type='onclick'}
event.event_data=event_data
if(fl_dispatch)
Event.dispatch(target,event)
return event
},
dispatch: function(target,event){
if(document.createEvent)
return target.dispatchEvent(event)
else
return target.fireEvent((typeof(event.event_type)!="undefined")? event.event_type : 'onclick',event)}
})

