function System()
{
    var prototypes = {};
    var listener = {};
    var savePrototypes, saveListener; 
   
    this.registerEvent = registerEvent;
    this.getNameEvents = getNameEvents;
    this.isRegister = isRegister;
    this.dispatchEvent = dispatchEvent;
    this.addEventListener = addEventListener;
    this.removeEventListener = removeEventListener;
   
    registerEvent("onloadSystem");
    addEventListener("onloadSystem", load);
    
    function load()
    {
        addEventListener("onbeforeload", saveState );
        addEventListener("onunload", restoreState );
    }
   
    function registerEvent( name )
    {
        if ( name == undefined )
            return false;
        var event = {};
        event.toString = function(){ return name };
        if ( prototypes[ event ] != undefined )
            return false;
        prototypes[ event ] = event;
        listener[ event ] = {};
        return true;
    }
    
    function isRegister( name )
    {
        if ( prototypes[ name ] != undefined )
            return true;
        else
            return false;
    }
    
    function getNameEvents()
    {
        var list = new Array();
        var e;
        for ( e in prototypes )
        {
            list.push( e.toString() );
        }
        return list;
    }
    
    function addEventListener( name, handler )
    {
        if ( (name == undefined)||(handler == undefined)||(listener[ name ] == undefined)
              ||(listener[ name ][ handler ] != undefined) )
            return false;
        listener[ name ][ handler ] = handler;
        return true;
    }
   
    function removeEventListener( name, handler )
    {
        if ( (name == undefined)||(handler == undefined)
            ||(listener[ name ] == undefined)
            ||(listener[ name ][ handler ] == undefined) )
            return false;
        delete listener[ name ][ handler ];
        delete prototypes[ name ][ handler ];
        return true;
    }
    
    function dispatchEvent( name, event )
    {
       if ( name == undefined )
            return false;
        if ( prototypes[ name ] == undefined )
            return false;      
        var key;
        var report = new Array();
        for ( key in  listener[ name ] )
        {
            try
            {
                listener[ name ][ key ]( event );
            }
            catch( error )
            {
                report.push( error );
            }
        }
        return report;
    }
    
    function saveState()
    {
        var event, handler;
        saveListener = {};
        savePrototypes = {};
        for ( event in prototypes )
        {
            savePrototypes[ event ] = prototypes[ event ];
            saveListener[ event ] = {};
            for ( handler in listener[ event ] )
            {
                saveListener[ event ][ handler ] = listener[ event ][ handler ]
            }
        }
    }
    
    function restoreState()
    {
        listener = saveListener;
        prototypes = savePrototypes;
    }
    
}
