// Epoz - a cross-browser-wysiwyg-editor for Zope // Copyright (C) 2005 Maik Jablonski ([email protected]) // Just to prevent typos when fetching the Epoz-IFrame... var Epoz = "EpozEditor"; // Speed-Up-Storage for document.getElementById(Epoz); var EpozElement; var EpozTextArea; // Global storages var form_data; // the document-data var form_name; // the name of the form-element var form_path; // path to buttons, font-selectors, ... var form_toolbox; // path to optional toolbox var form_area_style; // css-definition for wysiwyg-area var form_button_style; // css-definition for buttons var form_css; // css-style for iframe var form_customcss; // customized css-style for iframe var form_charset; // charset for iframe var form_pageurl; // real url for the edited page // Returns the current HTML. function GetHTML(source_mode) { if (source_mode == null) { source_mode = document.getElementById('EpozViewMode').checked; } if (source_mode) { return EpozTextArea.value; } else { try { return EpozElement.contentWindow.document.body.innerHTML; } catch (e) { return EpozElement.value; } } } // Just a XMLRPC to a web-service to clean up the html function TidyHTML(html) { window.status = EpozLang["TidyStart"]; try { // Call EpozTidy one step above the given pageurl. // This should avoid some problems with VHM & PageTemplates etc. xmlrpchost = form_pageurl + "/.."; result = XMLRPC.call(xmlrpchost, "EpozTidy", html, form_pageurl); errors = result[0]; output = result[1]; errordata = result[2]; if (errors != 0) { window.status = EpozLang["TidyError"]; alert(errordata); } else { window.status = EpozLang["TidyStop"]; } return (output); } catch (e) { return (html); } } // Here are the definitions for the control-and-format-functions // Format text with RichText-Controls function FormatText(command, option) { EpozElement.contentWindow.focus(); // Mozilla inserts css-styles per default if (browser.isGecko) { EpozElement.contentWindow.document.execCommand('useCSS',false, true); } EpozElement.contentWindow.document.execCommand(command, false, option); } // Insert arbitrary HTML at current selection function InsertHTML(html) { EpozElement.contentWindow.focus(); if (browser.isIE5up) { selection = EpozElement.contentWindow.document.selection; range = selection.createRange(); try { range.pasteHTML(html); } catch (e) { // catch error when range is evil for IE } } else { selection = EpozElement.contentWindow.window.getSelection(); EpozElement.contentWindow.focus(); if (selection) { range = selection.getRangeAt(0); } else { range = EpozElement.contentWindow.document.createRange(); } var fragment = EpozElement.contentWindow.document.createDocumentFragment(); var div = EpozElement.contentWindow.document.createElement("div"); div.innerHTML = html; while (div.firstChild) { fragment.appendChild(div.firstChild); } selection.removeAllRanges(); range.deleteContents(); var node = range.startContainer; var pos = range.startOffset; switch (node.nodeType) { case 3: if (fragment.nodeType == 3) { node.insertData(pos, fragment.data); range.setEnd(node, pos + fragment.length); range.setStart(node, pos + fragment.length); } else { node = node.splitText(pos); node.parentNode.insertBefore(fragment, node); range.setEnd(node, pos + fragment.length); range.setStart(node, pos + fragment.length); } break; case 1: node = node.childNodes[pos]; node.parentNode.insertBefore(fragment, node); range.setEnd(node, pos + fragment.length); range.setStart(node, pos + fragment.length); break; } selection.addRange(range); } } // Create an anchor - no browser supports this directly function CreateAnchor(name) { name = prompt(EpozLang["EnterAnchorName"], ""); if (name) { anchorhtml = ''; InsertHTML(anchorhtml); } } // Create a Hyperlink - IE has its own implementation function CreateLink(URL) { if (browser.isIE5up == false && ((URL == null) || (URL == ""))) { URL = prompt(EpozLang["EnterLinkURL"], ""); if ((URL != null) && (URL != "")) { EpozElement.contentWindow.document.execCommand("CreateLink",false,URL) } else { EpozElement.contentWindow.document.execCommand("Unlink",false, "") } } else { EpozElement.contentWindow.document.execCommand("CreateLink",false,URL) } } // Insert image via a URL function CreateImage(URL) { if ((URL == null) || (URL == "")) { URL = prompt(EpozLang["EnterImageURL"], ""); } if ((URL != null) && (URL != "")) { EpozElement.contentWindow.focus() EpozElement.contentWindow.document.execCommand('InsertImage', false, URL); } } // Creates a simple table function CreateTable(rows, cols, border, head) { rows = parseInt(rows); cols = parseInt(cols); if ((rows > 0) && (cols > 0)) { table = ' \n'; for (var i=0; i < rows; i++) { table = table + " \n"; for (var j=0; j < cols; j++) { if(i==0 && head=="1") { table += " \n"; } else { table += " \n"; } } table += " \n"; } table += "
# #
\n"; InsertHTML(table); } EpozElement.contentWindow.focus() } // Sets selected formats function SelectFormat(selectname) { // First one is only a label if (selectname.selectedIndex != 0) { EpozElement.contentWindow.document.execCommand(selectname.id, false, selectname.options[selectname.selectedIndex].value); selectname.selectedIndex = 0; } EpozElement.contentWindow.focus(); } // Sets foreground-color function SetTextColor() { EpozColorCommand='forecolor'; window.open(form_path+'epoz_script_color.html','EpozColor','toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=220,height=220'); } // Sets background-color function SetBackColor() { EpozColorCommand='backcolor'; window.open(form_path+'epoz_script_color.html','EpozColor','toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=220,height=220'); } // Submit color-command to Rich-Text-Controls function SetColor(color) { if (browser.isGecko) { EpozElement.contentWindow.document.execCommand('useCSS',false, false); } EpozElement.contentWindow.document.execCommand(EpozColorCommand, false, color); EpozElement.contentWindow.focus(); } // Switch between Source- and Wysiwyg-View function SwitchViewMode(source_mode) { var html = GetHTML(!source_mode); if (source_mode) { EpozTextArea.value=TidyHTML(html); document.getElementById("EpozToolbar").style.display="none"; EpozTextArea.style.display="inline"; } else { html = html.replace(' ', '') EpozElement.contentWindow.document.body.innerHTML = html; document.getElementById("EpozToolbar").style.display="inline"; EpozTextArea.style.display="none"; if (browser.isGecko) { EpozElement.contentDocument.designMode = "on"; } } } // Keyboard-Handler for Mozilla (supports same shortcuts as IE) function HandleKeyboardEvent(event) { if (event.ctrlKey) { var key = String.fromCharCode(event.charCode).toLowerCase(); switch (key) { case 'b': FormatText('bold',''); event.preventDefault(); break; case 'i': FormatText('italic',''); event.preventDefault(); break; case 'u': FormatText('underline',''); event.preventDefault(); break; case 'k': CreateLink(); event.preventDefault(); break; }; } }