PageRenderTime 21ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/CMSScripts/Dialogs/HTMLEditor.js

https://bitbucket.org/kudutest2/kenticogit
JavaScript | 334 lines | 289 code | 29 blank | 16 comment | 128 complexity | c7c4fc7ba4da47ac18160809e4c5ce67 MD5 | raw file
  1. var dialogOpener = null;
  2. function GetDialogOpener() {
  3. if (wopener != null) {
  4. dialogOpener = wopener;
  5. }
  6. if ((dialogOpener == null) || (dialogOpener.CKEDITOR == null)) {
  7. dialogOpener = (window.top.opener ? window.top.opener : window.top.dialogArguments);
  8. }
  9. }
  10. function InsertSelectedItem(obj) {
  11. if (obj) {
  12. // Get dialog opener window
  13. GetDialogOpener();
  14. if (dialogOpener != null) {
  15. if (dialogOpener.CKEDITOR != null) {
  16. dialogOpener.CMSPlugin.insert(obj);
  17. } else if (dialogOpener.insert != null) {
  18. dialogOpener.insert(obj);
  19. }
  20. }
  21. }
  22. }
  23. function GetSelectedItem() {
  24. GetDialogOpener();
  25. var obj = {};
  26. if ((dialogOpener != null) && ((dialogOpener.currentEditor != null) || (dialogOpener.CKEDITOR != null))) {
  27. var editorInst = (dialogOpener.currentEditor || dialogOpener.CMSPlugin.currentEditor);
  28. var selection = editorInst.getSelection(), originalElem = selElem = selection.getSelectedElement(), originalParent = null;
  29. // If element is selected
  30. if (selElem) {
  31. if (selElem.hasAttribute && selElem.hasAttribute('cms_inline')) {
  32. originalParent = selElem.$.parentNode;
  33. selElem = editorInst.restoreRealElement(selElem);
  34. }
  35. if (selElem.$) {
  36. selElem = selElem.$;
  37. }
  38. var elemName = selElem.tagName.toLowerCase();
  39. switch (elemName) {
  40. case 'object':
  41. case 'cke:object':
  42. obj = dialogOpener.CMSPlugin.getInline(selElem, originalElem);
  43. obj = GetLinkObj(obj, selElem, editorInst, originalParent);
  44. break;
  45. case 'img':
  46. obj = GetImageObj(selElem, editorInst);
  47. break;
  48. case 'a':
  49. obj = GetLinkObj(obj, selElem, editorInst);
  50. break;
  51. }
  52. } else {
  53. selElem = selection.getStartElement();
  54. if (selElem && selElem.is('a')) {
  55. obj = GetLinkObj(obj, selElem.$, editorInst);
  56. }
  57. // Else get selection range
  58. else {
  59. selElem = selection.getRanges(true)[0];
  60. var d = selElem.startOffset - selElem.endOffset;
  61. if (Math.abs(d) > 0) {
  62. obj.link_text = "##LINKTEXT##";
  63. obj.anchor_linktext = "##LINKTEXT##";
  64. obj.email_linktext = "##LINKTEXT##";
  65. }
  66. }
  67. }
  68. }
  69. // Escape all values
  70. for (var i in obj) {
  71. obj[i] = encodeURIComponent(obj[i]);
  72. }
  73. return obj;
  74. }
  75. function GetAnchorNames(editor) {
  76. var aAnchors = [];
  77. GetDialogOpener();
  78. if ((dialogOpener != null) && ((dialogOpener.currentEditor != null) || (dialogOpener.CKEDITOR != null))) {
  79. var editor = (dialogOpener.currentEditor || dialogOpener.CMSPlugin.currentEditor),
  80. i,
  81. elements = editor.document.getElementsByTag('img'),
  82. realAnchors = dialogOpener.CMSPlugin.getNodeList(editor.document.$.anchors),
  83. anchors = [];
  84. for (var i = 0; i < elements.count(); i++) {
  85. var item = elements.getItem(i);
  86. if (item.data('cke-realelement') && item.data('cke-real-element-type') == 'anchor')
  87. anchors.push(editor.restoreRealElement(item));
  88. }
  89. for (i = 0; i < realAnchors.count(); i++)
  90. anchors.push(realAnchors.getItem(i));
  91. for (i = 0; i < anchors.length; i++) {
  92. item = anchors[i].getAttribute('name');
  93. if (item && item.length > 0) {
  94. aAnchors.push(item);
  95. }
  96. }
  97. }
  98. return aAnchors;
  99. }
  100. function GetIds() {
  101. var aIds = [];
  102. GetDialogOpener();
  103. if ((dialogOpener != null) && ((dialogOpener.currentEditor != null) || (dialogOpener.CKEDITOR != null))) {
  104. var editor = (dialogOpener.currentEditor || dialogOpener.CMSPlugin.currentEditor);
  105. // Define a recursive function that search for the Ids.
  106. var fGetIds = function(parent) {
  107. for (var i = 0; i < parent.childNodes.length; i++) {
  108. var sId = parent.childNodes[i].id;
  109. // Check if the Id is defined for the element.
  110. if (sId && sId.length > 0)
  111. aIds[aIds.length] = sId;
  112. // Recursive call.
  113. fGetIds(parent.childNodes[i]);
  114. }
  115. }
  116. // Start the recursive calls.
  117. fGetIds(editor.document.$.body);
  118. }
  119. return aIds;
  120. }
  121. function GetImageObj(selElem, editor) {
  122. if (selElem.tagName.toLowerCase() == "img") {
  123. obj = new Object();
  124. obj.img_url = selElem.getAttribute('data-cke-saved-src');
  125. if (obj.img_url == null) {
  126. obj.img_url = selElem.src;
  127. }
  128. obj.img_alt = selElem.alt;
  129. obj.img_width = (parseInt(selElem.style.width, 10) > 0 ? parseInt(selElem.style.width, 10) : parseInt(selElem.width, 10));
  130. obj.img_height = (parseInt(selElem.style.height, 10) > 0 ? parseInt(selElem.style.height, 10) : parseInt(selElem.height, 10));
  131. obj.img_borderwidth = (parseInt(selElem.style.borderWidth, 10) > 0 ? parseInt(selElem.style.borderWidth, 10) : parseInt(selElem.border, 10));
  132. obj.img_bordercolor = GetColor(selElem.style.borderColor);
  133. obj.img_align = (selElem.align ? selElem.align : (selElem.style.cssFloat ? selElem.style.cssFloat : (selElem.style.styleFloat ? selElem.style.styleFloat : (selElem.style['vartical-align'] ? selElem.style['vartical-align'] : selElem.style.verticalAlign))));
  134. obj.img_hspace = (parseInt(selElem.hspace, 10) > 0 ? selElem.hspace : selElem.style.marginLeft);
  135. obj.img_vspace = (parseInt(selElem.vspace, 10) > 0 ? selElem.vspace : selElem.style.marginTop);
  136. // Advanced tab
  137. obj.img_id = selElem.id;
  138. obj.img_tooltip = selElem.title;
  139. obj.img_class = selElem.className;
  140. // Skip border if parsing failed (for named colors)
  141. var skipBorder = false;
  142. if ((selElem.style.borderColor != null) && (selElem.style.borderWidth != '') && (obj.img_bordercolor == '')) {
  143. obj.img_borderwidth = -1;
  144. skipBorder = true;
  145. }
  146. // Skip borders if there is different border for sides
  147. if ((selElem.style.borderTop != selElem.style.borderRight) || (selElem.style.borderRight != selElem.style.borderBottom) || (selElem.style.borderBottom != selElem.style.borderLeft)) {
  148. skipBorder = true;
  149. }
  150. // Skip margins if there is different margin for sides
  151. var skipMargin = false;
  152. if ((selElem.style.marginLeft != selElem.style.marginRight) || (selElem.style.marginTop != selElem.style.marginBottom)) {
  153. skipMargin = true;
  154. }
  155. var s = selElem.style.cssText.toLowerCase().split(';');
  156. var currentStyle = null;
  157. var outStyle = '';
  158. for (var i = 0; i < s.length; i++) {
  159. currentStyle = s[i].replace(/^\s+|\s+$/g, '');
  160. if (currentStyle != '') {
  161. if ((currentStyle.indexOf('border') >= 0)) {
  162. if (skipBorder) {
  163. outStyle += currentStyle + ';';
  164. // Reset border if margins are diferent
  165. obj.img_borderwidth = -1;
  166. obj.img_bordercolor = -1;
  167. }
  168. } else if ((currentStyle.indexOf('margin') >= 0)) {
  169. if (skipMargin) {
  170. outStyle += currentStyle + ';';
  171. // Reset H. Space and V. Space if margins are diferent
  172. obj.img_hspace = -1;
  173. obj.img_vspace = -1;
  174. }
  175. } else if ((currentStyle.indexOf('width') == -1) &&
  176. (currentStyle.indexOf('height') == -1) &&
  177. (currentStyle.indexOf('float') == -1) &&
  178. (currentStyle.indexOf('vertical-align') == -1) &&
  179. (currentStyle.indexOf('solid:') == -1)) {
  180. outStyle += currentStyle + ';';
  181. }
  182. }
  183. }
  184. obj.img_style = outStyle;
  185. // Get link from selected Elem
  186. obj = GetLinkObj(obj, selElem, editor);
  187. // Additional parameters
  188. obj.img_dir = selElem.dir;
  189. obj.img_usemap = selElem.useMap;
  190. obj.img_longdescription = selElem.longDesc;
  191. obj.img_lang = selElem.lang;
  192. return obj;
  193. }
  194. }
  195. function GetLinkObj(obj, selElem, editor, originalParent) {
  196. if (selElem != null) {
  197. var link = GetLinkElement(selElem, originalParent);
  198. if (link != null) {
  199. if (obj == null) {
  200. obj = new Object();
  201. }
  202. var url = link.getAttribute('data-cke-saved-href');
  203. if (url == null) {
  204. url = link.href;
  205. }
  206. var isEmail = /mailto:(.*)/i.test(url);
  207. var isAnchor = /((.*)\/)*(.*)#([^#]*)/.test(url);
  208. var hideText = editor.getSelection();
  209. if (isEmail) {
  210. var to = url.match(/mailto:([^?]*)(?:.*)/i);
  211. var cc = url.match(/(?:.*)(?:[^b]cc=([^&]*)&?)(?:.*)/i);
  212. var bcc = url.match(/(?:.*)(?:bcc=([^&]*)&?)(?:.*)/i);
  213. var subject = url.match(/(?:.*)(?:subject=([^&]*)&?)(?:.*)/i);
  214. var body = url.match(/(?:.*)(?:body=([^&]*)&?)(?:.*)/i);
  215. obj.email_linktext = link.textContent;
  216. obj.email_protocol = this.GetProtocol(url);
  217. obj.email_url = link.href;
  218. obj.email_to = (to ? to[1] : '');
  219. obj.email_cc = (cc ? cc[1] : '');
  220. obj.email_bcc = (bcc ? bcc[1] : '');
  221. obj.email_subject = (subject ? subject[1] : '');
  222. obj.email_body = (body ? body[1] : '');
  223. obj.email_target = link.target;
  224. obj.email_id = link.id;
  225. obj.email_name = link.name;
  226. obj.email_tooltip = link.title;
  227. obj.email_class = link.className.replace('cke_anchor', '');
  228. obj.email_style = (link.style.cssText ? link.style.cssText.toLowerCase() : '');
  229. obj.img_link = url;
  230. } else if (isAnchor) {
  231. var anchor_name = url.match(/(?:.*)#(.*)/);
  232. obj.anchor_linktext = link.innerText;
  233. obj.anchor_target = link.target;
  234. obj.anchor_id = link.id;
  235. obj.anchor_name = (anchor_name[1] ? anchor_name[1] : '');
  236. obj.anchor_tooltip = link.title;
  237. obj.anchor_class = link.className.replace('cke_anchor', '');
  238. obj.anchor_style = (link.style.cssText ? link.style.cssText.toLowerCase() : '');
  239. obj.anchor_protocol = this.GetProtocol(url);
  240. obj.img_link = url;
  241. } else {
  242. obj.img_link = url;
  243. obj.img_target = link.target;
  244. obj.link_target = link.target;
  245. var protocolIndex = url.indexOf('://');
  246. if (protocolIndex != -1) {
  247. obj.link_url = url;
  248. obj.link_protocol = url.substring(0, protocolIndex + 3);
  249. } else {
  250. obj.link_url = url;
  251. obj.link_protocol = 'other';
  252. }
  253. obj.link_text = (link.textContent ? link.textContent : '');
  254. obj.link_id = link.id;
  255. obj.link_name = link.name;
  256. obj.link_tooltip = link.title;
  257. obj.link_class = link.className.replace('cke_anchor', '');
  258. obj.link_style = (link.style.cssText ? link.style.cssText.toLowerCase() : '');
  259. }
  260. }
  261. }
  262. return obj;
  263. }
  264. function GetLinkElement(node, originalParent) {
  265. if ((node != null) && (node.tagName != null)) {
  266. if (node.tagName.toLowerCase() == "a") {
  267. return node;
  268. } else {
  269. if (node.tagName.toLowerCase() == "body") {
  270. return null;
  271. } else if (node.parentNode) {
  272. return GetLinkElement(node.parentNode);
  273. }
  274. else {
  275. return GetLinkElement(originalParent);
  276. }
  277. }
  278. }
  279. }
  280. function GetColor(color) {
  281. color = color.toLowerCase();
  282. if (color.indexOf('rgb') != -1) {
  283. var match = color.match(/rgb(?:[^0-9]*)([0-9]+)(?:[^0-9]*)([0-9]+)(?:[^0-9]*)([0-9]+)(?:[^0-9]*)/);
  284. var r = parseInt(match[1], 10);
  285. var g = parseInt(match[2], 10);
  286. var b = parseInt(match[3], 10);
  287. return '#' + (r > 16 ? r.toString(16) : '0' + r.toString(16)) + (g > 16 ? g.toString(16) : '0' + g.toString(16)) + (b > 16 ? b.toString(16) : '0' + b.toString(16));
  288. } else {
  289. if (color.indexOf('#') != -1) {
  290. var match = color.match(/(?:[^#0-9a-f]*)([a-f0-9]+)/);
  291. if (match[1] != null) {
  292. return '#' + match[1];
  293. }
  294. } else {
  295. return '';
  296. }
  297. }
  298. }
  299. function GetProtocol(url) {
  300. var i = url.indexOf('://');
  301. if (i > 0) {
  302. return url.substring(0, i + 3);
  303. }
  304. return '';
  305. }