/**
 * @ignore
 * simplified flash bridge for yui swf
 * @author yiminghe@gmail.com
 */
KISSY.add("editor/plugin/flash-bridge", function (S, SWF, Editor) {
    var instances = {};
    var logger = S.getLogger('s/editor/plugin/flash-bridge');

    function FlashBridge(cfg) {
        this._init(cfg)
    }

    S.augment(FlashBridge, S.EventTarget, {
        _init: function (cfg) {
            var self = this,
                id = S.guid("flash-bridge-"),
                callback = "KISSY.require('editor').FlashBridge.EventHandler";
            cfg.id = id;
            cfg.attrs = cfg.attrs || {};
            cfg.params = cfg.params || {};
            var attrs = cfg.attrs,
                params = cfg.params,
                flashVars = params.flashVars = params.flashVars || {};
            S.mix(attrs, {
                //http://yiminghe.javaeye.com/blog/764872
                //firefox 必须使创建的flash以及容器可见,才会触发contentReady
                //默认给flash自身很大的宽高,容器小点就可以了,
                width: 1,
                height: 1
            }, false);
            //这几个要放在 param 里面,主要是允许 flash js沟通
            S.mix(params, {
                allowScriptAccess: 'always',
                allowNetworking: 'all',
                scale: 'noScale'
            }, false);
            S.mix(flashVars, {
                shareData: false,
                useCompression: false
            }, false);
            var swfCore = {
                YUISwfId: id,
                YUIBridgeCallback: callback
            };
            if (cfg.ajbridge) {
                swfCore = {
                    swfID: id,
                    jsEntry: callback
                };
            }
            S.mix(flashVars, swfCore);
            instances[id] = self;
            self.id = id;
            self.swf = new SWF(cfg);
            self._expose(cfg.methods);
        },
        _expose: function (methods) {
            var self = this;
            for (var i = 0; i < methods.length; i++) {
                var m = methods[i];
                (function (m) {
                    self[m] = function () {
                        return self._callSWF(m, S.makeArray(arguments));
                    };
                })(m);
            }
        },
        _callSWF: function (func, args) {
            return this.swf.callSWF(func, args);
        },
        _eventHandler: function (event) {
            var self = this,
                type = event.type;
            if (type === 'log') {
                logger.debug(event.message);
            } else if (type) {
                self.fire(type, event);
            }
        },
        ready: function (fn) {
            var self = this;
            if (self._ready) {
                fn.call(this);
            } else {
                self.on("contentReady", fn);
            }
        },
        destroy: function () {
            this.swf.destroy();
            delete instances[this.id];
        }
    });

    FlashBridge.EventHandler = function (id, event) {
        logger.debug("fire event: " + event.type);
        var instance = instances[id];
        if (instance) {
            //防止ie同步触发事件,后面还没on呢,另外给 swf 喘息机会
            //否则同步后触发事件,立即调用swf方法会出错
            setTimeout(function () {
                instance._eventHandler.call(instance, event);
            }, 100);
        }
    };

    Editor.FlashBridge = FlashBridge;

    return FlashBridge;
}, {
    requires: ['swf', 'editor']
});