// AFKL namespacing 
var AFKL = AFKL || {};
AFKL.event = AFKL.event || {};

// Pubsub component
;(function(AFKL){
    
    // Each loop function
    var each = function (object, callback) {
        if (typeof object === 'undefined') {
            return object;
        }
        var name, i = 0, length = object.length, isObj = length === undefined || typeof object === 'function';
        if ( isObj ) {
            for ( name in object ) {
                if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
                    break;
                }
            }
        } else {
            for ( var value = object[0];
                i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
        }
        return object;
    };
    
    var cache = {};
    
    AFKL.event.publish = function(topic, args){
        each(cache[topic], function () {
            this.apply(AFKL.event, args || []);
        });
    };

    AFKL.event.subscribe = function(topic, callback){
        if(!cache[topic]){
            cache[topic] = [];
        }
        cache[topic].push(callback);
        return [topic, callback];
    };

    AFKL.event.unsubscribe = function(handle){
        var t = handle[0];
        cache[t] && each(cache[t], function (idx) {
            if(this == handle[1]){
                cache[t].splice(idx, 1);
            }
        });
    };

})(AFKL);

