﻿var RadEvents = (function () {
    // todo: make bubble dependent only on retval.
    // steps: Make all handlers in project bubble=true, return false; then remove bubble param and default bubble to true
    function RadEventHandler(handler, bubble) {
        var mHandler = null;
        var mBubble = false;

        mHandler = handler;
        if (typeof (bubble) !== "undefined") {
            mBubble = (bubble && true);
        }

        this.Call = function (sender, args) {
            var ret = mHandler(sender, args);
            var cancel = !(typeof ret === 'boolean' ? mBubble && ret : mBubble);
            args.set_cancel && args.set_cancel(cancel);
        };

    }

    function RadEventDispatcher() {

        var events = {};
        var debug = false;

        this.setDebug = function (lDebug) {
            debug = (lDebug && true);
        };

        function log(msg) {
            if (debug) {
                if (typeof (console) === "object") {
                    console.log(msg);
                } else {
                    alert(msg);
                }
            }
        }

        this.Register = function (senderId, eventName, handler, bubble) {
            senderId = senderId === null ? '__DEFAULT_BEHAVIOUR__' : senderId;
            if (!events.hasOwnProperty(senderId)) {
                events[senderId] = {};
            }

            events[senderId][eventName] = new RadEventHandler(handler, bubble);
            log(String.format("Register {0}->{1}", senderId, eventName));
        };

        this.Unregister = function (senderId, eventName) {
            senderId = senderId === null ? '__DEFAULT_BEHAVIOUR__' : senderId;
            log(String.format("Unregister {0}->{1}", senderId, eventName));
            if (events.hasOwnProperty(senderId) && events[senderId].hasOwnProperty(eventName)) {
                delete events[senderId][eventName];
            }
        };

        this.Dispatch = function (sender, args) {
            var command = args.get_commandName();
            var senderId = sender.get_id();

            log(String.format("Dispatch {0}->{1}", senderId, command));
            if (!events.hasOwnProperty(senderId) || !events[senderId].hasOwnProperty(command)) {
                log(String.format("Not found {0}->{1}. Trying default.", senderId, command));
                senderId = '__DEFAULT_BEHAVIOUR__';
            }

            if (events.hasOwnProperty(senderId) && events[senderId].hasOwnProperty(command)) {
                if (events[senderId][command] === null) {
                    log(String.format("Consume {0}->{1}", senderId, command));
                } else {
                    log(String.format("Handle {0}->{1}", senderId, command));
                    events[senderId][command].Call(sender, args);
                }
            } else {
                log(String.format("Not found {0}->{1}.", senderId, command));
            }
        };

    }

    function getRadGridEventItem(radGrid, eventArgs) {
        return radGrid.get_masterTableView().get_dataItems()[eventArgs.get_commandArgument()];
    }

    // Expose public namespace members here
    return {
        RadEventDispatcher: RadEventDispatcher,
        getRadGridEventItem: getRadGridEventItem
    };
} ());




