Special Javascript function in Asp.net?
<pre><code>///&lt;reference name="MicrosoftAjax.js"/&gt;
Type.registerNamespace("AmpUI.Form");

AmpUI.Form.FBuilder = function (element) {
    AmpUI.Form.FBuilder.initializeBase(this, [element]);
    this._questions = null;
    this._formID = null;
    this._submitted = null;
    this._facID = null;
    this._formType = null;
    this._autoSaveID = null;
    this._typeName = null;
    this._enableAutoSave = true;
    this._autoSaveInterval = 30000;
    this._template = null;
    this._btnsave = null;
    this._btnsubmit = null;
    this._btnsavebottom = null;
    this._btnsubmitbottom = null;
    this._saveDelegate = null;
    this._submitDelegate = null;
    this._isautosave = null;
    this._saveCallback = null;
    this._submitCallback = null;
};

//define proto
AmpUI.Form.FBuilder.prototype = {
    initialize: function () {
        AmpUI.Form.FBuilder.callBaseMethod(this, "initialize");

        //wire up save/submit events
        if (this._submitted) {
            this.GetResponses(this);
        }
        else {

            //register the dependencies
            Array.forEach(this.get_qrefs(), function (e, i, a) {
                e.registerDepedency(a);
            });
            //start autosave
            if (this._enableAutoSave &amp;&amp; !this._submitted) {
                this._autoSaveID = setInterval("$find('" + this._element.id + "').SaveForm(true);", this._autoSaveInterval);
            }
            if (this._saveDelegate === null) {
                this._saveDelegate = Function.createDelegate(this, this.Save);
            }
            Sys.UI.DomEvent.addHandler($get(this._btnsave), 'click', this._saveDelegate);
            Sys.UI.DomEvent.addHandler($get(this._btnsavebottom), 'click', this._saveDelegate);

            if (this._submitDelegate === null) {
                this._submitDelegate = Function.createDelegate(this, this.SubmitForm);
            }
            Sys.UI.DomEvent.addHandler($get(this._btnsubmit), 'click', this._submitDelegate);
            Sys.UI.DomEvent.addHandler($get(this._btnsubmitbottom), 'click', this._submitDelegate);
        }
        this._template = "&lt;div class='form_question'&gt;&lt;span&gt;{2}&lt;/span&gt;&lt;div class='form_answer'&gt;{3}&lt;/div&gt;&lt;/div&gt;";
    },
    dispose: function () {
        //init
        AmpUI.Form.FBuilder.callBaseMethod(this, "dispose");
    },
    SaveForm: function (is_auto) {
        this._isautosave = is_auto;
        var questions = this.get_json();
        var sa = new ampWeb.FormService();
        sa.SaveFormQuestions(Sys.Serialization.JavaScriptSerializer.serialize(this.get_json()), false, this._typeName, this.onSuccess, this.onFail, this);
    },
    Save: function () {
        this.SaveForm(false);
    },
    SubmitForm: function () {
        var useValidation = true;
        var valid = false;
        try {
            valid = Page_ClientValidate();
        }
        catch (e) {
            useValidation = false;
        }
        if (valid || !useValidation) {
            //stop autosave
            clearInterval(this._autoSaveID);
            autosaveEnabled = false;
            var sa = new ampWeb.FormService();
            sa.SaveFormQuestions(Sys.Serialization.JavaScriptSerializer.serialize(this.get_json()), true, this._typeName, this.onSubmitComplete, this.onFail, this);
        } else {
            $('#' + me._element.id + ' .fbuilder-result').html('Invalid responses were found.  Please make all required corrections before submitting.');
        }
    },
    onSuccess: function (s, me) {
        $('#' + me._element.id + ' .fbuilder-result').fadeOut();
        if (me._isautosave) {
            var now = new Date();
            $('#' + me._element.id + ' .fbuilder-result').html('Last autosave:' + now.format('hh:mm tt'));
        } else {
            $('#' + me._element.id + ' .fbuilder-result').html('Form has been saved.');
            me._save();
            if (me._saveCallback)
                me._saveCallback.call(me);
        }
        $('#' + me._element.id + ' .fbuilder-result').fadeIn();
    },
    onFail: function (r, me) {
        $('#' + me._element.id + ' .fbuilder-result').html(r.get_message());
        //var s = new ampWeb.FormService();
        //s.ReportAjaxError(r.get_message());
    },
    onSubmitComplete: function (r, me) {
        $('#' + me._element.id + ' .fbuilder-result').html('Your responses have been submitted.');
        $('#' + me._element.id).fadeOut('fast', function () {
            $('#' + me._element.id).html('&lt;h1&gt;Thank you for submitting.&lt;/h1&gt;');
            clearInterval(me._autoSaveID);
            me._submitted = true;
            me.GetResponses(me);
            if (me._submitCallback)
                me._submitCallback.call(me);
        });
    },
    GetResponses: function (me) {
        var sa = new ampWeb.FormService();
        sa.GetFormResponses(me._formID, me.WriteToForm, me.onFail, me);
    },
    WriteToForm: function (answers, me) {
        var ar = Sys.Serialization.JavaScriptSerializer.deserialize(answers);
        //recreate if missing
        if ($('#' + me._element.id + ' #submitted').length == 0) { $('#' + me._element.id).append("&lt;div id='submitted'/&gt;"); }
        Array.forEach(ar, function (a) {
            $('#' + me._element.id + ' #submitted').append(String.format(me._template, null, null, a.question, a.response));
        });
        $('#' + me._element.id).fadeIn('fast');
        me._submit();
    },
    resetInterval: function () {
        if (this._enableAutoSave) {
            clearInterval(this._autoSaveID);
            this._autoSaveID = this._autoSaveID = setInterval("$find('" + this._element.id + "').SaveForm(true);", 30000);
        }
    },
    get_questions: function () {
        return Sys.Serialization.JavaScriptSerializer.serialize(this._questions);
    },
    set_questions: function (q) {
        this._questions = Sys.Serialization.JavaScriptSerializer.deserialize(q);
    },
    get_qrefs: function () {
        var a = new Array();
        Array.forEach(this._questions, function (i) {
            a.push($find(i));
        });
        return a;
    },
    get_json: function () {
        var a = new Array();
        Array.forEach(this._questions, function (i) {
            a.push($find(i));
        });
        var b = new Array();
        Array.forEach(a, function (i) {
            b.push(i.get_json());
        });
        return b;
    },
    get_formID: function () {
        return this._formID;
    },
    set_formID: function (value) {
        this._formID = value;
    },
    get_submitted: function () {
        return this._submitted;
    },
    set_submitted: function (value) {
        this._submitted = value;
    },
    set_facID: function (value) {
        this._facID = value;
    },
    get_facID: function () {
        return this._facID;
    },
    set_formType: function (value) {
        this._formType = value;
    },
    get_formType: function () {
        return this._formType;
    },
    set_typeName: function (value) {
        this._typeName = value;
    },
    get_typeName: function () {
        return this._typeName;
    },
    set_enableAutoSave: function (value) {
        this._enableAutoSave = value;
    },
    get_enableAutoSave: function () {
        return this._enableAutoSave;
    },
    set_autoSaveInterval: function (value) {
        if (!isNaN(value))
            this._autoSaveInterval = value;
    },
    get_autoSaveInterval: function () {
        return this._autoSaveInterval;
    },
    set_template: function (value) {
        this._template = value;
    },
    get_template: function () {
        return this._template;
    },
    set_btnsave: function (v) {
        this._btnsave = v;
    },
    get_btnsave: function () {
        return this._btnsave;
    },
    get_btnsubmit: function () {
        return this._btnsubmit;
    },
    set_btnsubmit: function (v) {
        this._btnsubmit = v;
    },
    set_btnsave: function (v) {
        this._btnsave = v;
    },
    get_btnsavebottom: function () {
        return this._btnsavebottom;
    },
    get_btnsubmitbottom: function () {
        return this._btnsubmitbottom;
    },
    set_btnsubmitbottom: function (v) {
        this._btnsubmitbottom = v;
    },
    set_btnsavebottom: function (v) {
        this._btnsavebottom = v;
    },
    get_saveCallback: function () {
        return this._saveCallback;
    },
    set_saveCallback: function (f) {
        var fn = window[f];
        if (fn &amp;&amp; typeof (fn) === 'function')
            this._saveCallback = fn;
    },
    get_submitCallback: function (f) {
        return this._submitCallback;
    },
    set_submitCallback: function (f) {
        var fn = window[f];
        if (fn &amp;&amp; typeof (fn) === 'function')
            this._submitCallback = fn;
    },
    add_save: function (handler) {
        this.get_events().addHandler("save", handler);
    },
    remove_save: function (handler) {
        this.get_events().removeHandler("save", handler);
    },
    _save: function () {
        var handler = this.get_events().getHandler("save");
        if (handler) handler(this, Sys.EventArgs.Empty);
    },
    add_submit: function (handler) {
        this.get_events().addHandler("submit", handler);
    },
    remove_submit: function (handler) {
        this.get_events().removeHandler("submit", handler);
    },
    _submit: function () {
        var handler = this.get_events().getHandler("submit");
        if (handler) handler(this, Sys.EventArgs.Empty);
    }
}
//register in the namespace
AmpUI.Form.FBuilder.registerClass("AmpUI.Form.FBuilder", Sys.UI.Control);
if (typeof (Sys) !== "undefined") Sys.Application.notifyScriptLoaded();
</code></pre>

<p>Is it special? for example, i never understand the addHandlder and removeHandler in the Javascript function and also WHAT IS registerNamespace AND WHAT IS Sys.Application.notifyScriptLoaded();?</p>

<p>Is it special? for example, i never understand the addHandlder and removeHandler in the Javascript function and also WHAT IS registerNamespace AND WHAT IS Sys.Application.notifyScriptLoaded();?</p>
