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 });