/*
Public domain, free to modify any way you like
Written 2011 by Johannes Koggdal
Web: http://koggdal.com/
Twitter: @JohannesKoggdal
*/
(function (window, document, undefined) {
	
	window.pubSub = {
	
		events: [],
		
		publish: function (eventNames, eventObject) {
			eventObject = eventObject || {};
			eventNames = eventNames.split(" ");
			
			var events, event, i;
			
			for (i = 0; i < eventNames.length; i++) {
				event = eventNames[i];
				events = this.events[event];
				
				// Abort if it does not exist
				if (events === undefined) {
					return;
				}
				
				// Fire all callbacks for this event
				for (n in events) {
					e = events[n];
					if ((typeof e === "object") && (typeof e.callback === "function")) {
						e.callback.call(e.context, eventObject);
					}
				}
			}
		},
		
		subscribe: function (eventNames, callback, context) {
			context = context || this;
			var events = this.events,
				event, i;
			
			eventNames = eventNames.split(" ");
			for (i = 0; i < eventNames.length; i++) {
				event = eventNames[i];
		
				// Create the array if it does not exist
				if (events[event] === undefined) {
					events[event] = [];
				}
				
				// Add the callback
				this.events[event].push({
					callback: callback,
					context: context
				});
				
			}
		},
		
		unsubscribe: function (eventNames, callback) {
			var events, event, key, i, n;
			
			eventNames = eventNames.split(" ");
			for (i = 0; i < eventNames.length; i++) {
			
				event = eventNames[i];
				events = this.events[event];
				
				// Abort if it does not exist
				if (events === undefined) {
					return;
				}
				
				// Find the key for this callback
				for (n in events) {
					if (events[n] && events[n].callback === callback) {
						key = n;
						break;
					}
				}
				
				// Remove the callback if index was found
				if (key !== undefined) {
					delete events[key];
				}
			}
		}
	};
	
})(window, document);
