PeriodicalExecuter.prototype.registerCallback = function() {
    this.intervalID = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
}

PeriodicalExecuter.prototype.stop = function() {
    clearInterval(this.intervalID);
}

Object.extend(Element, {
    removeAllChildren: function(element){
        if (!element) return;
        var e = $(element);
        while (e.childNodes.length > 0){
            e.removeChild(e.firstChild);
        }
    },

    // Creates a new element, adds it to the parent, and returns the new element
    addChildElement: function(parentEl, tagName, el_opts, style_opts){
        var e = $(parentEl);
        var newEl = document.createElement(tagName);
        // TODO: Loop through el_options an add attributes.
        if (el_opts){
            for (var name in el_opts){
                newEl[name] = el_opts[name];
            }
        }
        
        // TODO: Loop through style_opts and add attributes to style.
        
        e.appendChild(newEl);
        return newEl;    
    },
    
    addText: function(element, text){
        var e = $(element);
        var textNode = document.createTextNode(text);
        e.appendChild(textNode);    
    }
});