﻿/// <reference name="MicrosoftAjax.js"/>

Type.registerNamespace("Reflex.Web.WebControls");

Reflex.Web.WebControls.ChatterBox = function(element) {
    Reflex.Web.WebControls.ChatterBox.initializeBase(this, [element]);
    this._subscribers = {};
    this._lastId = 0;
    if (Reflex.Web.WebControls.ChatterBox._singleton === undefined) Reflex.Web.WebControls.ChatterBox._singleton = this; 
};

Reflex.Web.WebControls.ChatterBox.get_Singleton = function() { return Reflex.Web.WebControls.ChatterBox._singleton; };
Reflex.Web.WebControls.ChatterBox.unsubscribe = function(eventName, id) { Reflex.Web.WebControls.ChatterBox.get_Singleton().unsubscribe(eventName, id); };
Reflex.Web.WebControls.ChatterBox.subscribe = function(eventName, filter, callback) { return Reflex.Web.WebControls.ChatterBox.get_Singleton().subscribe(eventName, filter, callback); };
Reflex.Web.WebControls.ChatterBox.notify = function(eventName, args) { Reflex.Web.WebControls.ChatterBox.get_Singleton().notify(eventName, args); };

Reflex.Web.WebControls.ChatterBox.prototype = {
    initialize: function() {
        Reflex.Web.WebControls.ChatterBox.callBaseMethod(this, 'initialize');

        // Add custom initialization here

        // See if we're the top one.
        if (window == window.parent) {
            var children = document.getElementsByTagName("iframe");
            for (var c = children.length - 1; c >= 0; c--) {
                if (children[c].contentWindow.Reflex !== undefined && children[c].contentWindow.Reflex.Web !== undefined && children[c].contentWindow.Reflex.Web.WebControls !== undefined && children[c].contentWindow.Reflex.Web.WebControls.ChatterBox !== undefined && children[c].contentWindow.Reflex.Web.WebControls.ChatterBox.get_Singleton !== undefined && children[c].contentWindow.Reflex.Web.WebControls.ChatterBox.get_Singleton() != null) {
                    children[c].contentWindow.Reflex.Web.WebControls.ChatterBox.get_Singleton().parentArrived();
                }
            }
        }
    },
    dispose: function() {
        //Add custom dispose actions here
        for (var e in this._subscribers) {
            for (var c = this._subscribers[e].length - 1; c >= 0; c--) {
                this.unsubscribe(event, this._subscribers[e][c].filter, this._subscribers[e][c].callback);
            }
        }

        Reflex.Web.WebControls.ChatterBox.callBaseMethod(this, 'dispose');
    },
    parentArrived: function() {
        if (window.parent.Reflex !== undefined && window.parent.Reflex.Web !== undefined && window.parent.Reflex.Web.WebControls !== undefined && window.parent.Reflex.Web.WebControls.ChatterBox !== undefined && window.parent.Reflex.Web.WebControls.ChatterBox.get_Singleton !== undefined && window.parent.Reflex.Web.WebControls.ChatterBox.get_Singleton() != null) {
            for (var e in this._subscribers) {
                for (var c = this._subscribers[e].length - 1; c >= 0; c--) {
                    window.parent.Reflex.Web.WebControls.ChatterBox.get_Singleton().subscribe(e, this._subscribers[e][c].filter, this._subscribers[e][c].callback);
                }
            }
        }
    },
    unsubscribe: function(event, id) {
        if (this._subscribers[event] !== undefined) {
            var subs = this._subscribers[event];
            for (var c = subs.length - 1; c >= 0; c--) {
                if (subs[c].id == id) {
                    subs.splice(c, 1);
                    c--;
                }
            }
            this._subscribers[event] = subs;
            if (window != window.parent) {
                if (window.parent.Reflex !== undefined && window.parent.Reflex.Web !== undefined && window.parent.Reflex.Web.WebControls !== undefined && window.parent.Reflex.Web.WebControls.ChatterBox !== undefined && window.parent.Reflex.Web.WebControls.ChatterBox.get_Singleton !== undefined && window.parent.Reflex.Web.WebControls.ChatterBox.get_Singleton() != null) {
                    window.parent.Reflex.Web.WebControls.ChatterBox.get_Singleton().unsubscribe(event, id);
                }
            }
        }
    },
    subscribe: function(event, filter, callback) {
        this._lastId++;
        if (this._subscribers[event] === undefined) {
            this._subscribers[event] = [{ 'filter': filter, 'callback': callback, 'id': this._lastId}];
        }
        else {
            this._subscribers[event].push({ 'filter': filter, 'callback': callback, 'id': this._lastId });
        }

        if (window != window.parent) {
            if (window.parent.Reflex !== undefined && window.parent.Reflex.Web !== undefined && window.parent.Reflex.Web.WebControls !== undefined && window.parent.Reflex.Web.WebControls.ChatterBox !== undefined && window.parent.Reflex.Web.WebControls.ChatterBox.get_Singleton !== undefined && window.parent.Reflex.Web.WebControls.ChatterBox.get_Singleton() != null) {
                return window.parent.Reflex.Web.WebControls.ChatterBox.get_Singleton().subscribe(event, filter, callback);
            }
        }

        return this._lastId;
    },
    _filterArgs: function(args, filter) {
        for (var prop in filter) {
            var not = false;
            var argprop = prop;
            if (prop.indexOf('!') == 0) {
                argprop = prop.substr(1);
                not = true;
            }
            if (args[argprop] === undefined) return false;
            else {
                if (args[argprop] == null) {
                    if (not == (filter[prop] == null)) return false;
                }
                else if (args[argprop].constructor && args[argprop].constructor.__typeName == 'Object' && filter[prop].constructor && filter[prop].constructor.__typeName == 'Object') {
                    if (not != (this._filterArgs(args[argprop], filter[prop]))) return false;
                }
                else if (args[argprop].constructor && args[argprop].constructor === Array) {
                    if (filter[prop].constructor && filter[prop].constructor === Array) {
                        for (var c = filter[prop].length - 1; c >= 0; c--) {
                            if (not == args[argprop].contains(filter[prop][c])) return false;
                        }
                    }
                    else if (not == args[argprop].contains(filter[prop])) return false;
                }
                else if (filter[prop].constructor && filter[prop].constructor === Array) {
                    if (not == filter[prop].contains(args[argprop])) return false;
                }
                else if (not == (args[argprop] == filter[prop])) return false;
            }
        }
        return true;
    },
    notify: function(event, args) {
        if (window != window.parent) {
            if (window.parent.Reflex !== undefined && window.parent.Reflex.Web !== undefined && window.parent.Reflex.Web.WebControls !== undefined && window.parent.Reflex.Web.WebControls.ChatterBox !== undefined && window.parent.Reflex.Web.WebControls.ChatterBox.get_Singleton !== undefined && window.parent.Reflex.Web.WebControls.ChatterBox.get_Singleton() != null) {
                window.parent.Reflex.Web.WebControls.ChatterBox.get_Singleton().notify(event, args);
            }
        }
        else {
            if (this._subscribers[event] !== undefined) {
                for (var c = this._subscribers[event].length - 1; c >= 0; c--) {
                    try {
                        if (this._filterArgs(args, this._subscribers[event][c].filter)) {
                            this._subscribers[event][c].callback(args);
                        }
                    }
                    catch (e) {
                        this.unsubscribe(event, this._subscribers[event][c].id);
                        c--;
                    }
                }
            }
        }
    }
};

Reflex.Web.WebControls.ChatterBox.registerClass('Reflex.Web.WebControls.ChatterBox', Sys.UI.Control);

if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

