/CMSScripts/Dialogs/HTMLEditor.js
JavaScript | 334 lines | 289 code | 29 blank | 16 comment | 128 complexity | c7c4fc7ba4da47ac18160809e4c5ce67 MD5 | raw file
- var dialogOpener = null;
- function GetDialogOpener() {
- if (wopener != null) {
- dialogOpener = wopener;
- }
- if ((dialogOpener == null) || (dialogOpener.CKEDITOR == null)) {
- dialogOpener = (window.top.opener ? window.top.opener : window.top.dialogArguments);
- }
- }
- function InsertSelectedItem(obj) {
- if (obj) {
- // Get dialog opener window
- GetDialogOpener();
- if (dialogOpener != null) {
- if (dialogOpener.CKEDITOR != null) {
- dialogOpener.CMSPlugin.insert(obj);
- } else if (dialogOpener.insert != null) {
- dialogOpener.insert(obj);
- }
- }
- }
- }
- function GetSelectedItem() {
- GetDialogOpener();
- var obj = {};
- if ((dialogOpener != null) && ((dialogOpener.currentEditor != null) || (dialogOpener.CKEDITOR != null))) {
- var editorInst = (dialogOpener.currentEditor || dialogOpener.CMSPlugin.currentEditor);
- var selection = editorInst.getSelection(), originalElem = selElem = selection.getSelectedElement(), originalParent = null;
- // If element is selected
- if (selElem) {
- if (selElem.hasAttribute && selElem.hasAttribute('cms_inline')) {
- originalParent = selElem.$.parentNode;
- selElem = editorInst.restoreRealElement(selElem);
- }
- if (selElem.$) {
- selElem = selElem.$;
- }
- var elemName = selElem.tagName.toLowerCase();
- switch (elemName) {
- case 'object':
- case 'cke:object':
- obj = dialogOpener.CMSPlugin.getInline(selElem, originalElem);
- obj = GetLinkObj(obj, selElem, editorInst, originalParent);
- break;
- case 'img':
- obj = GetImageObj(selElem, editorInst);
- break;
- case 'a':
- obj = GetLinkObj(obj, selElem, editorInst);
- break;
- }
- } else {
- selElem = selection.getStartElement();
- if (selElem && selElem.is('a')) {
- obj = GetLinkObj(obj, selElem.$, editorInst);
- }
- // Else get selection range
- else {
- selElem = selection.getRanges(true)[0];
- var d = selElem.startOffset - selElem.endOffset;
- if (Math.abs(d) > 0) {
- obj.link_text = "##LINKTEXT##";
- obj.anchor_linktext = "##LINKTEXT##";
- obj.email_linktext = "##LINKTEXT##";
- }
- }
- }
- }
- // Escape all values
- for (var i in obj) {
- obj[i] = encodeURIComponent(obj[i]);
- }
- return obj;
- }
- function GetAnchorNames(editor) {
- var aAnchors = [];
- GetDialogOpener();
- if ((dialogOpener != null) && ((dialogOpener.currentEditor != null) || (dialogOpener.CKEDITOR != null))) {
- var editor = (dialogOpener.currentEditor || dialogOpener.CMSPlugin.currentEditor),
- i,
- elements = editor.document.getElementsByTag('img'),
- realAnchors = dialogOpener.CMSPlugin.getNodeList(editor.document.$.anchors),
- anchors = [];
- for (var i = 0; i < elements.count(); i++) {
- var item = elements.getItem(i);
- if (item.data('cke-realelement') && item.data('cke-real-element-type') == 'anchor')
- anchors.push(editor.restoreRealElement(item));
- }
- for (i = 0; i < realAnchors.count(); i++)
- anchors.push(realAnchors.getItem(i));
- for (i = 0; i < anchors.length; i++) {
- item = anchors[i].getAttribute('name');
- if (item && item.length > 0) {
- aAnchors.push(item);
- }
- }
- }
- return aAnchors;
- }
- function GetIds() {
- var aIds = [];
- GetDialogOpener();
- if ((dialogOpener != null) && ((dialogOpener.currentEditor != null) || (dialogOpener.CKEDITOR != null))) {
- var editor = (dialogOpener.currentEditor || dialogOpener.CMSPlugin.currentEditor);
- // Define a recursive function that search for the Ids.
- var fGetIds = function(parent) {
- for (var i = 0; i < parent.childNodes.length; i++) {
- var sId = parent.childNodes[i].id;
- // Check if the Id is defined for the element.
- if (sId && sId.length > 0)
- aIds[aIds.length] = sId;
- // Recursive call.
- fGetIds(parent.childNodes[i]);
- }
- }
- // Start the recursive calls.
- fGetIds(editor.document.$.body);
- }
- return aIds;
- }
- function GetImageObj(selElem, editor) {
- if (selElem.tagName.toLowerCase() == "img") {
- obj = new Object();
- obj.img_url = selElem.getAttribute('data-cke-saved-src');
- if (obj.img_url == null) {
- obj.img_url = selElem.src;
- }
- obj.img_alt = selElem.alt;
- obj.img_width = (parseInt(selElem.style.width, 10) > 0 ? parseInt(selElem.style.width, 10) : parseInt(selElem.width, 10));
- obj.img_height = (parseInt(selElem.style.height, 10) > 0 ? parseInt(selElem.style.height, 10) : parseInt(selElem.height, 10));
- obj.img_borderwidth = (parseInt(selElem.style.borderWidth, 10) > 0 ? parseInt(selElem.style.borderWidth, 10) : parseInt(selElem.border, 10));
- obj.img_bordercolor = GetColor(selElem.style.borderColor);
- 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))));
- obj.img_hspace = (parseInt(selElem.hspace, 10) > 0 ? selElem.hspace : selElem.style.marginLeft);
- obj.img_vspace = (parseInt(selElem.vspace, 10) > 0 ? selElem.vspace : selElem.style.marginTop);
- // Advanced tab
- obj.img_id = selElem.id;
- obj.img_tooltip = selElem.title;
- obj.img_class = selElem.className;
- // Skip border if parsing failed (for named colors)
- var skipBorder = false;
- if ((selElem.style.borderColor != null) && (selElem.style.borderWidth != '') && (obj.img_bordercolor == '')) {
- obj.img_borderwidth = -1;
- skipBorder = true;
- }
- // Skip borders if there is different border for sides
- if ((selElem.style.borderTop != selElem.style.borderRight) || (selElem.style.borderRight != selElem.style.borderBottom) || (selElem.style.borderBottom != selElem.style.borderLeft)) {
- skipBorder = true;
- }
- // Skip margins if there is different margin for sides
- var skipMargin = false;
- if ((selElem.style.marginLeft != selElem.style.marginRight) || (selElem.style.marginTop != selElem.style.marginBottom)) {
- skipMargin = true;
- }
- var s = selElem.style.cssText.toLowerCase().split(';');
- var currentStyle = null;
- var outStyle = '';
- for (var i = 0; i < s.length; i++) {
- currentStyle = s[i].replace(/^\s+|\s+$/g, '');
- if (currentStyle != '') {
- if ((currentStyle.indexOf('border') >= 0)) {
- if (skipBorder) {
- outStyle += currentStyle + ';';
- // Reset border if margins are diferent
- obj.img_borderwidth = -1;
- obj.img_bordercolor = -1;
- }
- } else if ((currentStyle.indexOf('margin') >= 0)) {
- if (skipMargin) {
- outStyle += currentStyle + ';';
- // Reset H. Space and V. Space if margins are diferent
- obj.img_hspace = -1;
- obj.img_vspace = -1;
- }
- } else if ((currentStyle.indexOf('width') == -1) &&
- (currentStyle.indexOf('height') == -1) &&
- (currentStyle.indexOf('float') == -1) &&
- (currentStyle.indexOf('vertical-align') == -1) &&
- (currentStyle.indexOf('solid:') == -1)) {
- outStyle += currentStyle + ';';
- }
- }
- }
- obj.img_style = outStyle;
- // Get link from selected Elem
- obj = GetLinkObj(obj, selElem, editor);
- // Additional parameters
- obj.img_dir = selElem.dir;
- obj.img_usemap = selElem.useMap;
- obj.img_longdescription = selElem.longDesc;
- obj.img_lang = selElem.lang;
- return obj;
- }
- }
- function GetLinkObj(obj, selElem, editor, originalParent) {
- if (selElem != null) {
- var link = GetLinkElement(selElem, originalParent);
- if (link != null) {
- if (obj == null) {
- obj = new Object();
- }
- var url = link.getAttribute('data-cke-saved-href');
- if (url == null) {
- url = link.href;
- }
- var isEmail = /mailto:(.*)/i.test(url);
- var isAnchor = /((.*)\/)*(.*)#([^#]*)/.test(url);
- var hideText = editor.getSelection();
- if (isEmail) {
- var to = url.match(/mailto:([^?]*)(?:.*)/i);
- var cc = url.match(/(?:.*)(?:[^b]cc=([^&]*)&?)(?:.*)/i);
- var bcc = url.match(/(?:.*)(?:bcc=([^&]*)&?)(?:.*)/i);
- var subject = url.match(/(?:.*)(?:subject=([^&]*)&?)(?:.*)/i);
- var body = url.match(/(?:.*)(?:body=([^&]*)&?)(?:.*)/i);
- obj.email_linktext = link.textContent;
- obj.email_protocol = this.GetProtocol(url);
- obj.email_url = link.href;
- obj.email_to = (to ? to[1] : '');
- obj.email_cc = (cc ? cc[1] : '');
- obj.email_bcc = (bcc ? bcc[1] : '');
- obj.email_subject = (subject ? subject[1] : '');
- obj.email_body = (body ? body[1] : '');
- obj.email_target = link.target;
- obj.email_id = link.id;
- obj.email_name = link.name;
- obj.email_tooltip = link.title;
- obj.email_class = link.className.replace('cke_anchor', '');
- obj.email_style = (link.style.cssText ? link.style.cssText.toLowerCase() : '');
- obj.img_link = url;
- } else if (isAnchor) {
- var anchor_name = url.match(/(?:.*)#(.*)/);
- obj.anchor_linktext = link.innerText;
- obj.anchor_target = link.target;
- obj.anchor_id = link.id;
- obj.anchor_name = (anchor_name[1] ? anchor_name[1] : '');
- obj.anchor_tooltip = link.title;
- obj.anchor_class = link.className.replace('cke_anchor', '');
- obj.anchor_style = (link.style.cssText ? link.style.cssText.toLowerCase() : '');
- obj.anchor_protocol = this.GetProtocol(url);
- obj.img_link = url;
- } else {
- obj.img_link = url;
- obj.img_target = link.target;
- obj.link_target = link.target;
- var protocolIndex = url.indexOf('://');
- if (protocolIndex != -1) {
- obj.link_url = url;
- obj.link_protocol = url.substring(0, protocolIndex + 3);
- } else {
- obj.link_url = url;
- obj.link_protocol = 'other';
- }
- obj.link_text = (link.textContent ? link.textContent : '');
- obj.link_id = link.id;
- obj.link_name = link.name;
- obj.link_tooltip = link.title;
- obj.link_class = link.className.replace('cke_anchor', '');
- obj.link_style = (link.style.cssText ? link.style.cssText.toLowerCase() : '');
- }
- }
- }
- return obj;
- }
- function GetLinkElement(node, originalParent) {
- if ((node != null) && (node.tagName != null)) {
- if (node.tagName.toLowerCase() == "a") {
- return node;
- } else {
- if (node.tagName.toLowerCase() == "body") {
- return null;
- } else if (node.parentNode) {
- return GetLinkElement(node.parentNode);
- }
- else {
- return GetLinkElement(originalParent);
- }
- }
- }
- }
- function GetColor(color) {
- color = color.toLowerCase();
- if (color.indexOf('rgb') != -1) {
- var match = color.match(/rgb(?:[^0-9]*)([0-9]+)(?:[^0-9]*)([0-9]+)(?:[^0-9]*)([0-9]+)(?:[^0-9]*)/);
- var r = parseInt(match[1], 10);
- var g = parseInt(match[2], 10);
- var b = parseInt(match[3], 10);
- 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));
- } else {
- if (color.indexOf('#') != -1) {
- var match = color.match(/(?:[^#0-9a-f]*)([a-f0-9]+)/);
- if (match[1] != null) {
- return '#' + match[1];
- }
- } else {
- return '';
- }
- }
- }
- function GetProtocol(url) {
- var i = url.indexOf('://');
- if (i > 0) {
- return url.substring(0, i + 3);
- }
- return '';
- }