# Action.js

    // define the action interface
    Ext.form.Action = function(form, options){
        this.form = form;
        this.options = options || {};
    };

    Ext.form.Action.CLIENT_INVALID = 'client';
    Ext.form.Action.SERVER_INVALID = 'server';
    Ext.form.Action.CONNECT_FAILURE = 'connect';
    Ext.form.Action.LOAD_FAILURE = 'load';

    Ext.form.Action.prototype = {
        type : 'default',
        failureType : undefined,
        response : undefined,
        result : undefined,

        // interface method
        run : function(options){

        },

        // interface method
        success : function(response){

        },

        // interface method
        handleResponse : function(response){

        },

        // default connection failure
        failure : function(response){
            this.response = response;
            this.failureType = Ext.form.Action.CONNECT_FAILURE;
            this.form.afterAction(this, false);
        },

        processResponse : function(response){
            this.response = response;
            if(!response.responseText){
                return true;
            }
            this.result = this.handleResponse(response);
            return this.result;
        },

        // utility functions used internally
        getUrl : function(appendParams){
            var url = this.options.url || this.form.url || this.form.el.dom.action;
            if(appendParams){
                var p = this.getParams();
                if(p){
                    url += (url.indexOf('?') != -1 ? '&' : '?') + p;
                }
            }
            return url;
        },

        getMethod : function(){
            return (this.options.method || this.form.method || this.form.el.dom.method || 'POST').toUpperCase();
        },

        getParams : function(){
            var bp = this.form.baseParams;
            var p = this.options.params;
            if(p){
                if(typeof p == "object"){
                    p = Ext.urlEncode(Ext.applyIf(p, bp));
                }else if(typeof p == 'string' && bp){
                    p += '&' + Ext.urlEncode(bp);
                }
            }else if(bp){
                p = Ext.urlEncode(bp);
            }
            return p;
        },

        createCallback : function(){
            return {
                success: this.success,
                failure: this.failure,
                scope: this,
                timeout: (this.form.timeout*1000),
                upload: this.form.fileUpload ? this.success : undefined
            };
        }
    };

    Ext.form.Action.Submit = function(form, options){
        Ext.form.Action.Submit.superclass.constructor.call(this, form, options);
    };

    Ext.extend(Ext.form.Action.Submit, Ext.form.Action, {
        type : 'submit',

        run : function(){
            var o = this.options;
            var method = this.getMethod();
            var isPost = method == 'POST';
            if(o.clientValidation === false || this.form.isValid()){
                Ext.Ajax.request(Ext.apply(this.createCallback(), {
                    form:this.form.el.dom,
                    url:this.getUrl(!isPost),
                    method: method,
                    params:isPost ? this.getParams() : null,
                    isUpload: this.form.fileUpload
                }));

            }else if (o.clientValidation !== false){ // client validation failed
                this.failureType = Ext.form.Action.CLIENT_INVALID;
                this.form.afterAction(this, false);
            }
        },

        success : function(response){
            var result = this.processResponse(response);
            if(result === true || result.success){
                this.form.afterAction(this, true);
                return;
            }
            if(result.errors){
                this.form.markInvalid(result.errors);
                this.failureType = Ext.form.Action.SERVER_INVALID;
            }
            this.form.afterAction(this, false);
        },

        handleResponse : function(response){
            if(this.form.errorReader){
                var rs = this.form.errorReader.read(response);
                var errors = [];
                if(rs.records){
                    for(var i = 0, len = rs.records.length; i < len; i++) {
                        var r = rs.records[i];
                        errors[i] = r.data;
                    }
                }
                if(errors.length < 1){
                    errors = null;
                }
                return {
                    success : rs.success,
                    errors : errors
                };
            }
            return Ext.decode(response.responseText);
        }
    });

    Ext.form.Action.Load = function(form, options){
        Ext.form.Action.Load.superclass.constructor.call(this, form, options);
        this.reader = this.form.reader;
    };

    Ext.extend(Ext.form.Action.Load, Ext.form.Action, {
        type : 'load',

        run : function(){
            Ext.Ajax.request(Ext.apply(
                    this.createCallback(), {
                        method:this.getMethod(),
                        url:this.getUrl(false),
                        params:this.getParams()
            }));
        },

        success : function(response){
            var result = this.processResponse(response);
            if(result === true || !result.success || !result.data){
                this.failureType = Ext.form.Action.LOAD_FAILURE;
                this.form.afterAction(this, false);
                return;
            }
            this.form.clearInvalid();
            this.form.setValues(result.data);
            this.form.afterAction(this, true);
        },

        handleResponse : function(response){
            if(this.form.reader){
                var rs = this.form.reader.read(response);
                var data = rs.records && rs.records[0] ? rs.records[0].data : null;
                return {
                    success : rs.success,
                    data : data
                };
            }
            return Ext.decode(response.responseText);
        }
    });

    Ext.form.Action.ACTION_TYPES = {
        'load' : Ext.form.Action.Load,
        'submit' : Ext.form.Action.Submit
    };

Ext - Copyright © 2006-2007 Ext JS, LLC
All rights reserved.