var core = (function() {

	var util = {
	
	}
	
	var self = {
	
		ready: function(callback){
			if (document.addEventListener) {
				document.addEventListener('DOMContentLoaded', callback, false); }
			else {
				document.onreadystatechange = function() {
					!(document.readyState === 'complete') || callback();
				}
			}
		},

		getElements: function(selector) {
			var core = self
			  , selectorArr
			  , retElements = [document];
					
			selector = selector || '';
			selectorArr = selector.split(/\s/);
			
			self.each(selectorArr, function(sel) {
				var localRets = [];

				sType = core.getSelectorType(sel)
				sel = sel.replace(/[#.]/, '');
				self.each(retElements, function(el) {
					selectedEls = core.grab[sType](sel, el);
					self.each(selectedEls, function(el) {
						if (!self.contains(localRets, el))
							localRets.push(el);
					});
				});
				
				retElements = localRets;
			});

			return retElements;
		},
		
		css: {
			hasClass: function(el, cssClass) {
				rClass = new RegExp('\\b' + cssClass + '\\b');
				return rClass.test(el.className);
			},
			addClass: function(el, cssClass) {
				if (!core.css.hasClass(el, cssClass)) {
					classes = el.className ? el.className.split(/\s/) : [];
					classes.push(cssClass);
					el.className = classes.join(' ');
				}
			},
			
			removeClass: function(el, cssClass) {
				el = el || {};
				rClass = new RegExp('\\s?\\b' + cssClass + '\\b\\s?', 'g');
				el.className = !!el.className ? el.className.replace(rClass, ''): '';
			}
		},
		
		createElement: function(args) {
		
		},
		
		// Utilities
		grab: {
			id: function(id, context) {return [context.getElementById(id)];},
			tag: function(tag, context) {return context.getElementsByTagName(tag);},
			cssClass: function(className, context) {
				var els    = context.getElementsByTagName('*')
				  , retEls = [];

				core.each(els, function(el) {
					if (core.css.hasClass(el, className))
						retEls.push(el);
				});
				return retEls;
			}
		},
		
		getSelectorType: function(selector) {	
			var ret
			  , regs = {
					id: /^(#\w+)/,
					cssClass: /^(\.\w+)/,
					tag: /^(\w+)/
				}
				
			for (sType in regs) {
				ret = ret || (regs[sType].test(selector) ? sType : '');
			}
			return ret;	
		},
		
		each: function(data, callback) {
			if (data && data[0]) {
				for (var i=0;i<data.length;i++) {
					callback(data[i]);
				}
			}
			else if (typeof(data) === 'object') {
				for (var key in data) {
					callback(data[key]);
				}
			}
			return data;
		},
		
		contains: function(arr, value) {
			var contained = false;
			for (var i=0;i<arr.length;i++) {
				contained = arr[i] === value ? true : false;
				if (contained) break;
			}
			return contained;
		},
		
		message: function(msg) {
			var messages;
			if (typeof(console) != 'undefined') {
				console.log(msg)
			}
			else {
				messages = document.getElementById('messages');
				if (!messages) {
					messages = document.createElement('div');
					messages.id = "messages";
					messages.style.position = "absolute";
					messages.style.backgroundColor = "#FFFFFF";
					document.body.appendChild(messages);
				}
				messages.innerHTML += (msg + "<br/>" );
			}
		},
		
		// Reworked from www.quirksmode.org/js/events_properties.html
		getCursorPosition: function(e) {
			var posx = 0, posy = 0;
			e = e || window.event || {};
			posx = e.pageX || e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
			posy = e.pageY || e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
			
			return {x: posx, y: posy}
		}
	}
	
	return self;

})();
