var Core =
{
    addEventListener: function(target, type, listener)
    {
        if (typeof target.addEventListener != "undefined") {
            target.addEventListener(type, listener, false);
        }
        else if (typeof target.attachEvent != "undefined") {
            target.attachEvent("on" + type, listener);
        }
    },

    start: function(runnable)
    {
        var initOnce = function() {
            if (arguments.callee.done)
                return;
            arguments.callee.done = true;
            runnable();
        };
        Core.addEventListener(window, "DOMContentLoaded", initOnce);
        Core.addEventListener(window, "load", initOnce);
    },

    getElementsByClassName: function(targetElement, className)
    {
        var elementArray = targetElement.getElementsByTagName("*");
        var matchedArray = [];
        var pattern = new RegExp("(^| )" + className + "( |$)");
        for (var i = 0; i < elementArray.length; i++) {
            if (pattern.test(elementArray[i].className))
                matchedArray.push(elementArray[i]);
        }
        return matchedArray;
    },

    hasClass: function(targetElement, className)
    {
        var pattern = new RegExp("(^| )" + className + "( |$)");
        return pattern.test(targetElement.className);
    },

    addClass: function(targetElement, className)
    {
        if (!Core.hasClass(targetElement, className)) {
            if (targetElement.className == "")
                targetElement.className = className;
            else
                targetElement.className += " " + className;
        }
    },

    removeClass: function(targetElement, className)
    {
        var pattern = new RegExp("(^| )" + className + "( |$)");
        targetElement.className = targetElement.className.replace(pattern, "");
        targetElement.className = targetElement.className.replace(/ $/, "");
    }
};
