1 /**
  2  * flash utilities
  3  * @author yiminghe@gmail.com
  4  */
  5 KISSY.add("editor/plugin/flashCommon/utils", function (S) {
  6     var DOM = S.DOM, Node = S.Node, UA = S.UA;
  7     var flashUtils = {
  8 
  9         insertFlash:function (editor, src, attrs, _cls, _type) {
 10             var nodeInfo = flashUtils.createSWF(src, { attrs:attrs }, editor.get("document")[0]),
 11                 real = nodeInfo.el,
 12                 substitute = editor.createFakeElement(real,
 13                     _cls || 'ke_flash',
 14                     _type || 'flash',
 15                     true,
 16                     nodeInfo.html,
 17                     attrs);
 18             editor.insertElement(substitute);
 19             return substitute;
 20         },
 21 
 22         isFlashEmbed:function (element) {
 23             return (
 24                 element.getAttribute("type") == 'application/x-shockwave-flash' ||
 25                     /\.swf(?:$|\?)/i.test(element.getAttribute("src") || '')
 26                 );
 27         },
 28 
 29         getUrl:function (r) {
 30             var url = "";
 31             if (r.nodeName() == "object") {
 32                 var params = r[0].childNodes;
 33                 for (var i = 0; i < params.length; i++) {
 34                     if (params[i].nodeType != 1)continue;
 35                     if ((DOM.attr(params[i], "name") || "").toLowerCase() == "movie") {
 36                         url = DOM.attr(params[i], "value");
 37                     } else if (DOM.nodeName(params[i]) == "embed") {
 38                         url = DOM.attr(params[i], "src");
 39                     } else if (DOM.nodeName(params[i]) == "object") {
 40                         url = DOM.attr(params[i], "data");
 41                     }
 42                 }
 43             } else if (r.nodeName() == "embed") {
 44                 url = r.attr("src");
 45             }
 46             return url;
 47         },
 48         createSWF:function (movie, cfg, doc) {
 49             var attrs = cfg.attrs || {},
 50                 flashVars = cfg.flashVars,
 51                 attrs_str = "",
 52                 params_str = "",
 53                 params = cfg.params || {},
 54                 vars_str = "";
 55             doc = doc || document;
 56             S.mix(attrs, {
 57                 wmode:"transparent"
 58             });
 59             for (var a in attrs) {
 60                 if (attrs.hasOwnProperty(a))
 61                     attrs_str += a + "='" + attrs[a] + "' ";
 62             }
 63 
 64             S.mix(params, {
 65                 quality:"high",
 66                 movie:movie,
 67                 wmode:"transparent"
 68             });
 69             for (var p in params) {
 70                 if (params.hasOwnProperty(p))
 71                     params_str += "<param name='" + p + "' value='" + params[p] + "'/>";
 72             }
 73 
 74 
 75             if (flashVars) {
 76                 for (var f in flashVars) {
 77                     if (flashVars.hasOwnProperty(f))
 78                         vars_str += "&" + f + "=" + encodeURIComponent(flashVars[f]);
 79                 }
 80                 vars_str = vars_str.substring(1);
 81             }
 82 
 83             var outerHTML = '<object ' +
 84                 attrs_str +
 85                 ' classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" >' +
 86                 params_str +
 87                 (vars_str ? '<param name="flashVars" value="' + vars_str + '"/>' : '') +
 88                 /*
 89                  "<object type='application/x-shockwave-flash'" +
 90                  " data='" + movie + "'" +
 91                  " " + attrs_str +
 92                  ">"
 93                  +
 94                  (vars_str ? '<param name="flashVars" value="' + vars_str + '"/>' : '') +
 95                  */
 96                 '<embed ' +
 97                 attrs_str +
 98                 " " +
 99                 (vars_str ? ( 'FlashVars="' + vars_str + '"') : "") +
100                 ' pluginspage="http://www.macromedia.com/go/getflashplayer" ' +
101                 ' quality="high" ' +
102                 ' src="' + movie + '" ' +
103                 ' type="application/x-shockwave-flash"/>' +
104                 // + '</object>' +
105                 '</object>';
106             return {
107                 el:new Node(outerHTML, null, doc),
108                 html:outerHTML
109             };
110         },
111         createSWFRuntime2:function (movie, cfg, doc) {
112             doc = doc || document;
113             var holder = new Node(
114                 "<div " +
115                     "style='" +
116                     "width:0;" +
117                     "height:0;" +
118                     "overflow:hidden;" +
119                     "'>", null, doc).appendTo(doc.body)
120                 , el = flashUtils.createSWF.apply(this, arguments).el.appendTo(holder);
121             if (!UA['ie'])
122                 el = el.one("object");
123             return el[0];
124 
125         },
126         createSWFRuntime:function (movie, cfg, doc) {
127             var attrs = cfg.attrs || {},
128                 flashVars = cfg.flashVars || {},
129                 params = cfg.params || {},
130                 attrs_str = "",
131                 params_str = "",
132                 vars_str = "";
133             doc = doc || document;
134             attrs.id = attrs.id || S.guid("ks-editor-runtimeflash-");
135             for (var a in attrs) {
136                 if (attrs.hasOwnProperty(a))
137                     attrs_str += a + "='" + attrs[a] + "' ";
138             }
139             for (var p in params) {
140                 if (params.hasOwnProperty(p))
141                     params_str += "<param name='" + p + "' value='" + params[p] + "'/>";
142             }
143             for (var f in flashVars) {
144                 if (flashVars.hasOwnProperty(f))
145                     vars_str += "&" + f + "=" + encodeURIComponent(flashVars[f]);
146             }
147             vars_str = vars_str.substring(1);
148 
149             if (UA['ie']) {
150                 var outerHTML = '<object ' +
151                     attrs_str +
152                     ' classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" >' +
153                     params_str +
154                     '<param name="movie" value="' + movie + '" />' +
155                     (vars_str ? '<param name="flashVars" value="' + vars_str + '" />' : '') +
156                     '</object>';
157             }
158             else {
159                 /*!TODO 截止 firefix3.6 ,会发生 flash 请求两次问题,
160                  想改成 embed, 再等等吧
161                  */
162                 outerHTML = "<object " +
163                     "type='application/x-shockwave-flash'" +
164                     " data='" + movie + "'" +
165                     " " + attrs_str +
166                     ">" +
167                     params_str +
168                     (vars_str ? '<param name="flashVars" value="' + vars_str + '"/>' : '')
169                     + '</object>';
170             }
171 
172 
173             var holder = cfg.holder;
174             if (!holder) {
175                 holder = new Node(
176                     "<div " +
177                         "style='" + (
178                         cfg.style ? cfg.style : (
179                             //http://yiminghe.javaeye.com/blog/764872
180                             //firefox 必须使创建的flash以及容器可见,才会触发contentReady
181                             "width:1px;" +
182                                 "height:1px;" +
183                                 "position:absolute;" +
184                                 //"left:" + DOM.scrollLeft() + "px;" +
185                                 //"top:" + DOM.scrollTop() + "px;"
186                                 +"overflow:hidden;"
187                             ))
188                         +
189                         "'>", null, doc
190                 ).
191                     appendTo(doc.body);
192                 //不能初始化时设置,防止刷新,scrollLeft 一开始为0,等会,wait is virtue
193                 setTimeout(function () {
194                     holder.offset({left:DOM.scrollLeft(), top:DOM.scrollTop()})
195                 }, 100);
196             }
197             holder.html(outerHTML);
198             return doc.getElementById(attrs.id);
199         }
200 
201     };
202 
203     return flashUtils;
204 });