﻿
/// <reference path="jquery.js" />

function Lookup() {
    var me = this;
    me.singleton = new Object();

    me.items = new Object();

    me.listeners = new Object();

    me.setSingleton = function(key, theValue) {
        me.singleton[key] = theValue;
        if (!me.items[key]) {
            me.items[key] = new Array();
        }
        else {
            if (me.items.length > 1) {
                me.items[key].splice(1, me.items.length - 1);
            }
        }
    };

    me.addListener = function(key, listener) {
        if (me.listeners[key] == undefined) {
            me.listeners[key] = new Array();
        }

        if (!me.items[key]) {
            me.items[key] = new Array();
        }

        var arr = me.listeners[key];
        arr[arr.length] = listener;
    };

    me.getValue = function(key) {
        return me.items[key];
    }

    me.removeListener = function(key, listener) {
        var arr = me.listeners[key];

        if (arr != undefined) {
            var foundIndex;
            for (var i = arr.length - 1; i >= 0; --i) {
                var nextListeners = arr[i];
                if (nextListeners == listener) {
                    foundIndex = i;
                }
            }
            if (foundIndex != null) {
                arr.splice(foundIndex, 1);
            }
        }
    };

    this.addValue = function(key, value) {

        var values = this.items[key];

        if (!values) {
            values = new Array();
            this.items[key] = values;
        }
        if (this.singleton[key]) {
            values[0] = value;
        }
        else {
            values[values.length] = value;
        }

        this.notifyListeners(key);

    };



    me.removeValue = function(key, value) {

        var values = me.items[key];

        if (values) {
            var foundIndex;
            for (var i = values.length - 1; i >= 0; --i) {
                var nextValue = values[i];
                if (nextValue == value) {
                    foundIndex = i;
                }
            }
            if (foundIndex != null) {
                values.splice(foundIndex, 1);
            }

            me.notifyListeners(key);
        }
    };

    me.getValues = function(key) {
        var values = me.items[key];
        if (me.singleton[key]) {

            if (values.length > 0) {
                return values[0];
            }
            else {
                return null;
            }
        }
        else {
            return values;
        }
    };

    me.notifyListeners = function(key) {
        var values = me.items[key];
        var keyListeners = me.listeners[key];
        if (keyListeners != undefined) {
            for (var i = keyListeners.length - 1; i >= 0; --i) {
                var nextListeners = keyListeners[i];
                if (nextListeners != undefined) {
                    if (me.singleton[key]) {
                        if (values.length > 0) {
                            nextListeners(values[0]);
                        }
                        else {
                            nextListeners(null);
                        }
                    }
                    else {
                        nextListeners(values);
                    }

                }
            }
        }
    };
};


function addLookup(object) {
    object.lookup = new Lookup();
}

var GlobalLookup = new Lookup();