﻿function BellMan() {

    this.articleCitizenExists = articleCitizenExists;
    this.citizenArticleExists = citizenArticleExists;
    this.listen = listen;
    this.broadcast = broadcast;
    this.ignore = ignore;
    this.ignoreAll = ignoreAll;

    this.citizens = new Object();
    this.articles = new Object();

    function articleCitizenExists(article, citizen) {

        for (var index in this.articles[article]) 
            if (this.articles[article][index].citizen == citizen)
                return true;

        return false;
    }

    function citizenArticleExists(article, citizen) {

        for (var index in this.citizens[citizen])
            if (this.citizens[citizen][index] == article)
                return true;

        return false;
    }

    function listen(article, citizen, callback) {

        // add to articles
        if (this.articles[article] == null)
            this.articles[article] = new Array();

        if (!this.articleCitizenExists(article, citizen))
            this.articles[article].push(
            {
                citizen: citizen,
                callback: callback
            });

        // add to citizens
        if (this.citizens[citizen] == null)
            this.citizens[citizen] = new Array();

        if (!this.citizenArticleExists(article, citizen))
            this.citizens[citizen].push(article);
    }

    function ignore(article, citizen) {

        if (this.articles[article] == null)
            return;

        // remove from articles
        for (var articleCitizenIndex in this.articles[article])
            if (this.articles[article][articleCitizenIndex].citizen == citizen)
                this.articles[article].splice(articleCitizenIndex, 1);


        // remove from citizens
        for (var citizenArticleIndex in this.citizens[citizen])
            if (this.citizens[citizen][citizenArticleIndex] == article)
                this.citizens[citizen].splice(citizenArticleIndex, 1);
    }

    function ignoreAll(citizen) {

        // remove from articles
        for (var articleIndex in this.articles)
            for (var articleCitizenIndex in this.articles[articleIndex])
                if (this.articles[articleIndex][articleCitizenIndex].citizen == citizen)
                    this.articles[articleIndex].splice(articleCitizenIndex, 1);                

        // remove from citizens
        this.citizens[citizen] = null;
    }

    function broadcast(article, value) {

        if (this.articles[article] == null)
            return;

        for (var citizen in this.articles[article]) {
            if (this.articles[article][citizen].callback != null && this.articles[article][citizen].callback != undefined)
                this.articles[article][citizen].callback(article, value);
        }
    }
}
