xmt_froala 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +2 -0
  5. data/app/assets/javascripts/xmt_froala.js +31 -0
  6. data/app/assets/stylesheets/xmt_froala.css +17 -0
  7. data/app/controllers/xmt_froala/application_controller.rb +5 -0
  8. data/app/controllers/xmt_froala/assets_controller.rb +94 -0
  9. data/app/models/xmt_froala/asset_uploader.rb +107 -0
  10. data/app/models/xmt_froala/file_uploader.rb +10 -0
  11. data/app/models/xmt_froala/flash_uploader.rb +10 -0
  12. data/app/models/xmt_froala/image_uploader.rb +10 -0
  13. data/app/models/xmt_froala/media_uploader.rb +10 -0
  14. data/config/routes.rb +6 -0
  15. data/lib/generators/xmt_froala/install/USAGE +10 -0
  16. data/lib/generators/xmt_froala/install/install_generator.rb +23 -0
  17. data/lib/generators/xmt_froala/install/templates/application.js +17 -0
  18. data/lib/generators/xmt_froala/install/templates/xmt_froala.rb +29 -0
  19. data/lib/generators/xmt_froala/migration/USAGE +14 -0
  20. data/lib/generators/xmt_froala/migration/migration_generator.rb +36 -0
  21. data/lib/generators/xmt_froala/migration/templates/migration/migration.rb +18 -0
  22. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/asset.rb +14 -0
  23. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/file.rb +3 -0
  24. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/flash.rb +3 -0
  25. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/image.rb +3 -0
  26. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/media.rb +3 -0
  27. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/asset.rb +27 -0
  28. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/file.rb +3 -0
  29. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/flash.rb +3 -0
  30. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/image.rb +3 -0
  31. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/media.rb +3 -0
  32. data/lib/tasks/xmt_froala_tasks.rake +9 -0
  33. data/lib/xmt_froala.rb +65 -0
  34. data/lib/xmt_froala/active_record.rb +14 -0
  35. data/lib/xmt_froala/engine.rb +32 -0
  36. data/lib/xmt_froala/formtastic.rb +12 -0
  37. data/lib/xmt_froala/helper.rb +105 -0
  38. data/lib/xmt_froala/simple_form.rb +11 -0
  39. data/lib/xmt_froala/version.rb +3 -0
  40. data/vendor/assets/javascripts/xmt_froala/froala_editor.js +0 -0
  41. data/vendor/assets/javascripts/xmt_froala/languages/ar.js +318 -0
  42. data/vendor/assets/javascripts/xmt_froala/languages/bs.js +318 -0
  43. data/vendor/assets/javascripts/xmt_froala/languages/cs.js +318 -0
  44. data/vendor/assets/javascripts/xmt_froala/languages/da.js +318 -0
  45. data/vendor/assets/javascripts/xmt_froala/languages/de.js +318 -0
  46. data/vendor/assets/javascripts/xmt_froala/languages/en_ca.js +262 -0
  47. data/vendor/assets/javascripts/xmt_froala/languages/en_gb.js +262 -0
  48. data/vendor/assets/javascripts/xmt_froala/languages/es.js +318 -0
  49. data/vendor/assets/javascripts/xmt_froala/languages/et.js +318 -0
  50. data/vendor/assets/javascripts/xmt_froala/languages/fa.js +318 -0
  51. data/vendor/assets/javascripts/xmt_froala/languages/fi.js +318 -0
  52. data/vendor/assets/javascripts/xmt_froala/languages/fr.js +318 -0
  53. data/vendor/assets/javascripts/xmt_froala/languages/he.js +318 -0
  54. data/vendor/assets/javascripts/xmt_froala/languages/hr.js +318 -0
  55. data/vendor/assets/javascripts/xmt_froala/languages/hu.js +318 -0
  56. data/vendor/assets/javascripts/xmt_froala/languages/id.js +319 -0
  57. data/vendor/assets/javascripts/xmt_froala/languages/it.js +318 -0
  58. data/vendor/assets/javascripts/xmt_froala/languages/ja.js +318 -0
  59. data/vendor/assets/javascripts/xmt_froala/languages/ko.js +318 -0
  60. data/vendor/assets/javascripts/xmt_froala/languages/me.js +318 -0
  61. data/vendor/assets/javascripts/xmt_froala/languages/nb.js +318 -0
  62. data/vendor/assets/javascripts/xmt_froala/languages/nl.js +318 -0
  63. data/vendor/assets/javascripts/xmt_froala/languages/pl.js +318 -0
  64. data/vendor/assets/javascripts/xmt_froala/languages/pt_br.js +318 -0
  65. data/vendor/assets/javascripts/xmt_froala/languages/pt_pt.js +318 -0
  66. data/vendor/assets/javascripts/xmt_froala/languages/ro.js +319 -0
  67. data/vendor/assets/javascripts/xmt_froala/languages/ru.js +318 -0
  68. data/vendor/assets/javascripts/xmt_froala/languages/sk.js +318 -0
  69. data/vendor/assets/javascripts/xmt_froala/languages/sr.js +318 -0
  70. data/vendor/assets/javascripts/xmt_froala/languages/sv.js +318 -0
  71. data/vendor/assets/javascripts/xmt_froala/languages/th.js +318 -0
  72. data/vendor/assets/javascripts/xmt_froala/languages/tr.js +318 -0
  73. data/vendor/assets/javascripts/xmt_froala/languages/uk.js +318 -0
  74. data/vendor/assets/javascripts/xmt_froala/languages/vi.js +258 -0
  75. data/vendor/assets/javascripts/xmt_froala/languages/zh_cn.js +320 -0
  76. data/vendor/assets/javascripts/xmt_froala/languages/zh_tw.js +318 -0
  77. data/vendor/assets/javascripts/xmt_froala/plugins/align.js +139 -0
  78. data/vendor/assets/javascripts/xmt_froala/plugins/align.min.js +7 -0
  79. data/vendor/assets/javascripts/xmt_froala/plugins/char_counter.js +154 -0
  80. data/vendor/assets/javascripts/xmt_froala/plugins/char_counter.min.js +7 -0
  81. data/vendor/assets/javascripts/xmt_froala/plugins/code_beautifier.js +3270 -0
  82. data/vendor/assets/javascripts/xmt_froala/plugins/code_beautifier.min.js +7 -0
  83. data/vendor/assets/javascripts/xmt_froala/plugins/code_view.js +393 -0
  84. data/vendor/assets/javascripts/xmt_froala/plugins/code_view.min.js +7 -0
  85. data/vendor/assets/javascripts/xmt_froala/plugins/colors.js +492 -0
  86. data/vendor/assets/javascripts/xmt_froala/plugins/colors.min.js +7 -0
  87. data/vendor/assets/javascripts/xmt_froala/plugins/draggable.js +459 -0
  88. data/vendor/assets/javascripts/xmt_froala/plugins/draggable.min.js +7 -0
  89. data/vendor/assets/javascripts/xmt_froala/plugins/emoticons.js +509 -0
  90. data/vendor/assets/javascripts/xmt_froala/plugins/emoticons.min.js +7 -0
  91. data/vendor/assets/javascripts/xmt_froala/plugins/entities.js +121 -0
  92. data/vendor/assets/javascripts/xmt_froala/plugins/entities.min.js +7 -0
  93. data/vendor/assets/javascripts/xmt_froala/plugins/file.js +736 -0
  94. data/vendor/assets/javascripts/xmt_froala/plugins/file.min.js +239 -0
  95. data/vendor/assets/javascripts/xmt_froala/plugins/font_family.js +182 -0
  96. data/vendor/assets/javascripts/xmt_froala/plugins/font_family.min.js +7 -0
  97. data/vendor/assets/javascripts/xmt_froala/plugins/font_size.js +118 -0
  98. data/vendor/assets/javascripts/xmt_froala/plugins/font_size.min.js +7 -0
  99. data/vendor/assets/javascripts/xmt_froala/plugins/forms.js +430 -0
  100. data/vendor/assets/javascripts/xmt_froala/plugins/forms.min.js +7 -0
  101. data/vendor/assets/javascripts/xmt_froala/plugins/fullscreen.js +274 -0
  102. data/vendor/assets/javascripts/xmt_froala/plugins/fullscreen.min.js +7 -0
  103. data/vendor/assets/javascripts/xmt_froala/plugins/help.js +216 -0
  104. data/vendor/assets/javascripts/xmt_froala/plugins/help.min.js +7 -0
  105. data/vendor/assets/javascripts/xmt_froala/plugins/image.js +3323 -0
  106. data/vendor/assets/javascripts/xmt_froala/plugins/image.min.js +7 -0
  107. data/vendor/assets/javascripts/xmt_froala/plugins/image_manager.js +1056 -0
  108. data/vendor/assets/javascripts/xmt_froala/plugins/image_manager.min.js +7 -0
  109. data/vendor/assets/javascripts/xmt_froala/plugins/inline_style.js +94 -0
  110. data/vendor/assets/javascripts/xmt_froala/plugins/inline_style.min.js +7 -0
  111. data/vendor/assets/javascripts/xmt_froala/plugins/line_breaker.js +537 -0
  112. data/vendor/assets/javascripts/xmt_froala/plugins/line_breaker.min.js +7 -0
  113. data/vendor/assets/javascripts/xmt_froala/plugins/link.js +1157 -0
  114. data/vendor/assets/javascripts/xmt_froala/plugins/link.min.js +7 -0
  115. data/vendor/assets/javascripts/xmt_froala/plugins/lists.js +462 -0
  116. data/vendor/assets/javascripts/xmt_froala/plugins/lists.min.js +7 -0
  117. data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_format.js +290 -0
  118. data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_format.min.js +7 -0
  119. data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_style.js +144 -0
  120. data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_style.min.js +7 -0
  121. data/vendor/assets/javascripts/xmt_froala/plugins/plain_paste.js +96 -0
  122. data/vendor/assets/javascripts/xmt_froala/plugins/print.js +137 -0
  123. data/vendor/assets/javascripts/xmt_froala/plugins/print.min.js +7 -0
  124. data/vendor/assets/javascripts/xmt_froala/plugins/quick_format.js +89 -0
  125. data/vendor/assets/javascripts/xmt_froala/plugins/quick_insert.js +478 -0
  126. data/vendor/assets/javascripts/xmt_froala/plugins/quick_insert.min.js +7 -0
  127. data/vendor/assets/javascripts/xmt_froala/plugins/quote.js +141 -0
  128. data/vendor/assets/javascripts/xmt_froala/plugins/quote.min.js +7 -0
  129. data/vendor/assets/javascripts/xmt_froala/plugins/save.js +189 -0
  130. data/vendor/assets/javascripts/xmt_froala/plugins/save.min.js +7 -0
  131. data/vendor/assets/javascripts/xmt_froala/plugins/special_characters.js +781 -0
  132. data/vendor/assets/javascripts/xmt_froala/plugins/special_characters.min.js +7 -0
  133. data/vendor/assets/javascripts/xmt_froala/plugins/table.js +4194 -0
  134. data/vendor/assets/javascripts/xmt_froala/plugins/table.min.js +7 -0
  135. data/vendor/assets/javascripts/xmt_froala/plugins/url.js +194 -0
  136. data/vendor/assets/javascripts/xmt_froala/plugins/url.min.js +7 -0
  137. data/vendor/assets/javascripts/xmt_froala/plugins/video.js +2342 -0
  138. data/vendor/assets/javascripts/xmt_froala/plugins/video.min.js +7 -0
  139. data/vendor/assets/javascripts/xmt_froala/plugins/word_paste.js +1403 -0
  140. data/vendor/assets/javascripts/xmt_froala/plugins/word_paste.min.js +7 -0
  141. data/vendor/assets/javascripts/xmt_froala/third_party/embedly.js +543 -0
  142. data/vendor/assets/javascripts/xmt_froala/third_party/embedly.min.js +7 -0
  143. data/vendor/assets/javascripts/xmt_froala/third_party/image_aviary.js +163 -0
  144. data/vendor/assets/javascripts/xmt_froala/third_party/image_aviary.min.js +7 -0
  145. data/vendor/assets/javascripts/xmt_froala/third_party/spell_checker.js +222 -0
  146. data/vendor/assets/javascripts/xmt_froala/third_party/spell_checker.min.js +7 -0
  147. data/vendor/assets/javascripts/xmt_froala/xmt_froala.js +15172 -0
  148. data/vendor/assets/stylesheets/xmt_froala/css/font-awesome.css +2546 -0
  149. data/vendor/assets/stylesheets/xmt_froala/css/froala_editor.min.css +7 -0
  150. data/vendor/assets/stylesheets/xmt_froala/css/froala_editor.pkgd.css +2902 -0
  151. data/vendor/assets/stylesheets/xmt_froala/css/froala_editor.pkgd.min.css +7 -0
  152. data/vendor/assets/stylesheets/xmt_froala/css/froala_style.css +413 -0
  153. data/vendor/assets/stylesheets/xmt_froala/css/froala_style.min.css +7 -0
  154. data/vendor/assets/stylesheets/xmt_froala/css/plugins/char_counter.css +57 -0
  155. data/vendor/assets/stylesheets/xmt_froala/css/plugins/char_counter.min.css +7 -0
  156. data/vendor/assets/stylesheets/xmt_froala/css/plugins/code_view.css +112 -0
  157. data/vendor/assets/stylesheets/xmt_froala/css/plugins/code_view.min.css +7 -0
  158. data/vendor/assets/stylesheets/xmt_froala/css/plugins/colors.css +155 -0
  159. data/vendor/assets/stylesheets/xmt_froala/css/plugins/colors.min.css +7 -0
  160. data/vendor/assets/stylesheets/xmt_froala/css/plugins/draggable.css +43 -0
  161. data/vendor/assets/stylesheets/xmt_froala/css/plugins/draggable.min.css +7 -0
  162. data/vendor/assets/stylesheets/xmt_froala/css/plugins/emoticons.css +42 -0
  163. data/vendor/assets/stylesheets/xmt_froala/css/plugins/emoticons.min.css +7 -0
  164. data/vendor/assets/stylesheets/xmt_froala/css/plugins/file.css +146 -0
  165. data/vendor/assets/stylesheets/xmt_froala/css/plugins/file.min.css +7 -0
  166. data/vendor/assets/stylesheets/xmt_froala/css/plugins/fullscreen.css +28 -0
  167. data/vendor/assets/stylesheets/xmt_froala/css/plugins/fullscreen.min.css +7 -0
  168. data/vendor/assets/stylesheets/xmt_froala/css/plugins/help.css +52 -0
  169. data/vendor/assets/stylesheets/xmt_froala/css/plugins/help.min.css +7 -0
  170. data/vendor/assets/stylesheets/xmt_froala/css/plugins/image.css +244 -0
  171. data/vendor/assets/stylesheets/xmt_froala/css/plugins/image.min.css +7 -0
  172. data/vendor/assets/stylesheets/xmt_froala/css/plugins/image_manager.css +266 -0
  173. data/vendor/assets/stylesheets/xmt_froala/css/plugins/image_manager.min.css +7 -0
  174. data/vendor/assets/stylesheets/xmt_froala/css/plugins/line_breaker.css +37 -0
  175. data/vendor/assets/stylesheets/xmt_froala/css/plugins/line_breaker.min.css +7 -0
  176. data/vendor/assets/stylesheets/xmt_froala/css/plugins/quick_insert.css +70 -0
  177. data/vendor/assets/stylesheets/xmt_froala/css/plugins/quick_insert.min.css +7 -0
  178. data/vendor/assets/stylesheets/xmt_froala/css/plugins/special_characters.css +51 -0
  179. data/vendor/assets/stylesheets/xmt_froala/css/plugins/special_characters.min.css +7 -0
  180. data/vendor/assets/stylesheets/xmt_froala/css/plugins/table.css +181 -0
  181. data/vendor/assets/stylesheets/xmt_froala/css/plugins/table.min.css +7 -0
  182. data/vendor/assets/stylesheets/xmt_froala/css/plugins/video.css +231 -0
  183. data/vendor/assets/stylesheets/xmt_froala/css/plugins/video.min.css +7 -0
  184. data/vendor/assets/stylesheets/xmt_froala/css/themes/dark.css +1281 -0
  185. data/vendor/assets/stylesheets/xmt_froala/css/themes/dark.min.css +7 -0
  186. data/vendor/assets/stylesheets/xmt_froala/css/themes/gray.css +1281 -0
  187. data/vendor/assets/stylesheets/xmt_froala/css/themes/gray.min.css +7 -0
  188. data/vendor/assets/stylesheets/xmt_froala/css/themes/red.css +1281 -0
  189. data/vendor/assets/stylesheets/xmt_froala/css/themes/red.min.css +7 -0
  190. data/vendor/assets/stylesheets/xmt_froala/css/themes/royal.css +1281 -0
  191. data/vendor/assets/stylesheets/xmt_froala/css/themes/royal.min.css +7 -0
  192. data/vendor/assets/stylesheets/xmt_froala/css/third_party/embedly.css +64 -0
  193. data/vendor/assets/stylesheets/xmt_froala/css/third_party/embedly.min.css +7 -0
  194. data/vendor/assets/stylesheets/xmt_froala/css/third_party/spell_checker.css +72 -0
  195. data/vendor/assets/stylesheets/xmt_froala/css/third_party/spell_checker.min.css +7 -0
  196. data/vendor/assets/stylesheets/xmt_froala/css/xmt_froala.css +1423 -0
  197. data/vendor/assets/stylesheets/xmt_froala/fonts/FontAwesome.otf +0 -0
  198. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.eot +0 -0
  199. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.svg +2671 -0
  200. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.ttf +0 -0
  201. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.woff +0 -0
  202. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.woff2 +0 -0
  203. metadata +273 -0
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * froala_editor v2.8.1 (https://www.froala.com/wysiwyg-editor)
3
+ * License https://froala.com/wysiwyg-editor/terms/
4
+ * Copyright 2014-2018 Froala Labs
5
+ */
6
+
7
+ !function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=function(e,t){return t===undefined&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),a(t)}:a(window.jQuery)}(function(be){be.extend(be.FE.POPUP_TEMPLATES,{"image.insert":"[_BUTTONS_][_UPLOAD_LAYER_][_BY_URL_LAYER_][_PROGRESS_BAR_]","image.edit":"[_BUTTONS_]","image.alt":"[_BUTTONS_][_ALT_LAYER_]","image.size":"[_BUTTONS_][_SIZE_LAYER_]"}),be.extend(be.FE.DEFAULTS,{imageInsertButtons:["imageBack","|","imageUpload","imageByURL"],imageEditButtons:["imageReplace","imageAlign","imageCaption","imageRemove","|","imageLink","linkOpen","linkEdit","linkRemove","-","imageDisplay","imageStyle","imageAlt","imageSize"],imageAltButtons:["imageBack","|"],imageSizeButtons:["imageBack","|"],imageUpload:!0,imageUploadURL:"https://i.froala.com/upload",imageCORSProxy:"https://cors-anywhere.froala.com",imageUploadRemoteUrls:!0,imageUploadParam:"file",imageUploadParams:{},imageUploadToS3:!1,imageUploadMethod:"POST",imageMaxSize:10485760,imageAllowedTypes:["jpeg","jpg","png","gif"],imageResize:!0,imageResizeWithPercent:!1,imageRoundPercent:!1,imageDefaultWidth:300,imageDefaultAlign:"center",imageDefaultDisplay:"block",imageSplitHTML:!1,imageStyles:{"fr-rounded":"Rounded","fr-bordered":"Bordered","fr-shadow":"Shadow"},imageMove:!0,imageMultipleStyles:!0,imageTextNear:!0,imagePaste:!0,imagePasteProcess:!1,imageMinWidth:16,imageOutputSize:!1,imageDefaultMargin:5}),be.FE.PLUGINS.image=function(p){var g,l,f,d,o,a,t=!1,i=1,c=2,u=3,m=4,n=5,h=6,v=8,r={};function b(){var e=p.popups.get("image.insert").find(".fr-image-by-url-layer input");e.val(""),g&&e.val(g.attr("src")),e.trigger("change")}function s(){var e=p.popups.get("image.edit");if(e||(e=U()),e){var t=he();ve()&&(t=t.find(".fr-img-wrap")),p.popups.setContainer("image.edit",p.$sc),p.popups.refresh("image.edit");var a=t.offset().left+t.outerWidth()/2,i=t.offset().top+t.outerHeight();p.popups.show("image.edit",a,i,t.outerHeight())}}function y(){I()}function e(){for(var e,t,a="IMG"==p.el.tagName?[p.el]:p.el.querySelectorAll("img"),i=0;i<a.length;i++){var r=be(a[i]);!p.opts.htmlUntouched&&p.opts.useClasses?((p.opts.imageDefaultAlign||p.opts.imageDefaultDisplay)&&(0<(t=r).parents(".fr-img-caption").length&&(t=t.parents(".fr-img-caption:first")),t.hasClass("fr-dii")||t.hasClass("fr-dib")||(t.addClass("fr-fi"+ge(t)[0]),t.addClass("fr-di"+de(t)[0]),t.css("margin",""),t.css("float",""),t.css("display",""),t.css("z-index",""),t.css("position",""),t.css("overflow",""),t.css("vertical-align",""))),p.opts.imageTextNear||(0<r.parents(".fr-img-caption").length?r.parents(".fr-img-caption:first").removeClass("fr-dii").addClass("fr-dib"):r.removeClass("fr-dii").addClass("fr-dib"))):p.opts.htmlUntouched||p.opts.useClasses||(p.opts.imageDefaultAlign||p.opts.imageDefaultDisplay)&&(0<(e=r).parents(".fr-img-caption").length&&(e=e.parents(".fr-img-caption:first")),pe(e,e.hasClass("fr-dib")?"block":e.hasClass("fr-dii")?"inline":null,e.hasClass("fr-fil")?"left":e.hasClass("fr-fir")?"right":ge(e)),e.removeClass("fr-dib fr-dii fr-fir fr-fil")),p.opts.iframe&&r.on("load",p.size.syncIframe)}}function w(e){void 0===e&&(e=!0);var t,a=Array.prototype.slice.call(p.el.querySelectorAll("img")),i=[];for(t=0;t<a.length;t++)if(i.push(a[t].getAttribute("src")),be(a[t]).toggleClass("fr-draggable",p.opts.imageMove),""===a[t].getAttribute("class")&&a[t].removeAttribute("class"),""===a[t].getAttribute("style")&&a[t].removeAttribute("style"),a[t].parentNode&&a[t].parentNode.parentNode&&p.node.hasClass(a[t].parentNode.parentNode,"fr-img-caption")){var r=a[t].parentNode.parentNode;p.browser.mozilla||r.setAttribute("contenteditable",!1),r.setAttribute("draggable",!1),r.classList.add("fr-draggable");var s=a[t].nextSibling;s&&s.setAttribute("contenteditable",!0)}if(o)for(t=0;t<o.length;t++)i.indexOf(o[t].getAttribute("src"))<0&&p.events.trigger("image.removed",[be(o[t])]);if(o&&e){var n=[];for(t=0;t<o.length;t++)n.push(o[t].getAttribute("src"));for(t=0;t<a.length;t++)n.indexOf(a[t].getAttribute("src"))<0&&p.events.trigger("image.loaded",[be(a[t])])}o=a}function E(){if(l||function(){var e;p.shared.$image_resizer?(l=p.shared.$image_resizer,d=p.shared.$img_overlay,p.events.on("destroy",function(){l.removeClass("fr-active").appendTo(be("body:first"))},!0)):(p.shared.$image_resizer=be('<div class="fr-image-resizer"></div>'),l=p.shared.$image_resizer,p.events.$on(l,"mousedown",function(e){e.stopPropagation()},!0),p.opts.imageResize&&(l.append(C("nw")+C("ne")+C("sw")+C("se")),p.shared.$img_overlay=be('<div class="fr-image-overlay"></div>'),d=p.shared.$img_overlay,e=l.get(0).ownerDocument,be(e).find("body:first").append(d)));p.events.on("shared.destroy",function(){l.html("").removeData().remove(),l=null,p.opts.imageResize&&(d.remove(),d=null)},!0),p.helpers.isMobile()||p.events.$on(be(p.o_win),"resize",function(){g&&!g.hasClass("fr-uploading")?ne(!0):g&&(E(),ce(),$(!1))});if(p.opts.imageResize){e=l.get(0).ownerDocument,p.events.$on(l,p._mousedown,".fr-handler",R),p.events.$on(be(e),p._mousemove,S),p.events.$on(be(e.defaultView||e.parentWindow),p._mouseup,D),p.events.$on(d,"mouseleave",D);var i=1,r=null,s=0;p.events.on("keydown",function(e){if(g){var t=-1!=navigator.userAgent.indexOf("Mac OS X")?e.metaKey:e.ctrlKey,a=e.which;(a!==r||200<e.timeStamp-s)&&(i=1),(a==be.FE.KEYCODE.EQUALS||p.browser.mozilla&&a==be.FE.KEYCODE.FF_EQUALS)&&t&&!e.altKey?i=V.call(this,e,1,1,i):(a==be.FE.KEYCODE.HYPHEN||p.browser.mozilla&&a==be.FE.KEYCODE.FF_HYPHEN)&&t&&!e.altKey?i=V.call(this,e,2,-1,i):p.keys.ctrlKey(e)||a!=be.FE.KEYCODE.ENTER||(g.before("<br>"),F(g)),r=a,s=e.timeStamp}},!0),p.events.on("keyup",function(){i=1})}}(),!g)return!1;var e=p.$wp||p.$sc;e.append(l),l.data("instance",p);var t=e.scrollTop()-("static"!=e.css("position")?e.offset().top:0),a=e.scrollLeft()-("static"!=e.css("position")?e.offset().left:0);a-=p.helpers.getPX(e.css("border-left-width")),t-=p.helpers.getPX(e.css("border-top-width")),p.$el.is("img")&&p.$sc.is("body")&&(a=t=0);var i=he();ve()&&(i=i.find(".fr-img-wrap")),l.css("top",(p.opts.iframe?i.offset().top:i.offset().top+t)-1).css("left",(p.opts.iframe?i.offset().left:i.offset().left+a)-1).css("width",i.get(0).getBoundingClientRect().width).css("height",i.get(0).getBoundingClientRect().height).addClass("fr-active")}function C(e){return'<div class="fr-handler fr-h'+e+'"></div>'}function A(e){ve()?g.parents(".fr-img-caption").css("width",e):g.css("width",e)}function R(e){if(!p.core.sameInstance(l))return!0;if(e.preventDefault(),e.stopPropagation(),p.$el.find("img.fr-error").left)return!1;p.undo.canDo()||p.undo.saveStep();var t=e.pageX||e.originalEvent.touches[0].pageX;if("mousedown"==e.type){var a=p.$oel.get(0).ownerDocument,i=a.defaultView||a.parentWindow,r=!1;try{r=i.location!=i.parent.location&&!(i.$&&i.$.FE)}catch(o){}r&&i.frameElement&&(t+=p.helpers.getPX(be(i.frameElement).offset().left)+i.frameElement.clientLeft)}(f=be(this)).data("start-x",t),f.data("start-width",g.width()),f.data("start-height",g.height());var s=g.width();if(p.opts.imageResizeWithPercent){var n=g.parentsUntil(p.$el,p.html.blockTagsQuery()).get(0)||p.el;s=(s/be(n).outerWidth()*100).toFixed(2)+"%"}A(s),d.show(),p.popups.hideAll(),fe()}function S(e){if(!p.core.sameInstance(l))return!0;var t;if(f&&g){if(e.preventDefault(),p.$el.find("img.fr-error").left)return!1;var a=e.pageX||(e.originalEvent.touches?e.originalEvent.touches[0].pageX:null);if(!a)return!1;var i=a-f.data("start-x"),r=f.data("start-width");if((f.hasClass("fr-hnw")||f.hasClass("fr-hsw"))&&(i=0-i),p.opts.imageResizeWithPercent){var s=g.parentsUntil(p.$el,p.html.blockTagsQuery()).get(0)||p.el;r=((r+i)/be(s).outerWidth()*100).toFixed(2),p.opts.imageRoundPercent&&(r=Math.round(r)),A(r+"%"),(t=ve()?(p.helpers.getPX(g.parents(".fr-img-caption").css("width"))/be(s).outerWidth()*100).toFixed(2):(p.helpers.getPX(g.css("width"))/be(s).outerWidth()*100).toFixed(2))===r||p.opts.imageRoundPercent||A(t+"%"),g.css("height","").removeAttr("height")}else r+i>=p.opts.imageMinWidth&&(A(r+i),t=ve()?p.helpers.getPX(g.parents(".fr-img-caption").css("width")):p.helpers.getPX(g.css("width"))),t!==r+i&&A(t),((g.attr("style")||"").match(/(^height:)|(; *height:)/)||g.attr("height"))&&(g.css("height",f.data("start-height")*g.width()/f.data("start-width")),g.removeAttr("height"));E(),p.events.trigger("image.resize",[me()])}}function D(e){if(!p.core.sameInstance(l))return!0;if(f&&g){if(e&&e.stopPropagation(),p.$el.find("img.fr-error").left)return!1;f=null,d.hide(),E(),s(),p.undo.saveStep(),p.events.trigger("image.resizeEnd",[me()])}}function x(e,t,a){p.edit.on(),g&&g.addClass("fr-error"),function(e){$();var t=p.popups.get("image.insert").find(".fr-image-progress-bar-layer");t.addClass("fr-error");var a=t.find("h3");a.text(e),p.events.disableBlur(),a.focus()}(p.language.translate("Something went wrong. Please try again.")),!g&&a&&Q(a),p.events.trigger("image.error",[{code:e,message:r[e]},t,a])}function U(e){if(e)return p.$wp&&p.events.$on(p.$wp,"scroll",function(){g&&p.popups.isVisible("image.edit")&&(p.events.disableBlur(),F(g))}),!0;var t="";if(0<p.opts.imageEditButtons.length){t+='<div class="fr-buttons">',t+=p.button.buildList(p.opts.imageEditButtons);var a={buttons:t+="</div>"};return p.popups.create("image.edit",a)}return!1}function $(e){var t=p.popups.get("image.insert");if(t||(t=K()),t.find(".fr-layer.fr-active").removeClass("fr-active").addClass("fr-pactive"),t.find(".fr-image-progress-bar-layer").addClass("fr-active"),t.find(".fr-buttons").hide(),g){var a=he();p.popups.setContainer("image.insert",p.$sc);var i=a.offset().left+a.width()/2,r=a.offset().top+a.height();p.popups.show("image.insert",i,r,a.outerHeight())}void 0===e&&k(p.language.translate("Uploading"),0)}function I(e){var t=p.popups.get("image.insert");if(t&&(t.find(".fr-layer.fr-pactive").addClass("fr-active").removeClass("fr-pactive"),t.find(".fr-image-progress-bar-layer").removeClass("fr-active"),t.find(".fr-buttons").show(),e||p.$el.find("img.fr-error").length)){if(p.events.focus(),p.$el.find("img.fr-error").length&&(p.$el.find("img.fr-error").remove(),p.undo.saveStep(),p.undo.run(),p.undo.dropRedo()),!p.$wp&&g){var a=g;ne(!0),p.selection.setAfter(a.get(0)),p.selection.restore()}p.popups.hide("image.insert")}}function k(e,t){var a=p.popups.get("image.insert");if(a){var i=a.find(".fr-image-progress-bar-layer");i.find("h3").text(e+(t?" "+t+"%":"")),i.removeClass("fr-error"),t?(i.find("div").removeClass("fr-indeterminate"),i.find("div > span").css("width",t+"%")):i.find("div").addClass("fr-indeterminate")}}function F(e){se.call(e.get(0))}function B(){var e=be(this);p.popups.hide("image.insert"),e.removeClass("fr-uploading"),e.next().is("br")&&e.next().remove(),F(e),p.events.trigger("image.loaded",[e])}function P(n,e,o,l,f){p.edit.off(),k(p.language.translate("Loading image")),e&&(n=p.helpers.sanitizeURL(n));var t=new Image;t.onload=function(){var e,t;if(l){p.undo.canDo()||l.hasClass("fr-uploading")||p.undo.saveStep();var a=l.data("fr-old-src");l.data("fr-image-pasted")&&(a=null),p.$wp?((e=l.clone().removeData("fr-old-src").removeClass("fr-uploading").removeAttr("data-fr-image-pasted")).off("load"),a&&l.attr("src",a),l.replaceWith(e)):e=l;for(var i=e.get(0).attributes,r=0;r<i.length;r++){var s=i[r];0===s.nodeName.indexOf("data-")&&e.removeAttr(s.nodeName)}if(void 0!==o)for(t in o)o.hasOwnProperty(t)&&"link"!=t&&e.attr("data-"+t,o[t]);e.on("load",B),e.attr("src",n),p.edit.on(),w(!1),p.undo.saveStep(),p.events.disableBlur(),p.$el.blur(),p.events.trigger(a?"image.replaced":"image.inserted",[e,f])}else e=M(n,o,B),w(!1),p.undo.saveStep(),p.$el.blur(),p.events.trigger("image.inserted",[e,f])},t.onerror=function(){x(i)},$(p.language.translate("Loading image")),t.src=n}function O(e){k(p.language.translate("Loading image"));var t=this.status,a=this.response,i=this.responseXML,r=this.responseText;try{if(p.opts.imageUploadToS3)if(201==t){var s=function(e){try{var t=be(e).find("Location").text(),a=be(e).find("Key").text();return!1===p.events.trigger("image.uploadedToS3",[t,a,e],!0)?(p.edit.on(),!1):t}catch(i){return x(m,e),!1}}(i);s&&P(s,!1,[],e,a||i)}else x(m,a||i,e);else if(200<=t&&t<300){var n=function(e){try{if(!1===p.events.trigger("image.uploaded",[e],!0))return p.edit.on(),!1;var t=JSON.parse(e);return t.link?t:(x(c,e),!1)}catch(a){return x(m,e),!1}}(r);n&&P(n.link,!1,n,e,a||r)}else x(u,a||r,e)}catch(o){x(m,a||r,e)}}function N(){x(m,this.response||this.responseText||this.responseXML)}function T(e){if(e.lengthComputable){var t=e.loaded/e.total*100|0;k(p.language.translate("Uploading"),t)}}function M(e,t,a){var i,r="";if(t&&void 0!==t)for(i in t)t.hasOwnProperty(i)&&"link"!=i&&(r+=" data-"+i+'="'+t[i]+'"');var s=p.opts.imageDefaultWidth;s&&"auto"!=s&&(s+=p.opts.imageResizeWithPercent?"%":"px");var n=be('<img src="'+e+'"'+r+(s?' style="width: '+s+';"':"")+">");pe(n,p.opts.imageDefaultDisplay,p.opts.imageDefaultAlign),n.on("load",a),n.on("error",function(){be(this).addClass("fr-error"),x(v)}),p.edit.on(),p.events.focus(!0),p.selection.restore(),p.undo.saveStep(),p.opts.imageSplitHTML?p.markers.split():p.markers.insert(),p.html.wrap();var o=p.$el.find(".fr-marker");return o.length?(o.parent().is("hr")&&o.parent().after(o),p.node.isLastSibling(o)&&o.parent().hasClass("fr-deletable")&&o.insertAfter(o.parent()),o.replaceWith(n)):p.$el.append(n),p.selection.clear(),n}function L(){p.edit.on(),I(!0)}function z(e,t){if(void 0!==e&&0<e.length){if(!1===p.events.trigger("image.beforeUpload",[e,t]))return!1;var a,i=e[0];if(i.name||(i.name=(new Date).getTime()+"."+(i.type||"image/jpeg").replace(/image\//g,"")),i.size>p.opts.imageMaxSize)return x(n),!1;if(p.opts.imageAllowedTypes.indexOf(i.type.replace(/image\//g,""))<0)return x(h),!1;if(p.drag_support.formdata&&(a=p.drag_support.formdata?new FormData:null),a){var r;if(!1!==p.opts.imageUploadToS3)for(r in a.append("key",p.opts.imageUploadToS3.keyStart+(new Date).getTime()+"-"+(i.name||"untitled")),a.append("success_action_status","201"),a.append("X-Requested-With","xhr"),a.append("Content-Type",i.type),p.opts.imageUploadToS3.params)p.opts.imageUploadToS3.params.hasOwnProperty(r)&&a.append(r,p.opts.imageUploadToS3.params[r]);for(r in p.opts.imageUploadParams)p.opts.imageUploadParams.hasOwnProperty(r)&&a.append(r,p.opts.imageUploadParams[r]);a.append(p.opts.imageUploadParam,i,i.name);var s=p.opts.imageUploadURL;p.opts.imageUploadToS3&&(s=p.opts.imageUploadToS3.uploadURL?p.opts.imageUploadToS3.uploadURL:"https://"+p.opts.imageUploadToS3.region+".amazonaws.com/"+p.opts.imageUploadToS3.bucket),function(t,a,e,r){function s(){var e=be(this);e.off("load"),e.addClass("fr-uploading"),e.next().is("br")&&e.next().remove(),p.placeholder.refresh(),F(e),E(),$(),p.edit.off(),t.onload=function(){O.call(t,e)},t.onerror=N,t.upload.onprogress=T,t.onabort=L,e.off("abortUpload").on("abortUpload",function(){4!=t.readyState&&t.abort()}),t.send(a)}var n=new FileReader;n.addEventListener("load",function(){var e=n.result;if(n.result.indexOf("svg+xml")<0){for(var t=atob(n.result.split(",")[1]),a=[],i=0;i<t.length;i++)a.push(t.charCodeAt(i));e=window.URL.createObjectURL(new Blob([new Uint8Array(a)],{type:"image/jpeg"}))}r?(r.on("load",s),r.one("error",function(){r.off("load"),r.attr("src",r.data("fr-old-src")),x(v)}),p.edit.on(),p.undo.saveStep(),r.data("fr-old-src",r.attr("src")),r.attr("src",e)):M(e,null,s)},!1),n.readAsDataURL(e)}(p.core.getXHR(s,p.opts.imageUploadMethod),a,i,t||g)}}}function _(e){if(e.is("img")&&0<e.parents(".fr-img-caption").length)return e.parents(".fr-img-caption")}function W(e){var t=e.originalEvent.dataTransfer;if(t&&t.files&&t.files.length){var a=t.files[0];if(a&&a.type&&-1!==a.type.indexOf("image")&&0<=p.opts.imageAllowedTypes.indexOf(a.type.replace(/image\//g,""))){if(!p.opts.imageUpload)return e.preventDefault(),e.stopPropagation(),!1;p.markers.remove(),p.markers.insertAtPoint(e.originalEvent),p.$el.find(".fr-marker").replaceWith(be.FE.MARKERS),0===p.$el.find(".fr-marker").length&&p.selection.setAtEnd(p.el),p.popups.hideAll();var i=p.popups.get("image.insert");i||(i=K()),p.popups.setContainer("image.insert",p.$sc);var r=e.originalEvent.pageX,s=e.originalEvent.pageY;return p.opts.iframe&&(s+=p.$iframe.offset().top,r+=p.$iframe.offset().left),p.popups.show("image.insert",r,s),$(),0<=p.opts.imageAllowedTypes.indexOf(a.type.replace(/image\//g,""))?(ne(!0),z(t.files)):x(h),e.preventDefault(),e.stopPropagation(),!1}}}function K(e){if(e)return p.popups.onRefresh("image.insert",b),p.popups.onHide("image.insert",y),!0;var t,a="";p.opts.imageUpload||p.opts.imageInsertButtons.splice(p.opts.imageInsertButtons.indexOf("imageUpload"),1),1<p.opts.imageInsertButtons.length&&(a='<div class="fr-buttons">'+p.button.buildList(p.opts.imageInsertButtons)+"</div>");var i=p.opts.imageInsertButtons.indexOf("imageUpload"),r=p.opts.imageInsertButtons.indexOf("imageByURL"),s="";0<=i&&(t=" fr-active",0<=r&&r<i&&(t=""),s='<div class="fr-image-upload-layer'+t+' fr-layer" id="fr-image-upload-layer-'+p.id+'"><strong>'+p.language.translate("Drop image")+"</strong><br>("+p.language.translate("or click")+')<div class="fr-form"><input type="file" accept="image/'+p.opts.imageAllowedTypes.join(", image/").toLowerCase()+'" tabIndex="-1" aria-labelledby="fr-image-upload-layer-'+p.id+'" role="button"></div></div>');var n="";0<=r&&(t=" fr-active",0<=i&&i<r&&(t=""),n='<div class="fr-image-by-url-layer'+t+' fr-layer" id="fr-image-by-url-layer-'+p.id+'"><div class="fr-input-line"><input id="fr-image-by-url-layer-text-'+p.id+'" type="text" placeholder="http://" tabIndex="1" aria-required="true"></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-submit" data-cmd="imageInsertByURL" tabIndex="2" role="button">'+p.language.translate("Insert")+"</button></div></div>");var o,l={buttons:a,upload_layer:s,by_url_layer:n,progress_bar:'<div class="fr-image-progress-bar-layer fr-layer"><h3 tabIndex="-1" class="fr-message">Uploading</h3><div class="fr-loader"><span class="fr-progress"></span></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-dismiss" data-cmd="imageDismissError" tabIndex="2" role="button">OK</button></div></div>'},f=p.popups.create("image.insert",l);return p.$wp&&p.events.$on(p.$wp,"scroll",function(){g&&p.popups.isVisible("image.insert")&&ce()}),o=f,p.events.$on(o,"dragover dragenter",".fr-image-upload-layer",function(){return be(this).addClass("fr-drop"),!1},!0),p.events.$on(o,"dragleave dragend",".fr-image-upload-layer",function(){return be(this).removeClass("fr-drop"),!1},!0),p.events.$on(o,"drop",".fr-image-upload-layer",function(e){e.preventDefault(),e.stopPropagation(),be(this).removeClass("fr-drop");var t=e.originalEvent.dataTransfer;if(t&&t.files){var a=o.data("instance")||p;a.events.disableBlur(),a.image.upload(t.files),a.events.enableBlur()}},!0),p.helpers.isIOS()&&p.events.$on(o,"touchstart",'.fr-image-upload-layer input[type="file"]',function(){be(this).trigger("click")},!0),p.events.$on(o,"change",'.fr-image-upload-layer input[type="file"]',function(){if(this.files){var e=o.data("instance")||p;e.events.disableBlur(),o.find("input:focus").blur(),e.events.enableBlur(),e.image.upload(this.files,g)}be(this).val("")},!0),f}function H(){g&&p.popups.get("image.alt").find("input").val(g.attr("alt")||"").trigger("change")}function Y(){var e=p.popups.get("image.alt");e||(e=X()),I(),p.popups.refresh("image.alt"),p.popups.setContainer("image.alt",p.$sc);var t=he();ve()&&(t=t.find(".fr-img-wrap"));var a=t.offset().left+t.outerWidth()/2,i=t.offset().top+t.outerHeight();p.popups.show("image.alt",a,i,t.outerHeight())}function X(e){if(e)return p.popups.onRefresh("image.alt",H),!0;var t={buttons:'<div class="fr-buttons">'+p.button.buildList(p.opts.imageAltButtons)+"</div>",alt_layer:'<div class="fr-image-alt-layer fr-layer fr-active" id="fr-image-alt-layer-'+p.id+'"><div class="fr-input-line"><input id="fr-image-alt-layer-text-'+p.id+'" type="text" placeholder="'+p.language.translate("Alternate Text")+'" tabIndex="1"></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-submit" data-cmd="imageSetAlt" tabIndex="2" role="button">'+p.language.translate("Update")+"</button></div></div>"},a=p.popups.create("image.alt",t);return p.$wp&&p.events.$on(p.$wp,"scroll.image-alt",function(){g&&p.popups.isVisible("image.alt")&&Y()}),a}function j(){if(g){var e=p.popups.get("image.size");e.find('input[name="width"]').val(g.get(0).style.width).trigger("change"),e.find('input[name="height"]').val(g.get(0).style.height).trigger("change")}}function G(){var e=p.popups.get("image.size");e||(e=q()),I(),p.popups.refresh("image.size"),p.popups.setContainer("image.size",p.$sc);var t=he();ve()&&(t=t.find(".fr-img-wrap"));var a=t.offset().left+t.outerWidth()/2,i=t.offset().top+t.outerHeight();p.popups.show("image.size",a,i,t.outerHeight())}function q(e){if(e)return p.popups.onRefresh("image.size",j),!0;var t={buttons:'<div class="fr-buttons">'+p.button.buildList(p.opts.imageSizeButtons)+"</div>",size_layer:'<div class="fr-image-size-layer fr-layer fr-active" id="fr-image-size-layer-'+p.id+'"><div class="fr-image-group"><div class="fr-input-line"><input id="fr-image-size-layer-width-'+p.id+'" type="text" name="width" placeholder="'+p.language.translate("Width")+'" tabIndex="1"></div><div class="fr-input-line"><input id="fr-image-size-layer-height'+p.id+'" type="text" name="height" placeholder="'+p.language.translate("Height")+'" tabIndex="1"></div></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-submit" data-cmd="imageSetSize" tabIndex="2" role="button">'+p.language.translate("Update")+"</button></div></div>"},a=p.popups.create("image.size",t);return p.$wp&&p.events.$on(p.$wp,"scroll.image-size",function(){g&&p.popups.isVisible("image.size")&&G()}),a}function V(e,t,a,i){return e.pageX=t,R.call(this,e),e.pageX=e.pageX+a*Math.floor(Math.pow(1.1,i)),S.call(this,e),D.call(this,e),++i}function Q(e){(e=e||he())&&!1!==p.events.trigger("image.beforeRemove",[e])&&(p.popups.hideAll(),ue(),ne(!0),p.undo.canDo()||p.undo.saveStep(),e.get(0)==p.el?e.removeAttr("src"):("A"==e.get(0).parentNode.tagName?(p.selection.setBefore(e.get(0).parentNode)||p.selection.setAfter(e.get(0).parentNode)||e.parent().after(be.FE.MARKERS),be(e.get(0).parentNode).remove()):(p.selection.setBefore(e.get(0))||p.selection.setAfter(e.get(0))||e.after(be.FE.MARKERS),e.remove()),p.html.fillEmptyBlocks(),p.selection.restore()),p.undo.saveStep())}function J(e){var t=e.which;if(g&&(t==be.FE.KEYCODE.BACKSPACE||t==be.FE.KEYCODE.DELETE))return e.preventDefault(),e.stopPropagation(),Q(),!1;if(g&&t==be.FE.KEYCODE.ESC){var a=g;return ne(!0),p.selection.setAfter(a.get(0)),p.selection.restore(),e.preventDefault(),!1}if(g&&(t==be.FE.KEYCODE.ARROW_LEFT||t==be.FE.KEYCODE.ARROW_RIGHT)){var i=g.get(0);return ne(!0),t==be.FE.KEYCODE.ARROW_LEFT?p.selection.setBefore(i):p.selection.setAfter(i),p.selection.restore(),e.preventDefault(),!1}return g&&t!=be.FE.KEYCODE.F10&&!p.keys.isBrowserAction(e)?(e.preventDefault(),e.stopPropagation(),!1):void 0}function Z(e){if(e&&"IMG"==e.tagName){if(p.node.hasClass(e,"fr-uploading")||p.node.hasClass(e,"fr-error")?e.parentNode.removeChild(e):p.node.hasClass(e,"fr-draggable")&&e.classList.remove("fr-draggable"),e.parentNode&&e.parentNode.parentNode&&p.node.hasClass(e.parentNode.parentNode,"fr-img-caption")){var t=e.parentNode.parentNode;t.removeAttribute("contenteditable"),t.removeAttribute("draggable"),t.classList.remove("fr-draggable");var a=e.nextSibling;a&&a.removeAttribute("contenteditable")}}else if(e&&e.nodeType==Node.ELEMENT_NODE)for(var i=e.querySelectorAll("img.fr-uploading, img.fr-error, img.fr-draggable"),r=0;r<i.length;r++)Z(i[r])}function ee(e){if(!1===p.events.trigger("image.beforePasteUpload",[e]))return!1;g=be(e),E(),s(),ce(),$();for(var t=atob(be(e).attr("src").split(",")[1]),a=[],i=0;i<t.length;i++)a.push(t.charCodeAt(i));z([new Blob([new Uint8Array(a)],{type:be(e).attr("src").split(",")[0].replace(/data\:/g,"").replace(/;base64/g,"")})],g)}function te(){p.opts.imagePaste?p.$el.find("img[data-fr-image-pasted]").each(function(e,a){if(p.opts.imagePasteProcess){var t=p.opts.imageDefaultWidth;t&&"auto"!=t&&(t+=p.opts.imageResizeWithPercent?"%":"px"),be(a).css("width",t).removeClass("fr-dii fr-dib fr-fir fr-fil"),pe(be(a),p.opts.imageDefaultDisplay,p.opts.imageDefaultAlign)}if(0===a.src.indexOf("data:"))ee(a);else if(0===a.src.indexOf("blob:")||0===a.src.indexOf("http")&&p.opts.imageUploadRemoteUrls&&p.opts.imageCORSProxy){var i=new Image;i.crossOrigin="Anonymous",i.onload=function(){var e=p.o_doc.createElement("CANVAS"),t=e.getContext("2d");e.height=this.naturalHeight,e.width=this.naturalWidth,t.drawImage(this,0,0),a.src=e.toDataURL("image/png"),ee(a)},i.src=(0===a.src.indexOf("blob:")?"":p.opts.imageCORSProxy+"/")+a.src}else 0!==a.src.indexOf("http")||0===a.src.indexOf("https://mail.google.com/mail")?(p.selection.save(),be(a).remove(),p.selection.restore()):be(a).removeAttr("data-fr-image-pasted")}):p.$el.find("img[data-fr-image-pasted]").remove()}function ae(e){var t=e.target.result,a=p.opts.imageDefaultWidth;a&&"auto"!=a&&(a+=p.opts.imageResizeWithPercent?"%":"px"),p.undo.saveStep(),p.html.insert('<img data-fr-image-pasted="true" src="'+t+'"'+(a?' style="width: '+a+';"':"")+">");var i=p.$el.find('img[data-fr-image-pasted="true"]');i&&pe(i,p.opts.imageDefaultDisplay,p.opts.imageDefaultAlign),p.events.trigger("paste.after")}function ie(e){if(e&&e.clipboardData&&e.clipboardData.items){var t=null;if(e.clipboardData.getData("text/html")||e.clipboardData.getData("text/rtf"))t=e.clipboardData.items[0].getAsFile();else for(var a=0;a<e.clipboardData.items.length&&!(t=e.clipboardData.items[a].getAsFile());a++);if(t)return i=t,(r=new FileReader).onload=ae,r.readAsDataURL(i),!1}var i,r}function re(e){return e=e.replace(/<img /gi,'<img data-fr-image-pasted="true" ')}function se(e){if("false"==be(this).parents("[contenteditable]:not(.fr-element):not(.fr-img-caption):not(body):first").attr("contenteditable"))return!0;if(e&&"touchend"==e.type&&a)return!0;if(e&&p.edit.isDisabled())return e.stopPropagation(),e.preventDefault(),!1;for(var t=0;t<be.FE.INSTANCES.length;t++)be.FE.INSTANCES[t]!=p&&be.FE.INSTANCES[t].events.trigger("image.hideResizer");p.toolbar.disable(),e&&(e.stopPropagation(),e.preventDefault()),p.helpers.isMobile()&&(p.events.disableBlur(),p.$el.blur(),p.events.enableBlur()),p.opts.iframe&&p.size.syncIframe(),g=be(this),ue(),E(),s(),p.browser.msie||p.selection.clear(),p.helpers.isIOS()&&(p.events.disableBlur(),p.$el.blur()),p.button.bulkRefresh(),p.events.trigger("video.hideResizer")}function ne(e){g&&(oe||!0===e)&&(p.toolbar.enable(),l.removeClass("fr-active"),p.popups.hide("image.edit"),g=null,fe(),f=null,d&&d.hide())}r[i]="Image cannot be loaded from the passed link.",r[c]="No link in upload response.",r[u]="Error during file upload.",r[m]="Parsing response failed.",r[n]="File is too large.",r[h]="Image file type is invalid.",r[7]="Files can be uploaded only to same domain in IE 8 and IE 9.";var oe=!(r[v]="Image file is corrupted.");function le(){oe=!0}function fe(){oe=!1}function pe(e,t,a){!p.opts.htmlUntouched&&p.opts.useClasses?(e.removeClass("fr-fil fr-fir fr-dib fr-dii"),a&&e.addClass("fr-fi"+a[0]),t&&e.addClass("fr-di"+t[0])):"inline"==t?(e.css({display:"inline-block",verticalAlign:"bottom",margin:p.opts.imageDefaultMargin}),"center"==a?e.css({"float":"none",marginBottom:"",marginTop:"",maxWidth:"calc(100% - "+2*p.opts.imageDefaultMargin+"px)",textAlign:"center"}):"left"==a?e.css({"float":"left",marginLeft:0,maxWidth:"calc(100% - "+p.opts.imageDefaultMargin+"px)",textAlign:"left"}):e.css({"float":"right",marginRight:0,maxWidth:"calc(100% - "+p.opts.imageDefaultMargin+"px)",textAlign:"right"})):"block"==t&&(e.css({display:"block","float":"none",verticalAlign:"top",margin:p.opts.imageDefaultMargin+"px auto",textAlign:"center"}),"left"==a?e.css({marginLeft:0,textAlign:"left"}):"right"==a&&e.css({marginRight:0,textAlign:"right"}))}function ge(e){if(void 0===e&&(e=he()),e){if(e.hasClass("fr-fil"))return"left";if(e.hasClass("fr-fir"))return"right";if(e.hasClass("fr-dib")||e.hasClass("fr-dii"))return"center";var t=e.css("float");if(e.css("float","none"),"block"==e.css("display")){if(e.css("float",""),e.css("float")!=t&&e.css("float",t),0===parseInt(e.css("margin-left"),10))return"left";if(0===parseInt(e.css("margin-right"),10))return"right"}else{if(e.css("float",""),e.css("float")!=t&&e.css("float",t),"left"==e.css("float"))return"left";if("right"==e.css("float"))return"right"}}return"center"}function de(e){void 0===e&&(e=he());var t=e.css("float");return e.css("float","none"),"block"==e.css("display")?(e.css("float",""),e.css("float")!=t&&e.css("float",t),"block"):(e.css("float",""),e.css("float")!=t&&e.css("float",t),"inline")}function ce(){var e=p.popups.get("image.insert");e||(e=K()),p.popups.isVisible("image.insert")||(I(),p.popups.refresh("image.insert"),p.popups.setContainer("image.insert",p.$sc));var t=he();ve()&&(t=t.find(".fr-img-wrap"));var a=t.offset().left+t.outerWidth()/2,i=t.offset().top+t.outerHeight();p.popups.show("image.insert",a,i,t.outerHeight(!0))}function ue(){if(g){p.events.disableBlur(),p.selection.clear();var e=p.doc.createRange();e.selectNode(g.get(0)),p.browser.msie&&e.collapse(!0),p.selection.get().addRange(e),p.events.enableBlur()}}function me(){return g}function he(){return ve()?g.parents(".fr-img-caption:first"):g}function ve(){return!!g&&0<g.parents(".fr-img-caption").length}return{_init:function(){var i;p.events.$on(p.$el,p._mousedown,"IMG"==p.el.tagName?null:'img:not([contenteditable="false"])',function(e){if("false"==be(this).parents("[contenteditable]:not(.fr-element):not(.fr-img-caption):not(body):first").attr("contenteditable"))return!0;p.helpers.isMobile()||p.selection.clear(),t=!0,p.popups.areVisible()&&p.events.disableBlur(),p.browser.msie&&(p.events.disableBlur(),p.$el.attr("contenteditable",!1)),p.draggable||"touchstart"==e.type||e.preventDefault(),e.stopPropagation()}),p.events.$on(p.$el,p._mouseup,"IMG"==p.el.tagName?null:'img:not([contenteditable="false"])',function(e){if("false"==be(this).parents("[contenteditable]:not(.fr-element):not(.fr-img-caption):not(body):first").attr("contenteditable"))return!0;t&&(t=!1,e.stopPropagation(),p.browser.msie&&(p.$el.attr("contenteditable",!0),p.events.enableBlur()))}),p.events.on("keyup",function(e){if(e.shiftKey&&""===p.selection.text().replace(/\n/g,"")&&p.keys.isArrow(e.which)){var t=p.selection.element(),a=p.selection.endElement();t&&"IMG"==t.tagName?F(be(t)):a&&"IMG"==a.tagName&&F(be(a))}},!0),p.events.on("drop",W),p.events.on("element.beforeDrop",_),p.events.on("mousedown window.mousedown",le),p.events.on("window.touchmove",fe),p.events.on("mouseup window.mouseup",function(){if(g)return ne(),!1;fe()}),p.events.on("commands.mousedown",function(e){0<e.parents(".fr-toolbar").length&&ne()}),p.events.on("blur image.hideResizer commands.undo commands.redo element.dropped",function(){ne(!(t=!1))}),p.events.on("modals.hide",function(){g&&(ue(),p.selection.clear())}),"IMG"==p.el.tagName&&p.$el.addClass("fr-view"),p.events.$on(p.$el,p.helpers.isMobile()&&!p.helpers.isWindowsPhone()?"touchend":"click","IMG"==p.el.tagName?null:'img:not([contenteditable="false"])',se),p.helpers.isMobile()&&(p.events.$on(p.$el,"touchstart","IMG"==p.el.tagName?null:'img:not([contenteditable="false"])',function(){a=!1}),p.events.$on(p.$el,"touchmove",function(){a=!0})),p.$wp?(p.events.on("window.keydown keydown",J,!0),p.events.on("keyup",function(e){if(g&&e.which==be.FE.KEYCODE.ENTER)return!1},!0)):p.events.$on(p.$win,"keydown",J),p.events.on("toolbar.esc",function(){if(g){if(p.$wp)p.events.disableBlur(),p.events.focus();else{var e=g;ne(!0),p.selection.setAfter(e.get(0)),p.selection.restore()}return!1}},!0),p.events.on("toolbar.focusEditor",function(){if(g)return!1},!0),p.events.on("window.cut window.copy",function(e){if(g&&p.popups.isVisible("image.edit")&&!p.popups.get("image.edit").find(":focus").length){var t=he();ve()?(t.before(be.FE.START_MARKER),t.after(be.FE.END_MARKER),p.selection.restore(),p.paste.saveCopiedText(t.get(0).outerHTML,t.text())):(ue(),p.paste.saveCopiedText(g.get(0).outerHTML,g.attr("alt"))),"copy"==e.type?setTimeout(function(){F(g)}):(ne(!0),p.undo.saveStep(),setTimeout(function(){p.undo.saveStep()},0))}},!0),p.browser.msie&&p.events.on("keydown",function(e){if(!p.selection.isCollapsed()||!g)return!0;var t=e.which;t==be.FE.KEYCODE.C&&p.keys.ctrlKey(e)?p.events.trigger("window.copy"):t==be.FE.KEYCODE.X&&p.keys.ctrlKey(e)&&p.events.trigger("window.cut")}),p.events.$on(be(p.o_win),"keydown",function(e){var t=e.which;if(g&&t==be.FE.KEYCODE.BACKSPACE)return e.preventDefault(),!1}),p.events.$on(p.$win,"keydown",function(e){var t=e.which;g&&g.hasClass("fr-uploading")&&t==be.FE.KEYCODE.ESC&&g.trigger("abortUpload")}),p.events.on("destroy",function(){g&&g.hasClass("fr-uploading")&&g.trigger("abortUpload")}),p.events.on("paste.before",ie),p.events.on("paste.beforeCleanup",re),p.events.on("paste.after",te),p.events.on("html.set",e),p.events.on("html.inserted",e),e(),p.events.on("destroy",function(){o=[]}),p.events.on("html.processGet",Z),p.opts.imageOutputSize&&p.events.on("html.beforeGet",function(){i=p.el.querySelectorAll("img");for(var e=0;e<i.length;e++){var t=i[e].style.width||be(i[e]).width(),a=i[e].style.height||be(i[e]).height();t&&i[e].setAttribute("width",(""+t).replace(/px/,"")),a&&i[e].setAttribute("height",(""+a).replace(/px/,""))}}),p.opts.iframe&&p.events.on("image.loaded",p.size.syncIframe),p.$wp&&(w(),p.events.on("contentChanged",w)),p.events.$on(be(p.o_win),"orientationchange.image",function(){setTimeout(function(){g&&F(g)},100)}),U(!0),K(!0),q(!0),X(!0),p.events.on("node.remove",function(e){if("IMG"==e.get(0).tagName)return Q(e),!1})},showInsertPopup:function(){var e=p.$tb.find('.fr-command[data-cmd="insertImage"]'),t=p.popups.get("image.insert");if(t||(t=K()),I(),!t.hasClass("fr-active"))if(p.popups.refresh("image.insert"),p.popups.setContainer("image.insert",p.$tb),e.is(":visible")){var a=e.offset().left+e.outerWidth()/2,i=e.offset().top+(p.opts.toolbarBottom?10:e.outerHeight()-10);p.popups.show("image.insert",a,i,e.outerHeight())}else p.position.forSelection(t),p.popups.show("image.insert")},showLayer:function(e){var t,a,i=p.popups.get("image.insert");if(g||p.opts.toolbarInline){if(g){var r=he();ve()&&(r=r.find(".fr-img-wrap")),a=r.offset().top+r.outerHeight(),t=r.offset().left+r.outerWidth()/2}}else{var s=p.$tb.find('.fr-command[data-cmd="insertImage"]');t=s.offset().left+s.outerWidth()/2,a=s.offset().top+(p.opts.toolbarBottom?10:s.outerHeight()-10)}!g&&p.opts.toolbarInline&&(a=i.offset().top-p.helpers.getPX(i.css("margin-top")),i.hasClass("fr-above")&&(a+=i.outerHeight())),i.find(".fr-layer").removeClass("fr-active"),i.find(".fr-"+e+"-layer").addClass("fr-active"),p.popups.show("image.insert",t,a,g?g.outerHeight():0),p.accessibility.focusPopup(i)},refreshUploadButton:function(e){p.popups.get("image.insert").find(".fr-image-upload-layer").hasClass("fr-active")&&e.addClass("fr-active").attr("aria-pressed",!0)},refreshByURLButton:function(e){p.popups.get("image.insert").find(".fr-image-by-url-layer").hasClass("fr-active")&&e.addClass("fr-active").attr("aria-pressed",!0)},upload:z,insertByURL:function(){var e=p.popups.get("image.insert").find(".fr-image-by-url-layer input");if(0<e.val().length){$(),k(p.language.translate("Loading image"));var t=e.val();if(p.opts.imageUploadRemoteUrls&&p.opts.imageCORSProxy&&p.opts.imageUpload){var a=new XMLHttpRequest;a.onload=function(){200==this.status?z([new Blob([this.response],{type:this.response.type||"image/png"})],g):x(i)},a.onerror=function(){P(t,!0,[],g)},a.open("GET",p.opts.imageCORSProxy+"/"+t,!0),a.responseType="blob",a.send()}else P(t,!0,[],g);e.val(""),e.blur()}},align:function(e){var t=he();t.removeClass("fr-fir fr-fil"),!p.opts.htmlUntouched&&p.opts.useClasses?"left"==e?t.addClass("fr-fil"):"right"==e&&t.addClass("fr-fir"):pe(t,de(),e),ue(),E(),s(),p.selection.clear()},refreshAlign:function(e){g&&e.find("> *:first").replaceWith(p.icon.create("image-align-"+ge()))},refreshAlignOnShow:function(e,t){g&&t.find('.fr-command[data-param1="'+ge()+'"]').addClass("fr-active").attr("aria-selected",!0)},display:function(e){var t=he();t.removeClass("fr-dii fr-dib"),!p.opts.htmlUntouched&&p.opts.useClasses?"inline"==e?t.addClass("fr-dii"):"block"==e&&t.addClass("fr-dib"):pe(t,e,ge()),ue(),E(),s(),p.selection.clear()},refreshDisplayOnShow:function(e,t){g&&t.find('.fr-command[data-param1="'+de()+'"]').addClass("fr-active").attr("aria-selected",!0)},replace:ce,back:function(){g?(p.events.disableBlur(),be(".fr-popup input:focus").blur(),F(g)):(p.events.disableBlur(),p.selection.restore(),p.events.enableBlur(),p.popups.hide("image.insert"),p.toolbar.showInline())},get:me,getEl:he,insert:P,showProgressBar:$,remove:Q,hideProgressBar:I,applyStyle:function(e,t,a){if(void 0===t&&(t=p.opts.imageStyles),void 0===a&&(a=p.opts.imageMultipleStyles),!g)return!1;var i=he();if(!a){var r=Object.keys(t);r.splice(r.indexOf(e),1),i.removeClass(r.join(" "))}"object"==typeof t[e]?(i.removeAttr("style"),i.css(t[e].style)):i.toggleClass(e),F(g)},showAltPopup:Y,showSizePopup:G,setAlt:function(e){if(g){var t=p.popups.get("image.alt");g.attr("alt",e||t.find("input").val()||""),t.find("input:focus").blur(),F(g)}},setSize:function(e,t){if(g){var a=p.popups.get("image.size");e=e||a.find('input[name="width"]').val()||"",t=t||a.find('input[name="height"]').val()||"";var i=/^[\d]+((px)|%)*$/g;g.removeAttr("width").removeAttr("height"),e.match(i)?g.css("width",e):g.css("width",""),t.match(i)?g.css("height",t):g.css("height",""),ve()&&(g.parent().removeAttr("width").removeAttr("height"),e.match(i)?g.parent().css("width",e):g.parent().css("width",""),t.match(i)?g.parent().css("height",t):g.parent().css("height","")),a.find("input:focus").blur(),F(g)}},toggleCaption:function(){var e;g&&!ve()?((e=g).parent().is("a")&&(e=g.parent()),e.wrap("<span "+(p.browser.mozilla?"":'contenteditable="false"')+'class="fr-img-caption '+g.attr("class")+'" style="'+(g.attr("style")?g.attr("style")+" ":"")+"width: "+g.width()+'px;" draggable="false"></span>'),e.wrap('<span class="fr-img-wrap"></span>'),e.after('<span class="fr-inner" contenteditable="true">'+be.FE.START_MARKER+"Image caption"+be.FE.END_MARKER+"</span>"),g.removeAttr("class").removeAttr("style").removeAttr("width"),ne(!0),p.selection.restore()):(e=he(),g.insertAfter(e),g.attr("class",e.attr("class").replace("fr-img-caption","")).attr("style",e.attr("style")),e.remove(),F(g))},hasCaption:ve,exitEdit:ne,edit:F}},be.FE.DefineIcon("insertImage",{NAME:"image"}),be.FE.RegisterShortcut(be.FE.KEYCODE.P,"insertImage",null,"P"),be.FE.RegisterCommand("insertImage",{title:"Insert Image",undo:!1,focus:!0,refreshAfterCallback:!1,popup:!0,callback:function(){this.popups.isVisible("image.insert")?(this.$el.find(".fr-marker").length&&(this.events.disableBlur(),this.selection.restore()),this.popups.hide("image.insert")):this.image.showInsertPopup()},plugin:"image"}),be.FE.DefineIcon("imageUpload",{NAME:"upload"}),be.FE.RegisterCommand("imageUpload",{title:"Upload Image",undo:!1,focus:!1,toggle:!0,callback:function(){this.image.showLayer("image-upload")},refresh:function(e){this.image.refreshUploadButton(e)}}),be.FE.DefineIcon("imageByURL",{NAME:"link"}),be.FE.RegisterCommand("imageByURL",{title:"By URL",undo:!1,focus:!1,toggle:!0,callback:function(){this.image.showLayer("image-by-url")},refresh:function(e){this.image.refreshByURLButton(e)}}),be.FE.RegisterCommand("imageInsertByURL",{title:"Insert Image",undo:!0,refreshAfterCallback:!1,callback:function(){this.image.insertByURL()},refresh:function(e){this.image.get()?e.text(this.language.translate("Replace")):e.text(this.language.translate("Insert"))}}),be.FE.DefineIcon("imageDisplay",{NAME:"star"}),be.FE.RegisterCommand("imageDisplay",{title:"Display",type:"dropdown",options:{inline:"Inline",block:"Break Text"},callback:function(e,t){this.image.display(t)},refresh:function(e){this.opts.imageTextNear||e.addClass("fr-hidden")},refreshOnShow:function(e,t){this.image.refreshDisplayOnShow(e,t)}}),be.FE.DefineIcon("image-align",{NAME:"align-left"}),be.FE.DefineIcon("image-align-left",{NAME:"align-left"}),be.FE.DefineIcon("image-align-right",{NAME:"align-right"}),be.FE.DefineIcon("image-align-center",{NAME:"align-justify"}),be.FE.DefineIcon("imageAlign",{NAME:"align-justify"}),be.FE.RegisterCommand("imageAlign",{type:"dropdown",title:"Align",options:{left:"Align Left",center:"None",right:"Align Right"},html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t=be.FE.COMMANDS.imageAlign.options;for(var a in t)t.hasOwnProperty(a)&&(e+='<li role="presentation"><a class="fr-command fr-title" tabIndex="-1" role="option" data-cmd="imageAlign" data-param1="'+a+'" title="'+this.language.translate(t[a])+'">'+this.icon.create("image-align-"+a)+'<span class="fr-sr-only">'+this.language.translate(t[a])+"</span></a></li>");return e+="</ul>"},callback:function(e,t){this.image.align(t)},refresh:function(e){this.image.refreshAlign(e)},refreshOnShow:function(e,t){this.image.refreshAlignOnShow(e,t)}}),be.FE.DefineIcon("imageReplace",{NAME:"exchange",FA5NAME:"exchange-alt"}),be.FE.RegisterCommand("imageReplace",{title:"Replace",undo:!1,focus:!1,popup:!0,refreshAfterCallback:!1,callback:function(){this.image.replace()}}),be.FE.DefineIcon("imageRemove",{NAME:"trash"}),be.FE.RegisterCommand("imageRemove",{title:"Remove",callback:function(){this.image.remove()}}),be.FE.DefineIcon("imageBack",{NAME:"arrow-left"}),be.FE.RegisterCommand("imageBack",{title:"Back",undo:!1,focus:!1,back:!0,callback:function(){this.image.back()},refresh:function(e){this.image.get()||this.opts.toolbarInline?(e.removeClass("fr-hidden"),e.next(".fr-separator").removeClass("fr-hidden")):(e.addClass("fr-hidden"),e.next(".fr-separator").addClass("fr-hidden"))}}),be.FE.RegisterCommand("imageDismissError",{title:"OK",undo:!1,callback:function(){this.image.hideProgressBar(!0)}}),be.FE.DefineIcon("imageStyle",{NAME:"magic"}),be.FE.RegisterCommand("imageStyle",{title:"Style",type:"dropdown",html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',t=this.opts.imageStyles;for(var a in t)if(t.hasOwnProperty(a)){var i=t[a];"object"==typeof i&&(i=i.title),e+='<li role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="imageStyle" data-param1="'+a+'">'+this.language.translate(i)+"</a></li>"}return e+="</ul>"},callback:function(e,t){this.image.applyStyle(t)},refreshOnShow:function(e,t){var a=this.image.getEl();a&&t.find(".fr-command").each(function(){var e=be(this).data("param1"),t=a.hasClass(e);be(this).toggleClass("fr-active",t).attr("aria-selected",t)})}}),be.FE.DefineIcon("imageAlt",{NAME:"info"}),be.FE.RegisterCommand("imageAlt",{undo:!1,focus:!1,popup:!0,title:"Alternate Text",callback:function(){this.image.showAltPopup()}}),be.FE.RegisterCommand("imageSetAlt",{undo:!0,focus:!1,title:"Update",refreshAfterCallback:!1,callback:function(){this.image.setAlt()}}),be.FE.DefineIcon("imageSize",{NAME:"arrows-alt"}),be.FE.RegisterCommand("imageSize",{undo:!1,focus:!1,popup:!0,title:"Change Size",callback:function(){this.image.showSizePopup()}}),be.FE.RegisterCommand("imageSetSize",{undo:!0,focus:!1,title:"Update",refreshAfterCallback:!1,callback:function(){this.image.setSize()}}),be.FE.DefineIcon("imageCaption",{NAME:"commenting",FA5NAME:"comment-alt"}),be.FE.RegisterCommand("imageCaption",{undo:!0,focus:!1,title:"Image Caption",refreshAfterCallback:!0,callback:function(){this.image.toggleCaption()},refresh:function(e){this.image.get()&&e.toggleClass("fr-active",this.image.hasCaption())}})});
@@ -0,0 +1,1056 @@
1
+ /*!
2
+ * froala_editor v2.8.1 (https://www.froala.com/wysiwyg-editor)
3
+ * License https://froala.com/wysiwyg-editor/terms/
4
+ * Copyright 2014-2018 Froala Labs
5
+ */
6
+
7
+ (function (factory) {
8
+ if (typeof define === 'function' && define.amd) {
9
+ // AMD. Register as an anonymous module.
10
+ define(['jquery'], factory);
11
+ } else if (typeof module === 'object' && module.exports) {
12
+ // Node/CommonJS
13
+ module.exports = function( root, jQuery ) {
14
+ if ( jQuery === undefined ) {
15
+ // require('jQuery') returns a factory that requires window to
16
+ // build a jQuery instance, we normalize how we use modules
17
+ // that require this pattern but the window provided is a noop
18
+ // if it's defined (how jquery works)
19
+ if ( typeof window !== 'undefined' ) {
20
+ jQuery = require('jquery');
21
+ }
22
+ else {
23
+ jQuery = require('jquery')(root);
24
+ }
25
+ }
26
+ return factory(jQuery);
27
+ };
28
+ } else {
29
+ // Browser globals
30
+ factory(window.jQuery);
31
+ }
32
+ }(function ($) {
33
+
34
+
35
+
36
+ // Extend defaults.
37
+ $.extend($.FE.DEFAULTS, {
38
+ imageManagerLoadURL: 'https://i.froala.com/load-files',
39
+ imageManagerLoadMethod: 'get',
40
+ imageManagerLoadParams: {},
41
+ imageManagerPreloader: null,
42
+ imageManagerDeleteURL: '',
43
+ imageManagerDeleteMethod: 'post',
44
+ imageManagerDeleteParams: {},
45
+ imageManagerPageSize: 12,
46
+ imageManagerScrollOffset: 20,
47
+ imageManagerToggleTags: true
48
+ });
49
+
50
+ $.FE.PLUGINS.imageManager = function (editor) {
51
+ var $modal;
52
+ var modal_id = 'image_manager';
53
+
54
+ var $head;
55
+ var $body;
56
+ var $preloader;
57
+ var $media_files;
58
+ var $image_tags;
59
+ var images;
60
+ var page;
61
+ var image_count;
62
+ var loaded_images;
63
+ var column_number;
64
+
65
+ // Load errors.
66
+ var BAD_LINK = 10;
67
+ var ERROR_DURING_LOAD = 11;
68
+ var MISSING_LOAD_URL_OPTION = 12;
69
+ var LOAD_BAD_RESPONSE = 13;
70
+ var MISSING_IMG_THUMB = 14;
71
+ var MISSING_IMG_URL = 15;
72
+
73
+ // Delete errors
74
+ var ERROR_DURING_DELETE = 21;
75
+ var MISSING_DELETE_URL_OPTION = 22;
76
+
77
+ // Error Messages
78
+ var error_messages = {};
79
+ error_messages[BAD_LINK] = 'Image cannot be loaded from the passed link.';
80
+ error_messages[ERROR_DURING_LOAD] = 'Error during load images request.';
81
+ error_messages[MISSING_LOAD_URL_OPTION] = 'Missing imageManagerLoadURL option.';
82
+ error_messages[LOAD_BAD_RESPONSE] = 'Parsing load response failed.';
83
+ error_messages[MISSING_IMG_THUMB] = 'Missing image thumb.';
84
+ error_messages[MISSING_IMG_URL] = 'Missing image URL.';
85
+ error_messages[ERROR_DURING_DELETE] = 'Error during delete image request.';
86
+ error_messages[MISSING_DELETE_URL_OPTION] = 'Missing imageManagerDeleteURL option.';
87
+
88
+ /*
89
+ * Show the image manager.
90
+ */
91
+ function show () {
92
+
93
+ // Build the image manager.
94
+ if (!$modal) {
95
+
96
+ // Build head.
97
+ var head = '<div class="fr-modal-head-line"><i class="fa fa-bars fr-modal-more fr-not-available" id="fr-modal-more-' + editor.sid + '" title="' + editor.language.translate('Tags') + '"></i><h4 data-text="true">' + editor.language.translate('Manage Images') + '</h4></div>';
98
+
99
+ // Tags
100
+ //head += '<div class="fr-modal-tags" id="fr-modal-tags"></div>';
101
+ // Preloader.
102
+ var body;
103
+
104
+ if (editor.opts.imageManagerPreloader) {
105
+ body = '<img class="fr-preloader" id="fr-preloader" alt="' + editor.language.translate('Loading') + '.." src="' + editor.opts.imageManagerPreloader + '" style="display: none;">';
106
+ }
107
+ else {
108
+ body = '<span class="fr-preloader" id="fr-preloader" style="display: none;">' + editor.language.translate('Loading') + '</span>';
109
+ }
110
+
111
+ // Image list.
112
+ body += '<div class="fr-image-list" id="fr-image-list" ></div>';
113
+
114
+ var modalHash = editor.modals.create(modal_id, head, body);
115
+ $modal = modalHash.$modal;
116
+ $head = modalHash.$head;
117
+ $body = modalHash.$body;
118
+ }
119
+
120
+ // Set the current image (if modal is opened to replace an image).
121
+ $modal.data('current-image', editor.image.get());
122
+
123
+ // Show modal.
124
+ editor.modals.show(modal_id);
125
+ if (!$preloader) {
126
+ _delayedInit();
127
+ }
128
+
129
+ // Load images.
130
+ _loadImages();
131
+ }
132
+
133
+ /*
134
+ * Hide the image manager.
135
+ */
136
+ function hide () {
137
+
138
+ // Hide modal.
139
+ editor.modals.hide(modal_id);
140
+ }
141
+
142
+ /*
143
+ * Get the number of columns based on window width.
144
+ */
145
+ function _columnNumber () {
146
+ var window_width = $(window).outerWidth();
147
+
148
+ // Screen XS.
149
+ if (window_width < 768) {
150
+ return 2;
151
+ }
152
+
153
+ // Screen SM and MD.
154
+ else if (window_width < 1200) {
155
+ return 3;
156
+ }
157
+
158
+ // Screen LG.
159
+ else {
160
+ return 4;
161
+ }
162
+ }
163
+
164
+ /*
165
+ * Add the correct number of columns.
166
+ */
167
+ function _buildColumns () {
168
+ $media_files.empty();
169
+
170
+ for (var i = 0; i < column_number; i++) {
171
+ $media_files.append('<div class="fr-list-column"></div>');
172
+ }
173
+ }
174
+
175
+ /*
176
+ * Load images from server.
177
+ */
178
+ function _loadImages () {
179
+
180
+ $preloader.show();
181
+ $(".search-nav").empty();
182
+ $("#fr-image-list").empty();
183
+ // If the images load URL is set.
184
+ if (editor.opts.imageManagerLoadURL) {
185
+
186
+ // Make GET request to get the images.
187
+ $.ajax({
188
+ url: editor.opts.imageManagerLoadURL,
189
+ method: editor.opts.imageManagerLoadMethod,
190
+ data: editor.opts.imageManagerLoadParams,
191
+ dataType: 'json',
192
+ crossDomain: editor.opts.requestWithCORS,
193
+ xhrFields: {
194
+ withCredentials: editor.opts.requestWithCredentials
195
+ },
196
+ headers: editor.opts.requestHeaders
197
+ })
198
+
199
+ // On success start processing the response.
200
+ .done(function (data, status, xhr) {
201
+ editor.events.trigger('imageManager.imagesLoaded', [data]);
202
+ console.log(data.file_list);
203
+ _processLoadedDir(data, xhr.response);
204
+ $preloader.hide();
205
+ })
206
+
207
+ // On fail throw error during request.
208
+ .fail(function () {
209
+ var xhr = this.xhr();
210
+ _throwError(ERROR_DURING_LOAD, xhr.response || xhr.responseText);
211
+ });
212
+ }
213
+
214
+ // Throw missing imageManagerLoadURL option error.
215
+ else {
216
+ _throwError(MISSING_LOAD_URL_OPTION);
217
+ }
218
+ }
219
+
220
+ /*
221
+ * Process loaded images.
222
+ */
223
+ function _processLoadedImages (imgs, response) {
224
+ try {
225
+ $media_files.find('.fr-list-column').empty();
226
+ page = 0;
227
+ image_count = 0;
228
+ loaded_images = 0;
229
+ images = imgs;
230
+
231
+ // Load files.
232
+ _infiniteScroll();
233
+ }
234
+
235
+ // Throw error while parsing the response.
236
+ catch (ex) {
237
+ _throwError(LOAD_BAD_RESPONSE, response);
238
+ }
239
+ }
240
+
241
+
242
+
243
+ /*
244
+ * Process loaded images.
245
+ */
246
+ function _processLoadedDir (dirs, response) {
247
+ try {
248
+ $media_files.find('.fr-list-column').empty();
249
+ page = 0;
250
+ image_count = 0;
251
+ loaded_images = 0;
252
+ dirlists = dirs;
253
+
254
+ // Load dirs.
255
+ _infiniteScrollDirs(dirlists);
256
+ }
257
+
258
+ // Throw error while parsing the response.
259
+ catch (ex) {
260
+ _throwError(LOAD_BAD_RESPONSE, response);
261
+ }
262
+ }
263
+
264
+
265
+ function _infiniteScrollDirs(dirlists){
266
+
267
+ if (dirlists.file_list.length >0){
268
+ var dir_html = '<div class="ke-plugin-filemanager-list">';
269
+ for(var i=0;i<dirlists.file_list.length;i++){
270
+ dir_html+='<div class=" ke-inline-block " data-file="'+dirlists.file_list[i].filename+'" ><div class="fa fa-folder-open-o fa-5x" aria-hidden="true" ></div><div >'+dirlists.file_list[i].filename+'</div></div>';
271
+ }
272
+ dir_html+='</div>'
273
+ $("#fr-image-list").html(dir_html);
274
+
275
+ _currentDir();
276
+
277
+ }
278
+
279
+ }
280
+
281
+ function _currentDir(){
282
+ $('.ke-inline-block')
283
+ .mouseover(function(e) {
284
+ $(this).addClass('ke-on');
285
+ })
286
+ .mouseout(function(e) {
287
+ $(this).removeClass('ke-on');
288
+ });
289
+
290
+ $('.ke-inline-block').click(function(e){
291
+ // alert($(this).attr('data-file'));
292
+ var url = editor.opts.imageManagerLoadURL.split('?')[0]+'?path='+$(this).attr('data-file')+'&order=datetime&dir=image'
293
+ $.ajax({
294
+ url: url,
295
+ method: editor.opts.imageManagerLoadMethod,
296
+ data: editor.opts.imageManagerLoadParams,
297
+ dataType: 'json',
298
+ crossDomain: editor.opts.requestWithCORS,
299
+ xhrFields: {
300
+ withCredentials: editor.opts.requestWithCredentials
301
+ },
302
+ headers: editor.opts.requestHeaders
303
+ })
304
+
305
+ // On success start processing the response.
306
+ .done(function (data, status, xhr) {
307
+
308
+ editor.events.trigger('imageManager.imagesLoaded', [data]);
309
+ _getLoadedImages(data, xhr.response);
310
+ $preloader.hide();
311
+ })
312
+
313
+ // On fail throw error during request.
314
+ .fail(function () {
315
+ var xhr = this.xhr();
316
+ _throwError(ERROR_DURING_LOAD, xhr.response || xhr.responseText);
317
+ });
318
+ });
319
+
320
+ }
321
+
322
+
323
+ function _getLoadedImages(data,response){
324
+ try {
325
+ var nav_html = ''
326
+ nav_html+='<div class="ke-plugin-filemanager-header">' +
327
+ '<div class="ke-left"><i class="fa fa-reply" aria-hidden="true"></i><a name="moveupLink" id="goback" href="javascript:;">移到上一级文件夹</a></div>' +
328
+ '<div class="ke-right"> '+
329
+ '排序方式: <select class="orderType" id="orderType" data="'+data.current_dir_path+'">' +
330
+ '<option value="datetime">请选择</option>' +
331
+ '<option value="filename">名称</option>' +
332
+ '<option value="filesize">大小</option>' +
333
+ '<option value="datetime">日期</option>' +
334
+ '</div><div class="ke-clearfix"></div></div>'
335
+ if (data.file_list.length >0){
336
+ var dir_html = '<div class="ke-plugin-filemanager-list">';
337
+ for(var i=0;i<data.file_list.length;i++){
338
+ dir_html+='<div class="fr-image-container fr-image" data-loading="Loading.." data-deleting="Deleting.." style="width: 100px;height: 100px;float: left;margin: 5px 5px">' +
339
+ '<img src="'+data.current_url+'/'+data.file_list[i].filename+'" width="100" height="100" data-url="'+data.current_url+'/'+data.file_list[i].filename+'" >' +
340
+ '<i class="fa fa-trash fr-delete-img" aria-hidden="true" title="删除"></i>' +
341
+ '<i class="fa fa-plus fr-insert-img" aria-hidden="true" title="插入"></i></div>';
342
+ }
343
+ dir_html+='</div>';
344
+ $("#fr-image-list").html(dir_html+nav_html);
345
+
346
+ }
347
+
348
+ listImages();
349
+
350
+ }
351
+
352
+ // Throw error while parsing the response.
353
+ catch (ex) {
354
+ _throwError(LOAD_BAD_RESPONSE, response);
355
+ }
356
+ }
357
+
358
+
359
+ function listImages(){
360
+ $('#orderType').change(function(e){
361
+ $("#fr-image-list").empty();
362
+ var url = editor.opts.imageManagerLoadURL.split('?')[0]+'?path='+$(this).attr('data')+'&order='+$(this).val()+'&dir=image'
363
+ $.ajax({
364
+ url: url,
365
+ method: editor.opts.imageManagerLoadMethod,
366
+ data: editor.opts.imageManagerLoadParams,
367
+ dataType: 'json',
368
+ crossDomain: editor.opts.requestWithCORS,
369
+ xhrFields: {
370
+ withCredentials: editor.opts.requestWithCredentials
371
+ },
372
+ headers: editor.opts.requestHeaders
373
+ })
374
+
375
+ // On success start processing the response.
376
+ .done(function (data, status, xhr) {
377
+
378
+ editor.events.trigger('imageManager.imagesLoaded', [data]);
379
+ _getLoadedImages(data, xhr.response);
380
+ $preloader.hide();
381
+ })
382
+
383
+ // On fail throw error during request.
384
+ .fail(function () {
385
+ var xhr = this.xhr();
386
+ _throwError(ERROR_DURING_LOAD, xhr.response || xhr.responseText);
387
+ });
388
+ });
389
+
390
+
391
+ $("#goback").click(function(e){
392
+ _loadImages ()
393
+ });
394
+
395
+
396
+ }
397
+
398
+ /*
399
+ * Load more images if necessary.
400
+ */
401
+ function _infiniteScroll () {
402
+
403
+ // If there aren't enough images in the modal or if the user scrolls down.
404
+ // if (image_count < images.length &&
405
+ // ($media_files.outerHeight() <= $body.outerHeight() + editor.opts.imageManagerScrollOffset ||
406
+ // $body.scrollTop() + editor.opts.imageManagerScrollOffset > $media_files.outerHeight() - $body.outerHeight())) {
407
+ //
408
+ // // Increase page number.
409
+ // page++;
410
+ //
411
+ // // Load each image on this page.
412
+ // for (var i = editor.opts.imageManagerPageSize * (page - 1); i < Math.min(images.length, editor.opts.imageManagerPageSize * page); i++) {
413
+ // _loadImage(images[i]);
414
+ // }
415
+ // }
416
+ }
417
+
418
+ /*
419
+ * Load file.
420
+ */
421
+ function _loadImage (image) {
422
+ var img = new Image();
423
+ var $img_container = $('<div class="fr-image-container fr-empty fr-image-' + (loaded_images++) + '" data-loading="' + editor.language.translate('Loading') + '.." data-deleting="' + editor.language.translate('Deleting') + '..">');
424
+
425
+ // After adding image empty container modal might change its height.
426
+ _resizeModal(false);
427
+
428
+ // Image has been loaded.
429
+ img.onload = function () {
430
+
431
+ // Update image container height.
432
+ $img_container.height(Math.floor($img_container.width() / img.width * img.height));
433
+
434
+ // Create image HTML.
435
+ var $img = $('<img/>');
436
+
437
+ // Use image thumb in image manager.
438
+ if (image.thumb) {
439
+
440
+ // Set image src attribute/
441
+ $img.attr('src', image.thumb);
442
+ }
443
+
444
+ // Image does not have thumb.
445
+ else {
446
+
447
+ // Throw missing image thumb error.
448
+ _throwError(MISSING_IMG_THUMB, image);
449
+
450
+ // Set image URL as src attribute.
451
+ if (image.url) {
452
+ $img.attr('src', image.url);
453
+ }
454
+
455
+ // Missing image URL.
456
+ else {
457
+
458
+ // Throw missing image url error.
459
+ _throwError(MISSING_IMG_URL, image);
460
+
461
+ // Don't go further if image does not have a src attribute.
462
+
463
+ return false;
464
+ }
465
+ }
466
+
467
+ // Save image URL.
468
+ if (image.url) $img.attr('data-url', image.url);
469
+
470
+ // Image tags.
471
+ if (image.tag) {
472
+
473
+ // Show tags only if there are any.
474
+ $head.find('.fr-modal-more.fr-not-available').removeClass('fr-not-available');
475
+ $head.find('.fr-modal-tags').show();
476
+
477
+ // Image has more than one tag.
478
+ if (image.tag.indexOf(',') >= 0) {
479
+
480
+ // Add tags to the image manager tag list.
481
+ var tags = image.tag.split(',');
482
+
483
+ for (var i = 0; i < tags.length; i++) {
484
+
485
+ // Remove trailing spaces.
486
+ tags[i] = tags[i].trim();
487
+
488
+ // Add tag.
489
+ if ($image_tags.find('a[title="' + tags[i] + '"]').length === 0) {
490
+ $image_tags.append('<a role="button" title="' + tags[i] + '">' + tags[i] + '</a>');
491
+ }
492
+ }
493
+
494
+ // Set img tag attribute.
495
+ $img.attr('data-tag', tags.join());
496
+ }
497
+
498
+ // Image has only one tag.
499
+ else {
500
+
501
+ // Add tag to the tag list.
502
+ if ($image_tags.find('a[title="' + image.tag.trim() + '"]').length === 0) {
503
+ $image_tags.append('<a role="button" title="' + image.tag.trim() + '">' + image.tag.trim() + '</a>');
504
+ }
505
+
506
+ // Set img tag attribute.
507
+ $img.attr('data-tag', image.tag.trim());
508
+ }
509
+ }
510
+
511
+ // Image alt.
512
+ if (image.name) {
513
+ $img.attr('alt', image.name);
514
+ }
515
+
516
+ // Set image additional data.
517
+ for (var key in image) {
518
+ if (image.hasOwnProperty(key)) {
519
+ if (key != 'thumb' && key != 'url' && key != 'tag') {
520
+ $img.attr('data-' + key, image[key]);
521
+ }
522
+ }
523
+ }
524
+
525
+ // Add image and insert and delete buttons to the image container.
526
+ $img_container
527
+ .append($img)
528
+ .append($(editor.icon.create('imageManagerDelete')).addClass('fr-delete-img').attr('title', editor.language.translate('Delete')))
529
+ .append($(editor.icon.create('imageManagerInsert')).addClass('fr-insert-img').attr('title', editor.language.translate('Insert')))
530
+
531
+ // Show image only if it has selected tags.
532
+ $image_tags.find('.fr-selected-tag').each (function (index, tag) {
533
+ if (!_imageHasTag($img, tag.text)) {
534
+ $img_container.hide();
535
+ }
536
+ });
537
+
538
+ // After an image is loaded the modal may need to be resized.
539
+ $img.on('load', function () {
540
+
541
+ // Image container is no longer empty.
542
+ $img_container.removeClass('fr-empty');
543
+ $img_container.height('auto');
544
+
545
+ // Increase image counter.
546
+ image_count++;
547
+
548
+ // A loded image may break the images order. Reorder them starting with this image.
549
+ var imgs = _getImages(parseInt($img.parent().attr('class').match(/fr-image-(\d+)/)[1], 10) + 1);
550
+
551
+ // Reorder images.
552
+ _reorderImages(imgs);
553
+
554
+ // Image modal may need resizing.
555
+ _resizeModal(false);
556
+
557
+ // If this was the last image on page then we might need to load more.
558
+ if (image_count % editor.opts.imageManagerPageSize === 0) {
559
+ _infiniteScroll();
560
+ }
561
+ });
562
+
563
+ // Trigger imageLoaded event.
564
+ editor.events.trigger('imageManager.imageLoaded', [$img]);
565
+ };
566
+
567
+ // Error while loading the image.
568
+ img.onerror = function () {
569
+ image_count++;
570
+ $img_container.remove();
571
+
572
+ // Removing an image container may break image order.
573
+ var imgs = _getImages(parseInt($img_container.attr('class').match(/fr-image-(\d+)/)[1], 10) + 1);
574
+
575
+ // Reorder images.
576
+ _reorderImages(imgs);
577
+
578
+ _throwError(BAD_LINK, image);
579
+
580
+ // If this was the last image on page then we might need to load more.
581
+ if (image_count % editor.opts.imageManagerPageSize === 0) {
582
+ _infiniteScroll();
583
+ }
584
+ };
585
+
586
+ // Set the image object's src.
587
+ img.src = image.thumb || image.url;
588
+
589
+ // Add loaded or empty image to the media manager image list on the shortest column.
590
+ _shortestColumn().append($img_container);
591
+ }
592
+
593
+ /*
594
+ * Get the shortest image column.
595
+ */
596
+ function _shortestColumn () {
597
+ var $col;
598
+ var min_height;
599
+
600
+ $media_files.find('.fr-list-column').each (function (index, col) {
601
+ var $column = $(col);
602
+
603
+ // Assume that the first column is the shortest.
604
+ if (index === 0) {
605
+ min_height = $column.outerHeight();
606
+ $col = $column;
607
+ }
608
+
609
+ // Check if another column is shorter.
610
+ else {
611
+ if ($column.outerHeight() < min_height) {
612
+ min_height = $column.outerHeight();
613
+ $col = $column;
614
+ }
615
+ }
616
+ });
617
+
618
+ return $col;
619
+ }
620
+
621
+ /*
622
+ * Get all images from the image manager.
623
+ */
624
+ function _getImages (from) {
625
+ if (from === undefined) from = 0;
626
+ var get_images = [];
627
+
628
+ for (var i = loaded_images - 1; i >= from; i--) {
629
+ var $image = $media_files.find('.fr-image-' + i);
630
+
631
+ if ($image.length) {
632
+ get_images.push($image);
633
+
634
+ // Add images here before deleting them so the on load callback is triggered.
635
+ $('<div id="fr-image-hidden-container">').append($image);
636
+ $media_files.find('.fr-image-' + i).remove();
637
+ }
638
+ }
639
+
640
+ return get_images;
641
+ }
642
+
643
+ /*
644
+ * Add images back into the image manager.
645
+ */
646
+ function _reorderImages (imgs) {
647
+ for (var i = imgs.length - 1; i >= 0; i--) {
648
+ _shortestColumn().append(imgs[i]);
649
+ }
650
+ }
651
+
652
+ /*
653
+ * Resize the media manager modal if height changes.
654
+ */
655
+ function _resizeModal (infinite_scroll) {
656
+ if (infinite_scroll === undefined) infinite_scroll = true;
657
+
658
+ if (!$modal.is(':visible')) return true;
659
+
660
+ // If width changes, the number of columns may change.
661
+ var cols = _columnNumber();
662
+
663
+ if (cols != column_number) {
664
+ column_number = cols;
665
+
666
+ // Get all images.
667
+ var imgs = _getImages();
668
+
669
+ // Remove current columns and add new ones.
670
+ _buildColumns();
671
+
672
+ // Reorder images.
673
+ _reorderImages(imgs);
674
+ }
675
+
676
+ editor.modals.resize(modal_id);
677
+
678
+ // Load more photos when window is resized if necessary.
679
+ if (infinite_scroll) {
680
+ _infiniteScroll();
681
+ }
682
+ }
683
+
684
+ function _getImageAttrs ($img) {
685
+ var img_attributes = {};
686
+ var img_data = $img.data();
687
+
688
+ for (var key in img_data) {
689
+ if (img_data.hasOwnProperty(key)) {
690
+ if (key != 'url' && key != 'tag') {
691
+ img_attributes[key] = img_data[key];
692
+ }
693
+ }
694
+ }
695
+
696
+ return img_attributes;
697
+ }
698
+
699
+ /*
700
+ * Insert image into the editor.
701
+ */
702
+ function _insertImage (e) {
703
+
704
+ // Image to insert.
705
+ var $img = $(e.currentTarget).siblings('img');
706
+
707
+ var inst = $modal.data('instance') || editor;
708
+ var $current_image = $modal.data('current-image');
709
+
710
+ editor.modals.hide(modal_id);
711
+ inst.image.showProgressBar();
712
+
713
+ if (!$current_image) {
714
+
715
+ // Make sure we have focus.
716
+ inst.events.focus(true);
717
+ inst.selection.restore();
718
+
719
+ var rect = inst.position.getBoundingRect();
720
+
721
+ var left = rect.left + rect.width / 2 + $(editor.doc).scrollLeft();
722
+ var top = rect.top + rect.height + $(editor.doc).scrollTop();
723
+
724
+ // Show the image insert popup.
725
+ inst.popups.setContainer('image.insert', editor.$sc);
726
+ inst.popups.show('image.insert', left, top);
727
+ }
728
+ else {
729
+ $current_image.data('fr-old-src', $current_image.attr('src'));
730
+ $current_image.trigger('click');
731
+ }
732
+
733
+ inst.image.insert($img.data('url'), false, _getImageAttrs($img), $current_image);
734
+ }
735
+
736
+ /*
737
+ * Update tags.
738
+ */
739
+ function _updateTags () {
740
+ $modal.find('#fr-modal-tags > a').each (function () {
741
+
742
+ if ($modal.find('#fr-image-list [data-tag*="' + $(this).text() + '"]').length === 0) {
743
+ $(this).removeClass('fr-selected-tag').hide();
744
+ }
745
+ });
746
+
747
+ _showImagesByTags();
748
+ }
749
+
750
+ /*
751
+ * Delete image.
752
+ */
753
+ function _deleteImage (e) {
754
+
755
+ // Image to delete.
756
+ var $img = $(e.currentTarget).siblings('img');
757
+
758
+ // Confirmation message.
759
+ var message = editor.language.translate('Are you sure? Image will be deleted.');
760
+
761
+ // Ask for confirmation.
762
+ if (confirm(message)) {
763
+
764
+ // If the images delete URL is set.
765
+ if (editor.opts.imageManagerDeleteURL) {
766
+
767
+ // Before delete image event.
768
+ if (editor.events.trigger('imageManager.beforeDeleteImage', [$img]) !== false) {
769
+ $img.parent().addClass('fr-image-deleting');
770
+
771
+ // Make request to delete image from server.
772
+ $.ajax({
773
+ method: editor.opts.imageManagerDeleteMethod,
774
+ url: editor.opts.imageManagerDeleteURL,
775
+ data: $.extend($.extend({ src: $img.attr('src') }, _getImageAttrs($img)), editor.opts.imageManagerDeleteParams),
776
+ crossDomain: editor.opts.requestWithCORS,
777
+ xhrFields: {
778
+ withCredentials: editor.opts.requestWithCredentials
779
+ },
780
+ headers: editor.opts.requestHeaders
781
+ })
782
+
783
+ // On success remove the image from the image manager.
784
+ .done(function (data) {
785
+
786
+ editor.events.trigger('imageManager.imageDeleted', [data]);
787
+
788
+ // A deleted image may break the images order. Reorder them starting with this image.
789
+ var imgs = _getImages(parseInt($img.parent().attr('class').match(/fr-image-(\d+)/)[1], 10) + 1);
790
+
791
+ // Remove the image.
792
+ $img.parent().remove();
793
+
794
+ // Reorder images.
795
+ _reorderImages(imgs);
796
+
797
+ // Update tags.
798
+ _updateTags();
799
+
800
+ // Modal needs resizing.
801
+ _resizeModal(true);
802
+ })
803
+
804
+ // On fail throw error during request.
805
+ .fail(function (xhr) {
806
+ _throwError(ERROR_DURING_DELETE, xhr.response || xhr.responseText);
807
+ });
808
+ }
809
+ }
810
+
811
+ // Throw missing imageManagerDeleteURL option error.
812
+ else {
813
+ _throwError(MISSING_DELETE_URL_OPTION);
814
+ }
815
+ }
816
+ }
817
+
818
+ /*
819
+ * Throw image manager errors.
820
+ */
821
+ function _throwError (code, response) {
822
+
823
+ // Load images error.
824
+ if (10 <= code && code < 20) {
825
+
826
+ // Hide preloader.
827
+ $preloader.hide();
828
+ }
829
+
830
+ // Delete image error.
831
+ else if (20 <= code && code < 30) {
832
+
833
+ // Remove deleting overlay.
834
+ $('.fr-image-deleting').removeClass('fr-image-deleting');
835
+ }
836
+
837
+ // Trigger error event.
838
+ editor.events.trigger('imageManager.error', [{
839
+ code: code,
840
+ message: error_messages[code]
841
+ }, response]);
842
+ }
843
+
844
+ /*
845
+ * Toogle (show or hide) image tags.
846
+ */
847
+ function _toggleTags () {
848
+ var title_height = $head.find('.fr-modal-head-line').outerHeight();
849
+ var tags_height = $image_tags.outerHeight();
850
+
851
+ // Use .fr-show-tags.
852
+ $head.toggleClass('fr-show-tags');
853
+
854
+ if ($head.hasClass('fr-show-tags')) {
855
+
856
+ // Show tags by changing height to have transition.
857
+ $head.css('height', title_height + tags_height);
858
+ $image_tags.find('a').css('opacity', 1);
859
+ }
860
+
861
+ else {
862
+
863
+ // Hide tags by changing height to have transition.
864
+ $head.css('height', title_height);
865
+ $image_tags.find('a').css('opacity', 0);
866
+ }
867
+ }
868
+
869
+ /*
870
+ * Show only images with selected tags.
871
+ */
872
+ function _showImagesByTags() {
873
+
874
+ // Get all selected tags.
875
+ var $tags = $image_tags.find('.fr-selected-tag');
876
+
877
+ // Show only images with selected tags.
878
+ if ($tags.length > 0) {
879
+
880
+ // Hide all images.
881
+ $media_files.find('img').parent().show();
882
+
883
+ // Show only images with tag.
884
+ $tags.each (function (index, tag) {
885
+ $media_files.find('img').each (function (index, img) {
886
+ var $img = $(img);
887
+
888
+ if (!_imageHasTag($img, tag.text)) {
889
+ $img.parent().hide();
890
+ }
891
+ });
892
+ });
893
+ }
894
+
895
+ // There are no more tags selected. Show all images.
896
+ else {
897
+ $media_files.find('img').parent().show();
898
+ }
899
+
900
+ // Rearrange images.
901
+ var imgs = _getImages();
902
+
903
+ // Reorder images.
904
+ _reorderImages(imgs);
905
+
906
+ // Load more images if necessary.
907
+ _infiniteScroll();
908
+ }
909
+
910
+ /*
911
+ * Select an image tag from the list.
912
+ */
913
+ function _selectTag (e) {
914
+ e.preventDefault();
915
+
916
+ // Toggle current tags class.
917
+ var $tag = $(e.currentTarget);
918
+ $tag.toggleClass('fr-selected-tag');
919
+
920
+ // Toggle selected tags.
921
+ if (editor.opts.imageManagerToggleTags) $tag.siblings('a').removeClass('fr-selected-tag');
922
+
923
+ // Change displayed images.
924
+ _showImagesByTags();
925
+ }
926
+
927
+ /*
928
+ * Method to check if an image has a specific tag.
929
+ */
930
+ function _imageHasTag ($image, tag) {
931
+ var tags = ($image.attr('data-tag') || '').split(',');
932
+
933
+ for (var i = 0; i < tags.length; i++) {
934
+ if (tags[i] == tag) {
935
+ return true;
936
+ }
937
+ }
938
+
939
+ return false;
940
+ }
941
+
942
+ function _delayedInit() {
943
+ $preloader = $modal.find('#fr-preloader');
944
+ $media_files = $modal.find('#fr-image-list');
945
+ $image_tags = $modal.find('#fr-modal-tags');
946
+
947
+ // Columns.
948
+ column_number = _columnNumber();
949
+ _buildColumns();
950
+
951
+ // Set height for title (we need this for show tags transition).
952
+ $head.css('height', $head.find('.fr-modal-head-line').outerHeight());
953
+
954
+ // Resize media manager modal on window resize.
955
+ editor.events.$on($(editor.o_win), 'resize', function () {
956
+
957
+ // Window resize with image manager opened.
958
+ if (images) {
959
+ _resizeModal(true);
960
+ }
961
+
962
+ // iOS window resize is triggered when modal first opens (no images loaded).
963
+ else {
964
+ _resizeModal(false);
965
+ }
966
+ });
967
+
968
+ // Delete and insert buttons for mobile.
969
+ if (editor.helpers.isMobile()) {
970
+
971
+ // Show image buttons on mobile.
972
+ editor.events.bindClick($media_files, 'div.fr-image-container', function (e) {
973
+ $modal.find('.fr-mobile-selected').removeClass('fr-mobile-selected');
974
+ $(e.currentTarget).addClass('fr-mobile-selected');
975
+ });
976
+
977
+ // Hide image buttons if we click outside it.
978
+ $modal.on(editor._mousedown, function () {
979
+ $modal.find('.fr-mobile-selected').removeClass('fr-mobile-selected');
980
+ });
981
+ }
982
+
983
+ // Insert image.
984
+ editor.events.bindClick($media_files, '.fr-insert-img', _insertImage);
985
+
986
+ // Delete image.
987
+ editor.events.bindClick($media_files, '.fr-delete-img', _deleteImage);
988
+
989
+ // Make sure we don't trigger blur.
990
+ $modal.on(editor._mousedown + ' ' + editor._mouseup, function (e) {
991
+ e.stopPropagation();
992
+ });
993
+
994
+ // Mouse down on anything.
995
+ $modal.on(editor._mousedown, '*', function () {
996
+ editor.events.disableBlur();
997
+ });
998
+
999
+ // Infinite scroll
1000
+ $body.on('scroll', _infiniteScroll);
1001
+
1002
+ // Click on image tags button.
1003
+ editor.events.bindClick($modal, 'i#fr-modal-more-' + editor.sid, _toggleTags);
1004
+
1005
+ // Select an image tag.
1006
+ editor.events.bindClick($image_tags, 'a', _selectTag);
1007
+ }
1008
+
1009
+ /*
1010
+ * Init media manager.
1011
+ */
1012
+ function _init () {
1013
+ if (!editor.$wp && editor.el.tagName != 'IMG') return false;
1014
+ }
1015
+
1016
+ return {
1017
+ require: ['image'],
1018
+ _init: _init,
1019
+ show: show,
1020
+ hide: hide
1021
+ }
1022
+ };
1023
+
1024
+ if (!$.FE.PLUGINS.image) {
1025
+ throw new Error('Image manager plugin requires image plugin.');
1026
+ }
1027
+
1028
+ $.FE.DEFAULTS.imageInsertButtons.push('imageManager');
1029
+
1030
+ $.FE.RegisterCommand('imageManager', {
1031
+ title: 'Browse',
1032
+ undo: false,
1033
+ focus: false,
1034
+ modal: true,
1035
+ callback: function () {
1036
+ this.imageManager.show();
1037
+ },
1038
+ plugin: 'imageManager'
1039
+ })
1040
+
1041
+ // Add the font size icon.
1042
+ $.FE.DefineIcon('imageManager', {
1043
+ NAME: 'folder'
1044
+ });
1045
+
1046
+ // Add the font size icon.
1047
+ $.FE.DefineIcon('imageManagerInsert', {
1048
+ NAME: 'plus'
1049
+ });
1050
+
1051
+ // Add the font size icon.
1052
+ $.FE.DefineIcon('imageManagerDelete', {
1053
+ NAME: 'trash'
1054
+ });
1055
+
1056
+ }));