function Control(element)
{
    if (element.moveToAfter == null)
        element = Element(element);
        
    if (element.eventHandlers != null)
        return element;

    element.eventHandlers     = [];
    element.eventHandlers[""] = [];
    
    element.addEventHandler   = Control.prototype.addEventHandler;
    element.triggerEvent      = Control.prototype.triggerEvent;
    
    // Add any of the element's existing event handlers to the new list.
    if (element.onfocus     != null) element.addEventHandler("focus",       element.onfocus);
    if (element.onblur      != null) element.addEventHandler("blur",        element.onblur);
    if (element.onchange    != null) element.addEventHandler("change",      element.onchange);
    if (element.onkeypress  != null) element.addEventHandler("keyPress",    element.onkeypress);
    if (element.onkeydown   != null) element.addEventHandler("keyDown",     element.onkeydown);
    if (element.onkeyup     != null) element.addEventHandler("keyUp",       element.onkeyup);
    if (element.onclick     != null) element.addEventHandler("click",       element.onclick);
    if (element.ondblclick  != null) element.addEventHandler("doubleClick", element.ondblclick);
    if (element.onmousedown != null) element.addEventHandler("mouseDown",   element.onmousedown);
    if (element.onmouseup   != null) element.addEventHandler("mouseUp",     element.onmouseup);
    if (element.onmouseover != null) element.addEventHandler("mouseOver",   element.onmouseover);
    if (element.onmouseout  != null) element.addEventHandler("mouseOut",    element.onmouseout);
    if (element.onsubmit    != null) element.addEventHandler("submit",      element.onsubmit);
    
    element.onfocus     = function() { return element.triggerEvent("focus");       };
    element.onblur      = function() { return element.triggerEvent("blur");        };
    element.onchange    = function() { return element.triggerEvent("change");      };
    element.onkeypress  = function() { return element.triggerEvent("keyPress");    };
    element.onkeydown   = function() { return element.triggerEvent("keyDown");     };
    element.onkeyup     = function() { return element.triggerEvent("keyUp");       };
    element.onclick     = function() { return element.triggerEvent("click");       };
    element.ondblclick  = function() { return element.triggerEvent("doubleClick"); };
    element.onmousedown = function() { return element.triggerEvent("mouseDown");   };
    element.onmouseup   = function() { return element.triggerEvent("mouseUp");     };
    element.onmouseover = function() { return element.triggerEvent("mouseOver");   };
    element.onmouseout  = function() { return element.triggerEvent("mouseOut");    };
    element.onsubmit    = function() { return element.triggerEvent("submit");      };
        
    return element;
}

// Adds an event handler to be called when the specified event is triggered on
// the control's element.
//
// Parameters:
//     eventName: The name of the event to watch for.
//     handler:   A function to handle the event.
Control.prototype.addEventHandler = function(eventName, handler)
{
    if (eventName instanceof Array)
    {
        for (var i = 0; i < eventName.length; ++i)
            this.addEventHandler(eventName[i], handler);
            
        return;
    }

    if (this.eventHandlers[eventName] == null)
        this.eventHandlers[eventName] = [];
        
    var eventHandlers = this.eventHandlers[eventName];
    
    eventHandlers.push(handler);
};

// Called whenever an event of type eventName is triggered on the control's
// element. Dispatches the event to the registered event handlers.
Control.prototype.triggerEvent = function(eventName)
{
    var eventHandlers = this.eventHandlers[""];
    
    if (this.eventHandlers[eventName] != null)
        eventHandlers = eventHandlers.concat(this.eventHandlers[eventName]);
        
    for (var i = 0; i < eventHandlers.length; ++i)
    {
        var result = eventHandlers[i].call(this, this, eventName);
        
        if (result != null)
            return result;
    }
    
    return true;
};

