Ext.apply(Ext.lib.Ajax, {
    serializeForm : function(form) {
        var fElements = form.elements || (document.forms[form] || Ext.getDom(form)).elements,
            hasSubmit = false,
            encoder = encodeURIComponent,
            element,
            options,
            name,
            val,
            data = '',
            type;
        Ext.each(fElements, function(element) {
            name = element.name;
            type = element.type;
            if (!element.disabled && name){
                if(/select-(one|multiple)/i.test(type)){
                    Ext.each(element.options, function(opt) {
                        if (opt.selected) {
                            data += String.format("{0}={1}&",
                                 encoder(name),
                                 (opt.hasAttribute ? opt.hasAttribute('value') : opt.getAttribute('value') !== null) ? opt.value : opt.text);
                        }
                    });
                } else if(!/file|undefined|reset|button/i.test(type)) {
                    if(!(/radio|checkbox/i.test(type) && !element.checked) && !(type == 'submit' && hasSubmit)){
                        data += encoder(name) + '=' + encoder(element.value) + '&';
                        hasSubmit = /submit/i.test(type);
                    }
                }
            }
        });
        return data.substr(0, data.length - 1);
    }
});
Ext.override(Ext.form.ComboBox, {
    initComponent : function(){
        Ext.form.ComboBox.superclass.initComponent.call(this);
        this.addEvents(
            'expand',
            'collapse',
            'beforeselect',
            'select',
            'beforequery'
        );
        if(this.transform){
            this.allowDomMove = false;
            var s = Ext.getDom(this.transform);
            if(!this.hiddenName){
                this.hiddenName = s.name;
            }
            if(!this.store){
                this.mode = 'local';
                var d = [], opts = s.options;
                for(var i = 0, len = opts.length;i < len; i++){
                    var o = opts[i];
                    var value = (o.hasAttribute ? o.hasAttribute('value') : o.getAttribute('value') !== null) ? o.value : o.text;
                    if(o.selected && !Ext.isEmpty(this.value, true)) {
                        this.value = value;
                    }
                    d.push([value, o.text]);
                }
                this.store = new Ext.data.SimpleStore({
                    'id': 0,
                    fields: ['value', 'text'],
                    data : d,
                    autoDestroy: true
                });
                this.valueField = 'value';
                this.displayField = 'text';
            }
            s.name = Ext.id();
            if(!this.lazyRender){
                this.target = true;
                this.el = Ext.DomHelper.insertBefore(s, this.autoCreate || this.defaultAutoCreate);
                Ext.removeNode(s);
                this.render(this.el.parentNode);
            }else{
                Ext.removeNode(s);
            }
        }
        else if(Ext.isArray(this.store)){
            if (Ext.isArray(this.store[0])){
                this.store = new Ext.data.SimpleStore({
                    fields: ['value','text'],
                    data: this.store,
                    autoDestroy: true
                });
                this.valueField = 'value';
            }else{
                this.store = new Ext.data.SimpleStore({
                    fields: ['text'],
                    data: this.store,
                    expandData: true,
                    autoDestroy: true
                });
                this.valueField = 'text';
            }
            this.displayField = 'text';
            this.mode = 'local';
        }
        this.selectedIndex = -1;
        if(this.mode == 'local'){
            if(this.initialConfig.queryDelay === undefined){
                this.queryDelay = 10;
            }
            if(this.initialConfig.minChars === undefined){
                this.minChars = 0;
            }
        }
    }
});