码迷,mamicode.com
首页 > Web开发 > 详细

项目总结(SME)- Web & Extjs4.2

时间:2015-07-15 20:43:35      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

上篇介绍了项目的架构及相关代码,这里我们将重点转向Extjs编写的Mvc.Web部分。由于在此项目之前,完全没有用过Extjs,导致前期问题多多,也是艰难的磨合期。但是写完几个页面后就发现,构建页面时如此的快速简单。经过这么长的使用,强烈建议大家在编写页面时使用Chrome来debug。

废话不多说,下面开始介绍我们项目Mvc.Web部分:

 首先在起始页需要加入Ext开发包,语言包,主题包及其他相关文件

技术分享_Layout.cshtml

其次建立app -> controller, model, store, view文件夹,再根据项目来加入JS文件。(注:所有文件夹使用)

而Extjs项目的入口是app.js, 在这个文件中定义了项目文件目录,以及首先加载的页面。(viewport)

技术分享
Ext.application({
    name: RFLFE,
    appFolder: /SME,
    autoCreateViewport: true,

    controllers: [Portal],

    launch: function () {
        Ext.Ajax.request({
            url: /Login/GetSession,
            method: POST,
            async: false,
            success: function (response, opts) {
                var obj = Ext.decode(response.responseText);
                Ext.state.Manager.set("LoginUser", obj.data);
            },
            failure: function (form, action) {
            }
        });
    }
});
//加载其他的工具包
Ext.Loader.setConfig({
    enabled: true,
    paths: {
        Ext.ux: /extjs4.2/ux
    }
});
Ext.app.Application.prototype.addController = function (classPath, config) {
    var self = this, config = config || {};
    Ext.require(classPath, function () {
        var controller = Ext.create(classPath, Ext.apply({
            application: self
        }, config.options || {}));

        self.controllers.add(classPath, controller);

        controller.init();
        controller.onLaunch();
        if (config.callback) {
            config.callback.call((config.scope || this), config);
        }
    });

    Ext.app.Application.prototype.removeController = function (classPath) {
        var self = this;
        var controller = self.controllers.get(classPath);
        controller.clearManagedListeners();
    };
    //用户点回格键会使页面退到上一页面,以下代码可去掉这个问题
    Ext.getDoc().on(keydown, function (e) {
        if (e.getKey() == 8 && e.getTarget().type == text && !e.getTarget().readOnly) {

        } else if (e.getKey() == 8 && e.getTarget().type == textarea && !e.getTarget().readOnly) {

        } else if (e.getKey() == 8) {
            e.preventDefault();
        }
    });
};
app.js
技术分享
Ext.define(‘RFLFE.view.Viewport‘, {
    extend: ‘Ext.container.Viewport‘,
    layout: ‘border‘,

    items: [{
        xtype: ‘portalHeader‘
    }, {
        xtype: ‘portalMenuPanel‘
    }, {
        xtype: ‘portalMainPanel‘
    }, {
        xtype: ‘portalFooter‘
    },{
        region: ‘east‘,
        items: [{
            xtype: ‘commonFileDownloader‘,
            id: ‘FileDownloader‘
        }]
    }]
});
Viewport
技术分享
Ext.define(‘RFLFE.view.common.FileDownloader‘, {
    extend: ‘Ext.Component‘,
    alias: ‘widget.commonFileDownloader‘,
    autoEl: {
        tag: ‘iframe‘,
        cls: ‘x-hidden‘,
        src: Ext.SSL_SECURE_URL
    },
    stateful: false,
    load: function (config) {
        var e = this.getEl();
        var location = config.url + (config.params ? ‘?‘ + Ext.urlEncode(config.params) : ‘‘);
        Ext.Msg.show({
            msg: ‘努力下载中,请等待...‘,
            progress: true,
            closable: false,
            wait: true,
            waitConfig: { interval: 200 }
        });
        if (Ext.isIE9 || Ext.isIE8 || Ext.isIE7) {
            e.dom.contentWindow.location.href = location;
            e.dom.onreadystatechange = function () {
                Ext.MessageBox.hide();
                if (e.dom.readyState == ‘complete‘) {
                    if (e.dom.attachEvent) {
                        e.dom.attachEvent(‘onload‘, function () {
                            Ext.Msg.show({
                                title: ‘Attachment missing‘,
                                msg: ‘The document can not be found on the server.‘,
                                buttons: Ext.Msg.OK,
                                icon: Ext.MessageBox.ERROR
                            })
                        });
                    }
                }
            };
        } else {
            e.dom.async = true;
            e.dom.src = location;
            Ext.Msg.close();
            e.dom.onload = function () {
                if (e.dom.contentDocument.body.childNodes[0].wholeText == ‘404‘) {
                    Ext.Msg.show({
                        title: ‘Attachment missing‘,
                        msg: ‘The document you are after can not be found on the server.‘,
                        buttons: Ext.Msg.OK,
                        icon: Ext.MessageBox.ERROR
                    })
                }
            }
        }
    }
});
FileDownloader
技术分享
var itemID2;
Ext.define(‘RFLFE.controller.application.ApplyCheck‘, {
    extend: ‘Ext.app.Controller‘,

    refs: [{
        ref: ‘portalMainPanel‘,
        selector: ‘portalMainPanel‘
        ......
    }],

    models: [‘RFLFE.model.Company‘ .......],

    stores: [‘application.DocApplyChecks‘ ...... ],
    views: [‘application.applyCheck.WorkPanel‘..... ],

    init: function () {
        this.control({
            ‘applyCheckAppQuery button[action=query]‘: {
                click: this.queryAppPool
            },
            ‘applyCheckAppList‘: {
                itemdblclick: this.gridItemClick
            },
            ‘applyCheckFirstDocSubmit toolbar #saveDoc‘: {
                click: this.saveDoc
            },
            ‘applyCheckWorkPanel button[action=submit]‘: {
                click: this.submitApply
            }
            .......
        })
    },
    queryAppPool: function (button) {
        var form = button.up(‘form‘);
        var store = this.getApplicationAppPoolForACsStore();
        if (form.isValid == false) {
            return;
        }
        var values = form.getValues();
        var record = Ext.create(‘RFLFE.model.AppPool‘, {});
        record.set(values);
        record.set(‘Stage_ID‘, 2);
        store.getProxy().extraParams = record.data;
        store.load();
    },

    gridItemClick: function (view, record, item, index, e) {
        var self = this;
        var currentUser = Ext.state.Manager.get("LoginUser").SoeId;
        if (record.data.StatusID != ‘UL‘ && record.data.StatusID != ‘IN‘ && record.data.StatusID != ‘RT‘ && record.data.ProcID != currentUser) {
            Ext.Msg.alert(‘提示‘, ‘******‘);
        }
        else {
            var tabPanel = this.getPortalMainPanel();
            itemID2 = ‘applyCheckWorkPanel‘ + record.data.AppNo;
            var tab = tabPanel.getComponent(itemID2);
            var tabTitle = ‘*****-‘ + record.data.AppNo;
            if (!tab) {
                tab = tabPanel.add({
                    ‘itemId‘: itemID2,
                    xtype: ‘applyCheckWorkPanel‘,
                    title: tabTitle,
                    closable: true,
                    closeAction: ‘destroy‘,
                    frame: true,
                    listeners: {
                        removed: function () {
                            this.destroy();
                        }
                    }
                });
            }
            tabPanel.setActiveTab(tab);
            tab.doLayout();
            tabPanel.doLayout();
            Ext.ComponentQuery.query(‘#‘ + itemID2 + ‘ #AppID‘)[0].setValue(record.data.App_ID);
            Ext.ComponentQuery.query(‘#‘ + itemID2 + ‘ #CompanyID‘)[0].setValue(record.data.CompanyID);
            record.PickUp(self, itemID2);
            self.loadAppInfo();
        }
    },

    loadAppInfo: function () {
        var appid = Ext.ComponentQuery.query(‘#‘ + itemID2 + ‘ #AppID‘)[0].value;
        var companyid = Ext.ComponentQuery.query(‘#‘ + itemID2 + ‘ #CompanyID‘)[0].value;
        var subTypeStore = this.getCommonSubTypeStore();
        var store2 = this.getCommonCitiesStore();
        //load Company Info
        var cModel = Ext.ModelManager.getModel(‘RFLFE.model.Company‘);
        cModel.load(appid, {
            success: function (record, operation) {
                store2.getProxy().extraParams = {
                    ‘type‘: ‘48‘ + record.data.Address_P
                };
                store2.load();
                Ext.ComponentQuery.query(‘#‘ + itemID2 + ‘ applyCheckCompanyInfo‘)[0].getForm(‘form‘).loadRecord(record);
            }
        });

        //load Loan Info
        var lModel = Ext.ModelManager.getModel(‘RFLFE.model.Loan‘);
        lModel.load(appid, {
            success: function (record, operation) {
                subTypeStore.getProxy().extraParams = {
                    ‘type‘: record.data.LoanDirection + ‘00‘
                };
                subTypeStore.load();
                Ext.ComponentQuery.query(‘#‘ + itemID2 + ‘ applyCheckLoanInfo‘)[0].getForm(‘form‘).loadRecord(record);
            }
        });

        //get the doclist
        var store = this.getApplicationDocApplyChecksStore();
        store.getProxy().extraParams = { ‘appid‘: appid, ‘stageid‘: 1, ‘currentStage‘: 2 };
        store.load();
    },
    saveDoc: function (button) {
        var viewDoc = this.getApplyCheckFirstDocSubmit().getView();
        var appid = Ext.ComponentQuery.query(‘#‘ + itemID2 + ‘ #AppID‘)[0].value;
        var Arr = [];
        var self = this;
        viewDoc.getStore().each(function (record) {
            if (record.data[‘uploaded‘]) {
                Arr.push(record.data[‘DocId‘]);
            }
        });
        if (Arr != undefined && Arr != null && Arr.length > 0) {
            Ext.Ajax.request({
                url: ‘/DocList/InsertDocStage‘,
                method: ‘POST‘,
                params: {
                    ‘docs‘: Arr,
                    ‘appid‘: Ext.ComponentQuery.query(‘#‘ + itemID2 + ‘ #AppID‘)[0].value,
                    ‘stage‘: 2
                },
                failure: function (response, options) {
                    Ext.Msg.alert(‘提示‘, ‘***‘)
                }
            });

            var store = self.getApplicationDocApplyChecksStore();
            store.getProxy().extraParams = { ‘appid‘: appid, ‘stageid‘: 1, ‘currentStage‘: 2 };
            store.reload();
        }
    },
    processFlow: function (button) {
        var self = this;
        var win = button.up(‘window‘);
        var btn = Ext.ComponentQuery.query(‘applyCheckRemark #Action‘)[0].value;
        var wfModel = Ext.ModelManager.getModel(‘RFLFE.model.WorkFlowINS‘);
        wfModel.load(Ext.ComponentQuery.query(‘#‘ + itemID2 + ‘ #AppID‘)[0].value, {
            success: function (record) {
                record.data.Reason = ‘‘,
                record.data.Remarks = Ext.ComponentQuery.query(‘applyCheckRemark textareafield‘)[0].value,
                record.ProcessWF(btn, true);
                win.close();
                self.getPortalMainPanel().remove(Ext.ComponentQuery.query(‘#‘ + itemID2)[0]);

                var queryCon = self.getApplyCheckAppQuery().getValues();
                var record = Ext.create(‘RFLFE.model.AppPool‘, {});
                record.set(queryCon);
                record.set(‘Stage_ID‘, 2);
                self.getApplicationAppPoolForACsStore().getProxy().extraParams = record.data;
                self.getApplicationAppPoolForACsStore().reload();
            },
            failure: function (rec, op) {
                Ext.Msg.alert(‘提示‘, op.request.scope.reader.jsonData["message"]);
            }
        });
    },
    submitApply: function (button) {
        var viewDoc = this.getApplyCheckFirstDocSubmit();
        if (viewDoc.getStore().getModifiedRecords() != null && viewDoc.getStore().getModifiedRecords().length > 0) {
            Ext.Msg.alert(‘提示‘, ‘***信息还有未保存,请先保存再提交!‘);
        }
        else {
            if (validateGrid(viewDoc.getView())) {
                var editWin = Ext.widget(‘applyCheckRemark‘, { title: ‘提交申请 - 确认‘ }).show();
                Ext.ComponentQuery.query(‘applyCheckRemark #Action‘)[0].setValue(button.action);
            }
            else {
                Ext.Msg.alert(‘提示‘, ‘请勾选必选文件!‘);
            }
        }
    }
});

function validateGrid(grid) {
    var count = grid.getStore().getCount();
    var rowIndex = 0;
    var selected = 0;
    var lastgroup = ‘‘;
    var lastRequired = ‘‘;
    var result;
    grid.getStore().each(function (record) {
        var checked = record.data[‘uploaded‘];
        var required = record.data[‘IsRequired‘];
        var grp = record.data[‘GroupId‘];
        if (grp != lastgroup && lastgroup != ‘‘ && lastRequired == ‘是‘) {
            if (selected == 0) {
                result = false;
                return false;
            }
            selected = 0;
        }
        else if (grp != lastgroup && lastgroup != ‘‘ && lastRequired == ‘否‘) {
            selected = 0;
        }

        if (checked) {
            selected += 1;
        }

        lastgroup = grp;
        lastRequired = required;
        rowIndex++;

        if (rowIndex == count && lastRequired == ‘是‘) {
            if (checked) {
                result = true;
            }
            else { 
                result = false
                return false;
            }
        }
        else if (rowIndex == count && lastRequired == ‘否‘) {
            result = true;
        }
    });

    if (result)
        return true;
    else
        return false;
};       
Controller
技术分享
Ext.define(‘RFLFE.store.MenuTree‘, {
    extend: ‘Ext.data.TreeStore‘,
    proxy: {
        type: ‘ajax‘,
        url:  ‘/Login/SearchTree‘,
//        api: {
//            read: ‘data/tree-data.json‘
//        },
        reader:
        {
            type: ‘json‘,
            root: ‘children‘,
            successProperty: ‘success‘
        }
    },
    root: {
        expanded: true
    }
});

Ext.define(‘RFLFE.store.application.Companys‘, {
    extend: ‘Ext.data.Store‘,
    alias: ‘widget.companys‘,
    autoLoad: false,
    autoSync: true,
    pageSize: 20,
    model: ‘RFLFE.model.Company‘,
    proxy: {
        type: ‘ajax‘,
        api: {
            read: ‘/Company/Search‘
        },
        reader: {
            type: ‘json‘,
            successProperty: ‘success‘,
            messageProperty: ‘message‘,
            root: ‘data‘
        },
        listeners: {
            exception: function (proxy, response, operation) {
                Ext.MessageBox.show({
                    title: ‘REMOTE EXCEPTION‘,
                    msg: operation.getError(),
                    icon: Ext.MessageBox.ERROR,
                    buttons: Ext.Msg.OK
                });
            }
        }
    }
});
Store
技术分享
Ext.define(‘RFLFE.model.Manager‘, {
    extend: ‘Ext.data.Model‘,

    fields: [
        { name: ‘ID‘, type: ‘int‘ },
        { name: ‘CompanyID‘, type: ‘string‘ },
        { name: ‘Name‘, type: ‘string‘ },
        { name: ‘FirstName‘, type: ‘string‘ },
        { name: ‘LastName‘, type: ‘string‘ },
        { name: ‘Age‘, type: ‘int‘ },
        { name: ‘Education‘, type: ‘string‘ },
        { name: ‘WorkYear‘, type: ‘float‘ },
        { name: ‘Position‘, type: ‘string‘ },
        { name: ‘Other‘, type: ‘string‘ }
    ],
     idProperty: "ID",

    proxy: {
        type: ‘ajax‘,
        api: {
            create: ‘/Manager/Save‘,
            destroy: ‘/Manager/Delete‘,
            update: ‘/Manager/Save‘,
            read: ‘/Manager/Search‘
        },
        reader: {
            type: ‘json‘,
            root: ‘data‘,
            totalProperty: ‘total‘,
            successProperty: ‘success‘,
            messageProperty: ‘message‘
        },
        listeners: {
            exception: function (proxy, response, operation) {
                Ext.MessageBox.show({
                    title: ‘REMOTE EXCEPTION‘,
                    msg: operation.getError(),
                    icon: Ext.MessageBox.ERROR,
                    buttons: Ext.Msg.OK
                });
            }
        }
    },
    // add a method which delete the record
    Delete: function (action) {
        this.proxy.api.update = ‘/Manager/Delete‘;
        this.save({
            waitMsg: ‘删除中...‘,
            params: { operate: action },
            success: function (rec, op) {
                Ext.Msg.alert(‘提示‘, op.request.scope.reader.jsonData["message"]);
            },
            failure: function (rec, op) {
                Ext.Msg.alert("提示", op.request.scope.reader.jsonData["message"]);
            }
        });
    }
}); 
Model

以上列出主要的一些代码样例,view就不必加例子了,大家应该很好找到的

附上Extjs4.2的API:http://docs.sencha.com/extjs/4.2.2/#!/api

 

 

下方列出Extjs的代码编写中觉得还可以的几个参考点:

  • 清空form中的原加载过的数据:
技术分享
 Ext.getCmp(‘myFormId‘).getForm().loadRecord(Ext.create(‘MyProject.model.MyModel‘)) 

Note:有时使用reset会出错

var myNew = myStore.getNewRecords();   --新增的行

var myRemove = myStore.getRemovedRecords();--删除的行

var myUpdate = myStore.getUpdatedRecords();--修改的行
View Code
  • 级联下拉框
技术分享
                   xtype: ‘combobox‘,    
                    fieldLabel: ‘公司地址:省‘,    
                    padding: ‘5 10 5 0‘,    
                    anchor: ‘90%‘,    
                    labelWidth: 100,    
                    triggerAction: ‘all‘,    
                    queryMode: ‘local‘,    
                    selectOnFocus: true,    
                    forceSelection: true,    
                    allowBlank: false,    
                    editable: false,     
                    value: ‘‘,    
                    name: ‘Address_P‘,    
                    store: ‘common.Provinces‘,    
                    displayField: ‘Description‘,    
                    valueField: ‘Code‘,    
                    listeners: {    
                        "select": function (combo, record, index) {    
                            try {    
                                if (combo.value != ‘‘) {    
                                    var secondeForm = Ext.ComponentQuery.query("#AddressCity")[0];    
                                    secondeForm.clearValue();    
                                    secondeForm.store.load({    
                                        params: { type: ‘48‘ + combo.value }    
                                    });    
                                }    
                            }    
                            catch (ex) {    
                                Ext.MessageBox.alert("错误", "数据加载失败。");    
                            }     
                        }    
                    }            
View Code
  • 日期
技术分享
var a = new Date();            
a.toDateString()            "Thu May 08 2014"
a.toJSON()            "2014-05-08T07:27:59.277Z"
a.toLocaleString()            "5/8/2014 3:27:59 PM"
a.toGMTString()            "Thu, 08 May 2014 07:27:59 GMT"
a.toISOString()            "2014-05-08T07:27:59.277Z"
a.toLocaleDateString()        "5/8/2014"
a.toLocaleTimeString()        "3:27:59 PM"
a.toString()            "Thu May 08 2014 15:27:59 GMT+0800 (China Standard Time)"
a.toTimeString()            "15:27:59 GMT+0800 (China Standard Time)"
a.toUTCString()            "Thu, 08 May 2014 07:27:59 GMT"
View Code
  • 验证Email格式
技术分享
多个Email,用;隔开的    
    regex: /^\s*\w+([-+.‘]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*(\;\w+([-+.‘]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*(\;)*\s*$/,
    regexText: "The email format is invalid"

一个Email的验证,在TextField下加入配置:    
View Code
  • 删除组建

form.remove(Ext.ComponentQuery.query(‘#item‘)[0])
form.removeAll() ---删除form下的所有组件

  • MenuTree的Disable
技术分享
1. SP中设置表示disabled的标识列    
2. 在MenuTreeView中添加字段cls,此字段直接对应与treeNode的class    
3. 添加CSS,如下,功能是用户设置滤镜,50%的透明度    
    .Diy-mask {  
        filter: alpha(opacity=50);  
    }
4. 在ViewMapper中判断,如果SP返回的disabled的字段为true,那么就给此Node的cls赋值为‘Diy-mask‘    
    MenuTreeView childView = new MenuTreeView();
    ……
    if (item.disabled == true)
            childView.cls = "Diy-mask";
View Code
  • 给Window添加close按钮,并在close之前做判断
技术分享
addWin.on(‘beforeclose‘, function () {        
            var viewDoc = Ext.ComponentQuery.query(‘disbursmentRegistDoc‘)[0];        
            if (viewDoc.getStore().getModifiedRecords() != null && viewDoc.getStore().getModifiedRecords().length > 0) {        
                Ext.Msg.alert(‘提示‘, ‘勾选文档信息还有未保存,请先保存再提交!‘);        
                return false;        
            }        
            else if (!validateGrid(viewDoc.getView())) {        
                Ext.Msg.alert(‘提示‘, ‘请勾选必选文件!‘);        
                return false;        
            }        
            else {        
                return true;        
            }        
        });        
        addWin.on(‘close‘, function () {        
            var appid = Ext.ComponentQuery.query(‘#‘ + itemID13 + ‘ #AppID‘)[0].value;        
            self.getDisbursementFMSsStore().getProxy().extraParams = { "appId": appid };        
            self.getDisbursementFMSsStore().loadPage(1);        
        });        
View Code
  • 批量上传文件(此处的Upload和UploadPanel是经过编辑的,而swfupload.js还有swfupload.swf文件网上可以下载到的)
技术分享
Ext.define(‘Upload‘, {
    extend: ‘Ext.window.Window‘,
    alias: ‘widget.Upload‘,
    title: ‘上传材料‘,
    autoHeight: true,
    modal: true,
    items: [{
        xtype: ‘UploadPanel‘,
        layout: ‘fit‘,
        border : false,
        addFileBtnText: ‘选择文件‘,
        uploadBtnText: ‘上传‘,
        removeBtnText: ‘移除所有‘,
        cancelBtnText: ‘取消上传‘,
        post_params: {}
    }]
});
Upload
技术分享
Ext.define(‘RUploadPanel‘, {
    extend: ‘Ext.grid.Panel‘,
    alias: ‘widget.UploadPanel‘,
    width: 700,
    height: 400,
    columns: [
    { xtype: ‘rownumberer‘ },
    { text: ‘id‘, dataIndex: ‘id‘, hidden: true }, 
    { text: ‘AppID‘, dataIndex: ‘AppID‘, hidden: true }, 
    { text: ‘StageID‘, dataIndex: ‘StageID‘, hidden: true  },
    { text: ‘文件名‘, width: 100, dataIndex: ‘FileName‘ },
    { text: ‘大小‘, width: 70, dataIndex: ‘Size‘,
        renderer: function (v) {
            return Ext.util.Format.fileSize(v);
        }
    },
    { text: ‘进度‘, width: 130, dataIndex: ‘percent‘,
        renderer: function (v) {
            var stml =
                ‘<div><div style="border:1px solid #008000;height:10px;width:115px;margin:2px 0px 1px 0px;float:left;">‘ +
                    ‘<div style="float:left;background:#FFCC66;width:‘ + v + ‘%;height:8px;"><div></div></div>‘ +
                ‘</div></div>‘;
            return stml;
        }
    }, {
        text: ‘状态‘, width: 80, dataIndex: ‘status‘,
        renderer: function (v) {
            var status;
            if (v == -1) {
                status = "等待上传";
            } else if (v == -2) {
                status = "上传中...";
            } else if (v == -3) {
                status = "<div style=‘color:red;‘>上传失败</div>";
            } else if (v == -4) {
                status = "上传成功";
            } else if (v == -5) {
                status = "停止上传";
            }
            return status;
        }
    }, {
        xtype: ‘actioncolumn‘,
        width: 50,
        items: [{
            icon: ‘/Content/image/delete.gif‘,
            tooltip: ‘Remove‘,
            handler: function (grid, rowIndex, colIndex) {
                var id = grid.store.getAt(rowIndex).get(‘id‘);
                grid.store.remove(grid.store.getAt(rowIndex));
            }
        }]
    }],
    store: Ext.create(‘Ext.data.JsonStore‘, {
        autoLoad: false,
        fields: [‘id‘, ‘AppID‘, ‘StageID‘, ‘FileName‘, ‘percent‘, ‘status‘, ‘Size‘]//,
//        id:"id"
    }),
    addFileBtnText: ‘Add File‘,
    uploadBtnText: ‘Upload‘,
    removeBtnText: ‘Remove All‘,
    cancelBtnText: ‘Cancel‘,
    debug: false,
    file_size_limit: 1024 * 20, //byte
    file_types: ‘*.*‘,
    file_types_description: ‘All Files‘,
    file_upload_limit: 50,
    file_queue_limit: 0,
    post_params: {},
    upload_url: ‘/LoanApproval/MultiUpload‘,
    flash_url: "/extjs4.2/ux/multiUpload/swfupload.swf",
    flash9_url: "/extjs4.2/ux/multiUpload/swfupload_fp9.swf",
    initComponent: function () {
        this.dockedItems = [{
            xtype: ‘toolbar‘,
            dock: ‘top‘,
            items: [{
                xtype: ‘button‘,
                itemId: ‘addFileBtn‘,
                iconCls: ‘add‘,
                id: ‘_btn_for_swf_‘,
                text: this.addFileBtnText
            }, {
                xtype: ‘tbseparator‘
            }, {
                xtype: ‘button‘,
                itemId: ‘uploadBtn‘,
                iconCls: ‘up‘,
                text: this.uploadBtnText,
                scope: this,
                handler: this.onUpload
//            }, {
//                xtype: ‘tbseparator‘
//            }, {
//                xtype: ‘button‘,
//                itemId: ‘removeBtn‘,
//                iconCls: ‘trash‘,
//                text: this.removeBtnText,
//                scope: this,
//                handler: this.onRemove
            }, {
                xtype: ‘tbseparator‘
            }, {
                xtype: ‘button‘,
                itemId: ‘cancelBtn‘,
                iconCls: ‘cancel‘,
                disabled: true,
                text: this.cancelBtnText,
                scope: this,
                handler: this.onCancelUpload
            }]
        }];

        this.callParent();
        this.down(‘button[itemId=addFileBtn]‘).on({
            afterrender: function (btn) {
                var config = this.getSWFConfig(btn);
                this.swfupload = new SWFUpload(config);
                Ext.get(this.swfupload.movieName).setStyle({
                    position: ‘absolute‘,
                    top: 0,
                    left: -2
                });
            },
            scope: this,
            buffer: 300
        });
    },
    getSWFConfig: function (btn) {
        var me = this;
        var placeHolderId = Ext.id();
        var em = btn.getEl().child(‘em‘);
        if (em == null) {
            em = Ext.get(btn.getId() + ‘-btnWrap‘);
        }
        em.setStyle({
            position: ‘relative‘,
            display: ‘block‘
        });
        em.createChild({
            tag: ‘div‘,
            id: placeHolderId
        });
        return {
            debug: me.debug,
            flash_url: me.flash_url,
            flash9_url: me.flash9_url,
            upload_url: me.upload_url,
            post_params: me.post_params || { savePath: ‘UploadedFiles\\‘ },
            file_size_limit: (me.file_size_limit * 1024),
            file_types: me.file_types,
            file_types_description: me.file_types_description,
            file_upload_limit: me.file_upload_limit,
            file_queue_limit: me.file_queue_limit,
            button_width: em.getWidth(),
            button_height: em.getHeight(),
            button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
            button_cursor: SWFUpload.CURSOR.HAND,
            button_placeholder_id: placeHolderId,
            custom_settings: {
                scope_handler: me
            },
            swfupload_preload_handler: me.swfupload_preload_handler,
            file_queue_error_handler: me.file_queue_error_handler,
            swfupload_load_failed_handler: me.swfupload_load_failed_handler,
            upload_start_handler: me.upload_start_handler,
            upload_progress_handler: me.upload_progress_handler,
            upload_error_handler: me.upload_error_handler,
            upload_success_handler: me.upload_success_handler,
            upload_complete_handler: me.upload_complete_handler,
            file_queued_handler: me.file_queued_handler/*,
            file_dialog_complete_handler : me.file_dialog_complete_handler*/
        };
    },
    swfupload_preload_handler: function () {
        if (!this.support.loading) {
            Ext.Msg.show({
                title: ‘提示‘,
                msg: ‘浏览器Flash Player版本太低,不能使用该上传功能!‘,
                width: 250,
                icon: Ext.Msg.ERROR,
                buttons: Ext.Msg.OK
            });
            return false;
        }
    },
    file_queue_error_handler: function (file, errorCode, message) {
        switch (errorCode) {
            case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED: msg(‘上传文件列表数量超限,不能选择!‘);
                break;
            case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT: msg(‘文件大小超过限制, 不能选择!‘);
                break;
            case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE: msg(‘该文件大小为0,不能选择!‘);
                break;
            case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE: msg(‘该文件类型不允许上传!‘);
                break;
        }
        function msg(info) {
            Ext.Msg.show({
                title: ‘提示‘,
                msg: info,
                width: 250,
                icon: Ext.Msg.WARNING,
                buttons: Ext.Msg.OK
            });
        }
    },
    swfupload_load_failed_handler: function () {
        Ext.Msg.show({
            title: ‘提示‘,
            msg: ‘SWFUpload加载失败!‘,
            width: 180,
            icon: Ext.Msg.ERROR,
            buttons: Ext.Msg.OK
        });
    },
    upload_start_handler: function (file) {
        var me = this.settings.custom_settings.scope_handler;
        me.down(‘#cancelBtn‘).setDisabled(false);
        var rec = me.store.getById(file.id);
        this.setFilePostName(encodeURIComponent(rec.get(‘FileName‘)));
    },
    upload_progress_handler: function (file, bytesLoaded, bytesTotal) {
        var me = this.settings.custom_settings.scope_handler;
        var percent = Math.ceil((bytesLoaded / bytesTotal) * 100);
        percent = percent == 100 ? 99 : percent;
        var rec = me.store.getById(file.id);
        rec.set(‘percent‘, percent);
        rec.set(‘status‘, file.filestatus);
        rec.commit();
    },
    upload_error_handler: function (file, errorCode, message) {
        var me = this.settings.custom_settings.scope_handler;
        var rec = me.store.getById(file.id);
        rec.set(‘percent‘, 0);
        rec.set(‘status‘, file.filestatus);
        rec.commit();
    },
    upload_success_handler: function (file, serverData, responseReceived) {
        var me = this.settings.custom_settings.scope_handler;
        var rec = me.store.getById(file.id);
        if (Ext.JSON.decode(serverData).success) {
            rec.set(‘percent‘, 100);
            rec.set(‘status‘, file.filestatus);
        } else {
            rec.set(‘percent‘, 0);
            rec.set(‘status‘, SWFUpload.FILE_STATUS.ERROR);
        }
        rec.commit();
        if (this.getStats().files_queued > 0 && this.uploadStopped == false) {
            this.startUpload();
        } else {
            me.showBtn(me, true);
        }
    },
    upload_complete_handler: function (file) {

    },
    file_queued_handler: function (file) {
        var me = this.settings.custom_settings.scope_handler;
        me.store.add({
            id: file.id,
            AppID: Ext.ComponentQuery.query("loanApprovalUpload #AppID")[0].value,
            StageID: Ext.ComponentQuery.query("loanApprovalUpload #StageID")[0].value,
            FileName: file.name,
            Size: file.size,
            status: -1,
            percent: 0
        });
    },
    onUpload: function () {
        if (this.swfupload && this.store.getCount() > 0) {
            if (this.swfupload.getStats().files_queued > 0) {
                this.showBtn(this, false);
                this.swfupload.uploadStopped = false;
                this.swfupload.setPostParams({
                    AppID: Ext.ComponentQuery.query("loanApprovalUpload #AppID")[0].value,
                    StageID: Ext.ComponentQuery.query("loanApprovalUpload #StageID")[0].value
                });
                this.swfupload.startUpload();
            }
        }
    },
    showBtn: function (me, bl) {
        me.down(‘#addFileBtn‘).setDisabled(!bl);
        me.down(‘#uploadBtn‘).setDisabled(!bl);
        //me.down(‘#removeBtn‘).setDisabled(!bl);
        me.down(‘#cancelBtn‘).setDisabled(bl);
        if (bl) {
            me.down(‘actioncolumn‘).show();
        } else {
            me.down(‘actioncolumn‘).hide();
        }
    },
    onRemove: function () {
        var ds = this.store;
        for (var i = 0; i < ds.getCount(); i++) {
            var record = ds.getAt(i);
            var file_id = record.get(‘id‘);
            this.swfupload.cancelUpload(file_id, false);
        }
        if (ds.getCount() != 0) {
            //ds.loadData([], false); 
            ds.removeAll(true);
        }
        this.swfupload.uploadStopped = false;
    },
    onCancelUpload: function () {
        if (this.swfupload) {
            this.swfupload.uploadStopped = true;
            this.swfupload.stopUpload();
            this.showBtn(this, true);
        }
    }
});
UploadPanel
技术分享
/**
 * SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com
 *
 * mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/,  http://www.vinterwebb.se/
 *
 * SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilz?n and Mammon Media and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * SWFObject v2.2 <http://code.google.com/p/swfobject/> 
 *    is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
 */



/* ******************* */
/* Constructor & Init  */
/* ******************* */
var SWFUpload;
var swfobject;

if (SWFUpload == undefined) {
    SWFUpload = function (settings) {
        this.initSWFUpload(settings);
    };
}

SWFUpload.prototype.initSWFUpload = function (userSettings) {
    try {
        this.customSettings = {};    // A container where developers can place their own settings associated with this instance.
        this.settings = {};
        this.eventQueue = [];
        this.movieName = "SWFUpload_" + SWFUpload.movieCount++;
        this.movieElement = null;


        // Setup global control tracking
        SWFUpload.instances[this.movieName] = this;

        // Load the settings.  Load the Flash movie.
        this.initSettings(userSettings);
        this.loadSupport();
        if (this.swfuploadPreload()) {
            this.loadFlash();
        }

        this.displayDebugInfo();
    } catch (ex) {
        delete SWFUpload.instances[this.movieName];
        throw ex;
    }
};

/* *************** */
/* Static Members  */
/* *************** */
SWFUpload.instances = {};
SWFUpload.movieCount = 0;
SWFUpload.version = "2.5.0 2010-01-15 Beta 2";
SWFUpload.QUEUE_ERROR = {
    QUEUE_LIMIT_EXCEEDED            : -100,
    FILE_EXCEEDS_SIZE_LIMIT         : -110,
    ZERO_BYTE_FILE                  : -120,
    INVALID_FILETYPE                : -130
};
SWFUpload.UPLOAD_ERROR = {
    HTTP_ERROR                      : -200,
    MISSING_UPLOAD_URL              : -210,
    IO_ERROR                        : -220,
    SECURITY_ERROR                  : -230,
    UPLOAD_LIMIT_EXCEEDED           : -240,
    UPLOAD_FAILED                   : -250,
    SPECIFIED_FILE_ID_NOT_FOUND     : -260,
    FILE_VALIDATION_FAILED          : -270,
    FILE_CANCELLED                  : -280,
    UPLOAD_STOPPED                  : -290,
    RESIZE                          : -300
};
SWFUpload.FILE_STATUS = {
    QUEUED       : -1,
    IN_PROGRESS  : -2,
    ERROR        : -3,
    COMPLETE     : -4,
    CANCELLED    : -5
};
SWFUpload.UPLOAD_TYPE = {
    NORMAL       : -1,
    RESIZED      : -2
};

SWFUpload.BUTTON_ACTION = {
    SELECT_FILE             : -100,
    SELECT_FILES            : -110,
    START_UPLOAD            : -120,
    JAVASCRIPT              : -130,    // DEPRECATED
    NONE                    : -130
};
SWFUpload.CURSOR = {
    ARROW : -1,
    HAND  : -2
};
SWFUpload.WINDOW_MODE = {
    WINDOW       : "window",
    TRANSPARENT  : "transparent",
    OPAQUE       : "opaque"
};

SWFUpload.RESIZE_ENCODING = {
    JPEG  : -1,
    PNG   : -2
};

// Private: takes a URL, determines if it is relative and converts to an absolute URL
// using the current site. Only processes the URL if it can, otherwise returns the URL untouched
SWFUpload.completeURL = function (url) {
    try {
        var path = "", indexSlash = -1;
        if (typeof(url) !== "string" || url.match(/^https?:\/\//i) || url.match(/^\//) || url === "") {
            return url;
        }
        
        indexSlash = window.location.pathname.lastIndexOf("/");
        if (indexSlash <= 0) {
            path = "/";
        } else {
            path = window.location.pathname.substr(0, indexSlash) + "/";
        }
        
        return path + url;
    } catch (ex) {
        return url;
    }
};

// Public: assign a new function to onload to use swfobject‘s domLoad functionality
SWFUpload.onload = function () {};


/* ******************** */
/* Instance Members  */
/* ******************** */

// Private: initSettings ensures that all the
// settings are set, getting a default value if one was not assigned.
SWFUpload.prototype.initSettings = function (userSettings) {
    this.ensureDefault = function (settingName, defaultValue) {
        var setting = userSettings[settingName];
        if (setting != undefined) {
            this.settings[settingName] = setting;
        } else {
            this.settings[settingName] = defaultValue;
        }
    };
    
    // Upload backend settings
    this.ensureDefault("upload_url", "");
    this.ensureDefault("preserve_relative_urls", false);
    this.ensureDefault("file_post_name", "Filedata");
    this.ensureDefault("post_params", {});
    this.ensureDefault("use_query_string", false);
    this.ensureDefault("requeue_on_error", false);
    this.ensureDefault("http_success", []);
    this.ensureDefault("assume_success_timeout", 0);
    
    // File Settings
    this.ensureDefault("file_types", "*.*");
    this.ensureDefault("file_types_description", "All Files");
    this.ensureDefault("file_size_limit", 0);    // Default zero means "unlimited"
    this.ensureDefault("file_upload_limit", 0);
    this.ensureDefault("file_queue_limit", 0);

    // Flash Settings
    this.ensureDefault("flash_url", "swfupload.swf");
    this.ensureDefault("flash9_url", "swfupload_fp9.swf");
    this.ensureDefault("prevent_swf_caching", true);
    
    // Button Settings
    this.ensureDefault("button_image_url", "");
    this.ensureDefault("button_width", 1);
    this.ensureDefault("button_height", 1);
    this.ensureDefault("button_text", "");
    this.ensureDefault("button_text_style", "color: #000000; font-size: 16pt;");
    this.ensureDefault("button_text_top_padding", 0);
    this.ensureDefault("button_text_left_padding", 0);
    this.ensureDefault("button_action", SWFUpload.BUTTON_ACTION.SELECT_FILES);
    this.ensureDefault("button_disabled", false);
    this.ensureDefault("button_placeholder_id", "");
    this.ensureDefault("button_placeholder", null);
    this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW);
    this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW);
    
    // Debug Settings
    this.ensureDefault("debug", false);
    this.settings.debug_enabled = this.settings.debug;    // Here to maintain v2 API
    
    // Event Handlers
    this.settings.return_upload_start_handler = this.returnUploadStart;
    this.ensureDefault("swfupload_preload_handler", null);
    this.ensureDefault("swfupload_load_failed_handler", null);
    this.ensureDefault("swfupload_loaded_handler", null);
    this.ensureDefault("file_dialog_start_handler", null);
    this.ensureDefault("file_queued_handler", null);
    this.ensureDefault("file_queue_error_handler", null);
    this.ensureDefault("file_dialog_complete_handler", null);
    
    this.ensureDefault("upload_resize_start_handler", null);
    this.ensureDefault("upload_start_handler", null);
    this.ensureDefault("upload_progress_handler", null);
    this.ensureDefault("upload_error_handler", null);
    this.ensureDefault("upload_success_handler", null);
    this.ensureDefault("upload_complete_handler", null);
    
    this.ensureDefault("mouse_click_handler", null);
    this.ensureDefault("mouse_out_handler", null);
    this.ensureDefault("mouse_over_handler", null);
    
    this.ensureDefault("debug_handler", this.debugMessage);

    this.ensureDefault("custom_settings", {});

    // Other settings
    this.customSettings = this.settings.custom_settings;
    
    // Update the flash url if needed
    if (!!this.settings.prevent_swf_caching) {
        this.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime();
        this.settings.flash9_url = this.settings.flash9_url + (this.settings.flash9_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime();
    }
    
    if (!this.settings.preserve_relative_urls) {
        this.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url);
        this.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url);
    }
    
    delete this.ensureDefault;
};

// Initializes the supported functionality based the Flash Player version, state, and event that occur during initialization
SWFUpload.prototype.loadSupport = function () {
    this.support = {
        loading : swfobject.hasFlashPlayerVersion("9.0.28"),
        imageResize : swfobject.hasFlashPlayerVersion("10.0.0")
    };
    
};

// Private: loadFlash replaces the button_placeholder element with the flash movie.
SWFUpload.prototype.loadFlash = function () {
    var targetElement, tempParent, wrapperType, flashHTML, els;

    if (!this.support.loading) {
        this.queueEvent("swfupload_load_failed_handler", ["Flash Player doesn‘t support SWFUpload"]);
        return;
    }
    
    // Make sure an element with the ID we are going to use doesn‘t already exist
    if (document.getElementById(this.movieName) !== null) {
        this.support.loading = false;
        this.queueEvent("swfupload_load_failed_handler", ["Element ID already in use"]);
        return;
    }

    // Get the element where we will be placing the flash movie
    targetElement = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder;

    if (targetElement == undefined) {
        this.support.loading = false;
        this.queueEvent("swfupload_load_failed_handler", ["button place holder not found"]);
        return;
    }

    wrapperType = (targetElement.currentStyle && targetElement.currentStyle["display"] || window.getComputedStyle && document.defaultView.getComputedStyle(targetElement, null).getPropertyValue("display")) !== "block" ? "span" : "div";
    
    // Append the container and load the flash
    tempParent = document.createElement(wrapperType);

    flashHTML = this.getFlashHTML();

    try {
        tempParent.innerHTML = flashHTML;    // Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers)
    } catch (ex) {
        this.support.loading = false;
        this.queueEvent("swfupload_load_failed_handler", ["Exception loading Flash HTML into placeholder"]);
        return;
    }

    // Try to get the movie element immediately
    els = tempParent.getElementsByTagName("object");
    if (!els || els.length > 1 || els.length === 0) {
        this.support.loading = false;
        this.queueEvent("swfupload_load_failed_handler", ["Unable to find movie after adding to DOM"]);
        return;
    } else if (els.length === 1) {
        this.movieElement = els[0];
    }
    
    targetElement.parentNode.replaceChild(tempParent.firstChild, targetElement);

    // Fix IE Flash/Form bug
    if (window[this.movieName] == undefined) {
        window[this.movieName] = this.getMovieElement();
    }
};

// Private: getFlashHTML generates the object tag needed to embed the flash in to the document
SWFUpload.prototype.getFlashHTML = function (flashVersion) {
    // Flash Satay object syntax: http://www.alistapart.com/articles/flashsatay
    return [‘<object id="‘, this.movieName, ‘" type="application/x-shockwave-flash" data="‘, (this.support.imageResize ? this.settings.flash_url : this.settings.flash9_url), ‘" width="‘, this.settings.button_width, ‘" height="‘, this.settings.button_height, ‘" class="swfupload">‘,
                ‘<param name="wmode" value="‘, this.settings.button_window_mode, ‘" />‘,
                ‘<param name="movie" value="‘, (this.support.imageResize ? this.settings.flash_url : this.settings.flash9_url), ‘" />‘,
                ‘<param name="quality" value="high" />‘,
                ‘<param name="allowScriptAccess" value="always" />‘,
                ‘<param name="flashvars" value="‘ + this.getFlashVars() + ‘" />‘,
                ‘</object>‘].join("");
};

// Private: getFlashVars builds the parameter string that will be passed
// to flash in the flashvars param.
SWFUpload.prototype.getFlashVars = function () {
    // Build a string from the post param object
    var httpSuccessString, paramString;
    
    paramString = this.buildParamString();
    httpSuccessString = this.settings.http_success.join(",");
    
    // Build the parameter string
    return ["movieName=", encodeURIComponent(this.movieName),
            "&amp;uploadURL=", encodeURIComponent(this.settings.upload_url),
            "&amp;useQueryString=", encodeURIComponent(this.settings.use_query_string),
            "&amp;requeueOnError=", encodeURIComponent(this.settings.requeue_on_error),
            "&amp;httpSuccess=", encodeURIComponent(httpSuccessString),
            "&amp;assumeSuccessTimeout=", encodeURIComponent(this.settings.assume_success_timeout),
            "&amp;params=", encodeURIComponent(paramString),
            "&amp;filePostName=", encodeURIComponent(this.settings.file_post_name),
            "&amp;fileTypes=", encodeURIComponent(this.settings.file_types),
            "&amp;fileTypesDescription=", encodeURIComponent(this.settings.file_types_description),
            "&amp;fileSizeLimit=", encodeURIComponent(this.settings.file_size_limit),
            "&amp;fileUploadLimit=", encodeURIComponent(this.settings.file_upload_limit),
            "&amp;fileQueueLimit=", encodeURIComponent(this.settings.file_queue_limit),
            "&amp;debugEnabled=", encodeURIComponent(this.settings.debug_enabled),
            "&amp;buttonImageURL=", encodeURIComponent(this.settings.button_image_url),
            "&amp;buttonWidth=", encodeURIComponent(this.settings.button_width),
            "&amp;buttonHeight=", encodeURIComponent(this.settings.button_height),
            "&amp;buttonText=", encodeURIComponent(this.settings.button_text),
            "&amp;buttonTextTopPadding=", encodeURIComponent(this.settings.button_text_top_padding),
            "&amp;buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding),
            "&amp;buttonTextStyle=", encodeURIComponent(this.settings.button_text_style),
            "&amp;buttonAction=", encodeURIComponent(this.settings.button_action),
            "&amp;buttonDisabled=", encodeURIComponent(this.settings.button_disabled),
            "&amp;buttonCursor=", encodeURIComponent(this.settings.button_cursor)
        ].join("");
};

// Public: get retrieves the DOM reference to the Flash element added by SWFUpload
// The element is cached after the first lookup
SWFUpload.prototype.getMovieElement = function () {
    if (this.movieElement == undefined) {
        this.movieElement = document.getElementById(this.movieName);
    }

    if (this.movieElement === null) {
        throw "Could not find Flash element";
    }
    
    return this.movieElement;
};

// Private: buildParamString takes the name/value pairs in the post_params setting object
// and joins them up in to a string formatted "name=value&amp;name=value"
SWFUpload.prototype.buildParamString = function () {
    var name, postParams, paramStringPairs = [];
    
    postParams = this.settings.post_params; 

    if (typeof(postParams) === "object") {
        for (name in postParams) {
            if (postParams.hasOwnProperty(name)) {
                paramStringPairs.push(encodeURIComponent(name.toString()) + "=" + encodeURIComponent(postParams[name].toString()));
            }
        }
    }

    return paramStringPairs.join("&amp;");
};

// Public: Used to remove a SWFUpload instance from the page. This method strives to remove
// all references to the SWF, and other objects so memory is properly freed.
// Returns true if everything was destroyed. Returns a false if a failure occurs leaving SWFUpload in an inconsistant state.
// Credits: Major improvements provided by steffen
SWFUpload.prototype.destroy = function () {
    var movieElement;
    
    try {
        // Make sure Flash is done before we try to remove it
        this.cancelUpload(null, false);
        
        movieElement = this.cleanUp();

        // Remove the SWFUpload DOM nodes
        if (movieElement) {
            // Remove the Movie Element from the page
            try {
                movieElement.parentNode.removeChild(movieElement);
            } catch (ex) {}
        }

        // Remove IE form fix reference
        window[this.movieName] = null;

        // Destroy other references
        SWFUpload.instances[this.movieName] = null;
        delete SWFUpload.instances[this.movieName];

        this.movieElement = null;
        this.settings = null;
        this.customSettings = null;
        this.eventQueue = null;
        this.movieName = null;
        
        
        return true;
    } catch (ex2) {
        return false;
    }
};


// Public: displayDebugInfo prints out settings and configuration
// information about this SWFUpload instance.
// This function (and any references to it) can be deleted when placing
// SWFUpload in production.
SWFUpload.prototype.displayDebugInfo = function () {
    this.debug(
        [
            "---SWFUpload Instance Info---\n",
            "Version: ", SWFUpload.version, "\n",
            "Movie Name: ", this.movieName, "\n",
            "Settings:\n",
            "\t", "upload_url:               ", this.settings.upload_url, "\n",
            "\t", "flash_url:                ", this.settings.flash_url, "\n",
            "\t", "flash9_url:                ", this.settings.flash9_url, "\n",
            "\t", "use_query_string:         ", this.settings.use_query_string.toString(), "\n",
            "\t", "requeue_on_error:         ", this.settings.requeue_on_error.toString(), "\n",
            "\t", "http_success:             ", this.settings.http_success.join(", "), "\n",
            "\t", "assume_success_timeout:   ", this.settings.assume_success_timeout, "\n",
            "\t", "file_post_name:           ", this.settings.file_post_name, "\n",
            "\t", "post_params:              ", this.settings.post_params.toString(), "\n",
            "\t", "file_types:               ", this.settings.file_types, "\n",
            "\t", "file_types_description:   ", this.settings.file_types_description, "\n",
            "\t", "file_size_limit:          ", this.settings.file_size_limit, "\n",
            "\t", "file_upload_limit:        ", this.settings.file_upload_limit, "\n",
            "\t", "file_queue_limit:         ", this.settings.file_queue_limit, "\n",
            "\t", "debug:                    ", this.settings.debug.toString(), "\n",

            "\t", "prevent_swf_caching:      ", this.settings.prevent_swf_caching.toString(), "\n",

            "\t", "button_placeholder_id:    ", this.settings.button_placeholder_id.toString(), "\n",
            "\t", "button_placeholder:       ", (this.settings.button_placeholder ? "Set" : "Not Set"), "\n",
            "\t", "button_image_url:         ", this.settings.button_image_url.toString(), "\n",
            "\t", "button_width:             ", this.settings.button_width.toString(), "\n",
            "\t", "button_height:            ", this.settings.button_height.toString(), "\n",
            "\t", "button_text:              ", this.settings.button_text.toString(), "\n",
            "\t", "button_text_style:        ", this.settings.button_text_style.toString(), "\n",
            "\t", "button_text_top_padding:  ", this.settings.button_text_top_padding.toString(), "\n",
            "\t", "button_text_left_padding: ", this.settings.button_text_left_padding.toString(), "\n",
            "\t", "button_action:            ", this.settings.button_action.toString(), "\n",
            "\t", "button_cursor:            ", this.settings.button_cursor.toString(), "\n",
            "\t", "button_disabled:          ", this.settings.button_disabled.toString(), "\n",

            "\t", "custom_settings:          ", this.settings.custom_settings.toString(), "\n",
            "Event Handlers:\n",
            "\t", "swfupload_preload_handler assigned:  ", (typeof this.settings.swfupload_preload_handler === "function").toString(), "\n",
            "\t", "swfupload_load_failed_handler assigned:  ", (typeof this.settings.swfupload_load_failed_handler === "function").toString(), "\n",
            "\t", "swfupload_loaded_handler assigned:  ", (typeof this.settings.swfupload_loaded_handler === "function").toString(), "\n",
            "\t", "mouse_click_handler assigned:       ", (typeof this.settings.mouse_click_handler === "function").toString(), "\n",
            "\t", "mouse_over_handler assigned:        ", (typeof this.settings.mouse_over_handler === "function").toString(), "\n",
            "\t", "mouse_out_handler assigned:         ", (typeof this.settings.mouse_out_handler === "function").toString(), "\n",
            "\t", "file_dialog_start_handler assigned: ", (typeof this.settings.file_dialog_start_handler === "function").toString(), "\n",
            "\t", "file_queued_handler assigned:       ", (typeof this.settings.file_queued_handler === "function").toString(), "\n",
            "\t", "file_queue_error_handler assigned:  ", (typeof this.settings.file_queue_error_handler === "function").toString(), "\n",
            "\t", "upload_resize_start_handler assigned:      ", (typeof this.settings.upload_resize_start_handler === "function").toString(), "\n",
            "\t", "upload_start_handler assigned:      ", (typeof this.settings.upload_start_handler === "function").toString(), "\n",
            "\t", "upload_progress_handler assigned:   ", (typeof this.settings.upload_progress_handler === "function").toString(), "\n",
            "\t", "upload_error_handler assigned:      ", (typeof this.settings.upload_error_handler === "function").toString(), "\n",
            "\t", "upload_success_handler assigned:    ", (typeof this.settings.upload_success_handler === "function").toString(), "\n",
            "\t", "upload_complete_handler assigned:   ", (typeof this.settings.upload_complete_handler === "function").toString(), "\n",
            "\t", "debug_handler assigned:             ", (typeof this.settings.debug_handler === "function").toString(), "\n",

            "Support:\n",
            "\t", "Load:                     ", (this.support.loading ? "Yes" : "No"), "\n",
            "\t", "Image Resize:             ", (this.support.imageResize ? "Yes" : "No"), "\n"

        ].join("")
    );
};

/* Note: addSetting and getSetting are no longer used by SWFUpload but are included
    the maintain v2 API compatibility
*/
// Public: (Deprecated) addSetting adds a setting value. If the value given is undefined or null then the default_value is used.
SWFUpload.prototype.addSetting = function (name, value, default_value) {
    if (value == undefined) {
        return (this.settings[name] = default_value);
    } else {
        return (this.settings[name] = value);
    }
};

// Public: (Deprecated) getSetting gets a setting. Returns an empty string if the setting was not found.
SWFUpload.prototype.getSetting = function (name) {
    if (this.settings[name] != undefined) {
        return this.settings[name];
    }

    return "";
};



// Private: callFlash handles function calls made to the Flash element.
// Calls are made with a setTimeout for some functions to work around
// bugs in the ExternalInterface library.
SWFUpload.prototype.callFlash = function (functionName, argumentArray) {
    var movieElement, returnValue, returnString;
    
    argumentArray = argumentArray || [];
    movieElement = this.getMovieElement();

    // Flash‘s method if calling ExternalInterface methods (code adapted from MooTools).
    try {
        if (movieElement != undefined) {
            returnString = movieElement.CallFunction(‘<invoke name="‘ + functionName + ‘" returntype="javascript">‘ + __flash__argumentsToXML(argumentArray, 0) + ‘</invoke>‘);
            returnValue = eval(returnString);
        } else {
            this.debug("Can‘t call flash because the movie wasn‘t found.");
        }
    } catch (ex) {
        this.debug("Exception calling flash function ‘" + functionName + "‘: " + ex.message);
    }
    
    // Unescape file post param values
    if (returnValue != undefined && typeof returnValue.post === "object") {
        returnValue = this.unescapeFilePostParams(returnValue);
    }

    return returnValue;
};

/* *****************************
    -- Flash control methods --
    Your UI should use these
    to operate SWFUpload
   ***************************** */

// WARNING: this function does not work in Flash Player 10
// Public: selectFile causes a File Selection Dialog window to appear.  This
// dialog only allows 1 file to be selected.
SWFUpload.prototype.selectFile = function () {
    this.callFlash("SelectFile");
};

// WARNING: this function does not work in Flash Player 10
// Public: selectFiles causes a File Selection Dialog window to appear/ This
// dialog allows the user to select any number of files
// Flash Bug Warning: Flash limits the number of selectable files based on the combined length of the file names.
// If the selection name length is too long the dialog will fail in an unpredictable manner.  There is no work-around
// for this bug.
SWFUpload.prototype.selectFiles = function () {
    this.callFlash("SelectFiles");
};


// Public: startUpload starts uploading the first file in the queue unless
// the optional parameter ‘fileID‘ specifies the ID 
SWFUpload.prototype.startUpload = function (fileID) {
    this.callFlash("StartUpload", [fileID]);
};

// Public: startUpload starts uploading the first file in the queue unless
// the optional parameter ‘fileID‘ specifies the ID 
SWFUpload.prototype.startResizedUpload = function (fileID, width, height, encoding, quality, allowEnlarging) {
    this.callFlash("StartUpload", [fileID, { "width": width, "height" : height, "encoding" : encoding, "quality" : quality, "allowEnlarging" : allowEnlarging }]);
};

// Public: cancelUpload cancels any queued file.  The fileID parameter may be the file ID or index.
// If you do not specify a fileID the current uploading file or first file in the queue is cancelled.
// If you do not want the uploadError event to trigger you can specify false for the triggerErrorEvent parameter.
SWFUpload.prototype.cancelUpload = function (fileID, triggerErrorEvent) {
    if (triggerErrorEvent !== false) {
        triggerErrorEvent = true;
    }
    this.callFlash("CancelUpload", [fileID, triggerErrorEvent]);
};

// Public: stopUpload stops the current upload and requeues the file at the beginning of the queue.
// If nothing is currently uploading then nothing happens.
SWFUpload.prototype.stopUpload = function () {
    this.callFlash("StopUpload");
};


// Public: requeueUpload requeues any file. If the file is requeued or already queued true is returned.
// If the file is not found or is currently uploading false is returned.  Requeuing a file bypasses the
// file size, queue size, upload limit and other queue checks.  Certain files can‘t be requeued (e.g, invalid or zero bytes files).
SWFUpload.prototype.requeueUpload = function (indexOrFileID) {
    return this.callFlash("RequeueUpload", [indexOrFileID]);
};


/* ************************
 * Settings methods
 *   These methods change the SWFUpload settings.
 *   SWFUpload settings should not be changed directly on the settings object
 *   since many of the settings need to be passed to Flash in order to take
 *   effect.
 * *********************** */

// Public: getStats gets the file statistics object.
SWFUpload.prototype.getStats = function () {
    return this.callFlash("GetStats");
};

// Public: setStats changes the SWFUpload statistics.  You shouldn‘t need to 
// change the statistics but you can.  Changing the statistics does not
// affect SWFUpload accept for the successful_uploads count which is used
// by the upload_limit setting to determine how many files the user may upload.
SWFUpload.prototype.setStats = function (statsObject) {
    this.callFlash("SetStats", [statsObject]);
};

// Public: getFile retrieves a File object by ID or Index.  If the file is
// not found then ‘null‘ is returned.
SWFUpload.prototype.getFile = function (fileID) {
    if (typeof(fileID) === "number") {
        return this.callFlash("GetFileByIndex", [fileID]);
    } else {
        return this.callFlash("GetFile", [fileID]);
    }
};

// Public: getFileFromQueue retrieves a File object by ID or Index.  If the file is
// not found then ‘null‘ is returned.
SWFUpload.prototype.getQueueFile = function (fileID) {
    if (typeof(fileID) === "number") {
        return this.callFlash("GetFileByQueueIndex", [fileID]);
    } else {
        return this.callFlash("GetFile", [fileID]);
    }
};


// Public: addFileParam sets a name/value pair that will be posted with the
// file specified by the Files ID.  If the name already exists then the
// exiting value will be overwritten.
SWFUpload.prototype.addFileParam = function (fileID, name, value) {
    return this.callFlash("AddFileParam", [fileID, name, value]);
};

// Public: removeFileParam removes a previously set (by addFileParam) name/value
// pair from the specified file.
SWFUpload.prototype.removeFileParam = function (fileID, name) {
    this.callFlash("RemoveFileParam", [fileID, name]);
};

// Public: setUploadUrl changes the upload_url setting.
SWFUpload.prototype.setUploadURL = function (url) {
    this.settings.upload_url = url.toString();
    this.callFlash("SetUploadURL", [url]);
};

// Public: setPostParams changes the post_params setting
SWFUpload.prototype.setPostParams = function (paramsObject) {
    this.settings.post_params = paramsObject;
    this.callFlash("SetPostParams", [paramsObject]);
};

// Public: addPostParam adds post name/value pair.  Each name can have only one value.
SWFUpload.prototype.addPostParam = function (name, value) {
    this.settings.post_params[name] = value;
    this.callFlash("SetPostParams", [this.settings.post_params]);
};

// Public: removePostParam deletes post name/value pair.
SWFUpload.prototype.removePostParam = function (name) {
    delete this.settings.post_params[name];
    this.callFlash("SetPostParams", [this.settings.post_params]);
};

// Public: setFileTypes changes the file_types setting and the file_types_description setting
SWFUpload.prototype.setFileTypes = function (types, description) {
    this.settings.file_types = types;
    this.settings.file_types_description = description;
    this.callFlash("SetFileTypes", [types, description]);
};

// Public: setFileSizeLimit changes the file_size_limit setting
SWFUpload.prototype.setFileSizeLimit = function (fileSizeLimit) {
    this.settings.file_size_limit = fileSizeLimit;
    this.callFlash("SetFileSizeLimit", [fileSizeLimit]);
};

// Public: setFileUploadLimit changes the file_upload_limit setting
SWFUpload.prototype.setFileUploadLimit = function (fileUploadLimit) {
    this.settings.file_upload_limit = fileUploadLimit;
    this.callFlash("SetFileUploadLimit", [fileUploadLimit]);
};

// Public: setFileQueueLimit changes the file_queue_limit setting
SWFUpload.prototype.setFileQueueLimit = function (fileQueueLimit) {
    this.settings.file_queue_limit = fileQueueLimit;
    this.callFlash("SetFileQueueLimit", [fileQueueLimit]);
};

// Public: setFilePostName changes the file_post_name setting
SWFUpload.prototype.setFilePostName = function (filePostName) {
    this.settings.file_post_name = filePostName;
    this.callFlash("SetFilePostName", [filePostName]);
};

// Public: setUseQueryString changes the use_query_string setting
SWFUpload.prototype.setUseQueryString = function (useQueryString) {
    this.settings.use_query_string = useQueryString;
    this.callFlash("SetUseQueryString", [useQueryString]);
};

// Public: setRequeueOnError changes the requeue_on_error setting
SWFUpload.prototype.setRequeueOnError = function (requeueOnError) {
    this.settings.requeue_on_error = requeueOnError;
    this.callFlash("SetRequeueOnError", [requeueOnError]);
};

// Public: setHTTPSuccess changes the http_success setting
SWFUpload.prototype.setHTTPSuccess = function (http_status_codes) {
    if (typeof http_status_codes === "string") {
        http_status_codes = http_status_codes.replace(" ", "").split(",");
    }
    
    this.settings.http_success = http_status_codes;
    this.callFlash("SetHTTPSuccess", [http_status_codes]);
};

// Public: setHTTPSuccess changes the http_success setting
SWFUpload.prototype.setAssumeSuccessTimeout = function (timeout_seconds) {
    this.settings.assume_success_timeout = timeout_seconds;
    this.callFlash("SetAssumeSuccessTimeout", [timeout_seconds]);
};

// Public: setDebugEnabled changes the debug_enabled setting
SWFUpload.prototype.setDebugEnabled = function (debugEnabled) {
    this.settings.debug_enabled = debugEnabled;
    this.callFlash("SetDebugEnabled", [debugEnabled]);
};

// Public: setButtonImageURL loads a button image sprite
SWFUpload.prototype.setButtonImageURL = function (buttonImageURL) {
    if (buttonImageURL == undefined) {
        buttonImageURL = "";
    }
    
    this.settings.button_image_url = buttonImageURL;
    this.callFlash("SetButtonImageURL", [buttonImageURL]);
};

// Public: setButtonDimensions resizes the Flash Movie and button
SWFUpload.prototype.setButtonDimensions = function (width, height) {
    this.settings.button_width = width;
    this.settings.button_height = height;
    
    var movie = this.getMovieElement();
    if (movie != undefined) {
        movie.style.width = width + "px";
        movie.style.height = height + "px";
    }
    
    this.callFlash("SetButtonDimensions", [width, height]);
};
// Public: setButtonText Changes the text overlaid on the button
SWFUpload.prototype.setButtonText = function (html) {
    this.settings.button_text = html;
    this.callFlash("SetButtonText", [html]);
};
// Public: setButtonTextPadding changes the top and left padding of the text overlay
SWFUpload.prototype.setButtonTextPadding = function (left, top) {
    this.settings.button_text_top_padding = top;
    this.settings.button_text_left_padding = left;
    this.callFlash("SetButtonTextPadding", [left, top]);
};

// Public: setButtonTextStyle changes the CSS used to style the HTML/Text overlaid on the button
SWFUpload.prototype.setButtonTextStyle = function (css) {
    this.settings.button_text_style = css;
    this.callFlash("SetButtonTextStyle", [css]);
};
// Public: setButtonDisabled disables/enables the button
SWFUpload.prototype.setButtonDisabled = function (isDisabled) {
    this.settings.button_disabled = isDisabled;
    this.callFlash("SetButtonDisabled", [isDisabled]);
};
// Public: setButtonAction sets the action that occurs when the button is clicked
SWFUpload.prototype.setButtonAction = function (buttonAction) {
    this.settings.button_action = buttonAction;
    this.callFlash("SetButtonAction", [buttonAction]);
};

// Public: setButtonCursor changes the mouse cursor displayed when hovering over the button
SWFUpload.prototype.setButtonCursor = function (cursor) {
    this.settings.button_cursor = cursor;
    this.callFlash("SetButtonCursor", [cursor]);
};

/* *******************************
    Flash Event Interfaces
    These functions are used by Flash to trigger the various
    events.
    
    All these functions a Private.
    
    Because the ExternalInterface library is buggy the event calls
    are added to a queue and the queue then executed by a setTimeout.
    This ensures that events are executed in a determinate order and that
    the ExternalInterface bugs are avoided.
******************************* */

SWFUpload.prototype.queueEvent = function (handlerName, argumentArray) {
    // Warning: Don‘t call this.debug inside here or you‘ll create an infinite loop
    var self = this;
    
    if (argumentArray == undefined) {
        argumentArray = [];
    } else if (!(argumentArray instanceof Array)) {
        argumentArray = [argumentArray];
    }
    
    if (typeof this.settings[handlerName] === "function") {
        // Queue the event
        this.eventQueue.push(function () {
            this.settings[handlerName].apply(this, argumentArray);
        });
        
        // Execute the next queued event
        setTimeout(function () {
            self.executeNextEvent();
        }, 0);
        
    } else if (this.settings[handlerName] !== null) {
        throw "Event handler " + handlerName + " is unknown or is not a function";
    }
};

// Private: Causes the next event in the queue to be executed.  Since events are queued using a setTimeout
// we must queue them in order to garentee that they are executed in order.
SWFUpload.prototype.executeNextEvent = function () {
    // Warning: Don‘t call this.debug inside here or you‘ll create an infinite loop

    var  f = this.eventQueue ? this.eventQueue.shift() : null;
    if (typeof(f) === "function") {
        f.apply(this);
    }
};

// Private: unescapeFileParams is part of a workaround for a flash bug where objects passed through ExternalInterface cannot have
// properties that contain characters that are not valid for JavaScript identifiers. To work around this
// the Flash Component escapes the parameter names and we must unescape again before passing them along.
SWFUpload.prototype.unescapeFilePostParams = function (file) {
    var reg = /[$]([0-9a-f]{4})/i, unescapedPost = {}, uk, k, match;

    if (file != undefined) {
        for (k in file.post) {
            if (file.post.hasOwnProperty(k)) {
                uk = k;
                while ((match = reg.exec(uk)) !== null) {
                    uk = uk.replace(match[0], String.fromCharCode(parseInt("0x" + match[1], 16)));
                }
                unescapedPost[uk] = file.post[k];
            }
        }

        file.post = unescapedPost;
    }

    return file;
};

// Private: This event is called by SWFUpload Init after we‘ve determined what the user‘s Flash Player supports.
// Use the swfupload_preload_handler event setting to execute custom code when SWFUpload has loaded.
// Return false to prevent SWFUpload from loading and allow your script to do something else if your required feature is
// not supported
SWFUpload.prototype.swfuploadPreload = function () {
    var returnValue;
    if (typeof this.settings.swfupload_preload_handler === "function") {
        returnValue = this.settings.swfupload_preload_handler.call(this);
    } else if (this.settings.swfupload_preload_handler != undefined) {
        throw "upload_start_handler must be a function";
    }

    // Convert undefined to true so if nothing is returned from the upload_start_handler it is
    // interpretted as ‘true‘.
    if (returnValue === undefined) {
        returnValue = true;
    }
    
    return !!returnValue;
}

// Private: This event is called by Flash when it has finished loading. Don‘t modify this.
// Use the swfupload_loaded_handler event setting to execute custom code when SWFUpload has loaded.
SWFUpload.prototype.flashReady = function () {
    // Check that the movie element is loaded correctly with its ExternalInterface methods defined
    var movieElement =     this.cleanUp();

    if (!movieElement) {
        this.debug("Flash called back ready but the flash movie can‘t be found.");
        return;
    }

    this.queueEvent("swfupload_loaded_handler");
};

// Private: removes Flash added fuctions to the DOM node to prevent memory leaks in IE.
// This function is called by Flash each time the ExternalInterface functions are created.
SWFUpload.prototype.cleanUp = function () {
    var key, movieElement = this.getMovieElement();
    
    // Pro-actively unhook all the Flash functions
    try {
        if (movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE
            this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");
            for (key in movieElement) {
                try {
                    if (typeof(movieElement[key]) === "function") {
                        movieElement[key] = null;
                    }
                } catch (ex) {
                }
            }
        }
    } catch (ex1) {
    
    }

    // Fix Flashes own cleanup code so if the SWF Movie was removed from the page
    // it doesn‘t display errors.
    window["__flash__removeCallback"] = function (instance, name) {
        try {
            if (instance) {
                instance[name] = null;
            }
        } catch (flashEx) {
        
        }
    };
    
    return movieElement;
};

/* When the button_action is set to None this event gets fired and executes the mouse_click_handler */
SWFUpload.prototype.mouseClick = function () {
    this.queueEvent("mouse_click_handler");
};
SWFUpload.prototype.mouseOver = function () {
    this.queueEvent("mouse_over_handler");
};
SWFUpload.prototype.mouseOut = function () {
    this.queueEvent("mouse_out_handler");
};

/* This is a chance to do something before the browse window opens */
SWFUpload.prototype.fileDialogStart = function () {
    this.queueEvent("file_dialog_start_handler");
};


/* Called when a file is successfully added to the queue. */
SWFUpload.prototype.fileQueued = function (file) {
    file = this.unescapeFilePostParams(file);
    this.queueEvent("file_queued_handler", file);
};


/* Handle errors that occur when an attempt to queue a file fails. */
SWFUpload.prototype.fileQueueError = function (file, errorCode, message) {
    file = this.unescapeFilePostParams(file);
    this.queueEvent("file_queue_error_handler", [file, errorCode, message]);
};

/* Called after the file dialog has closed and the selected files have been queued.
    You could call startUpload here if you want the queued files to begin uploading immediately. */
SWFUpload.prototype.fileDialogComplete = function (numFilesSelected, numFilesQueued, numFilesInQueue) {
    this.queueEvent("file_dialog_complete_handler", [numFilesSelected, numFilesQueued, numFilesInQueue]);
};

SWFUpload.prototype.uploadResizeStart = function (file, resizeSettings) {
    file = this.unescapeFilePostParams(file);
    this.queueEvent("upload_resize_start_handler", [file, resizeSettings.width, resizeSettings.height, resizeSettings.encoding, resizeSettings.quality]);
};

SWFUpload.prototype.uploadStart = function (file) {
    file = this.unescapeFilePostParams(file);
    this.queueEvent("return_upload_start_handler", file);
};

SWFUpload.prototype.returnUploadStart = function (file) {
    var returnValue;
    if (typeof this.settings.upload_start_handler === "function") {
        file = this.unescapeFilePostParams(file);
        returnValue = this.settings.upload_start_handler.call(this, file);
    } else if (this.settings.upload_start_handler != undefined) {
        throw "upload_start_handler must be a function";
    }

    // Convert undefined to true so if nothing is returned from the upload_start_handler it is
    // interpretted as ‘true‘.
    if (returnValue === undefined) {
        returnValue = true;
    }
    
    returnValue = !!returnValue;
    
    this.callFlash("ReturnUploadStart", [returnValue]);
};



SWFUpload.prototype.uploadProgress = function (file, bytesComplete, bytesTotal) {
    file = this.unescapeFilePostParams(file);
    this.queueEvent("upload_progress_handler", [file, bytesComplete, bytesTotal]);
};

SWFUpload.prototype.uploadError = function (file, errorCode, message) {
    file = this.unescapeFilePostParams(file);
    this.queueEvent("upload_error_handler", [file, errorCode, message]);
};

SWFUpload.prototype.uploadSuccess = function (file, serverData, responseReceived) {
    file = this.unescapeFilePostParams(file);
    this.queueEvent("upload_success_handler", [file, serverData, responseReceived]);
};

SWFUpload.prototype.uploadComplete = function (file) {
    file = this.unescapeFilePostParams(file);
    this.queueEvent("upload_complete_handler", file);
};

/* Called by SWFUpload JavaScript and Flash functions when debug is enabled. By default it writes messages to the
   internal debug console.  You can override this event and have messages written where you want. */
SWFUpload.prototype.debug = function (message) {
    this.queueEvent("debug_handler", message);
};


/* **********************************
    Debug Console
    The debug console is a self contained, in page location
    for debug message to be sent.  The Debug Console adds
    itself to the body if necessary.

    The console is automatically scrolled as messages appear.
    
    If you are using your own debug handler or when you deploy to production and
    have debug disabled you can remove these functions to reduce the file size
    and complexity.
********************************** */
   
// Private: debugMessage is the default debug_handler.  If you want to print debug messages
// call the debug() function.  When overriding the function your own function should
// check to see if the debug setting is true before outputting debug information.
SWFUpload.prototype.debugMessage = function (message) {
    var exceptionMessage, exceptionValues, key;

    if (this.settings.debug) {
        exceptionValues = [];

        // Check for an exception object and print it nicely
        if (typeof message === "object" && typeof message.name === "string" && typeof message.message === "string") {
            for (key in message) {
                if (message.hasOwnProperty(key)) {
                    exceptionValues.push(key + ": " + message[key]);
                }
            }
            exceptionMessage = exceptionValues.join("\n") || "";
            exceptionValues = exceptionMessage.split("\n");
            exceptionMessage = "EXCEPTION: " + exceptionValues.join("\nEXCEPTION: ");
            SWFUpload.Console.writeLine(exceptionMessage);
        } else {
            SWFUpload.Console.writeLine(message);
        }
    }
};

SWFUpload.Console = {};
SWFUpload.Console.writeLine = function (message) {
    var console, documentForm;

    try {
        console = document.getElementById("SWFUpload_Console");

        if (!console) {
            documentForm = document.createElement("form");
            document.getElementsByTagName("body")[0].appendChild(documentForm);

            console = document.createElement("textarea");
            console.id = "SWFUpload_Console";
            console.style.fontFamily = "monospace";
            console.setAttribute("wrap", "off");
            console.wrap = "off";
            console.style.overflow = "auto";
            console.style.width = "700px";
            console.style.height = "350px";
            console.style.margin = "5px";
            documentForm.appendChild(console);
        }

        console.value += message + "\n";

        console.scrollTop = console.scrollHeight - console.clientHeight;
    } catch (ex) {
        alert("Exception: " + ex.name + " Message: " + ex.message);
    }
};


/*    SWFObject v2.2 <http://code.google.com/p/swfobject/> 
    is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
*/
swfobject = function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=‘ class="‘+ai[ae]+‘"‘}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+‘="‘+ai[ae]+‘"‘}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+=‘<param name="‘+ad+‘" value="‘+ag[ad]+‘" />‘}}aa.outerHTML=‘<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"‘+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
swfobject.addDomLoadEvent(function () {
    if (typeof(SWFUpload.onload) === "function") {
        SWFUpload.onload.call(window);
    }
});
swfupload.js

页面运行效果:

技术分享

 

项目总结(SME)- Web & Extjs4.2

标签:

原文地址:http://www.cnblogs.com/Ying150318/p/4649257.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!