it-logica-application-backbone 1.1.2 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. data/VERSION +1 -1
  2. data/app/assets/javascripts/backbone_js/tinymce/changelog.txt +100 -1198
  3. data/app/assets/javascripts/backbone_js/tinymce/examples/css/content.css +105 -105
  4. data/app/assets/javascripts/backbone_js/tinymce/examples/index.html +98 -98
  5. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/jquery.tinymce.js +1 -1
  6. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/license.txt +504 -504
  7. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/advhr/css/advhr.css +5 -5
  8. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js +56 -56
  9. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/advhr/js/rule.js +43 -43
  10. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/advhr/rule.htm +58 -58
  11. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/advimage/css/advimage.css +13 -13
  12. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js +49 -49
  13. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/advimage/image.htm +235 -235
  14. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/advimage/js/image.js +464 -462
  15. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/advlink/css/advlink.css +8 -8
  16. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js +60 -60
  17. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/advlink/js/advlink.js +543 -539
  18. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/advlink/link.htm +338 -338
  19. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin_src.js +175 -175
  20. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin.js +1 -1
  21. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin_src.js +8 -4
  22. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin.js +1 -1
  23. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin_src.js +433 -431
  24. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/autosave/langs/en.js +3 -3
  25. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js +119 -119
  26. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js +1 -1
  27. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js +163 -161
  28. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin.js +1 -1
  29. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js +84 -81
  30. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js +42 -42
  31. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/emotions/emotions.htm +42 -42
  32. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/emotions/js/emotions.js +43 -43
  33. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/example/dialog.htm +22 -22
  34. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/example/editor_plugin_src.js +83 -83
  35. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/example/js/dialog.js +19 -19
  36. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/example/langs/en.js +3 -3
  37. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/example/langs/en_dlg.js +3 -3
  38. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/fullpage/css/fullpage.css +142 -142
  39. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin_src.js +405 -405
  40. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/fullpage/fullpage.htm +259 -259
  41. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js +232 -232
  42. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js +1 -1
  43. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js +159 -159
  44. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/fullscreen/fullscreen.htm +110 -110
  45. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js +53 -53
  46. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js +699 -699
  47. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/inlinepopups/template.htm +387 -387
  48. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js +82 -82
  49. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js +261 -261
  50. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin.js +1 -1
  51. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js +137 -137
  52. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin.js +1 -1
  53. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin_src.js +18 -14
  54. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/media/css/media.css +17 -17
  55. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin.js +1 -1
  56. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin_src.js +898 -890
  57. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/media/js/embed.js +73 -73
  58. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/media/js/media.js +503 -470
  59. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/media/media.htm +922 -922
  60. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js +53 -53
  61. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js +1 -1
  62. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js +536 -539
  63. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js +73 -73
  64. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin.js +1 -1
  65. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js +885 -871
  66. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/paste/js/pastetext.js +36 -36
  67. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/paste/js/pasteword.js +51 -51
  68. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/paste/pastetext.htm +26 -26
  69. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/paste/pasteword.htm +21 -21
  70. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/preview/example.html +28 -28
  71. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/preview/jscripts/embed.js +73 -73
  72. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/preview/preview.html +17 -17
  73. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin_src.js +34 -34
  74. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin_src.js +100 -100
  75. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css +6 -6
  76. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js +60 -60
  77. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js +142 -142
  78. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm +100 -100
  79. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/spellchecker/css/content.css +1 -0
  80. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js +1 -0
  81. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js +436 -0
  82. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/spellchecker/img/wline.gif +0 -0
  83. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/style/css/props.css +14 -14
  84. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin_src.js +71 -71
  85. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/style/js/props.js +709 -709
  86. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/table/cell.htm +180 -180
  87. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/table/css/cell.css +16 -16
  88. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/table/css/row.css +25 -25
  89. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/table/css/table.css +13 -13
  90. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin.js +1 -1
  91. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js +79 -55
  92. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/table/js/cell.js +319 -319
  93. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/table/js/merge_cells.js +27 -27
  94. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/table/js/row.js +237 -237
  95. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/table/js/table.js +499 -487
  96. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/table/merge_cells.htm +32 -32
  97. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/table/row.htm +158 -158
  98. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/table/table.htm +188 -188
  99. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/template/blank.htm +12 -12
  100. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/template/css/template.css +23 -23
  101. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/template/editor_plugin_src.js +158 -158
  102. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/template/js/template.js +106 -106
  103. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/template/template.htm +31 -31
  104. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/visualblocks/css/visualblocks.css +21 -21
  105. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/visualblocks/editor_plugin_src.js +62 -62
  106. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js +82 -82
  107. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js +122 -122
  108. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm +142 -142
  109. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm +142 -142
  110. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm +149 -149
  111. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm +142 -142
  112. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css +11 -11
  113. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css +9 -9
  114. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm +162 -162
  115. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js +131 -131
  116. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm +162 -162
  117. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js +28 -28
  118. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js +28 -28
  119. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js +111 -111
  120. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js +28 -28
  121. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js +53 -53
  122. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js +229 -229
  123. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js +53 -53
  124. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/about.htm +52 -52
  125. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/anchor.htm +26 -26
  126. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/charmap.htm +55 -55
  127. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/color_picker.htm +70 -70
  128. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/editor_template.js +1 -1
  129. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/editor_template_src.js +1490 -1481
  130. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/image.htm +80 -80
  131. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/js/about.js +73 -73
  132. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/js/anchor.js +56 -44
  133. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/js/charmap.js +363 -363
  134. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/js/image.js +253 -253
  135. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/js/link.js +159 -153
  136. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js +78 -78
  137. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/link.htm +57 -57
  138. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/shortcuts.htm +47 -47
  139. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css +50 -51
  140. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css +118 -118
  141. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/ui.css +219 -219
  142. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +24 -25
  143. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +106 -106
  144. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +106 -106
  145. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css +48 -49
  146. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +118 -118
  147. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +222 -222
  148. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +7 -7
  149. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -5
  150. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/advanced/source_editor.htm +25 -25
  151. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/simple/editor_template_src.js +83 -83
  152. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/simple/skins/default/content.css +25 -25
  153. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/simple/skins/default/ui.css +32 -32
  154. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css +17 -17
  155. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css +35 -35
  156. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/tiny_mce.js +1 -1
  157. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/tiny_mce_popup.js +1 -1
  158. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/tiny_mce_src.js +17769 -16902
  159. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/utils/editable_selects.js +70 -70
  160. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/utils/form_utils.js +210 -210
  161. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/utils/mctabs.js +161 -161
  162. data/app/assets/javascripts/backbone_js/tinymce/jscripts/tiny_mce/utils/validate.js +252 -252
  163. data/it-logica-application-backbone.gemspec +6 -2
  164. metadata +19 -15
@@ -1 +1 @@
1
- (function(a){a.onAddEditor.addToTop(function(c,b){b.settings.inline_styles=false});a.create("tinymce.plugins.LegacyOutput",{init:function(b){b.onInit.add(function(){var c="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img",e=a.explode(b.settings.font_size_style_values),d=b.schema;b.formatter.register({alignleft:{selector:c,attributes:{align:"left"}},aligncenter:{selector:c,attributes:{align:"center"}},alignright:{selector:c,attributes:{align:"right"}},alignfull:{selector:c,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all"},{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all"},{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all"},{inline:"span",styles:{textDecoration:"underline"},exact:true}],strikethrough:[{inline:"strike",remove:"all"},{inline:"span",styles:{textDecoration:"line-through"},exact:true}],fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(f){return a.inArray(e,f.value)+1}}},forecolor:{inline:"font",styles:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}});a.each("b,i,u,strike".split(","),function(f){d.addValidElements(f+"[*]")});if(!d.getElementRule("font")){d.addValidElements("font[face|size|color|style]")}a.each(c.split(","),function(f){var h=d.getElementRule(f),g;if(h){if(!h.attributes.align){h.attributes.align={};h.attributesOrder.push("align")}}});b.onNodeChange.add(function(g,k){var j,f,h,i;f=g.dom.getParent(g.selection.getNode(),"font");if(f){h=f.face;i=f.size}if(j=k.get("fontselect")){j.select(function(l){return l==h})}if(j=k.get("fontsizeselect")){j.select(function(m){var l=a.inArray(e,m.fontSize);return l+1==i})}})})},getInfo:function(){return{longname:"LegacyOutput",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("legacyoutput",a.plugins.LegacyOutput)})(tinymce);
1
+ (function(a){a.onAddEditor.addToTop(function(c,b){b.settings.inline_styles=false});a.create("tinymce.plugins.LegacyOutput",{init:function(b){b.onInit.add(function(){var c="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img",e=a.explode(b.settings.font_size_style_values),d=b.schema;b.formatter.register({alignleft:{selector:c,attributes:{align:"left"}},aligncenter:{selector:c,attributes:{align:"center"}},alignright:{selector:c,attributes:{align:"right"}},alignfull:{selector:c,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all"},{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all"},{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all"},{inline:"span",styles:{textDecoration:"underline"},exact:true}],strikethrough:[{inline:"strike",remove:"all"},{inline:"span",styles:{textDecoration:"line-through"},exact:true}],fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(f){return a.inArray(e,f.value)+1}}},forecolor:{inline:"font",attributes:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}});a.each("b,i,u,strike".split(","),function(f){d.addValidElements(f+"[*]")});if(!d.getElementRule("font")){d.addValidElements("font[face|size|color|style]")}a.each(c.split(","),function(f){var h=d.getElementRule(f),g;if(h){if(!h.attributes.align){h.attributes.align={};h.attributesOrder.push("align")}}});b.onNodeChange.add(function(g,k){var j,f,h,i;f=g.dom.getParent(g.selection.getNode(),"font");if(f){h=f.face;i=f.size}if(j=k.get("fontselect")){j.select(function(l){return l==h})}if(j=k.get("fontsizeselect")){j.select(function(m){var l=a.inArray(e,m.fontSize);return l+1==i})}})})},getInfo:function(){return{longname:"LegacyOutput",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("legacyoutput",a.plugins.LegacyOutput)})(tinymce);
@@ -1,139 +1,139 @@
1
- /**
2
- * editor_plugin_src.js
3
- *
4
- * Copyright 2009, Moxiecode Systems AB
5
- * Released under LGPL License.
6
- *
7
- * License: http://tinymce.moxiecode.com/license
8
- * Contributing: http://tinymce.moxiecode.com/contributing
9
- *
10
- * This plugin will force TinyMCE to produce deprecated legacy output such as font elements, u elements, align
11
- * attributes and so forth. There are a few cases where these old items might be needed for example in email applications or with Flash
12
- *
13
- * However you should NOT use this plugin if you are building some system that produces web contents such as a CMS. All these elements are
14
- * not apart of the newer specifications for HTML and XHTML.
15
- */
16
-
17
- (function(tinymce) {
18
- // Override inline_styles setting to force TinyMCE to produce deprecated contents
19
- tinymce.onAddEditor.addToTop(function(tinymce, editor) {
20
- editor.settings.inline_styles = false;
21
- });
22
-
23
- // Create the legacy ouput plugin
24
- tinymce.create('tinymce.plugins.LegacyOutput', {
25
- init : function(editor) {
26
- editor.onInit.add(function() {
27
- var alignElements = 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img',
28
- fontSizes = tinymce.explode(editor.settings.font_size_style_values),
29
- schema = editor.schema;
30
-
31
- // Override some internal formats to produce legacy elements and attributes
32
- editor.formatter.register({
33
- // Change alignment formats to use the deprecated align attribute
34
- alignleft : {selector : alignElements, attributes : {align : 'left'}},
35
- aligncenter : {selector : alignElements, attributes : {align : 'center'}},
36
- alignright : {selector : alignElements, attributes : {align : 'right'}},
37
- alignfull : {selector : alignElements, attributes : {align : 'justify'}},
38
-
1
+ /**
2
+ * editor_plugin_src.js
3
+ *
4
+ * Copyright 2009, Moxiecode Systems AB
5
+ * Released under LGPL License.
6
+ *
7
+ * License: http://tinymce.moxiecode.com/license
8
+ * Contributing: http://tinymce.moxiecode.com/contributing
9
+ *
10
+ * This plugin will force TinyMCE to produce deprecated legacy output such as font elements, u elements, align
11
+ * attributes and so forth. There are a few cases where these old items might be needed for example in email applications or with Flash
12
+ *
13
+ * However you should NOT use this plugin if you are building some system that produces web contents such as a CMS. All these elements are
14
+ * not apart of the newer specifications for HTML and XHTML.
15
+ */
16
+
17
+ (function(tinymce) {
18
+ // Override inline_styles setting to force TinyMCE to produce deprecated contents
19
+ tinymce.onAddEditor.addToTop(function(tinymce, editor) {
20
+ editor.settings.inline_styles = false;
21
+ });
22
+
23
+ // Create the legacy ouput plugin
24
+ tinymce.create('tinymce.plugins.LegacyOutput', {
25
+ init : function(editor) {
26
+ editor.onInit.add(function() {
27
+ var alignElements = 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img',
28
+ fontSizes = tinymce.explode(editor.settings.font_size_style_values),
29
+ schema = editor.schema;
30
+
31
+ // Override some internal formats to produce legacy elements and attributes
32
+ editor.formatter.register({
33
+ // Change alignment formats to use the deprecated align attribute
34
+ alignleft : {selector : alignElements, attributes : {align : 'left'}},
35
+ aligncenter : {selector : alignElements, attributes : {align : 'center'}},
36
+ alignright : {selector : alignElements, attributes : {align : 'right'}},
37
+ alignfull : {selector : alignElements, attributes : {align : 'justify'}},
38
+
39
39
  // Change the basic formatting elements to use deprecated element types
40
- bold : [
41
- {inline : 'b', remove : 'all'},
42
- {inline : 'strong', remove : 'all'},
43
- {inline : 'span', styles : {fontWeight : 'bold'}}
40
+ bold : [
41
+ {inline : 'b', remove : 'all'},
42
+ {inline : 'strong', remove : 'all'},
43
+ {inline : 'span', styles : {fontWeight : 'bold'}}
44
+ ],
45
+ italic : [
46
+ {inline : 'i', remove : 'all'},
47
+ {inline : 'em', remove : 'all'},
48
+ {inline : 'span', styles : {fontStyle : 'italic'}}
49
+ ],
50
+ underline : [
51
+ {inline : 'u', remove : 'all'},
52
+ {inline : 'span', styles : {textDecoration : 'underline'}, exact : true}
53
+ ],
54
+ strikethrough : [
55
+ {inline : 'strike', remove : 'all'},
56
+ {inline : 'span', styles : {textDecoration: 'line-through'}, exact : true}
44
57
  ],
45
- italic : [
46
- {inline : 'i', remove : 'all'},
47
- {inline : 'em', remove : 'all'},
48
- {inline : 'span', styles : {fontStyle : 'italic'}}
49
- ],
50
- underline : [
51
- {inline : 'u', remove : 'all'},
52
- {inline : 'span', styles : {textDecoration : 'underline'}, exact : true}
53
- ],
54
- strikethrough : [
55
- {inline : 'strike', remove : 'all'},
56
- {inline : 'span', styles : {textDecoration: 'line-through'}, exact : true}
57
- ],
58
-
59
- // Change font size and font family to use the deprecated font element
60
- fontname : {inline : 'font', attributes : {face : '%value'}},
61
- fontsize : {
62
- inline : 'font',
63
- attributes : {
64
- size : function(vars) {
65
- return tinymce.inArray(fontSizes, vars.value) + 1;
66
- }
67
- }
68
- },
69
-
70
- // Setup font elements for colors as well
71
- forecolor : {inline : 'font', styles : {color : '%value'}},
72
- hilitecolor : {inline : 'font', styles : {backgroundColor : '%value'}}
73
- });
74
-
75
- // Check that deprecated elements are allowed if not add them
76
- tinymce.each('b,i,u,strike'.split(','), function(name) {
77
- schema.addValidElements(name + '[*]');
78
- });
79
-
80
- // Add font element if it's missing
81
- if (!schema.getElementRule("font"))
82
- schema.addValidElements("font[face|size|color|style]");
83
-
84
- // Add the missing and depreacted align attribute for the serialization engine
85
- tinymce.each(alignElements.split(','), function(name) {
86
- var rule = schema.getElementRule(name), found;
87
-
88
- if (rule) {
89
- if (!rule.attributes.align) {
90
- rule.attributes.align = {};
91
- rule.attributesOrder.push('align');
92
- }
93
- }
94
- });
95
-
96
- // Listen for the onNodeChange event so that we can do special logic for the font size and font name drop boxes
97
- editor.onNodeChange.add(function(editor, control_manager) {
98
- var control, fontElm, fontName, fontSize;
99
-
100
- // Find font element get it's name and size
101
- fontElm = editor.dom.getParent(editor.selection.getNode(), 'font');
102
- if (fontElm) {
103
- fontName = fontElm.face;
104
- fontSize = fontElm.size;
105
- }
106
-
107
- // Select/unselect the font name in droplist
108
- if (control = control_manager.get('fontselect')) {
109
- control.select(function(value) {
110
- return value == fontName;
111
- });
112
- }
113
-
114
- // Select/unselect the font size in droplist
115
- if (control = control_manager.get('fontsizeselect')) {
116
- control.select(function(value) {
117
- var index = tinymce.inArray(fontSizes, value.fontSize);
118
-
119
- return index + 1 == fontSize;
120
- });
121
- }
122
- });
123
- });
124
- },
125
-
126
- getInfo : function() {
127
- return {
128
- longname : 'LegacyOutput',
129
- author : 'Moxiecode Systems AB',
130
- authorurl : 'http://tinymce.moxiecode.com',
131
- infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput',
132
- version : tinymce.majorVersion + "." + tinymce.minorVersion
133
- };
134
- }
135
- });
136
-
137
- // Register plugin
138
- tinymce.PluginManager.add('legacyoutput', tinymce.plugins.LegacyOutput);
139
- })(tinymce);
58
+
59
+ // Change font size and font family to use the deprecated font element
60
+ fontname : {inline : 'font', attributes : {face : '%value'}},
61
+ fontsize : {
62
+ inline : 'font',
63
+ attributes : {
64
+ size : function(vars) {
65
+ return tinymce.inArray(fontSizes, vars.value) + 1;
66
+ }
67
+ }
68
+ },
69
+
70
+ // Setup font elements for colors as well
71
+ forecolor : {inline : 'font', attributes : {color : '%value'}},
72
+ hilitecolor : {inline : 'font', styles : {backgroundColor : '%value'}}
73
+ });
74
+
75
+ // Check that deprecated elements are allowed if not add them
76
+ tinymce.each('b,i,u,strike'.split(','), function(name) {
77
+ schema.addValidElements(name + '[*]');
78
+ });
79
+
80
+ // Add font element if it's missing
81
+ if (!schema.getElementRule("font"))
82
+ schema.addValidElements("font[face|size|color|style]");
83
+
84
+ // Add the missing and depreacted align attribute for the serialization engine
85
+ tinymce.each(alignElements.split(','), function(name) {
86
+ var rule = schema.getElementRule(name), found;
87
+
88
+ if (rule) {
89
+ if (!rule.attributes.align) {
90
+ rule.attributes.align = {};
91
+ rule.attributesOrder.push('align');
92
+ }
93
+ }
94
+ });
95
+
96
+ // Listen for the onNodeChange event so that we can do special logic for the font size and font name drop boxes
97
+ editor.onNodeChange.add(function(editor, control_manager) {
98
+ var control, fontElm, fontName, fontSize;
99
+
100
+ // Find font element get it's name and size
101
+ fontElm = editor.dom.getParent(editor.selection.getNode(), 'font');
102
+ if (fontElm) {
103
+ fontName = fontElm.face;
104
+ fontSize = fontElm.size;
105
+ }
106
+
107
+ // Select/unselect the font name in droplist
108
+ if (control = control_manager.get('fontselect')) {
109
+ control.select(function(value) {
110
+ return value == fontName;
111
+ });
112
+ }
113
+
114
+ // Select/unselect the font size in droplist
115
+ if (control = control_manager.get('fontsizeselect')) {
116
+ control.select(function(value) {
117
+ var index = tinymce.inArray(fontSizes, value.fontSize);
118
+
119
+ return index + 1 == fontSize;
120
+ });
121
+ }
122
+ });
123
+ });
124
+ },
125
+
126
+ getInfo : function() {
127
+ return {
128
+ longname : 'LegacyOutput',
129
+ author : 'Moxiecode Systems AB',
130
+ authorurl : 'http://tinymce.moxiecode.com',
131
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput',
132
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
133
+ };
134
+ }
135
+ });
136
+
137
+ // Register plugin
138
+ tinymce.PluginManager.add('legacyoutput', tinymce.plugins.LegacyOutput);
139
+ })(tinymce);
@@ -1 +1 @@
1
- (function(){var e=tinymce.each,r=tinymce.dom.Event,g;function p(t,s){while(t&&(t.nodeType===8||(t.nodeType===3&&/^[ \t\n\r]*$/.test(t.nodeValue)))){t=s(t)}return t}function b(s){return p(s,function(t){return t.previousSibling})}function i(s){return p(s,function(t){return t.nextSibling})}function d(s,u,t){return s.dom.getParent(u,function(v){return tinymce.inArray(t,v)!==-1})}function n(s){return s&&(s.tagName==="OL"||s.tagName==="UL")}function c(u,v){var t,w,s;t=b(u.lastChild);while(n(t)){w=t;t=b(w.previousSibling)}if(w){s=v.create("li",{style:"list-style-type: none;"});v.split(u,w);v.insertAfter(s,w);s.appendChild(w);s.appendChild(w);u=s.previousSibling}return u}function m(t,s,u){t=a(t,s,u);return o(t,s,u)}function a(u,s,v){var t=b(u.previousSibling);if(t){return h(t,u,s?t:false,v)}else{return u}}function o(u,t,v){var s=i(u.nextSibling);if(s){return h(u,s,t?s:false,v)}else{return u}}function h(u,s,t,v){if(l(u,s,!!t,v)){return f(u,s,t)}else{if(u&&u.tagName==="LI"&&n(s)){u.appendChild(s)}}return s}function l(u,t,s,v){if(!u||!t){return false}else{if(u.tagName==="LI"&&t.tagName==="LI"){return t.style.listStyleType==="none"||j(t)}else{if(n(u)){return(u.tagName===t.tagName&&(s||u.style.listStyleType===t.style.listStyleType))||q(t)}else{return v&&u.tagName==="P"&&t.tagName==="P"}}}}function q(t){var s=i(t.firstChild),u=b(t.lastChild);return s&&u&&n(t)&&s===u&&(n(s)||s.style.listStyleType==="none"||j(s))}function j(u){var t=i(u.firstChild),s=b(u.lastChild);return t&&s&&t===s&&n(t)}function f(w,v,s){var u=b(w.lastChild),t=i(v.firstChild);if(w.tagName==="P"){w.appendChild(w.ownerDocument.createElement("br"))}while(v.firstChild){w.appendChild(v.firstChild)}if(s){w.style.listStyleType=s.style.listStyleType}v.parentNode.removeChild(v);h(u,t,false);return w}function k(t,u){var s;if(!u.is(t,"li,ol,ul")){s=u.getParent(t,"li");if(s){t=s}}return t}tinymce.create("tinymce.plugins.Lists",{init:function(y){var v="TABBING";var s="EMPTY";var J="ESCAPE";var z="PARAGRAPH";var N="UNKNOWN";var x=N;function E(U){return U.keyCode===tinymce.VK.TAB&&!(U.altKey||U.ctrlKey)&&(y.queryCommandState("InsertUnorderedList")||y.queryCommandState("InsertOrderedList"))}function w(){var U=B();var W=U.parentNode.parentNode;var V=U.parentNode.lastChild===U;return V&&!t(W)&&P(U)}function t(U){if(n(U)){return U.parentNode&&U.parentNode.tagName==="LI"}else{return U.tagName==="LI"}}function F(){return y.selection.isCollapsed()&&P(B())}function B(){var U=y.selection.getStart();return((U.tagName=="BR"||U.tagName=="")&&U.parentNode.tagName=="LI")?U.parentNode:U}function P(U){var V=U.childNodes.length;if(U.tagName==="LI"){return V==0?true:V==1&&(U.firstChild.tagName==""||U.firstChild.tagName=="BR"||H(U))}return false}function H(U){var V=tinymce.grep(U.parentNode.childNodes,function(Y){return Y.tagName=="LI"});var W=U==V[V.length-1];var X=U.firstChild;return tinymce.isIE9&&W&&(X.nodeValue==String.fromCharCode(160)||X.nodeValue==String.fromCharCode(32))}function T(U){return U.keyCode===tinymce.VK.ENTER}function A(U){return T(U)&&!U.shiftKey}function M(U){if(E(U)){return v}else{if(A(U)&&w()){return N}else{if(A(U)&&F()){return s}else{return N}}}}function D(U,V){if(x==v||x==s||tinymce.isGecko&&x==J){r.cancel(V)}}function C(){var U=y.selection.getRng(true);var V=U.startContainer;if(V.nodeType==3){var W=V.nodeValue;if(tinymce.isIE9&&W.length>1&&W.charCodeAt(W.length-1)==32){return(U.endOffset==W.length-1)}else{return(U.endOffset==W.length)}}else{if(V.nodeType==1){return U.endOffset==V.childNodes.length}}return false}function I(){var W=y.selection.getNode();var V="h1,h2,h3,h4,h5,h6,p,div";var U=y.dom.is(W,V)&&W.parentNode.tagName==="LI"&&W.parentNode.lastChild===W;return y.selection.isCollapsed()&&U&&C()}function K(W,Y){if(A(Y)&&I()){var X=W.selection.getNode();var V=W.dom.create("li");var U=W.dom.getParent(X,"li");W.dom.insertAfter(V,U);if(tinymce.isIE6||tinymce.isIE7||tinyMCE.isIE8){W.selection.setCursorLocation(V,1)}else{W.selection.setCursorLocation(V,0)}Y.preventDefault()}}function u(X,Z){var ac;if(!tinymce.isGecko){return}var V=X.selection.getStart();if(Z.keyCode!=tinymce.VK.BACKSPACE||V.tagName!=="IMG"){return}function W(ag){var ah=ag.firstChild;var af=null;do{if(!ah){break}if(ah.tagName==="LI"){af=ah}}while(ah=ah.nextSibling);return af}function ae(ag,af){while(ag.childNodes.length>0){af.appendChild(ag.childNodes[0])}}ac=V.parentNode.previousSibling;if(!ac){return}var aa;if(ac.tagName==="UL"||ac.tagName==="OL"){aa=ac}else{if(ac.previousSibling&&(ac.previousSibling.tagName==="UL"||ac.previousSibling.tagName==="OL")){aa=ac.previousSibling}else{return}}var ad=W(aa);var U=X.dom.createRng();U.setStart(ad,1);U.setEnd(ad,1);X.selection.setRng(U);X.selection.collapse(true);var Y=X.selection.getBookmark();var ab=V.parentNode.cloneNode(true);if(ab.tagName==="P"||ab.tagName==="DIV"){ae(ab,ad)}else{ad.appendChild(ab)}V.parentNode.parentNode.removeChild(V.parentNode);X.selection.moveToBookmark(Y)}function G(U){var V=y.dom.getParent(U,"ol,ul");if(V!=null){var W=V.lastChild;y.selection.setCursorLocation(W,0)}}this.ed=y;y.addCommand("Indent",this.indent,this);y.addCommand("Outdent",this.outdent,this);y.addCommand("InsertUnorderedList",function(){this.applyList("UL","OL")},this);y.addCommand("InsertOrderedList",function(){this.applyList("OL","UL")},this);y.onInit.add(function(){y.editorCommands.addCommands({outdent:function(){var V=y.selection,W=y.dom;function U(X){X=W.getParent(X,W.isBlock);return X&&(parseInt(y.dom.getStyle(X,"margin-left")||0,10)+parseInt(y.dom.getStyle(X,"padding-left")||0,10))>0}return U(V.getStart())||U(V.getEnd())||y.queryCommandState("InsertOrderedList")||y.queryCommandState("InsertUnorderedList")}},"state")});y.onKeyUp.add(function(V,W){if(x==v){V.execCommand(W.shiftKey?"Outdent":"Indent",true,null);x=N;return r.cancel(W)}else{if(x==s){var U=B();var Y=V.settings.list_outdent_on_enter===true||W.shiftKey;V.execCommand(Y?"Outdent":"Indent",true,null);if(tinymce.isIE){G(U)}return r.cancel(W)}else{if(x==J){if(tinymce.isIE6||tinymce.isIE7||tinymce.isIE8){var X=V.getDoc().createTextNode("\uFEFF");V.selection.getNode().appendChild(X)}else{if(tinymce.isIE9||tinymce.isGecko){V.execCommand("Outdent");return r.cancel(W)}}}}}});function L(V,U){var W=y.getDoc().createTextNode("\uFEFF");V.insertBefore(W,U);y.selection.setCursorLocation(W,0);y.execCommand("mceRepaint")}function R(V,X){if(T(X)){var U=B();if(U){var W=U.parentNode;var Y=W&&W.parentNode;if(Y&&Y.nodeName=="LI"&&Y.firstChild==W&&U==W.firstChild){L(Y,W)}}}}function S(V,X){if(T(X)){var U=B();if(V.dom.select("ul li",U).length===1){var W=U.firstChild;L(U,W)}}}function Q(V,Z){function W(ad,aa){var ac=[];var ae=new tinymce.dom.TreeWalker(aa,ad);for(var ab=ae.current();ab;ab=ae.next()){if(V.dom.is(ab,"ol,ul,li")){ac.push(ab)}}return ac}if(Z.keyCode==tinymce.VK.BACKSPACE){var U=B();if(U){var Y=V.dom.getParent(U,"ol,ul");if(Y&&Y.firstChild===U){var X=W(Y,U);V.execCommand("Outdent",false,X);V.undoManager.add();return r.cancel(Z)}}}}function O(V,X){var U=B();if(X.keyCode===tinymce.VK.BACKSPACE&&V.dom.is(U,"li")&&U.parentNode.firstChild!==U){if(V.dom.select("ul,ol",U).length===1){var Z=U.previousSibling;V.dom.remove(V.dom.select("br",U));V.dom.remove(U,true);var W=tinymce.grep(Z.childNodes,function(aa){return aa.nodeType===3});if(W.length===1){var Y=W[0];V.selection.setCursorLocation(Y,Y.length)}V.undoManager.add();return r.cancel(X)}}}y.onKeyDown.add(function(U,V){x=M(V)});y.onKeyDown.add(D);y.onKeyDown.add(u);y.onKeyDown.add(K);if(tinymce.isGecko){y.onKeyUp.add(R)}if(tinymce.isIE8){y.onKeyUp.add(S)}if(tinymce.isGecko||tinymce.isWebKit){y.onKeyDown.add(Q)}if(tinymce.isWebKit){y.onKeyDown.add(O)}},applyList:function(y,v){var C=this,z=C.ed,I=z.dom,s=[],H=false,u=false,w=false,B,G=z.selection.getSelectedBlocks();function E(t){if(t&&t.tagName==="BR"){I.remove(t)}}function F(M){var N=I.create(y),t;function L(O){if(O.style.marginLeft||O.style.paddingLeft){C.adjustPaddingFunction(false)(O)}}if(M.tagName==="LI"){}else{if(M.tagName==="P"||M.tagName==="DIV"||M.tagName==="BODY"){K(M,function(P,O){J(P,O,M.tagName==="BODY"?null:P.parentNode);t=P.parentNode;L(t);E(O)});if(t){if(t.tagName==="LI"&&(M.tagName==="P"||G.length>1)){I.split(t.parentNode.parentNode,t.parentNode)}m(t.parentNode,true)}return}else{t=I.create("li");I.insertAfter(t,M);t.appendChild(M);L(M);M=t}}I.insertAfter(N,M);N.appendChild(M);m(N,true);s.push(M)}function J(P,L,N){var t,O=P,M;while(!I.isBlock(P.parentNode)&&P.parentNode!==I.getRoot()){P=I.split(P.parentNode,P.previousSibling);P=P.nextSibling;O=P}if(N){t=N.cloneNode(true);P.parentNode.insertBefore(t,P);while(t.firstChild){I.remove(t.firstChild)}t=I.rename(t,"li")}else{t=I.create("li");P.parentNode.insertBefore(t,P)}while(O&&O!=L){M=O.nextSibling;t.appendChild(O);O=M}if(t.childNodes.length===0){t.innerHTML='<br _mce_bogus="1" />'}F(t)}function K(Q,T){var N,R,O=3,L=1,t="br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl";function P(X,U){var V=I.createRng(),W;g.keep=true;z.selection.moveToBookmark(g);g.keep=false;W=z.selection.getRng(true);if(!U){U=X.parentNode.lastChild}V.setStartBefore(X);V.setEndAfter(U);return !(V.compareBoundaryPoints(O,W)>0||V.compareBoundaryPoints(L,W)<=0)}function S(U){if(U.nextSibling){return U.nextSibling}if(!I.isBlock(U.parentNode)&&U.parentNode!==I.getRoot()){return S(U.parentNode)}}N=Q.firstChild;var M=false;e(I.select(t,Q),function(U){if(U.hasAttribute&&U.hasAttribute("_mce_bogus")){return true}if(P(N,U)){I.addClass(U,"_mce_tagged_br");N=S(U)}});M=(N&&P(N,undefined));N=Q.firstChild;e(I.select(t,Q),function(V){var U=S(V);if(V.hasAttribute&&V.hasAttribute("_mce_bogus")){return true}if(I.hasClass(V,"_mce_tagged_br")){T(N,V,R);R=null}else{R=V}N=U});if(M){T(N,undefined,R)}}function D(t){K(t,function(M,L,N){J(M,L);E(L);E(N)})}function A(t){if(tinymce.inArray(s,t)!==-1){return}if(t.parentNode.tagName===v){I.split(t.parentNode,t);F(t);o(t.parentNode,false)}s.push(t)}function x(M){var O,N,L,t;if(tinymce.inArray(s,M)!==-1){return}M=c(M,I);while(I.is(M.parentNode,"ol,ul,li")){I.split(M.parentNode,M)}s.push(M);M=I.rename(M,"p");L=m(M,false,z.settings.force_br_newlines);if(L===M){O=M.firstChild;while(O){if(I.isBlock(O)){O=I.split(O.parentNode,O);t=true;N=O.nextSibling&&O.nextSibling.firstChild}else{N=O.nextSibling;if(t&&O.tagName==="BR"){I.remove(O)}t=false}O=N}}}e(G,function(t){t=k(t,I);if(t.tagName===v||(t.tagName==="LI"&&t.parentNode.tagName===v)){u=true}else{if(t.tagName===y||(t.tagName==="LI"&&t.parentNode.tagName===y)){H=true}else{w=true}}});if(w&&!H||u||G.length===0){B={LI:A,H1:F,H2:F,H3:F,H4:F,H5:F,H6:F,P:F,BODY:F,DIV:G.length>1?F:D,defaultAction:D,elements:this.selectedBlocks()}}else{B={defaultAction:x,elements:this.selectedBlocks()}}this.process(B)},indent:function(){var u=this.ed,w=u.dom,x=[];function s(z){var y=w.create("li",{style:"list-style-type: none;"});w.insertAfter(y,z);return y}function t(B){var y=s(B),D=w.getParent(B,"ol,ul"),C=D.tagName,E=w.getStyle(D,"list-style-type"),A={},z;if(E!==""){A.style="list-style-type: "+E+";"}z=w.create(C,A);y.appendChild(z);return z}function v(z){if(!d(u,z,x)){z=c(z,w);var y=t(z);y.appendChild(z);m(y.parentNode,false);m(y,false);x.push(z)}}this.process({LI:v,defaultAction:this.adjustPaddingFunction(true),elements:this.selectedBlocks()})},outdent:function(y,x){var w=this,u=w.ed,z=u.dom,s=[];function A(t){var C,B,D;if(!d(u,t,s)){if(z.getStyle(t,"margin-left")!==""||z.getStyle(t,"padding-left")!==""){return w.adjustPaddingFunction(false)(t)}D=z.getStyle(t,"text-align",true);if(D==="center"||D==="right"){z.setStyle(t,"text-align","left");return}t=c(t,z);C=t.parentNode;B=t.parentNode.parentNode;if(B.tagName==="P"){z.split(B,t.parentNode)}else{z.split(C,t);if(B.tagName==="LI"){z.split(B,t)}else{if(!z.is(B,"ol,ul")){z.rename(t,"p")}}}s.push(t)}}var v=x&&tinymce.is(x,"array")?x:this.selectedBlocks();this.process({LI:A,defaultAction:this.adjustPaddingFunction(false),elements:v});e(s,m)},process:function(y){var F=this,w=F.ed.selection,z=F.ed.dom,E,u;function B(t){var s=tinymce.grep(t.childNodes,function(H){return !(H.nodeName==="BR"||H.nodeName==="SPAN"&&z.getAttrib(H,"data-mce-type")=="bookmark"||H.nodeType==3&&(H.nodeValue==String.fromCharCode(160)||H.nodeValue==""))});return s.length===0}function x(s){z.removeClass(s,"_mce_act_on");if(!s||s.nodeType!==1||E.length>1&&B(s)){return}s=k(s,z);var t=y[s.tagName];if(!t){t=y.defaultAction}t(s)}function v(s){F.splitSafeEach(s.childNodes,x)}function C(s,t){return t>=0&&s.hasChildNodes()&&t<s.childNodes.length&&s.childNodes[t].tagName==="BR"}function D(){var t=w.getNode();var s=z.getParent(t,"td");return s!==null}E=y.elements;u=w.getRng(true);if(!u.collapsed){if(C(u.endContainer,u.endOffset-1)){u.setEnd(u.endContainer,u.endOffset-1);w.setRng(u)}if(C(u.startContainer,u.startOffset)){u.setStart(u.startContainer,u.startOffset+1);w.setRng(u)}}if(tinymce.isIE8){var G=F.ed.selection.getNode();if(G.tagName==="LI"&&!(G.parentNode.lastChild===G)){var A=F.ed.getDoc().createTextNode("\uFEFF");G.appendChild(A)}}g=w.getBookmark();y.OL=y.UL=v;F.splitSafeEach(E,x);w.moveToBookmark(g);g=null;if(!D()){F.ed.execCommand("mceRepaint")}},splitSafeEach:function(t,s){if(tinymce.isGecko&&(/Firefox\/[12]\.[0-9]/.test(navigator.userAgent)||/Firefox\/3\.[0-4]/.test(navigator.userAgent))){this.classBasedEach(t,s)}else{e(t,s)}},classBasedEach:function(v,u){var w=this.ed.dom,s,t;e(v,function(x){w.addClass(x,"_mce_act_on")});s=w.select("._mce_act_on");while(s.length>0){t=s.shift();w.removeClass(t,"_mce_act_on");u(t);s=w.select("._mce_act_on")}},adjustPaddingFunction:function(u){var s,v,t=this.ed;s=t.settings.indentation;v=/[a-z%]+/i.exec(s);s=parseInt(s,10);return function(w){var y,x;y=parseInt(t.dom.getStyle(w,"margin-left")||0,10)+parseInt(t.dom.getStyle(w,"padding-left")||0,10);if(u){x=y+s}else{x=y-s}t.dom.setStyle(w,"padding-left","");t.dom.setStyle(w,"margin-left",x>0?x+v:"")}},selectedBlocks:function(){var s=this.ed;var t=s.selection.getSelectedBlocks();return t.length==0?[s.dom.getRoot()]:t},getInfo:function(){return{longname:"Lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/lists",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("lists",tinymce.plugins.Lists)}());
1
+ (function(){var e=tinymce.each,r=tinymce.dom.Event,g;function p(t,s){while(t&&(t.nodeType===8||(t.nodeType===3&&/^[ \t\n\r]*$/.test(t.nodeValue)))){t=s(t)}return t}function b(s){return p(s,function(t){return t.previousSibling})}function i(s){return p(s,function(t){return t.nextSibling})}function d(s,u,t){return s.dom.getParent(u,function(v){return tinymce.inArray(t,v)!==-1})}function n(s){return s&&(s.tagName==="OL"||s.tagName==="UL")}function c(u,v){var t,w,s;t=b(u.lastChild);while(n(t)){w=t;t=b(w.previousSibling)}if(w){s=v.create("li",{style:"list-style-type: none;"});v.split(u,w);v.insertAfter(s,w);s.appendChild(w);s.appendChild(w);u=s.previousSibling}return u}function m(t,s,u){t=a(t,s,u);return o(t,s,u)}function a(u,s,v){var t=b(u.previousSibling);if(t){return h(t,u,s?t:false,v)}else{return u}}function o(u,t,v){var s=i(u.nextSibling);if(s){return h(u,s,t?s:false,v)}else{return u}}function h(u,s,t,v){if(l(u,s,!!t,v)){return f(u,s,t)}else{if(u&&u.tagName==="LI"&&n(s)){u.appendChild(s)}}return s}function l(u,t,s,v){if(!u||!t){return false}else{if(u.tagName==="LI"&&t.tagName==="LI"){return t.style.listStyleType==="none"||j(t)}else{if(n(u)){return(u.tagName===t.tagName&&(s||u.style.listStyleType===t.style.listStyleType))||q(t)}else{return v&&u.tagName==="P"&&t.tagName==="P"}}}}function q(t){var s=i(t.firstChild),u=b(t.lastChild);return s&&u&&n(t)&&s===u&&(n(s)||s.style.listStyleType==="none"||j(s))}function j(u){var t=i(u.firstChild),s=b(u.lastChild);return t&&s&&t===s&&n(t)}function f(w,v,s){var u=b(w.lastChild),t=i(v.firstChild);if(w.tagName==="P"){w.appendChild(w.ownerDocument.createElement("br"))}while(v.firstChild){w.appendChild(v.firstChild)}if(s){w.style.listStyleType=s.style.listStyleType}v.parentNode.removeChild(v);h(u,t,false);return w}function k(t,u){var s;if(!u.is(t,"li,ol,ul")){s=u.getParent(t,"li");if(s){t=s}}return t}tinymce.create("tinymce.plugins.Lists",{init:function(y){var v="TABBING";var s="EMPTY";var J="ESCAPE";var z="PARAGRAPH";var N="UNKNOWN";var x=N;function E(U){return U.keyCode===tinymce.VK.TAB&&!(U.altKey||U.ctrlKey)&&(y.queryCommandState("InsertUnorderedList")||y.queryCommandState("InsertOrderedList"))}function w(){var U=B();var W=U.parentNode.parentNode;var V=U.parentNode.lastChild===U;return V&&!t(W)&&P(U)}function t(U){if(n(U)){return U.parentNode&&U.parentNode.tagName==="LI"}else{return U.tagName==="LI"}}function F(){return y.selection.isCollapsed()&&P(B())}function B(){var U=y.selection.getStart();return((U.tagName=="BR"||U.tagName=="")&&U.parentNode.tagName=="LI")?U.parentNode:U}function P(U){var V=U.childNodes.length;if(U.tagName==="LI"){return V==0?true:V==1&&(U.firstChild.tagName==""||U.firstChild.tagName=="BR"||H(U))}return false}function H(U){var V=tinymce.grep(U.parentNode.childNodes,function(Y){return Y.tagName=="LI"});var W=U==V[V.length-1];var X=U.firstChild;return tinymce.isIE9&&W&&(X.nodeValue==String.fromCharCode(160)||X.nodeValue==String.fromCharCode(32))}function T(U){return U.keyCode===tinymce.VK.ENTER}function A(U){return T(U)&&!U.shiftKey}function M(U){if(E(U)){return v}else{if(A(U)&&w()){return N}else{if(A(U)&&F()){return s}else{return N}}}}function D(U,V){if(x==v||x==s||tinymce.isGecko&&x==J){r.cancel(V)}}function C(){var U=y.selection.getRng(true);var V=U.startContainer;if(V.nodeType==3){var W=V.nodeValue;if(tinymce.isIE9&&W.length>1&&W.charCodeAt(W.length-1)==32){return(U.endOffset==W.length-1)}else{return(U.endOffset==W.length)}}else{if(V.nodeType==1){return U.endOffset==V.childNodes.length}}return false}function I(){var W=y.selection.getNode();var V="h1,h2,h3,h4,h5,h6,p,div";var U=y.dom.is(W,V)&&W.parentNode.tagName==="LI"&&W.parentNode.lastChild===W;return y.selection.isCollapsed()&&U&&C()}function K(W,Y){if(A(Y)&&I()){var X=W.selection.getNode();var V=W.dom.create("li");var U=W.dom.getParent(X,"li");W.dom.insertAfter(V,U);if(tinymce.isIE6||tinymce.isIE7||tinyMCE.isIE8){W.selection.setCursorLocation(V,1)}else{W.selection.setCursorLocation(V,0)}Y.preventDefault()}}function u(X,Z){var ac;if(!tinymce.isGecko){return}var V=X.selection.getStart();if(Z.keyCode!=tinymce.VK.BACKSPACE||V.tagName!=="IMG"){return}function W(ag){var ah=ag.firstChild;var af=null;do{if(!ah){break}if(ah.tagName==="LI"){af=ah}}while(ah=ah.nextSibling);return af}function ae(ag,af){while(ag.childNodes.length>0){af.appendChild(ag.childNodes[0])}}ac=V.parentNode.previousSibling;if(!ac){return}var aa;if(ac.tagName==="UL"||ac.tagName==="OL"){aa=ac}else{if(ac.previousSibling&&(ac.previousSibling.tagName==="UL"||ac.previousSibling.tagName==="OL")){aa=ac.previousSibling}else{return}}var ad=W(aa);var U=X.dom.createRng();U.setStart(ad,1);U.setEnd(ad,1);X.selection.setRng(U);X.selection.collapse(true);var Y=X.selection.getBookmark();var ab=V.parentNode.cloneNode(true);if(ab.tagName==="P"||ab.tagName==="DIV"){ae(ab,ad)}else{ad.appendChild(ab)}V.parentNode.parentNode.removeChild(V.parentNode);X.selection.moveToBookmark(Y)}function G(U){var V=y.dom.getParent(U,"ol,ul");if(V!=null){var W=V.lastChild;y.selection.setCursorLocation(W,0)}}this.ed=y;y.addCommand("Indent",this.indent,this);y.addCommand("Outdent",this.outdent,this);y.addCommand("InsertUnorderedList",function(){this.applyList("UL","OL")},this);y.addCommand("InsertOrderedList",function(){this.applyList("OL","UL")},this);y.onInit.add(function(){y.editorCommands.addCommands({outdent:function(){var V=y.selection,W=y.dom;function U(X){X=W.getParent(X,W.isBlock);return X&&(parseInt(y.dom.getStyle(X,"margin-left")||0,10)+parseInt(y.dom.getStyle(X,"padding-left")||0,10))>0}return U(V.getStart())||U(V.getEnd())||y.queryCommandState("InsertOrderedList")||y.queryCommandState("InsertUnorderedList")}},"state")});y.onKeyUp.add(function(V,W){if(x==v){V.execCommand(W.shiftKey?"Outdent":"Indent",true,null);x=N;return r.cancel(W)}else{if(x==s){var U=B();var Y=V.settings.list_outdent_on_enter===true||W.shiftKey;V.execCommand(Y?"Outdent":"Indent",true,null);if(tinymce.isIE){G(U)}return r.cancel(W)}else{if(x==J){if(tinymce.isIE6||tinymce.isIE7||tinymce.isIE8){var X=V.getDoc().createTextNode("\uFEFF");V.selection.getNode().appendChild(X)}else{if(tinymce.isIE9||tinymce.isGecko){V.execCommand("Outdent");return r.cancel(W)}}}}}});function L(V,U){var W=y.getDoc().createTextNode("\uFEFF");V.insertBefore(W,U);y.selection.setCursorLocation(W,0);y.execCommand("mceRepaint")}function R(V,X){if(T(X)){var U=B();if(U){var W=U.parentNode;var Y=W&&W.parentNode;if(Y&&Y.nodeName=="LI"&&Y.firstChild==W&&U==W.firstChild){L(Y,W)}}}}function S(V,X){if(T(X)){var U=B();if(V.dom.select("ul li",U).length===1){var W=U.firstChild;L(U,W)}}}function Q(W,aa){function X(ab){var ad=[];var ae=new tinymce.dom.TreeWalker(ab.firstChild,ab);for(var ac=ae.current();ac;ac=ae.next()){if(W.dom.is(ac,"ol,ul,li")){ad.push(ac)}}return ad}if(aa.keyCode==tinymce.VK.BACKSPACE){var U=B();if(U){var Z=W.dom.getParent(U,"ol,ul"),V=W.selection.getRng();if(Z&&Z.firstChild===U&&V.startOffset==0){var Y=X(U);Y.unshift(U);W.execCommand("Outdent",false,Y);W.undoManager.add();return r.cancel(aa)}}}}function O(V,X){var U=B();if(X.keyCode===tinymce.VK.BACKSPACE&&V.dom.is(U,"li")&&U.parentNode.firstChild!==U){if(V.dom.select("ul,ol",U).length===1){var Z=U.previousSibling;V.dom.remove(V.dom.select("br",U));V.dom.remove(U,true);var W=tinymce.grep(Z.childNodes,function(aa){return aa.nodeType===3});if(W.length===1){var Y=W[0];V.selection.setCursorLocation(Y,Y.length)}V.undoManager.add();return r.cancel(X)}}}y.onKeyDown.add(function(U,V){x=M(V)});y.onKeyDown.add(D);y.onKeyDown.add(u);y.onKeyDown.add(K);if(tinymce.isGecko){y.onKeyUp.add(R)}if(tinymce.isIE8){y.onKeyUp.add(S)}if(tinymce.isGecko||tinymce.isWebKit){y.onKeyDown.add(Q)}if(tinymce.isWebKit){y.onKeyDown.add(O)}},applyList:function(y,v){var C=this,z=C.ed,I=z.dom,s=[],H=false,u=false,w=false,B,G=z.selection.getSelectedBlocks();function E(t){if(t&&t.tagName==="BR"){I.remove(t)}}function F(M){var N=I.create(y),t;function L(O){if(O.style.marginLeft||O.style.paddingLeft){C.adjustPaddingFunction(false)(O)}}if(M.tagName==="LI"){}else{if(M.tagName==="P"||M.tagName==="DIV"||M.tagName==="BODY"){K(M,function(P,O){J(P,O,M.tagName==="BODY"?null:P.parentNode);t=P.parentNode;L(t);E(O)});if(t){if(t.tagName==="LI"&&(M.tagName==="P"||G.length>1)){I.split(t.parentNode.parentNode,t.parentNode)}m(t.parentNode,true)}return}else{t=I.create("li");I.insertAfter(t,M);t.appendChild(M);L(M);M=t}}I.insertAfter(N,M);N.appendChild(M);m(N,true);s.push(M)}function J(P,L,N){var t,O=P,M;while(!I.isBlock(P.parentNode)&&P.parentNode!==I.getRoot()){P=I.split(P.parentNode,P.previousSibling);P=P.nextSibling;O=P}if(N){t=N.cloneNode(true);P.parentNode.insertBefore(t,P);while(t.firstChild){I.remove(t.firstChild)}t=I.rename(t,"li")}else{t=I.create("li");P.parentNode.insertBefore(t,P)}while(O&&O!=L){M=O.nextSibling;t.appendChild(O);O=M}if(t.childNodes.length===0){t.innerHTML='<br _mce_bogus="1" />'}F(t)}function K(Q,T){var N,R,O=3,L=1,t="br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl";function P(X,U){var V=I.createRng(),W;g.keep=true;z.selection.moveToBookmark(g);g.keep=false;W=z.selection.getRng(true);if(!U){U=X.parentNode.lastChild}V.setStartBefore(X);V.setEndAfter(U);return !(V.compareBoundaryPoints(O,W)>0||V.compareBoundaryPoints(L,W)<=0)}function S(U){if(U.nextSibling){return U.nextSibling}if(!I.isBlock(U.parentNode)&&U.parentNode!==I.getRoot()){return S(U.parentNode)}}N=Q.firstChild;var M=false;e(I.select(t,Q),function(U){if(U.hasAttribute&&U.hasAttribute("_mce_bogus")){return true}if(P(N,U)){I.addClass(U,"_mce_tagged_br");N=S(U)}});M=(N&&P(N,undefined));N=Q.firstChild;e(I.select(t,Q),function(V){var U=S(V);if(V.hasAttribute&&V.hasAttribute("_mce_bogus")){return true}if(I.hasClass(V,"_mce_tagged_br")){T(N,V,R);R=null}else{R=V}N=U});if(M){T(N,undefined,R)}}function D(t){K(t,function(M,L,N){J(M,L);E(L);E(N)})}function A(t){if(tinymce.inArray(s,t)!==-1){return}if(t.parentNode.tagName===v){I.split(t.parentNode,t);F(t);o(t.parentNode,false)}s.push(t)}function x(M){var O,N,L,t;if(tinymce.inArray(s,M)!==-1){return}M=c(M,I);while(I.is(M.parentNode,"ol,ul,li")){I.split(M.parentNode,M)}s.push(M);M=I.rename(M,"p");L=m(M,false,z.settings.force_br_newlines);if(L===M){O=M.firstChild;while(O){if(I.isBlock(O)){O=I.split(O.parentNode,O);t=true;N=O.nextSibling&&O.nextSibling.firstChild}else{N=O.nextSibling;if(t&&O.tagName==="BR"){I.remove(O)}t=false}O=N}}}e(G,function(t){t=k(t,I);if(t.tagName===v||(t.tagName==="LI"&&t.parentNode.tagName===v)){u=true}else{if(t.tagName===y||(t.tagName==="LI"&&t.parentNode.tagName===y)){H=true}else{w=true}}});if(w&&!H||u||G.length===0){B={LI:A,H1:F,H2:F,H3:F,H4:F,H5:F,H6:F,P:F,BODY:F,DIV:G.length>1?F:D,defaultAction:D,elements:this.selectedBlocks()}}else{B={defaultAction:x,elements:this.selectedBlocks(),processEvenIfEmpty:true}}this.process(B)},indent:function(){var u=this.ed,w=u.dom,x=[];function s(z){var y=w.create("li",{style:"list-style-type: none;"});w.insertAfter(y,z);return y}function t(B){var y=s(B),D=w.getParent(B,"ol,ul"),C=D.tagName,E=w.getStyle(D,"list-style-type"),A={},z;if(E!==""){A.style="list-style-type: "+E+";"}z=w.create(C,A);y.appendChild(z);return z}function v(z){if(!d(u,z,x)){z=c(z,w);var y=t(z);y.appendChild(z);m(y.parentNode,false);m(y,false);x.push(z)}}this.process({LI:v,defaultAction:this.adjustPaddingFunction(true),elements:this.selectedBlocks()})},outdent:function(y,x){var w=this,u=w.ed,z=u.dom,s=[];function A(t){var C,B,D;if(!d(u,t,s)){if(z.getStyle(t,"margin-left")!==""||z.getStyle(t,"padding-left")!==""){return w.adjustPaddingFunction(false)(t)}D=z.getStyle(t,"text-align",true);if(D==="center"||D==="right"){z.setStyle(t,"text-align","left");return}t=c(t,z);C=t.parentNode;B=t.parentNode.parentNode;if(B.tagName==="P"){z.split(B,t.parentNode)}else{z.split(C,t);if(B.tagName==="LI"){z.split(B,t)}else{if(!z.is(B,"ol,ul")){z.rename(t,"p")}}}s.push(t)}}var v=x&&tinymce.is(x,"array")?x:this.selectedBlocks();this.process({LI:A,defaultAction:this.adjustPaddingFunction(false),elements:v});e(s,m)},process:function(y){var F=this,w=F.ed.selection,z=F.ed.dom,E,u;function B(t){var s=tinymce.grep(t.childNodes,function(H){return !(H.nodeName==="BR"||H.nodeName==="SPAN"&&z.getAttrib(H,"data-mce-type")=="bookmark"||H.nodeType==3&&(H.nodeValue==String.fromCharCode(160)||H.nodeValue==""))});return s.length===0}function x(s){z.removeClass(s,"_mce_act_on");if(!s||s.nodeType!==1||!y.processEvenIfEmpty&&E.length>1&&B(s)){return}s=k(s,z);var t=y[s.tagName];if(!t){t=y.defaultAction}t(s)}function v(s){F.splitSafeEach(s.childNodes,x,true)}function C(s,t){return t>=0&&s.hasChildNodes()&&t<s.childNodes.length&&s.childNodes[t].tagName==="BR"}function D(){var t=w.getNode();var s=z.getParent(t,"td");return s!==null}E=y.elements;u=w.getRng(true);if(!u.collapsed){if(C(u.endContainer,u.endOffset-1)){u.setEnd(u.endContainer,u.endOffset-1);w.setRng(u)}if(C(u.startContainer,u.startOffset)){u.setStart(u.startContainer,u.startOffset+1);w.setRng(u)}}if(tinymce.isIE8){var G=F.ed.selection.getNode();if(G.tagName==="LI"&&!(G.parentNode.lastChild===G)){var A=F.ed.getDoc().createTextNode("\uFEFF");G.appendChild(A)}}g=w.getBookmark();y.OL=y.UL=v;F.splitSafeEach(E,x);w.moveToBookmark(g);g=null;if(!D()){F.ed.execCommand("mceRepaint")}},splitSafeEach:function(u,t,s){if(s||(tinymce.isGecko&&(/Firefox\/[12]\.[0-9]/.test(navigator.userAgent)||/Firefox\/3\.[0-4]/.test(navigator.userAgent)))){this.classBasedEach(u,t)}else{e(u,t)}},classBasedEach:function(v,u){var w=this.ed.dom,s,t;e(v,function(x){w.addClass(x,"_mce_act_on")});s=w.select("._mce_act_on");while(s.length>0){t=s.shift();w.removeClass(t,"_mce_act_on");u(t);s=w.select("._mce_act_on")}},adjustPaddingFunction:function(u){var s,v,t=this.ed;s=t.settings.indentation;v=/[a-z%]+/i.exec(s);s=parseInt(s,10);return function(w){var y,x;y=parseInt(t.dom.getStyle(w,"margin-left")||0,10)+parseInt(t.dom.getStyle(w,"padding-left")||0,10);if(u){x=y+s}else{x=y-s}t.dom.setStyle(w,"padding-left","");t.dom.setStyle(w,"margin-left",x>0?x+v:"")}},selectedBlocks:function(){var s=this.ed,t=s.selection.getSelectedBlocks();return t.length==0?[s.dom.getRoot()]:t},getInfo:function(){return{longname:"Lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/lists",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("lists",tinymce.plugins.Lists)}());
@@ -440,9 +440,9 @@
440
440
  }
441
441
 
442
442
  function fixDeletingFirstCharOfList(ed, e) {
443
- function listElements(list, li) {
443
+ function listElements(li) {
444
444
  var elements = [];
445
- var walker = new tinymce.dom.TreeWalker(li, list);
445
+ var walker = new tinymce.dom.TreeWalker(li.firstChild, li);
446
446
  for (var node = walker.current(); node; node = walker.next()) {
447
447
  if (ed.dom.is(node, 'ol,ul,li')) {
448
448
  elements.push(node);
@@ -454,9 +454,11 @@
454
454
  if (e.keyCode == tinymce.VK.BACKSPACE) {
455
455
  var li = getLi();
456
456
  if (li) {
457
- var list = ed.dom.getParent(li, 'ol,ul');
458
- if (list && list.firstChild === li) {
459
- var elements = listElements(list, li);
457
+ var list = ed.dom.getParent(li, 'ol,ul'),
458
+ rng = ed.selection.getRng();
459
+ if (list && list.firstChild === li && rng.startOffset == 0) {
460
+ var elements = listElements(li);
461
+ elements.unshift(li);
460
462
  ed.execCommand("Outdent", false, elements);
461
463
  ed.undoManager.add();
462
464
  return Event.cancel(e);
@@ -474,7 +476,7 @@
474
476
  ed.dom.remove(li, true);
475
477
  var textNodes = tinymce.grep(prevLi.childNodes, function(n){ return n.nodeType === 3 });
476
478
  if (textNodes.length === 1) {
477
- var textNode = textNodes[0]
479
+ var textNode = textNodes[0];
478
480
  ed.selection.setCursorLocation(textNode, textNode.length);
479
481
  }
480
482
  ed.undoManager.add();
@@ -722,7 +724,8 @@
722
724
  } else {
723
725
  actions = {
724
726
  defaultAction: convertListItemToParagraph,
725
- elements: this.selectedBlocks()
727
+ elements: this.selectedBlocks(),
728
+ processEvenIfEmpty: true
726
729
  };
727
730
  }
728
731
  this.process(actions);
@@ -826,7 +829,7 @@
826
829
 
827
830
  function processElement(element) {
828
831
  dom.removeClass(element, '_mce_act_on');
829
- if (!element || element.nodeType !== 1 || selectedBlocks.length > 1 && isEmptyElement(element)) {
832
+ if (!element || element.nodeType !== 1 || ! actions.processEvenIfEmpty && selectedBlocks.length > 1 && isEmptyElement(element)) {
830
833
  return;
831
834
  }
832
835
  element = findItemToOperateOn(element, dom);
@@ -838,7 +841,7 @@
838
841
  }
839
842
 
840
843
  function recurse(element) {
841
- t.splitSafeEach(element.childNodes, processElement);
844
+ t.splitSafeEach(element.childNodes, processElement, true);
842
845
  }
843
846
 
844
847
  function brAtEdgeOfSelection(container, offset) {
@@ -889,9 +892,11 @@
889
892
  }
890
893
  },
891
894
 
892
- splitSafeEach: function(elements, f) {
893
- if (tinymce.isGecko && (/Firefox\/[12]\.[0-9]/.test(navigator.userAgent) ||
894
- /Firefox\/3\.[0-4]/.test(navigator.userAgent))) {
895
+ splitSafeEach: function(elements, f, forceClassBase) {
896
+ if (forceClassBase ||
897
+ (tinymce.isGecko &&
898
+ (/Firefox\/[12]\.[0-9]/.test(navigator.userAgent) ||
899
+ /Firefox\/3\.[0-4]/.test(navigator.userAgent)))) {
895
900
  this.classBasedEach(elements, f);
896
901
  } else {
897
902
  each(elements, f);
@@ -932,8 +937,7 @@
932
937
  },
933
938
 
934
939
  selectedBlocks: function() {
935
- var ed = this.ed
936
- var selectedBlocks = ed.selection.getSelectedBlocks();
940
+ var ed = this.ed, selectedBlocks = ed.selection.getSelectedBlocks();
937
941
  return selectedBlocks.length == 0 ? [ ed.dom.getRoot() ] : selectedBlocks;
938
942
  },
939
943
 
@@ -1,17 +1,17 @@
1
- #id, #name, #hspace, #vspace, #class_name, #align { width: 100px }
2
- #hspace, #vspace { width: 50px }
3
- #flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode { width: 100px }
4
- #flash_base, #flash_flashvars, #html5_altsource1, #html5_altsource2, #html5_poster { width: 240px }
5
- #width, #height { width: 40px }
6
- #src, #media_type { width: 250px }
7
- #class { width: 120px }
8
- #prev { margin: 0; border: 1px solid black; width: 380px; height: 260px; overflow: auto }
9
- .panel_wrapper div.current { height: 420px; overflow: auto }
10
- #flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options { display: none }
11
- .mceAddSelectValue { background-color: #DDDDDD }
12
- #qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume { width: 70px }
13
- #wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume { width: 70px }
14
- #rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks { width: 70px }
15
- #shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle { width: 90px }
16
- #qt_qtsrc { width: 200px }
17
- iframe {border: 1px solid gray}
1
+ #id, #name, #hspace, #vspace, #class_name, #align { width: 100px }
2
+ #hspace, #vspace { width: 50px }
3
+ #flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode { width: 100px }
4
+ #flash_base, #flash_flashvars, #html5_altsource1, #html5_altsource2, #html5_poster { width: 240px }
5
+ #width, #height { width: 40px }
6
+ #src, #media_type { width: 250px }
7
+ #class { width: 120px }
8
+ #prev { margin: 0; border: 1px solid black; width: 380px; height: 260px; overflow: auto }
9
+ .panel_wrapper div.current { height: 420px; overflow: auto }
10
+ #flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options { display: none }
11
+ .mceAddSelectValue { background-color: #DDDDDD }
12
+ #qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume { width: 70px }
13
+ #wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume { width: 70px }
14
+ #rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks { width: 70px }
15
+ #shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle { width: 90px }
16
+ #qt_qtsrc { width: 200px }
17
+ iframe {border: 1px solid gray}
@@ -1 +1 @@
1
- (function(){var d=tinymce.explode("id,name,width,height,style,align,class,hspace,vspace,bgcolor,type"),h=tinymce.makeMap(d.join(",")),b=tinymce.html.Node,f,a,g=tinymce.util.JSON,e;f=[["Flash","d27cdb6e-ae6d-11cf-96b8-444553540000","application/x-shockwave-flash","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["ShockWave","166b1bca-3f9c-11cf-8075-444553540000","application/x-director","http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"],["WindowsMedia","6bf52a52-394a-11d3-b153-00c04f79faa6,22d6f312-b0f6-11d0-94ab-0080c74c7e95,05589fa1-c356-11ce-bf01-00aa0055595a","application/x-mplayer2","http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"],["QuickTime","02bf25d5-8c17-4b23-bc80-d3488abddc6b","video/quicktime","http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"],["RealMedia","cfcdaa03-8be4-11cf-b84b-0020afbbccfa","audio/x-pn-realaudio-plugin","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["Java","8ad9c840-044e-11d1-b3e9-00805f499d93","application/x-java-applet","http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],["Silverlight","dfeaf541-f3e1-4c24-acac-99c30715084a","application/x-silverlight-2"],["Iframe"],["Video"],["EmbeddedAudio"],["Audio"]];function c(m){var l,j,k;if(m&&!m.splice){j=[];for(k=0;true;k++){if(m[k]){j[k]=m[k]}else{break}}return j}return m}tinymce.create("tinymce.plugins.MediaPlugin",{init:function(n,j){var r=this,l={},m,p,q,k;function o(i){return i&&i.nodeName==="IMG"&&n.dom.hasClass(i,"mceItemMedia")}r.editor=n;r.url=j;a="";for(m=0;m<f.length;m++){k=f[m][0];q={name:k,clsids:tinymce.explode(f[m][1]||""),mimes:tinymce.explode(f[m][2]||""),codebase:f[m][3]};for(p=0;p<q.clsids.length;p++){l["clsid:"+q.clsids[p]]=q}for(p=0;p<q.mimes.length;p++){l[q.mimes[p]]=q}l["mceItem"+k]=q;l[k.toLowerCase()]=q;a+=(a?"|":"")+k}tinymce.each(n.getParam("media_types","video=mp4,m4v,ogv,webm;silverlight=xap;flash=swf,flv;shockwave=dcr;quicktime=mov,qt,mpg,mpeg;shockwave=dcr;windowsmedia=avi,wmv,wm,asf,asx,wmx,wvx;realmedia=rm,ra,ram;java=jar;audio=mp3,ogg").split(";"),function(v){var s,u,t;v=v.split(/=/);u=tinymce.explode(v[1].toLowerCase());for(s=0;s<u.length;s++){t=l[v[0].toLowerCase()];if(t){l[u[s]]=t}}});a=new RegExp("write("+a+")\\(([^)]+)\\)");r.lookup=l;n.onPreInit.add(function(){n.schema.addValidElements("object[id|style|width|height|classid|codebase|*],param[name|value],embed[id|style|width|height|type|src|*],video[*],audio[*],source[*]");n.parser.addNodeFilter("object,embed,video,audio,script,iframe",function(s){var t=s.length;while(t--){r.objectToImg(s[t])}});n.serializer.addNodeFilter("img",function(s,u,t){var v=s.length,w;while(v--){w=s[v];if((w.attr("class")||"").indexOf("mceItemMedia")!==-1){r.imgToObject(w,t)}}})});n.onInit.add(function(){if(n.theme&&n.theme.onResolveName){n.theme.onResolveName.add(function(i,s){if(s.name==="img"&&n.dom.hasClass(s.node,"mceItemMedia")){s.name="media"}})}if(n&&n.plugins.contextmenu){n.plugins.contextmenu.onContextMenu.add(function(s,t,i){if(i.nodeName==="IMG"&&i.className.indexOf("mceItemMedia")!==-1){t.add({title:"media.edit",icon:"media",cmd:"mceMedia"})}})}});n.addCommand("mceMedia",function(){var s,i;i=n.selection.getNode();if(o(i)){s=n.dom.getAttrib(i,"data-mce-json");if(s){s=g.parse(s);tinymce.each(d,function(t){var u=n.dom.getAttrib(i,t);if(u){s[t]=u}});s.type=r.getType(i.className).name.toLowerCase()}}if(!s){s={type:"flash",video:{sources:[]},params:{}}}n.windowManager.open({file:j+"/media.htm",width:430+parseInt(n.getLang("media.delta_width",0)),height:500+parseInt(n.getLang("media.delta_height",0)),inline:1},{plugin_url:j,data:s})});n.addButton("media",{title:"media.desc",cmd:"mceMedia"});n.onNodeChange.add(function(s,i,t){i.setActive("media",o(t))})},convertUrl:function(k,n){var j=this,m=j.editor,l=m.settings,o=l.url_converter,i=l.url_converter_scope||j;if(!k){return k}if(n){return m.documentBaseURI.toAbsolute(k)}return o.call(i,k,"src","object")},getInfo:function(){return{longname:"Media",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media",version:tinymce.majorVersion+"."+tinymce.minorVersion}},dataToImg:function(m,k){var r=this,o=r.editor,p=o.documentBaseURI,j,q,n,l;m.params.src=r.convertUrl(m.params.src,k);q=m.video.attrs;if(q){q.src=r.convertUrl(q.src,k)}if(q){q.poster=r.convertUrl(q.poster,k)}j=c(m.video.sources);if(j){for(l=0;l<j.length;l++){j[l].src=r.convertUrl(j[l].src,k)}}n=r.editor.dom.create("img",{id:m.id,style:m.style,align:m.align,hspace:m.hspace,vspace:m.vspace,src:r.editor.theme.url+"/img/trans.gif","class":"mceItemMedia mceItem"+r.getType(m.type).name,"data-mce-json":g.serialize(m,"'")});n.width=m.width||(m.type=="audio"?"300":"320");n.height=m.height||(m.type=="audio"?"32":"240");return n},dataToHtml:function(i,j){return this.editor.serializer.serialize(this.dataToImg(i,j),{forced_root_block:"",force_absolute:j})},htmlToData:function(k){var j,i,l;l={type:"flash",video:{sources:[]},params:{}};j=this.editor.parser.parse(k);i=j.getAll("img")[0];if(i){l=g.parse(i.attr("data-mce-json"));l.type=this.getType(i.attr("class")).name.toLowerCase();tinymce.each(d,function(m){var n=i.attr(m);if(n){l[m]=n}})}return l},getType:function(m){var k,j,l;j=tinymce.explode(m," ");for(k=0;k<j.length;k++){l=this.lookup[j[k]];if(l){return l}}},imgToObject:function(z,o){var u=this,p=u.editor,C,H,j,t,I,y,G,w,k,E,s,q,A,D,m,x,l,B,F;function r(i,n){var M,L,N,K,J;J=p.getParam("flash_video_player_url",u.convertUrl(u.url+"/moxieplayer.swf"));if(J){M=p.documentBaseURI;G.params.src=J;if(p.getParam("flash_video_player_absvideourl",true)){i=M.toAbsolute(i||"",true);n=M.toAbsolute(n||"",true)}N="";L=p.getParam("flash_video_player_flashvars",{url:"$url",poster:"$poster"});tinymce.each(L,function(P,O){P=P.replace(/\$url/,i||"");P=P.replace(/\$poster/,n||"");if(P.length>0){N+=(N?"&":"")+O+"="+escape(P)}});if(N.length){G.params.flashvars=N}K=p.getParam("flash_video_player_params",{allowfullscreen:true,allowscriptaccess:true});tinymce.each(K,function(P,O){G.params[O]=""+P})}}G=z.attr("data-mce-json");if(!G){return}G=g.parse(G);q=this.getType(z.attr("class"));B=z.attr("data-mce-style");if(!B){B=z.attr("style");if(B){B=p.dom.serializeStyle(p.dom.parseStyle(B,"img"))}}if(q.name==="Iframe"){x=new b("iframe",1);tinymce.each(d,function(i){var n=z.attr(i);if(i=="class"&&n){n=n.replace(/mceItem.+ ?/g,"")}if(n&&n.length>0){x.attr(i,n)}});for(I in G.params){x.attr(I,G.params[I])}x.attr({style:B,src:G.params.src});z.replace(x);return}if(this.editor.settings.media_use_script){x=new b("script",1).attr("type","text/javascript");y=new b("#text",3);y.value="write"+q.name+"("+g.serialize(tinymce.extend(G.params,{width:z.attr("width"),height:z.attr("height")}))+");";x.append(y);z.replace(x);return}if(q.name==="Video"&&G.video.sources[0]){C=new b("video",1).attr(tinymce.extend({id:z.attr("id"),width:z.attr("width"),height:z.attr("height"),style:B},G.video.attrs));if(G.video.attrs){l=G.video.attrs.poster}k=G.video.sources=c(G.video.sources);for(A=0;A<k.length;A++){if(/\.mp4$/.test(k[A].src)){m=k[A].src}}if(!k[0].type){C.attr("src",k[0].src);k.splice(0,1)}for(A=0;A<k.length;A++){w=new b("source",1).attr(k[A]);w.shortEnded=true;C.append(w)}if(m){r(m,l);q=u.getType("flash")}else{G.params.src=""}}if(q.name==="Audio"&&G.video.sources[0]){F=new b("audio",1).attr(tinymce.extend({id:z.attr("id"),width:z.attr("width"),height:z.attr("height"),style:B},G.video.attrs));if(G.video.attrs){l=G.video.attrs.poster}k=G.video.sources=c(G.video.sources);if(!k[0].type){F.attr("src",k[0].src);k.splice(0,1)}for(A=0;A<k.length;A++){w=new b("source",1).attr(k[A]);w.shortEnded=true;F.append(w)}G.params.src=""}if(q.name==="EmbeddedAudio"){j=new b("embed",1);j.shortEnded=true;j.attr({id:z.attr("id"),width:z.attr("width"),height:z.attr("height"),style:B,type:z.attr("type")});for(I in G.params){j.attr(I,G.params[I])}tinymce.each(d,function(i){if(G[i]&&i!="type"){j.attr(i,G[i])}});G.params.src=""}if(G.params.src){if(/\.flv$/i.test(G.params.src)){r(G.params.src,"")}if(o&&o.force_absolute){G.params.src=p.documentBaseURI.toAbsolute(G.params.src)}H=new b("object",1).attr({id:z.attr("id"),width:z.attr("width"),height:z.attr("height"),style:B});tinymce.each(d,function(i){var n=G[i];if(i=="class"&&n){n=n.replace(/mceItem.+ ?/g,"")}if(n&&i!="type"){H.attr(i,n)}});for(I in G.params){s=new b("param",1);s.shortEnded=true;y=G.params[I];if(I==="src"&&q.name==="WindowsMedia"){I="url"}s.attr({name:I,value:y});H.append(s)}if(this.editor.getParam("media_strict",true)){H.attr({data:G.params.src,type:q.mimes[0]})}else{H.attr({classid:"clsid:"+q.clsids[0],codebase:q.codebase});j=new b("embed",1);j.shortEnded=true;j.attr({id:z.attr("id"),width:z.attr("width"),height:z.attr("height"),style:B,type:q.mimes[0]});for(I in G.params){j.attr(I,G.params[I])}tinymce.each(d,function(i){if(G[i]&&i!="type"){j.attr(i,G[i])}});H.append(j)}if(G.object_html){y=new b("#text",3);y.raw=true;y.value=G.object_html;H.append(y)}if(C){C.append(H)}}if(C){if(G.video_html){y=new b("#text",3);y.raw=true;y.value=G.video_html;C.append(y)}}if(F){if(G.video_html){y=new b("#text",3);y.raw=true;y.value=G.video_html;F.append(y)}}var v=C||F||H||j;if(v){z.replace(v)}else{z.remove()}},objectToImg:function(C){var L,k,F,s,M,N,y,A,x,G,E,t,q,I,B,l,K,o,H=this.lookup,m,z,v=this.editor.settings.url_converter,n=this.editor.settings.url_converter_scope,w,r,D,j;function u(i){return new tinymce.html.Serializer({inner:true,validate:false}).serialize(i)}function J(O,i){return H[(O.attr(i)||"").toLowerCase()]}function p(O){var i=O.replace(/^.*\.([^.]+)$/,"$1");return H[i.toLowerCase()||""]}if(!C.parent){return}if(C.name==="script"){if(C.firstChild){m=a.exec(C.firstChild.value)}if(!m){return}o=m[1];K={video:{},params:g.parse(m[2])};A=K.params.width;x=K.params.height}K=K||{video:{},params:{}};M=new b("img",1);M.attr({src:this.editor.theme.url+"/img/trans.gif"});N=C.name;if(N==="video"||N=="audio"){F=C;L=C.getAll("object")[0];k=C.getAll("embed")[0];A=F.attr("width");x=F.attr("height");y=F.attr("id");K.video={attrs:{},sources:[]};z=K.video.attrs;for(N in F.attributes.map){z[N]=F.attributes.map[N]}B=C.attr("src");if(B){K.video.sources.push({src:v.call(n,B,"src",C.name)})}l=F.getAll("source");for(E=0;E<l.length;E++){B=l[E].remove();K.video.sources.push({src:v.call(n,B.attr("src"),"src","source"),type:B.attr("type"),media:B.attr("media")})}if(z.poster){z.poster=v.call(n,z.poster,"poster",C.name)}}if(C.name==="object"){L=C;k=C.getAll("embed")[0]}if(C.name==="embed"){k=C}if(C.name==="iframe"){s=C;o="Iframe"}if(L){A=A||L.attr("width");x=x||L.attr("height");G=G||L.attr("style");y=y||L.attr("id");w=w||L.attr("hspace");r=r||L.attr("vspace");D=D||L.attr("align");j=j||L.attr("bgcolor");K.name=L.attr("name");I=L.getAll("param");for(E=0;E<I.length;E++){q=I[E];N=q.remove().attr("name");if(!h[N]){K.params[N]=q.attr("value")}}K.params.src=K.params.src||L.attr("data")}if(k){A=A||k.attr("width");x=x||k.attr("height");G=G||k.attr("style");y=y||k.attr("id");w=w||k.attr("hspace");r=r||k.attr("vspace");D=D||k.attr("align");j=j||k.attr("bgcolor");for(N in k.attributes.map){if(!h[N]&&!K.params[N]){K.params[N]=k.attributes.map[N]}}}if(s){A=s.attr("width");x=s.attr("height");G=G||s.attr("style");y=s.attr("id");w=s.attr("hspace");r=s.attr("vspace");D=s.attr("align");j=s.attr("bgcolor");tinymce.each(d,function(i){M.attr(i,s.attr(i))});for(N in s.attributes.map){if(!h[N]&&!K.params[N]){K.params[N]=s.attributes.map[N]}}}if(K.params.movie){K.params.src=K.params.src||K.params.movie;delete K.params.movie}if(K.params.src){K.params.src=v.call(n,K.params.src,"src","object")}if(F){if(C.name==="video"){o=H.video.name}else{if(C.name==="audio"){o=H.audio.name}}}if(L&&!o){o=(J(L,"clsid")||J(L,"classid")||J(L,"type")||{}).name}if(k&&!o){o=(J(k,"type")||p(K.params.src)||{}).name}if(k&&o=="EmbeddedAudio"){K.params.type=k.attr("type")}C.replace(M);if(k){k.remove()}if(L){t=u(L.remove());if(t){K.object_html=t}}if(F){t=u(F.remove());if(t){K.video_html=t}}K.hspace=w;K.vspace=r;K.align=D;K.bgcolor=j;M.attr({id:y,"class":"mceItemMedia mceItem"+(o||"Flash"),style:G,width:A||(C.name=="audio"?"300":"320"),height:x||(C.name=="audio"?"32":"240"),hspace:w,vspace:r,align:D,bgcolor:j,"data-mce-json":g.serialize(K,"'")})}});tinymce.PluginManager.add("media",tinymce.plugins.MediaPlugin)})();
1
+ (function(){var b=tinymce.explode("id,name,width,height,style,align,class,hspace,vspace,bgcolor,type"),a=tinymce.makeMap(b.join(",")),f=tinymce.html.Node,d,i,h=tinymce.util.JSON,g;d=[["Flash","d27cdb6e-ae6d-11cf-96b8-444553540000","application/x-shockwave-flash","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["ShockWave","166b1bca-3f9c-11cf-8075-444553540000","application/x-director","http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"],["WindowsMedia","6bf52a52-394a-11d3-b153-00c04f79faa6,22d6f312-b0f6-11d0-94ab-0080c74c7e95,05589fa1-c356-11ce-bf01-00aa0055595a","application/x-mplayer2","http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"],["QuickTime","02bf25d5-8c17-4b23-bc80-d3488abddc6b","video/quicktime","http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"],["RealMedia","cfcdaa03-8be4-11cf-b84b-0020afbbccfa","audio/x-pn-realaudio-plugin","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["Java","8ad9c840-044e-11d1-b3e9-00805f499d93","application/x-java-applet","http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],["Silverlight","dfeaf541-f3e1-4c24-acac-99c30715084a","application/x-silverlight-2"],["Iframe"],["Video"],["EmbeddedAudio"],["Audio"]];function e(j){return typeof(j)=="string"?j.replace(/[^0-9%]/g,""):j}function c(m){var l,j,k;if(m&&!m.splice){j=[];for(k=0;true;k++){if(m[k]){j[k]=m[k]}else{break}}return j}return m}tinymce.create("tinymce.plugins.MediaPlugin",{init:function(n,j){var r=this,l={},m,p,q,k;function o(s){return s&&s.nodeName==="IMG"&&n.dom.hasClass(s,"mceItemMedia")}r.editor=n;r.url=j;i="";for(m=0;m<d.length;m++){k=d[m][0];q={name:k,clsids:tinymce.explode(d[m][1]||""),mimes:tinymce.explode(d[m][2]||""),codebase:d[m][3]};for(p=0;p<q.clsids.length;p++){l["clsid:"+q.clsids[p]]=q}for(p=0;p<q.mimes.length;p++){l[q.mimes[p]]=q}l["mceItem"+k]=q;l[k.toLowerCase()]=q;i+=(i?"|":"")+k}tinymce.each(n.getParam("media_types","video=mp4,m4v,ogv,webm;silverlight=xap;flash=swf,flv;shockwave=dcr;quicktime=mov,qt,mpg,mpeg;shockwave=dcr;windowsmedia=avi,wmv,wm,asf,asx,wmx,wvx;realmedia=rm,ra,ram;java=jar;audio=mp3,ogg").split(";"),function(v){var s,u,t;v=v.split(/=/);u=tinymce.explode(v[1].toLowerCase());for(s=0;s<u.length;s++){t=l[v[0].toLowerCase()];if(t){l[u[s]]=t}}});i=new RegExp("write("+i+")\\(([^)]+)\\)");r.lookup=l;n.onPreInit.add(function(){n.schema.addValidElements("object[id|style|width|height|classid|codebase|*],param[name|value],embed[id|style|width|height|type|src|*],video[*],audio[*],source[*]");n.parser.addNodeFilter("object,embed,video,audio,script,iframe",function(s){var t=s.length;while(t--){r.objectToImg(s[t])}});n.serializer.addNodeFilter("img",function(s,u,t){var v=s.length,w;while(v--){w=s[v];if((w.attr("class")||"").indexOf("mceItemMedia")!==-1){r.imgToObject(w,t)}}})});n.onInit.add(function(){if(n.theme&&n.theme.onResolveName){n.theme.onResolveName.add(function(s,t){if(t.name==="img"&&n.dom.hasClass(t.node,"mceItemMedia")){t.name="media"}})}if(n&&n.plugins.contextmenu){n.plugins.contextmenu.onContextMenu.add(function(t,u,s){if(s.nodeName==="IMG"&&s.className.indexOf("mceItemMedia")!==-1){u.add({title:"media.edit",icon:"media",cmd:"mceMedia"})}})}});n.addCommand("mceMedia",function(){var t,s;s=n.selection.getNode();if(o(s)){t=n.dom.getAttrib(s,"data-mce-json");if(t){t=h.parse(t);tinymce.each(b,function(u){var v=n.dom.getAttrib(s,u);if(v){t[u]=v}});t.type=r.getType(s.className).name.toLowerCase()}}if(!t){t={type:"flash",video:{sources:[]},params:{}}}n.windowManager.open({file:j+"/media.htm",width:430+parseInt(n.getLang("media.delta_width",0)),height:500+parseInt(n.getLang("media.delta_height",0)),inline:1},{plugin_url:j,data:t})});n.addButton("media",{title:"media.desc",cmd:"mceMedia"});n.onNodeChange.add(function(t,s,u){s.setActive("media",o(u))})},convertUrl:function(l,o){var k=this,n=k.editor,m=n.settings,p=m.url_converter,j=m.url_converter_scope||k;if(!l){return l}if(o){return n.documentBaseURI.toAbsolute(l)}return p.call(j,l,"src","object")},getInfo:function(){return{longname:"Media",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media",version:tinymce.majorVersion+"."+tinymce.minorVersion}},dataToImg:function(m,k){var r=this,o=r.editor,p=o.documentBaseURI,j,q,n,l;m.params.src=r.convertUrl(m.params.src,k);q=m.video.attrs;if(q){q.src=r.convertUrl(q.src,k)}if(q){q.poster=r.convertUrl(q.poster,k)}j=c(m.video.sources);if(j){for(l=0;l<j.length;l++){j[l].src=r.convertUrl(j[l].src,k)}}n=r.editor.dom.create("img",{id:m.id,style:m.style,align:m.align,hspace:m.hspace,vspace:m.vspace,src:r.editor.theme.url+"/img/trans.gif","class":"mceItemMedia mceItem"+r.getType(m.type).name,"data-mce-json":h.serialize(m,"'")});n.width=m.width=e(m.width||(m.type=="audio"?"300":"320"));n.height=m.height=e(m.height||(m.type=="audio"?"32":"240"));return n},dataToHtml:function(j,k){return this.editor.serializer.serialize(this.dataToImg(j,k),{forced_root_block:"",force_absolute:k})},htmlToData:function(l){var k,j,m;m={type:"flash",video:{sources:[]},params:{}};k=this.editor.parser.parse(l);j=k.getAll("img")[0];if(j){m=h.parse(j.attr("data-mce-json"));m.type=this.getType(j.attr("class")).name.toLowerCase();tinymce.each(b,function(n){var o=j.attr(n);if(o){m[n]=o}})}return m},getType:function(m){var k,j,l;j=tinymce.explode(m," ");for(k=0;k<j.length;k++){l=this.lookup[j[k]];if(l){return l}}},imgToObject:function(z,o){var u=this,p=u.editor,C,H,j,t,I,y,G,w,k,E,s,q,A,D,m,x,l,B,F;function r(n,J){var N,M,O,L,K;K=p.getParam("flash_video_player_url",u.convertUrl(u.url+"/moxieplayer.swf"));if(K){N=p.documentBaseURI;G.params.src=K;if(p.getParam("flash_video_player_absvideourl",true)){n=N.toAbsolute(n||"",true);J=N.toAbsolute(J||"",true)}O="";M=p.getParam("flash_video_player_flashvars",{url:"$url",poster:"$poster"});tinymce.each(M,function(Q,P){Q=Q.replace(/\$url/,n||"");Q=Q.replace(/\$poster/,J||"");if(Q.length>0){O+=(O?"&":"")+P+"="+escape(Q)}});if(O.length){G.params.flashvars=O}L=p.getParam("flash_video_player_params",{allowfullscreen:true,allowscriptaccess:true});tinymce.each(L,function(Q,P){G.params[P]=""+Q})}}G=z.attr("data-mce-json");if(!G){return}G=h.parse(G);q=this.getType(z.attr("class"));B=z.attr("data-mce-style");if(!B){B=z.attr("style");if(B){B=p.dom.serializeStyle(p.dom.parseStyle(B,"img"))}}G.width=z.attr("width")||G.width;G.height=z.attr("height")||G.height;if(q.name==="Iframe"){x=new f("iframe",1);tinymce.each(b,function(n){var J=z.attr(n);if(n=="class"&&J){J=J.replace(/mceItem.+ ?/g,"")}if(J&&J.length>0){x.attr(n,J)}});for(I in G.params){x.attr(I,G.params[I])}x.attr({style:B,src:G.params.src});z.replace(x);return}if(this.editor.settings.media_use_script){x=new f("script",1).attr("type","text/javascript");y=new f("#text",3);y.value="write"+q.name+"("+h.serialize(tinymce.extend(G.params,{width:z.attr("width"),height:z.attr("height")}))+");";x.append(y);z.replace(x);return}if(q.name==="Video"&&G.video.sources[0]){C=new f("video",1).attr(tinymce.extend({id:z.attr("id"),width:e(z.attr("width")),height:e(z.attr("height")),style:B},G.video.attrs));if(G.video.attrs){l=G.video.attrs.poster}k=G.video.sources=c(G.video.sources);for(A=0;A<k.length;A++){if(/\.mp4$/.test(k[A].src)){m=k[A].src}}if(!k[0].type){C.attr("src",k[0].src);k.splice(0,1)}for(A=0;A<k.length;A++){w=new f("source",1).attr(k[A]);w.shortEnded=true;C.append(w)}if(m){r(m,l);q=u.getType("flash")}else{G.params.src=""}}if(q.name==="Audio"&&G.video.sources[0]){F=new f("audio",1).attr(tinymce.extend({id:z.attr("id"),width:e(z.attr("width")),height:e(z.attr("height")),style:B},G.video.attrs));if(G.video.attrs){l=G.video.attrs.poster}k=G.video.sources=c(G.video.sources);if(!k[0].type){F.attr("src",k[0].src);k.splice(0,1)}for(A=0;A<k.length;A++){w=new f("source",1).attr(k[A]);w.shortEnded=true;F.append(w)}G.params.src=""}if(q.name==="EmbeddedAudio"){j=new f("embed",1);j.shortEnded=true;j.attr({id:z.attr("id"),width:e(z.attr("width")),height:e(z.attr("height")),style:B,type:z.attr("type")});for(I in G.params){j.attr(I,G.params[I])}tinymce.each(b,function(n){if(G[n]&&n!="type"){j.attr(n,G[n])}});G.params.src=""}if(G.params.src){if(/\.flv$/i.test(G.params.src)){r(G.params.src,"")}if(o&&o.force_absolute){G.params.src=p.documentBaseURI.toAbsolute(G.params.src)}H=new f("object",1).attr({id:z.attr("id"),width:e(z.attr("width")),height:e(z.attr("height")),style:B});tinymce.each(b,function(n){var J=G[n];if(n=="class"&&J){J=J.replace(/mceItem.+ ?/g,"")}if(J&&n!="type"){H.attr(n,J)}});for(I in G.params){s=new f("param",1);s.shortEnded=true;y=G.params[I];if(I==="src"&&q.name==="WindowsMedia"){I="url"}s.attr({name:I,value:y});H.append(s)}if(this.editor.getParam("media_strict",true)){H.attr({data:G.params.src,type:q.mimes[0]})}else{H.attr({classid:"clsid:"+q.clsids[0],codebase:q.codebase});j=new f("embed",1);j.shortEnded=true;j.attr({id:z.attr("id"),width:e(z.attr("width")),height:e(z.attr("height")),style:B,type:q.mimes[0]});for(I in G.params){j.attr(I,G.params[I])}tinymce.each(b,function(n){if(G[n]&&n!="type"){j.attr(n,G[n])}});H.append(j)}if(G.object_html){y=new f("#text",3);y.raw=true;y.value=G.object_html;H.append(y)}if(C){C.append(H)}}if(C){if(G.video_html){y=new f("#text",3);y.raw=true;y.value=G.video_html;C.append(y)}}if(F){if(G.video_html){y=new f("#text",3);y.raw=true;y.value=G.video_html;F.append(y)}}var v=C||F||H||j;if(v){z.replace(v)}else{z.remove()}},objectToImg:function(C){var L,k,F,s,M,N,y,A,x,G,E,t,q,I,B,l,K,o,H=this.lookup,m,z,v=this.editor.settings.url_converter,n=this.editor.settings.url_converter_scope,w,r,D,j;function u(O){return new tinymce.html.Serializer({inner:true,validate:false}).serialize(O)}function J(P,O){return H[(P.attr(O)||"").toLowerCase()]}function p(P){var O=P.replace(/^.*\.([^.]+)$/,"$1");return H[O.toLowerCase()||""]}if(!C.parent){return}if(C.name==="script"){if(C.firstChild){m=i.exec(C.firstChild.value)}if(!m){return}o=m[1];K={video:{},params:h.parse(m[2])};A=K.params.width;x=K.params.height}K=K||{video:{},params:{}};M=new f("img",1);M.attr({src:this.editor.theme.url+"/img/trans.gif"});N=C.name;if(N==="video"||N=="audio"){F=C;L=C.getAll("object")[0];k=C.getAll("embed")[0];A=F.attr("width");x=F.attr("height");y=F.attr("id");K.video={attrs:{},sources:[]};z=K.video.attrs;for(N in F.attributes.map){z[N]=F.attributes.map[N]}B=C.attr("src");if(B){K.video.sources.push({src:v.call(n,B,"src",C.name)})}l=F.getAll("source");for(E=0;E<l.length;E++){B=l[E].remove();K.video.sources.push({src:v.call(n,B.attr("src"),"src","source"),type:B.attr("type"),media:B.attr("media")})}if(z.poster){z.poster=v.call(n,z.poster,"poster",C.name)}}if(C.name==="object"){L=C;k=C.getAll("embed")[0]}if(C.name==="embed"){k=C}if(C.name==="iframe"){s=C;o="Iframe"}if(L){A=A||L.attr("width");x=x||L.attr("height");G=G||L.attr("style");y=y||L.attr("id");w=w||L.attr("hspace");r=r||L.attr("vspace");D=D||L.attr("align");j=j||L.attr("bgcolor");K.name=L.attr("name");I=L.getAll("param");for(E=0;E<I.length;E++){q=I[E];N=q.remove().attr("name");if(!a[N]){K.params[N]=q.attr("value")}}K.params.src=K.params.src||L.attr("data")}if(k){A=A||k.attr("width");x=x||k.attr("height");G=G||k.attr("style");y=y||k.attr("id");w=w||k.attr("hspace");r=r||k.attr("vspace");D=D||k.attr("align");j=j||k.attr("bgcolor");for(N in k.attributes.map){if(!a[N]&&!K.params[N]){K.params[N]=k.attributes.map[N]}}}if(s){A=e(s.attr("width"));x=e(s.attr("height"));G=G||s.attr("style");y=s.attr("id");w=s.attr("hspace");r=s.attr("vspace");D=s.attr("align");j=s.attr("bgcolor");tinymce.each(b,function(O){M.attr(O,s.attr(O))});for(N in s.attributes.map){if(!a[N]&&!K.params[N]){K.params[N]=s.attributes.map[N]}}}if(K.params.movie){K.params.src=K.params.src||K.params.movie;delete K.params.movie}if(K.params.src){K.params.src=v.call(n,K.params.src,"src","object")}if(F){if(C.name==="video"){o=H.video.name}else{if(C.name==="audio"){o=H.audio.name}}}if(L&&!o){o=(J(L,"clsid")||J(L,"classid")||J(L,"type")||{}).name}if(k&&!o){o=(J(k,"type")||p(K.params.src)||{}).name}if(k&&o=="EmbeddedAudio"){K.params.type=k.attr("type")}C.replace(M);if(k){k.remove()}if(L){t=u(L.remove());if(t){K.object_html=t}}if(F){t=u(F.remove());if(t){K.video_html=t}}K.hspace=w;K.vspace=r;K.align=D;K.bgcolor=j;M.attr({id:y,"class":"mceItemMedia mceItem"+(o||"Flash"),style:G,width:A||(C.name=="audio"?"300":"320"),height:x||(C.name=="audio"?"32":"240"),hspace:w,vspace:r,align:D,bgcolor:j,"data-mce-json":h.serialize(K,"'")})}});tinymce.PluginManager.add("media",tinymce.plugins.MediaPlugin)})();
@@ -1,890 +1,898 @@
1
- /**
2
- * editor_plugin_src.js
3
- *
4
- * Copyright 2009, Moxiecode Systems AB
5
- * Released under LGPL License.
6
- *
7
- * License: http://tinymce.moxiecode.com/license
8
- * Contributing: http://tinymce.moxiecode.com/contributing
9
- */
10
-
11
- (function() {
12
- var rootAttributes = tinymce.explode('id,name,width,height,style,align,class,hspace,vspace,bgcolor,type'), excludedAttrs = tinymce.makeMap(rootAttributes.join(',')), Node = tinymce.html.Node,
13
- mediaTypes, scriptRegExp, JSON = tinymce.util.JSON, mimeTypes;
14
-
15
- // Media types supported by this plugin
16
- mediaTypes = [
17
- // Type, clsid:s, mime types, codebase
18
- ["Flash", "d27cdb6e-ae6d-11cf-96b8-444553540000", "application/x-shockwave-flash", "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],
19
- ["ShockWave", "166b1bca-3f9c-11cf-8075-444553540000", "application/x-director", "http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"],
20
- ["WindowsMedia", "6bf52a52-394a-11d3-b153-00c04f79faa6,22d6f312-b0f6-11d0-94ab-0080c74c7e95,05589fa1-c356-11ce-bf01-00aa0055595a", "application/x-mplayer2", "http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"],
21
- ["QuickTime", "02bf25d5-8c17-4b23-bc80-d3488abddc6b", "video/quicktime", "http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"],
22
- ["RealMedia", "cfcdaa03-8be4-11cf-b84b-0020afbbccfa", "audio/x-pn-realaudio-plugin", "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],
23
- ["Java", "8ad9c840-044e-11d1-b3e9-00805f499d93", "application/x-java-applet", "http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],
24
- ["Silverlight", "dfeaf541-f3e1-4c24-acac-99c30715084a", "application/x-silverlight-2"],
25
- ["Iframe"],
26
- ["Video"],
27
- ["EmbeddedAudio"],
28
- ["Audio"]
29
- ];
30
-
31
- function toArray(obj) {
32
- var undef, out, i;
33
-
34
- if (obj && !obj.splice) {
35
- out = [];
36
-
37
- for (i = 0; true; i++) {
38
- if (obj[i])
39
- out[i] = obj[i];
40
- else
41
- break;
42
- }
43
-
44
- return out;
45
- }
46
-
47
- return obj;
48
- };
49
-
50
- tinymce.create('tinymce.plugins.MediaPlugin', {
51
- init : function(ed, url) {
52
- var self = this, lookup = {}, i, y, item, name;
53
-
54
- function isMediaImg(node) {
55
- return node && node.nodeName === 'IMG' && ed.dom.hasClass(node, 'mceItemMedia');
56
- };
57
-
58
- self.editor = ed;
59
- self.url = url;
60
-
61
- // Parse media types into a lookup table
62
- scriptRegExp = '';
63
- for (i = 0; i < mediaTypes.length; i++) {
64
- name = mediaTypes[i][0];
65
-
66
- item = {
67
- name : name,
68
- clsids : tinymce.explode(mediaTypes[i][1] || ''),
69
- mimes : tinymce.explode(mediaTypes[i][2] || ''),
70
- codebase : mediaTypes[i][3]
71
- };
72
-
73
- for (y = 0; y < item.clsids.length; y++)
74
- lookup['clsid:' + item.clsids[y]] = item;
75
-
76
- for (y = 0; y < item.mimes.length; y++)
77
- lookup[item.mimes[y]] = item;
78
-
79
- lookup['mceItem' + name] = item;
80
- lookup[name.toLowerCase()] = item;
81
-
82
- scriptRegExp += (scriptRegExp ? '|' : '') + name;
83
- }
84
-
85
- // Handle the media_types setting
86
- tinymce.each(ed.getParam("media_types",
87
- "video=mp4,m4v,ogv,webm;" +
88
- "silverlight=xap;" +
89
- "flash=swf,flv;" +
90
- "shockwave=dcr;" +
91
- "quicktime=mov,qt,mpg,mpeg;" +
92
- "shockwave=dcr;" +
93
- "windowsmedia=avi,wmv,wm,asf,asx,wmx,wvx;" +
94
- "realmedia=rm,ra,ram;" +
95
- "java=jar;" +
96
- "audio=mp3,ogg"
97
- ).split(';'), function(item) {
98
- var i, extensions, type;
99
-
100
- item = item.split(/=/);
101
- extensions = tinymce.explode(item[1].toLowerCase());
102
- for (i = 0; i < extensions.length; i++) {
103
- type = lookup[item[0].toLowerCase()];
104
-
105
- if (type)
106
- lookup[extensions[i]] = type;
107
- }
108
- });
109
-
110
- scriptRegExp = new RegExp('write(' + scriptRegExp + ')\\(([^)]+)\\)');
111
- self.lookup = lookup;
112
-
113
- ed.onPreInit.add(function() {
114
- // Allow video elements
115
- ed.schema.addValidElements('object[id|style|width|height|classid|codebase|*],param[name|value],embed[id|style|width|height|type|src|*],video[*],audio[*],source[*]');
116
-
117
- // Convert video elements to image placeholder
118
- ed.parser.addNodeFilter('object,embed,video,audio,script,iframe', function(nodes) {
119
- var i = nodes.length;
120
-
121
- while (i--)
122
- self.objectToImg(nodes[i]);
123
- });
124
-
125
- // Convert image placeholders to video elements
126
- ed.serializer.addNodeFilter('img', function(nodes, name, args) {
127
- var i = nodes.length, node;
128
-
129
- while (i--) {
130
- node = nodes[i];
131
- if ((node.attr('class') || '').indexOf('mceItemMedia') !== -1)
132
- self.imgToObject(node, args);
133
- }
134
- });
135
- });
136
-
137
- ed.onInit.add(function() {
138
- // Display "media" instead of "img" in element path
139
- if (ed.theme && ed.theme.onResolveName) {
140
- ed.theme.onResolveName.add(function(theme, path_object) {
141
- if (path_object.name === 'img' && ed.dom.hasClass(path_object.node, 'mceItemMedia'))
142
- path_object.name = 'media';
143
- });
144
- }
145
-
146
- // Add contect menu if it's loaded
147
- if (ed && ed.plugins.contextmenu) {
148
- ed.plugins.contextmenu.onContextMenu.add(function(plugin, menu, element) {
149
- if (element.nodeName === 'IMG' && element.className.indexOf('mceItemMedia') !== -1)
150
- menu.add({title : 'media.edit', icon : 'media', cmd : 'mceMedia'});
151
- });
152
- }
153
- });
154
-
155
- // Register commands
156
- ed.addCommand('mceMedia', function() {
157
- var data, img;
158
-
159
- img = ed.selection.getNode();
160
- if (isMediaImg(img)) {
161
- data = ed.dom.getAttrib(img, 'data-mce-json');
162
- if (data) {
163
- data = JSON.parse(data);
164
-
165
- // Add some extra properties to the data object
166
- tinymce.each(rootAttributes, function(name) {
167
- var value = ed.dom.getAttrib(img, name);
168
-
169
- if (value)
170
- data[name] = value;
171
- });
172
-
173
- data.type = self.getType(img.className).name.toLowerCase();
174
- }
175
- }
176
-
177
- if (!data) {
178
- data = {
179
- type : 'flash',
180
- video: {sources:[]},
181
- params: {}
182
- };
183
- }
184
-
185
- ed.windowManager.open({
186
- file : url + '/media.htm',
187
- width : 430 + parseInt(ed.getLang('media.delta_width', 0)),
188
- height : 500 + parseInt(ed.getLang('media.delta_height', 0)),
189
- inline : 1
190
- }, {
191
- plugin_url : url,
192
- data : data
193
- });
194
- });
195
-
196
- // Register buttons
197
- ed.addButton('media', {title : 'media.desc', cmd : 'mceMedia'});
198
-
199
- // Update media selection status
200
- ed.onNodeChange.add(function(ed, cm, node) {
201
- cm.setActive('media', isMediaImg(node));
202
- });
203
- },
204
-
205
- convertUrl : function(url, force_absolute) {
206
- var self = this, editor = self.editor, settings = editor.settings,
207
- urlConverter = settings.url_converter,
208
- urlConverterScope = settings.url_converter_scope || self;
209
-
210
- if (!url)
211
- return url;
212
-
213
- if (force_absolute)
214
- return editor.documentBaseURI.toAbsolute(url);
215
-
216
- return urlConverter.call(urlConverterScope, url, 'src', 'object');
217
- },
218
-
219
- getInfo : function() {
220
- return {
221
- longname : 'Media',
222
- author : 'Moxiecode Systems AB',
223
- authorurl : 'http://tinymce.moxiecode.com',
224
- infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',
225
- version : tinymce.majorVersion + "." + tinymce.minorVersion
226
- };
227
- },
228
-
229
- /**
230
- * Converts the JSON data object to an img node.
231
- */
232
- dataToImg : function(data, force_absolute) {
233
- var self = this, editor = self.editor, baseUri = editor.documentBaseURI, sources, attrs, img, i;
234
-
235
- data.params.src = self.convertUrl(data.params.src, force_absolute);
236
-
237
- attrs = data.video.attrs;
238
- if (attrs)
239
- attrs.src = self.convertUrl(attrs.src, force_absolute);
240
-
241
- if (attrs)
242
- attrs.poster = self.convertUrl(attrs.poster, force_absolute);
243
-
244
- sources = toArray(data.video.sources);
245
- if (sources) {
246
- for (i = 0; i < sources.length; i++)
247
- sources[i].src = self.convertUrl(sources[i].src, force_absolute);
248
- }
249
-
250
- img = self.editor.dom.create('img', {
251
- id : data.id,
252
- style : data.style,
253
- align : data.align,
254
- hspace : data.hspace,
255
- vspace : data.vspace,
256
- src : self.editor.theme.url + '/img/trans.gif',
257
- 'class' : 'mceItemMedia mceItem' + self.getType(data.type).name,
258
- 'data-mce-json' : JSON.serialize(data, "'")
259
- });
260
-
261
- img.width = data.width || (data.type == 'audio' ? "300" : "320");
262
- img.height = data.height || (data.type == 'audio' ? "32" : "240");
263
-
264
- return img;
265
- },
266
-
267
- /**
268
- * Converts the JSON data object to a HTML string.
269
- */
270
- dataToHtml : function(data, force_absolute) {
271
- return this.editor.serializer.serialize(this.dataToImg(data, force_absolute), {forced_root_block : '', force_absolute : force_absolute});
272
- },
273
-
274
- /**
275
- * Converts the JSON data object to a HTML string.
276
- */
277
- htmlToData : function(html) {
278
- var fragment, img, data;
279
-
280
- data = {
281
- type : 'flash',
282
- video: {sources:[]},
283
- params: {}
284
- };
285
-
286
- fragment = this.editor.parser.parse(html);
287
- img = fragment.getAll('img')[0];
288
-
289
- if (img) {
290
- data = JSON.parse(img.attr('data-mce-json'));
291
- data.type = this.getType(img.attr('class')).name.toLowerCase();
292
-
293
- // Add some extra properties to the data object
294
- tinymce.each(rootAttributes, function(name) {
295
- var value = img.attr(name);
296
-
297
- if (value)
298
- data[name] = value;
299
- });
300
- }
301
-
302
- return data;
303
- },
304
-
305
- /**
306
- * Get type item by extension, class, clsid or mime type.
307
- *
308
- * @method getType
309
- * @param {String} value Value to get type item by.
310
- * @return {Object} Type item object or undefined.
311
- */
312
- getType : function(value) {
313
- var i, values, typeItem;
314
-
315
- // Find type by checking the classes
316
- values = tinymce.explode(value, ' ');
317
- for (i = 0; i < values.length; i++) {
318
- typeItem = this.lookup[values[i]];
319
-
320
- if (typeItem)
321
- return typeItem;
322
- }
323
- },
324
-
325
- /**
326
- * Converts a tinymce.html.Node image element to video/object/embed.
327
- */
328
- imgToObject : function(node, args) {
329
- var self = this, editor = self.editor, video, object, embed, iframe, name, value, data,
330
- source, sources, params, param, typeItem, i, item, mp4Source, replacement,
331
- posterSrc, style, audio;
332
-
333
- // Adds the flash player
334
- function addPlayer(video_src, poster_src) {
335
- var baseUri, flashVars, flashVarsOutput, params, flashPlayer;
336
-
337
- flashPlayer = editor.getParam('flash_video_player_url', self.convertUrl(self.url + '/moxieplayer.swf'));
338
- if (flashPlayer) {
339
- baseUri = editor.documentBaseURI;
340
- data.params.src = flashPlayer;
341
-
342
- // Convert the movie url to absolute urls
343
- if (editor.getParam('flash_video_player_absvideourl', true)) {
344
- video_src = baseUri.toAbsolute(video_src || '', true);
345
- poster_src = baseUri.toAbsolute(poster_src || '', true);
346
- }
347
-
348
- // Generate flash vars
349
- flashVarsOutput = '';
350
- flashVars = editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'});
351
- tinymce.each(flashVars, function(value, name) {
352
- // Replace $url and $poster variables in flashvars value
353
- value = value.replace(/\$url/, video_src || '');
354
- value = value.replace(/\$poster/, poster_src || '');
355
-
356
- if (value.length > 0)
357
- flashVarsOutput += (flashVarsOutput ? '&' : '') + name + '=' + escape(value);
358
- });
359
-
360
- if (flashVarsOutput.length)
361
- data.params.flashvars = flashVarsOutput;
362
-
363
- params = editor.getParam('flash_video_player_params', {
364
- allowfullscreen: true,
365
- allowscriptaccess: true
366
- });
367
-
368
- tinymce.each(params, function(value, name) {
369
- data.params[name] = "" + value;
370
- });
371
- }
372
- };
373
-
374
- data = node.attr('data-mce-json');
375
- if (!data)
376
- return;
377
-
378
- data = JSON.parse(data);
379
- typeItem = this.getType(node.attr('class'));
380
-
381
- style = node.attr('data-mce-style')
382
- if (!style) {
383
- style = node.attr('style');
384
-
385
- if (style)
386
- style = editor.dom.serializeStyle(editor.dom.parseStyle(style, 'img'));
387
- }
388
-
389
- // Handle iframe
390
- if (typeItem.name === 'Iframe') {
391
- replacement = new Node('iframe', 1);
392
-
393
- tinymce.each(rootAttributes, function(name) {
394
- var value = node.attr(name);
395
-
396
- if (name == 'class' && value)
397
- value = value.replace(/mceItem.+ ?/g, '');
398
-
399
- if (value && value.length > 0)
400
- replacement.attr(name, value);
401
- });
402
-
403
- for (name in data.params)
404
- replacement.attr(name, data.params[name]);
405
-
406
- replacement.attr({
407
- style: style,
408
- src: data.params.src
409
- });
410
-
411
- node.replace(replacement);
412
-
413
- return;
414
- }
415
-
416
- // Handle scripts
417
- if (this.editor.settings.media_use_script) {
418
- replacement = new Node('script', 1).attr('type', 'text/javascript');
419
-
420
- value = new Node('#text', 3);
421
- value.value = 'write' + typeItem.name + '(' + JSON.serialize(tinymce.extend(data.params, {
422
- width: node.attr('width'),
423
- height: node.attr('height')
424
- })) + ');';
425
-
426
- replacement.append(value);
427
- node.replace(replacement);
428
-
429
- return;
430
- }
431
-
432
- // Add HTML5 video element
433
- if (typeItem.name === 'Video' && data.video.sources[0]) {
434
- // Create new object element
435
- video = new Node('video', 1).attr(tinymce.extend({
436
- id : node.attr('id'),
437
- width: node.attr('width'),
438
- height: node.attr('height'),
439
- style : style
440
- }, data.video.attrs));
441
-
442
- // Get poster source and use that for flash fallback
443
- if (data.video.attrs)
444
- posterSrc = data.video.attrs.poster;
445
-
446
- sources = data.video.sources = toArray(data.video.sources);
447
- for (i = 0; i < sources.length; i++) {
448
- if (/\.mp4$/.test(sources[i].src))
449
- mp4Source = sources[i].src;
450
- }
451
-
452
- if (!sources[0].type) {
453
- video.attr('src', sources[0].src);
454
- sources.splice(0, 1);
455
- }
456
-
457
- for (i = 0; i < sources.length; i++) {
458
- source = new Node('source', 1).attr(sources[i]);
459
- source.shortEnded = true;
460
- video.append(source);
461
- }
462
-
463
- // Create flash fallback for video if we have a mp4 source
464
- if (mp4Source) {
465
- addPlayer(mp4Source, posterSrc);
466
- typeItem = self.getType('flash');
467
- } else
468
- data.params.src = '';
469
- }
470
-
471
- // Add HTML5 audio element
472
- if (typeItem.name === 'Audio' && data.video.sources[0]) {
473
- // Create new object element
474
- audio = new Node('audio', 1).attr(tinymce.extend({
475
- id : node.attr('id'),
476
- width: node.attr('width'),
477
- height: node.attr('height'),
478
- style : style
479
- }, data.video.attrs));
480
-
481
- // Get poster source and use that for flash fallback
482
- if (data.video.attrs)
483
- posterSrc = data.video.attrs.poster;
484
-
485
- sources = data.video.sources = toArray(data.video.sources);
486
- if (!sources[0].type) {
487
- audio.attr('src', sources[0].src);
488
- sources.splice(0, 1);
489
- }
490
-
491
- for (i = 0; i < sources.length; i++) {
492
- source = new Node('source', 1).attr(sources[i]);
493
- source.shortEnded = true;
494
- audio.append(source);
495
- }
496
-
497
- data.params.src = '';
498
- }
499
-
500
- if (typeItem.name === 'EmbeddedAudio') {
501
- embed = new Node('embed', 1);
502
- embed.shortEnded = true;
503
- embed.attr({
504
- id: node.attr('id'),
505
- width: node.attr('width'),
506
- height: node.attr('height'),
507
- style : style,
508
- type: node.attr('type')
509
- });
510
-
511
- for (name in data.params)
512
- embed.attr(name, data.params[name]);
513
-
514
- tinymce.each(rootAttributes, function(name) {
515
- if (data[name] && name != 'type')
516
- embed.attr(name, data[name]);
517
- });
518
-
519
- data.params.src = '';
520
- }
521
-
522
- // Do we have a params src then we can generate object
523
- if (data.params.src) {
524
- // Is flv movie add player for it
525
- if (/\.flv$/i.test(data.params.src))
526
- addPlayer(data.params.src, '');
527
-
528
- if (args && args.force_absolute)
529
- data.params.src = editor.documentBaseURI.toAbsolute(data.params.src);
530
-
531
- // Create new object element
532
- object = new Node('object', 1).attr({
533
- id : node.attr('id'),
534
- width: node.attr('width'),
535
- height: node.attr('height'),
536
- style : style
537
- });
538
-
539
- tinymce.each(rootAttributes, function(name) {
540
- var value = data[name];
541
-
542
- if (name == 'class' && value)
543
- value = value.replace(/mceItem.+ ?/g, '');
544
-
545
- if (value && name != 'type')
546
- object.attr(name, value);
547
- });
548
-
549
- // Add params
550
- for (name in data.params) {
551
- param = new Node('param', 1);
552
- param.shortEnded = true;
553
- value = data.params[name];
554
-
555
- // Windows media needs to use url instead of src for the media URL
556
- if (name === 'src' && typeItem.name === 'WindowsMedia')
557
- name = 'url';
558
-
559
- param.attr({name: name, value: value});
560
- object.append(param);
561
- }
562
-
563
- // Setup add type and classid if strict is disabled
564
- if (this.editor.getParam('media_strict', true)) {
565
- object.attr({
566
- data: data.params.src,
567
- type: typeItem.mimes[0]
568
- });
569
- } else {
570
- object.attr({
571
- classid: "clsid:" + typeItem.clsids[0],
572
- codebase: typeItem.codebase
573
- });
574
-
575
- embed = new Node('embed', 1);
576
- embed.shortEnded = true;
577
- embed.attr({
578
- id: node.attr('id'),
579
- width: node.attr('width'),
580
- height: node.attr('height'),
581
- style : style,
582
- type: typeItem.mimes[0]
583
- });
584
-
585
- for (name in data.params)
586
- embed.attr(name, data.params[name]);
587
-
588
- tinymce.each(rootAttributes, function(name) {
589
- if (data[name] && name != 'type')
590
- embed.attr(name, data[name]);
591
- });
592
-
593
- object.append(embed);
594
- }
595
-
596
- // Insert raw HTML
597
- if (data.object_html) {
598
- value = new Node('#text', 3);
599
- value.raw = true;
600
- value.value = data.object_html;
601
- object.append(value);
602
- }
603
-
604
- // Append object to video element if it exists
605
- if (video)
606
- video.append(object);
607
- }
608
-
609
- if (video) {
610
- // Insert raw HTML
611
- if (data.video_html) {
612
- value = new Node('#text', 3);
613
- value.raw = true;
614
- value.value = data.video_html;
615
- video.append(value);
616
- }
617
- }
618
-
619
- if (audio) {
620
- // Insert raw HTML
621
- if (data.video_html) {
622
- value = new Node('#text', 3);
623
- value.raw = true;
624
- value.value = data.video_html;
625
- audio.append(value);
626
- }
627
- }
628
-
629
- var n = video || audio || object || embed;
630
- if (n)
631
- node.replace(n);
632
- else
633
- node.remove();
634
- },
635
-
636
- /**
637
- * Converts a tinymce.html.Node video/object/embed to an img element.
638
- *
639
- * The video/object/embed will be converted into an image placeholder with a JSON data attribute like this:
640
- * <img class="mceItemMedia mceItemFlash" width="100" height="100" data-mce-json="{..}" />
641
- *
642
- * The JSON structure will be like this:
643
- * {'params':{'flashvars':'something','quality':'high','src':'someurl'}, 'video':{'sources':[{src: 'someurl', type: 'video/mp4'}]}}
644
- */
645
- objectToImg : function(node) {
646
- var object, embed, video, iframe, img, name, id, width, height, style, i, html,
647
- param, params, source, sources, data, type, lookup = this.lookup,
648
- matches, attrs, urlConverter = this.editor.settings.url_converter,
649
- urlConverterScope = this.editor.settings.url_converter_scope,
650
- hspace, vspace, align, bgcolor;
651
-
652
- function getInnerHTML(node) {
653
- return new tinymce.html.Serializer({
654
- inner: true,
655
- validate: false
656
- }).serialize(node);
657
- };
658
-
659
- function lookupAttribute(o, attr) {
660
- return lookup[(o.attr(attr) || '').toLowerCase()];
661
- }
662
-
663
- function lookupExtension(src) {
664
- var ext = src.replace(/^.*\.([^.]+)$/, '$1');
665
- return lookup[ext.toLowerCase() || ''];
666
- }
667
-
668
- // If node isn't in document
669
- if (!node.parent)
670
- return;
671
-
672
- // Handle media scripts
673
- if (node.name === 'script') {
674
- if (node.firstChild)
675
- matches = scriptRegExp.exec(node.firstChild.value);
676
-
677
- if (!matches)
678
- return;
679
-
680
- type = matches[1];
681
- data = {video : {}, params : JSON.parse(matches[2])};
682
- width = data.params.width;
683
- height = data.params.height;
684
- }
685
-
686
- // Setup data objects
687
- data = data || {
688
- video : {},
689
- params : {}
690
- };
691
-
692
- // Setup new image object
693
- img = new Node('img', 1);
694
- img.attr({
695
- src : this.editor.theme.url + '/img/trans.gif'
696
- });
697
-
698
- // Video element
699
- name = node.name;
700
- if (name === 'video' || name == 'audio') {
701
- video = node;
702
- object = node.getAll('object')[0];
703
- embed = node.getAll('embed')[0];
704
- width = video.attr('width');
705
- height = video.attr('height');
706
- id = video.attr('id');
707
- data.video = {attrs : {}, sources : []};
708
-
709
- // Get all video attributes
710
- attrs = data.video.attrs;
711
- for (name in video.attributes.map)
712
- attrs[name] = video.attributes.map[name];
713
-
714
- source = node.attr('src');
715
- if (source)
716
- data.video.sources.push({src : urlConverter.call(urlConverterScope, source, 'src', node.name)});
717
-
718
- // Get all sources
719
- sources = video.getAll("source");
720
- for (i = 0; i < sources.length; i++) {
721
- source = sources[i].remove();
722
-
723
- data.video.sources.push({
724
- src: urlConverter.call(urlConverterScope, source.attr('src'), 'src', 'source'),
725
- type: source.attr('type'),
726
- media: source.attr('media')
727
- });
728
- }
729
-
730
- // Convert the poster URL
731
- if (attrs.poster)
732
- attrs.poster = urlConverter.call(urlConverterScope, attrs.poster, 'poster', node.name);
733
- }
734
-
735
- // Object element
736
- if (node.name === 'object') {
737
- object = node;
738
- embed = node.getAll('embed')[0];
739
- }
740
-
741
- // Embed element
742
- if (node.name === 'embed')
743
- embed = node;
744
-
745
- // Iframe element
746
- if (node.name === 'iframe') {
747
- iframe = node;
748
- type = 'Iframe';
749
- }
750
-
751
- if (object) {
752
- // Get width/height
753
- width = width || object.attr('width');
754
- height = height || object.attr('height');
755
- style = style || object.attr('style');
756
- id = id || object.attr('id');
757
- hspace = hspace || object.attr('hspace');
758
- vspace = vspace || object.attr('vspace');
759
- align = align || object.attr('align');
760
- bgcolor = bgcolor || object.attr('bgcolor');
761
- data.name = object.attr('name');
762
-
763
- // Get all object params
764
- params = object.getAll("param");
765
- for (i = 0; i < params.length; i++) {
766
- param = params[i];
767
- name = param.remove().attr('name');
768
-
769
- if (!excludedAttrs[name])
770
- data.params[name] = param.attr('value');
771
- }
772
-
773
- data.params.src = data.params.src || object.attr('data');
774
- }
775
-
776
- if (embed) {
777
- // Get width/height
778
- width = width || embed.attr('width');
779
- height = height || embed.attr('height');
780
- style = style || embed.attr('style');
781
- id = id || embed.attr('id');
782
- hspace = hspace || embed.attr('hspace');
783
- vspace = vspace || embed.attr('vspace');
784
- align = align || embed.attr('align');
785
- bgcolor = bgcolor || embed.attr('bgcolor');
786
-
787
- // Get all embed attributes
788
- for (name in embed.attributes.map) {
789
- if (!excludedAttrs[name] && !data.params[name])
790
- data.params[name] = embed.attributes.map[name];
791
- }
792
- }
793
-
794
- if (iframe) {
795
- // Get width/height
796
- width = iframe.attr('width');
797
- height = iframe.attr('height');
798
- style = style || iframe.attr('style');
799
- id = iframe.attr('id');
800
- hspace = iframe.attr('hspace');
801
- vspace = iframe.attr('vspace');
802
- align = iframe.attr('align');
803
- bgcolor = iframe.attr('bgcolor');
804
-
805
- tinymce.each(rootAttributes, function(name) {
806
- img.attr(name, iframe.attr(name));
807
- });
808
-
809
- // Get all iframe attributes
810
- for (name in iframe.attributes.map) {
811
- if (!excludedAttrs[name] && !data.params[name])
812
- data.params[name] = iframe.attributes.map[name];
813
- }
814
- }
815
-
816
- // Use src not movie
817
- if (data.params.movie) {
818
- data.params.src = data.params.src || data.params.movie;
819
- delete data.params.movie;
820
- }
821
-
822
- // Convert the URL to relative/absolute depending on configuration
823
- if (data.params.src)
824
- data.params.src = urlConverter.call(urlConverterScope, data.params.src, 'src', 'object');
825
-
826
- if (video) {
827
- if (node.name === 'video')
828
- type = lookup.video.name;
829
- else if (node.name === 'audio')
830
- type = lookup.audio.name;
831
- }
832
-
833
- if (object && !type)
834
- type = (lookupAttribute(object, 'clsid') || lookupAttribute(object, 'classid') || lookupAttribute(object, 'type') || {}).name;
835
-
836
- if (embed && !type)
837
- type = (lookupAttribute(embed, 'type') || lookupExtension(data.params.src) || {}).name;
838
-
839
- // for embedded audio we preserve the original specified type
840
- if (embed && type == 'EmbeddedAudio') {
841
- data.params.type = embed.attr('type');
842
- }
843
-
844
- // Replace the video/object/embed element with a placeholder image containing the data
845
- node.replace(img);
846
-
847
- // Remove embed
848
- if (embed)
849
- embed.remove();
850
-
851
- // Serialize the inner HTML of the object element
852
- if (object) {
853
- html = getInnerHTML(object.remove());
854
-
855
- if (html)
856
- data.object_html = html;
857
- }
858
-
859
- // Serialize the inner HTML of the video element
860
- if (video) {
861
- html = getInnerHTML(video.remove());
862
-
863
- if (html)
864
- data.video_html = html;
865
- }
866
-
867
- data.hspace = hspace;
868
- data.vspace = vspace;
869
- data.align = align;
870
- data.bgcolor = bgcolor;
871
-
872
- // Set width/height of placeholder
873
- img.attr({
874
- id : id,
875
- 'class' : 'mceItemMedia mceItem' + (type || 'Flash'),
876
- style : style,
877
- width : width || (node.name == 'audio' ? "300" : "320"),
878
- height : height || (node.name == 'audio' ? "32" : "240"),
879
- hspace : hspace,
880
- vspace : vspace,
881
- align : align,
882
- bgcolor : bgcolor,
883
- "data-mce-json" : JSON.serialize(data, "'")
884
- });
885
- }
886
- });
887
-
888
- // Register plugin
889
- tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin);
890
- })();
1
+ /**
2
+ * editor_plugin_src.js
3
+ *
4
+ * Copyright 2009, Moxiecode Systems AB
5
+ * Released under LGPL License.
6
+ *
7
+ * License: http://tinymce.moxiecode.com/license
8
+ * Contributing: http://tinymce.moxiecode.com/contributing
9
+ */
10
+
11
+ (function() {
12
+ var rootAttributes = tinymce.explode('id,name,width,height,style,align,class,hspace,vspace,bgcolor,type'), excludedAttrs = tinymce.makeMap(rootAttributes.join(',')), Node = tinymce.html.Node,
13
+ mediaTypes, scriptRegExp, JSON = tinymce.util.JSON, mimeTypes;
14
+
15
+ // Media types supported by this plugin
16
+ mediaTypes = [
17
+ // Type, clsid:s, mime types, codebase
18
+ ["Flash", "d27cdb6e-ae6d-11cf-96b8-444553540000", "application/x-shockwave-flash", "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],
19
+ ["ShockWave", "166b1bca-3f9c-11cf-8075-444553540000", "application/x-director", "http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"],
20
+ ["WindowsMedia", "6bf52a52-394a-11d3-b153-00c04f79faa6,22d6f312-b0f6-11d0-94ab-0080c74c7e95,05589fa1-c356-11ce-bf01-00aa0055595a", "application/x-mplayer2", "http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"],
21
+ ["QuickTime", "02bf25d5-8c17-4b23-bc80-d3488abddc6b", "video/quicktime", "http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"],
22
+ ["RealMedia", "cfcdaa03-8be4-11cf-b84b-0020afbbccfa", "audio/x-pn-realaudio-plugin", "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],
23
+ ["Java", "8ad9c840-044e-11d1-b3e9-00805f499d93", "application/x-java-applet", "http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],
24
+ ["Silverlight", "dfeaf541-f3e1-4c24-acac-99c30715084a", "application/x-silverlight-2"],
25
+ ["Iframe"],
26
+ ["Video"],
27
+ ["EmbeddedAudio"],
28
+ ["Audio"]
29
+ ];
30
+
31
+ function normalizeSize(size) {
32
+ return typeof(size) == "string" ? size.replace(/[^0-9%]/g, '') : size;
33
+ }
34
+
35
+ function toArray(obj) {
36
+ var undef, out, i;
37
+
38
+ if (obj && !obj.splice) {
39
+ out = [];
40
+
41
+ for (i = 0; true; i++) {
42
+ if (obj[i])
43
+ out[i] = obj[i];
44
+ else
45
+ break;
46
+ }
47
+
48
+ return out;
49
+ }
50
+
51
+ return obj;
52
+ };
53
+
54
+ tinymce.create('tinymce.plugins.MediaPlugin', {
55
+ init : function(ed, url) {
56
+ var self = this, lookup = {}, i, y, item, name;
57
+
58
+ function isMediaImg(node) {
59
+ return node && node.nodeName === 'IMG' && ed.dom.hasClass(node, 'mceItemMedia');
60
+ };
61
+
62
+ self.editor = ed;
63
+ self.url = url;
64
+
65
+ // Parse media types into a lookup table
66
+ scriptRegExp = '';
67
+ for (i = 0; i < mediaTypes.length; i++) {
68
+ name = mediaTypes[i][0];
69
+
70
+ item = {
71
+ name : name,
72
+ clsids : tinymce.explode(mediaTypes[i][1] || ''),
73
+ mimes : tinymce.explode(mediaTypes[i][2] || ''),
74
+ codebase : mediaTypes[i][3]
75
+ };
76
+
77
+ for (y = 0; y < item.clsids.length; y++)
78
+ lookup['clsid:' + item.clsids[y]] = item;
79
+
80
+ for (y = 0; y < item.mimes.length; y++)
81
+ lookup[item.mimes[y]] = item;
82
+
83
+ lookup['mceItem' + name] = item;
84
+ lookup[name.toLowerCase()] = item;
85
+
86
+ scriptRegExp += (scriptRegExp ? '|' : '') + name;
87
+ }
88
+
89
+ // Handle the media_types setting
90
+ tinymce.each(ed.getParam("media_types",
91
+ "video=mp4,m4v,ogv,webm;" +
92
+ "silverlight=xap;" +
93
+ "flash=swf,flv;" +
94
+ "shockwave=dcr;" +
95
+ "quicktime=mov,qt,mpg,mpeg;" +
96
+ "shockwave=dcr;" +
97
+ "windowsmedia=avi,wmv,wm,asf,asx,wmx,wvx;" +
98
+ "realmedia=rm,ra,ram;" +
99
+ "java=jar;" +
100
+ "audio=mp3,ogg"
101
+ ).split(';'), function(item) {
102
+ var i, extensions, type;
103
+
104
+ item = item.split(/=/);
105
+ extensions = tinymce.explode(item[1].toLowerCase());
106
+ for (i = 0; i < extensions.length; i++) {
107
+ type = lookup[item[0].toLowerCase()];
108
+
109
+ if (type)
110
+ lookup[extensions[i]] = type;
111
+ }
112
+ });
113
+
114
+ scriptRegExp = new RegExp('write(' + scriptRegExp + ')\\(([^)]+)\\)');
115
+ self.lookup = lookup;
116
+
117
+ ed.onPreInit.add(function() {
118
+ // Allow video elements
119
+ ed.schema.addValidElements('object[id|style|width|height|classid|codebase|*],param[name|value],embed[id|style|width|height|type|src|*],video[*],audio[*],source[*]');
120
+
121
+ // Convert video elements to image placeholder
122
+ ed.parser.addNodeFilter('object,embed,video,audio,script,iframe', function(nodes) {
123
+ var i = nodes.length;
124
+
125
+ while (i--)
126
+ self.objectToImg(nodes[i]);
127
+ });
128
+
129
+ // Convert image placeholders to video elements
130
+ ed.serializer.addNodeFilter('img', function(nodes, name, args) {
131
+ var i = nodes.length, node;
132
+
133
+ while (i--) {
134
+ node = nodes[i];
135
+ if ((node.attr('class') || '').indexOf('mceItemMedia') !== -1)
136
+ self.imgToObject(node, args);
137
+ }
138
+ });
139
+ });
140
+
141
+ ed.onInit.add(function() {
142
+ // Display "media" instead of "img" in element path
143
+ if (ed.theme && ed.theme.onResolveName) {
144
+ ed.theme.onResolveName.add(function(theme, path_object) {
145
+ if (path_object.name === 'img' && ed.dom.hasClass(path_object.node, 'mceItemMedia'))
146
+ path_object.name = 'media';
147
+ });
148
+ }
149
+
150
+ // Add contect menu if it's loaded
151
+ if (ed && ed.plugins.contextmenu) {
152
+ ed.plugins.contextmenu.onContextMenu.add(function(plugin, menu, element) {
153
+ if (element.nodeName === 'IMG' && element.className.indexOf('mceItemMedia') !== -1)
154
+ menu.add({title : 'media.edit', icon : 'media', cmd : 'mceMedia'});
155
+ });
156
+ }
157
+ });
158
+
159
+ // Register commands
160
+ ed.addCommand('mceMedia', function() {
161
+ var data, img;
162
+
163
+ img = ed.selection.getNode();
164
+ if (isMediaImg(img)) {
165
+ data = ed.dom.getAttrib(img, 'data-mce-json');
166
+ if (data) {
167
+ data = JSON.parse(data);
168
+
169
+ // Add some extra properties to the data object
170
+ tinymce.each(rootAttributes, function(name) {
171
+ var value = ed.dom.getAttrib(img, name);
172
+
173
+ if (value)
174
+ data[name] = value;
175
+ });
176
+
177
+ data.type = self.getType(img.className).name.toLowerCase();
178
+ }
179
+ }
180
+
181
+ if (!data) {
182
+ data = {
183
+ type : 'flash',
184
+ video: {sources:[]},
185
+ params: {}
186
+ };
187
+ }
188
+
189
+ ed.windowManager.open({
190
+ file : url + '/media.htm',
191
+ width : 430 + parseInt(ed.getLang('media.delta_width', 0)),
192
+ height : 500 + parseInt(ed.getLang('media.delta_height', 0)),
193
+ inline : 1
194
+ }, {
195
+ plugin_url : url,
196
+ data : data
197
+ });
198
+ });
199
+
200
+ // Register buttons
201
+ ed.addButton('media', {title : 'media.desc', cmd : 'mceMedia'});
202
+
203
+ // Update media selection status
204
+ ed.onNodeChange.add(function(ed, cm, node) {
205
+ cm.setActive('media', isMediaImg(node));
206
+ });
207
+ },
208
+
209
+ convertUrl : function(url, force_absolute) {
210
+ var self = this, editor = self.editor, settings = editor.settings,
211
+ urlConverter = settings.url_converter,
212
+ urlConverterScope = settings.url_converter_scope || self;
213
+
214
+ if (!url)
215
+ return url;
216
+
217
+ if (force_absolute)
218
+ return editor.documentBaseURI.toAbsolute(url);
219
+
220
+ return urlConverter.call(urlConverterScope, url, 'src', 'object');
221
+ },
222
+
223
+ getInfo : function() {
224
+ return {
225
+ longname : 'Media',
226
+ author : 'Moxiecode Systems AB',
227
+ authorurl : 'http://tinymce.moxiecode.com',
228
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',
229
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
230
+ };
231
+ },
232
+
233
+ /**
234
+ * Converts the JSON data object to an img node.
235
+ */
236
+ dataToImg : function(data, force_absolute) {
237
+ var self = this, editor = self.editor, baseUri = editor.documentBaseURI, sources, attrs, img, i;
238
+
239
+ data.params.src = self.convertUrl(data.params.src, force_absolute);
240
+
241
+ attrs = data.video.attrs;
242
+ if (attrs)
243
+ attrs.src = self.convertUrl(attrs.src, force_absolute);
244
+
245
+ if (attrs)
246
+ attrs.poster = self.convertUrl(attrs.poster, force_absolute);
247
+
248
+ sources = toArray(data.video.sources);
249
+ if (sources) {
250
+ for (i = 0; i < sources.length; i++)
251
+ sources[i].src = self.convertUrl(sources[i].src, force_absolute);
252
+ }
253
+
254
+ img = self.editor.dom.create('img', {
255
+ id : data.id,
256
+ style : data.style,
257
+ align : data.align,
258
+ hspace : data.hspace,
259
+ vspace : data.vspace,
260
+ src : self.editor.theme.url + '/img/trans.gif',
261
+ 'class' : 'mceItemMedia mceItem' + self.getType(data.type).name,
262
+ 'data-mce-json' : JSON.serialize(data, "'")
263
+ });
264
+
265
+ img.width = data.width = normalizeSize(data.width || (data.type == 'audio' ? "300" : "320"));
266
+ img.height = data.height = normalizeSize(data.height || (data.type == 'audio' ? "32" : "240"));
267
+
268
+ return img;
269
+ },
270
+
271
+ /**
272
+ * Converts the JSON data object to a HTML string.
273
+ */
274
+ dataToHtml : function(data, force_absolute) {
275
+ return this.editor.serializer.serialize(this.dataToImg(data, force_absolute), {forced_root_block : '', force_absolute : force_absolute});
276
+ },
277
+
278
+ /**
279
+ * Converts the JSON data object to a HTML string.
280
+ */
281
+ htmlToData : function(html) {
282
+ var fragment, img, data;
283
+
284
+ data = {
285
+ type : 'flash',
286
+ video: {sources:[]},
287
+ params: {}
288
+ };
289
+
290
+ fragment = this.editor.parser.parse(html);
291
+ img = fragment.getAll('img')[0];
292
+
293
+ if (img) {
294
+ data = JSON.parse(img.attr('data-mce-json'));
295
+ data.type = this.getType(img.attr('class')).name.toLowerCase();
296
+
297
+ // Add some extra properties to the data object
298
+ tinymce.each(rootAttributes, function(name) {
299
+ var value = img.attr(name);
300
+
301
+ if (value)
302
+ data[name] = value;
303
+ });
304
+ }
305
+
306
+ return data;
307
+ },
308
+
309
+ /**
310
+ * Get type item by extension, class, clsid or mime type.
311
+ *
312
+ * @method getType
313
+ * @param {String} value Value to get type item by.
314
+ * @return {Object} Type item object or undefined.
315
+ */
316
+ getType : function(value) {
317
+ var i, values, typeItem;
318
+
319
+ // Find type by checking the classes
320
+ values = tinymce.explode(value, ' ');
321
+ for (i = 0; i < values.length; i++) {
322
+ typeItem = this.lookup[values[i]];
323
+
324
+ if (typeItem)
325
+ return typeItem;
326
+ }
327
+ },
328
+
329
+ /**
330
+ * Converts a tinymce.html.Node image element to video/object/embed.
331
+ */
332
+ imgToObject : function(node, args) {
333
+ var self = this, editor = self.editor, video, object, embed, iframe, name, value, data,
334
+ source, sources, params, param, typeItem, i, item, mp4Source, replacement,
335
+ posterSrc, style, audio;
336
+
337
+ // Adds the flash player
338
+ function addPlayer(video_src, poster_src) {
339
+ var baseUri, flashVars, flashVarsOutput, params, flashPlayer;
340
+
341
+ flashPlayer = editor.getParam('flash_video_player_url', self.convertUrl(self.url + '/moxieplayer.swf'));
342
+ if (flashPlayer) {
343
+ baseUri = editor.documentBaseURI;
344
+ data.params.src = flashPlayer;
345
+
346
+ // Convert the movie url to absolute urls
347
+ if (editor.getParam('flash_video_player_absvideourl', true)) {
348
+ video_src = baseUri.toAbsolute(video_src || '', true);
349
+ poster_src = baseUri.toAbsolute(poster_src || '', true);
350
+ }
351
+
352
+ // Generate flash vars
353
+ flashVarsOutput = '';
354
+ flashVars = editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'});
355
+ tinymce.each(flashVars, function(value, name) {
356
+ // Replace $url and $poster variables in flashvars value
357
+ value = value.replace(/\$url/, video_src || '');
358
+ value = value.replace(/\$poster/, poster_src || '');
359
+
360
+ if (value.length > 0)
361
+ flashVarsOutput += (flashVarsOutput ? '&' : '') + name + '=' + escape(value);
362
+ });
363
+
364
+ if (flashVarsOutput.length)
365
+ data.params.flashvars = flashVarsOutput;
366
+
367
+ params = editor.getParam('flash_video_player_params', {
368
+ allowfullscreen: true,
369
+ allowscriptaccess: true
370
+ });
371
+
372
+ tinymce.each(params, function(value, name) {
373
+ data.params[name] = "" + value;
374
+ });
375
+ }
376
+ };
377
+
378
+ data = node.attr('data-mce-json');
379
+ if (!data)
380
+ return;
381
+
382
+ data = JSON.parse(data);
383
+ typeItem = this.getType(node.attr('class'));
384
+
385
+ style = node.attr('data-mce-style');
386
+ if (!style) {
387
+ style = node.attr('style');
388
+
389
+ if (style)
390
+ style = editor.dom.serializeStyle(editor.dom.parseStyle(style, 'img'));
391
+ }
392
+
393
+ // Use node width/height to override the data width/height when the placeholder is resized
394
+ data.width = node.attr('width') || data.width;
395
+ data.height = node.attr('height') || data.height;
396
+
397
+ // Handle iframe
398
+ if (typeItem.name === 'Iframe') {
399
+ replacement = new Node('iframe', 1);
400
+
401
+ tinymce.each(rootAttributes, function(name) {
402
+ var value = node.attr(name);
403
+
404
+ if (name == 'class' && value)
405
+ value = value.replace(/mceItem.+ ?/g, '');
406
+
407
+ if (value && value.length > 0)
408
+ replacement.attr(name, value);
409
+ });
410
+
411
+ for (name in data.params)
412
+ replacement.attr(name, data.params[name]);
413
+
414
+ replacement.attr({
415
+ style: style,
416
+ src: data.params.src
417
+ });
418
+
419
+ node.replace(replacement);
420
+
421
+ return;
422
+ }
423
+
424
+ // Handle scripts
425
+ if (this.editor.settings.media_use_script) {
426
+ replacement = new Node('script', 1).attr('type', 'text/javascript');
427
+
428
+ value = new Node('#text', 3);
429
+ value.value = 'write' + typeItem.name + '(' + JSON.serialize(tinymce.extend(data.params, {
430
+ width: node.attr('width'),
431
+ height: node.attr('height')
432
+ })) + ');';
433
+
434
+ replacement.append(value);
435
+ node.replace(replacement);
436
+
437
+ return;
438
+ }
439
+
440
+ // Add HTML5 video element
441
+ if (typeItem.name === 'Video' && data.video.sources[0]) {
442
+ // Create new object element
443
+ video = new Node('video', 1).attr(tinymce.extend({
444
+ id : node.attr('id'),
445
+ width: normalizeSize(node.attr('width')),
446
+ height: normalizeSize(node.attr('height')),
447
+ style : style
448
+ }, data.video.attrs));
449
+
450
+ // Get poster source and use that for flash fallback
451
+ if (data.video.attrs)
452
+ posterSrc = data.video.attrs.poster;
453
+
454
+ sources = data.video.sources = toArray(data.video.sources);
455
+ for (i = 0; i < sources.length; i++) {
456
+ if (/\.mp4$/.test(sources[i].src))
457
+ mp4Source = sources[i].src;
458
+ }
459
+
460
+ if (!sources[0].type) {
461
+ video.attr('src', sources[0].src);
462
+ sources.splice(0, 1);
463
+ }
464
+
465
+ for (i = 0; i < sources.length; i++) {
466
+ source = new Node('source', 1).attr(sources[i]);
467
+ source.shortEnded = true;
468
+ video.append(source);
469
+ }
470
+
471
+ // Create flash fallback for video if we have a mp4 source
472
+ if (mp4Source) {
473
+ addPlayer(mp4Source, posterSrc);
474
+ typeItem = self.getType('flash');
475
+ } else
476
+ data.params.src = '';
477
+ }
478
+
479
+ // Add HTML5 audio element
480
+ if (typeItem.name === 'Audio' && data.video.sources[0]) {
481
+ // Create new object element
482
+ audio = new Node('audio', 1).attr(tinymce.extend({
483
+ id : node.attr('id'),
484
+ width: normalizeSize(node.attr('width')),
485
+ height: normalizeSize(node.attr('height')),
486
+ style : style
487
+ }, data.video.attrs));
488
+
489
+ // Get poster source and use that for flash fallback
490
+ if (data.video.attrs)
491
+ posterSrc = data.video.attrs.poster;
492
+
493
+ sources = data.video.sources = toArray(data.video.sources);
494
+ if (!sources[0].type) {
495
+ audio.attr('src', sources[0].src);
496
+ sources.splice(0, 1);
497
+ }
498
+
499
+ for (i = 0; i < sources.length; i++) {
500
+ source = new Node('source', 1).attr(sources[i]);
501
+ source.shortEnded = true;
502
+ audio.append(source);
503
+ }
504
+
505
+ data.params.src = '';
506
+ }
507
+
508
+ if (typeItem.name === 'EmbeddedAudio') {
509
+ embed = new Node('embed', 1);
510
+ embed.shortEnded = true;
511
+ embed.attr({
512
+ id: node.attr('id'),
513
+ width: normalizeSize(node.attr('width')),
514
+ height: normalizeSize(node.attr('height')),
515
+ style : style,
516
+ type: node.attr('type')
517
+ });
518
+
519
+ for (name in data.params)
520
+ embed.attr(name, data.params[name]);
521
+
522
+ tinymce.each(rootAttributes, function(name) {
523
+ if (data[name] && name != 'type')
524
+ embed.attr(name, data[name]);
525
+ });
526
+
527
+ data.params.src = '';
528
+ }
529
+
530
+ // Do we have a params src then we can generate object
531
+ if (data.params.src) {
532
+ // Is flv movie add player for it
533
+ if (/\.flv$/i.test(data.params.src))
534
+ addPlayer(data.params.src, '');
535
+
536
+ if (args && args.force_absolute)
537
+ data.params.src = editor.documentBaseURI.toAbsolute(data.params.src);
538
+
539
+ // Create new object element
540
+ object = new Node('object', 1).attr({
541
+ id : node.attr('id'),
542
+ width: normalizeSize(node.attr('width')),
543
+ height: normalizeSize(node.attr('height')),
544
+ style : style
545
+ });
546
+
547
+ tinymce.each(rootAttributes, function(name) {
548
+ var value = data[name];
549
+
550
+ if (name == 'class' && value)
551
+ value = value.replace(/mceItem.+ ?/g, '');
552
+
553
+ if (value && name != 'type')
554
+ object.attr(name, value);
555
+ });
556
+
557
+ // Add params
558
+ for (name in data.params) {
559
+ param = new Node('param', 1);
560
+ param.shortEnded = true;
561
+ value = data.params[name];
562
+
563
+ // Windows media needs to use url instead of src for the media URL
564
+ if (name === 'src' && typeItem.name === 'WindowsMedia')
565
+ name = 'url';
566
+
567
+ param.attr({name: name, value: value});
568
+ object.append(param);
569
+ }
570
+
571
+ // Setup add type and classid if strict is disabled
572
+ if (this.editor.getParam('media_strict', true)) {
573
+ object.attr({
574
+ data: data.params.src,
575
+ type: typeItem.mimes[0]
576
+ });
577
+ } else {
578
+ object.attr({
579
+ classid: "clsid:" + typeItem.clsids[0],
580
+ codebase: typeItem.codebase
581
+ });
582
+
583
+ embed = new Node('embed', 1);
584
+ embed.shortEnded = true;
585
+ embed.attr({
586
+ id: node.attr('id'),
587
+ width: normalizeSize(node.attr('width')),
588
+ height: normalizeSize(node.attr('height')),
589
+ style : style,
590
+ type: typeItem.mimes[0]
591
+ });
592
+
593
+ for (name in data.params)
594
+ embed.attr(name, data.params[name]);
595
+
596
+ tinymce.each(rootAttributes, function(name) {
597
+ if (data[name] && name != 'type')
598
+ embed.attr(name, data[name]);
599
+ });
600
+
601
+ object.append(embed);
602
+ }
603
+
604
+ // Insert raw HTML
605
+ if (data.object_html) {
606
+ value = new Node('#text', 3);
607
+ value.raw = true;
608
+ value.value = data.object_html;
609
+ object.append(value);
610
+ }
611
+
612
+ // Append object to video element if it exists
613
+ if (video)
614
+ video.append(object);
615
+ }
616
+
617
+ if (video) {
618
+ // Insert raw HTML
619
+ if (data.video_html) {
620
+ value = new Node('#text', 3);
621
+ value.raw = true;
622
+ value.value = data.video_html;
623
+ video.append(value);
624
+ }
625
+ }
626
+
627
+ if (audio) {
628
+ // Insert raw HTML
629
+ if (data.video_html) {
630
+ value = new Node('#text', 3);
631
+ value.raw = true;
632
+ value.value = data.video_html;
633
+ audio.append(value);
634
+ }
635
+ }
636
+
637
+ var n = video || audio || object || embed;
638
+ if (n)
639
+ node.replace(n);
640
+ else
641
+ node.remove();
642
+ },
643
+
644
+ /**
645
+ * Converts a tinymce.html.Node video/object/embed to an img element.
646
+ *
647
+ * The video/object/embed will be converted into an image placeholder with a JSON data attribute like this:
648
+ * <img class="mceItemMedia mceItemFlash" width="100" height="100" data-mce-json="{..}" />
649
+ *
650
+ * The JSON structure will be like this:
651
+ * {'params':{'flashvars':'something','quality':'high','src':'someurl'}, 'video':{'sources':[{src: 'someurl', type: 'video/mp4'}]}}
652
+ */
653
+ objectToImg : function(node) {
654
+ var object, embed, video, iframe, img, name, id, width, height, style, i, html,
655
+ param, params, source, sources, data, type, lookup = this.lookup,
656
+ matches, attrs, urlConverter = this.editor.settings.url_converter,
657
+ urlConverterScope = this.editor.settings.url_converter_scope,
658
+ hspace, vspace, align, bgcolor;
659
+
660
+ function getInnerHTML(node) {
661
+ return new tinymce.html.Serializer({
662
+ inner: true,
663
+ validate: false
664
+ }).serialize(node);
665
+ };
666
+
667
+ function lookupAttribute(o, attr) {
668
+ return lookup[(o.attr(attr) || '').toLowerCase()];
669
+ }
670
+
671
+ function lookupExtension(src) {
672
+ var ext = src.replace(/^.*\.([^.]+)$/, '$1');
673
+ return lookup[ext.toLowerCase() || ''];
674
+ }
675
+
676
+ // If node isn't in document
677
+ if (!node.parent)
678
+ return;
679
+
680
+ // Handle media scripts
681
+ if (node.name === 'script') {
682
+ if (node.firstChild)
683
+ matches = scriptRegExp.exec(node.firstChild.value);
684
+
685
+ if (!matches)
686
+ return;
687
+
688
+ type = matches[1];
689
+ data = {video : {}, params : JSON.parse(matches[2])};
690
+ width = data.params.width;
691
+ height = data.params.height;
692
+ }
693
+
694
+ // Setup data objects
695
+ data = data || {
696
+ video : {},
697
+ params : {}
698
+ };
699
+
700
+ // Setup new image object
701
+ img = new Node('img', 1);
702
+ img.attr({
703
+ src : this.editor.theme.url + '/img/trans.gif'
704
+ });
705
+
706
+ // Video element
707
+ name = node.name;
708
+ if (name === 'video' || name == 'audio') {
709
+ video = node;
710
+ object = node.getAll('object')[0];
711
+ embed = node.getAll('embed')[0];
712
+ width = video.attr('width');
713
+ height = video.attr('height');
714
+ id = video.attr('id');
715
+ data.video = {attrs : {}, sources : []};
716
+
717
+ // Get all video attributes
718
+ attrs = data.video.attrs;
719
+ for (name in video.attributes.map)
720
+ attrs[name] = video.attributes.map[name];
721
+
722
+ source = node.attr('src');
723
+ if (source)
724
+ data.video.sources.push({src : urlConverter.call(urlConverterScope, source, 'src', node.name)});
725
+
726
+ // Get all sources
727
+ sources = video.getAll("source");
728
+ for (i = 0; i < sources.length; i++) {
729
+ source = sources[i].remove();
730
+
731
+ data.video.sources.push({
732
+ src: urlConverter.call(urlConverterScope, source.attr('src'), 'src', 'source'),
733
+ type: source.attr('type'),
734
+ media: source.attr('media')
735
+ });
736
+ }
737
+
738
+ // Convert the poster URL
739
+ if (attrs.poster)
740
+ attrs.poster = urlConverter.call(urlConverterScope, attrs.poster, 'poster', node.name);
741
+ }
742
+
743
+ // Object element
744
+ if (node.name === 'object') {
745
+ object = node;
746
+ embed = node.getAll('embed')[0];
747
+ }
748
+
749
+ // Embed element
750
+ if (node.name === 'embed')
751
+ embed = node;
752
+
753
+ // Iframe element
754
+ if (node.name === 'iframe') {
755
+ iframe = node;
756
+ type = 'Iframe';
757
+ }
758
+
759
+ if (object) {
760
+ // Get width/height
761
+ width = width || object.attr('width');
762
+ height = height || object.attr('height');
763
+ style = style || object.attr('style');
764
+ id = id || object.attr('id');
765
+ hspace = hspace || object.attr('hspace');
766
+ vspace = vspace || object.attr('vspace');
767
+ align = align || object.attr('align');
768
+ bgcolor = bgcolor || object.attr('bgcolor');
769
+ data.name = object.attr('name');
770
+
771
+ // Get all object params
772
+ params = object.getAll("param");
773
+ for (i = 0; i < params.length; i++) {
774
+ param = params[i];
775
+ name = param.remove().attr('name');
776
+
777
+ if (!excludedAttrs[name])
778
+ data.params[name] = param.attr('value');
779
+ }
780
+
781
+ data.params.src = data.params.src || object.attr('data');
782
+ }
783
+
784
+ if (embed) {
785
+ // Get width/height
786
+ width = width || embed.attr('width');
787
+ height = height || embed.attr('height');
788
+ style = style || embed.attr('style');
789
+ id = id || embed.attr('id');
790
+ hspace = hspace || embed.attr('hspace');
791
+ vspace = vspace || embed.attr('vspace');
792
+ align = align || embed.attr('align');
793
+ bgcolor = bgcolor || embed.attr('bgcolor');
794
+
795
+ // Get all embed attributes
796
+ for (name in embed.attributes.map) {
797
+ if (!excludedAttrs[name] && !data.params[name])
798
+ data.params[name] = embed.attributes.map[name];
799
+ }
800
+ }
801
+
802
+ if (iframe) {
803
+ // Get width/height
804
+ width = normalizeSize(iframe.attr('width'));
805
+ height = normalizeSize(iframe.attr('height'));
806
+ style = style || iframe.attr('style');
807
+ id = iframe.attr('id');
808
+ hspace = iframe.attr('hspace');
809
+ vspace = iframe.attr('vspace');
810
+ align = iframe.attr('align');
811
+ bgcolor = iframe.attr('bgcolor');
812
+
813
+ tinymce.each(rootAttributes, function(name) {
814
+ img.attr(name, iframe.attr(name));
815
+ });
816
+
817
+ // Get all iframe attributes
818
+ for (name in iframe.attributes.map) {
819
+ if (!excludedAttrs[name] && !data.params[name])
820
+ data.params[name] = iframe.attributes.map[name];
821
+ }
822
+ }
823
+
824
+ // Use src not movie
825
+ if (data.params.movie) {
826
+ data.params.src = data.params.src || data.params.movie;
827
+ delete data.params.movie;
828
+ }
829
+
830
+ // Convert the URL to relative/absolute depending on configuration
831
+ if (data.params.src)
832
+ data.params.src = urlConverter.call(urlConverterScope, data.params.src, 'src', 'object');
833
+
834
+ if (video) {
835
+ if (node.name === 'video')
836
+ type = lookup.video.name;
837
+ else if (node.name === 'audio')
838
+ type = lookup.audio.name;
839
+ }
840
+
841
+ if (object && !type)
842
+ type = (lookupAttribute(object, 'clsid') || lookupAttribute(object, 'classid') || lookupAttribute(object, 'type') || {}).name;
843
+
844
+ if (embed && !type)
845
+ type = (lookupAttribute(embed, 'type') || lookupExtension(data.params.src) || {}).name;
846
+
847
+ // for embedded audio we preserve the original specified type
848
+ if (embed && type == 'EmbeddedAudio') {
849
+ data.params.type = embed.attr('type');
850
+ }
851
+
852
+ // Replace the video/object/embed element with a placeholder image containing the data
853
+ node.replace(img);
854
+
855
+ // Remove embed
856
+ if (embed)
857
+ embed.remove();
858
+
859
+ // Serialize the inner HTML of the object element
860
+ if (object) {
861
+ html = getInnerHTML(object.remove());
862
+
863
+ if (html)
864
+ data.object_html = html;
865
+ }
866
+
867
+ // Serialize the inner HTML of the video element
868
+ if (video) {
869
+ html = getInnerHTML(video.remove());
870
+
871
+ if (html)
872
+ data.video_html = html;
873
+ }
874
+
875
+ data.hspace = hspace;
876
+ data.vspace = vspace;
877
+ data.align = align;
878
+ data.bgcolor = bgcolor;
879
+
880
+ // Set width/height of placeholder
881
+ img.attr({
882
+ id : id,
883
+ 'class' : 'mceItemMedia mceItem' + (type || 'Flash'),
884
+ style : style,
885
+ width : width || (node.name == 'audio' ? "300" : "320"),
886
+ height : height || (node.name == 'audio' ? "32" : "240"),
887
+ hspace : hspace,
888
+ vspace : vspace,
889
+ align : align,
890
+ bgcolor : bgcolor,
891
+ "data-mce-json" : JSON.serialize(data, "'")
892
+ });
893
+ }
894
+ });
895
+
896
+ // Register plugin
897
+ tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin);
898
+ })();