/*
    core.js v 1.1.3
*/

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) {
                var selectedEls = core.grab[sType](sel, el);

                self.each(selectedEls, function(el) {
                    if (!self.contains(localRets, el) && typeof el === 'object') {
                        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)   { if (id && context) return [context.getElementById(id)]; else return []; },
        tag: function(tag, context) { if (tag && context) return context.getElementsByTagName(tag); else return []; },
        cssClass: function(className, context) {
            if (className && context) {
                var els = context.getElementsByTagName('*')
				      , retEls = [];

                core.each(els, function(el) {
                    if (core.css.hasClass(el, className))
                        retEls.push(el);
                });
                return retEls;
            }
            else return [];
        }
    },

    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;

})();
