var INBOX = INBOX || {};
INBOX.namespace = function(namespace, application){
	var ns = namespace.split('.');
    var that = this;

	for(var i = 0; i < ns.length; i++){
		if(typeof that[ns[i]] === "undefined")
			that[ns[i]] = {};

		that = that[ns[i]];
	}

    if(typeof(application) === 'function')
        switch(ns.length){
            case 1: INBOX[ns[0]] = new application(); break;
            case 2: INBOX[ns[0]][ns[1]] = new application(); break;
            case 3: INBOX[ns[0]][ns[1]][ns[2]] = new application(); break;
            case 4: INBOX[ns[0]][ns[1]][ns[2]][ns[3]] = new application(); break;
            case 5: INBOX[ns[0]][ns[1]][ns[2]][ns[3]][ns[4]] = new application(); break;
        }
}

INBOX.namespace('classes.Observer', function(){
	"use strict";

	var Observer = function(){
		this.listeners = {};
	}

	Observer.prototype = {
		constructor: INBOX.classes.Observer,

		observe: function(event, callback){
			if(typeof(callback) !== 'function') return false;
            
            event = ('' + event).toLowerCase().split(/\s+/);
            for(var i = 0; i < event.length; i++){
                if(this.listeners[event[i]] === void(0)){
                    this.listeners[event[i]] = [];
                }
                this.listeners[event[i]].push(callback);
            }

			return this;
		},

		unobserve: function(event, callback){
			//if(typeof(callback) !== 'function') return false;

            event = ('' + event).toLowerCase().split(/\s+/);
            for(var i = 0; i < event.length; i++){
                if(typeof(this.listeners[event[i]]) === 'function')
                    delete(this.listeners[event[i]]);
            }

			return this;
		},

		notify: function(event, target){
			event = event.toLowerCase();
			var	handlers = this.listeners[event] || [];

			if(handlers.length > 0){
				event = jQuery.Event(event);
				for(var i = 0; i < handlers.length; i++){
					try{
						if(handlers[i](event, target) === false || event.isDefaultPrevented()){
							break;
						}
					}
                    catch(ex){
						window.console && window.console.log && window.console.log(ex);
					}
				}
			}
			return this;
		}
	}

	Observer.inherit = function(object){
		var i;

		for(i in Observer.prototype){
			if(Observer.prototype.hasOwnProperty(i) && typeof Observer.prototype[i] === "function"){
				object[i] = Observer.prototype[i];
			}
		}
		object.listeners = {};
	};

	return Observer;
});


INBOX.namespace('observer', function(){
    "use strict";

    return new INBOX.classes.Observer();
});
