﻿if (typeof(Tangora) == 'undefined') var Tangora = {};
Tangora.BroadcastController = new BroadcastController();

if (typeof(AddEventListener)=='undefined')
{    
    if (typeof(addEventListener)!='undefined')
    {
        AddEventListener = addEventListener;
    }
    else
    {
        AddEventListener = function(what, where, elm)
        {                     
            if (!elm) window.attachEvent('on'+what, where);
            else
            {
                elm.attachEvent('on'+what, where);
            }
        }
    }
}

function BroadcastController()
{
    var observers = [];       
    
    this._findObserverIndex = function (obs)
    {        
        for(var i=0;i<observers.length;i++)
        {
            var observer = observers[i];
            if (observer.who == obs.who && observer.what == obs.what && observer.where == obs.where)
            {
                return i;
            }
        }
        return -1;
    }
    
    this._findObservers = function (who,what)
    {       
        if (typeof(who)!='string') who = who.id;
        var listeners = []; 
        for(var i=0;i<observers.length;i++)
        {
            var observer = observers[i];
            if (observer.who == who && observer.what == what)
            {
                listeners.push(observer);
            }
        }
        return listeners;
    }
    
    this._wrap = function(who, what, where)
    {
        return {'who':who,'what':what,'where':where}
    }
    
    // --- //
    
    this.Register = function(who, what, where)
    {
        observers.push(this._wrap(who,what,where));
    }
    
    this.UnRegister = function(who, what, where)
    {      
        var idx = this._findObserverIndex(this._wrap(who,what,where));  
        if (idx>-1)
        {
            observers = observers.splice(idx,1);
            return true;
        }
        return false;
    }
    
    this.Broadcast = function(who, what, data)
    {        
        var listeners = this._findObservers(who, what);
        for(var i=0;i<listeners.length;i++)
        {
            listeners[i].where.call(who, who, what, data);
        }
    }
}