@@ -1,102 +1,128 @@
var GlobalEvents = ( function ( ) {
var EVENT_EXISTS = 'GlobalEvents: Event already exists.' ;
( function ( window ) {
var eventIsRunning ,
_eventStack ,
_findByName ,
stackEvent ,
removeEvent ,
eventListener ,
listen , unlisten ,
_set , _rem ,
_storage ;
var EVENT_EXISTS = 'GlobalEvents: Event already exists.' ;
_storage = window . localStorage ;
eventIsRunning = false ;
_eventStack = [ ] ;
_findByName = function ( eventName ) {
var evArray = _eventStack . filter ( function ( ev ) {
return ev . name === eventName ;
} ) ;
var eventIsRunning ,
_eventStack ,
_findByName ,
stackEvent ,
removeEvent ,
eventListener ,
listen , unlisten ,
_set , _rem , _parse ,
_storage ;
return evArray . length ? evArray [ 0 ] : null ;
}
stackEvent = function ( eventName , callback , args ) {
if ( _findByName ( eventName ) ) {
throw EVENT_EXISTS ;
_storage = window . localStorage ;
eventIsRunning = false ;
_eventStack = [ ] ;
_findByName = function ( eventName ) {
var evArray = _eventStack . filter ( function ( ev ) {
return ev . name === eventName ;
} ) ;
return evArray . length ? evArray [ 0 ] : null ;
} ;
stackEvent = function ( eventName , callback , args ) {
if ( _findByName ( eventName ) ) {
throw EVENT_EXISTS ;
} else {
var ev = {
name : eventName ,
callback : callback
} ;
if ( args ) {
ev . args = args ;
}
_eventStack . push ( ev ) ;
}
} ;
removeEvent = function ( eventName ) {
var ev = _findByName ( eventName ) ;
var idx = _eventStack . indexOf ( ev ) ;
_eventStack . splice ( idx , 1 ) ;
} ;
eventListener = function ( e ) {
var ev = _findByName ( e . key ) ,
val = e . newValue ;
if ( ev && ! eventIsRunning ) {
eventIsRunning = true ;
if ( ev . args ) {
if ( val === '_evt' || ! val ) {
ev . callback . call ( this , ev . args ) ;
} else {
ev . callback . call ( this , ev . args , _parse ( val ) ) ;
}
} else {
var ev = {
name : eventName ,
callback : callback
} ;
if ( args ) {
ev . args = args ;
}
_eventStack . push ( ev ) ;
}
}
removeEvent = function ( eventName ) {
var ev = _findByName ( eventName ) ;
var idx = _eventStack . indexOf ( ev ) ;
_eventStack . splice ( idx , 1 ) ;
}
eventListener = function ( e ) {
var ev = _findByName ( e . key ) ;
if ( ev && ! eventIsRunning ) {
eventIsRunning = true ;
if ( ev . args ) {
ev . callback . call ( this , ev . args ) ;
} else {
ev . callback . call ( this ) ;
}
setTimeout ( function ( ) {
eventIsRunning = false ;
} , 10 ) ;
if ( val === '_evt' || ! val ) {
ev . callback . call ( this ) ;
} else {
ev . callback . call ( this , _parse ( val ) ) ;
}
}
setTimeout ( function ( ) {
eventIsRunning = false ;
} , 10 ) ;
}
listen = function ( ) {
window . addEventListener ( 'storage' , eventListener ) ;
}
unlisten = function ( ) {
window . removeEventListener ( 'storage' , eventListener ) ;
}
} ;
listen = function ( ) {
window . addEventListener ( 'storage' , eventListener ) ;
} ;
unlisten = function ( ) {
window . removeEventListener ( 'storage' , eventListener ) ;
} ;
_set = function ( key ) {
return _storage . setItem ( key , '_evt' ) ;
}
_rem = function ( key ) {
return _storage . removeItem ( key ) ;
}
_set = function ( key , value ) {
return _storage . setItem ( key , value || '_evt' ) ;
} ;
_rem = function ( key ) {
return _storage . removeItem ( key ) ;
} ;
_parse = function ( val ) {
try {
return JSON . parse ( val ) ;
} catch ( e ) { }
function GlobalEvents ( ) {
//begin listening for events
return val ;
} ;
function GlobalEvents ( ) {
//begin listening for events
unlisten ( ) ;
listen ( ) ;
} ;
GlobalEvents . prototype = {
on : stackEvent ,
off : removeEvent ,
trigger : function ( eventName , transportObject ) {
_set ( eventName , transportObject ) ;
unlisten ( ) ;
listen ( ) ;
setTimeout ( function ( ) {
_rem ( eventName ) ;
listen ( ) ;
} ) ;
}
} ;
GlobalEvents . prototype = {
on : stackEvent ,
off : removeEvent ,
trigger : function ( eventName ) {
_set ( eventName ) ;
unlisten ( ) ;
setTimeout ( function ( ) {
_rem ( eventName ) ;
listen ( ) ;
} ) ;
}
} ;
return new GlobalEvents ( ) ;
} ) ( ) ;
window . GlobalEvents = new GlobalEvents ( ) ;
} ) ( window ) ;
//usage
//usage #1 - trigger the event
//listen to the event in one window
GlobalEvents . on ( 'test' , function ( ) {
//do something when the event fires
} ) ;
//fire the event from another window
GlobalEvents . trigger ( 'test' ) ;
GlobalEvents . trigger ( 'test' ) ;
//usage #2 - trigger the event an transport an object between windows
//listen to the event in one window
GlobalEvents . on ( 'test' , function ( transportObj ) {
//do something with transportObj when the event fires
} ) ;
//fire the event from another window and send an object
GlobalEvents . trigger ( 'test' , { foo :bar , baz :bar } ) ;