freshereditor.js 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. // Licensed to Cloudera, Inc. under one
  2. // or more contributor license agreements. See the NOTICE file
  3. // distributed with this work for additional information
  4. // regarding copyright ownership. Cloudera, Inc. licenses this file
  5. // to you under the Apache License, Version 2.0 (the
  6. // "License"); you may not use this file except in compliance
  7. // with the License. You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. (function() {
  17. (function($) {
  18. var methods;
  19. methods = {
  20. edit: function(isEditing) {
  21. return this.each(function() {
  22. return $(this).attr("contentEditable", isEditing || false);
  23. });
  24. },
  25. save: function(callback) {
  26. return this.each(function() {
  27. return callback($(this).attr('id'), $(this).html());
  28. });
  29. },
  30. createlink: function() {
  31. var urlPrompt;
  32. urlPrompt = prompt("Enter URL:", "http://");
  33. return document.execCommand("createlink", false, urlPrompt);
  34. },
  35. insertimage: function() {
  36. var urlPrompt;
  37. urlPrompt = prompt("Enter Image URL:", "http://");
  38. return document.execCommand("insertimage", false, urlPrompt);
  39. },
  40. formatblock: function(block) {
  41. return document.execCommand("formatblock", null, block);
  42. },
  43. init: function(opts) {
  44. var $toolbar, button, command, commands, excludes, font, font_list, fontnames, fontsize, fontsizes, group, groups, options, shortcuts, size_list, _i, _j, _k, _l, _len, _len2, _len3, _len4;
  45. options = opts || {};
  46. groups = [
  47. [
  48. {
  49. name: 'bold',
  50. label: "<span style='font-weight:bold;'>B</span>",
  51. title: 'Bold (Ctrl+B)',
  52. classname: 'toolbar_bold'
  53. }, {
  54. name: 'italic',
  55. label: "<span style='font-style:italic;'>I</span>",
  56. title: 'Italic (Ctrl+I)',
  57. classname: 'toolbar_italic'
  58. }, {
  59. name: 'underline',
  60. label: "<span style='text-decoration:underline!important;'>U</span>",
  61. title: 'Underline (Ctrl+U)',
  62. classname: 'toolbar_underline'
  63. }, {
  64. name: 'strikethrough',
  65. label: "<span style='text-shadow:none;text-decoration:line-through;'>ABC</span>",
  66. title: 'Strikethrough',
  67. classname: 'toolbar_strikethrough'
  68. }, {
  69. name: 'removeFormat',
  70. label: "<i class='fa fa-minus'></i>",
  71. title: 'Remove Formating (Ctrl+M)',
  72. classname: 'toolbar_remove'
  73. }
  74. ], [
  75. {
  76. name: 'fontname',
  77. label: "F <span class='caret'></span>",
  78. title: 'Select font name',
  79. classname: 'toolbar_fontname dropdown-toggle',
  80. dropdown: true
  81. }
  82. ], [
  83. {
  84. name: 'FontSize',
  85. label: "<span style='font:bold 16px;'>A</span><span style='font-size:8px;'>A</span> <span class='caret'></span>",
  86. title: 'Select font size',
  87. classname: 'toolbar_fontsize dropdown-toggle',
  88. dropdown: true
  89. }
  90. ], [
  91. {
  92. name: 'forecolor',
  93. label: "<div style='color:#ff0000;'>A <span class='caret'></span></div>",
  94. title: 'Select font color',
  95. classname: 'toolbar_forecolor dropdown-toggle',
  96. dropdown: true
  97. }
  98. ], [
  99. {
  100. name: 'backcolor',
  101. label: "<div style='display:inline-block;margin:3px;margin-top:8px;width:15px;height:12px;background-color:#0000ff;'></div> <span class='caret'></span>",
  102. title: 'Select background color',
  103. classname: 'toolbar_bgcolor dropdown-toggle',
  104. dropdown: true
  105. }
  106. ], [
  107. {
  108. name: 'justifyleft',
  109. label: "<i class='fa fa-align-left' style='margin-top:2px;'></i>",
  110. title: 'Left justify',
  111. classname: 'toolbar_justifyleft'
  112. }, {
  113. name: 'justifycenter',
  114. label: "<i class='fa fa-align-center' style='margin-top:2px;'></i>",
  115. title: 'Center justify',
  116. classname: 'toolbar_justifycenter'
  117. }, {
  118. name: 'justifyright',
  119. label: "<i class='fa fa-align-right' style='margin-top:2px;'></i>",
  120. title: 'Right justify',
  121. classname: 'toolbar_justifyright'
  122. }, {
  123. name: 'justifyfull',
  124. label: "<i class='fa fa-align-justify' style='margin-top:2px;'></i>",
  125. title: 'Full justify',
  126. classname: 'toolbar_justifyfull'
  127. }
  128. ], [
  129. {
  130. name: 'createlink',
  131. label: '@',
  132. title: 'Link to a web page (Ctrl+L)',
  133. userinput: "yes",
  134. classname: 'toolbar_link'
  135. }, {
  136. name: 'insertimage',
  137. label: "<i style='margin-top:2px;' class='fa fa-picture-o'></i>",
  138. title: 'Insert an image (Ctrl+G)',
  139. userinput: "yes",
  140. classname: 'toolbar_image'
  141. }, {
  142. name: 'insertorderedlist',
  143. label: "<i class='fa fa-list-alt' style='margin-top:2px;'></i>",
  144. title: 'Insert ordered list',
  145. classname: 'toolbar_ol'
  146. }, {
  147. name: 'insertunorderedlist',
  148. label: "<i class='fa fa-list' style='margin-top:2px;'></i>",
  149. title: 'Insert unordered list',
  150. classname: 'toolbar_ul'
  151. }
  152. ], [
  153. {
  154. name: 'insertparagraph',
  155. label: 'P',
  156. title: 'Insert a paragraph (Ctrl+Alt+0)',
  157. classname: 'toolbar_p',
  158. block: 'p'
  159. }, {
  160. name: 'insertheading1',
  161. label: 'H1',
  162. title: "Heading 1 (Ctrl+Alt+1)",
  163. classname: 'toolbar_h1',
  164. block: 'h1'
  165. }, {
  166. name: 'insertheading2',
  167. label: 'H2',
  168. title: "Heading 2 (Ctrl+Alt+2)",
  169. classname: 'toolbar_h2',
  170. block: 'h2'
  171. }, {
  172. name: 'insertheading3',
  173. label: 'H3',
  174. title: "Heading 3 (Ctrl+Alt+3)",
  175. classname: 'toolbar_h3',
  176. block: 'h3'
  177. }, {
  178. name: 'insertheading4',
  179. label: 'H4',
  180. title: "Heading 4 (Ctrl+Alt+4)",
  181. classname: 'toolbar_h4',
  182. block: 'h4'
  183. }
  184. ], [
  185. {
  186. name: 'blockquote',
  187. label: "<i style='margin-top:2px;' class='fa fa-comment'></i>",
  188. title: 'Blockquote (Ctrl+Q)',
  189. classname: 'toolbar_blockquote',
  190. block: 'blockquote'
  191. }, {
  192. name: 'code',
  193. label: '{&nbsp;}',
  194. title: 'Code (Ctrl+Alt+K)',
  195. classname: 'toolbar_code',
  196. block: 'pre'
  197. }, {
  198. name: 'superscript',
  199. label: 'x<sup>2</sup>',
  200. title: 'Superscript',
  201. classname: 'toolbar_superscript'
  202. }, {
  203. name: 'subscript',
  204. label: 'x<sub>2</sub>',
  205. title: 'Subscript',
  206. classname: 'toolbar_subscript'
  207. }
  208. ]
  209. ];
  210. if (options.toolbar_selector != null) {
  211. $toolbar = $(options.toolbar_selector);
  212. } else {
  213. $(this).before("<div id='editor-toolbar'></div>");
  214. $toolbar = $('#editor-toolbar');
  215. }
  216. $toolbar.addClass('fresheditor-toolbar');
  217. $toolbar.append("<div class='btn-toolbar'></div>");
  218. excludes = options.excludes || [];
  219. for (_i = 0, _len = groups.length; _i < _len; _i++) {
  220. commands = groups[_i];
  221. group = '';
  222. for (_j = 0, _len2 = commands.length; _j < _len2; _j++) {
  223. command = commands[_j];
  224. if (jQuery.inArray(command.name, excludes) < 0) {
  225. button = "<a href='#' class='btn toolbar-btn toolbar-cmd " + command.classname + "' title='" + command.title + "' command='" + command.name + "'";
  226. if (command.userinput != null) {
  227. button += " userinput='" + command.userinput + "'";
  228. }
  229. if (command.block != null) {
  230. button += " block='" + command.block + "'";
  231. }
  232. if (command.dropdown) {
  233. button += " data-toggle='dropdown'";
  234. }
  235. button += ">" + command.label + "</a>";
  236. group += button;
  237. }
  238. }
  239. $('.btn-toolbar', $toolbar).append("<div class='btn-group'>" + group + "</div>");
  240. }
  241. $("[data-toggle='dropdown']").removeClass('toolbar-cmd');
  242. if (jQuery.inArray('fontname', excludes) < 0) {
  243. fontnames = ["Arial", "Arial Black", "Comic Sans MS", "Courier New", "Georgia", "Helvetica", "Sans Serif", "Tahoma", "Times New Roman", "Trebuchet MS", "Verdana"];
  244. font_list = '';
  245. for (_k = 0, _len3 = fontnames.length; _k < _len3; _k++) {
  246. font = fontnames[_k];
  247. font_list += "<li><a href='#' class='fontname-option' style='font-family:" + font + ";'>" + font + "</a></li>";
  248. }
  249. $('.toolbar_fontname').after("<ul class='dropdown-menu'>" + font_list + "</ul>");
  250. $('.fontname-option').on('click', function() {
  251. document.execCommand("fontname", false, $(this).text());
  252. $(this).closest('.btn-group').removeClass('open');
  253. return false;
  254. });
  255. }
  256. if (jQuery.inArray('FontSize', excludes) < 0) {
  257. fontsizes = [
  258. {
  259. size: 1,
  260. point: 8
  261. }, {
  262. size: 2,
  263. point: 10
  264. }, {
  265. size: 3,
  266. point: 12
  267. }, {
  268. size: 4,
  269. point: 14
  270. }, {
  271. size: 5,
  272. point: 18
  273. }, {
  274. size: 6,
  275. point: 24
  276. }, {
  277. size: 7,
  278. point: 36
  279. }
  280. ];
  281. size_list = '';
  282. for (_l = 0, _len4 = fontsizes.length; _l < _len4; _l++) {
  283. fontsize = fontsizes[_l];
  284. size_list += "<li><a href='#' class='font-option fontsize-option' style='font-size:" + fontsize.point + "px;' fontsize='" + fontsize.size + "'>" + fontsize.size + "(" + fontsize.point + "pt)</a></li>";
  285. }
  286. $('.toolbar_fontsize').after("<ul class='dropdown-menu'>" + size_list + "</ul>");
  287. $('a.fontsize-option').on('click', function() {
  288. console.log($(this).attr('fontsize'));
  289. document.execCommand("FontSize", false, $(this).attr('fontsize'));
  290. $(this).closest('.btn-group').removeClass('open');
  291. return false;
  292. });
  293. }
  294. function getColorChart(id) {
  295. return '<table id="' + id + '" class="hue-colorchart">' +
  296. '<tbody><tr><td bgcolor="#FBEFEF"></td><td bgcolor="#FBF2EF"></td><td bgcolor="#FBF5EF"></td><td bgcolor="#FBF8EF"></td><td bgcolor="#FBFBEF"></td><td bgcolor="#F8FBEF"></td><td bgcolor="#F5FBEF"></td><td bgcolor="#F2FBEF"></td><td bgcolor="#EFFBEF"></td><td bgcolor="#EFFBF2"></td><td bgcolor="#EFFBF5"></td><td bgcolor="#EFFBF8"></td><td bgcolor="#EFFBFB"></td><td bgcolor="#EFF8FB"></td><td bgcolor="#EFF5FB"></td><td bgcolor="#EFF2FB"></td><td bgcolor="#EFEFFB"></td><td bgcolor="#F2EFFB"></td><td bgcolor="#F5EFFB"></td><td bgcolor="#F8EFFB"></td><td bgcolor="#FBEFFB"></td><td bgcolor="#FBEFF8"></td><td bgcolor="#FBEFF5"></td><td bgcolor="#FBEFF2"></td><td bgcolor="#FFFFFF"></td></tr>' +
  297. '<tr><td bgcolor="#F8E0E0"></td><td bgcolor="#F8E6E0"></td><td bgcolor="#F8ECE0"></td><td bgcolor="#F7F2E0"></td><td bgcolor="#F7F8E0"></td><td bgcolor="#F1F8E0"></td><td bgcolor="#ECF8E0"></td><td bgcolor="#E6F8E0"></td><td bgcolor="#E0F8E0"></td><td bgcolor="#E0F8E6"></td><td bgcolor="#E0F8EC"></td><td bgcolor="#E0F8F1"></td><td bgcolor="#E0F8F7"></td><td bgcolor="#E0F2F7"></td><td bgcolor="#E0ECF8"></td><td bgcolor="#E0E6F8"></td><td bgcolor="#E0E0F8"></td><td bgcolor="#E6E0F8"></td><td bgcolor="#ECE0F8"></td><td bgcolor="#F2E0F7"></td><td bgcolor="#F8E0F7"></td><td bgcolor="#F8E0F1"></td><td bgcolor="#F8E0EC"></td><td bgcolor="#F8E0E6"></td><td bgcolor="#FAFAFA"></td></tr>' +
  298. '<tr><td bgcolor="#F6CECE"></td><td bgcolor="#F6D8CE"></td><td bgcolor="#F6E3CE"></td><td bgcolor="#F5ECCE"></td><td bgcolor="#F5F6CE"></td><td bgcolor="#ECF6CE"></td><td bgcolor="#E3F6CE"></td><td bgcolor="#D8F6CE"></td><td bgcolor="#CEF6CE"></td><td bgcolor="#CEF6D8"></td><td bgcolor="#CEF6E3"></td><td bgcolor="#CEF6EC"></td><td bgcolor="#CEF6F5"></td><td bgcolor="#CEECF5"></td><td bgcolor="#CEE3F6"></td><td bgcolor="#CED8F6"></td><td bgcolor="#CECEF6"></td><td bgcolor="#D8CEF6"></td><td bgcolor="#E3CEF6"></td><td bgcolor="#ECCEF5"></td><td bgcolor="#F6CEF5"></td><td bgcolor="#F6CEEC"></td><td bgcolor="#F6CEE3"></td><td bgcolor="#F6CED8"></td><td bgcolor="#F2F2F2"></td></tr>' +
  299. '<tr><td bgcolor="#F5A9A9"></td><td bgcolor="#F5BCA9"></td><td bgcolor="#F5D0A9"></td><td bgcolor="#F3E2A9"></td><td bgcolor="#F2F5A9"></td><td bgcolor="#E1F5A9"></td><td bgcolor="#D0F5A9"></td><td bgcolor="#BCF5A9"></td><td bgcolor="#A9F5A9"></td><td bgcolor="#A9F5BC"></td><td bgcolor="#A9F5D0"></td><td bgcolor="#A9F5E1"></td><td bgcolor="#A9F5F2"></td><td bgcolor="#A9E2F3"></td><td bgcolor="#A9D0F5"></td><td bgcolor="#A9BCF5"></td><td bgcolor="#A9A9F5"></td><td bgcolor="#BCA9F5"></td><td bgcolor="#D0A9F5"></td><td bgcolor="#E2A9F3"></td><td bgcolor="#F5A9F2"></td><td bgcolor="#F5A9E1"></td><td bgcolor="#F5A9D0"></td><td bgcolor="#F5A9BC"></td><td bgcolor="#E6E6E6"></td></tr>' +
  300. '<tr><td bgcolor="#F78181"></td><td bgcolor="#F79F81"></td><td bgcolor="#F7BE81"></td><td bgcolor="#F5DA81"></td><td bgcolor="#F3F781"></td><td bgcolor="#D8F781"></td><td bgcolor="#BEF781"></td><td bgcolor="#9FF781"></td><td bgcolor="#81F781"></td><td bgcolor="#81F79F"></td><td bgcolor="#81F7BE"></td><td bgcolor="#81F7D8"></td><td bgcolor="#81F7F3"></td><td bgcolor="#81DAF5"></td><td bgcolor="#81BEF7"></td><td bgcolor="#819FF7"></td><td bgcolor="#8181F7"></td><td bgcolor="#9F81F7"></td><td bgcolor="#BE81F7"></td><td bgcolor="#DA81F5"></td><td bgcolor="#F781F3"></td><td bgcolor="#F781D8"></td><td bgcolor="#F781BE"></td><td bgcolor="#F7819F"></td><td bgcolor="#D8D8D8"></td></tr>' +
  301. '<tr><td bgcolor="#FA5858"></td><td bgcolor="#FA8258"></td><td bgcolor="#FAAC58"></td><td bgcolor="#F7D358"></td><td bgcolor="#F4FA58"></td><td bgcolor="#D0FA58"></td><td bgcolor="#ACFA58"></td><td bgcolor="#82FA58"></td><td bgcolor="#58FA58"></td><td bgcolor="#58FA82"></td><td bgcolor="#58FAAC"></td><td bgcolor="#58FAD0"></td><td bgcolor="#58FAF4"></td><td bgcolor="#58D3F7"></td><td bgcolor="#58ACFA"></td><td bgcolor="#5882FA"></td><td bgcolor="#5858FA"></td><td bgcolor="#8258FA"></td><td bgcolor="#AC58FA"></td><td bgcolor="#D358F7"></td><td bgcolor="#FA58F4"></td><td bgcolor="#FA58D0"></td><td bgcolor="#FA58AC"></td><td bgcolor="#FA5882"></td><td bgcolor="#BDBDBD"></td></tr>' +
  302. '<tr><td bgcolor="#FE2E2E"></td><td bgcolor="#FE642E"></td><td bgcolor="#FE9A2E"></td><td bgcolor="#FACC2E"></td><td bgcolor="#F7FE2E"></td><td bgcolor="#C8FE2E"></td><td bgcolor="#9AFE2E"></td><td bgcolor="#64FE2E"></td><td bgcolor="#2EFE2E"></td><td bgcolor="#2EFE64"></td><td bgcolor="#2EFE9A"></td><td bgcolor="#2EFEC8"></td><td bgcolor="#2EFEF7"></td><td bgcolor="#2ECCFA"></td><td bgcolor="#2E9AFE"></td><td bgcolor="#2E64FE"></td><td bgcolor="#2E2EFE"></td><td bgcolor="#642EFE"></td><td bgcolor="#9A2EFE"></td><td bgcolor="#CC2EFA"></td><td bgcolor="#FE2EF7"></td><td bgcolor="#FE2EC8"></td><td bgcolor="#FE2E9A"></td><td bgcolor="#FE2E64"></td><td bgcolor="#A4A4A4"></td></tr>' +
  303. '<tr><td bgcolor="#FF0000"></td><td bgcolor="#FF4000"></td><td bgcolor="#FF8000"></td><td bgcolor="#FFBF00"></td><td bgcolor="#FFFF00"></td><td bgcolor="#BFFF00"></td><td bgcolor="#80FF00"></td><td bgcolor="#40FF00"></td><td bgcolor="#00FF00"></td><td bgcolor="#00FF40"></td><td bgcolor="#00FF80"></td><td bgcolor="#00FFBF"></td><td bgcolor="#00FFFF"></td><td bgcolor="#00BFFF"></td><td bgcolor="#0080FF"></td><td bgcolor="#0040FF"></td><td bgcolor="#0000FF"></td><td bgcolor="#4000FF"></td><td bgcolor="#8000FF"></td><td bgcolor="#BF00FF"></td><td bgcolor="#FF00FF"></td><td bgcolor="#FF00BF"></td><td bgcolor="#FF0080"></td><td bgcolor="#FF0040"></td><td bgcolor="#848484"></td></tr>' +
  304. '<tr><td bgcolor="#DF0101"></td><td bgcolor="#DF3A01"></td><td bgcolor="#DF7401"></td><td bgcolor="#DBA901"></td><td bgcolor="#D7DF01"></td><td bgcolor="#A5DF00"></td><td bgcolor="#74DF00"></td><td bgcolor="#3ADF00"></td><td bgcolor="#01DF01"></td><td bgcolor="#01DF3A"></td><td bgcolor="#01DF74"></td><td bgcolor="#01DFA5"></td><td bgcolor="#01DFD7"></td><td bgcolor="#01A9DB"></td><td bgcolor="#0174DF"></td><td bgcolor="#013ADF"></td><td bgcolor="#0101DF"></td><td bgcolor="#3A01DF"></td><td bgcolor="#7401DF"></td><td bgcolor="#A901DB"></td><td bgcolor="#DF01D7"></td><td bgcolor="#DF01A5"></td><td bgcolor="#DF0174"></td><td bgcolor="#DF013A"></td><td bgcolor="#6E6E6E"></td></tr>' +
  305. '<tr><td bgcolor="#B40404"></td><td bgcolor="#B43104"></td><td bgcolor="#B45F04"></td><td bgcolor="#B18904"></td><td bgcolor="#AEB404"></td><td bgcolor="#86B404"></td><td bgcolor="#5FB404"></td><td bgcolor="#31B404"></td><td bgcolor="#04B404"></td><td bgcolor="#04B431"></td><td bgcolor="#04B45F"></td><td bgcolor="#04B486"></td><td bgcolor="#04B4AE"></td><td bgcolor="#0489B1"></td><td bgcolor="#045FB4"></td><td bgcolor="#0431B4"></td><td bgcolor="#0404B4"></td><td bgcolor="#3104B4"></td><td bgcolor="#5F04B4"></td><td bgcolor="#8904B1"></td><td bgcolor="#B404AE"></td><td bgcolor="#B40486"></td><td bgcolor="#B4045F"></td><td bgcolor="#B40431"></td><td bgcolor="#585858"></td></tr>' +
  306. '<tr><td bgcolor="#8A0808"></td><td bgcolor="#8A2908"></td><td bgcolor="#8A4B08"></td><td bgcolor="#886A08"></td><td bgcolor="#868A08"></td><td bgcolor="#688A08"></td><td bgcolor="#4B8A08"></td><td bgcolor="#298A08"></td><td bgcolor="#088A08"></td><td bgcolor="#088A29"></td><td bgcolor="#088A4B"></td><td bgcolor="#088A68"></td><td bgcolor="#088A85"></td><td bgcolor="#086A87"></td><td bgcolor="#084B8A"></td><td bgcolor="#08298A"></td><td bgcolor="#08088A"></td><td bgcolor="#29088A"></td><td bgcolor="#4B088A"></td><td bgcolor="#6A0888"></td><td bgcolor="#8A0886"></td><td bgcolor="#8A0868"></td><td bgcolor="#8A084B"></td><td bgcolor="#8A0829"></td><td bgcolor="#424242"></td></tr>' +
  307. '<tr><td bgcolor="#610B0B"></td><td bgcolor="#61210B"></td><td bgcolor="#61380B"></td><td bgcolor="#5F4C0B"></td><td bgcolor="#5E610B"></td><td bgcolor="#4B610B"></td><td bgcolor="#38610B"></td><td bgcolor="#21610B"></td><td bgcolor="#0B610B"></td><td bgcolor="#0B6121"></td><td bgcolor="#0B6138"></td><td bgcolor="#0B614B"></td><td bgcolor="#0B615E"></td><td bgcolor="#0B4C5F"></td><td bgcolor="#0B3861"></td><td bgcolor="#0B2161"></td><td bgcolor="#0B0B61"></td><td bgcolor="#210B61"></td><td bgcolor="#380B61"></td><td bgcolor="#4C0B5F"></td><td bgcolor="#610B5E"></td><td bgcolor="#610B4B"></td><td bgcolor="#610B38"></td><td bgcolor="#610B21"></td><td bgcolor="#2E2E2E"></td></tr>' +
  308. '<tr><td bgcolor="#3B0B0B"></td><td bgcolor="#3B170B"></td><td bgcolor="#3B240B"></td><td bgcolor="#3A2F0B"></td><td bgcolor="#393B0B"></td><td bgcolor="#2E3B0B"></td><td bgcolor="#243B0B"></td><td bgcolor="#173B0B"></td><td bgcolor="#0B3B0B"></td><td bgcolor="#0B3B17"></td><td bgcolor="#0B3B24"></td><td bgcolor="#0B3B2E"></td><td bgcolor="#0B3B39"></td><td bgcolor="#0B2F3A"></td><td bgcolor="#0B243B"></td><td bgcolor="#0B173B"></td><td bgcolor="#0B0B3B"></td><td bgcolor="#170B3B"></td><td bgcolor="#240B3B"></td><td bgcolor="#2F0B3A"></td><td bgcolor="#3B0B39"></td><td bgcolor="#3B0B2E"></td><td bgcolor="#3B0B24"></td><td bgcolor="#3B0B17"></td><td bgcolor="#1C1C1C"></td></tr>' +
  309. '<tr><td bgcolor="#2A0A0A"></td><td bgcolor="#2A120A"></td><td bgcolor="#2A1B0A"></td><td bgcolor="#29220A"></td><td bgcolor="#292A0A"></td><td bgcolor="#222A0A"></td><td bgcolor="#1B2A0A"></td><td bgcolor="#122A0A"></td><td bgcolor="#0A2A0A"></td><td bgcolor="#0A2A12"></td><td bgcolor="#0A2A1B"></td><td bgcolor="#0A2A22"></td><td bgcolor="#0A2A29"></td><td bgcolor="#0A2229"></td><td bgcolor="#0A1B2A"></td><td bgcolor="#0A122A"></td><td bgcolor="#0A0A2A"></td><td bgcolor="#120A2A"></td><td bgcolor="#1B0A2A"></td><td bgcolor="#220A29"></td><td bgcolor="#2A0A29"></td><td bgcolor="#2A0A22"></td><td bgcolor="#2A0A1B"></td><td bgcolor="#2A0A12"></td><td bgcolor="#151515"></td></tr>' +
  310. '<tr><td bgcolor="#190707"></td><td bgcolor="#190B07"></td><td bgcolor="#191007"></td><td bgcolor="#181407"></td><td bgcolor="#181907"></td><td bgcolor="#141907"></td><td bgcolor="#101907"></td><td bgcolor="#0B1907"></td><td bgcolor="#071907"></td><td bgcolor="#07190B"></td><td bgcolor="#071910"></td><td bgcolor="#071914"></td><td bgcolor="#071918"></td><td bgcolor="#071418"></td><td bgcolor="#071019"></td><td bgcolor="#070B19"></td><td bgcolor="#070719"></td><td bgcolor="#0B0719"></td><td bgcolor="#100719"></td><td bgcolor="#140718"></td><td bgcolor="#190718"></td><td bgcolor="#190714"></td><td bgcolor="#190710"></td><td bgcolor="#19070B"></td><td bgcolor="#000000"></td></tr>' +
  311. '</tbody></table>';
  312. }
  313. if (jQuery.inArray('forecolor', excludes) < 0) {
  314. $("a.toolbar_forecolor").after("<ul class='dropdown-menu colorpanel'><input type='text' id='forecolor-input' value='#000000' style='margin-bottom: 0px' /><div id='forecolor-preview' style='height:20px; margin: 4px; cursor: pointer'></div>" + getColorChart("forecolor-chart") + "</ul>");
  315. $("#forecolor-chart td").on("mouseover", function () {
  316. $("#forecolor-preview").css("background-color", $(this).attr("bgcolor")).data("color", $(this).attr("bgcolor"));
  317. $("#forecolor-input").val($(this).attr("bgcolor"));
  318. });
  319. $("#forecolor-chart td").on("mousedown", function () {
  320. var color = $(this).attr("bgcolor");
  321. document.execCommand("forecolor", false, color);
  322. $(this).closest(".btn-group").removeClass("open");
  323. $(".toolbar_forecolor div").css({
  324. "color": color
  325. });
  326. });
  327. $("#forecolor-input").on("click", function (e) {
  328. e.stopImmediatePropagation();
  329. e.preventDefault();
  330. });
  331. $("#forecolor-input").on("keyup", function (e) {
  332. e.stopImmediatePropagation();
  333. e.preventDefault();
  334. $("#forecolor-preview").css("background-color", $("#forecolor-input").val()).data("color", $("#forecolor-input").val());
  335. });
  336. $("#forecolor-preview").on("mousedown", function () {
  337. var color = $(this).data("color");
  338. document.execCommand("forecolor", false, color);
  339. $(this).closest(".btn-group").removeClass("open");
  340. $(".toolbar_forecolor div").css({
  341. "color": color
  342. });
  343. });
  344. }
  345. if (jQuery.inArray('backcolor', excludes) < 0) {
  346. $("a.toolbar_bgcolor").after("<ul class='dropdown-menu colorpanel'><input type='text' id='bgcolor-input' value='#000000' style='margin-bottom: 0px' /><div id='bgcolor-preview' style='height:20px; margin: 4px; cursor: pointer'></div>" + getColorChart("bgcolor-chart") + "</ul>");
  347. $("#bgcolor-chart td").on("mouseover", function () {
  348. $("#bgcolor-preview").css("background-color", $(this).attr("bgcolor")).data("color", $(this).attr("bgcolor"));
  349. $("#bgcolor-input").val($(this).attr("bgcolor"));
  350. });
  351. $("#bgcolor-chart td").on("mousedown", function () {
  352. var color = $(this).attr("bgcolor");
  353. document.execCommand("backcolor", false, color);
  354. $(this).closest(".btn-group").removeClass("open");
  355. $(".toolbar_bgcolor div").css({
  356. "background-color": color
  357. });
  358. });
  359. $("#bgcolor-input").on("click", function (e) {
  360. e.stopImmediatePropagation();
  361. e.preventDefault();
  362. });
  363. $("#bgcolor-input").on("keyup", function (e) {
  364. e.stopImmediatePropagation();
  365. e.preventDefault();
  366. $("#bgcolor-preview").css("background-color", $("#bgcolor-input").val()).data("color", $("#bgcolor-input").val());
  367. });
  368. $("#bgcolor-preview").on("mousedown", function () {
  369. var color = $(this).data("color");
  370. document.execCommand("backcolor", false, color);
  371. $(this).closest(".btn-group").removeClass("open");
  372. $(".toolbar_bgcolor div").css({
  373. "background-color": color
  374. });
  375. });
  376. }
  377. $(this).on('focus', function() {
  378. var $this;
  379. $this = $(this);
  380. $this.data('before', $this.html());
  381. return $this;
  382. }).on('blur keyup paste', function() {
  383. var $this;
  384. $this = $(this);
  385. if ($this.data('before') !== $this.html()) {
  386. $this.data('before', $this.html());
  387. $this.trigger('change');
  388. }
  389. return $this;
  390. });
  391. $("a.toolbar-cmd").on('click', function() {
  392. var ceNode, cmd, dummy, range;
  393. cmd = $(this).attr('command');
  394. if ($(this).attr('userinput') === 'yes') {
  395. methods[cmd].apply(this);
  396. } else if ($(this).attr('block')) {
  397. methods['formatblock'].apply(this, ["<" + ($(this).attr('block')) + ">"]);
  398. } else {
  399. if ((cmd === 'justifyright') || (cmd === 'justifyleft') || (cmd === 'justifycenter') || (cmd === 'justifyfull')) {
  400. try {
  401. document.execCommand(cmd, false, null);
  402. } catch (e) {
  403. if (e && e.result === 2147500037) {
  404. range = window.getSelection().getRangeAt(0);
  405. dummy = document.createElement('br');
  406. ceNode = range.startContainer.parentNode;
  407. while ((ceNode != null) && ceNode.contentEditable !== 'true') {
  408. ceNode = ceNode.parentNode;
  409. }
  410. if (!ceNode) {
  411. throw 'Selected node is not editable!';
  412. }
  413. ceNode.insertBefore(dummy, ceNode.childNodes[0]);
  414. document.execCommand(cmd, false, null);
  415. dummy.parentNode.removeChild(dummy);
  416. } else if (console && console.log) {
  417. console.log(e);
  418. }
  419. }
  420. } else {
  421. if (typeof cmd != "undefined"){
  422. document.execCommand(cmd, false, null);
  423. }
  424. }
  425. }
  426. return false;
  427. });
  428. shortcuts = [
  429. {
  430. keys: 'Ctrl+l',
  431. method: function() {
  432. return methods.createlink.apply(this);
  433. }
  434. }, {
  435. keys: 'Ctrl+g',
  436. method: function() {
  437. return methods.insertimage.apply(this);
  438. }
  439. }, {
  440. keys: 'Ctrl+Alt+U',
  441. method: function() {
  442. return document.execCommand('insertunorderedlist', false, null);
  443. }
  444. }, {
  445. keys: 'Ctrl+Alt+O',
  446. method: function() {
  447. return document.execCommand('insertorderedlist', false, null);
  448. }
  449. }, {
  450. keys: 'Ctrl+q',
  451. method: function() {
  452. return methods.formatblock.apply(this, ["<blockquote>"]);
  453. }
  454. }, {
  455. keys: 'Ctrl+Alt+k',
  456. method: function() {
  457. return methods.formatblock.apply(this, ["<pre>"]);
  458. }
  459. }, {
  460. keys: 'Ctrl+.',
  461. method: function() {
  462. return document.execCommand('superscript', false, null);
  463. }
  464. }, {
  465. keys: 'Ctrl+Shift+.',
  466. method: function() {
  467. return document.execCommand('subscript', false, null);
  468. }
  469. }, {
  470. keys: 'Ctrl+Alt+0',
  471. method: function() {
  472. return methods.formatblock.apply(this, ["p"]);
  473. }
  474. }, {
  475. keys: 'Ctrl+b',
  476. method: function() {
  477. return document.execCommand('bold', false, null);
  478. }
  479. }, {
  480. keys: 'Ctrl+i',
  481. method: function() {
  482. return document.execCommand('italic', false, null);
  483. }
  484. }, {
  485. keys: 'Ctrl+Alt+1',
  486. method: function() {
  487. return methods.formatblock.apply(this, ["H1"]);
  488. }
  489. }, {
  490. keys: 'Ctrl+Alt+2',
  491. method: function() {
  492. return methods.formatblock.apply(this, ["H2"]);
  493. }
  494. }, {
  495. keys: 'Ctrl+Alt+3',
  496. method: function() {
  497. return methods.formatblock.apply(this, ["H3"]);
  498. }
  499. }, {
  500. keys: 'Ctrl+Alt+4',
  501. method: function() {
  502. return methods.formatblock.apply(this, ["H4"]);
  503. }
  504. }, {
  505. keys: 'Ctrl+m',
  506. method: function() {
  507. return document.execCommand("removeFormat", false, null);
  508. }
  509. }, {
  510. keys: 'Ctrl+u',
  511. method: function() {
  512. return document.execCommand('underline', false, null);
  513. }
  514. }, {
  515. keys: 'tab',
  516. method: function() {
  517. return document.execCommand('indent', false, null);
  518. }
  519. }, {
  520. keys: 'Ctrl+tab',
  521. method: function() {
  522. return document.execCommand('indent', false, null);
  523. }
  524. }, {
  525. keys: 'Shift+tab',
  526. method: function() {
  527. return document.execCommand('outdent', false, null);
  528. }
  529. }
  530. ];
  531. $.each(shortcuts, function(index, elem) {
  532. return shortcut.add(elem.keys, function() {
  533. elem.method();
  534. return false;
  535. }, {
  536. 'type': 'keydown',
  537. 'propagate': false
  538. });
  539. });
  540. return this.each(function() {
  541. var $this, data, tooltip;
  542. $this = $(this);
  543. data = $this.data('fresheditor');
  544. tooltip = $('<div/>', {
  545. text: $this.attr('title')
  546. });
  547. if (!data) {
  548. return $(this).data('fresheditor', {
  549. target: $this,
  550. tooltip: tooltip
  551. });
  552. }
  553. });
  554. }
  555. };
  556. return $.fn.freshereditor = function(method) {
  557. if (methods[method]) {
  558. methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
  559. } else if (typeof method === 'object' || !method) {
  560. methods.init.apply(this, arguments);
  561. } else {
  562. $.error('Method ' + method + ' does not exist on jQuery.contentEditable');
  563. }
  564. };
  565. })(jQuery);
  566. }).call(this);