window.AjaxControlAPI = new Object();
function AjaxControl() { }
AjaxControl.prototype.attr = function(attr, value) {
    if (typeof attr == "string") {
        if (value !== undefined) {
            this[attr] = value;
            return this;
        }
        return this[attr];
    }
    if (attr !== undefined) {
        for (var name in attr) {
            this[name] = attr[name];
        }
        return this;
    }
    attr = {};
    for (var name in this) {
        attr[name] = this[name];
    }
    return attr;
};
AjaxControl.prototype.dispose = function() {
    if (this.events !== undefined) {
        this.events.dispose();
        delete this.events;
    }
};
AjaxControl.prototype.initialize = function() {
    this.events = new EventHandlerList();
};
AjaxControl.prototype.invokeMethod = function(type, name, args) {
    return ((type.prototype[name] === undefined) ? null : (!args ? type.prototype[name].call(this) : type.prototype[name].apply(this, args)));
};
AjaxControl.create = function(name, type, args) {
    var control = AjaxControlAPI[name];
    if (control && control.dispose) {
        control.dispose();
        delete AjaxControlAPI[name];
    }
    control = new type(name);
    if (!(control instanceof AjaxControl)) {
        throw new Error("Object of type \"" + (typeof control) + "\" cannot be converted to type AjaxControl.");
    }
    if (!AjaxControl.initialized) {
        AjaxControl.initialized = true;
        if (window.addEventListener) {
            window.addEventListener("unload", AjaxControl.dispose, false);
        } else {
            window.attachEvent("onunload", AjaxControl.dispose);
        }
    }
    for (var arg in args) {
        control[arg] = args[arg];
    }
    if (control.initialize) {
        control.initialize();
    }
    AjaxControlAPI[name] = control;
};
AjaxControl.dispose = function() {
    for (var name in AjaxControlAPI) {
        var control = AjaxControlAPI[name];
        if (control.dispose) {
            control.dispose();
        }
    }
};