// // htmlArea v2.02 - Copyright (c) 2002 interactivetools.com, inc. // This copyright notice MUST stay intact for use (see license.txt). // // A free WYSIWYG editor replacement for '; // add context menu editor += ''; // hide original textarea and insert htmlarea after it if (!config.debug) { document.all[objname].style.display = "none"; } if (config.plaintextInput) { // replace nextlines with breaks var contents = document.all[objname].value; contents = contents.replace(/\r\n/g, '
'); contents = contents.replace(/\n/g, '
'); contents = contents.replace(/\r/g, '
'); document.all[objname].value = contents; } // insert wysiwyg document.all[objname].insertAdjacentHTML('afterEnd', editor) // convert htmlarea from textarea to wysiwyg editor editor_setmode(objname, 'init'); // call filterOutput when user submits form for (var idx=0; idx < document.forms.length; idx++) { var r = document.forms[idx].attachEvent('onsubmit', function() { editor_filterOutput(objname); }); if (!r) { alert("Error attaching event to form!"); } } return true; } /* ---------------------------------------------------------------------- *\ Function : editor_action Description : perform an editor command on selected editor content Usage : Arguments : button_id - button id string with editor and action name \* ---------------------------------------------------------------------- */ function editor_action(button_id) { // split up button name into "editorID" and "cmdID" var BtnParts = Array(); BtnParts = button_id.split("_"); var objname = button_id.replace(/^_(.*)_[^_]*$/, '$1'); var cmdID = BtnParts[ BtnParts.length-1 ]; var button_obj = document.all[button_id]; var editor_obj = document.all["_" +objname + "_editor"]; var config = document.all[objname].config; // help popup if (cmdID == 'showhelp') { window.open(_editor_url + "popups/editor_help.html", 'EditorHelp'); return; } // popup editor if (cmdID == 'popupeditor') { window.open(_editor_url + "popups/fullscreen.html?"+objname, 'FullScreen', 'toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,width=640,height=480'); return; } // check editor mode (don't perform actions in textedit mode) if (editor_obj.tagName.toLowerCase() == 'textarea') { return; } var editdoc = editor_obj.contentWindow.document; editor_focus(editor_obj); // get index and value for pulldowns var idx = button_obj.selectedIndex; var val = (idx != null) ? button_obj[ idx ].value : null; if (0) {} // use else if for easy cutting and pasting // // CUSTOM BUTTONS START HERE // // special characters else if (cmdID == 'SpecChar') { var newchar = showModalDialog(_editor_url + "popups/insert_char.html", '', "dialogWidth:493px; dialogHeight: 140px; resizable: no; help: no; status: no; scroll: no;"); if (newchar == '') {return;} else {editor_insertHTML(objname,newchar);} } // Insert a smiley else if (cmdID == 'Smileys') { // insert some text from a popup window var myTitle = "Insert a Smiley"; var myText = showModalDialog(_editor_url + "popups/insert_smiley.html", myTitle, // str or obj specified here can be read from dialog as "window.dialogArguments" "resizable: yes; help: no; status: no; scroll: yes; "); if (myText) { editor_insertHTML(objname, myText); } } // Find function if (cmdID == 'Find') { setGlobalVar ("_editor_field",objname); var findRange = editor_obj.contentWindow.document.body.createTextRange(); showModelessDialog(_editor_url + "popups/find.html",window, "resizable: no; help: no; status: no; scroll: no; "); return; } // Custom1 else if (cmdID == 'custom1') { alert("Hello, I am custom button 1!"); } // Custom2 else if (cmdID == 'Macros') { // insert some text from a popup window var myTitle = "Insert WebGUI Macro"; var myText = showModalDialog(_editor_url + "popups/macros.html", myTitle, // str or obj specified here can be read from dialog as "window.dialogArguments" "resizable: yes; help: no; status: no; scroll: no; "); if (myText) { editor_insertHTML(objname, myText); } } // Custom3 else if (cmdID == 'custom3') { // insert some text editor_insertHTML(objname, "It's easy to add buttons that insert text!"); } else if (cmdID == 'spell') { if(! spellEnabled()) alert('Unable to start MS Word for spell checking.\nActive X is not enabled for this site or MS Word is not available.'); else { editdoc.execCommand('copy'); if (editdoc.selection.createRange().text != "") {CheckDocument(); return true;} else {alert('Nothing to spellcheck. Please select the text you want HTMLArea to check.\nTo avoid unexpected results, we recommend you to select complete paragraphs.');} } } else if (cmdID == 'word') { var oTags = editdoc.all.tags("SPAN"); if (oTags != null) { for (var i = oTags.length - 1; i >= 0; i--) { oTags[i].outerHTML = oTags[i].innerHTML; } } oTags = editdoc.all.tags("FONT"); if (oTags != null) { for (var i = oTags.length - 1; i >= 0; i--) { oTags[i].outerHTML = oTags[i].innerHTML; } } oTags = editdoc.all.tags("P"); if (oTags != null) { for (var i = oTags.length - 1; i >= 0; i--) { cleanEmptyTag(oTags[i]); } } oTags = editdoc.all.tags("H1"); if (oTags != null) { for (var i = oTags.length - 1; i >= 0; i--) { cleanEmptyTag(oTags[i]); } } oTags = editdoc.all.tags("H2"); if (oTags != null) { for (var i = oTags.length - 1; i >= 0; i--) { cleanEmptyTag(oTags[i]); } } oTags = editdoc.all.tags("H3"); if (oTags != null) { for (var i = oTags.length - 1; i >= 0; i--) { cleanEmptyTag(oTags[i]); } } oTags = editdoc.all.tags("H4"); if (oTags != null) { for (var i = oTags.length - 1; i >= 0; i--) { cleanEmptyTag(oTags[i]); } } oTags = editdoc.all.tags("OL"); if (oTags != null) { for (var i = oTags.length - 1; i >= 0; i--) { cleanEmptyTag(oTags[i]); } } oTags = editdoc.all.tags("UL"); if (oTags != null) { for (var i = oTags.length - 1; i >= 0; i--) { cleanEmptyTag(oTags[i]); } } } // // END OF CUSTOM BUTTONS // // FontName else if (cmdID == 'FontName' && val) { editdoc.execCommand(cmdID,0,val); } // FontSize else if (cmdID == 'FontSize' && val) { editdoc.execCommand(cmdID,0,val); } // FontStyle (change CSS className) else if (cmdID == 'FontStyle' && val) { editdoc.execCommand('RemoveFormat'); editdoc.execCommand('FontName',0,'636c6173734e616d6520706c616365686f6c646572'); var fontArray = editdoc.all.tags("FONT"); for (i=0; i tag. Now let's extract... // 1. the href attribute var href_value = fullElement.split(/href=/); href_value2 = href_value[1].split(/\s|>/); href_attribute = href_value2[0]; // 2. the target attribute if (fullElement.search(/target=/) != -1) { var tar = fullElement.split(/target=/); tar2 = tar[1].split(/\s|>/); tar_attribute = tar2[0]; } else { tar_attribute = ''; } // 3. the link text var linkText2 = fullElement.split(/>/); var lt = linkText2[1].split(/= 0; k--) { if (tmp.children[k] != null) { cleanEmptyTag(tmp.children[k]); } } } var oAttribs = oElem.attributes; if (oAttribs != null) { for (var j = oAttribs.length - 1; j >=0; j--) { var oAttrib = oAttribs[j]; if (oAttrib.nodeValue != null) { oAttribs.removeNamedItem('class') } } } oElem.style.cssText = ''; if (oElem.innerHTML == '' || oElem.innerHTML == ' ') { oElem.outerHTML = ''; } } function cleanTable(oElem) { oElem.style.cssText = ''; var oAttribs = oElem.attributes; if (oAttribs != null) { for (var j = oAttribs.length - 1; j >=0; j--) { var oAttrib = oAttribs[j]; if (oAttrib.nodeValue != null) { oAttribs.removeNamedItem('class') } } } var oTR = oElem.rows; if (oTR != null) { for (var r = oTR.length - 1; r >= 0; r--) { oTR[r].style.cssText = ''; } } var oTD = oElem.cells; if (oTD != null) { for (var t = oTD.length - 1; t >= 0; t--) { oTD[t].style.cssText = ''; } } } /* ---------------------------------------------------------------------- *\ Function : editor_event Description : called everytime an editor event occurs Usage : editor_event(objname, runDelay, eventName) Arguments : objname - ID of textarea to replace runDelay: -1 = run now, no matter what 0 = run now, if allowed 1000 = run in 1 sec, if allowed at that point \* ---------------------------------------------------------------------- */ function editor_event(objname,runDelay) { var config = document.all[objname].config; var editor_obj = document.all["_" +objname+ "_editor"]; // html editor object if (runDelay == null) { runDelay = 0; } var editdoc; var editEvent = editor_obj.contentWindow ? editor_obj.contentWindow.event : event; // catch keypress events if (editEvent && editEvent.keyCode) { var ord = editEvent.keyCode; // ascii order of key pressed var ctrlKey = editEvent.ctrlKey; var altKey = editEvent.altKey; var shiftKey = editEvent.shiftKey; if (ord == 16) { return; } // ignore shift key by itself if (ord == 17) { return; } // ignore ctrl key by itself if (ord == 18) { return; } // ignore alt key by itself // cancel ENTER key and insert
instead // if (ord == 13 && editEvent.type == 'keypress') { // editEvent.returnValue = false; // editor_insertHTML(objname, "
"); // return; // } if (ctrlKey && (ord == 122 || ord == 90)) { // catch ctrl-z (UNDO) // TODO: Add our own undo/redo functionality // editEvent.cancelBubble = true; return; } if ((ctrlKey && (ord == 121 || ord == 89)) || ctrlKey && shiftKey && (ord == 122 || ord == 90)) { // catch ctrl-y, ctrl-shift-z (REDO) // TODO: Add our own undo/redo functionality return; } } // setup timer for delayed updates (some events take time to complete) if (runDelay > 0) { return setTimeout(function(){ editor_event(objname); }, runDelay); } // don't execute more than 3 times a second (eg: too soon after last execution) if (this.tooSoon == 1 && runDelay >= 0) { this.queue = 1; return; } // queue all but urgent events this.tooSoon = 1; setTimeout(function(){ this.tooSoon = 0; if (this.queue) { editor_event(objname,-1); }; this.queue = 0; }, 333); // 1/3 second // editor_updateOutput(objname); editor_updateToolbar(objname); } /* ---------------------------------------------------------------------- *\ Function : editor_updateToolbar Description : update toolbar state Usage : Arguments : objname - ID of textarea to replace action - enable, disable, or update (default action) \* ---------------------------------------------------------------------- */ function editor_updateToolbar(objname,action) { var config = document.all[objname].config; var editor_obj = document.all["_" +objname+ "_editor"]; // disable or enable toolbar if (action == "enable" || action == "disable") { var tbItems = new Array('FontName','FontSize','FontStyle'); // add pulldowns for (var btnName in config.btnList) { tbItems.push(config.btnList[btnName][0]); } // add buttons for (var idxN in tbItems) { var cmdID = tbItems[idxN].toLowerCase(); var tbObj = document.all["_" +objname+ "_" +tbItems[idxN]]; if (cmdID == "htmlmode" || cmdID == "about" || cmdID == "showhelp" || cmdID == "popupeditor") { continue; } // don't change these buttons if (tbObj == null) { continue; } var isBtn = (tbObj.tagName.toLowerCase() == "button") ? true : false; if (action == "enable") { tbObj.disabled = false; if (isBtn) { tbObj.className = 'btn' }} if (action == "disable") { tbObj.disabled = true; if (isBtn) { tbObj.className = 'btnNA' }} } return; } // update toolbar state if (editor_obj.tagName.toLowerCase() == 'textarea') { return; } // don't update state in textedit mode var editdoc = editor_obj.contentWindow.document; // Set FontName pulldown var fontname_obj = document.all["_" +objname+ "_FontName"]; if (fontname_obj) { var fontname = editdoc.queryCommandValue('FontName'); if (fontname == null) { fontname_obj.value = null; } else { var found = 0; for (i=0; i