﻿var TinyMCEEventDispatcher =
{
    editors: new Hashtable(),

    add: function(tinyMCEEditorID)
    {
        var tinyMCEEditor = new TinyMCEEditor(tinyMCEEditorID);
        this.editors.set(tinyMCEEditorID, tinyMCEEditor);
    },
    
    onEvent: function(tinyMCEID, tinyMCEEvent)
    {
        var editor = this.editors.get(tinyMCEID);
        
        if (editor != null)
        {
            var event = editor.getEventByName(tinyMCEEvent.type);
            
            if (event != null)
                event.fireEvent();
        }
    },
    
    addListener: function(tinyMCEID, eventName, callback)
    {
        var editor = this.editors.get(tinyMCEID);
        
        if (editor != null)
        {
            var event = editor.getEventByName(eventName);
            
            if (event == null)
                event = editor.addEvent(eventName);
            
            event.addCallback(callback);
        }
    }
};

function TinyMCEEditor(ID)
{
    this.ID = ID;
    this.events = [];
    this.eventNameMapping = new Hashtable();
}

TinyMCEEditor.prototype.addEvent = function(name)
{
    var tinyMCEEditorEvent = new TinyMCEEditorEvent(name);
    this.events.push(tinyMCEEditorEvent);
    this.eventNameMapping.set(name, tinyMCEEditorEvent);
    
    return tinyMCEEditorEvent;
}

TinyMCEEditor.prototype.getEventByName = function(name)
{
    return this.eventNameMapping.get(name);
}

function TinyMCEEditorEvent(name)
{
    this.name = name;
    this.callbacks = [];
}

TinyMCEEditorEvent.prototype.addCallback = function(callback)
{
    this.callbacks.push(callback);
}

TinyMCEEditorEvent.prototype.fireEvent = function()
{
    this.callbacks.each(function(callback)
    {
        callback();
    });
}