User:GravityFong/monobook.js
From Wikipedia, the free encyclopedia
If a message on your talk page led you here, please be wary of who left it. The code below could contain malicious content capable of compromising your account; if your account appears to be compromised, it will be blocked. If you are unsure whether the code is safe, you can ask at the appropriate village pump.
Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.
// Filter changes live // [[User:Lupin/recent2.js]] - please include this line document.write('<script type="text/javascript" src="' + 'http://en.wikipedia.org/w/index.php?title=User:Lupin/recent2.js' + '&action=raw&ctype=text/javascript&dontcountme=s"></script>'); // [[User:Lupin/popups.js]] importScript('User:Lupin/popups.js'); // [[User:Lupin/popups.js]] importScript('User:Lupin/popups.js'); // Script from [[User:MarkS/extraeditbuttons.js]] document.write('<script type="text/javascript" src="' + 'http://en.wikipedia.org/w/index.php?title=User:MarkS/extraeditbuttons.js' + '&action=raw&ctype=text/javascript&dontcountme=s"></s'+'cript>'); //<pre><nowiki> // VIEW SOURCE addOnloadHook(function () { if (location.href.indexOf('viewsource=1') != -1) { sl = document.getElementById('wpSummaryLabel'); sl.parentNode.removeChild(sl); ed = document.getElementById('wpSummary').parentNode; ed.parentNode.removeChild(ed); return; } editbutton = document.getElementById('ca-edit'); if (editbutton && location.href.indexOf('action=edit')==-1) { editlink = editbutton.getElementsByTagName('a')[0].href + '&viewsource=1'; tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0]; na = document.createElement('a'); na.href = editlink; na.appendChild(document.createTextNode('view source')); li = document.createElement('li'); li.id = 'ca-viewsource'; li.appendChild(na); tabs.insertBefore(li,editbutton); } }); //</nowiki></pre> // [[User:Dschwen/highlightredirects.js]] - please include this line document.write('<script type="text/javascript" src="' + 'http://en.wikipedia.org/w/index.php?title=User:Dschwen/highlightredirects.js' + '&action=raw&ctype=text/javascript&dontcountme=s"></script>'); /* {{en:User:Cacycle/wikEd_template}} <pre clear="all"><nowiki> */ // version info var wikEdProgramVersion = '0.9.24f'; var wikEdProgramDate = 'February 17, 2007'; /* == wikEd == A full-featured JavaScript in-browser editor for Wikipedia and other MediaWiki edit pages The program works currently ONLY for Mozilla-based browsers (Mozilla, Mozilla Firefox, and Mozilla SeaMonkey) Homepage: http://en.wikipedia.org/wiki/User:Cacycle/wikEd Author: Cacycle (http://en.wikipedia.org/wiki/User:Cacycle) License: This code has been released into the public domain This file might have to be saved as UTF-16 in your editor to preserve Unicode characters, e.g. ·±×? (. +/- x heart) == Installation == * Copy the following block of code to [[User:YOURUSERNAME/monobook.js]] * Press SHIFT-Reload to update to the newest version * PLEASE DO NOT COPY THE WHOLE PROGRAM * See http://en.wikipedia.org/wiki/User:Cacycle/wikEd for detailed instructions // ---- START INSTALLATION CODE ---- // install [[User:Cacycle/wikEd]] in-browser text editor document.write('<script type="text/javascript" src="' + 'http://en.wikipedia.org/w/index.php?title=User:Cacycle/wikEd.js' + '&action=raw&ctype=text/javascript&dontcountme=s"></script>'); // ---- END INSTALLATION CODE ---- */ // // user configurable variables // // user readable texts // copy changes to http://en.wikipedia.org/wiki/User:Cacycle/wikEd_international_en.js var wikEdText = wikEdText || []; // define built-in user interface texts WikEdInitObject(wikEdText, { // logo 'wikEdLogo alt': 'WikEd', 'wikEdLogo title': 'WikEd {wikEdProgramVersion} ({wikEdProgramDate}) Click to disable', 'wikEdLogo error alt': 'WikEd error', 'wikEdLogo error title': 'Loading error - WikEd {wikEdProgramVersion} ({wikEdProgramDate}) Click to disable', 'wikEdLogo disabled alt': '(WikEd)', 'wikEdLogo disabled title': 'Disabled - WikEd {wikEdProgramVersion} ({wikEdProgramDate}) Click to enable', // standard preview jumper 'wikEdScrollToButtons4 alt': 'Scroll buttons', 'wikEdScrollToButtons4 title': 'Scroll to edit buttons', 'wikEdScrollToInput4 alt': 'Scroll edit', 'wikEdScrollToInput4 title': 'Scroll to edit window', // formatting buttons, top row 'wikEdUndo alt': 'Undo', 'wikEdUndo title': 'Undo', 'wikEdRedo alt': 'Redo', 'wikEdRedo title': 'Redo', 'wikEdBold alt': 'Bold', 'wikEdBold title': 'Bold text', 'wikEdItalic alt': 'Italic', 'wikEdItalic title': 'Italic text', 'wikEdUnderline alt': 'Underline', 'wikEdUnderline title': 'Underline text', 'wikEdStrikethrough alt': 'Strikethrough', 'wikEdStrikethrough title': 'Strikethrough text', 'wikEdNowiki alt': 'Nowiki', 'wikEdNowiki title': 'Nowiki markup text', 'wikEdSuperscript alt': 'Superscript', 'wikEdSuperscript title': 'Superscript text', 'wikEdSubscript alt': 'Subscript', 'wikEdSubscript title': 'Subscript text', 'wikEdRef alt': 'Ref', 'wikEdRef title': 'In-text reference', 'wikEdCase alt': 'Case', 'wikEdCase title': 'Toggle between lowercase, uppercase first, and uppercase', 'wikEdRedirect alt': 'Redirect', 'wikEdRedirect title': 'Create redirect, deletes whole text', 'wikEdUndoAll alt': 'Undo all', 'wikEdUndoAll title': 'Undo all changes', 'wikEdRedoAll alt': 'Redo all', 'wikEdRedoAll title': 'Redo all changes', // formatting buttons, bottom row 'wikEdWikiLink alt': 'Link', 'wikEdWikiLink title': 'Wiki link', 'wikEdWebLink alt': 'Weblink', 'wikEdWebLink title': 'External weblink', 'wikEdHeading alt': 'Heading', 'wikEdHeading title': 'Increase heading levels (shift-click: decrease)', 'wikEdBulletList alt': 'Bullet list', 'wikEdBulletList title': 'Increase bulleted list level (shift-click: decrease)', 'wikEdNumberList alt': 'Number list', 'wikEdNumberList title': 'Increase numbered list level (shift-click: decrease)', 'wikEdIndentList alt': 'Indent list', 'wikEdIndentList title': 'Increase indention (shift-click: decrease)', 'wikEdDefinitionList alt': 'Def list', 'wikEdDefinitionList title': 'Definition list', 'wikEdImage alt': 'Image', 'wikEdImage title': 'Image', 'wikEdTable alt': 'Table', 'wikEdTable title': 'Table', 'wikEdReferences alt': 'References', 'wikEdReferences title': 'References location (shift-click: small Wikipedia style)', 'wikEdUpdateSyntax alt': 'Syntax', 'wikEdUpdateSyntax title': 'Update syntax highlighting', 'wikEdWikify alt': 'Wikify', 'wikEdWikify title': 'Wikify pasted content', 'wikEdTextify alt': 'Textify', 'wikEdTextify title': 'Convert pasted content to plain text', // find and replace buttons, top row 'wikEdGetFind alt': 'Get find', 'wikEdGetFind title': 'Copy selection to find field (shift-click: copy selection to find and to replace field)', 'wikEdFindAll alt': 'Find all', 'wikEdFindAll title': 'Find all matches', 'wikEdFindPrev alt': 'Find prev', 'wikEdFindPrev title': 'Find previous match', 'wikEdFindNext alt': 'Find next', 'wikEdFindNext title': 'Find next match', 'wikEdUpdown alt': 'Jump up/down', 'wikEdUpdown title': 'Jump to the top / bottom', 'wikEdPrevPos alt': 'Jump prev', 'wikEdPrevPos title': 'Jump to previously changed position', 'wikEdLastPos alt': 'Jump next', 'wikEdLastPos title': 'Jump back to last position', // find and replace buttons, bottom row 'wikEdClearFind alt': 'Clear find', 'wikEdClearFind title': 'Clear the find field (to search for selected text)', 'wikEdReplaceAll alt': 'Replace all', 'wikEdReplaceAll title': 'Replace all matches in whole text or selection', 'wikEdReplacePrev alt': 'Replace prev', 'wikEdReplacePrev title': 'Replace previous match', 'wikEdReplaceNext alt': 'Replace next', 'wikEdReplaceNext title': 'Replace next match', 'wikEdCaseSensitive alt': 'Case sensitive', 'wikEdCaseSensitive title': 'Search is case sensitive', 'wikEdRegExp alt': 'RegExp', 'wikEdRegExp title': 'Search field is a regular expression', 'wikEdFindAhead alt': 'Find ahead', 'wikEdFindAhead title': 'Find ahead as you type (case-insensitive non-regexp search)', // fix buttons, top row 'wikEdFixBasic alt': 'Fix basic', 'wikEdFixBasic title': 'Fix blanks and empty lines, also done by other fixing functions', 'wikEdFixHtml alt': 'Fix html', 'wikEdFixHtml title': 'Fix html to wikicode', 'wikEdFixCaps alt': 'Fix caps', 'wikEdFixCaps title': 'Fix caps in headers and lists', 'wikEdfixUnicode alt': 'Fix Unicode', 'wikEdfixUnicode title': 'Fix Unicode character representations', 'wikEdFixAll alt': 'Fix all', 'wikEdFixAll title': 'Fix basic, html, capitalization, and Unicode', 'wikEdFixRegExTypo alt': 'Fix typos', 'wikEdFixRegExTypo title': 'Fix typos using the AutoWikiBrowser RegExTypoFixer rules', // fix buttons, bottom row 'wikEdFixDashes alt': 'Fix dashes', 'wikEdFixDashes title': 'Fix dashes', 'wikEdFixPunct alt': 'Fix puntuation', 'wikEdFixPunct title': 'Fix spaces before puntuation', 'wikEdFixMath alt': 'Fix math', 'wikEdFixMath title': 'Fix math', 'wikEdFixChem alt': 'Fix chem', 'wikEdFixChem title': 'Fix chemical formulas', 'wikEdFixUnits alt': 'Fix units', 'wikEdFixUnits title': 'Fix units', // wikEd control buttons, top row 'wikEdTextZoom alt': 'Text zoom', 'wikEdTextZoom title': 'Text zoom cycling (shift-click: reverse)', 'wikEdClearHistory alt': 'Clear history', 'wikEdClearHistory title': 'Clear the find, replace, and summary history', 'wikEdScrollToInput alt': 'Scroll edit', 'wikEdScrollToInput title': 'Scroll to edit window', 'wikEdScrollToButtons alt': 'Scroll buttons', 'wikEdScrollToButtons title': 'Scroll to edit buttons', // wikEd control buttons, bottom row 'wikEdUseWikEd alt': 'Use wikEd', 'wikEdUseWikEd title': 'Toggle between classic text area and wikEd', 'wikEdHighlightSyntax alt': 'Syntax', 'wikEdHighlightSyntax title': 'Toggle automatic syntax highlighting', 'wikEdSource alt': 'Source', 'wikEdCloseToolbar title': 'Close the standard non-wikEd toolbar', 'wikEdCloseToolbar alt': 'Close toolbar', 'wikEdSource title': 'Show the source code for testing purposes', 'wikEdUsing alt': 'Using', 'wikEdUsing title': 'Automatically add \'\'…using wikEd\'\' to summaries', 'wikEdFullScreen alt': 'Fullscreen', 'wikEdFullScreen title': 'Toggle the fullscreen mode', // summary buttons 'wikEdClearSummary alt': 'Clear summary', 'wikEdClearSummary title': 'Clear the summary field', 'wikEdPresetSummary': [ 'copyedit', 'reply', 'article created', 'intro rewrite', 'linkfix', 'fixing typos', 'removing linkspam', 'reverting test', 'reverting vandalism', 'formatting source text', '{wikEdUsing}' ], 'wikEdSummaryUsing': '…using [[User:Cacycle/wikEd|wikEd]]', // submit buttons 'wikEdLocalPreviewImg alt': 'Preview below', 'wikEdLocalPreview title': 'Show preview below', 'wikEdLocalDiffImg alt': 'Changes below', 'wikEdLocalDiff title': 'Show current changes below', 'wikEdHelpPageLink': ' | <a href="http://en.wikipedia.org/wiki/User:Cacycle/wikEd_help" target="helpwindow">wikEd help</a>', // preview and changes buttons, top 'wikEdPreview alt': 'Preview title', 'wikEdPreview title': 'Show preview below', 'wikEdDiff alt': 'Changes title', 'wikEdDiff title': 'Show current changes below', 'wikEdClose alt': 'Close title', 'wikEdClose title': 'Close preview box', 'wikEdScrollToInput2 alt': 'Scroll edit', 'wikEdScrollToInput2 title': 'Scroll to edit window', 'wikEdScrollToButtons2 alt': 'Scroll buttons', 'wikEdScrollToButtons2 title': 'Scroll to edit buttons', // preview and changes buttons, bottom 'wikEdPreview2 alt': 'Preview title', 'wikEdPreview2 title': 'Show preview above', 'wikEdDiff2 alt': 'Changes title', 'wikEdDiff2 title': 'Show current changes above', 'wikEdClose alt': 'Close title', 'wikEdClose title': 'Close preview box', 'wikEdScrollToInput3 alt': 'Scroll edit', 'wikEdScrollToInput3 title': 'Scroll to edit window', 'wikEdScrollToButtons3 alt': 'Scroll buttons', 'wikEdScrollToButtons3 title': 'Scroll to edit buttons', // formatting functions 'image filename': 'filename', 'image width': 'width', 'table caption': 'caption', 'table heading': 'heading', 'table cell': 'cell', 'redirect article link': 'article link', // fixing functions 'External links': 'External links', 'See also': 'See also', 'References': 'References', // language specific wiki code 'wikicode Image': 'Image', 'wikicode Category': 'Category', 'wikicode Template': 'Template', 'wikEdReferencesSection': '\n== References ==\n\n<div class="references-small">\n<references/>\n</div>\n', // shortened button texts 'shortenedPreview': 'Preview', 'shortenedChanges': 'Changes' }); // edit-frame css rules var wikEdFrameCSS = wikEdFrameCSS || []; // define built-in edit frame css WikEdInitObject(wikEdFrameCSS, { // frame body '.wikedFrameBody': 'background: #FFFFFF; margin: 0px; padding: 0.2em; overflow: -moz-scrollbars-vertical; overflow-x: auto; font-family: monospace;', // syntax highlighting '.wikEdBlock': 'background-color: #e8e8e8;', '.wikEdBlockTag': 'color: #0000e0;', '.wikEdInlineTag': 'color: #0000e0;', '.wikEdUnknown': 'background-image: url({wikEdUnknown});', '.wikEdSubscript': 'position: relative; top: 0.3em;', '.wikEdSuperscript': 'position: relative; top: -0.3em;', '.wikEdBold': 'font-weight: bold;', '.wikEdRef': 'color: #606060; background-color: #e8e8e8;', '.wikEdComment': 'background-color: #fff0d0;', '.wikEdDel': 'text-decoration: line-through;', '.wikEdIns': 'text-decoration: underline;', '.wikEdItalic': 'font-style: italic;', '.wikEdNowiki': 'background-color: #e8e8e8;', '.wikEdRGB': '', // horizontal rule '.wikEdHR': 'background-color: #d0d0d0;', '.wikEdHRInline': 'background-color: #d0d0d0;', // wiki code '.wikEdWiki': 'color: #0000e0;', '.wikEdWikiRedir': 'color: #0000e0; background-color: #ffffff; font-weight: bold;', '.wikEdMagic': 'color: #0000e0; background-color: #e0e0e0; font-weight: bold;', // headings '.wikEdHeading': 'background-color: #e0e0e0; font-weight: bold;', '.wikEdHeadingWp': 'background-color: #d8e0ff; font-weight: bold;', // tables '.wikEdTableBlock': 'background-color: #e8e8e8;', '.wikEdTableLine': 'background-color: #e8e8e8;', '.wikEdTableTag': 'background-color: #e8e8e8; color: #0000e0;', // list '.wikEdListBlock': 'background-color: #e8e8e8;', '.wikEdListLine': 'background-color: #f0f0f0', '.wikEdListTag': 'background-color: #e8e8e8; color: #0000e0; font-weight: bold;', // space-pre '.wikEdSpaceBlock': 'background-color: #e8e8e8;', '.wikEdSpaceLine': 'background-color: #e8e8e8;', '.wikEdSpaceTag': 'color: #0000e0; font-weight: bold;', // wiki links, images, categories, templates '.wikEdLinkTag': 'color: #0000e0;', '.wikEdLink': '', '.wikEdImage': 'background-color: #d5ffaa;', '.wikEdCat': 'background-color: #d0d8ff;', '.wikEdTempl': 'background-color: #e0e8ff;', // interlanguage '.wikEdInter': 'color: #000000;', '.wikEdLinkInter': 'background-color: #c8c8ff;', '.wikEdImageInter': 'background-color: #c8c8ff;', '.wikEdCatInter': 'background-color: #c8c8ff;', '.wikEdTemplInter': 'background-color: #c8c8ff;', // name '.wikEdLinkName': 'color: #f00000; font-weight: bold;', '.wikEdImageName': 'color: #000000; font-weight: bold;', '.wikEdCatName': 'color: #f00000; font-weight: bold;', '.wikEdTemplName': 'color: #f00000; font-weight: bold;', '.wikEdURLLink': 'color: #f00000; font-weight: bold;', // links '.wikEdHighlightLink': 'text-decoration: none; color: #909090;', ':hover.wikEdHighlightLink': 'text-decoration: underline; color: #909090;', // pasted html '.wikEdPastedHtml': 'background-color: #ffc080;', // text and parameters '.wikEdLinkText': 'color: #000000; font-weight: bold;', '.wikEdImageParam': 'color: #0000e0;', '.wikEdImageCaption': 'color: #000000;', '.wikEdCatText': 'color: #000000;', '.wikEdTemplText': 'color: #000000;', '.wikEdURLText': 'color: #000000; font-weight: bold;', // insert wikicode here '.wikEdInsertHere': 'background-color: orange; font-style: italic;', // colors '.wikEdColorsLight': 'color: black;', '.wikEdColorsDark': 'color: white;', // invisibles, control chars, and strange spaces '.wikEdTab': 'white-space: pre; background-image: url({wikEdTab}); background-position: right bottom; background-repeat: no-repeat;', '.wikEdTabPlain': 'white-space: pre;', '.wikEdCtrl': 'white-space: pre; background-image: url({wikEdCtrl}); background-position: left center; background-repeat: repeat-x; background-color: white;', '.wikEdCtrl:before': 'content: \'\u00a0\'', '.wikEdBlank': 'white-space: -moz-pre-wrap; background-image: url({wikEdBlank}); background-position: left center; background-repeat: repeat-x; background-color: white;' }); // main window css rules var wikEdMainCSS = wikEdMainCSS || []; // define built-in main window css WikEdInitObject(wikEdMainCSS, { // combo input box '.wikEdCombo': 'font-size: smaller; padding-left: 0.1em; padding-right: 0.1em; margin: 0 0.1em 0 0.1em; height: 1.6em; vertical-align: bottom;', // wikEd button areas '.wikEdButtonsFormat': 'background: #d4d0cc; border: 1px black solid; padding: 0.2em; margin: 0 0.6em 0.25em 0 ; float: left;', '.wikEdButtonsCustom1': 'background: #d4d0cc; border: 1px black solid; padding: 0.2em; margin: 0 0.6em 0.25em 0 ; float: left;', '.wikEdButtonsFind': 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0 0.6em 0.25em 0 ; float: left;', '.wikEdButtonsFix': 'background: #d4d0cc; border: 1px black solid; padding: 0.2em; margin: 0 0.6em 0.25em 0 ; float: left', '.wikEdButtonsCustom2': 'background: #d4d0cc; border: 1px black solid; padding: 0.2em; margin: 0 0.6em 0.25em 0 ; float: left;', '.wikEdButtonsControl': 'background: #d4d0cc; border: 1px black solid; padding: 0.2em; margin: 0 0 0.25em 0 ; float: right;', '.wikEdButtonsPreview': 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0 0 0.15em 0.6em; float: right;', '.wikEdButtonsPreviewFull': 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: -0.2em 0 0 0.6em; float: right;', '.wikEdButtonsPreview2': 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0.2em 0 0.4em 0 ; float: right;', '.wikEdButtonsJump': 'padding: 0.1em; margin: 0 0 0 0.6em; float: right;', // wikEd buttons '.wikEdButton': 'vertical-align: text-top; font-size: small; text-decoration: underline; margin: 1px 2px; padding: 0; background: #d4d0cc; border: 1px #d4d0cc solid; cursor: pointer;', '.wikEdButton:hover': 'background: #e4e0dd; border: 1px outset; cursor: pointer;', '.wikEdButton:active': 'background: #e4e0dc; border: 1px inset; cursor: pointer;', '.wikEdButtonSolo': 'vertical-align: text-top; font-size: small; text-decoration: underline; margin: 1px 2px; padding: 0; background: #d4d0cc; border: 1px solid; border-color: white black black white; cursor: pointer;', '.wikEdButtonSolo:hover': 'background: #e4e0dd; cursor: pointer;', '.wikEdButtonChecked': 'vertical-align: text-top; font-size: small; text-decoration: none; margin: 1px 2px; padding: 0; background: #ccc8c3; border: 1px solid; border-color: black white white black; cursor: pointer;', '.wikEdButtonUnchecked': 'vertical-align: text-top; font-size: small; text-decoration: none; margin: 1px 2px; padding: 0; background: #ddd8d3; border: 1px solid; border-color: white black black white; cursor: pointer;', '.wikEdButtonPressed': 'vertical-align: text-top; font-size: small; text-decoration: none; margin: 1px 2px; padding: 0; background: #ccc8c3; border: 1px solid; border-color: black white white black; cursor: wait;', '.wikEdButtonInactive': 'vertical-align: text-top; font-size: small; text-decoration: underline; margin: 1px 2px; padding: 0; background: #c0c0c0; border: 1px #b0b0b0 solid; cursor: not-allowed', '.wikEdLocalPreview': 'vertical-align: top; margin: 0 0.33em 0 0.15em; padding: 0;', '.wikEdLocalDiff': 'vertical-align: top; margin: 0 0.33em 0 -0.18em; padding: 0;', '.wikEdButtonDummy': 'vertical-align: text-top; margin: 1px 2px; padding: 1px; background: #d4d0cc;', // preview box '.wikEdPreviewBoxOuter': 'clear: both; margin: 0; border-width: 1px; border-style: solid; border-color: #808080 #d0d0d0 #d0d0d0 #808080;', '.wikEdPreviewBox': 'background-color: #f9f9f9; padding: 5px; border-width: 1px; border-style: solid; border-color: #404040 #ffffff #ffffff #404040;', // find field '.wikEdFindComboInput': 'position: relative; padding: 0; margin: 0 0.2em; font-style: normal; white-space: nowrap;', '#wikEdFindText': 'height: 1.4em; font-family: monospace; padding: 0; margin: 0; position: absolute; width: 170px; left: 0; top: 0; z-index: 2;', '#wikEdFindSelect': 'height: 1.5em; font-family: monospace; padding: 0; margin: 0; position: relative; border: none; vertical-align: baseline; z-index: 1;', // replace field '.wikEdReplaceComboInput': 'position: relative; padding: 0; margin: 0 0.2em; font-style: normal; white-space: nowrap;', '#wikEdReplaceText': 'height: 1.4em; font-family: monospace; padding: 0; margin: 0; position: absolute; width: 170px; left: 0; top: 0; z-index: 2;', '#wikEdReplaceSelect': 'height: 1.5em; font-family: monospace; padding: 0; margin: 0; position: relative; border: none; vertical-align: baseline; z-index: 1;', // summary field '.wikEdSummaryComboInput': 'position: relative; white-space: nowrap; margin: 0 0 0 0.1em;', '.wikEdSummaryText': 'padding: 0; margin: 0; position: absolute; left: 0; top: 0; z-index: 2;', '.wikEdSummarySelect': 'border: none; padding: 0; margin: 0; position: relative; vertical-align: middle; z-index: 1;', // space around submit buttons '.editButtons': 'margin: 0;', // frame '.wikEdFrameOuter': 'width: 100%; margin: 0; border-width: 1px; border-style: solid; border-color: #808080 #d0d0d0 #d0d0d0 #808080;', '.wikEdFrameInner': 'padding: 0; border-width: 1px; border-style: solid; border-color: #404040 #ffffff #ffffff #404040;', '.wikEdFrame': 'width: 100%; padding: 0; margin: 0; border: none;', // summary '.wikEdSummaryWrapper': 'margin: 0 0 0.4em 0;', '#wpSummaryLabel': 'margin: 0 0.2em 0 0;', '.editOptions': 'position: relative; top: 0.1em;', '.wikEdClearSummaryForm': 'display: inline;', '.wikEdClearSummary': 'vertical-align: middle; margin: 0 0.1em 0 0.5em; padding: 0 0 0.2em 0;', // input wrapper '.wikEdInputWrapper': 'z-index: 100; clear: both;', '.wikEdInputWrapperFull': 'position: fixed; top: 0; left: 0; right: 0; padding: 4px; background: white; z-index: 100;', // other wrappers '.wikEdToolbarWrapper': 'margin: 0 0 0.25em 0;', '.wikEdTextareaWrapper': 'margin: 0 0 0.35em 0;', '.wikEdFrameWrapper': 'margin: 0 0 0.35em 0;', '.wikEdConsoleWrapper': 'margin: 0;', '.wikEdButtonsWrapper': 'margin: 0;', '.wikEdSummaryInputWrapper': 'display: inline;', '.wikEdSummaryOptions': 'display: inline;', '.wikEdSubmitWrapper': 'margin: 0 0 0.25em 0;', '.wikEdSubmitButtonsWrapper': '', '.wikEdLocalPrevWrapper': '', '.wikEdInsertWrapper': '', // various '.wikEdEditOptions': 'display: inline; vertical-align: baseline; margin-right: 0.75em; white-space: nowrap;', '.wikEdEditHelp': 'vertical-align: baseline; margin-right: 0.5em; white-space: nowrap;', '#editpage-specialchars': 'clear: both;' }); // use local copies of images for testing (set to true in local copy of edit page) var wikEdUseLocalImages = wikEdUseLocalImages || false; // path to local images for testing var wikEdImagePathLocal = wikEdImagePathLocal || 'file:///D:/wikEd/images/'; // path to images var wikEdImagePath = wikEdImagePath || 'http://upload.wikimedia.org/wikipedia/commons/'; // image filenames var wikEdImage = wikEdImage || []; // define built-in image URLs WikEdInitImage(wikEdImage, { 'blank': '5/51/WikEd_blank.png', 'bold': '5/59/WikEd_bold.png', 'bulletList': '6/62/WikEd_bullet_list.png', 'case': 'a/aa/WikEd_case.png', 'caseSensitive': '0/0d/WikEd_case_sensitive.png', 'clearFind': 'f/f0/WikEd_clear_find.png', 'clearHistory': 'c/c8/WikEd_clear_history.png', 'clearSummary': '2/2c/WikEd_clear_summary.png', 'close': '9/97/WikEd_close.png', 'closeToolbar': '1/1d/WikEd_close_toolbar.png', 'ctrl': '1/10/WikEd_ctrl.png', 'definitionList': 'f/f5/WikEd_definition_list.png', 'diff': 'd/db/WikEd_diff.png', 'disabled': '0/07/WikEd_disabled.png', 'dummy': 'c/c5/WikEd_dummy.png', 'error': '3/3e/WikEd_error.png', 'findAhead': '3/34/WikEd_find_ahead.png', 'findAll': '7/75/WikEd_find_all.png', 'findNext': 'a/ad/WikEd_find_next.png', 'findPrev': 'f/f5/WikEd_find_prev.png', 'fixAll': '8/86/WikEd_fix_all.png', 'fixBasic': '3/30/WikEd_fix_basic.png', 'fixCaps': '0/00/WikEd_fix_caps.png', 'fixUnicode': 'd/d4/WikEd_fix_unicode.png', 'fixChem': 'e/e7/WikEd_fix_chem.png', 'fixDash': 'e/e5/WikEd_fix_dash.png', 'fixHtml': '0/05/WikEd_fix_html.png', 'fixMath': '3/3f/WikEd_fix_math.png', 'fixPunct': 'd/db/WikEd_fix_punct.png', 'fixRegExTypo': '9/94/WikEd_fix_reg-ex-typo.png', 'fixUnits': '6/69/WikEd_fix_units.png', 'textZoom': '7/71/WikEd_font_size.png', 'fullScreen': 'd/d3/WikEd_fullscreen.png', 'getFind': '9/96/WikEd_get_selection.png', 'heading': '0/07/WikEd_heading.png', 'highlightSyntax': '6/67/WikEd_syntax.png', 'image': '3/37/WikEd_image.png', 'indentList': '7/7a/WikEd_indent_list.png', 'italic': 'd/d4/WikEd_italic.png', 'jumpTopBottom': '5/5d/WikEd_jump_top_bottom.png', 'lastPos': '5/54/WikEd_jump_next.png', 'logo': '6/67/WikEd_logo.png', 'nowiki': '5/5a/WikEd_nowiki.png', 'numberList': '3/3b/WikEd_number_list.png', 'prevPos': 'c/c7/WikEd_jump_prev.png', 'preview': '3/31/WikEd_preview.png', 'redirect': 'f/fa/WikEd_redirect.png', 'redo': 'd/d7/WikEd_redo.png', 'ref': 'b/ba/WikEd_ref.png', 'references': '6/66/WikEd_references.png', 'redoAll': '2/2d/WikEd_redo_all.png', 'regExp': '6/6a/WikEd_regexp.png', 'replaceAll': '2/2a/WikEd_replace_all.png', 'replaceNext': 'b/b0/WikEd_replace_next.png', 'replacePrev': 'a/a1/WikEd_replace_prev.png', 'scrollToButtons': '0/01/WikEd_align_buttons.png', 'scrollToText': '1/13/WikEd_align_top.png', 'source': '0/02/WikEd_source.png', 'strikethrough': '0/06/WikEd_strikethrough.png', 'subscript': '9/9e/WikEd_subscript.png', 'superscript': 'b/bf/WikEd_superscript.png', 'tab': 'e/e7/WikEd_tab.png', 'table': 'b/bd/WikEd_table.png', 'textify': 'c/cd/WikEd_textify.png', 'underline': '2/21/WikEd_underline.png', 'undo': 'e/e6/WikEd_undo.png', 'undoAll': '0/08/WikEd_undo_all.png', 'unknown': '8/8a/WikEd_unknown.png', 'updateSyntax': '6/67/WikEd_syntax.png', 'useWikEd': '6/67/WikEd_logo.png', 'using': 'e/e0/WikEd_using.png', 'webLink': '1/16/WikEd_weblink.png', 'wikify': '9/9f/WikEd_wikify.png', 'wikiLink': '2/21/WikEd_wikilink.png' }); // buttons (id, class, popup title, image src, width, height, alt text, onClick and parameters) var wikEdButton = wikEdButton || []; // define built-in buttons (id, class, button numbers) WikEdInitObject(wikEdButton, { // format top 1: ['wikEdUndo', 'wikEdButtonInactive', wikEdText['wikEdUndo title'], wikEdImage['undo'], '16', '16', wikEdText['wikEdUndo alt'], 'javascript:WikEdEditButton(this, this.id);' ], 2: ['wikEdRedo', 'wikEdButtonInactive', wikEdText['wikEdRedo title'], wikEdImage['redo'], '16', '16', wikEdText['wikEdRedo alt'], 'javascript:WikEdEditButton(this, this.id);' ], 3: ['wikEdBold', 'wikEdButton', wikEdText['wikEdBold title'], wikEdImage['bold'], '16', '16', wikEdText['wikEdBold alt'], 'javascript:WikEdEditButton(this, this.id);' ], 4: ['wikEdItalic', 'wikEdButton', wikEdText['wikEdItalic title'], wikEdImage['italic'], '16', '16', wikEdText['wikEdItalic alt'], 'javascript:WikEdEditButton(this, this.id);' ], 5: ['wikEdUnderline', 'wikEdButton', wikEdText['wikEdUnderline title'], wikEdImage['underline'], '16', '16', wikEdText['wikEdUnderline alt'], 'javascript:WikEdEditButton(this, this.id);' ], 6: ['wikEdStrikethrough', 'wikEdButton', wikEdText['wikEdStrikethrough title'], wikEdImage['strikethrough'], '16', '16', wikEdText['wikEdStrikethrough alt'], 'javascript:WikEdEditButton(this, this.id);' ], 7: ['wikEdNowiki', 'wikEdButton', wikEdText['wikEdNowiki title'], wikEdImage['nowiki'], '16', '16', wikEdText['wikEdNowiki alt'], 'javascript:WikEdEditButton(this, this.id);' ], 8: ['wikEdSuperscript', 'wikEdButton', wikEdText['wikEdSuperscript title'], wikEdImage['superscript'], '16', '16', wikEdText['wikEdSuperscript alt'], 'javascript:WikEdEditButton(this, this.id);' ], 9: ['wikEdSubscript', 'wikEdButton', wikEdText['wikEdSubscript title'], wikEdImage['subscript'], '16', '16', wikEdText['wikEdSubscript alt'], 'javascript:WikEdEditButton(this, this.id);' ], 10: ['wikEdRef', 'wikEdButton', wikEdText['wikEdRef title'], wikEdImage['ref'], '16', '16', wikEdText['wikEdRef alt'], 'javascript:WikEdEditButton(this, this.id);' ], 12: ['wikEdCase', 'wikEdButton', wikEdText['wikEdCase title'], wikEdImage['case'], '16', '16', wikEdText['wikEdCase alt'], 'javascript:WikEdEditButton(this, this.id);' ], 25: ['wikEdRedirect', 'wikEdButton', wikEdText['wikEdRedirect title'], wikEdImage['redirect'], '16', '16', wikEdText['wikEdRedirect alt'], 'javascript:WikEdEditButton(this, this.id);' ], 13: ['wikEdUndoAll', 'wikEdButton', wikEdText['wikEdUndoAll title'], wikEdImage['undoAll'], '16', '16', wikEdText['wikEdUndoAll alt'], 'javascript:WikEdEditButton(this, this.id);' ], 14: ['wikEdRedoAll', 'wikEdButtonInactive', wikEdText['wikEdRedoAll title'], wikEdImage['redoAll'], '16', '16', wikEdText['wikEdRedoAll alt'], 'javascript:WikEdEditButton(this, this.id);' ], // format bottom 15: ['wikEdWikiLink', 'wikEdButton', wikEdText['wikEdWikiLink title'], wikEdImage['wikiLink'], '16', '16', wikEdText['wikEdWikiLink alt'], 'javascript:WikEdEditButton(this, this.id);' ], 16: ['wikEdWebLink', 'wikEdButton', wikEdText['wikEdWebLink title'], wikEdImage['webLink'], '16', '16', wikEdText['wikEdWebLink alt'], 'javascript:WikEdEditButton(this, this.id);' ], 17: ['wikEdHeading', 'wikEdButton', wikEdText['wikEdHeading title'], wikEdImage['heading'], '16', '16', wikEdText['wikEdHeading alt'], 'if (!event.shiftKey) { javascript:WikEdEditButton(this, \'wikEdIncreaseHeading\'); } else { javascript:WikEdEditButton(this, \'wikEdDecreaseHeading\'); }' ], 19: ['wikEdBulletList', 'wikEdButton', wikEdText['wikEdBulletList title'], wikEdImage['bulletList'], '16', '16', wikEdText['wikEdBulletList alt'], 'if (!event.shiftKey) { javascript:WikEdEditButton(this, \'wikEdIncreaseBulletList\'); } else { javascript:WikEdEditButton(this, \'wikEdDecreaseBulletList\'); }' ], 20: ['wikEdNumberList', 'wikEdButton', wikEdText['wikEdNumberList title'], wikEdImage['numberList'], '16', '16', wikEdText['wikEdNumberList alt'], 'if (!event.shiftKey) { javascript:WikEdEditButton(this, \'wikEdIncreaseNumberList\'); } else { javascript:WikEdEditButton(this, \'wikEdDecreaseNumberList\'); }' ], 21: ['wikEdIndentList', 'wikEdButton', wikEdText['wikEdIndentList title'], wikEdImage['indentList'], '16', '16', wikEdText['wikEdIndentList alt'], 'if (!event.shiftKey) { javascript:WikEdEditButton(this, \'wikEdIncreaseIndentList\'); } else { javascript:WikEdEditButton(this, \'wikEdDecreaseIndentList\'); }' ], 22: ['wikEdDefinitionList', 'wikEdButton', wikEdText['wikEdDefinitionList title'], wikEdImage['definitionList'], '16', '16', wikEdText['wikEdDefinitionList alt'], 'javascript:WikEdEditButton(this, this.id);' ], 23: ['wikEdImage', 'wikEdButton', wikEdText['wikEdImage title'], wikEdImage['image'], '16', '16', wikEdText['wikEdImage alt'], 'javascript:WikEdEditButton(this, this.id);' ], 24: ['wikEdTable', 'wikEdButton', wikEdText['wikEdTable title'], wikEdImage['table'], '16', '16', wikEdText['wikEdTable alt'], 'javascript:WikEdEditButton(this, this.id);' ], 11: ['wikEdReferences', 'wikEdButton', wikEdText['wikEdReferences title'], wikEdImage['references'], '16', '16', wikEdText['wikEdReferences alt'], 'if (!event.shiftKey) { javascript:WikEdEditButton(this, this.id); } else { javascript:WikEdEditButton(this, \'wikEdReferencesSection\'); }' ], 26: ['wikEdWikify', 'wikEdButton', wikEdText['wikEdWikify title'], wikEdImage['wikify'], '16', '16', wikEdText['wikEdWikify alt'], 'javascript:WikEdEditButton(this, this.id);' ], 27: ['wikEdTextify', 'wikEdButton', wikEdText['wikEdTextify title'], wikEdImage['textify'], '16', '16', wikEdText['wikEdTextify alt'], 'javascript:WikEdEditButton(this, this.id);' ], 28: ['wikEdUpdateSyntax', 'wikEdButton', wikEdText['wikEdUpdateSyntax title'], wikEdImage['updateSyntax'], '16', '16', wikEdText['wikEdUpdateSyntax alt'], 'javascript:WikEdEditButton(this, this.id);' ], // control top 29: ['wikEdTextZoom', 'wikEdButton', wikEdText['wikEdTextZoom title'], wikEdImage['textZoom'], '16', '16', wikEdText['wikEdTextZoom alt'], 'if (!event.shiftKey) { javascript:WikEdButton(this, \'wikEdTextZoomDown\'); } else { javascript:WikEdButton(this, \'wikEdTextZoomUp\'); }' ], 30: ['wikEdClearHistory', 'wikEdButton', wikEdText['wikEdClearHistory title'], wikEdImage['clearHistory'], '16', '16', wikEdText['wikEdClearHistory alt'], 'javascript:WikEdButton(this, this.id);' ], 31: ['wikEdScrollToInput', 'wikEdButton', wikEdText['wikEdScrollToInput title'], wikEdImage['scrollToText'], '16', '16', wikEdText['wikEdScrollToInput alt'], 'javascript:WikEdButton(this, this.id);' ], 32: ['wikEdScrollToButtons', 'wikEdButton', wikEdText['wikEdScrollToButtons title'], wikEdImage['scrollToButtons'], '16', '16', wikEdText['wikEdScrollToButtons alt'], 'javascript:WikEdButton(this, this.id);' ], // control bottom 33: ['wikEdUseWikEd', 'wikEdButtonChecked', wikEdText['wikEdUseWikEd title'], wikEdImage['useWikEd'], '16', '16', wikEdText['wikEdUseWikEd alt'], 'javascript:WikEdButton(this, this.id, true);' ], 34: ['wikEdHighlightSyntax', 'wikEdButtonUnchecked', wikEdText['wikEdHighlightSyntax title'], wikEdImage['highlightSyntax'], '16', '16', wikEdText['wikEdHighlightSyntax alt'], 'javascript:WikEdButton(this, this.id, true);' ], 35: ['wikEdSource', 'wikEdButton', wikEdText['wikEdSource title'], wikEdImage['source'], '16', '16', wikEdText['wikEdSource alt'], 'javascript:WikEdEditButton(this, this.id);' ], 75: ['wikEdCloseToolbar', 'wikEdButtonUnchecked', wikEdText['wikEdCloseToolbar title'], wikEdImage['closeToolbar'], '16', '16', wikEdText['wikEdCloseToolbar alt'], 'javascript:WikEdButton(this, this.id, true);' ], 36: ['wikEdUsing', 'wikEdButtonUnchecked', wikEdText['wikEdUsing title'], wikEdImage['using'], '16', '16', wikEdText['wikEdUsing alt'], 'javascript:WikEdButton(this, this.id, true);' ], 37: ['wikEdFullScreen', 'wikEdButtonUnchecked', wikEdText['wikEdFullScreen title'], wikEdImage['fullScreen'], '16', '16', wikEdText['wikEdFullScreen alt'], 'javascript:WikEdButton(this, this.id, true);' ], // find top 38: ['wikEdGetFind', 'wikEdButton', wikEdText['wikEdGetFind title'], wikEdImage['getFind'], '16', '16', wikEdText['wikEdGetFind alt'], 'if (!event.shiftKey) { javascript:WikEdEditButton(this, this.id); } else { javascript:WikEdEditButton(this, \'wikEdGetFindReplace\'); }' ], 39: ['wikEdFindAll', 'wikEdButton', wikEdText['wikEdFindAll title'], wikEdImage['findAll'], '16', '16', wikEdText['wikEdFindAll alt'], 'javascript:WikEdEditButton(this, this.id);' ], 40: ['wikEdFindPrev', 'wikEdButton', wikEdText['wikEdFindPrev title'], wikEdImage['findPrev'], '16', '16', wikEdText['wikEdFindPrev alt'], 'javascript:WikEdEditButton(this, this.id);' ], 41: ['wikEdFindNext', 'wikEdButton', wikEdText['wikEdFindNext title'], wikEdImage['findNext'], '16', '16', wikEdText['wikEdFindNext alt'], 'javascript:WikEdEditButton(this, this.id);' ], 42: ['wikEdUpdown', 'wikEdButton', wikEdText['wikEdUpdown title'], wikEdImage['jumpTopBottom'], '16', '16', wikEdText['wikEdUpdown alt'], 'javascript:WikEdEditButton(this, this.id);' ], 43: ['wikEdPrevPos', 'wikEdButtonInactive', wikEdText['wikEdPrevPos title'], wikEdImage['prevPos'], '16', '16', wikEdText['wikEdPrevPos alt'], 'javascript:WikEdEditButton(this, this.id);' ], 44: ['wikEdLastPos', 'wikEdButtonInactive', wikEdText['wikEdLastPos title'], wikEdImage['lastPos'], '16', '16', wikEdText['wikEdLastPos alt'], 'javascript:WikEdEditButton(this, this.id);' ], // find bottom 45: ['wikEdClearFind', 'wikEdButton', wikEdText['wikEdClearFind title'], wikEdImage['clearFind'], '16', '16', wikEdText['wikEdClearFind alt'], 'javascript:WikEdButton(this, this.id);' ], 46: ['wikEdReplaceAll', 'wikEdButton', wikEdText['wikEdReplaceAll title'], wikEdImage['replaceAll'], '16', '16', wikEdText['wikEdReplaceAll alt'], 'javascript:WikEdEditButton(this, this.id);' ], 47: ['wikEdReplacePrev', 'wikEdButton', wikEdText['wikEdReplacePrev title'], wikEdImage['replacePrev'], '16', '16', wikEdText['wikEdReplacePrev alt'], 'javascript:WikEdEditButton(this, this.id);' ], 48: ['wikEdReplaceNext', 'wikEdButton', wikEdText['wikEdReplaceNext title'], wikEdImage['replaceNext'], '16', '16', wikEdText['wikEdReplaceNext alt'], 'javascript:WikEdEditButton(this, this.id);' ], 49: ['wikEdCaseSensitive', 'wikEdButtonUnchecked', wikEdText['wikEdCaseSensitive title'], wikEdImage['caseSensitive'], '16', '16', wikEdText['wikEdCaseSensitive alt'], 'javascript:WikEdButton(this, this.id, true);' ], 50: ['wikEdRegExp', 'wikEdButtonUnchecked', wikEdText['wikEdRegExp title'], wikEdImage['regExp'], '16', '16', wikEdText['wikEdRegExp alt'], 'javascript:WikEdButton(this, this.id, true);' ], 51: ['wikEdFindAhead', 'wikEdButtonUnchecked', wikEdText['wikEdFindAhead title'], wikEdImage['findAhead'], '16', '16', wikEdText['wikEdFindAhead alt'], 'javascript:WikEdButton(this, this.id, true);' ], // fix top 52: ['wikEdFixBasic', 'wikEdButton', wikEdText['wikEdFixBasic title'], wikEdImage['fixBasic'], '16', '16', wikEdText['wikEdFixBasic alt'], 'javascript:WikEdEditButton(this, this.id);' ], 53: ['wikEdFixHtml', 'wikEdButton', wikEdText['wikEdFixHtml title'], wikEdImage['fixHtml'], '16', '16', wikEdText['wikEdFixHtml alt'], 'javascript:WikEdEditButton(this, this.id);' ], 54: ['wikEdFixCaps', 'wikEdButton', wikEdText['wikEdFixCaps title'], wikEdImage['fixCaps'], '16', '16', wikEdText['wikEdFixCaps alt'], 'javascript:WikEdEditButton(this, this.id);' ], 55: ['wikEdfixUnicode', 'wikEdButton', wikEdText['wikEdfixUnicode title'], wikEdImage['fixUnicode'], '16', '16', wikEdText['wikEdfixUnicode alt'], 'javascript:WikEdEditButton(this, this.id);' ], 56: ['wikEdFixAll', 'wikEdButton', wikEdText['wikEdFixAll title'], wikEdImage['fixAll'], '16', '16', wikEdText['wikEdFixAll alt'], 'javascript:WikEdEditButton(this, this.id);' ], 57: ['wikEdFixRegExTypo', 'wikEdButton', wikEdText['wikEdFixRegExTypo title'], wikEdImage['fixRegExTypo'], '16', '16', wikEdText['wikEdFixRegExTypo alt'], 'javascript:WikEdEditButton(this, this.id);' ], // fix bottom 58: ['wikEdFixDashes', 'wikEdButton', wikEdText['wikEdFixDashes title'], wikEdImage['fixDash'], '16', '16', wikEdText['wikEdFixDashes alt'], 'javascript:WikEdEditButton(this, this.id);' ], 59: ['wikEdFixPunct', 'wikEdButton', wikEdText['wikEdFixPunct title'], wikEdImage['fixPunct'], '16', '16', wikEdText['wikEdFixPunct alt'], 'javascript:WikEdEditButton(this, this.id);' ], 60: ['wikEdFixMath', 'wikEdButton', wikEdText['wikEdFixMath title'], wikEdImage['fixMath'], '16', '16', wikEdText['wikEdFixMath alt'], 'javascript:WikEdEditButton(this, this.id);' ], 61: ['wikEdFixChem', 'wikEdButton', wikEdText['wikEdFixChem title'], wikEdImage['fixChem'], '16', '16', wikEdText['wikEdFixChem alt'], 'javascript:WikEdEditButton(this, this.id);' ], 62: ['wikEdFixUnits', 'wikEdButton', wikEdText['wikEdFixUnits title'], wikEdImage['fixUnits'], '16', '16', wikEdText['wikEdFixUnits alt'], 'javascript:WikEdEditButton(this, this.id);' ], // preview 63: ['wikEdPreview', 'wikEdButton', wikEdText['wikEdPreview title'], wikEdImage['preview'], '16', '16', wikEdText['wikEdPreview alt'], 'javascript:WikEdButton(this, this.id);' ], 64: ['wikEdDiff', 'wikEdButton', wikEdText['wikEdDiff title'], wikEdImage['diff'], '16', '16', wikEdText['wikEdDiff alt'], 'javascript:WikEdButton(this, this.id);' ], 65: ['wikEdClose', 'wikEdButton', wikEdText['wikEdClose title'], wikEdImage['close'], '16', '16', wikEdText['wikEdClose alt'], 'javascript:WikEdButton(this, this.id);' ], 66: ['wikEdScrollToInput2', 'wikEdButton', wikEdText['wikEdScrollToInput2 title'], wikEdImage['scrollToText'], '16', '16', wikEdText['wikEdScrollToInput2 alt'], 'javascript:WikEdButton(this, this.id);' ], 67: ['wikEdScrollToButtons2', 'wikEdButton', wikEdText['wikEdScrollToButtons2 title'], wikEdImage['scrollToButtons'], '16', '16', wikEdText['wikEdScrollToButtons2 alt'], 'javascript:WikEdButton(this, this.id);' ], // preview2 68: ['wikEdPreview2', 'wikEdButton', wikEdText['wikEdPreview2 title'], wikEdImage['preview'], '16', '16', wikEdText['wikEdPreview2 alt'], 'javascript:WikEdButton(this, this.id);' ], 69: ['wikEdDiff2', 'wikEdButton', wikEdText['wikEdDiff2 title'], wikEdImage['diff'], '16', '16', wikEdText['wikEdDiff2 alt'], 'javascript:WikEdButton(this, this.id);' ], 70: ['wikEdClose2', 'wikEdButton', wikEdText['wikEdClose2 title'], wikEdImage['close'], '16', '16', wikEdText['wikEdClose2 alt'], 'javascript:WikEdButton(this, this.id);' ], 71: ['wikEdScrollToInput3', 'wikEdButton', wikEdText['wikEdScrollToInput3 title'], wikEdImage['scrollToText'], '16', '16', wikEdText['wikEdScrollToInput3 alt'], 'javascript:WikEdButton(this, this.id);' ], 72: ['wikEdScrollToButtons3', 'wikEdButton', wikEdText['wikEdScrollToButtons3 title'], wikEdImage['scrollToButtons'], '16', '16', wikEdText['wikEdScrollToButtons3 alt'], 'javascript:WikEdButton(this, this.id);' ], // jump 73: ['wikEdScrollToInput4', 'wikEdButtonSolo', wikEdText['wikEdScrollToInput4 title'], wikEdImage['scrollToText'], '16', '16', wikEdText['wikEdScrollToInput4 alt'], 'javascript:WikEdButton(this, this.id);' ], 74: ['wikEdScrollToButtons4', 'wikEdButtonSolo', wikEdText['wikEdScrollToButtons4 title'], wikEdImage['scrollToButtons'], '16', '16', wikEdText['wikEdScrollToButtons4 alt'], 'javascript:WikEdButton(this, this.id);' ], // dummy 76: ['wikEdDummy', 'wikEdButtonDummy', '', wikEdImage['dummy'], '16', '16', '', '' ] }); // button bars (id, class, button numbers) var wikEdButtonBar = wikEdButtonBar || []; // define built-in button bars (id, class, popup title, image src, width, height, alt text, onClick and parameters) WikEdInitObject(wikEdButtonBar, { 'format': ['wikEdButtonsFormat', 'wikEdButtonsFormat', [1,2,3,4,5,6,7,8,9,10,12,25,13,14,'br',15,16,17,19,20,21,22,23,24,11,76,26,27,28] ], 'custom1': ['wikEdButtonsCustom1', 'wikEdButtonsCustom1', [] ], 'find': ['wikEdButtonsFind', 'wikEdButtonsFind', [38,39,40,'find',41,42,43,44,'br',45,46,47,'replace',48,49,50,51] ], 'fix': ['wikEdButtonsFix', 'wikEdButtonsFix', [52,53,54,55,56,57,'br',58,59,60,61,62] ], 'custom2': ['wikEdButtonsCustom2', 'wikEdButtonsCustom2', [] ], 'control': ['wikEdButtonsControl', 'wikEdButtonsControl', [76,29,30,31,32,'br',33,34,35,75,36,37] ], 'preview': ['wikEdButtonsPreview', 'wikEdButtonsPreview', [63,64,65,66,67] ], 'preview2': ['wikEdButtonsPreview2', 'wikEdButtonsPreview2', [68,69,70,71,72] ], 'jump': ['wikEdButtonsJump', 'wikEdButtonsJump', [73,74] ] }); // history length for find, replace, and summary fields var wikEdHistoryLength = wikEdHistoryLength || []; wikEdHistoryLength['find'] = 10; wikEdHistoryLength['replace'] = 10; wikEdHistoryLength['summary'] = 10; // presets for combo input fields dropdown options, {wikEdUsing} appends a link to this script var wikEdComboPresetOptions = wikEdComboPresetOptions || []; wikEdComboPresetOptions['summary'] = wikEdComboPresetOptions['summary'] || wikEdText['wikEdPresetSummary']; // text for summary link to this script var wikEdSummaryUsing = wikEdSummaryUsing || wikEdText['wikEdSummaryUsing']; // expiration time span for history cookies in seconds var wikEdCookieExpireSec = wikEdCookieExpireSec || (30 * 24 * 60 * 60); // find ahead as you type checkbox preset var wikEdFindAheadSelected = wikEdFindAheadSelected || true; // highlight syntax preset var wikEdHighlightSyntaxPreset = wikEdHighlightSyntaxPreset || true; // enable wikEd preset var wikEdUseWikEdPreset = wikEdUseWikEdPreset || true; // add '...using wikEd' to summary preset (set to true by single-session cookie wikEdSummaryUsing) var wikEdUsingPreset = wikEdUsingPreset || false; // fullscreen mode preset var wikEdFullScreenModePreset = wikEdFullScreenModePreset || false; // show MediaWiki toolbar preset var wikEdCloseToolbarPreset = wikEdCloseToolbarPreset || false; // initial text zoom for edit window (percentage) var wikEdTextZoom = wikEdTextZoom || 100; // remove invisible syntax highlighting comments after closing tag var wikEdRemoveHighlightComments = wikEdRemoveHighlightComments || true; // show the text-to-source button for testing purposes var wikEdShowSourceButton = wikEdShowSourceButton || false; // This is the wikEd help page link to be displayed after the editing help link, an empty string disables the link var wikEdHelpPageLink = wikEdHelpPageLink || wikEdText['wikEdHelpPageLink']; // display the wikEd button bars on top of the edit box var wikEdButtonsOnTop = wikEdButtonsOnTop || true; // enable external diff script var wikEdLoadDiff = wikEdLoadDiff || true; // diff script URL wikEdDiffSrc = 'http://en.wikipedia.org/w/index.php?title=User:Cacycle/diff.js&action=raw&ctype=text/javascript&dontcountme=s'; // enable external Live Preview script var wikEdLoadLivePreview = wikEdLoadLivePreview || true; // Live Preview script URL wikEdLivePreviewSrc = 'http://en.wikipedia.org/w/index.php?title=User:Pilaf/livepreview.js&action=raw&ctype=text/javascript&dontcountme=s'; // enable external RegExTypoFix script var wikEdLoadRegExTypoFix = wikEdLoadRegExTypoFix || false; // RegExTypoFix script URL wikEdRegExTypoFixSrc = 'http://en.wikipedia.org/w/index.php?title=User:Cacycle/wikEdTypoFix.js&action=raw&ctype=text/javascript&dontcountme=s'; // enable RegExTypoFix (http://en.wikipedia.org/wiki/User:Mboverload/RegExTypoFix), needs Wikipedia:AutoWikiBrowser/typos.js var wikEdRegExTypoFix = wikEdRegExTypoFix || true; // enable highlighting as links var wikEdFollowHighlightedLinks = wikEdFollowHighlightedLinks || false; // skip the browser detection to run wikEd under IE and Opera var wikEdSkipBrowserTest = wikEdSkipBrowserTest || false; // // end of user configurable variables // // global variables var wikEdLoaded = false; var wikEdDisabled = false; // history var wikEdFieldHist = []; var wikEdCookieName = []; var wikEdInputElement = []; var wikEdSelectElement = []; var wikEdCheckMarker = []; wikEdCheckMarker[true] = '\u2022'; wikEdCheckMarker[false] = '\u22c5'; // cache the parsed DOM object var wikEdFrameDOMCache; // undo all, redo all var wikEdOrigVersion = ''; var wikEdLastVersion; // global dom elements var wikEdLogo; var wikEdLogoList; var wikEdTextarea; var wikEdFrame; var wikEdFrameBody; var wikEdFrameDocument; var wikEdFrameWindow; var wikEdInputWrapper; var wikEdToolbarWrapper; var wikEdTextareaWrapper; var wikEdFrameWrapper; var wikEdConsoleWrapper; var wikEdButtonsWrapper; var wikEdSummaryWrapper; var wikEdSummaryInputWrapper; var wikEdSummaryOptions; var wikEdSubmitWrapper; var wikEdSubmitButtonsWrapper; var wikEdLocalPrevWrapper; var wikEdInsertWrapper; var wikEdButtonsFormat; var wikEdButtonsCustom1; var wikEdButtonsFind; var wikEdButtonsFix; var wikEdButtonsCustom2; var wikEdButtonsControl; var wikEdButtonsPreview; var wikEdPreviewBox; var wikEdButtonsPreview2; var wikEdButtonsJump; var wikEdClearSummaryImg; var wikEdCaseSensitive; var wikEdRegExp; var wikEdFindAhead; var wikEdFindText; var wikEdReplaceText; var wikEdSummaryText; var wikEdEditOptions; var wikEdEditHelp; var wikEdSaveButton; var wikEdPreviewButton; var wikEdLDiffButton; var wikEdLocalPreview; var wikEdLocalDiff; // various var wikEdTextareaHeight; var wikEdPrevRange = null; var wikEdClearSummaryWidth; var wikEdFullScreenMode = false; var wikeEdInsertTagsOriginal; // unicode fixing var wikEdSupportedChars; var wikEdSpecialChars; var wikEdProblemChars; var wikEdControlChars; var wikEdStrangeSpaces; // wiki file paths for use in regexps var wgServer = wgServer || ''; var wgArticlePath = wgArticlePath || ''; var wgScriptPath = wgScriptPath || ''; var wikEdServer = wgServer.replace(/(\W)/g, '\\$1'); var wikEdArticlePath = wgArticlePath.replace(wgServer, ''); var wikEdScriptPath = wgScriptPath.replace(wgServer, ''); wikEdArticlePath = wikEdArticlePath.replace(/\$1$/, ''); wikEdScriptPath = wikEdScriptPath.replace(/\/?$/, '/');; wikEdArticlePath = wikEdArticlePath.replace(/(\W)/g, '\\$1'); wikEdScriptPath = wikEdScriptPath.replace(/(\W)/g, '\\$1'); // article url prefix var wikEdArticlePrefix = wgArticlePath.replace(/\$1$/, ''); // call the setup routine if (typeof(addOnloadHook) == 'function') { addOnloadHook(WikEdSetup); } else { window.onload = WikEdSetup; } // // WikEdInitObject: initialize object, keep pre-defined values // function WikEdInitObject(array, preset) { for (var key in preset) { if (array[key] == null) { array[key] = preset[key]; } } return; } // // WikEdInitImage: initialize images, keep pre-defined values // function WikEdInitImage(array, preset) { for (var key in preset) { if (array[key] == null) { // remove MediaWiki path prefixes and add local path if (wikEdUseLocalImages == true) { array[key] = wikEdImagePathLocal + preset[key].replace(/^[0-9a-f]+\/[0-9a-f]+\//, ''); } // add path else { array[key] = wikEdImagePath + preset[key]; } } } return; } // // WikEdSetup: setup routine, called on page load // function WikEdSetup(scrollToText) { var html = ''; // add image path to image filename if (wikEdLogo == null) { /* ////////////////// remove Instaview buttons and preview field while (document.getElementById('InstaViewDump') != null) { var instaViewDump = document.getElementById('InstaViewDump'); } */ // insert logo into personal toolbar wikEdLogo = document.createElement('img'); wikEdLogo.id = 'wikEdLogoImg'; wikEdLogo.onclick = WikEdMainSwitch; wikEdLogoList = document.createElement('li'); wikEdLogoList.id = 'wikEdLogoList'; wikEdLogoList.appendChild(wikEdLogo); var personalTools = document.getElementById('p-personal'); if (personalTools != null) { personalTools.getElementsByTagName('ul')[0].appendChild(wikEdLogoList); } } // check if disabled var cookie = WikEdGetCookie('wikEdDisabled'); if (cookie != '') { wikEdDisabled = true; wikEdUseWikEd = false; WikEdSetLogo(); return; } // check if setup was already run if (wikEdLoaded == true) { return; } wikEdLoaded = true; // set error logo WikEdSetLogo('error'); // at the moment this works only for Mozilla browsers (Mozilla, Mozilla Firefox, Mozilla SeaMonkey) if (wikEdSkipBrowserTest != true) { if (navigator.appName == null) { return; } var nameMatch = navigator.appName.match(/Netscape/i); if (nameMatch == null) { return; } var name = nameMatch[0]; if ( (name == null) || (name == '') ) { return; } var version = navigator.appVersion.match(/\d+(\.\d+)/)[0]; if ( (version == null) || (version < 5.0) ) { return; } } // check if this is an edit page wikEdTextarea = document.getElementById('wpTextbox1'); var wpEditform = document.getElementById('editform'); if ( (wikEdTextarea == null) || (wpEditform == null) ) { // reset error indicator WikEdSetLogo(); return; } // define unicode characters for fixing function DefineUnicode(); // detect already loaded external scripts var pageScripts = document.getElementsByTagName('script'); var externalScripts = []; for (var i = 0; i < pageScripts.length; i ++) { var scriptName = pageScripts[i].src.replace(/\/(.*?)($|\?)/, '$1'); if (scriptName != '') { externalScripts[scriptName] = true; } } // load the external diff script if ( (wikEdLoadDiff == true) && (externalScripts['diff.js'] == null) ) { var script = document.createElement('script'); script.type = 'text/javascript'; script.src = wikEdDiffSrc; document.getElementsByTagName('head')[0].appendChild(script); externalScripts['diff.js'] = true; } // load the external Live Preview script if ( (wikEdLoadLivePreview == true) && (externalScripts['livepreview.js'] == null) ) { var script = document.createElement('script'); script.type = 'text/javascript'; script.src = wikEdLivePreviewSrc; document.getElementsByTagName('head')[0].appendChild(script); externalScripts['livepreview.js'] = true; } // load the external RegExTypoFix script if ( (wikEdLoadRegExTypoFix == true) && (externalScripts['RegExTypoFix.js'] == null) ) { var script = document.createElement('script'); script.type = 'text/javascript'; script.src = wikEdRegExTypoFixSrc; document.getElementsByTagName('head')[0].appendChild(script); externalScripts['RegExTypoFix.js'] = true; } // check if RegExTypoFix is available if (externalScripts['RegExTypoFix.js'] == null) { wikEdRegExTypoFix = false; } // get initial textarea height wikEdTextareaHeight = wikEdTextarea.offsetHeight; // setup the undo buffers and save the original text for local changes view wikEdOrigVersion = wikEdTextarea.value; // add stylesheet definitions var mainStyle = new WikEdStyleSheet(); for (var rule in wikEdMainCSS) { mainStyle.addRule(rule, wikEdMainCSS[rule]); } // get button settings from cookies var cookie = WikEdGetCookie('wikEdSummaryUsing'); if (cookie != '') { wikEdUsing = true; } else { wikEdUsing = wikEdUsingPreset; } cookie = WikEdGetCookie('wikEdUseClassic'); if (cookie != '') { wikEdUseWikEd = false; } else { wikEdUseWikEd = wikEdUseWikEdPreset; } cookie = WikEdGetCookie('wikEdSyntaxOff'); if (cookie != '') { wikEdHighlightSyntax = false; } else { wikEdHighlightSyntax = wikEdHighlightSyntaxPreset; } cookie = WikEdGetCookie('wikEdFullscreen'); if (cookie != '') { wikEdFullScreenMode = true; } else { wikEdFullScreenMode = wikEdFullScreenModePreset; } cookie = WikEdGetCookie('wikEdCloseToolbar'); if (cookie != '') { wikEdCloseToolbar = true; } else { wikEdCloseToolbar = wikEdCloseToolbarPreset; } if (window.location.search.match('wikedpreview') != null) { wikEdFullScreenMode = false; } // preset frame related styles to avoid browser crashes var styleFrameWrapperPosition; var styleFrameWrapperVisibility; var styleFrameBody; if (wikEdUseWikEd == true) { styleFrameBody = 'style="display: block;" '; styleFrameWrapperPosition = 'static'; styleFrameWrapperVisibility = 'visible'; styleTextareaWrapperPosition = 'absolute'; styleTextareaWrapperVisibility = 'hidden'; } else { styleFrameBody = 'style="display: none;" '; styleFrameWrapperPosition = 'absolute'; styleFrameWrapperVisibility = 'hidden'; styleTextareaWrapperPosition = 'static'; styleTextareaWrapperVisibility = 'visible'; } if (wikEdFullScreenMode == true) { wikEdInputWrapperClass = 'wikEdInputWrapperFull'; } else { wikEdInputWrapperClass = 'wikEdInputWrapper'; } // create wikEd element wrappers // create input wrapper, this contains the whole fullscreen content wikEdInputWrapper = document.createElement('div'); wikEdInputWrapper.id = 'wikEdInputWrapper'; wikEdInputWrapper.className = wikEdInputWrapperClass; wikEdTextarea.parentNode.insertBefore(wikEdInputWrapper, wikEdTextarea); // create toolbar wrapper wikEdToolbarWrapper = document.createElement('div'); wikEdToolbarWrapper.id = 'wikEdToolbarWrapper'; wikEdToolbarWrapper.className = 'wikEdToolbarWrapper'; wikEdInputWrapper.appendChild(wikEdToolbarWrapper); // create textarea wrapper wikEdTextareaWrapper = document.createElement('div'); wikEdTextareaWrapper.id = 'wikEdTextareaWrapper'; wikEdTextareaWrapper.className = 'wikEdTextareaWrapper'; wikEdTextareaWrapper.style.position = styleTextareaWrapperPosition; wikEdTextareaWrapper.style.visibility = styleTextareaWrapperVisibility; wikEdInputWrapper.appendChild(wikEdTextareaWrapper); // create frame wrapper wikEdFrameWrapper = document.createElement('div'); wikEdFrameWrapper.id = 'wikEdFrameWrapper'; wikEdFrameWrapper.className = 'wikEdFrameWrapper'; wikEdFrameWrapper.style.position = styleFrameWrapperPosition; wikEdFrameWrapper.style.visibility = styleFrameWrapperVisibility; wikEdInputWrapper.appendChild(wikEdFrameWrapper); // create console wrapper for buttons, summary, and submit wikEdConsoleWrapper = document.createElement('div'); wikEdConsoleWrapper.id = 'wikEdConsoleWrapper'; wikEdConsoleWrapper.className = 'wikEdConsoleWrapper'; wikEdInputWrapper.appendChild(wikEdConsoleWrapper); // create buttons wrapper for wikEd buttons wikEdButtonsWrapper = document.createElement('div'); wikEdButtonsWrapper.id = 'wikEdButtonsWrapper'; wikEdButtonsWrapper.className = 'wikEdButtonsWrapper'; if (wikEdButtonsOnTop == true) { wikEdInputWrapper.insertBefore(wikEdButtonsWrapper, wikEdTextareaWrapper); } else { wikEdConsoleWrapper.appendChild(wikEdButtonsWrapper); } // create summary wrapper for summary, minor edit, and watch this page wikEdSummaryWrapper = document.createElement('div'); wikEdSummaryWrapper.id = 'wikEdSummaryWrapper'; wikEdSummaryWrapper.className = 'wikEdSummaryWrapper'; wikEdConsoleWrapper.appendChild(wikEdSummaryWrapper); // create summary input wrapper wikEdSummaryInputWrapper = document.createElement('div'); wikEdSummaryInputWrapper.id = 'wikEdSummaryInputWrapper'; wikEdSummaryInputWrapper.className = 'wikEdSummaryInputWrapper'; wikEdSummaryWrapper.appendChild(wikEdSummaryInputWrapper); // create minor edit and watch page wrapper wikEdSummaryOptions = document.createElement('div'); wikEdSummaryOptions.id = 'wikEdSummaryOptions'; wikEdSummaryOptions.className = 'wikEdSummaryOptions'; wikEdSummaryWrapper.appendChild(wikEdSummaryOptions); // create submit wrapper for submit elements wikEdSubmitWrapper = document.createElement('div'); wikEdSubmitWrapper.id = 'wikEdSubmitWrapper'; wikEdSubmitWrapper.className = 'wikEdSubmitWrapper'; wikEdConsoleWrapper.appendChild(wikEdSubmitWrapper); // create submit buttons wrapper for submit buttons and help links wikEdSubmitButtonsWrapper = document.createElement('div'); wikEdSubmitButtonsWrapper.id = 'wikEdSubmitButtonsWrapper'; wikEdSubmitButtonsWrapper.className = 'wikEdSubmitButtonsWrapper'; wikEdSubmitWrapper.appendChild(wikEdSubmitButtonsWrapper); // create preview wrapper for preview and diff box wikEdLocalPrevWrapper = document.createElement('div'); wikEdLocalPrevWrapper.id = 'wikEdLocalPrevWrapper'; wikEdLocalPrevWrapper.className = 'wikEdLocalPrevWrapper'; wikEdLocalPrevWrapper.style.display = 'none'; wikEdInputWrapper.appendChild(wikEdLocalPrevWrapper); // create insert wrapper for insert special chars links wikEdInsertWrapper = document.createElement('div'); wikEdInsertWrapper.id = 'wikEdInsertWrapper'; wikEdInsertWrapper.className = 'wikEdInsertWrapper'; wikEdInputWrapper.appendChild(wikEdInsertWrapper); // append input wrapper to document wpEditform.insertBefore(wikEdInputWrapper, wpEditform.firstChild); // fill the wrappers // add toolbar to toolbar wrapper wpToolbar = document.getElementById('toolbar'); if (wikEdCloseToolbar == true) { wikEdToolbarWrapper.style.display = 'none'; } else { wikEdToolbarWrapper.style.display = 'block'; } if (wpToolbar != null) { wikEdToolbarWrapper.appendChild(wpToolbar); } // call wikibits:mwSetupToolbar() now because it would terminate with an error after setting textarea to display: none if (wpToolbar != null) { if (wpToolbar.getElementsByTagName('IMG').length == 0) { if (typeof(mwSetupToolbar) == 'function') { mwSetupToolbar(); window.removeEventListener('load', mwSetupToolbar, false); } } } // add summary elements to summary input wrapper var summaryLabel = document.getElementById('wpSummaryLabel'); wikEdSummaryInputWrapper.appendChild(summaryLabel); wikEdSummaryText = document.getElementById('wpSummary'); wikEdSummaryInputWrapper.appendChild(wikEdSummaryText); // move editpage-copywarn out of summary wrapper // needs to be done before appending editOptions to summary wrapper otherwise a linebreak stays (Mozilla bug) var copywarn = document.getElementById('editpage-copywarn'); if (copywarn != null) { wikEdInputWrapper.parentNode.insertBefore(copywarn, wikEdInputWrapper.nextSibling); } // add submit buttons to submit wrapper var wpEditButtons = document.getElementById('wpSave').parentNode; wikEdSubmitWrapper.insertBefore(wpEditButtons, wikEdSubmitButtonsWrapper); // move edit options after submit buttons; crashes Mozilla when appended after filling the iframe wikEdEditOptions = document.getElementById('wpSummary').parentNode; wikEdEditOptions.className = 'wikEdEditOptions'; var previewButton = document.getElementById('wpDiff'); previewButton.parentNode.insertBefore(wikEdEditOptions, previewButton.nextSibling); // remove linebreak before minor edit checkbox var node = wikEdEditOptions.firstChild; while (node != null) { if (node.tagName == 'BR') { node.parentNode.removeChild(node); break; } node = node.nextSibling; } // add textarea to textarea wrapper wikEdTextareaWrapper.appendChild(wikEdTextarea); // add edit-frame to frame wrapper // any DOM changes to a starting iframe in designmode may crash the browser, including DOM move, display: none; and position: absolute; // create the iframe html = ''; html += '<div id="wikEdFrameOuter" class="wikEdFrameOuter">'; html += '<div id="wikEdFrameInner" class="wikEdFrameInner">'; html += '<iframe id="wikEdFrame" class="wikEdFrame" name="wikEdFrame" style="height: ' + wikEdTextareaHeight + 'px;"></iframe>'; html += '</div>'; html += '</div>'; wikEdFrameWrapper.innerHTML = html; wikEdInputWrapper.insertBefore(wikEdFrameWrapper, wikEdTextareaWrapper); // fill the frame with content html = ''; html += '<html><head></head>'; html += '<body id="wikEdFrameBody" class="wikedFrameBody"' + styleFrameBody + 'onload="window.document.designMode = \'on\'; window.document.execCommand(\'styleWithCSS\', false, false);">'; html += '</body></html>'; wikEdFrame = document.getElementById('wikEdFrame'); wikEdFrameWindow = wikEdFrame.contentWindow; wikEdFrameDocument = wikEdFrameWindow.document; wikEdFrameDocument.open(); wikEdFrameDocument.write(html); wikEdFrameDocument.close(); wikEdFrameBody = wikEdFrameDocument.body; // generate button bars and add them to the buttons wrapper // form wrapper against summary input submit defaulting to this button wikEdButtonsFormat = MakeButtonBar(wikEdButtonBar['format']); wikEdButtonsWrapper.appendChild(wikEdButtonsFormat); wikEdButtonsControl = MakeButtonBar(wikEdButtonBar['control']); wikEdButtonsWrapper.appendChild(wikEdButtonsControl); if (wikEdButtonBar['custom1'][2].length > 0) { wikEdButtonsCustom1 = MakeButtonBar(wikEdButtonBar['custom1']); wikEdButtonsWrapper.appendChild(wikEdButtonsCustom1); } wikEdButtonsFind = MakeButtonBar(wikEdButtonBar['find']); wikEdButtonsWrapper.appendChild(wikEdButtonsFind); wikEdButtonsFix = MakeButtonBar(wikEdButtonBar['fix']); wikEdButtonsWrapper.appendChild(wikEdButtonsFix); if (wikEdButtonBar['custom2'][2].length > 0) { wikEdButtonsCustom2 = MakeButtonBar(wikEdButtonBar['custom2']); wikEdButtonsWrapper.appendChild(wikEdButtonsCustom2); } var br = document.createElement('br'); br.style.clear = 'both'; wikEdButtonsWrapper.appendChild(br); wikEdCaseSensitive = document.getElementById('wikEdCaseSensitive'); wikEdRegExp = document.getElementById('wikEdRegExp'); wikEdFindAhead = document.getElementById('wikEdFindAhead'); wikEdFindText = document.getElementById('wikEdFindText'); wikEdReplaceText = document.getElementById('wikEdReplaceText'); // add preview box top bar to submit wrapper wikEdButtonsPreview = MakeButtonBar(wikEdButtonBar['preview']); wikEdSubmitWrapper.insertBefore(wikEdButtonsPreview, wikEdSubmitWrapper.firstChild); // add preview box and its bottom bar to preview wrapper var div = document.createElement('div'); div.id = 'wikEdPreviewBoxOuter'; div.className = 'wikEdPreviewBoxOuter'; wikEdLocalPrevWrapper.appendChild(div); wikEdPreviewBox = document.createElement('div'); wikEdPreviewBox.id = 'wikEdPreviewBox'; wikEdPreviewBox.className = 'wikEdPreviewBox'; div.appendChild(wikEdPreviewBox); wikEdButtonsPreview2 = MakeButtonBar(wikEdButtonBar['preview2']); wikEdLocalPrevWrapper.appendChild(wikEdButtonsPreview2); // add jump box to standard preview var wikiPreview = document.getElementById('wikiPreview'); if (wikiPreview != null) { if (wikiPreview.firstChild != null) { wikEdButtonsJump = MakeButtonBar(wikEdButtonBar['jump']); wikiPreview.insertBefore(wikEdButtonsJump, wikiPreview.firstChild); } } // add insert special chars to insert wrapper var wpSpecialchars = document.getElementById('editpage-specialchars'); if (wpSpecialchars != null) { wikEdInsertWrapper.appendChild(wpSpecialchars); } // wrappers filled // add local preview button next to submit button wikEdLocalPreview = document.createElement('button'); wikEdLocalPreview.id = 'wikEdLocalPreview'; wikEdLocalPreview.title = wikEdText['wikEdLocalPreview title']; wikEdLocalPreview.className = 'wikEdLocalPreview'; var localPreviewImg = document.createElement('img'); localPreviewImg.id = 'wikEdLocalPreviewImg'; localPreviewImg.src = wikEdImage['preview']; localPreviewImg.alt = wikEdText['wikEdLocalPreviewImg alt']; wikEdLocalPreview.appendChild(localPreviewImg); wikEdPreviewButton = document.getElementById('wpPreview'); wikEdPreviewButton.parentNode.insertBefore(wikEdLocalPreview, wikEdPreviewButton.nextSibling); // add local diff button next to submit button wikEdLocalDiff = document.createElement('button'); wikEdLocalDiff.id = 'wikEdLocalDiff'; wikEdLocalDiff.title = wikEdText['wikEdLocalDiff title']; wikEdLocalDiff.className = 'wikEdLocalDiff'; var localDiffImg = document.createElement('img'); localDiffImg.id = 'wikEdLocalDiffImg'; localDiffImg.src = wikEdImage['diff']; localDiffImg.alt = wikEdText['wikEdLocalDiffImg alt']; wikEdLocalDiff.appendChild(localDiffImg); wikEdDiffButton = document.getElementById('wpDiff'); wikEdDiffButton.parentNode.insertBefore(wikEdLocalDiff, wikEdDiffButton.nextSibling); // initialize image buttons WikEdButton(document.getElementById('wikEdHighlightSyntax'), 'wikEdHighlightSyntax', null, wikEdHighlightSyntax); WikEdButton(document.getElementById('wikEdUseWikEd'), 'wikEdUseWikEd', null, wikEdUseWikEd); WikEdButton(document.getElementById('wikEdCloseToolbar'), 'wikEdCloseToolbar', null, wikEdCloseToolbar); WikEdButton(document.getElementById('wikEdFullScreen'), 'wikEdFullScreen', null, wikEdFullScreenMode); WikEdButton(document.getElementById('wikEdUsing'), 'wikEdUsing', null, wikEdUsing); WikEdButton(document.getElementById('wikEdCaseSensitive'), 'wikEdCaseSensitive', null, false); WikEdButton(document.getElementById('wikEdRegExp'), 'wikEdRegExp', null, false); WikEdButton(document.getElementById('wikEdFindAhead'), 'wikEdFindAhead', null, wikEdFindAheadSelected); WikEdButton(document.getElementById('wikEdPreview'), 'wikEdPreview', null, false, 'wikEdButton'); WikEdButton(document.getElementById('wikEdDiff'), 'wikEdDiff', null, false, 'wikEdButton'); WikEdButton(document.getElementById('wikEdClose'), 'wikEdClose', null, false, 'wikEdButton'); WikEdButton(document.getElementById('wikEdPreview2'), 'wikEdPreview2', null, false, 'wikEdButton'); WikEdButton(document.getElementById('wikEdDiff2'), 'wikEdDiff2', null, false, 'wikEdButton'); WikEdButton(document.getElementById('wikEdClose2'), 'wikEdClose2', null, false, 'wikEdButton'); if (wikEdRegExTypoFix == false) { document.getElementById('wikEdFixRegExTypo').style.display = 'none'; } // add a clear summary button left to the summary input field var clearSummaryForm = document.createElement('form'); clearSummaryForm.id = 'wikEdClearSummaryForm'; clearSummaryForm.className = 'wikEdClearSummaryForm'; wikEdSummaryText.parentNode.insertBefore(clearSummaryForm, wikEdSummaryText); wikEdClearSummary = document.createElement('button'); wikEdClearSummary.id = 'wikEdClearSummary'; wikEdClearSummary.className = 'wikEdClearSummary'; wikEdClearSummary.alt = wikEdText['wikEdClearSummary alt']; wikEdClearSummary.title = wikEdText['wikEdClearSummary title']; wikEdClearSummary.style.height = (wikEdSummaryText.clientHeight + 1) +'px'; clearSummaryForm.appendChild(wikEdClearSummary); wikEdClearSummaryImg = document.createElement('img'); wikEdClearSummaryImg.id = 'wikEdClearSummaryImg'; wikEdClearSummaryImg.src = wikEdImage['clearSummary']; wikEdClearSummaryImg.alt = 'Clear summary'; wikEdClearSummary.appendChild(wikEdClearSummaryImg); // remember button width, might be without image wikEdClearSummaryWidth = wikEdClearSummary.offsetWidth; // make the summary a combo box var summaryComboInput = document.createElement('span'); summaryComboInput.id = 'wikEdSummaryComboInput'; summaryComboInput.className = 'wikEdSummaryComboInput'; summaryComboInput = wikEdSummaryText.parentNode.insertBefore(summaryComboInput, wikEdSummaryText); wikEdSummaryText = wikEdSummaryText.parentNode.removeChild(wikEdSummaryText); wikEdSummaryText.className = 'wikEdSummaryText'; wikEdSummaryTextWidth = wikEdSummaryWrapper.offsetWidth - wikEdSummaryInputWrapper.offsetWidth; if (wikEdSummaryTextWidth < 150) { wikEdSummaryTextWidth = 150; } wikEdSummaryText.style.width = wikEdSummaryTextWidth + 'px'; var summarySelect = document.createElement('select'); summarySelect.id = 'wikEdSummarySelect'; summarySelect.className = 'wikEdSummarySelect'; summarySelect.onchange = function() { WikEdChangeComboInput('summary'); } summarySelect.onfocus = function() { WikEdSetComboOptions('summary'); } summaryComboInput.appendChild(wikEdSummaryText); summaryComboInput.appendChild(summarySelect); // shorten submit button texts document.getElementById('wpPreview').value = wikEdText['shortenedPreview']; document.getElementById('wpDiff').value = wikEdText['shortenedChanges']; // set up combo input boxes with history wikEdFieldHist ['find'] = []; wikEdCookieName['find'] = 'wikEdFindHistory'; wikEdInputElement['find'] = new Object(wikEdFindText); wikEdSelectElement['find'] = new Object(document.getElementById('wikEdFindSelect')); wikEdSelectElement['find'].style.height = (wikEdInputElement['find'].clientHeight + 1) +'px'; wikEdFieldHist ['replace'] = []; wikEdCookieName['replace'] = 'wikEdReplaceHistory'; wikEdInputElement['replace'] = new Object(wikEdReplaceText); wikEdSelectElement['replace'] = new Object(document.getElementById('wikEdReplaceSelect')); wikEdSelectElement['replace'].style.height = (wikEdInputElement['replace'].clientHeight + 1) +'px'; wikEdFieldHist ['summary'] = []; wikEdCookieName['summary'] = 'wikEdSummaryHistory'; wikEdInputElement['summary'] = new Object(wikEdSummaryText); wikEdSelectElement['summary'] = new Object(document.getElementById('wikEdSummarySelect')); wikEdSelectElement['summary'].style.height = (wikEdInputElement['summary'].clientHeight + 1) +'px'; WikEdResizeComboInput('find'); WikEdResizeComboInput('replace'); WikEdResizeComboInput('summary'); // display only the textarea or the iframe, dont change the frame if (wikEdUseWikEd == true) { WikEdSetEditArea(true, true); } else { WikEdSetEditArea(false, true); } // add a link to the wikEd help page if ( (wikEdHelpPageLink != '') && (wikEdHelpPageLink != null) ) { var editHelpParent = previewButton; do { editHelpParent = editHelpParent.nextSibling; } while (editHelpParent.tagName != 'SPAN'); var editHelp = editHelpParent.lastChild; while (editHelp.tagName != 'A') { editHelp = editHelp.previousSibling; } wikEdHelpSpan = document.createElement('span'); wikEdHelpSpan.id = 'wikEdHelpSpan'; wikEdHelpSpan.className = 'wikEdHelpSpan'; wikEdHelpSpan.innerHTML = wikEdHelpPageLink; editHelpParent.insertBefore(wikEdHelpSpan, editHelp.nextSibling); wikEdEditHelp = wikEdHelpSpan.parentNode; wikEdEditHelp.id = 'wikEdEditHelp'; wikEdEditHelp.className = 'wikEdEditHelp'; } // add frame stylesheet definition wikEdFrameBody.style.fontSize = parseInt(wikEdTextZoom) + '%;'; var frameStyle = new WikEdStyleSheet(wikEdFrameDocument); for (var ruleName in wikEdFrameCSS) { var ruleStyle = wikEdFrameCSS[ruleName]; ruleStyle = ruleStyle.replace(/\{wikEdUnknown\}/g, wikEdImage['unknown']); ruleStyle = ruleStyle.replace(/\{wikEdTab\}/g, wikEdImage['tab']); ruleStyle = ruleStyle.replace(/\{wikEdCtrl\}/g, wikEdImage['ctrl']); ruleStyle = ruleStyle.replace(/\{wikEdBlank\}/g, wikEdImage['blank']); frameStyle.addRule(ruleName, ruleStyle); } // copy the textarea content to the iframe if (wikEdUseWikEd == true) { WikEdUpdateFrame(); } // set the summary resize after loading the 'Clear summary' image handler wikEdClearSummaryImg.addEventListener('load', WikEdResizeSummaryHandler, true); // set frame events wikEdFrameDocument.addEventListener('keydown', WikEdKeyFrame, true); wikEdFrameDocument.addEventListener('keyup', WikEdKeyFrame, true); wikEdFrameDocument.addEventListener('keypress', WikEdKeyFrame, true); wikEdFrameDocument.addEventListener('mouseup', WikEdKeyFrame, true); // set find ahead events wikEdFindText.addEventListener('keyup', WikEdFindAhead, true); // set submit button events wikEdSaveButton = document.getElementById('wpSave'); wikEdSaveButton.addEventListener('click', WikEdSaveButtonHandler, true); wikEdPreviewButton.addEventListener('click', WikEdPreviewButtonHandler, true); wikEdDiffButton.addEventListener('click', WikEdDiffButtonHandler, true); wikEdLocalPreview.addEventListener('click', WikEdLocalPreviewHandler, true); wikEdLocalDiff.addEventListener('click', WikEdLocalDiffHandler, true); // set the clear summary onclick handler wikEdClearSummary.addEventListener('click', WikEdClearSummaryHandler, true); // select the text on focus for find and replace fields wikEdReplaceText.addEventListener('focus', WikEdFindReplaceHandler, true); wikEdFindText.addEventListener('focus', WikEdFindReplaceHandler, true); // tab / shift-tab between find and replace fields wikEdFindText.addEventListener('keydown', WikEdFindReplaceHandler, true); wikEdReplaceText.addEventListener('keydown', WikEdFindReplaceHandler, true); // disable scrolling to edit window on next preview page document.getElementById('editform').action += '&wikedpreview'; // scroll to edit window if it is not a preview page if (scrollToText != false) { if (window.location.search.match('wikedpreview') == null) { window.scroll(0, WikEdGetOffsetTop(wikEdInputWrapper) - 2); } // focus the edit area if (wikEdUseWikEd == true) { wikEdFrameWindow.focus(); } else { wikEdTextarea.setSelectionRange(0, 0); wikEdTextarea.focus(); } } // fullscreen mode if (wikEdFullScreenMode == true) { WikEdFullScreen(wikEdFullScreenMode, true); } // override the insertTags function in wikibits.js used by the standard button toolbar and the editpage special chars if (typeof(insertTags) == 'function') { wikeEdInsertTagsOriginal = insertTags; insertTags = wikEdInsertTags; } // reset error indicator WikEdSetLogo(); return; } // // WikEdResizeSummaryHandler: summary resize after loading the 'Clear summary' image handler // function WikEdResizeSummaryHandler() { var diffWidth = wikEdClearSummary.offsetWidth - wikEdClearSummaryWidth; wikEdInputElement['summary'].style.width = (wikEdInputElement['summary'].clientWidth - diffWidth) + 'px'; wikEdSelectElement['summary'].style.width = (wikEdSelectElement['summary'].clientWidth - diffWidth) + 'px'; } // // WikEdSaveButtonHandler: 'Save page' onclick handler // function WikEdSaveButtonHandler() { wikEdSaveButton.removeEventListener('click', WikEdSaveButtonHandler, true); // update textarea if (wikEdUseWikEd == true) { WikEdUpdateTextarea(); } // add "using wikEd" to summary if this is not section=new (+ tab) var text = wikEdSummaryText.value; text = text.replace(/^[, ]+/, ''); text = text.replace(/[, ]+$/, ''); WikEdAddToHistory('summary'); if ( (wikEdUsing == true) && (text != '') ) { if (text.lastIndexOf(wikEdSummaryUsing) < 0) { if (/\bsection=new\b/.test(window.location.search) == false) { text += ' ' + wikEdSummaryUsing; } } } wikEdSummaryText.value = text; // submit wikEdSaveButton.click(); // reinstate handler in case the browser back button will be used wikEdSaveButton.addEventListener('click', WikEdSaveButtonHandler, true); return; } // // WikEdPreviewButtonHandler: 'Show preview' onclick handler // function WikEdPreviewButtonHandler(event) { if (wikEdUseWikEd == true) { WikEdUpdateTextarea(); } return; } // // WikEdDiffButtonHandler: 'Show changes' onclick handler // function WikEdDiffButtonHandler(event) { if (wikEdFullScreenMode == true) { WikEdFullScreen(false); } if (wikEdUseWikEd == true) { WikEdUpdateTextarea(); } return; } // // WikEdLocalPreviewHandler: local 'Show preview' image button onclick handler // function WikEdLocalPreviewHandler(event) { event.preventDefault(); WikEdButton(wikEdLocalPreview, 'wikEdLocalPreview'); return; } // // WikEdLocalDiffHandler: local 'Show changes' image button onclick handler // function WikEdLocalDiffHandler(event) { event.preventDefault(); WikEdButton(wikEdLocalDiff, 'wikEdLocalDiff'); return; } // // clear the summary onclick handler // function WikEdClearSummaryHandler(event) { event.preventDefault(); // clear the summary if it is only a paragraph name if ( /^\/\* .*? \*\/ *$/.test(wikEdSummaryText.value) ) { wikEdSummaryText.value = ''; } // clear the summary but leave paragraph names else { wikEdSummaryText.value = wikEdSummaryText.value.replace(/^((\/\* .*? \*\/ *)?).*/, function (p, p1, p2) { if (p1.length > 0) { p1 = p1 + ' '; } return(p1); } ); } wikEdSummaryText.focus(); return; } // // WikEdFindReplaceHandler: find and replace: tab and shift-tab between fields, select on focus // function WikEdFindReplaceHandler(event) { // tab / shift-tab between fields if (event.type == 'keydown') { if (event.keyCode == 9) { if (event.target == wikEdFindText) { wikEdReplaceText.removeEventListener('focus', WikEdFindReplaceHandler, true); wikEdReplaceText.focus(); wikEdReplaceText.addEventListener('focus', WikEdFindReplaceHandler, true); event.preventDefault(); } else if (event.target == wikEdReplaceText) { wikEdFindText.removeEventListener('focus', WikEdFindReplaceHandler, true); wikEdFindText.focus(); wikEdFindText.addEventListener('focus', WikEdFindReplaceHandler, true); event.preventDefault(); } } } // select on focus else if (event.type == 'focus') { event.target.setSelectionRange(0, this.textLength); } return; } // // WikEdSetLogo: set the logo on top of the page // function WikEdSetLogo(state) { if (state == 'error') { wikEdLogo.src = wikEdImage['error']; wikEdLogo.alt = wikEdText['wikEdLogo error alt']; wikEdLogo.title = wikEdText['wikEdLogo error title']; } else { if (wikEdDisabled == true) { wikEdLogo.src = wikEdImage['disabled']; wikEdLogo.alt = wikEdText['wikEdLogo disabled alt']; wikEdLogo.title = wikEdText['wikEdLogo disabled title']; } else { wikEdLogo.src = wikEdImage['logo']; wikEdLogo.alt = wikEdText['wikEdLogo alt']; wikEdLogo.title = wikEdText['wikEdLogo title']; } } wikEdLogo.title = wikEdLogo.title.replace(/\{wikEdProgramVersion\}/g, wikEdProgramVersion); wikEdLogo.title = wikEdLogo.title.replace(/\{wikEdProgramDate\}/g, wikEdProgramDate); return; } // // MakeButtonBar: generate button bar html code // function MakeButtonBar(bar) { var div = document.createElement('div'); div.id = bar[0]; div.className = bar[1]; var html = ''; for (var property in bar[2]) { switch (bar[2][property]) { case 'br': html += '<br />'; break; case 'find': html += '<span class="wikEdFindComboInput" id="wikEdFindComboInput">'; html += '<input class="wikEdCombo" id="wikEdFindText" type="text" value="">'; html += '<select class="wikEdCombo" id="wikEdFindSelect" onfocus="javascript:WikEdSetComboOptions(\'find\')" onChange="javascript:WikEdChangeComboInput(\'find\');">'; html += '</select>'; html += '</span>'; break; case 'replace': html += '<span class="wikEdReplaceComboInput" id="wikEdReplaceComboInput">'; html += '<input class="wikEdCombo" id="wikEdReplaceText" type="text" value="">'; html += '<select class="wikEdCombo" id="wikEdReplaceSelect" onfocus="WikEdSetComboOptions(\'replace\')" onChange="javascript:WikEdChangeComboInput(\'replace\');">'; html += '</select>'; html += '</span>'; break; default: var currButton = wikEdButton[bar[2][property]]; if ( (currButton[0] != 'wikEdSource') || (wikEdShowSourceButton == true) ) { html += '<img id="' + currButton[0] + '" class="' + currButton[1] + '" title="' + currButton[2] + '" src="' + currButton[3] + '" width="' + currButton[4] + '" height="' + currButton[5] + '" alt="' + currButton[6] + '" onClick="' + currButton[7] + '">'; } break; } } div.innerHTML = html; return(div); } // // WikEdSetEditArea: apply css changes to switch between classic textarea and rich text frame // function WikEdSetEditArea(useFrame, notFrame) { // turn rich text frame on if (useFrame == true) { wikEdTextareaWrapper.style.position = 'absolute'; wikEdTextareaWrapper.style.visibility = 'hidden'; wikEdTextarea.style.display = 'none'; if (notFrame != true) { wikEdFrameWrapper.style.position = 'static'; wikEdFrameWrapper.style.visibility = 'visible'; wikEdFrameBody.style.display = 'block'; } if (document.getElementById('toolbar') != null) { if (wikEdCloseToolbar == true) { wikEdToolbarWrapper.style.display = 'none'; } else { wikEdToolbarWrapper.style.display = 'block'; } } wikEdButtonsFormat.style.display = 'block'; if (wikEdButtonsCustom1 != null) { wikEdButtonsCustom1.style.display = 'block'; } wikEdButtonsFind.style.display = 'block'; wikEdButtonsFix.style.display = 'block'; if (wikEdButtonsCustom2 != null) { wikEdButtonsCustom2.style.display = 'block'; } wikEdButtonsControl.style.display = 'block'; } // turn classic textarea on else { if (notFrame != true) { wikEdFrameWrapper.style.position = 'absolute'; wikEdFrameWrapper.style.visibility = 'hidden'; wikEdFrameBody.style.display = 'none'; } wikEdTextareaWrapper.style.position = 'static'; wikEdTextareaWrapper.style.visibility = 'visible'; wikEdTextarea.style.display = 'block'; if (document.getElementById('toolbar') != null) { wikEdToolbarWrapper.style.display = 'block'; } wikEdButtonsFormat.style.display = 'none'; if (wikEdButtonsCustom1 != null) { wikEdButtonsCustom1.style.display = 'none'; } wikEdButtonsFind.style.display = 'none'; wikEdButtonsFix.style.display = 'none'; if (wikEdButtonsCustom2 != null) { wikEdButtonsCustom2.style.display = 'none'; } wikEdButtonsControl.style.display = 'block'; } return; } // // WikEdButton: toggle or set button checked state // used for buttons that do not require nor change the text. Faster than WikEdEditButton() // function WikEdButton(buttonObj, whichButton, toggleButton, setButton, classButton, doButton) { if (buttonObj != null) { // check if the button is disabled if (buttonObj.className == 'wikEdButtonInactive') { return; } // set button to pressed, set cursor to hourglass buttonObj.style.cursor = 'wait'; // init the button if (setButton != null) { if (setButton == false) { buttonObj.checked = false; if (classButton == null) { buttonObj.className = 'wikEdButtonUnchecked'; } } else { buttonObj.checked = true; if (classButton == null) { buttonObj.className = 'wikEdButtonChecked'; } } } else if (classButton != null) { buttonObj.className = classButton; } // toggle the button if (toggleButton != null) { if (toggleButton == true) { if (buttonObj.checked == true) { buttonObj.checked = false; buttonObj.className = 'wikEdButtonUnchecked'; } else { buttonObj.checked = true; buttonObj.className = 'wikEdButtonChecked'; } } } } // perform specific actions if ( ( (setButton == null) && (classButton == null) ) || (doButton == true) ) { // remove active content WikEdRemoveElements(['script', 'object', 'applet', 'embed']); switch (whichButton) { // switch between syntax highlighting and plain text case 'wikEdHighlightSyntax': var obj = {}; obj.html = wikEdFrameBody.innerHTML; obj.html = obj.html.replace(/(<br\b[^>]*>)\n* */g, '$1'); if (buttonObj.checked == true) { WikEdRemoveHighlighting(obj); wikEdHighlightSyntax = true; obj.html = obj.html.replace(/<br\b[^>]*>/g, '\n'); WikEdHighlightSyntax(obj); obj.html = obj.html.replace(/\n/g, '<br />'); var cookieExpire = new Date(); cookieExpire.setTime(cookieExpire.getTime() - 60 * 60 * 1000); WikEdSetCookie('wikEdSyntaxOff', '', cookieExpire.toGMTString(), '/'); } else { wikEdHighlightSyntax = false; WikEdRemoveHighlighting(obj); obj.html = obj.html.replace(/(\t)/g, '<span class="wikEdTabPlain">$1</span><!--wikEdTabPlain-->'); WikEdSetCookie('wikEdSyntaxOff', 'true', null, '/'); } wikEdFrameBody.innerHTML = obj.html; break; // align textbox with display top case 'wikEdScrollToInput': case 'wikEdScrollToInput2': case 'wikEdScrollToInput3': case 'wikEdScrollToInput4': var frameWrapperTop = WikEdGetOffsetTop(wikEdFrameWrapper); window.scroll(0, frameWrapperTop); break; // align edit buttons with display top case 'wikEdScrollToButtons': case 'wikEdScrollToButtons2': case 'wikEdScrollToButtons3': case 'wikEdScrollToButtons4': var consoleWrapperTop = WikEdGetOffsetTop(wikEdButtonsWrapper); window.scroll(0, consoleWrapperTop); break; // cycle through different font sizes case 'wikEdTextZoomDown': wikEdTextZoom = wikEdTextZoom / 1.2; if (wikEdTextZoom < 100 / 1.2 / 1.2) { wikEdTextZoom = 100 * 1.2 * 1.2; } wikEdFrameBody.style.fontSize = parseInt(wikEdTextZoom) + '%;'; break; // cycle through different font sizes case 'wikEdTextZoomUp': wikEdTextZoom = wikEdTextZoom * 1.2; if (wikEdTextZoom > 100 * 1.2 * 1.2) { wikEdTextZoom = 100 / 1.2 / 1.2; } wikEdFrameBody.style.fontSize = parseInt(wikEdTextZoom) + '%;'; break; // display local preview box case 'wikEdPreview': case 'wikEdPreview2': case 'wikEdLocalPreview': if (wikEdFullScreenMode == true) { WikEdFullScreen(false); } if (wikEdUseWikEd == true) { WikEdUpdateTextarea(); } wikEdPreviewBox.innerHTML = wiki2html(wikEdTextarea.value); wikEdLocalPrevWrapper.style.display = 'block'; break; // display local diff box case 'wikEdDiff': case 'wikEdDiff2': case 'wikEdLocalDiff': if (wikEdFullScreenMode == true) { WikEdFullScreen(false); } if (wikEdUseWikEd == true) { WikEdUpdateTextarea(); } var diffText = wikEdTextarea.value; diffText = StringDiff(wikEdOrigVersion, diffText); wikEdPreviewBox.innerHTML = diffText; wikEdLocalPrevWrapper.style.display = 'block'; break; // close the preview / diff box case 'wikEdClose': case 'wikEdClose2': wikEdLocalPrevWrapper.style.display = 'none'; break; // switch between textarea and frame display // switching an iframe in design mode immediately after initialization between absolute/static may crash mozilla case 'wikEdUseWikEd': // enble wikEd if (buttonObj.checked == true) { WikEdUpdateFrame(); // turn rich text frame on WikEdSetEditArea(true); wikEdUseWikEd = true; var cookieExpire = new Date(); cookieExpire.setTime(cookieExpire.getTime() - 60 * 60 * 1000); WikEdSetCookie('wikEdUseClassic', '', cookieExpire.toGMTString(), '/'); } // disable wikEd else { if (wikEdFullScreenMode == true) { WikEdFullScreen(false); } WikEdUpdateTextarea(); // turn classic textarea on WikEdSetEditArea(false); wikEdUseWikEd = false; WikEdSetCookie('wikEdUseClassic', 'true', null, '/'); } break; // add "using wikEd" to summaries case 'wikEdUsing': if (buttonObj.checked == true) { wikEdUsing = true; WikEdSetCookie('wikEdSummaryUsing', 'true', null, '/'); } else { wikEdUsing = false; var cookieExpire = new Date(); cookieExpire.setTime(cookieExpire.getTime() - 60 * 60 * 1000); WikEdSetCookie('wikEdSummaryUsing', '', cookieExpire.toGMTString(), '/'); } break; // close the toolbar case 'wikEdCloseToolbar': if (buttonObj.checked == true) { wikEdCloseToolbar = true; if (document.getElementById('toolbar') != null) { wikEdToolbarWrapper.style.display = 'none'; } WikEdSetCookie('wikEdCloseToolbar', 'true', null, '/'); } else { wikEdCloseToolbar = false; if (document.getElementById('toolbar') != null) { wikEdToolbarWrapper.style.display = 'block'; } var cookieExpire = new Date(); cookieExpire.setTime(cookieExpire.getTime() - 60 * 60 * 1000); WikEdSetCookie('wikEdCloseToolbar', '', cookieExpire.toGMTString(), '/'); } if (wikEdFullScreenMode == true) { WikEdFullScreen(wikEdFullScreenMode); } break; // hide or show elements var displayStyle; // just toggle the case sensitive search button case 'wikEdCaseSensitive': break; // just toggle the regexp search button case 'wikEdRegExp': break; // just toggle the find-ahead-as-you-type search button case 'wikEdFindAhead': break; // switch to fullscreen edit area case 'wikEdFullScreen': if (buttonObj.checked == true) { WikEdFullScreen(true); WikEdSetCookie('wikEdFullscreen', 'true', null, '/'); } else { WikEdFullScreen(false); var cookieExpire = new Date(); cookieExpire.setTime(cookieExpire.getTime() - 60 * 60 * 1000); WikEdSetCookie('wikEdFullscreen', '', cookieExpire.toGMTString(), '/'); } break; // clear the find, replace, and summary history stored in cookies case 'wikEdClearHistory': WikEdClearHistory('find'); WikEdClearHistory('replace'); WikEdClearHistory('summary'); break; // clear the search find field to search for the selected text case 'wikEdClearFind': wikEdInputElement['find'].value = ''; break; // for testing case 'wikEdPlaceholder': break; } } // reset the frame DOM cache because the frame content might have changed wikEdFrameDOMCache = null; // reset cursor to normal if (buttonObj != null) { buttonObj.style.cursor = 'pointer'; } return; } // // WikEdEditButton: editing functions // used for buttons that require or change the text, more time consuming than WikEdButton() // function WikEdEditButton(buttonObj, whichButton, parameterArray, CustomHandler) { // check if button is disabled if (buttonObj != null) { if (buttonObj.className == 'wikEdButtonInactive') { return; } } // remove active and non-text content WikEdRemoveElements(['script', 'object', 'applet', 'embed', 'textarea']); // select the appropriate text change targets (whole, selection, cursor, focusWord, focusLine, selectionWord, or selectionLine) var obj = {}; obj.changed = {}; switch (whichButton) { // undo, redo: whole case 'wikEdUndo': case 'wikEdRedo': case 'wikEdUndoAll': case 'wikEdRedoAll': WikEdGetText(obj, 'whole'); obj.changed = obj.whole; break; // basic wiki character formatting: selection / focusWord / cursor case 'wikEdBold': case 'wikEdItalic': case 'wikEdUnderline': case 'wikEdStrikethrough': case 'wikEdNowiki': case 'wikEdSuperscript': case 'wikEdSubscript': case 'wikEdWikiLink': case 'wikEdWebLink': WikEdGetText(obj, 'selection, cursor'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { WikEdGetText(obj, 'focusWord'); if (obj.focusWord.plain != '') { obj.changed = obj.focusWord; } else { obj.changed = obj.cursor; } } break; // reference: selection / cursor case 'wikEdRef': WikEdGetText(obj, 'selection, cursor'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { obj.changed = obj.cursor; } break; // references and small references: selection / cursor case 'wikEdReferences': case 'wikEdReferencesSection': WikEdGetText(obj, 'selection, cursor'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { obj.changed = obj.cursor; } break; // character formatting: selection / focusWord / cursor case 'wikEdCase': WikEdGetText(obj, 'selection, cursor'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { WikEdGetText(obj, 'focusWord'); if (obj.focusWord.plain != '') { obj.changed = obj.focusWord; } else { obj.changed = obj.cursor; } } break; // update syntax highlighting: selection / whole case 'wikEdUpdateSyntax': WikEdGetText(obj, 'selection'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { WikEdGetText(obj, 'whole'); obj.changed = obj.whole; } break; // multiple line changes: selectionLine / focusLine / cursor case 'wikEdDecreaseHeading': case 'wikEdIncreaseHeading': case 'wikEdIncreaseBulletList': case 'wikEdDecreaseBulletList': case 'wikEdIncreaseNumberList': case 'wikEdDecreaseNumberList': case 'wikEdIncreaseIndentList': case 'wikEdDecreaseIndentList': case 'wikEdDefinitionList': WikEdGetText(obj, 'selection, cursor'); if (obj.selection.plain != '') { WikEdGetText(obj, 'selectionLine'); obj.changed = obj.selectionLine; } else { WikEdGetText(obj, 'focusLine'); if (obj.focusLine.plain != '') { obj.changed = obj.focusLine; } else { obj.changed = obj.cursor; } } break; // image: selectionWord (if text is selected) / cursor case 'wikEdImage': WikEdGetText(obj, 'selection, cursor'); if (obj.selection.plain != '') { WikEdGetText(obj, 'selectionWord'); obj.changed = obj.selectionWord; } else { obj.changed = obj.cursor; } break; // table: selectionLine / cursor case 'wikEdTable': WikEdGetText(obj, 'selection, cursor'); if (obj.selection.plain != '') { WikEdGetText(obj, 'selectionLine'); obj.changed = obj.selectionLine; } else { WikEdGetText(obj, 'focusLine'); obj.changed = obj.cursor; } break; // wikify: selection / whole case 'wikEdWikify': WikEdGetText(obj, 'selection'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { WikEdGetText(obj, 'whole'); obj.changed = obj.whole; } break; // textify: selection / whole, without wikifying case 'wikEdTextify': WikEdGetText(obj, 'selection', true); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { WikEdGetText(obj, 'whole', true); obj.changed = obj.whole; } break; // redirect: whole case 'wikEdRedirect': WikEdGetText(obj, 'whole, selection, cursor'); if (obj.selection.plain == '') { WikEdGetText(obj, 'selectionWord'); } obj.changed = obj.whole; break; // character formatting: selection / focusWord / cursor case 'wikEdGetFind': case 'wikEdGetFindReplace': WikEdGetText(obj, 'selection, cursor'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { WikEdGetText(obj, 'focusWord'); if (obj.focusWord.plain != '') { obj.changed = obj.focusWord; } else { obj.changed = obj.cursor; } } break; // find and replace: selection / focusWord case 'wikEdFindPrev': case 'wikEdFindNext': case 'wikEdReplacePrev': case 'wikEdReplaceNext': WikEdGetText(obj, 'selection'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { WikEdGetText(obj, 'focusWord'); if (obj.focusWord.plain != '') { obj.changed = obj.focusWord; } else { obj.changed.plain = null; } } break; // find all: selection case 'wikEdFindAll': WikEdGetText(obj, 'selection'); break; // replace all: selection / whole case 'wikEdReplaceAll': WikEdGetText(obj, 'selection'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { WikEdGetText(obj, 'whole'); obj.changed = obj.whole; } break; // jump to top or bottom: cursor (dummy) case 'wikEdUpdown': WikEdGetText(obj, 'cursor'); obj.changed = obj.cursor; break; // jump to previous or last position: selection, cursor case 'wikEdPrevPos': case 'wikEdLastPos': WikEdGetText(obj, 'selection, cursor'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { obj.changed = obj.cursor; } break; // fixing buttons: selection / whole case 'wikEdFixBasic': case 'wikEdfixUnicode': case 'wikEdFixAll': case 'wikEdFixHtml': case 'wikEdFixRegExTypo': WikEdGetText(obj, 'selection'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { WikEdGetText(obj, 'whole'); obj.changed = obj.whole } break; // fixing buttons: selection / focusLine / cursor case 'wikEdFixPunct': case 'wikEdFixMath': case 'wikEdFixUnits': case 'wikEdFixDashes': case 'wikEdFixCaps': case 'wikEdFixChem': WikEdGetText(obj, 'selection, cursor'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { WikEdGetText(obj, 'focusLine'); if (obj.focusLine.plain != '') { obj.changed = obj.focusLine; } else { obj.changed = obj.cursor; } } break; // fixing buttons: selection / focusWord / cursor WikEdGetText(obj, 'selection, cursor'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { WikEdGetText(obj, 'focusWord'); if (obj.focusWord.plain != '') { obj.changed = obj.focusWord; } else { obj.changed = obj.cursor; } } break; // source: selection / whole case 'wikEdSource': WikEdGetText(obj, 'selection'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { WikEdGetText(obj, 'whole'); obj.changed = obj.whole; } break; // insert tags: selection / focusWord / cursor case 'wikEdInsertTags': WikEdGetText(obj, 'selection, cursor'); if (obj.selection.plain != '') { obj.changed = obj.selection; } else { WikEdGetText(obj, 'focusWord'); if (obj.focusWord.plain != '') { obj.changed = obj.focusWord; } else { obj.changed = obj.selection; } } break; // custom edit functions have to call WikEdGetText() themselves default: WikEdGetText(obj, 'cursor'); obj.changed = obj.cursor; break; } // exit if (obj.changed == null) { wikEdFrameWindow.focus(); // reset button to active, reset cursor if (buttonObj != null) { if (buttonObj.className != 'wikEdButtonInactive') { buttonObj.className = 'wikEdButton'; } } return; } // set local syntax highlighting flag var highlightSyntax = wikEdHighlightSyntax; // manipulate the text var selectChange = true; switch (whichButton) { // undo case 'wikEdUndo': if (wikEdLastVersion == null) { wikEdLastVersion = obj.changed.plain; } WikEdFrameExecCommand('undo'); obj.changed.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1); obj.changed.plain = null; obj.changed.keepSel = true; break; // redo case 'wikEdRedo': WikEdFrameExecCommand('redo'); obj.changed.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1); obj.changed.plain = null; obj.changed.keepSel = true; break; // bold case 'wikEdBold': if ( /\'\'\'([^\'].*?)\'\'\'/.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/\'\'\'([^\'].*?)\'\'\'/g, '$1'); } else { obj.changed.plain = '\'\'\'' + obj.changed.plain + '\'\'\''; obj.changed.plain = obj.changed.plain.replace(/(\'\'\')( *)(.*?)( *)(\'\'\')/, '$2$1$3$5$4'); } obj.changed.plain = obj.changed.plain.replace(/\'{6,}/g, '\'\'\'\'\''); obj.changed.keepSel = true; break; // italic case 'wikEdItalic': if ( /(\'{3,})\'\'([^\'].*?)\'\'(\'{3,})/.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/(\'{3,})\'\'([^\'].*?)\'\'(\'{3,})/g, '$1$2$3'); } else if ( /(^|[^\'])\'\'([^\'].*?)\'\'([^\']|$)/.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/(^|[^\'])\'\'([^\'].*?)\'\'([^\']|$)/g, '$1$2$3'); } else { obj.changed.plain = '\'\'' + obj.changed.plain + '\'\''; obj.changed.plain = obj.changed.plain.replace(/(\'\')( *)(.*?)( *)(\'\')/, '$2$1$3$5$4'); } obj.changed.plain = obj.changed.plain.replace(/\'{6,}/g, '\'\'\'\'\''); obj.changed.keepSel = true; break; // underline case 'wikEdUnderline': if ( /<u>(.*?)<\/u>/i.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/<u>(.*?)<\/u>/gi, '$1'); } else { obj.changed.plain = '<u>' + obj.changed.plain + '<\/u>'; obj.changed.plain = obj.changed.plain.replace(/(<u>)( *)(.*?)( *)(<\/u>)/, '$2$1$3$5$4'); } obj.changed.keepSel = true; break; // strikethrough case 'wikEdStrikethrough': if ( /<s>(.*?)<\/s>/i.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/<s>(.*?)<\/s>/gi, '$1'); } else { obj.changed.plain = '<s>' + obj.changed.plain + '<\/s>'; obj.changed.plain = obj.changed.plain.replace(/(<s>)( *)(.*?)( *)(<\/s>)/, '$2$1$3$5$4'); } obj.changed.keepSel = true; break; // nowiki case 'wikEdNowiki': if ( /<nowiki>(.*?)<\/nowiki>/i.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/<nowiki>(.*?)<\/nowiki>/gi, '$1'); } else { obj.changed.plain = '<nowiki>' + obj.changed.plain + '<\/nowiki>'; obj.changed.plain = obj.changed.plain.replace(/(<nowiki>)( *)(.*?)( *)(<\/nowiki>)/, '$2$1$3$5$4'); } obj.changed.keepSel = true; break; // superscript case 'wikEdSuperscript': if ( /<sup>(.*?)<\/sup>/i.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/<sup>(.*?)<\/sup>/gi, '$1'); } else { obj.changed.plain = '<sup>' + obj.changed.plain + '</sup>'; obj.changed.plain = obj.changed.plain.replace(/(<sup>)( *)(.*?)( *)(<\/sup>)/, '$2$1$3$5$4'); } obj.changed.keepSel = true; break; // subscript case 'wikEdSubscript': if ( /<sub>(.*?)<\/sub>/i.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/<sub>(.*?)<\/sub>/gi, '$1'); } else { obj.changed.plain = '<sub>' + obj.changed.plain + '</sub>'; obj.changed.plain = obj.changed.plain.replace(/(<sub>)( *)(.*?)( *)(<\/sub>)/, '$2$1$3$5$4'); } obj.changed.keepSel = true; break; // in-text reference case 'wikEdRef': if (obj.changed.plain == '') { obj.changed.plain = '<ref name=\"\"/>'; } else if ( /<ref name=\"\" ?\/>/i.test(obj.changed.plain) ) { obj.changed.plain = ''; } else if ( /<ref( name=\"\")?>(.*?)<\/ref>/i.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/<ref( name=\"\")?>(.*?)<\/ref>/gi, '$2'); } else { obj.changed.plain = '<ref name=\"\">' + obj.changed.plain + '</ref>'; obj.changed.plain = obj.changed.plain.replace(/(<ref name=\"\">)( *)(.*?)( *)(<\/ref>)/, '$2$1$3$5$4'); } obj.changed.keepSel = true; break; // references location case 'wikEdReferences': case 'wikEdReferencesSection': var ref = wikEdText['wikEdReferencesSection']; ref = ref.replace(/</g, '<'); ref = ref.replace(/>/g, '>'); var refEscaped = ref; refEscaped = refEscaped.replace(/([^\w\s\;\&])/g, '\\$1'); refEscaped = refEscaped.replace(/^\n|\n$/g, '\\n*'); refEscaped = refEscaped.replace(/(\n)/g, '\\n'); var regExp = new RegExp(refEscaped, 'gi'); // plain references tag if (whichButton == 'wikEdReferences') { if (obj.changed.plain == '') { obj.changed.plain = '<references/>'; } else if (regExp.test(obj.changed.plain)) { obj.changed.plain = obj.changed.plain.replace(regExp, ''); } else if ( /<references ?\/>/i.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/<references ?\/>/gi, ''); } else { obj.changed = obj.cursor; obj.changed.plain = '<references/>'; } } // complete references code else { if (obj.changed.plain == '') { obj.changed.plain = ref; } else if (regExp.test(obj.changed.plain)) { obj.changed.plain = obj.changed.plain.replace(regExp, ''); } else if ( /<references ?\/>/i.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/<references ?\/>/gi, ''); } else { obj.changed = obj.cursor; obj.changed.plain = ref; } } obj.changed.keepSel = true; break; // toggle lowercase / uppercase case 'wikEdCase': // lowercase all uppercased text if (obj.changed.plain == '') { obj.changed.plain = null; } else { if (obj.changed.plain.toUpperCase() == obj.changed.plain) { obj.changed.plain = obj.changed.plain.toLowerCase(); } // first-letter-uppercase all lowercased text else if (obj.changed.plain.toLowerCase() == obj.changed.plain) { obj.changed.plain = obj.changed.plain.replace(/\b(\w)(\w*)/g, function (p, p1, p2) { return(p1.toUpperCase() + p2.toLowerCase()); } ); } // uppercase mixed upper and lowercased text else { obj.changed.plain = obj.changed.plain.toUpperCase(); } } obj.changed.keepSel = true; break; // undo all case 'wikEdUndoAll': if (wikEdLastVersion == null) { wikEdLastVersion = obj.changed.plain; } obj.changed.plain = wikEdOrigVersion; obj.changed.plain = obj.changed.plain.replace(/&/g, '&'); obj.changed.plain = obj.changed.plain.replace(/>/g, '>'); obj.changed.plain = obj.changed.plain.replace(/</g, '<'); break; // redo all case 'wikEdRedoAll': if (wikEdLastVersion != null) { obj.changed.plain = wikEdLastVersion; } break; // update syntax highlighting case 'wikEdUpdateSyntax': highlightSyntax = true; break; // create wikilink case 'wikEdWikiLink': if ( /\[\[(.*?)\]\]/.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/\[\[(.*?)\]\]/g, '$1'); } else { obj.changed.plain = '\[\[' + obj.changed.plain + '\]\]'; obj.changed.plain = obj.changed.plain.replace(/(\[\[)( *)(.*?)( *)(\]\])/, '$2$1$3$5$4'); } obj.changed.keepSel = true; break; // create weblink case 'wikEdWebLink': if ( /\[(.*?)\]/.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/\[(.*?)\]/g, '$1'); } else { obj.changed.plain = '\[' + obj.changed.plain + '\]'; obj.changed.plain = obj.changed.plain.replace(/(\[)( *)(.*?)( *)(\])/, '$2$1$3$5$4'); } obj.changed.keepSel = true; break; // decrease heading level case 'wikEdDecreaseHeading': // decrease heading obj.changed.plain = obj.changed.plain.replace(/(^|\n)=(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1$2 $3 $2'); // remove heading obj.changed.plain = obj.changed.plain.replace(/(^|\n)=(?!=) *([^\n]*?) *=+(?=\n|$)/g, '$1$2'); // adjust closing tags obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1$2 $3 $2'); obj.changed.keepSel = true; break; // increase heading level case 'wikEdIncreaseHeading': // increase heading obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1=$2 $3 $2='); // create new heading if (/\n/.test(obj.changed.plain) == false) { obj.changed.plain = obj.changed.plain.replace(/(^|\n)([^=\n\s][^\n]*?)(?=\n|$)/g, '$1== $2 =='); } // adjust closing tags obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1$2 $3 $2'); obj.changed.keepSel = true; break; // increase bullet list case 'wikEdIncreaseBulletList': obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g, function (p, p1) { p1 = p1.replace(/^ *([\*\#\:\;]*) */g, '*$1 '); return(p1); } ); obj.changed.keepSel = true; break; // decrease bullet list case 'wikEdDecreaseBulletList': obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g, function (p, p1) { p1 = p1.replace(/^\* */g, ''); return(p1); } ); obj.changed.keepSel = true; break; // increase numbered list case 'wikEdIncreaseNumberList': obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g, function (p, p1) { p1 = p1.replace(/^ *([\*\#\:\;]*) */g, '#$1 '); return(p1); } ); obj.changed.keepSel = true; break; // decrease numbered list case 'wikEdDecreaseNumberList': obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g, function (p, p1) { p1 = p1.replace(/^\# */g, ''); return(p1); } ); obj.changed.keepSel = true; break; // increase indented list case 'wikEdIncreaseIndentList': obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g, function (p, p1) { p1 = p1.replace(/^ *([\*\#\:\;]*) */g, ':$1 '); return(p1); } ); obj.changed.keepSel = true; break; // decrease indented list case 'wikEdDecreaseIndentList': obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g, function (p, p1) { p1 = p1.replace(/^\# */g, ''); return(p1); } ); obj.changed.keepSel = true; break; // create definition list case 'wikEdDefinitionList': obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g, function (p, p1) { p1 = p1.replace(/^ *([^\s\;]+) */g, '; $1 : '); return(p1); } ); break; // create image case 'wikEdImage': if (obj.changed.plain != '') { obj.changed.plain = '[[Image:<span class="wikEdInsertHere">' + wikEdText['image filename'] + '</span>|thumb|<span class="wikEdInsertHere">' + wikEdText['image width'] + '</span>px|' + obj.changed.plain + ']]'; } else { obj.changed.plain = '[[Image:<span class="wikEdInsertHere">' + wikEdText['image filename'] + '</span>|thumb|<span class="wikEdInsertHere">' + wikEdText['image width'] + '</span>px|<span class="wikEdInsertHere"> </span>]]'; if (obj.focusWord.plain != '') { obj.changed.plain = ' ' + obj.changed.plain + ' '; } } break; // create table case 'wikEdTable': if (obj.changed.plain != '') { obj.changed.plain = obj.changed.plain.replace(/(^|\n) */g, '\n|-\n| '); obj.changed.plain = obj.changed.plain.replace(/^\n\|\-\n/, '\n{| class="wikitable"\n'); obj.changed.plain = obj.changed.plain.replace(/$/g, '\n|}\n'); } else { obj.changed.plain = '\n{| class="wikitable"\n|+ <span class="wikEdInsertHere">' + wikEdText['table caption'] + '</span>\n! <span class="wikEdinserthere">' + wikEdText['table heading'] + '</span> !! <span class="wikEdInsertHere">' + wikEdText['table heading'] + '</span>\n|-\n| <span class="wikEdInsertHere">' + wikEdText['table cell'] + '</span> || <span class="wikEdInsertHere">' + wikEdText['table cell'] + '</span>\n|-\n| <span class="wikEdInsertHere">' + wikEdText['table cell'] + '</span> || <span class="wikEdInsertHere">' + wikEdText['table cell'] + '</span>\n|}\n'; if (obj.focusLine.plain != '') { obj.changed.plain = '\n' + obj.changed.plain + '\n'; } } break; // wikify: always done above case 'wikEdWikify': break; // textify: strip html from pasted content case 'wikEdTextify': WikEdTextify(obj.changed); break; // get inner html without wikifying if (obj.selection.plain != '') { obj.selection.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1); var documentFragment = obj.selection.range.cloneContents(); WikEdGetInnerHTML(objTextify, documentFragment); } else { obj.changed.from = 'whole'; obj.changed.range.setStartBefore(wikEdFrameBody.firstChild); obj.changed.range.setEndAfter(wikEdFrameBody.lastChild); WikEdGetInnerHTML(objTextify, wikEdFrameBody); } break; // redirect case 'wikEdRedirect': var linkTarget; if (obj.selection.plain != '') { linkTarget = obj.selection.plain; } else if (obj.selectionWord.plain != '') { linkTarget = obj.selectionWord.plain; } else { linkTarget = '<span class="wikEdInsertHere">' + wikEdText['redirect article link'] + '</span>'; } // remove leading and trailing spaces linkTarget = linkTarget.replace(/^\s+|\s+$/g, ''); // remove link text linkTarget = linkTarget.replace(/\|.*?(\]|$)/g, '$1'); // remove square brackets linkTarget = linkTarget.replace(/\[|\]/g, ''); // remove link leftovers linkTarget = linkTarget.replace(/ +\| +/g, ' '); obj.changed.plain = '#redirect [[' + linkTarget + ']]'; // append to summary if ( (obj.selection.plain != '') || (obj.selectionWord.plain != '') ) { wikEdInputElement['summary'].value = wikEdInputElement['summary'].value.replace(/#redirect( \[\[[^\]]*\]\])?(, *)?/g, ''); wikEdInputElement['summary'].value = WikEdAppendToSummary(wikEdInputElement['summary'].value, '#redirect [[' + linkTarget + ']]'); } else { wikEdInputElement['summary'].value = WikEdAppendToSummary(wikEdInputElement['summary'].value, '#redirect'); } selectChange = false; break; // copy selection to find field case 'wikEdGetFind': wikEdInputElement['find'].value = obj.changed.plain; obj.changed.plain = null; obj.changed.keepSel = true; break; // copy selection to find and to replace field case 'wikEdGetFindReplace': wikEdInputElement['find'].value = obj.changed.plain; wikEdInputElement['replace'].value = obj.changed.plain; obj.changed.plain = null; obj.changed.keepSel = true; break; // find and replace case 'wikEdFindPrev': case 'wikEdFindNext': case 'wikEdReplacePrev': case 'wikEdReplaceNext': case 'wikEdFindAll': case 'wikEdReplaceAll': // get the find text var findText; if (wikEdInputElement['find'].value != '') { findText = wikEdInputElement['find'].value; } else { if (obj.selection.plain == '') { obj.changed.plain = null; break; } else { findText = obj.selection.plain; } } // get the replace text var replaceText = wikEdInputElement['replace'].value; var regExpFind; // set regexp flags var regExpFlags = 'g'; if (wikEdCaseSensitive.checked == false) { regExpFlags += 'i'; } // format the find and replace texts as regexp or plain text if (wikEdRegExp.checked == false) { regExpFind = new RegExp(findText.replace(/([\\^\$\*\+\?\.\(\)\[\]\{\}\:\=\!\|\,\-])/g, '\\$1'), regExpFlags); } // replace \n with newline character else { regExpFind = new RegExp(findText, regExpFlags); replaceText = replaceText.replace(/((^|[^\\])(\\\\)*)\\n/g, '$1\n'); } // replace all var replacedFlag = false; if (whichButton == 'wikEdReplaceAll') { if (regExpFind.test(obj.changed.plain)) { obj.changed.plain = obj.changed.plain.replace(regExpFind, replaceText); replacedFlag = true; } else { obj.changed.plain = null; } } // replace an existing selection else if ( (whichButton == 'wikEdReplacePrev') || (whichButton == 'wikEdReplaceNext') ) { if (regExpFind.test(obj.selection.plain)) { var replaced = obj.selection.plain.replace(regExpFind, replaceText); if (obj.changed.plain != replaced) { obj.changed.plain = replaced; replacedFlag = true; } else { obj.changed.plain = null; } } else { obj.changed.plain = null; } } else if ( (whichButton == 'wikEdFindNext') || (whichButton == 'wikEdFindPrev') ) { obj.changed.plain = null; } if ( (whichButton == 'wikEdFindNext') || (whichButton == 'wikEdFindPrev') || (whichButton == 'wikEdReplaceNext') || (whichButton == 'wikEdReplacePrev') || (whichButton == 'wikEdFindAll') ) { if (replacedFlag == false) { // get direction var backwards = false; if ( (whichButton == 'wikEdFindPrev') || (whichButton == 'wikEdReplacePrev') ) { backwards = true; } // get case sensitive var caseSensitive = false; if (wikEdCaseSensitive.checked == true) { caseSensitive = true; } // find all if (whichButton == 'wikEdFindAll') { var found; var foundRanges = []; // start at top of text obj.sel.removeAllRanges(); var range = document.createRange(); range.setStartBefore(wikEdFrameBody.firstChild); range.collapse(true); range = obj.sel.addRange(range); // cycle through matches var frameScrollTop = wikEdFrameBody.scrollTop; do { if (wikEdRegExp.checked == true) { found = WikEdFind(obj, findText, caseSensitive, false, regExpFind); } else { found = WikEdFind(obj, findText, caseSensitive, false, null); } if (found == true) { foundRanges.push(obj.changed.range.cloneRange()); } } while (found == true); // scroll back if (wikEdRegExp.checked == false) { wikEdFrameBody.scrollTop = frameScrollTop; } // add the found ranges obj.sel.removeAllRanges(); for (range in foundRanges) { obj.sel.addRange(foundRanges[range]); } obj.changed.plain = null; } // normal find else { if (wikEdRegExp.checked) { WikEdFind(obj, findText, caseSensitive, backwards, regExpFind); } else { WikEdFind(obj, findText, caseSensitive, backwards, null); selectChange = false; } } } } // save search history to cookie if ( (whichButton == 'wikEdFindPrev') || (whichButton == 'wikEdFindNext') || (whichButton == 'wikEdFindAll') ) { WikEdAddToHistory('find'); } if ( (whichButton == 'wikEdReplacePrev') || (whichButton == 'wikEdReplaceNext') || (whichButton == 'wikEdReplaceAll') ) { WikEdAddToHistory('find'); WikEdAddToHistory('replace'); } obj.changed.keepSel = true; break; // jump to top or bottom case 'wikEdUpdown': // jump to bottom /////////////////////// also check which is closer!!!!! if ( (obj.cursor.range.startContainer == wikEdFrameBody) && (obj.cursor.range.startOffset == 0) ) { obj.changed.range.setEndAfter(wikEdFrameBody.lastChild); obj.changed.range.collapse(false); wikEdFrameBody.scrollTop = wikEdFrameBody.scrollHeight; } // jump to top else { obj.changed.range.setStartBefore(wikEdFrameBody.firstChild); obj.changed.range.collapse(true); wikEdFrameBody.scrollTop = 0; } obj.changed.plain = null; break; // jump to previously changed position case 'wikEdPrevPos': if (wikEdFrameDocument.queryCommandEnabled('undo') == true) { // done by undo + redo, redo later after scrolling to changed position WikEdFrameExecCommand('undo'); wikEdPrevRange = obj.changed.range.cloneRange(); obj.changed.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1); } obj.changed.plain = null; break; // jump back to last position case 'wikEdLastPos': if (wikEdPrevRange != null) { obj.changed.range = wikEdPrevRange.cloneRange(); wikEdPrevRange = null; obj.changed.plain = null; } else { obj.changed.plain = null; } break; // fixbasic: fix characters, spaces, empty lines, certain headings, needed for all fixing functions // to do: only certain changes in multiline tags: comments, tables, subst case 'wikEdFixBasic': WikEdFixBasic(obj.changed); obj.changed.keepSel = true; break; case 'wikEdFixPunct': WikEdFixPunct(obj.changed); obj.changed.keepSel = true; break; case 'wikEdFixMath': WikEdFixMath(obj.changed); obj.changed.keepSel = true; break; case 'wikEdFixChem': WikEdFixChem(obj.changed); obj.changed.keepSel = true; break; case 'wikEdfixUnicode': WikEdFixUnicode(obj.changed); obj.changed.keepSel = true; break; case 'wikEdFixUnits': WikEdFixUnits(obj.changed); obj.changed.keepSel = true; break; case 'wikEdFixDashes': WikEdFixDashes(obj.changed); obj.changed.keepSel = true; break; case 'wikEdFixHtml': WikEdFixHTML(obj.changed); obj.changed.keepSel = true; break; case 'wikEdFixRegExTypo': if (typeof(AWRegExTypoFix) == 'function') { var objFix = {} objFix.str = obj.changed.plain; AWRegExTypoFix(objFix); obj.changed.plain = objFix.str; } else { obj.changed.plain = null; } obj.changed.keepSel = true; break; case 'wikEdFixCaps': WikEdFixCaps(obj.changed); obj.changed.keepSel = true; break; case 'wikEdFixAll': WikEdFixAll(obj.changed); obj.changed.keepSel = true; break; // source on case 'wikEdSource': obj.changed.plain = obj.changed.code; obj.changed.plain = obj.changed.plain.replace(/(<(br|p)\b[^>]*>)/g, '$1\n'); obj.changed.plain = obj.changed.plain.replace(/&/g, '&'); obj.changed.plain = obj.changed.plain.replace(/</g, '<'); obj.changed.plain = obj.changed.plain.replace(/>/g, '>'); highlightSyntax = false; break; // insert tags case 'wikEdInsertTags': var tagOpen = parameterArray[0] || ''; var tagClose = parameterArray[1] || ''; var sampleText = parameterArray[2] || ''; tagOpen = tagOpen.replace(/&/g, '&'); tagOpen = tagOpen.replace(/</g, '<'); tagOpen = tagOpen.replace(/>/g, '>'); tagClose = tagClose.replace(/&/g, '&'); tagClose = tagClose.replace(/</g, '<'); tagClose = tagClose.replace(/>/g, '>'); tagsampleText = sampleText.replace(/&/g, '&'); tagsampleText = sampleText.replace(/</g, '<'); tagsampleText = sampleText.replace(/>/g, '>'); // single string to insert if ( (tagOpen.length > 0) && (tagClose.length == 0) && (sampleText.length == 0) ) { obj.changed = obj.cursor; obj.changed.plain = tagOpen; } // opening and closing strings else if ( (obj.changed.plain == '') && (sampleText.length > 0) ) { obj.changed.plain = tagOpen + sampleText + tagClose; } else { obj.changed.plain = tagOpen + obj.changed.plain + tagClose; } break; // custom edit functions default: if (CustomHandler != null) { CustomHandler(obj); } else { alert('Unknown edit function \'' + whichButton + '\''); } break; } // update the selection only, do not change the text if (obj.changed.plain == null) { if (whichButton != 'wikEdFindAll') { obj.sel.removeAllRanges(); obj.sel.addRange(obj.changed.range); // scroll the selected text into the viewport by using a backwards find if (selectChange != false) { // get the plain text of the selection var plainText = obj.sel.getRangeAt(obj.sel.rangeCount - 1).cloneContents().textContent; // collapse the selection to the end and search backwards if (plainText.length > 0) { plainText = plainText.replace(/\n/g, ''); obj.changed.range.collapse(false); // function: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog) wikEdFrameWindow.find(plainText, true, true, false, false, false, false); } } } } // apply text changes else { // a text change erases the last version for redo all if ( (whichButton != 'wikEdUndo') && (whichButton != 'wikEdRedo') && (whichButton != 'wikEdUndoAll') ) { wikEdLastVersion = null; } // highlight the syntax obj.html = obj.changed.plain; if (highlightSyntax == true) { WikEdHighlightSyntax(obj); } // display tabs else { obj.html = obj.html.replace(/(\t)/g, '<span class="wikEdTabPlain">$1</span><!--wikEdTabPlain-->'); } // display multiple blanks as blank- obj.html = obj.html.replace(/ /g, ' '); obj.html = obj.html.replace(/ /g, ' '); // newlines to <br /> obj.html = obj.html.replace(/\n/g, '<br />'); // make changed range text the current selection obj.sel.removeAllRanges(); obj.sel.addRange(obj.changed.range); // get the scroll position var frameScrollTop; if (obj.changed.from == 'whole') { frameScrollTop = wikEdFrameBody.scrollTop; } // replace the selection with changed text if (obj.html != '') { WikEdFrameExecCommand('inserthtml', obj.html); } else { WikEdFrameExecCommand('delete'); } // select the whole text after replacing the whole text and scroll to same height if (obj.changed.from == 'whole') { obj.sel.removeAllRanges(); wikEdFrameBody.scrollTop = frameScrollTop; var range = document.createRange(); range.setStartBefore(wikEdFrameBody.firstChild); range.setEndAfter(wikEdFrameBody.lastChild); obj.sel.addRange(range); selectChange = false; } // select the changed text and scroll it into the viewport by using a backwards find if (selectChange != false) { // get the text content of the changed text var div = document.createElement('div'); div.innerHTML = obj.changed.plain; var plainText = div.textContent; // find the text if (plainText.length > 0) { plainText = plainText.replace(/\n/g, ''); // function: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog) wikEdFrameWindow.find(plainText, true, true, false, false, false, false); } } } // collapse selection to end, keep whole text auto-selection as warning if ( ( (obj.changed.keepSel != true) && (obj.changed.from != 'whole') ) || (whichButton == 'wikEdRedirect') ) { obj.sel.getRangeAt(obj.sel.rangeCount - 1).collapse(false); } // finish jump to prev position after scrolling to changed position if (whichButton == 'wikEdPrevPos') { WikEdFrameExecCommand('redo'); } // reset button to active, reset cursor if (buttonObj != null) { if (buttonObj.className != 'wikEdButtonInactive') { buttonObj.className = 'wikEdButton'; } buttonObj.style.cursor = 'auto'; } // grey out inactive buttons WikEdInactiveButtons(); // reset the frame DOM cache because the frame content has been changed wikEdFrameDOMCache = null; // focus the frame if (wikEdUseWikEd == true) { wikEdFrameWindow.focus(); } return; } // // WikEdGetText: get the text fragments to manipulate // function WikEdGetText(obj, whichFragment, noWikify) { // get selection object if (obj.sel == null) { obj.sel = wikEdFrameWindow.getSelection(); } // cursor for the cursor position (always done) if (obj.cursor == null) { obj.cursor = {}; obj.cursor.from = 'cursor'; obj.cursor.range = document.createRange(); obj.cursor.range.setStart(obj.sel.focusNode, obj.sel.focusOffset); obj.cursor.range.setEnd(obj.sel.focusNode, obj.sel.focusOffset); obj.cursor.plain = ''; } // whole for the whole text if (obj.whole == null) { if (/whole|selectionWord|selectionLine|focusWord|focusLine/.test(whichFragment) == true) { obj.whole = {}; obj.whole.plainArray = []; obj.whole.plainNode = []; obj.whole.plainStart = []; obj.whole.from = 'whole'; // set whole range obj.whole.range = document.createRange(); obj.whole.range.setStartBefore(wikEdFrameBody.firstChild); obj.whole.range.setEndAfter(wikEdFrameBody.lastChild); // get whole plain text WikEdGetInnerHTML(obj.whole, wikEdFrameBody); obj.whole.code = obj.whole.html; WikEdRemoveHighlightingWikify(obj.whole, noWikify); obj.whole.plain = obj.whole.html; obj.whole.plain = obj.whole.plain.replace(/<br\b[^>]*>/g, '\n'); obj.whole.plain = obj.whole.plain.replace(/\u00a0/g, ' '); } } // selection for the selected text if (obj.selection == null) { if (/selection\b|selectionWord|selectionLine/.test(whichFragment) == true) { obj.selection = {}; obj.selection.from = 'selection'; // copy range to document fragment obj.selection.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1); var documentFragment = obj.selection.range.cloneContents(); // get selected text WikEdGetInnerHTML(obj.selection, documentFragment); obj.selection.code = obj.selection.html; WikEdRemoveHighlightingWikify(obj.selection, noWikify); obj.selection.plain = obj.selection.html; obj.selection.plain = obj.selection.plain.replace(/<br\b[^>]*>/g, '\n'); obj.selection.plain = obj.selection.plain.replace(/\u00a0/g, ' '); } } // focusWord and focusLine for the complete words and lines under the cursor if (obj.focusWord == null) { if (/focusWord|focusLine/.test(whichFragment) == true) { obj.focusWord = {}; obj.focusWord.from = 'focusWord'; obj.focusWord.range = document.createRange(); // setup focusLine object for the line under the cursor obj.focusLine = {}; obj.focusLine.from = 'focusLine'; obj.focusLine.range = document.createRange(); // find the word and line boundaries WikEdFindBoundaries(obj.focusWord, obj.focusLine, obj.whole, obj.cursor); // get the wikified plain text for the word under the cursor var documentFragment = obj.focusWord.range.cloneContents(); WikEdGetInnerHTML(obj.focusWord, documentFragment); obj.focusWord.code = obj.focusWord.html; WikEdRemoveHighlightingWikify(obj.focusWord, noWikify); obj.focusWord.plain = obj.focusWord.html; obj.focusWord.plain = obj.focusWord.plain.replace(/<br\b[^>]*>/g, '\n'); obj.focusWord.plain = obj.focusWord.plain.replace(/\u00a0/g, ' '); // get the wikified plain text for the line under the cursor var documentFragment = obj.focusLine.range.cloneContents(); WikEdGetInnerHTML(obj.focusLine, documentFragment); obj.focusLine.code = obj.focusLine.html; WikEdRemoveHighlightingWikify(obj.focusLine, noWikify); obj.focusLine.plain = obj.focusLine.html; obj.focusLine.plain = obj.focusLine.plain.replace(/<br\b[^>]*>/g, '\n'); obj.focusLine.plain = obj.focusLine.plain.replace(/\u00a0/g, ' '); } } // selectionWord and selectionLine for the complete words and lines under the selection if (obj.selectionWord == null) { if (/selectionWord|selectionLine/.test(whichFragment) == true) { // setup selectionWord object for the words under the selection obj.selectionWord = {}; obj.selectionWord.from = 'selectionWord'; obj.selectionWord.range = document.createRange(); // setup selectionLine object for the lines under the selection obj.selectionLine = {}; obj.selectionLine.from = 'selectionLine'; obj.selectionLine.range = document.createRange(); // find the word and line boundaries WikEdFindBoundaries(obj.selectionWord, obj.selectionLine, obj.whole, obj.selection); // get the wikified plain text for the words under the selection var documentFragment = obj.selectionWord.range.cloneContents(); WikEdGetInnerHTML(obj.selectionWord, documentFragment); obj.selectionWord.code = obj.selectionWord.html; WikEdRemoveHighlightingWikify(obj.selectionWord, noWikify); obj.selectionWord.plain = obj.selectionWord.html; obj.selectionWord.plain = obj.selectionWord.plain.replace(/<br\b[^>]*>/g, '\n'); obj.selectionWord.plain = obj.selectionWord.plain.replace(/\u00a0/g, ' '); // get the wikified plain text for the lines under the selection var documentFragment = obj.selectionLine.range.cloneContents(); WikEdGetInnerHTML(obj.selectionLine, documentFragment); obj.selectionLine.code = obj.selectionLine.html; WikEdRemoveHighlightingWikify(obj.selectionLine, noWikify); obj.selectionLine.plain = obj.selectionLine.html; obj.selectionLine.plain = obj.selectionLine.plain.replace(/<br\b[^>]*>/g, '\n'); obj.selectionLine.plain = obj.selectionLine.plain.replace(/\u00a0/g, ' '); } } return; } // // WikEdFind: custom find function with regexp properties, sets obj.changed.range, uses obj ranges // function WikEdFind(obj, findText, caseSensitive, backwards, regExp) { var range = obj.sel.getRangeAt(obj.sel.rangeCount - 1); var found = false; // empty the range to avoid error messages for reverse direction ranges obj.changed.range = document.createRange(); // use the fast built-in find function for non-regexp searches if (regExp == null) { // function: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog) found = wikEdFrameWindow.find(findText, caseSensitive, backwards, false, false, false, false); if (found == false) { obj.changed.range = range.cloneRange(); obj.changed.range.collapse(backwards); } else { range = obj.sel.getRangeAt(obj.sel.rangeCount - 1); obj.changed.range = range.cloneRange(); } } // slow javascript regexp find and replace else { // perform find if (obj.plainArray === undefined) { WikEdParseDOM(obj, wikEdFrameBody); } var regExpMatch = []; // find next, search to the right if (backwards == false) { // set start position for search to right regExpMatch = regExp.exec(obj.plain); regExp.lastIndex = obj.plainFocus; // execute the regexp search to the right regExpMatch = regExp.exec(obj.plain); // remember position for repeated searches obj.plainFocus = regExp.lastIndex; // collapse the selection to its end for no find if (regExpMatch == null) { obj.changed.range = range.cloneRange(); obj.changed.range.collapse(false); } } // find previous, search to the left else { // cycle through the matches to the left var regExpMatchNext; do { regExpMatch = regExpMatchNext; regExpMatchNext = regExp.exec(obj.plain); if (regExpMatchNext == null) { break; } } while (regExpMatchNext.index < obj.plainAnchor); // collapse the selection to its start for no find if (regExpMatch == null) { obj.changed.range = range.cloneRange(); obj.changed.range.collapse(true); } } // select the find if (regExpMatch != null) { found = true; var i = 0; while ( (obj.plainStart[i + 1] <= regExpMatch.index) && (obj.plainStart[i + 1] != null) ) { i ++; } var j = i; while ( (obj.plainStart[j + 1] <= regExpMatch.index + regExpMatch[0].length) && (obj.plainStart[j + 1] != null) ) { j ++; } obj.changed.range.setEnd (obj.plainNode[j], regExpMatch.index + regExpMatch[0].length - obj.plainStart[j]); obj.changed.range.setStart(obj.plainNode[i], regExpMatch.index - obj.plainStart[i]); } } return(found); } // // WikEdTextify: strip html off of text // function WikEdTextify(obj) { // convert html to plain obj.plain = obj.html; obj.plain = obj.plain.replace(/\n/g, ' '); // delete tags obj.plain = obj.plain.replace(/<(style|script|object|applet|embed)\b[^>]*>.*?<\/\1>/g, ''); // newlines obj.plain = obj.plain.replace(/<(br)\b[^>]*>/g, '\n'); // remove highlighting pre tags var isRemove = []; obj.plain = obj.plain.replace(/(<(\/?)pre\b([^>]*)>)/g, function (p, p1, p2, p3) { if (p2 == '') { if (/\bclass=\"wikEd\w+\"/.test(p3)) { isRemove.push(true); return(''); } isRemove.push(false); return(p1); } if (isRemove.pop() == true) { return(''); } return(p1); } ); // blocks obj.plain = obj.plain.replace(/<\/?(address|blockquote|center|div|h1|h2|h3|h4|h5|h6|hr|isindex|p|pre)\b[^>]*>/g, '\u0000\u0000'); // lists obj.plain = obj.plain.replace(/<\/?(dir|dl|menu|ol|ul)\b[^>]*>/g, '\u0000'); obj.plain = obj.plain.replace(/<\/(dd|dt|li)>/g, '\u0000'); // forms obj.plain = obj.plain.replace(/<\/?(select|textarea)\b[^>]*>/g, '\u0000'); obj.plain = obj.plain.replace(/<\/(option|legend|optgroup)>/g, '\u0000'); // table obj.plain = obj.plain.replace(/<\/?(table|caption)\b[^>]*>/g, '\u0000'); obj.plain = obj.plain.replace(/<\/(tr|th|td)>/g, '\u0000'); // finish html to plain conversion obj.plain = obj.plain.replace(/<[^>]*>/g, ''); // remove spaces obj.plain = obj.plain.replace(/[ \t\u00a0]+(\u0000)/g, '$1'); obj.plain = obj.plain.replace(/(\u0000)[ \t\u00a0]+/g, '$1'); // trim down \u0000 and \n obj.plain = obj.plain.replace(/\u0000+/g, '\n'); return; } // // WikEdInactiveButtons: grey out inactive buttons, called after every change and click // function WikEdInactiveButtons() { // undo, prevpos if (wikEdFrameDocument.queryCommandEnabled('undo') == true ) { document.getElementById('wikEdUndo').className = 'wikEdButton'; document.getElementById('wikEdPrevPos').className = 'wikEdButton'; document.getElementById('wikEdUndoAll').className = 'wikEdButton'; } else { document.getElementById('wikEdUndo').className = 'wikEdButtonInactive'; document.getElementById('wikEdPrevPos').className = 'wikEdButtonInactive'; document.getElementById('wikEdUndoAll').className = 'wikEdButtonInactive'; } // redo if (wikEdFrameDocument.queryCommandEnabled('redo') == true ) { document.getElementById('wikEdRedo').className = 'wikEdButton'; } else { document.getElementById('wikEdRedo').className = 'wikEdButtonInactive'; } // redo all if (wikEdLastVersion != null) { document.getElementById('wikEdRedoAll').className = 'wikEdButton'; } else { document.getElementById('wikEdRedoAll').className = 'wikEdButtonInactive'; } // lastpos if (wikEdPrevRange != null) { document.getElementById('wikEdLastPos').className = 'wikEdButton'; } else { document.getElementById('wikEdLastPos').className = 'wikEdButtonInactive'; } return; } // // WikEdFixBasic: fix characters, spaces, empty lines, certain headings, needed for all fixing functions // /// change: double spaces ok after dot function WikEdFixBasic(obj) { // non-breaking space character to normal space obj.plain = obj.plain.replace(/(\u00a0)/g, ' '); // remove trailing spaces obj.plain = obj.plain.replace(/( | )+\n/g, '\n'); // empty line before and after headings, spaces around word (lookahead) obj.plain = obj.plain.replace(/\n+(=+) *([^\n]*?) *(=+)(?=\n)\n*/g, '\n\n$1 $2 $3\n\n'); // uppercase well known headings var regExp = new RegExp('\\n=+ ' + wikEdText['External links'] + '? =+\\n', 'gi'); obj.plain = obj.plain.replace(regExp, '\n== ' + wikEdText['External links'] + ' ==\n'); regExp = new RegExp('\\n=+ ' + wikEdText['See also'] + ' =+\\n', 'gi'); obj.plain = obj.plain.replace(regExp, '\n== ' + wikEdText['See also'] + ' ==\n'); regExp = new RegExp('\\n=+ ' + wikEdText['References'] + '? =+\\n', 'gi'); obj.plain = obj.plain.replace(regExp, '\n== ' + wikEdText['References'] + ' ==\n'); // add space after * # : ; (list) and after {| |- | (table) obj.plain = obj.plain.replace(/(^|\n)([\*\#\:\;]+|\{\||\|\-|\|\}|\|) */g, '$1$2 '); obj.plain = obj.plain.replace(/ +\n/g, '\n'); // empty line before and after tables obj.plain = obj.plain.replace(/\n+(\{\|)/g, '\n\n$1'); obj.plain = obj.plain.replace(/(\n\|\}) *([^\n]*)[\n|$]+/g, '$1\n\n$2\n\n'); // empty line before and after lists obj.plain = obj.plain.replace(/(^|\n)([^\*\#\:\;].*?)\n+([\*\#\:\;])/g, '$1$2\n\n$3'); obj.plain = obj.plain.replace(/(^|\n)([\*\#\:\;].*?)\n+([^\*\#\:\;])/g, '$1$2\n\n$3'); // split into lines and change single lines, used to handle tables var lines = obj.plain.split('\n'); obj.plain = ''; var tableflag = false; for (var i = 0; i < lines.length; i++) { var line = lines[i]; // do not change lines starting with a blank if ( ! line.match(/^ /) ) { // detect table if ( line.match(/^(\{\||\!|\|[^}])/) ) { tableflag = true; } else if ( line.match(/^\|\}/) ) { tableflag = false; } // changes only to be done in tables if (tableflag) { // add spaces around || line = line.replace(/ *\|\| */g, ' || '); } // changes not to be done in tables if ( ! tableflag) { // empty line before and after images var regExp = new RegExp('^(\\[\\[' + wikEdText['wikicode Image'] + ':.*?\\]\\])', 'ig'); line = line.replace(regExp, '\n$1'); regExp = new RegExp('(\\[\\[' + wikEdText['wikicode Image'] + ':.*?(\\[\\[.*?\\]\\].*?)*\\]\\])$', 'ig'); line = line.replace(regExp, '$1\n'); // empty line before and after includes line = line.replace(/^(\{\{.*?\}\})/g, '\n$1'); line = line.replace(/(\{\{.*?\}\})$/g, '$1\n'); // to be done: convert single newlines into spaces // line = line.replace(/(\n[^\n \*\#\:\;\|\{].*?)\n([^\n \*\#\:\;\|\{])/g, '$1 $2'); } } // concatenate the lines obj.plain += line; if (i < lines.length - 1) { obj.plain += '\n'; } } // remove spaces in wikilinks obj.plain = obj.plain.replace(/\[\[ *([^\n]*?) *\]\]/g, '[[$1]]'); // remove spaces in external links obj.plain = obj.plain.replace(/\[ *([^\n]*?) *\]/g, '[$1]'); // no space around pipes before brackets obj.plain = obj.plain.replace(/ +\| +\]\]/g, '|]]'); // no space around pipes before curly brackets obj.plain = obj.plain.replace(/ +\| +\}\}/g, '|}}'); // no empty line between headings and includes obj.plain = obj.plain.replace(/\n(=+ [^\n]*? =+\n)\n+(\{\{.*?\}\})/g, '\n$1$2'); // spaces in comments obj.plain = obj.plain.replace(/(<!--) *([^\n]*?) *(-->)/g, '$1 $2 $3'); /* ???? // empty lines around html comments obj.plain = obj.plain.replace(/\n+(<!--.*?-->)\n+/g, '\n$1\n\n'); obj.plain = obj.plain.replace(/^(<!--.*?-->)\n+/g, '$1\n'); obj.plain = obj.plain.replace(/\n+(<!--.*?-->)$/g, '\n$1'); */ // empty line before and after categories var regExp = new RegExp('( |\\n)*(\\[\\[' + wikEdText['wikicode Category'] + ':[^\\n]*?\\]\\])( |\\n)*', 'gi'); obj.plain = obj.plain.replace(regExp, '\n\n$2\n\n'); // categories not separated by empty lines (lookahead) regExp = new RegExp('(\\[\\[category:[^\\n]*?\\]\\])\\n*(?=\\[\\[' + wikEdText['wikicode Category'] + ':[^\\n]*?\\]\\])', 'gi'); obj.plain = obj.plain.replace(regExp, '$1\n'); // single empty lines only obj.plain = obj.plain.replace(/\n{3,}/g, '\n\n'); // remove leading and trailing newlines obj.plain = obj.plain.replace(/^\n+/, ''); obj.plain = obj.plain.replace(/\n{2,}$/, '\n'); return; } // // WikEdFixPunct: remove space before .,:; // function WikEdFixPunct(obj) { WikEdFixBasic(obj); obj.plain = obj.plain.replace(/([\w\'\"”\]\}\)]) +([\.\,\:\;])(\s+|$)/g, '$1$2 '); obj.plain = obj.plain.replace(/\s+$/g, ''); return; } // // WikEdFixUnicode: fix unicode character representations // function WikEdFixUnicode(obj) { // replace supported chars: change decimal, hex, and character entities into actual char for (var i = 0; i < wikEdSupportedChars.length; i ++) { var replaceChar = String.fromCharCode(parseInt(wikEdSupportedChars[i][0], 16)); // decimal representation var regExpStr = '�*' + parseInt(wikEdSupportedChars[i][0], 16) + ';|'; // hex representation regExpStr += '�*' + wikEdSupportedChars[i][0] + ';'; // case insensitive replace var regExp = new RegExp(regExpStr, 'gi'); obj.plain = obj.plain.replace(regExp, replaceChar); // character entity representation regExpStr = '&' + wikEdSupportedChars[i][1] + ';'; // case sensitive replace regExp = new RegExp(regExpStr, 'g'); obj.plain = obj.plain.replace(regExp, replaceChar); } // replace unsupported chars in IE6: change decimal, hex, and chars into character entities for (var i = 0; i < wikEdProblemChars.length; i ++) { replaceChar = '&' + wikEdProblemChars[i][1] + ';'; // decimal representation regExpStr = '�*' + parseInt(wikEdProblemChars[i][0], 16) + ';|'; // hex representation regExpStr += '�*' + wikEdProblemChars[i][0] + ';'; // case insensitive replace regExp = new RegExp(regExpStr, 'gi'); obj.plain = obj.plain.replace(regExp, replaceChar); // actual character representation regExpStr = '\\u' + wikEdProblemChars[i][0]; // case sensitive replace regExp = new RegExp(regExpStr, 'g'); obj.plain = obj.plain.replace(regExp, replaceChar); } // replace special chars (spaces and invisible characters): change decimal, hex, and chars into character entities for (var i = 0; i < wikEdSpecialChars.length; i ++) { var replaceChar = '&' + wikEdSpecialChars[i][1] + ';'; // decimal representation var regExpStr = '�*' + parseInt(wikEdSpecialChars[i][0], 16) + ';|'; // hex representation regExpStr += '�*' + wikEdSpecialChars[i][0] + ';'; // case insensitive replace var regExp = new RegExp(regExpStr, 'gi'); obj.plain = obj.plain.replace(regExp, replaceChar); // actual character representation regExpStr = '\\u' + wikEdSpecialChars[i][0]; // case sensitive replace var regExp = new RegExp(regExpStr, 'g'); obj.plain = obj.plain.replace(regExp, replaceChar); } // unicode line separator and paragraph separator obj.plain = obj.plain.replace(/\u2028/g, '\n'); obj.plain = obj.plain.replace(/\u2029/g, '\n\n'); return; } // // WikEdFixMath: math character fixer, originally from User:Omegatron // function WikEdFixMath(obj) { WikEdFixBasic(obj); // change only outside <math> </math> wikicode obj.plain = obj.plain.replace(/(.*?)((<math(\b.*?)>.*?<\/math>)|$)/gi, function (p, p1, p2) { // convert html entities into actual dash characters p1 = p1.replace(/+/g, '+'); p1 = p1.replace(/−/g, '\u2212'); p1 = p1.replace(/·/g, '·'); // convert dash next to a number into a minus sign character p1 = p1.replace(/([^\w\,\{])-(\d)/g, '$1\u2212$2'); // changes 2x3 to 2×3 p1 = p1.replace(/(\d *)x( *\d)/g, '$1\u00d7$2'); // changes 10^3 to 10<sup>3</sup> p1 = p1.replace(/(\d*\.?\d+)\^(\u2212?\d+\.?\d*)/g, '$1<sup>$2</sup>'); // change x^3 to x<sup>3</sup> p1 = p1.replace(/([\w])\^(\u2212?\d+\.?\d*) /g, '$1<sup>$2</sup>'); // change +/- to ± p1 = p1.replace(/( |\d)\+\/(-|\u2212)( |\d)/g, '$1\u00b1$3'); // htmlize single char superscripts p1 = p1.replace(/(\u00b9|¹)/g, '<sup>1</sup>'); p1 = p1.replace(/(\u00b2|²)/g, '<sup>2</sup>'); p1 = p1.replace(/(\u00b3|³)/g, '<sup>3</sup>'); return(p1 + p2); } ); return; } // // WikEdFixChem: fix chemical formulas // function WikEdFixChem(obj) { WikEdFixBasic(obj); var realElements = 'H|He|Li|Be|B|C|N|O|F|Ne|Na|Mg|Al|Si|P|S|Cl|Ar|K|Ca|Sc|Ti|V|Cr|Mn|Fe|Co|Ni|Cu|Zn|Ga|Ge|As|Se|Br|Kr|Rb|Sr|Y|Zr|Nb|Mo|Tc|Ru|Rh|Pd|Ag|Cd|In|Sn|Sb|Te|I|Xe|Cs|Ba|Hf|Ta|W|Re|Os|Ir|Pt|Au|Hg|Tl|Pb|Bi|Po|At|Rn|Fr|Ra|Rf|Db|Sg|Bh|Hs|Mt|Ds|Rg|La|Ce|Pr|Nd|Pm|Sm|Eu|Gd|Tb|Dy|Ho|Er|Tm|Yb|Lu|Ac|Th|Pa|U|Np|Pu|Am|Cm|Bk|Cf|Es|Fm|Md|No|Lr'; var pseudoElements = '|Me|Et|Pr|Bu|e'; // fix common typos obj.plain = obj.plain.replace(/(^|[^a-z])h2o([^a-z]|$)/g, '$1H2O$2'); obj.plain = obj.plain.replace(/(^|[^a-z])h3o+/g, '$1H3O+'); obj.plain = obj.plain.replace(/(^|[^a-z])oh-/g, '$1OH+'); // uppercase lowercased elements var regExp = new RegExp('(^|[^a-zA-Z])(' + realElements.toLowerCase() + pseudoElements.toLowerCase() + ')([^a-zA-Z]|$)', 'g'); obj.plain = obj.plain.replace(regExp, function (p, p1, p2, p3) { if (p2 != 'e') { p2 = p2.substr(0, 1).toUpperCase() + p2.substr(1).toLowerCase(); } return(p1 + p2 + p3); } ); // fix superscripts obj.plain = obj.plain.replace(/+/g, '+'); obj.plain = obj.plain.replace(/−/g, '\u2212'); obj.plain = obj.plain.replace(/·/g, '·'); regExp = new RegExp('(' + realElements + pseudoElements + '|\\))(\\d*(\\+|-|\\u2212))', 'g'); obj.plain = obj.plain.replace(regExp, function (p, p1, p2, p3) { p2 = p2.replace(/-/g, '\u2212'); return(p1 + '<sup>' + p2 + '</sup>'); } ); // fix indices regExp = new RegExp('(' + realElements + pseudoElements + '|\\))(\\d+)', 'g'); obj.plain = obj.plain.replace(regExp, '$1<sub>$2</sub>'); // fix prefixes regExp = new RegExp('(\\d+) *(\\(|' + realElements + pseudoElements + ')', 'g'); obj.plain = obj.plain.replace(regExp, '$1$2'); // fix arrows obj.plain = obj.plain.replace(/ *-+> */g, ' \u2192 '); obj.plain = obj.plain.replace(/ *<-+ */g, ' \u2190 '); // &hdarr; and "leftwards harpoon over rightwards harpoon" not supported in IE6 // obj.plain = obj.plain.replace(/ *(<=+>|&hdarr;|↔|\u2190 *\u2192) */g, ' \u21cc '); obj.plain = obj.plain.replace(/ *(<==+>|&hdarr;|↔|\u21cc|\u2190 *\u2192) */g, ' <=> '); // fix - obj.plain = obj.plain.replace(/(\w|\)|>) +(-|\u2212) +(\w|\()/g, '$1 \u2212 $3'); return; } // // WikEdFixUnits: unit formatter // function WikEdFixUnits(obj) { WikEdFixBasic(obj); // convert into actual characters obj.plain = obj.plain.replace(/&deg;|&#00b0;/g, '°'); obj.plain = obj.plain.replace(/&#00b5;|&mu;|&micro;/g, 'µ'); obj.plain = obj.plain.replace(/&Omega;|&#8486;/g, '\u03a9'); // add space before units, remove space around /, and use abreviations obj.plain = obj.plain.replace(/( *\/ *|\d *)(Y|yotta|Z|zetta|E|exa|P|peta|T|tera|G|giga|M|mega|k|kilo|K|h|hecto|da|deca|d|deci|c|centi|m|mill?i|micro|u|µ|n|nano|p|pico|f|femto|a|atto|z|zepto|y|yocto|mibi|mebi|)(gramm?s?|g|metres?|meters?|m|amperes?|Amperes?|amps?|Amps?|A|Angstroms?|Angströms?|Å|Kelvins?|kelvins?|K|moles?|Moles?|mol|candelas?|cd|rad|Ci|sr|Hert?z|hert?z|Hz|newtons?|Newtons?|N|Joules?|joules?|J|watts?|Watts?|W|pascals?|Pascals?|Pa|lm|lx|C|volts?|Volts?|V|O|Farads?|F|Wb|T|H|S|bequerels?|Bequerels?|Bq|Gy|Sv|kat|centigrades?|°C|decibels?|db|dB|M|ohms?|Ohms?|\u03a9|sec|seconds?|s|minutes?|min|hour?|h|bits?|Bits?|bit|bytes?|Bytes?|B|bps|Bps)(?=\W|$)/g, function (p, p1, p2, p3) { p1 = p1.replace(/ *\/ */g, '/'); p1 = p1.replace(/(\d) */g, '$1 '); p2 = p2.replace(/yotta/g, 'Y'); p2 = p2.replace(/zetta/g, 'Z'); p2 = p2.replace(/exa/g, 'E'); p2 = p2.replace(/peta/g, 'P'); p2 = p2.replace(/tera/g, 'T'); p2 = p2.replace(/giga/g, 'G'); p2 = p2.replace(/mega/g, 'M'); p2 = p2.replace(/kilo/g, 'k'); p2 = p2.replace(/K/g, 'k'); p2 = p2.replace(/hecto/g, 'h'); p2 = p2.replace(/deca/g, 'da'); p2 = p2.replace(/deci/g, 'd'); p2 = p2.replace(/centi/g, 'c'); p2 = p2.replace(/mill?i/g, 'm'); p2 = p2.replace(/micro|u/g, 'µ'); p2 = p2.replace(/nano/g, 'n'); p2 = p2.replace(/pico/g, 'p'); p2 = p2.replace(/femto/g, 'f'); p2 = p2.replace(/atto/g, 'a'); p2 = p2.replace(/zepto/g, 'z'); p2 = p2.replace(/yocto/g, 'y'); p2 = p2.replace(/mibi/g, 'mebi'); p3 = p3.replace(/gramm?s?/g, 'g'); p3 = p3.replace(/metres?|meters?/g, 'm'); p3 = p3.replace(/amperes?|Amperes?|amps?|Amps?/g, 'A'); p3 = p3.replace(/Angstroms?|Angströms?/g, 'Å'); p3 = p3.replace(/Kelvins?|kelvins?/g, 'K'); p3 = p3.replace(/moles?|Moles?/g, 'mol'); p3 = p3.replace(/candelas?/g, 'cd'); p3 = p3.replace(/Hert?z|hert?z/g, 'Hz'); p3 = p3.replace(/newtons?|Newtons?/g, 'N'); p3 = p3.replace(/Joules?|joules?/g, 'J'); p3 = p3.replace(/watts?|Watts?/g, 'W'); p3 = p3.replace(/pascals?|Pascals?/g, 'Pa'); p3 = p3.replace(/volts?|Volts?/g, 'V'); p3 = p3.replace(/ohms?|Ohms?/g, '\u03a9'); p3 = p3.replace(/bequerels?|Bequerels?/g, 'Bq'); p3 = p3.replace(/Farads?/g, 'F'); p3 = p3.replace(/bits?|Bits?/g, 'bit'); p3 = p3.replace(/bytes?|Bytes?/g, 'B'); p3 = p3.replace(/sec|seconds?/g, 's'); p3 = p3.replace(/minutes?/g, 'min'); p3 = p3.replace(/hours?/g, 'h'); p3 = p3.replace(/sec|seconds?/g, 's'); p3 = p3.replace(/bps/g, 'bit/s'); p3 = p3.replace(/Bps/g, 'B/s'); return(p1 + p2 + p3); } ); // fix prefix casing obj.plain = obj.plain.replace(/ K(bit\/s|B\/s)(\W|$)/g, ' k$1$2'); obj.plain = obj.plain.replace(/ m(bit\/s|B\/s)(\W|$)/g, ' M$1$2'); obj.plain = obj.plain.replace(/ g(bit\/s|B\/s)(\W|$)/g, ' G$1$2'); obj.plain = obj.plain.replace(/ t(bit\/s|B\/s)(\W|$)/g, ' T$1$2'); obj.plain = obj.plain.replace(/ e(bit\/s|B\/s)(\W|$)/g, ' E$1$2'); return; } // // WikEdFixDashes: dash fixer - fixes several obvious en/em dash, minus sign, and such special characters. // originally from User:Omegatron // function WikEdFixDashes(obj) { WikEdFixBasic(obj); // convert html entities into actual dash characters obj.plain = obj.plain.replace(/&mdash;/g, '—'); obj.plain = obj.plain.replace(/&ndash;/g, '–'); obj.plain = obj.plain.replace(/&minus;/g, '\u2212'); // convert -- and em dashes with or without spaces to em dash surrounded by spaces obj.plain = obj.plain.replace(/([a-zA-Z\'\"”\]\}\)]) *(--|—|&mdash;) *([a-zA-Z\'\"“\[\{\(])/g, '$1 — $3'); // convert - or en dashes with spaces to em dash character surrounded by spaces obj.plain = obj.plain.replace(/([a-zA-Z\'\"”\]\}])( |&nbsp;)+(\u2212|–|&ndash;) +([a-zA-Z\'\"“\[\{])/g, '$1$2— $4'); // convert hyphen next to lone number into a minus sign character obj.plain = obj.plain.replace(/([a-zA-Z\'\"”\]\>] )-(\d)/g, '$1\u2212$2'); // convert dashes to en dashes in dates obj.plain = obj.plain.replace(/([ \(][12]\d\d\d) ?(--?|—|&mdash;) ?([12]\d\d\d|\d\d)([ \),.;])/g, '$1–$3$4'); return; } // // WikEdFixHTML: fix html to wikicode // function WikEdFixHTML(obj) { WikEdFixBasic(obj); // remove syntax highlighting obj.html = obj.plain; obj.html = obj.html.replace(/\n/g, '<br />'); WikEdRemoveHighlighting(obj); // turn visible html code into real html, exclude comments obj.html = obj.html.replace(/<(\/?\w.*?)>/g, '<$1>'); // wikify, keep user added attribute WikEdWikifyHTML(obj, true); // turn real html into visible html code obj.html = obj.html.replace(/<br\b[^>]*>/g, '\n'); obj.html = obj.html.replace(/</g, '<'); obj.html = obj.html.replace(/>/g, '>'); obj.plain = obj.html; return; } // // WikEdFixCaps: fix capitalizing of lists, linklists, images, headings // function WikEdFixCaps(obj) { WikEdFixBasic(obj); // uppercase lists // start (listcode (char-ent|tag|category..|digit|non-word,non-ret))(word,non-digit..) end obj.plain = obj.plain.replace(/^([\*\#\:\;]+ (\&\w+\;|<[^\n]*?>|\{\{.*?\}\}[^\n]*|\d|[^\w\n])*)([^\W\d].*?)?$/gm, function (p, p1, p2, p3) { if ( ! p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda|$)/) ) { p3 = p3.substr(0, 1).toUpperCase() + p3.substr(1); } return(p1 + p3); } ); // uppercase link lists (link) obj.plain = obj.plain.replace(/^([\*\#\:\;]+ \[\[)([^\n]*?)(\]\])/gm, function (p, p1, p2, p3) { // uppercase link p2 = p2.replace(/^((\&\w+\;|\W|\d)*)([^\W\d].*)$/, function (p, p1, p2, p3) { if ( ! p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/) ) { p3 = p3.substr(0, 1).toUpperCase() + p3.substr(1); } return(p1 + p3); } ); // uppercase comment p2 = p2.replace(/(\| *(\&\w+\;|<[^\n]*?>|\W|\d)*)([^\W\d].*)$/, function (p, p1, p2, p3) { if ( ! p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/) ) { p3 = p3.substr(0, 1).toUpperCase() + p3.substr(1); } return(p1 + p3); } ); return(p1 + p2 + p3); } ); // uppercase headings obj.plain = obj.plain.replace(/^(=+ (\&\w+\;|<[^\n]*?>|\d|[^\w\n])*)([^\W\d].*? =+)$/gm, function (p, p1, p2, p3) { if ( ! p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/) ) { p3 = p3.substr(0, 1).toUpperCase() + p3.substr(1); } return(p1 + p3); } ); // uppercase images regExp = new RegExp('(\\[\\[)' + wikEdText['wikicode Image'] + ':(\\w)([^\\n]*\\]\\])', 'igm'); obj.plain = obj.plain.replace(regExp, function (p, p1, p2, p3) { return(p1 + wikEdText['wikicode Image'] + ':' + p2.toUpperCase() + p3); } ); return; } // // WikEdFixAll: // function WikEdFixAll(obj) { WikEdFixBasic(obj); WikEdFixUnicode(obj); WikEdFixHTML(obj); WikEdFixCaps(obj); return; } // // WikEdRemoveElements: remove elements by tag name // function WikEdRemoveElements(tagNameArray) { // cycle through the element names for (var property in tagNameArray) { var elementArray = wikEdFrameDocument.getElementsByTagName(tagNameArray[property]); for (var i = 0; i < elementArray.length; i ++) { elementArray[i].parentNode.removeChild(elementArray[i]); } } return; } // // WikEdFindBoundaries: find word boundaries and line boundaries starting from selection.range // function WikEdFindBoundaries(word, line, whole, selection) { // get the start node and offset var startNode = selection.range.startContainer; var startNodeOffset = selection.range.startOffset; // get the end node and offset var endNode = selection.range.endContainer; var endNodeOffset = selection.range.endOffset; if (startNode.nodeType == 1) { startNode = startNode.childNodes[startNodeOffset]; startNodeOffset = 0; } if (endNode.nodeType == 1) { endNode = endNode.childNodes[endNodeOffset]; endNodeOffset = 0; } // find the start and end nodes in the whole plain text arrays var startNodeIndex; var endNodeIndex; for (var i = 0; i < whole.plainNode.length; i ++) { if (startNode == whole.plainNode[i]) { startNodeIndex = i; } if (endNode == whole.plainNode[i]) { endNodeIndex = i; break; } } // find last previous word and line boundary var foundWord = false; var foundLine = false; var regExp = new RegExp('.*[^\\w\\-]', 'g'); var plain = ''; // check text nodes left-wise for a boundary for (var i = startNodeIndex; i >= 0; i --) { plain = whole.plainArray[i]; plain = plain.replace(/&/g, '&'); plain = plain.replace(/</g, '<'); plain = plain.replace(/>/g, '>'); // boundary is a newline if (plain == '\n') { // current newline is the start node if (i == startNodeIndex) { if (! foundWord) { word.range.setStartBefore(whole.plainNode[i]); foundWord = true; } line.range.setStartBefore(whole.plainNode[i]); } else { if (! foundWord) { word.range.setStartAfter(whole.plainNode[i]); foundWord = true; } line.range.setStartAfter(whole.plainNode[i]); } foundLine = true; break; } // check text node for a word boundary else if (! foundWord) { if (i == startNodeIndex) { plain = plain.substr(0, startNodeOffset); plain = plain.replace(/&/g, '&'); plain = plain.replace(/</g, '<'); plain = plain.replace(/>/g, '>'); } regExp.lastIndex = 0; if (regExp.exec(plain) != null) { word.range.setStart(whole.plainNode[i], regExp.lastIndex); foundWord = true; } } } // boundary is start of text if (! foundLine) { line.range.setStartBefore(whole.plainNode[0]); if (! foundWord) { word.range.setStartBefore(whole.plainNode[0]); } } // find next word and line boundary regExp = new RegExp('[^\\w\\-]', 'g'); foundWord = false; foundLine = false; // check text nodes right-wise for a boundary for (var i = endNodeIndex; i < whole.plainArray.length; i ++) { plain = whole.plainArray[i]; plain = plain.replace(/&/g, '&'); plain = plain.replace(/</g, '<'); plain = plain.replace(/>/g, '>'); // boundary is a newline if (plain == '\n') { if (! foundWord) { word.range.setEndBefore(whole.plainNode[i]); foundWord = true; } line.range.setEndBefore(whole.plainNode[i]); foundLine = true; break; } // check text node for a word boundary else if (! foundWord) { if (i == endNodeIndex) { regExp.lastIndex = endNodeOffset; } else { regExp.lastIndex = 0; } var regExpArray = regExp.exec(plain); if (regExpArray != null) { word.range.setEnd(whole.plainNode[i], regExpArray.index); foundWord = true; } } } // boundary is end of text if (! foundLine) { line.range.setEndAfter(whole.plainNode[whole.plainArray.length - 1]); if (! foundWord) { word.range.setEndAfter(whole.plainNode[whole.plainArray.length - 1]); } } return; } // // remove syntax highlighting and wikify // function WikEdRemoveHighlightingWikify(obj, noWikify) { if (obj.html != '') { // remove syntax highlighting WikEdRemoveHighlighting(obj); // wikify, don't allow many attributes if ( (obj.htmlCode == true) && (noWikify != true) ) { WikEdWikifyHTML(obj, false); } } return; } // // WikEdWikifyHTML: // obj.html contains the text to be wikified // expects < > < > & spaces instead of <br> (not \n) // returns <br> (not \n) /* allowed and converted tags: br|p h1|h2|h3|h4|h5|h6 hr i|dfn|cite|em|var b|strong table|caption|col|thead|tfoot|tbody|tr|td|th dl|dt|dd|li|ol|ul a not allowed yet: bdo|q|kbd|samp|abbr|acronym|label other allowed tags: big|blockquote|colgroup|center|code|del|div|font|ins|pre|s|small|span|strike|sub|sup|tt|u|rb|rp|rt|ruby mediawiki tags: nowiki|math|gallery|noinclude|includeonly|ref|references */ function WikEdWikifyHTML(obj, relaxed) { var regExpStr; var regExp; var regExpMatch; // delete tags: <style> obj.html = obj.html.replace(/<(style)\b[^>]*>.*?<\/\1>/g, ''); // remove MediaWiki section edit spans obj.html = obj.html.replace(/<span[^>]*class=\"editsection\"[^>]*>.*?<\/span>\s*/g, ''); // remove MediaWiki heading spans obj.html = obj.html.replace(/<span\b[^>]*\bclass=\"mw-headline\"[^>]*>(.*?)<\/span>\s*/g, '$1'); // remove MediaWiki divs from article top obj.html = obj.html.replace(/<h3\b[^>]*\bid=\"siteSub\"[^>]*>.*?<\/h3>\s*/g, ''); obj.html = obj.html.replace(/<div\b[^>]*\bid=\"contentSub\"[^>]*>.*?<\/div>\s*/g, ''); obj.html = obj.html.replace(/<div\b[^>]*\bid=\"jump-to-nav\"[^>]*>.*?<\/div>\s*/g, ''); // remove MediaWiki table of contents obj.html = obj.html.replace(/<table\b[^>]*?\bid=\"toc\"[^>]*>.*?<\/table>\s*/g, ''); // remove MediaWiki print footer obj.html = obj.html.replace(/<div\b[^>]*?\bclass=\"printfooter\"[^>]*>[^<>\"]+\"<a\b[^>]*>[^<]+<\/a>\"<\/div>\s*/g, ''); // remove MediaWiki category list tags regExp = /<div\b[^>]*\bid=\"catlinks\"[^>]*>(.*?)<\/div>\s*/g; while(regExp.test(obj.html) == true) { obj.html = obj.html.replace(regExp, '$1'); } regExp = /<p\b[^>]*?\bclass=\"catlinks\"[^>]*>(.*?)<a\b[^>]*>[^<>]+<\/a>: (.*?)<\/p>/g; while(regExp.test(obj.html) == true) { obj.html = obj.html.replace(regExp, '$1$2'); } // sanitize <span> <div> <p> obj.html = obj.html.replace(/<(span|div|p)\b *(.*?) *\/?>/g, function (p, p1, p2) { return('<' + p1 + WikEdSanitizeAttributes(p1, p2, relaxed) + '>'); } ); // remove <span> ... </span> pairs withhout attributes var isRemove = []; obj.html = obj.html.replace(/(<(\/?)span\b([^>]*)>)/g, function (p, p1, p2, p3) { if (p2 == '') { if (p3 == '') { isRemove.push(true); return(''); } isRemove.push(false); return(p1); } if (isRemove.pop() == true) { return(''); } return(p1); } ); // remove <p> ... </p> pairs withhout attributes var isRemove = []; obj.html = obj.html.replace(/(<(\/?)p\b([^>]*)>)/g, function (p, p1, p2, p3) { if (p2 == '') { if (p3 == '') { isRemove.push(true); return('\u0000\u0000'); } isRemove.push(false); return(p1); } if (isRemove.pop() == true) { return('\u0000\u0000'); } return(p1); } ); // escape character entities obj.html = obj.html.replace(/&(?!(amp;|lt;|gt;))/g, '&'); // remove comments obj.html = obj.html.replace(/<!--.*?-->/g, ''); // <hr> horizontal rule obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<hr\b[^>]*>(\s|<br\b[^>]*>|\u0000)*/i, '\u0000\u0000----\u0000\u0000'); // <i> <em> <dfn> <var> <cite> italic obj.html = obj.html.replace(/<(i|em|dfn|var|cite)\b[^>]*>/g, '\'\''); obj.html = obj.html.replace(/<\/(i|em|dfn|var|cite)\b[^>]*>/g, '\'\''); // <b> <strong> bold obj.html = obj.html.replace(/<(b|strong)\b[^>]*>/g, '\'\'\''); obj.html = obj.html.replace(/<\/(b|strong)\b[^>]*>/g, '\'\'\''); // <h1> .. <h6> headings obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(^|\n|<br\b[^>]*>|\u0000)(\s|<br\b[^>]*>|\u0000)*<h1\b[^>]*>(.*?)<\/h1>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000\u0000= $4 =\u0000\u0000'); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(^|\n|<br\b[^>]*>|\u0000)(\s|<br\b[^>]*>|\u0000)*<h2\b[^>]*>(.*?)<\/h2>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000\u0000== $4 ==\u0000\u0000'); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(^|\n|<br\b[^>]*>|\u0000)(\s|<br\b[^>]*>|\u0000)*<h3\b[^>]*>(.*?)<\/h3>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000\u0000=== $4 ===\u0000\u0000'); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(^|\n|<br\b[^>]*>|\u0000)(\s|<br\b[^>]*>|\u0000)*<h4\b[^>]*>(.*?)<\/h4>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000\u0000==== $4 ====\u0000\u0000'); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(^|\n|<br\b[^>]*>|\u0000)(\s|<br\b[^>]*>|\u0000)*<h5\b[^>]*>(.*?)<\/h5>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000\u0000===== $4 =====\u0000\u0000'); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(^|\n|<br\b[^>]*>|\u0000)(\s|<br\b[^>]*>|\u0000)*<h6\b[^>]*>(.*?)<\/h6>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000\u0000====== $4 ======\u0000\u0000'); obj.html = obj.html.replace(/<(h[0-6])\b[^>]*>(.*?)<\/\1>/g, '$2'); // remove <thead> <tbody> <tfoot> obj.html = obj.html.replace(/(\s|\u0000|<br\b[^>]*>)<\/?(thead|tbody|tfoot)\b[^>]*>(\s|\u0000|<br\b[^>]*>)*/g, '$1'); // remove <col></col> and <colgroup></colgroup>\s obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<(col)\b[^>]*>.*?<\/\2>(|<br\b[^>]*>|\u0000)*/g, ''); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<(colgroup)\b[^>]*>.*?<\/\2>(|<br\b[^>]*>|\u0000)*/g, ''); // line breaks in table cells obj.html = obj.html.replace(/(<(td|th|caption)\b[^>]*>)(.*?)(<\/\2>)/g, function(p, p1, p2, p3, p4) { p3 = p3.replace(/^(\s|<br\b[^>]*|\u0000>)+/g, ''); p3 = p3.replace(/(\s|<br\b[^>]*|\u0000>)+$/g, ''); p3 = p3.replace(/<br\b[^>]*> */g, '<br />'); return(p1 + p3 + p4); } ); // remove table closing tags obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<\/(tr|thead|tbody|tfoot)>(\s|<br\b[^>]*>|\u0000)*/g, ''); // <td> table cells obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<td>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000| '); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<(td) +([^>]*)>(\s|<br\b[^>]*>|\u0000)*/g, function (p, p1, p2, p3, p4) { p3 = WikEdSanitizeAttributes(p2, p3, relaxed); if (p3 == '') { return('\u0000| '); } else { return('\u0000|' + p3 + ' | '); } } ); // <th> table cells obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<th>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000| '); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<(th) +([^>]*)>(\s|<br\b[^>]*>|\u0000)*/g, function (p, p1, p2, p3, p4) { p3 = WikEdSanitizeAttributes(p2, p3, relaxed); if (p3 == '') { return('\u0000| '); } else { return('\u0000|' + p3 + ' | '); } } ); // <tr> table rows obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<tr>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000|-\u0000'); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<(tr) +([^>]*)>(\s|<br\b[^>]*>|\u0000)*/g, function (p, p1, p2, p3, p4) { return('\u0000|-' + WikEdSanitizeAttributes(p2, p3, relaxed) + '\u0000'); } ); // <caption> table caption obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<caption>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000|+ '); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<(caption) +([^>]*)>(\s|<br\b[^>]*>|\u0000)*/g, function (p, p1, p2, p3, p4) { p3 = WikEdSanitizeAttributes(p2, p3, relaxed); if (p3 == '') { return('\u0000|+ '); } else { return('\u0000|+' + p3 + ' | '); } } ); // remove closing tags obj.html = obj.html.replace(/\s*<\/(td|th|caption)>\s*/g, ''); // line breaks, also in table cells (continued) obj.html = obj.html.replace(/<br\b[^>]*>/g, '\u0000'); // <table> obj.html = obj.html.replace(/[\s\u0000]*<table>[\s\u0000]*(\|-(?=[\n\u0000]))?/g, '\u0000\u0000{|\u0000'); obj.html = obj.html.replace(/[\s\u0000]*<(table) +([^>]*)>[\s\u0000]*(\|-(?=[\n\u0000]))?/g, function (p, p1, p2) { return('\u0000{|' + WikEdSanitizeAttributes(p1, p2)); } ); obj.html = obj.html.replace(/[\s\u0000]*<\/table>[\s\u0000]*/g, '\u0000|}\u0000\u0000'); // convert links var regExpMatch = []; var regExpStr = '(<a(\\b[^>]*)>(.*?)</a>)'; var regExp = new RegExp(regExpStr, 'gi'); obj.html = obj.html.replace(regExp, function (p, p1, p2, p3) { var linkPar = p2; var linkText = p3; var linkArticle = ''; var linkTitle = ''; var imgWidth = ''; // internal wiki links // get the title="" parameter regExpStr = ' href=\\"(' + wikEdServer + '|\\.|(\\.\\.\/)*\\.\\.)(' + wikEdArticlePath + '|' + wikEdScriptPath + '|\\/)([^\\">]*)\\"'; regExp = new RegExp(regExpStr); regExpMatch = regExp.exec(linkPar); if (regExpMatch != null) { regExpStr = ' title=\\"([^\\">]*)\\"'; regExp = new RegExp(regExpStr); regExpMatch = regExp.exec(linkPar); if (regExpMatch != null) { linkTitle = regExpMatch[1]; } } // get wiki article name from url parameter list regExpStr = ' href=\\"(' + wikEdServer + '|\\.|(\\.\\.\/)*\\.\\.)(' + wikEdScriptPath + '|\\/)index\\.php\\?[^\\"]*?\\btitle=([^\\"]*?)(&|\\")'; regExp = new RegExp(regExpStr); regExpMatch = regExp.exec(linkPar); if (regExpMatch != null) { linkArticle = regExpMatch[4]; if (linkArticle != '') { linkArticle = linkArticle.replace(/_/g, ' '); linkArticle = decodeURIComponent(linkArticle); // ISBN links regExpStr = ' href=\\"(' + wikEdServer + '|\\.|(\\.\\.\/)*\\.\\.)(' + wikEdScriptPath + '|\\/)index\\.php\\?[^\\"]*?\\bisbn=(\\d+)(&|\\")'; regExp = new RegExp(regExpStr); regExpMatch = regExp.exec(linkPar); if (regExpMatch != null) { var isbn = regExpMatch[4]; regExpMatch = /((\d\-?){13}|(\d\-?){10})/.exec(linkText); if (regExpMatch != null) { isbn = regExpMatch[1]; } return('ISBN ' + isbn); } } } // get wiki article name from url if (linkArticle == '') { regExpStr = ' href=\\"(' + wikEdServer + '|\\.|(\\.\\.\/)*\\.\\.)(' + wikEdArticlePath + '|\\/)([^\\"]*)\\"'; regExp = new RegExp(regExpStr); regExpMatch = regExp.exec(linkPar); if (regExpMatch != null) { linkArticle = regExpMatch[4]; if (linkArticle != '') { linkArticle = linkArticle.replace(/_/g, ' '); linkArticle = decodeURIComponent(linkArticle); } } } // format wiki link if (linkArticle != '') { // check for wiki image regExpStr = '^<img\\b[^>]*?\\bwidth=\\"(\\d+)\\"[^>]*?>$'; regExp = new RegExp(regExpStr); regExpMatch = regExp.exec(linkText); if (regExpMatch != null) { imgWidth = regExpMatch[1]; imgWidth = '|' + imgWidth + 'px'; if ( (linkTitle != '') && (linkTitle != 'Enlarge') ) { linkTitle = '|' + linkTitle; return('[[' + linkArticle + imgWidth + linkTitle + ']]'); } else { return('[[' + linkArticle + imgWidth + ']]'); } } // category link var regExp = new RegExp('^' + wikEdText['wikicode Category'] + ':(.*)','i'); regExpMatch = regExp.exec(linkArticle); if (regExpMatch != null) { return('[[' + wikEdText['wikicode Category'] + ':' + regExpMatch[1].substr(0, 1).toUpperCase() + linkText.substr(1) + ']]'); } // wiki link if (linkArticle == linkText.substr(0, 1).toUpperCase() + linkText.substr(1)) { return('[[' + linkText + ']]'); } // date link (English only) regExpMatch = /^(January|February|March|April|May|June|July|August|September|October|November|December) (\d{1,2})$/.exec(linkArticle); if (regExpMatch != null) { var month = regExpMatch[1]; var day = regExpMatch[2]; if (linkText == (day + ' ' + month) ) { return('[[' + linkArticle + ']]'); } } // lowercase the article name if the first char of the link text can exist in lower/uppercase and is lowercase if ( linkText.substr(0, 1).toLowerCase() != linkText.substr(0, 1).toUpperCase() ) { if ( linkText.substr(0, 1) == linkText.substr(0, 1).toLowerCase() ) { linkArticle = linkArticle.substr(0, 1).toLowerCase() + linkArticle.substr(1); } } // suffix links regExpStr = '^' + linkArticle.replace(/(\W)/, '\\$1') + '(\\w+)$'; regExp = new RegExp(regExpStr); regExpMatch = regExp.exec(linkText); if (regExpMatch != null) { return('[[' + linkText + ']]' + regExpMatch[1]); } return('[[' + linkArticle + '|' + linkText + ']]'); } // external link regExpMatch = linkPar.match(/ href=\"([^\">]*)\"/); if (regExpMatch != null) { var linkAddr = regExpMatch[1]; if (linkAddr != '') { // PubMed link regExpMatch = /^http:\/\/www\.ncbi\.nlm\.nih\.gov\/entrez\/query\.fcgi\?cmd=Retrieve&db=pubmed&.*?&list_uids=(\d+)/.exec(linkAddr); if (regExpMatch != null) { return('PMID ' + regExpMatch[1]); } // DOI link regExpMatch = /^http:\/\/dx\.doi\.org\/(.*)/.exec(linkAddr); if (regExpMatch != null) { return('{{doi|' + regExpMatch[1] + '}}'); } // other external link return('[' + linkAddr + ' ' + linkText + ']'); } } // return unchanged text return(p1); } ); // clean up MediaWiki category list var regExp = new RegExp('<span\\b[^>]*>(\\[\\[' + wikEdText['wikicode Category'] + ':[^\\]]+\\]\\])<\\/span>[\\s\\u0000\\|]*', 'gi'); obj.html = obj.html.replace(regExp, '$1\u0000'); // clean up DOI obj.html = obj.html.replace(/\[\[Digital object identifier\|DOI\]\]:(\{\{doi\|[^\}\s]+\}\})/gi, '$1'); // convert images obj.html = obj.html.replace(/<img\b([^>]*)>/g, function (p, p1) { // get and format parameters var address = ''; var regExpMatch = /\bsrc\s*=\s*(\'|\")([^\'\"]*)(\'|\")/i.exec(p1); if (regExpMatch != null) { address = regExpMatch[2].replace(/^ +| +$/g, ''); } var imgAlt = ''; regExpMatch = /\balt\s*=\s*(\'|\")([^\'\"]*)(\'|\")/i.exec(p1); if (regExpMatch != null) { imgAlt = regExpMatch[2].replace(/^ +| +$/g, ''); imgAlt = imgAlt.replace(/&nbsp;|[\n\u0000]/g, ' '); imgAlt = imgAlt.replace(/ {2,}/g, ' '); imgAlt = imgAlt.replace(/^ | $/g, ''); if (imgAlt != '') { imgAlt = '|' + imgAlt; } } var imgWidth = ''; regExpMatch = /\bwidth\s*=\s*(\'|\")([^\'\"]*)(\'|\")/i.exec(p1); if (regExpMatch != null) { imgWidth = '|' + regExpMatch[2].replace(/^ +| +$/g, '') + 'px'; } var imgLink = ''; regExpMatch = /([^\/]+)$/.exec(address); if (regExpMatch != null) { imgLink = regExpMatch[1]; if (imgLink != '') { return('[[' + wikEdText['wikicode Image'] + ':' + imgLink + imgWidth + imgAlt + ']]'); } } return(''); } ); // convert lists: * # : ; var listObj = {}; listObj.prefix = ''; obj.html = obj.html.replace(/[\s\u0000]*<(\/?(ol|ul|li|dl|dd|dt))\b[^>]*>[\s\u0000]*/g, function (p, p1, p2, p3, p4) { switch (p1.toLowerCase()) { case 'ol': listObj.prefix += '#'; return('\u0000'); case 'ul': listObj.prefix += '*'; return('\u0000'); case 'dl': listObj.prefix += ':'; return('\u0000'); case '/ol': case '/ul': case '/dl': listObj.prefix = listObj.prefix.substr(0, listObj.prefix.length - 1); return('\u0000\u0000'); case 'li': case 'dd': return('\u0000' + listObj.prefix + ' '); case 'dt': return('\u0000' + listObj.prefix.replace(/:$/, ';') + ' '); case '/li': case '/dt': case '/dd': return(''); } } ); obj.html = obj.html.replace(/[\n|\u0000]+[#\*:\;]+ (?=[\n|\u0000])/g, ''); // <> remove not allowed tags obj.html = obj.html.replace(/(<\/?)(\/?)(\w+)(.*?>)/g, function (p, p1, p2, p3, p4) { if ( /^(big|blockquote|colgroup|center|code|del|div|font|ins|p|pre|s|small|span|strike|sub|sup|tt|u|rb|rp|rt|ruby|nowiki|math|gallery|noinclude|includeonly|ref|references)$/i.test(p3) ) { return(p1 + p2 + p3 + p4); } else { return(''); } } ); // sanitize attributes in opening html tags obj.html = obj.html.replace(/<(\w+) +(.*?) *(\/?)>/g, function (p, p1, p2, p3) { if (p3 != '') { p3 = ' ' + p3; } return('<' + p1 + WikEdSanitizeAttributes(p1, p2, relaxed) + p3 + '>'); } ); // remove space-only lines obj.html = obj.html.replace(/([\s\u0000]*\u0000[\s\u0000]*)/g, function (p, p1) { return(p1.replace(/\n/g, '\u0000')); } ); obj.html = obj.html.replace(/\u0000\s+(?=\u0000)/g, '\u0000'); // remove leading and trailing spaces obj.html = obj.html.replace(/>\s+\u0000/g, '>\u0000'); obj.html = obj.html.replace(/\u0000\s+</g, '\u0000<'); // remove empty inline and block tag pairs obj.html = obj.html.replace(/( *)<(big|colgroup|code|del|font|ins|pre|s|small|span|strike|sub|sup|tt|u|rb|rp|rt|ruby|nowiki)\b[^>]*><\/\1> */g, '$1'); obj.html = obj.html.replace(/[\s\u0000]*<(blockquote|center|div|math|gallery|noinclude|includeonly|ref|references)\b[^>]*><\/\1>[\s\u0000]*/g, '\u0000\u0000'); // remove empty lines from div tags obj.html = obj.html.replace(/(<div\b[^>]*>)[\s\u0000]+/g, '$1'); obj.html = obj.html.replace(/[\s\u0000]+(<\/div>)/g, '$1'); // escape < > obj.html = obj.html.replace(/</g, '<'); obj.html = obj.html.replace(/>/g, '>'); // newlines to <br /> obj.html = obj.html.replace(/\n{2,}\u0000+\n/g, '\n\n'); obj.html = obj.html.replace(/\n\u0000+\n{2,}/g, '\n\n'); obj.html = obj.html.replace(/\u0000+\n{2,}/g, '\n\n'); obj.html = obj.html.replace(/\n{2,}\u0000+/g, '\n\n'); obj.html = obj.html.replace(/\u0000+\n/g, '\n'); obj.html = obj.html.replace(/\n\u0000+/g, '\n'); obj.html = obj.html.replace(/\u0000{2,}/g, '\n\n'); obj.html = obj.html.replace(/\u0000/g, '\n'); obj.html = obj.html.replace(/\n/g, '<br />'); // remove empty lines from article start and end if (obj.from == 'whole') { obj.html = obj.html.replace(/^(<br\b[^>]*>)+/g, ''); obj.html = obj.html.replace(/(<br\b[^>]*>)+$/g, ''); } return; } // // WikEdSanitizeAttributes: see Sanitizer.php // function WikEdSanitizeAttributes(tag, attributes, relaxed) { var common; var tablealign; var tablecell; var table; if (relaxed == true) { common = 'lang|dir|style|class'; // not needed: id|title tablealign = '|align|char|charoff|valign'; table = '|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor'; tablecell = '|abbr|axis|headers|scope|rowspan|colspan|nowrap|width|height|bgcolor'; } else { common = 'lang|dir'; table = '|border|cellspacing|cellpadding|align|bgcolor'; tablealign = '|align|valign'; tablecell = '|rowspan|colspan|nowrap|bgcolor'; } tag = tag.toLowerCase(); var sanitized = ''; var regExp = /(\w+)\s*=\s*(\'|\")([^\'\"]*)(\'|\")/g; var regExpMatch; while (regExpMatch = regExp.exec(attributes)) { var attrib = regExpMatch[1]; var attribValue = regExpMatch[3]; if (attribValue == '') { continue; } var valid = false; // relaxed if (relaxed == true) { if ('center|em|strong|cite|code|var|sub|supdl|dd|dt|tt|b|i|big|small|strike|s|u|rb|rp|ruby'.indexOf(tag) >= 0) { if (common.indexOf(attrib) >= 0) { valid = true; } } else if ('div|span|h1|h2|h3|h4|h5|h6|p'.indexOf(tag) >= 0) { if ((common + '|align').indexOf(attrib) >= 0) { valid = true; } } else if ('blockquote'.indexOf(tag) >= 0) { if ((common + '|cite').indexOf(attrib) >= 0) { valid = true; } } else if ('br'.indexOf(tag) >= 0) { if ('style|clear'.indexOf(attrib) >= 0) { valid = true; } } else if ('pre'.indexOf(tag) >= 0) { if ((common + '|width').indexOf(attrib) >= 0) { valid = true; } } else if ('ins|del'.indexOf(tag) >= 0) { if ((common + '|cite|datetime').indexOf(attrib) >= 0) { valid = true; } } else if ('ul'.indexOf(tag) >= 0) { if ((common + '|type').indexOf(attrib) >= 0) { valid = true; } } else if ('ol'.indexOf(tag) >= 0) { if ((common + '|type|start').indexOf(attrib) >= 0) { valid = true; } } else if ('li'.indexOf(tag) >= 0) { if ((common + '|type|value').indexOf(attrib) >= 0) { valid = true; } } else if ('table'.indexOf(tag) >= 0) { if ((common + table).indexOf(attrib) >= 0) { valid = true; } } else if ('caption'.indexOf(tag) >= 0) { if ((common + '|align').indexOf(attrib) >= 0) { valid = true; } } else if ('thead|tfoot|tbody'.indexOf(tag) >= 0) { if ((common + tablealign).indexOf(attrib) >= 0) { valid = true; } } else if ('colgroup|col'.indexOf(tag) >= 0) { if ((common + '|span|width' + tablealign).indexOf(attrib) >= 0) { valid = true; } } else if ('tr'.indexOf(tag) >= 0) { if ((common + '|bgcolor' + tablealign).indexOf(attrib) >= 0) { valid = true; } } else if ('td|th'.indexOf(tag) >= 0) { if ((common + tablecell + tablealign).indexOf(attrib) >= 0) { valid = true; } } else if ('font'.indexOf(tag) >= 0) { if ((common + '|size|color|face').indexOf(attrib) >= 0) { valid = true; } } else if ('hr'.indexOf(tag) >= 0) { if ((common + '|noshade|size|width').indexOf(attrib) >= 0) { valid = true; } } else if ('rt'.indexOf(tag) >= 0) { if ((common + '|rbspan').indexOf(attrib) >= 0) { valid = true; } } else if ('ref'.indexOf(tag) >= 0) { if (('name').indexOf(attrib) >= 0) { valid = true; } } else if ('references'.indexOf(tag) >= 0) { } } // strict else { if ('center|em|strong|cite|code|var|sub|supdl|dd|dt|tt|b|i|big|small|strike|s|u|rb|rp|ruby|blockquote|pre|ins|del'.indexOf(tag) >= 0) { if (common.indexOf(attrib) >= 0) { valid = true; } } else if ('div|span|h1|h2|h3|h4|h5|h6|p'.indexOf(tag) >= 0) { if ((common + '|align').indexOf(attrib) >= 0) { valid = true; } } else if ('br'.indexOf(tag) >= 0) { if ('clear'.indexOf(attrib) >= 0) { valid = true; } } else if ('ul'.indexOf(tag) >= 0) { if ((common + '|type').indexOf(attrib) >= 0) { valid = true; } } else if ('ol'.indexOf(tag) >= 0) { if ((common + '|type|start').indexOf(attrib) >= 0) { valid = true; } } else if ('li'.indexOf(tag) >= 0) { if ((common + '|type|value').indexOf(attrib) >= 0) { valid = true; } } else if ('table'.indexOf(tag) >= 0) { if ((common + table).indexOf(attrib) >= 0) { valid = true; } } else if ('caption'.indexOf(tag) >= 0) { if ((common + '|align').indexOf(attrib) >= 0) { valid = true; } } else if ('thead|tfoot|tbody'.indexOf(tag) >= 0) { if ((common + tablealign).indexOf(attrib) >= 0) { valid = true; } } else if ('colgroup|col'.indexOf(tag) >= 0) { if ((common + '|span' + tablealign).indexOf(attrib) >= 0) { valid = true; } } else if ('tr'.indexOf(tag) >= 0) { if ((common + '|bgcolor' + tablealign).indexOf(attrib) >= 0) { valid = true; } } else if ('td|th'.indexOf(tag) >= 0) { if ((common + tablecell + tablealign).indexOf(attrib) >= 0) { valid = true; } } else if ('font'.indexOf(tag) >= 0) { if ((common + '|color').indexOf(attrib) >= 0) { valid = true; } } else if ('hr'.indexOf(tag) >= 0) { if ((common + '|noshade|size').indexOf(attrib) >= 0) { valid = true; } } else if ('rt'.indexOf(tag) >= 0) { if ((common + '|rbspan').indexOf(attrib) >= 0) { valid = true; } } else if ('ref'.indexOf(tag) >= 0) { if (('name').indexOf(attrib) >= 0) { valid = true; } } else if ('references'.indexOf(tag) >= 0) { } } if (valid == true) { // remove non-standard styles and clean up if (attrib == 'style') { attribValue = attribValue.replace(/(^| )(-moz-[\w\-]+): [\w\-]+; */g, '$1'); attribValue = attribValue.replace(/(^| )([\w\-]+): [^;]*(-moz-[\w\-]+|windowtext)[^;]*; */g, '$1'); attribValue = attribValue.replace(/\b0(%|in|cm|mm|em|ex|pt|pc|px)\b/g, '0'); attribValue = attribValue.replace(/[\w\-]+ *\: *\; */g, ''); attribValue = attribValue.replace(/ *(;|:) */g, '$1 '); attribValue = attribValue.replace(/( |;)+$/g, ';'); } else if (attrib == 'class') { attribValue = attribValue.replace(/^Ms.*$/g, ''); } if (attribValue != '') { sanitized += ' ' + attrib + '="' + attribValue + '"'; } } } return(sanitized); } // // // WikEdRemoveHighlighting: remove syntax highlighting in obj.plain; sets obj.htmlCode if text contains html code // function WikEdRemoveHighlighting(obj) { // remove highlighting and atttribute-free span tags var isRemove = []; obj.html = obj.html.replace(/(<(\/?)span\b([^>]*)>)/g, function (p, p1, p2, p3) { if (p2 == '') { if (/\bclass=\"wikEd\w+\"/.test(p3)) { isRemove.push(true); return(''); } isRemove.push(false); return(p1); } if (isRemove.pop() == true) { return(''); } return(p1); } ); // remove highlighting div tags var isRemove = []; obj.html = obj.html.replace(/(<(\/?)div\b([^>]*)>)/g, function (p, p1, p2, p3) { if (p2 == '') { if (/\bclass=\"wikEd\w+\"/.test(p3)) { isRemove.push(true); return(''); } isRemove.push(false); return(p1); } if (isRemove.pop() == true) { return(''); } return(p1); } ); // remove highlighting pre tags var isRemove = []; obj.html = obj.html.replace(/(<(\/?)pre\b([^>]*)>)/g, function (p, p1, p2, p3) { if (p2 == '') { if (/\bclass=\"wikEd\w+\"/.test(p3)) { isRemove.push(true); return(''); } isRemove.push(false); return(p1); } if (isRemove.pop() == true) { return(''); } return(p1); } ); // remove highlighting a tags if (wikEdFollowHighlightedLinks == true) { var isRemove = []; obj.html = obj.html.replace(/(<(\/?)a\b([^>]*)>)/g, function (p, p1, p2, p3) { if (p2 == '') { if (/\bclass=\"wikEd\w+\"/.test(p3)) { isRemove.push(true); return(''); } isRemove.push(false); return(p1); } if (isRemove.pop() == true) { return(''); } return(p1); } ); } // comments obj.html = obj.html.replace(/<!--wikEd\w+-->/g, ''); obj.html = obj.html.replace(/\n|\r/g, ''); // check for pasted html content if (obj.html.match(/<(?!br\b)/)) { obj.htmlCode = true; } else { obj.htmlCode = false; } return; } // // // WikEdHighlightSyntax: highlight syntax in obj.html; if singleLine is set, no block syntax will be highlighted; call WikEdRemoveHighlighting first // expects < > < > & spaces instead of \n instead of <br /> function WikEdHighlightSyntax(obj, singleLine) { // < and > to \u0000 and \u0001 obj.html = obj.html.replace(/</g, '\u0000'); obj.html = obj.html.replace(/>/g, '\u0001'); // #redirect obj.html = obj.html.replace(/(^|\n)(#)(redirect\b)/g, '$1<span class="wikEdWikiRedir">$3</span><!--wikEdWikiRedir-->'); // nowiki (no html highlighting) obj.html = obj.html.replace(/(\u0000nowiki\b.*?\u0001)(.*?)(\u0000\/nowiki\b.*?\u0001)/gi, function (p, p1, p2, p3) { p2 = p2.replace(/\u0000/g, '<'); p2 = p2.replace(/\u0001/g, '>'); return(p1 + p2 + p3); } ); // blocks // lists * # : ; obj.html = obj.html.replace(/^([\*\#\:\;]+)(.*?)$/gm, '<span class="wikEdListLine"><span class="wikEdListTag">$1</span><!--wikEdListTag-->$2</span><!--wikEdListLine-->'); if (singleLine != true) { obj.html = obj.html.replace(/((<span class=\"wikEdListLine\">[^\n]*\n)+)/g, '<span class="wikEdListBlock">$1'); obj.html = obj.html.replace(/(<span class=\"wikEdListLine\">[^\n]*)(\n)(?!<span class=\"wikEdListLine\">)/g, '$1</span><!--wikEdListBlock-->$2'); } // #redirect (finish) obj.html = obj.html.replace(/(<span class=\"wikEdWikiRedir\">)(.*?<\/span><!--wikEdWikiRedir-->)/g, '$1#$2'); // various blocks if (singleLine != true) { obj.html = obj.html.replace(/(\u0000(blockquote|center|div|pre)\b.*?\u0001)/gi, '<span class="wikEdBlock">$1'); obj.html = obj.html.replace(/(\u0000\/(blockquote|center|div|pre)\b.*?\u0001)/gi, '$1</span><!--wikEdBlock-->'); } // space-pre if (singleLine != true) { obj.html = obj.html.replace(/^ ( *)(.*?)$/gm, '<span class="wikEdSpaceLine"><span class="wikEdSpaceTag"> $1</span><!--wikEdSpaceTag-->$2</span><!--wikEdSpaceLine-->'); obj.html = obj.html.replace(/((<span class=\"wikEdSpaceLine\">[^\n]*\n)+)/g, '<span class="wikEdSpaceBlock">$1'); obj.html = obj.html.replace(/(<span class=\"wikEdSpaceLine\">[^\n]*)(\n)(?!<span class="wikEdSpaceLine">)/g, '$1</span><!--wikEdSpaceBlock-->$2'); } // ---- <hr> horizontal rule obj.html = obj.html.replace(/(^|\n|<[^>]*>)(----)(\n|<[^>]*>|$)/g, '$1<span class="wikEdHR">$2</span><!--wikEdHR-->$3'); obj.html = obj.html.replace(/(\u0000hr\u0001)/g, '<span class="wikEdHRInline">$1</span><!--wikEdHRInline-->'); // == headings obj.html = obj.html.replace(/(^|\n|<[^>]*>)(=+ *)([^\n]*?)( *=+)(?=( |<[^>]*>)*(\n|$))/g, function (p, p1, p2, p3, p4) { p2 = p2.replace(/(=+)/g, '<span class="wikEdWiki">$1</span><!--wikEdWiki-->'); p4 = p4.replace(/(=+)/g, '<span class="wikEdWiki">$1</span><!--wikEdWiki-->'); if ( /^(external links?|see also|references?)$/i.test(p3) ) { p1 = p1 + '<span class="wikEdHeadingWp">'; p4 = p4 + '</span><!--wikEdHeadingWp-->'; } else { p1 = p1 + '<span class="wikEdHeading">'; p4 = p4 + '</span><!--wikEdHeading-->'; } return(p1 + p2 + p3 + p4); } ); // tables {| |+ |- ! |} | obj.html = obj.html.replace(/^(\{\||\|\+|\|\-|\!|\|\}|\|)(.*?)$/gm, '<span class="wikEdTableLine"><span class="wikEdTableTag">$1</span><!--wikEdTableTag-->$2</span><!--wikEdTableLine-->'); if (singleLine != true) { obj.html = obj.html.replace(/(^|\n)((<[^>]*>)*\{\|)/g, '$1<span class="wikEdTableBlock">$2'); obj.html = obj.html.replace(/(^|\n)((<[^>]*>)*\|\}(<[^>]*>)*)/g, '$1$2</span><!--wikEdTableBlock-->'); obj.html = obj.html.replace(/(\u0000table\b.*?\u0001)/gi, '<span class="wikEdTableBlock">$1'); obj.html = obj.html.replace(/(\u0000\/table\b.*?\u0001)/gi, '$1</span><!--wikEdTableBlock-->'); } // <gallery> wiki markup if (singleLine != true) { obj.html = obj.html.replace(/(\u0000(gallery)\b.*?\u0001)/gi, '<span class="wikEdWiki">$1'); obj.html = obj.html.replace(/(\u0000\/(gallery)\b.*?\u0001)/gi, '$1</span><!--wikEdWiki-->'); } // various block tags obj.html = obj.html.replace(/(\u0000\/?(blockquote|center|div|pre)\b.*?\u0001)/gi, '<span class="wikEdBlockTag">$1</span><!--wikEdBlockTag-->'); // <p> ... </p> pairs with (wikEdBlockTag) and withhout attributes (wikEdUnknown) var isRemove = []; obj.html = obj.html.replace(/(\u0000(\/?)p\b(.*?)\u0001)/g, function (p, p1, p2, p3) { if (p2 == '') { if (p3 == '') { isRemove.push(true); return('<span class="wikEdUnknown">' + p1 + '</span><!--wikEdUnknown-->'); } if (/\/$/.test(p3)) { return('<span class="wikEdUnknown">' + p1 + '</span><!--wikEdUnknown-->'); } isRemove.push(false); return('<span class="wikEdBlockTag">' + p1 + '</span><!--wikEdBlockTag-->'); } if (isRemove.pop() == true) { return('<span class="wikEdUnknown">' + p1 + '</span><!--wikEdUnknown-->'); } return('<span class="wikEdBlockTag">' + p1 + '</span><!--wikEdBlockTag-->'); } ); // inline elements // magic words obj.html = obj.html.replace(/(__(NOTOC|FORCETOC|TOC|NOEDITSECTION|NEWSECTIONLINK|NOCONTENTCONVERT|NOCC|NOGALLERY|NOTITLECONVERT|NOTC|END|START)__)/gi, '<span class="wikEdMagic">$1</span><!--wikEdMagic-->'); // <sup> </sub> <ins> <del> obj.html = obj.html.replace(/(\u0000sup\b[^\u0001]*?\u0001(.*?)\u0000\/sup\b[^\u0001]*?\u0001)/gi, '<span class="wikEdSuperscript">$1</span><!--wikEdSuperscript-->'); obj.html = obj.html.replace(/(\u0000sub\b[^\u0001]*?\u0001(.*?)\u0000\/sub\b[^\u0001]*?\u0001)/gi, '<span class="wikEdSubscript">$1</span><!--wikEdSubscript-->'); obj.html = obj.html.replace(/(\u0000(ins|u)\b[^\u0001]*?\u0001(.*?)\u0000\/(ins|u)\b[^\u0001]*?\u0001)/gi, '<span class="wikEdIns">$1</span><!--wikEdIns-->'); obj.html = obj.html.replace(/(\u0000(del|s|strike)\b[^\u0001]*?\u0001(.*?)\u0000\/(del|s|strike)\b[^\u0001]*?\u0001)/gi, '<span class="wikEdDel">$1</span><!--wikEdDel-->'); // <ref/> wiki markup obj.html = obj.html.replace(/(\u0000(ref\b[^\u0000\u0001]*?\/ *)\u0001)/gi, '<span class="wikEdRef"><$2></span><!--wikEdRef-->'); // <ref> wiki markup obj.html = obj.html.replace(/(\u0000ref\b[^\u0001]*?\u0001(.*?)\u0000\/ref\b[^\u0001]*?\u0001)/gi, '<span class="wikEdRef">$1</span><!--wikEdRef-->'); // various inline tags obj.html = obj.html.replace(/(\u0000\/?(sub|sup|ins|u|del|s|strike|big|br|colgroup|code|font|small|span|tt|rb|rp|rt|ruby|ref)\b[^\u0001]*?\u0001)/gi, '<span class="wikEdInlineTag">$1</span><!--wikEdInlineTag-->'); // <math/> <noinclude/> <includeonly/> <references/> wiki markup obj.html = obj.html.replace(/(\u0000((math|gallery|noinclude|includeonly|references)\b[^\u0001]*?\/ *)\u0001)/gi, '<span class="wikEdWiki"><$2></span><!--wikEdWiki-->'); // <math> <noinclude> <references> wiki markup obj.html = obj.html.replace(/(\u0000(math|gallery|noinclude|includeonly|references)\b[^\u0001]*?\u0001(.*?)(\u0000)\/\3\b[^\u0001]*?\u0001)/gi, '<span class="wikEdWiki">$1</span><!--wikEdWiki-->'); // unsupported or not needed <> tags obj.html = obj.html.replace(/(\u0000\/?)(\w+)(.*?\/?\u0001)/g, function (p, p1, p2, p3) { if ( ! /^(col|thead|tfoot|tbody|big|br|blockquote|colgroup|center|code|del|div|font|ins|p|pre|s|small|span|strike|sub|sup|tt|u|rb|rp|rt|ruby|nowiki|math|gallery|noinclude|includeonly|ref|references)$/i.test(p2) ) { p1 = '<span class="wikEdUnknown">' + p1; p3 = p3 + '</span><!--wikEdUnknown-->'; } return(p1 + p2 + p3); } ); // comments obj.html = obj.html.replace(/(\u0000!--.*?--\u0001)/g, '<span class="wikEdComment">$1</span><!--wikEdComment-->'); // URLs, allowed chars: \w / . & ? = - @ # % ~ + (; allowed because of & and common misuse) obj.html = obj.html.replace(/((http:\/\/|https:\/\/|ftp:\/\/|irc:\/\/|gopher:\/\/|news:|mailto:)[^\u0000-\u0020\!\"\$\'\(\)\*\,\:\<\>\[\\\]\^\`\{-\|\}\u007f-\uffff]*)/gi, function (p, p1, p2) { var url = p1; p1 = p1.replace(/(.*)/, '<span class="wikEdURLLink">$1</span><!--wikEdURLLink-->'); return(p1); } ); // URLs with text obj.html = obj.html.replace(/(\[)( *<span class=\"wikEdURLLink\"[^>]*>.*?<\!--wikEdURLLink--> *)([^\]\n]*?)( *\])/gi, function (p, p1, p2, p3, p4) { // link text p3 = p3.replace(/(.*)/, '<span class="wikEdURLText">$1</span><!--wikEdURLText-->'); // link tags p1 = p1.replace(/(\[)/, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->'); p4 = p4.replace(/(\])/, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->'); return(p1 + p2 + p3 + p4); } ); // [[Image: ]] images var regExpImg = new RegExp('(\\[\\[)(' + wikEdText['wikicode Image'] + ' *: *)([^\\]\\[\\|]*? *)(\\|(\\[[^\\]]*\\]|\\[\\[[^\\]]*\\]\\]|[^\\[\\]\\|]+|\\|)*)(\\]\\])', 'gi'); obj.html = obj.html.replace(regExpImg, function (p, p1, p2, p3, p4, p5, p6) { var url = p3 url = url.replace(/\|.*/g, ''); url = url.replace(/\n.*/g, ''); url = url.replace(/ /g, '_'); url = wikEdArticlePrefix + wikEdText['wikicode Image'] + ':' + url; p1 = '<span class="wikEdImage">' + p1; p6 = p6 + '</span><!--wikEdImage-->'; p2 = '<span class="wikEdImageName">' + p2; p3 = p3 + '</span><!--wikEdImageName-->'; // parameters and capture p4 = p4.replace(/((\[[^\]]\]|\[\[[^\]]\]\]|[^\]\|])+)/g, function (p, p1) { if (/^(thumb|thumbnail|frame|right|left|center|none|\d+px|\d+x\d+px)$/.test(p1) == true) { p1 = '<span class="wikEdImageParam">' + p1 + '</span><!--wikEdImageParam-->'; } else { p1 = '<span class="wikEdImageCaption">' + p1 + '</span><!--wikEdImageCaption-->'; } return(p1); } ); // link tags p1 = p1.replace(/(\[+)/, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->'); p6 = p6.replace(/(\]+)/, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->'); p4 = p4.replace(/(\|)/g, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->'); return(p1 + p2 + p3 + p4 + p6); } ); // [[ ]] links, categories obj.html = obj.html.replace(/(\[\[)([^\[\]]*)(\]\])/g, function (p, p1, p2, p3) { // omit image tags var regExpImg = new RegExp('^(<[^>]*>)*' + wikEdText['wikicode Image'] + '\\s*:', 'i'); if (regExpImg.test(p2) == true) { return(p1 + p2 + p3); } // get url var url = p2 url = url.replace(/\|.*/g, ''); url = url.replace(/\n.*/g, ''); url = url.replace(/ /g, '_'); url = wikEdArticlePrefix + url; // category var regExpCat = new RegExp('^\\s*' + wikEdText['wikicode Category'] + '\\s*:', 'i'); if (regExpCat.test(p2)) { var regExp = new RegExp('\\s*\\w+\\s*:\\s*' + wikEdText['wikicode Category'] + '\\s*:', 'i'); if (p2.match(regExp)) { p1 = '<span class="wikEdCatInter">' + p1; p3 = p3 + '</span><!--wikEdCatInter-->'; } else { p1 = '<span class="wikEdCat">' + p1; p3 = p3 + '</span><!--wikEdCat-->'; } p2 = p2.replace(/^(\s*)(.*:)+/, '$1<span class="wikEdInter">$2</span><!--wikEdInter-->'); p2 = p2.replace(/(\s*)([^>:\|]+)(\s*\|\s*|$)/, '$1<span class="wikEdCatName">$2</span><!--wikEdCatName-->$3'); p2 = p2.replace(/(\|\s*)(.*)/, function (p, p1, p2) { p2 = p2.replace(/(.*?)(\s*(\||$))/g, '<span class="wikEdCatText">$1</span><!--wikEdCatText-->$2'); return(p1 + p2); } ); } // wikilink else { if (p2.match(/^\s*\w+\s*:/)) { p1 = '<span class="wikEdLinkInter">' + p1; p3 = p3 + '</span><!--wikEdLinkInter-->'; } else { p1 = '<span class="wikEdLink">' + p1; p3 = p3 + '</span><!--wikEdLink-->'; } p2 = p2.replace(/^(\s*)(.*:)+/, '$1<span class="wikEdInter">$2</span><!--wikEdInter-->'); p2 = p2.replace(/(\s*)([^>:\|]+)(\s*\|\s*|$)/, '$1<span class="wikEdLinkName">$2</span><!--wikEdLinkName-->$3'); p2 = p2.replace(/(\|\s*)(.*)/, function (p, p1, p2) { p2 = p2.replace(/(.*?)(\s*(\||$))/g, '<span class="wikEdLinkText">$1</span><!--wikEdLinkText-->$2'); return(p1 + p2); } ); } // link tags p1 = p1.replace(/(\[+)/, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->'); p2 = p2.replace(/(\|)/g, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->'); p3 = p3.replace(/(\]+)/, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->'); return(p1 + p2 + p3); } ); // {{ }}, {{{ }}} templates obj.html = obj.html.replace(/(\{\{+)([^\}]*)(\}\}+)/g, function (p, p1, p2, p3) { if (p2.match(/^\s*\w+\s*:/)) { p1 = '<span class="wikEdTemplInter">' + p1; p3 = p3 + '</span><!--wikEdTemplInter-->'; } else { p1 = '<span class="wikEdTempl">' + p1; p3 = p3 + '</span><!--wikEdTempl-->'; } p2 = p2.replace(/^(\s*)(.*:)+/, '$1<span class="wikEdInter">$2</span><!--wikEdInter-->'); p2 = p2.replace(/(\s*)([^>:\|]+)(\s*\|\s*|$)/, '$1<span class="wikEdTemplName">$2</span><!--wikEdTemplName-->$3'); p2 = p2.replace(/(\|\s*)(.*)/, function (p, p1, p2) { p2 = p2.replace(/(.*?)(\s*(\||$))/g, '<span class="wikEdTemplText">$1</span><!--wikEdTemplText-->$2'); return(p1 + p2); } ); // template tags p1 = p1.replace(/(\{+)/, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->'); p2 = p2.replace(/(\|)/g, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->'); p3 = p3.replace(/(\}+)/, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->'); return(p1 + p2 + p3); } ); // <b> <i> obj.html = obj.html.replace(/(\'\'\')(\'*)(.*?)(\'*)(\'\'\')/g, '<span class="wikEdBold">$2$3$4</span><!--wikEdBold-->'); obj.html = obj.html.replace(/(\'\')(.*?)(\'\')/g, '<span class="wikEdItalic">$1$2$3</span><!--wikEdItalic-->'); obj.html = obj.html.replace(/(<span class=\"wikEdBold\">)/g, '$1\'\'\''); obj.html = obj.html.replace(/(<\/span><!--wikEdBold-->)/g, '\'\'\'$1'); obj.html = obj.html.replace(/(\'{2,})/g, '<span class="wikEdWiki">$1</span><!--wikEdWiki-->'); // named colors obj.html = obj.html.replace(/(\b(orange|yellow|fuchsia|white|lime|aqua|silver)\b)/g, '<span style="background-color: $1;" class="wikEdColorsLight">$1</span><!--wikEdColorsLight-->'); obj.html = obj.html.replace(/(\b(red|maroon|olive|purple|green|navy|teal|blue|black|gray)\b)/g, '<span style="background-color: $1;" class="wikEdColorsDark">$1</span><!--wikEdColorsDark-->'); // RGB hex colors #d4d0cc obj.html = obj.html.replace(/(#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2}))(?=[\s\'\";])/g, function (p, p1, p2, p3, p4) { var luminance = parseInt(p2, 16) * 0.299 + parseInt(p3, 16) * 0.587 + parseInt(p4, 16) * 0.114; if (luminance > 128) { return('<span style="background-color: ' + p1 + '" class="wikEdColorsLight">' + p1 + '</span><!--wikEdColorsLight-->'); } else { return('<span style="background-color: ' + p1 + '" class="wikEdColorsDark">' + p1 + '</span><!--wikEdColorsDark-->'); } } ); // RGB hex colors #ddc obj.html = obj.html.replace(/(#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F]))(?=[\s\'\";])/g, function (p, p1, p2, p3, p4) { var luminance = parseInt(p2, 16) * 16 * 0.299 + parseInt(p3, 16) * 16 * 0.587 + parseInt(p4, 16) * 16 * 0.114; if (luminance > 128) { return('<span style="background-color: ' + p1 + '" class="wikEdColorsLight">' + p1 + '</span><!--wikEdColorsLight-->'); } else { return('<span style="background-color: ' + p1 + '" class="wikEdColorsDark">' + p1 + '</span><!--wikEdColorsDark-->'); } } ); // RGB decimal colors rgb(128,64,265) obj.html = obj.html.replace(/(rgb\(\s*(\d+),\s*(\d+),\s*(\d+)\s*\))/gi, function (p, p1, p2, p3, p4) { var luminance = p2 * 0.299 + p3 * 0.587 + p4 * 0.114; if (luminance > 128) { return('<span style="background-color: ' + p1 + '" class="wikEdColorsLight">' + p1 + '</span><!--wikEdColorsLight-->'); } else { return('<span style="background-color: ' + p1 + '" class="wikEdColorsDark">' + p1 + '</span><!--wikEdColorsDark-->'); } } ); // nowiki (remove highlighting) Mozilla bug: . instead of (.|\n) does not recognize linebreaks obj.html = obj.html.replace(/(\u0000nowiki\b[^\u0001]*?\u0001)((.|\n)*?)(\u0000\/nowiki\b[^\u0001]*?\u0001)/gi, function (p, p1, p2, p3, p4) { p1 = '<span class="wikEdNowiki"><span class="wikEdInlineTag">' + p1 + '</span><!--wikEdInlineTag-->'; p2 = p2.replace(/<[^>]*>/g, ''); p4 = '<span class="wikEdInlineTag">' + p4 + '</span><!--wikEdInlineTag--></span><!--wikEdNowiki-->'; return(p1 + p2 + p4); } ); // \u0000 and \u0001 back to < and > obj.html = obj.html.replace(/\u0000/g, '<'); obj.html = obj.html.replace(/\u0001/g, '>'); // display control chars with popup title var regExpStr = ''; for (var decimalValue in wikEdControlChars) { regExpStr += String.fromCharCode(decimalValue); } var regExp = new RegExp('([' + regExpStr + '])', 'g'); obj.html = obj.html.replace(regExp, function (p, p1) { if (p1 == '\u0009') { p1 = '<span class="wikEdTab" title="' + wikEdControlChars[p1.charCodeAt(0).toString()] + '">' + p1 + '</span><!--wikEdTab-->'; } else if (p1 != '\u000a') { p1 = '<span class="wikEdCtrl" title="' + wikEdControlChars[p1.charCodeAt(0).toString()] + '">' + p1 + '</span><!--wikEdCtrl-->'; } return(p1); } ); // display strange spaces with popup title var regExpStr = ''; for (var decimalValue in wikEdStrangeSpaces) { regExpStr += String.fromCharCode(decimalValue); } var regExp = new RegExp('([' + regExpStr + '])', 'g'); obj.html = obj.html.replace(regExp, function (p, p1) { if (p1 != '\u000a') { p1 = '<span class="wikEdBlank" title="' + wikEdStrangeSpaces[p1.charCodeAt(0).toString()] + '">' + p1 + '</span><!--wikEdBlank-->'; } return(p1); } ); // remove comments if (wikEdRemoveHighlightComments == true) { obj.html = obj.html.replace(/<!--wikEd\w+-->/g, ''); } return; } // // WikEdUpdateTextarea: copy frame content to textarea // function WikEdUpdateTextarea() { // get frame content var obj = {}; obj.html = wikEdFrameBody.innerHTML; obj.html = obj.html.replace(/(<br\b[^>]*>)\n* */g, '$1'); // textify so that no html formatting is submitted WikEdTextify(obj); obj.plain = obj.plain.replace(/ /g, ' '); obj.plain = obj.plain.replace(/</g, '<'); obj.plain = obj.plain.replace(/>/g, '>'); obj.plain = obj.plain.replace(/&/g, '&'); // copy to textarea wikEdTextarea.value = obj.plain; return; } // // WikEdUpdateFrame: copy textarea content to frame // function WikEdUpdateFrame() { // get frame content var obj = {}; obj.html = wikEdTextarea.value; obj.html = obj.html.replace(/&/g, '&'); obj.html = obj.html.replace(/>/g, '>'); obj.html = obj.html.replace(/</g, '<'); // highlight the syntax if (wikEdHighlightSyntax == true) { WikEdHighlightSyntax(obj); } // display tabs else { obj.html = obj.html.replace(/(\t)/g, '<span class="wikEdTabPlain">$1</span><!--wikEdTabPlain-->'); } // multiple blanks to blank- obj.html = obj.html.replace(/ /g, ' '); obj.html = obj.html.replace(/ /g, ' '); obj.html = obj.html.replace(/ \n/g, ' \n'); // newlines to <br /> obj.html = obj.html.replace(/\n/g, '<br />'); // set frame content wikEdFrameBody.innerHTML = obj.html; return; } // // WikEdKeyFrame: event handler for key and mouse events in the frame // function WikEdKeyFrame(event) { if (wikEdUseWikEd == true) { switch (event.type) { // trap the tab key case 'keydown': switch (event.keyCode) { case 9: if (event.shiftKey == false) { event.preventDefault(); // scroll to text input top if (wikEdFullScreenMode == false) { var inputWrapperTop = WikEdGetOffsetTop(wikEdInputWrapper); window.scroll(0, inputWrapperTop); } // focus the summary wikEdSummaryText.focus(); } break; } break; // trap any other frame event case 'keyup': case 'keypress': case 'mouseup': // grey out inactive buttons WikEdInactiveButtons(); // reset the frame DOM cache wikEdFrameDOMCache = null; break; } } return; } // // WikEdFrameExecCommand: wrapper for execCommand method // function WikEdFrameExecCommand(command, option) { wikEdFrameDocument.execCommand(command, false, option); return; } // // WikEdFindAhead: non-regexp and case-insensitive find-as-you-type, event handler for find field // function WikEdFindAhead() { if (wikEdFindAhead.checked == true) { // get the find text var findText = wikEdFindText.value; if (findText == '') { return; } // remember position var sel = wikEdFrameWindow.getSelection(); var range = sel.getRangeAt(sel.rangeCount - 1).cloneRange(); var rangeClone = range.cloneRange(); var frameScrollTop = wikEdFrameBody.scrollTop; // function: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog) sel.removeAllRanges(); sel.addRange(range); range.collapse(true); // function: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog) var found = wikEdFrameWindow.find(findText, false, false, true, false, false, false); // start from top if not found if (found == false) { // set cursor to start and search again sel.collapse(wikEdFrameBody, 0); found = wikEdFrameWindow.find(findText, false, false, true, false, false, false); // add original selection if (found == false) { wikEdFrameBody.scrollTop = frameScrollTop; sel.removeAllRanges(); sel.addRange(rangeClone); } } } return; } // // WikEdMainSwitch: onclick handler for program logo // function WikEdMainSwitch() { // enable wikEd if (wikEdDisabled == true) { wikEdDisabled = false; WikEdSetLogo(); var cookieExpire = new Date(); cookieExpire.setTime(cookieExpire.getTime() - 60 * 60 * 1000); WikEdSetCookie('wikEdDisabled', '', cookieExpire.toGMTString(), '/'); // turn rich text frame on if (wikEdLoaded == true) { WikEdUpdateFrame(); WikEdSetEditArea(true); wikEdButtonsControl.style.display = 'block'; wikEdButtonsPreview.style.display = 'block'; wikEdButtonsJump.style.display = 'block'; } // setup wikEd else { WikEdSetup(false); return; } } // disable wikEd else { wikEdDisabled = true; WikEdSetLogo(); var cookieExpire = new Date(); cookieExpire.setTime(cookieExpire.getTime() + wikEdCookieExpireSec * 1000); WikEdSetCookie('wikEdDisabled', 'true', cookieExpire.toGMTString(), '/'); if (wikEdLoaded == true) { if (wikEdFullScreenMode == true) { WikEdFullScreen(false); } // turn classic textarea on WikEdUpdateTextarea(); WikEdSetEditArea(false); wikEdButtonsControl.style.display = 'none'; wikEdButtonsPreview.style.display = 'none'; wikEdLocalPrevWrapper.style.display = 'none'; wikEdButtonsJump.style.display = 'none'; } } return; } // // WikEdFullScreen: change to fullscreen edit area or back to normal view // function WikEdFullScreen(fullscreen, notFrame) { // hide or show elements var displayStyle; if (fullscreen == true) { displayStyle = 'none'; } else { displayStyle = 'block'; } // elements above input wrapper var node = document.getElementById('editform').previousSibling; while (node != null) { if ( (node.nodeName == 'DIV') || (node.nodeName == 'H3') ) { node.style.display = displayStyle; } node = node.previousSibling; } document.getElementsByTagName('H1')[0].style.display = displayStyle; // divs below input wrapper var node = wikEdInputWrapper.nextSibling; while (node != null) { if (node.nodeName == 'DIV') { node.style.display = displayStyle; } node = node.nextSibling; } // divs below input wrapper, some levels up var node = document.getElementById('column-one'); while (node != null) { if (node.nodeName == 'DIV') { node.style.display = displayStyle; } node = node.nextSibling; } // insert wrapper document.getElementById('wikEdInsertWrapper').style.display = displayStyle; // change styles if (fullscreen) { if (notFrame != true) { wikEdInputWrapper.className = 'wikEdInputWrapperFull'; } wikEdButtonsPreview.className = 'wikEdButtonsPreviewFull'; } else { if (notFrame != true) { wikEdInputWrapper.className = 'wikEdInputWrapper'; } wikEdButtonsPreview.className = 'wikEdButtonsPreview'; } // resize the frame if (fullscreen) { var consoleTop = WikEdGetOffsetTop(wikEdConsoleWrapper); var consoleHeight = wikEdConsoleWrapper.offsetHeight; var frameHeight = wikEdFrame.offsetHeight; var windowHeight = window.innerHeight; var windowWidth = window.innerWidth; var frameHeightNew = frameHeight + (windowHeight - (consoleTop + consoleHeight) ) - 2; wikEdFrame.style.height = frameHeightNew + 'px'; } else { wikEdFrame.style.height = wikEdTextareaHeight + 'px'; } // scroll to edit-frame if (fullscreen == false) { window.scroll(0, WikEdGetOffsetTop(wikEdInputWrapper) - 2); } // set the fullscreen button state WikEdButton(document.getElementById('wikEdFullScreen'), 'wikEdFullScreen', null, fullscreen); // grey out or re-activate scroll-to buttons var buttonClass; if (fullscreen) { buttonClass = 'wikEdButtonInactive'; } else { buttonClass = 'wikEdButton'; } document.getElementById('wikEdScrollToInput').className = buttonClass; document.getElementById('wikEdScrollToInput2').className = buttonClass; document.getElementById('wikEdScrollToButtons').className = buttonClass; document.getElementById('wikEdScrollToButtons2').className = buttonClass; wikEdFullScreenMode = fullscreen; return; } // // WikEdResizeComboInput: set the size of the background select boxes so that the button is visible // function WikEdResizeComboInput(field) { // add a dummy option var dummy; if (wikEdSelectElement[field].options.length == 0) { wikEdSelectElement[field].options[0] = new Option(''); dummy = true; } // set option widths to 0 for (var i = 0; i < wikEdSelectElement[field].options.length; i ++) { wikEdSelectElement[field].options[i].style.width = '0'; } // calculate select width var inputWidth = wikEdInputElement[field].clientWidth; var selectWidth = wikEdSelectElement[field].clientWidth; var optionWidth = wikEdSelectElement[field].options[0].offsetWidth; var border = wikEdInputElement[field].offsetWidth - wikEdInputElement[field].clientWidth; selectWidth = selectWidth - optionWidth + inputWidth - border + 1; var buttonWidth = selectWidth - inputWidth; if (inputWidth - buttonWidth > 150) { wikEdInputElement[field].style.width = (inputWidth - buttonWidth) + 'px'; wikEdSelectElement[field].style.width = (selectWidth - buttonWidth) + 'px'; } else { wikEdSelectElement[field].style.width = selectWidth + 'px'; } // delete dummy option if (dummy == true) { wikEdSelectElement[field].options[0] = null; } // set option widths to auto for (var i = 0; i < wikEdSelectElement[field].options.length; i ++) { wikEdSelectElement[field].options[i].style.width = 'auto'; } return; } // // WikEdChangeComboInput: set the input value to selected option; onchange event handler for select boxes // function WikEdChangeComboInput(field) { // get selection index (-1 for unselected) var selected = wikEdSelectElement[field].selectedIndex; if (selected >= 0) { // get selected option var option = wikEdSelectElement[field].options[selected]; if (option.text != '') { // add a tag to the summary box if (field == 'summary') { wikEdInputElement[field].value = WikEdAppendToSummary(wikEdInputElement[field].value, option.text); } // add case and regexp checkboxes to find / replace fields else if (option.value == 'setcheck') { WikEdButton(document.getElementById('wikEdCaseSensitive'), 'wikEdCaseSensitive', null, (option.text.charAt(0) == wikEdCheckMarker[true]) ); WikEdButton(document.getElementById('wikEdRegExp'), 'wikEdRegExp', null, (option.text.charAt(1) == wikEdCheckMarker[true]) ); wikEdInputElement[field].value = option.text.substr(3); } // add option text else { wikEdInputElement[field].value = option.text; } } } // find the new text if ( (field == 'find') && (wikEdFindAhead.checked == true) ) { WikEdFindAhead(); } return; } // // WikEdAppendToSummary: append a phrase to the summary text // function WikEdAppendToSummary(summary, append) { summary = summary.replace(/^[, ]+/, ''); summary = summary.replace(/[, ]+$/, ''); if (summary != '') { if (summary.match(/ \*\/$/) != null) { summary += ' '; } else if (summary.match(/[\.\;\:]$/) != null) { summary += ' '; } else if (summary.match(/^[\w\(\)\"\'\+\-]/) == null) { summary += ' '; } else { summary += ', '; } } summary += append; return(summary); } // // WikEdAddToHistory: add an input value to the cookie history // function WikEdAddToHistory(field) { if (wikEdInputElement[field].value != '') { // load history from cookie WikEdLoadHistoryFromCookie(field); // add current value to history wikEdFieldHist[field].unshift(wikEdInputElement[field].value); // add case and regexp checkboxes to find / replace value if ( (field == 'find') || (field == 'replace') ) { wikEdFieldHist[field][0] = wikEdCheckMarker[ document.getElementById('wikEdCaseSensitive').checked ] + wikEdCheckMarker[ document.getElementById('wikEdRegExp').checked ] + ' ' + wikEdFieldHist[field][0]; } // remove paragraph names from summary if (field == 'summary') { wikEdFieldHist[field][0] = wikEdFieldHist[field][0].replace(/^\/\* .*? \*\/ */, ''); } // remove multiple old copies from history var i = 1; while (i < wikEdFieldHist[field].length) { if (wikEdFieldHist[field][i] == wikEdFieldHist[field][0]) { wikEdFieldHist[field].splice(i, 1); } else { i ++; } } // remove new value if it is a preset value if (wikEdComboPresetOptions[field] != null) { var i = 0; while (i < wikEdComboPresetOptions[field].length) { if (wikEdComboPresetOptions[field][i] == wikEdFieldHist[field][0]) { wikEdFieldHist[field].shift(); break; } else { i ++; } } } // cut history number to maximal history length wikEdFieldHist[field] = wikEdFieldHist[field].slice(0, wikEdHistoryLength[field]); // saved history to cookie if (wikEdFieldHist[field][0] != '') { WikEdSaveHistoryToCookie(field); } } return; } // // WikEdSetComboOptions: generate the select options from cookie history; onfocus handler for select box // function WikEdSetComboOptions(field) { // load history from cookie WikEdLoadHistoryFromCookie(field); var option = {}; var selected = null; // delete options var options = wikEdSelectElement[field].options; for (var i = 0; i < options.length; i ++) { wikEdSelectElement[field].remove(i); } // delete optgroup option = document.getElementById(field + 'Optgroup'); if (option != null) { wikEdSelectElement[field].removeChild(option); } // workaround for onchange not firing when selecting first option from unselected dropdown option = document.createElement('option'); option.style.display = 'none'; j = 0; wikEdSelectElement[field].options[j++] = option; // add history entries for (var i = 0; i < wikEdFieldHist[field].length; i ++) { if (wikEdFieldHist[field][i] != null) { if (wikEdFieldHist[field][i] == wikEdInputElement[field].value) { selected = j; } option = document.createElement('option'); option.text = wikEdFieldHist[field][i]; if ( (field == 'find') || (field == 'replace') ) { option.value = 'setcheck'; } wikEdSelectElement[field].options[j++] = option; } } // add preset entries if (wikEdComboPresetOptions[field] != null) { var startPreset = j; for (var i = 0; i < wikEdComboPresetOptions[field].length; i ++) { if (wikEdComboPresetOptions[field][i] != null) { if (wikEdComboPresetOptions[field][i] == wikEdInputElement[field].value) { selected = j; } option = document.createElement('option'); option.text = wikEdComboPresetOptions[field][i]; if (field == 'summary') { option.text = option.text.replace(/\{wikEdUsing\}/g, wikEdSummaryUsing); } wikEdSelectElement[field].options[j++] = option; } } // add a blank separator if (startPreset > 1) { option = document.createElement('optgroup'); option.label = '\u00a0'; option.id = field + 'Optgroup'; wikEdSelectElement[field].insertBefore(option, wikEdSelectElement[field].options[startPreset]); } } // set the selection wikEdSelectElement[field].selectedIndex = selected; return; } // // WikEdClearHistory: clear the history of combo input fields // function WikEdClearHistory(field) { var cookieExpire = new Date(); cookieExpire.setTime( cookieExpire.getTime() + wikEdCookieExpireSec * 1000 ); WikEdSetCookie(wikEdCookieName[field], '', cookieExpire.toGMTString(), '/'); WikEdSetComboOptions(field); return; } // // WikEdLoadHistoryFromCookie: get the input box history from the respective cookie // function WikEdLoadHistoryFromCookie(field) { var cookie = WikEdGetCookie(wikEdCookieName[field]); if (cookie != '') { cookie = decodeURIComponent(cookie); wikEdFieldHist[field] = cookie.split('\n'); } else { wikEdFieldHist[field] = []; } return; } // // WikEdSaveHistoryToCookie: save the input box history to the respective cookie // function WikEdSaveHistoryToCookie(field) { var cookieExpire = new Date(); cookieExpire.setTime( cookieExpire.getTime() + wikEdCookieExpireSec * 1000 ); var cookie = ''; cookie = wikEdFieldHist[field].join('\n') cookie = cookie.replace(/\n$/, ''); cookie = encodeURIComponent(cookie); WikEdSetCookie(wikEdCookieName[field], cookie, cookieExpire.toGMTString(), '/'); return; } // WikEdGetStyle: get computed style properties for non-inline css definitions function WikEdGetStyle(element, styleProperty) { var style; if (element != null) { style = document.defaultView.getComputedStyle(element, null).getPropertyValue(styleProperty); } return(style); } // // WikEdGetCookie // function WikEdGetCookie(name) { var cookie = ' ' + document.cookie; var search = ' ' + name + '='; var setStr = ''; var offset = 0; var end = 0; offset = cookie.indexOf(search); if (offset != -1) { offset += search.length; end = cookie.indexOf(';', offset) if (end == -1) { end = cookie.length; } setStr = cookie.substring(offset, end); setStr = setStr.replace(/\\+/g, ' '); setStr = decodeURIComponent(setStr); } return(setStr); } // // WikEdSetCookie // function WikEdSetCookie(name, value, expires, path, domain, secure) { var cookie = name + '=' + encodeURIComponent(value); if (expires != null) { cookie += '; expires=' + expires } if (path != null) { cookie += '; path=' + path; } if (domain != null) { cookie += '; domain=' + domain; } if (secure != null) { cookie += '; secure'; } document.cookie = cookie; } // // WikEdGetOffsetTop: get element offset relative to window top // function WikEdGetOffsetTop(element) { var offset = 0; do { offset += element.offsetTop; } while ( (element = element.offsetParent) != null ); return(offset); } // // WikEdGetOffsetLeft: get element offset relative to left window border // function WikEdGetOffsetLeft(element) { var offset = 0; do { offset += element.offsetLeft; } while ( (element = element.offsetParent) != null ); return(offset); } // define leaf elements for WikEdGetInnerHTML var wikEdLeafElements = []; wikEdLeafElements['IMG'] = true; wikEdLeafElements['HR'] = true; wikEdLeafElements['BR'] = true; wikEdLeafElements['INPUT'] = true; // // WikEdParseDOM: wikEdFrameDOMCache contains the last parse if the frame has not changed // function WikEdParseDOM(obj, topNode) { /* problematic because of obj.changed ////////////////////// if (wikEdFrameDOMCache != null) { obj = wikEdFrameDOMCache; return; } */ obj.plainLength = 0; obj.plainArray = []; obj.plainNode = []; obj.plainStart = []; obj.plainPos = []; WikEdParseDOMRecursive(obj, topNode); obj.plain = obj.plainArray.join(''); wikEdFrameDOMCache = obj; return; } // // WikEdParseDOMRecursive: // function WikEdParseDOMRecursive(obj, currentNode) { // cycle through the child nodes of currentNode for (var property in currentNode.childNodes) { var childNode = currentNode.childNodes[property]; if (childNode == null) { break; } // check for selection if (childNode == obj.sel.focusNode) { obj.plainFocus = obj.plainLength + obj.sel.focusOffset; } if (childNode == obj.sel.anchorNode) { obj.plainAnchor = obj.plainLength + obj.sel.anchorOffset; } var value = null; // get text of child node switch (childNode.nodeType) { case 1: if ( (childNode.childNodes.length == 0) && (wikEdLeafElements[childNode.nodeName] == true) ) { if (childNode.nodeName == 'BR') { value = '\n'; } } else { WikEdParseDOMRecursive(obj, childNode); } break; case 3: value = childNode.nodeValue; value = value.replace(/\n/g, ' '); break; case 5: value = '&' + childNode.nodeName + ';'; break; } // add text to text object if (value != null) { // array of text fragments obj.plainArray.push(value); // array of text fragment node references obj.plainNode.push(childNode); // array of text fragment text positions obj.plainStart.push(obj.plainLength); // node references containing text positions obj.plainPos[childNode] = obj.plainLength; // current text length obj.plainLength += value.length; } } return; } // // WikEdGetInnerHTML: get the innerHTML from a document fragment // function WikEdGetInnerHTML(obj, currentNode) { // initialize string if (obj.html == null) { obj.html = ''; } if (obj.plain == null) { obj.plain = ''; } if (obj.plainArray == null) { obj.plainArray = []; obj.plainNode = []; obj.plainStart = []; } for (var i = 0; i < currentNode.childNodes.length; i ++) { var childNode = currentNode.childNodes.item(i); switch (childNode.nodeType) { case 1: obj.html += '<' + childNode.nodeName.toLowerCase(); for (var j = 0; j < childNode.attributes.length; j ++) { if (childNode.attributes.item(j).nodeValue != null) { obj.html += ' ' + childNode.attributes.item(j).nodeName + '="' + childNode.attributes.item(j).nodeValue.replace(/</g, '<').replace(/>/g, '>') + '"'; } } if ( (childNode.childNodes.length == 0) && wikEdLeafElements[childNode.nodeName] ) { obj.html += '>'; if (childNode.nodeName == 'BR') { obj.plainArray.push('\n'); obj.plainNode.push(childNode); obj.plainStart.push(obj.plain.length); obj.plain += '\n'; } } else { obj.html += '>'; WikEdGetInnerHTML(obj, childNode); obj.html += '</' + childNode.nodeName.toLowerCase() + '>' } break; case 3: var value = childNode.nodeValue; value = value.replace(/\n/g, ' '); // important for pasted page content obj.plainArray.push(value); // plain array contains & < > instead of & < > obj.plainNode.push(childNode); obj.plainStart.push(obj.plain.length); value = value.replace(/&/g, '&'); value = value.replace(/</g, '<'); value = value.replace(/>/g, '>'); obj.html += value; obj.plain += value; break; case 4: obj.html += '<![CDATA[' + childNode.nodeValue + ']]>'; break; case 5: var value = '&' + childNode.nodeName + ';'; obj.plainArray.push(value); obj.plainNode.push(childNode); obj.plainStart.push(obj.plain.length); value = value.replace(/&/g, '&'); obj.html += value; obj.plain += value; break; case 8: obj.html += '<!--' + childNode.nodeValue + '-->'; break; } } return; } // WikEdStyleSheet: create a new style sheet object function WikEdStyleSheet(documentObject) { this.styleElement = null; if (documentObject == null) { documentObject = document; } // IE if (documentObject.createStyleSheet) { this.styleElement = documentObject.createStyleSheet(); } // standards compliant browsers else { this.styleElement = documentObject.createElement('style'); this.styleElement.from = 'text/css'; var insert = documentObject.getElementsByTagName('head')[0]; if (insert != null) { insert.appendChild(this.styleElement); } } // add-a-rule method // IE this.addRule = function(selector, declaration) { if (this.styleElement.addRule) { this.styleElement.addRule(selector, declaration); } // standards compliant browsers else { if (this.styleElement.sheet != null) { if (this.styleElement.sheet.insertRule != null) { this.styleElement.sheet.insertRule(selector + ' { ' + declaration + ' } ', 0); } } } }; return; } // WED: shortcut for WikEdDebug function WED(objectName, object) { WikEdDebug(objectName, object); return; } // WikEdDebug: print the value of variables function WikEdDebug(objectName, object) { document.getElementById('wikEdTextareaWrapper').style.position = 'static'; document.getElementById('wikEdTextareaWrapper').style.visibility = 'visible'; wikEdTextarea.style.display = 'block'; if (objectName == null) { wikEdTextarea.value = ''; wikEdTextarea.style.height = '25em'; } else { wikEdTextarea.value += objectName + ': ' + object + '\n'; } return; } // // wikEdInsertTags: overrides the insertTags function in wikibits.js used by the standard button toolbar and the editpage special chars // function wikEdInsertTags(tagOpen, tagClose, sampleText) { if (wikEdUseWikEd == true) { WikEdEditButton(document.getElementById('wikEdInsertTags'), 'wikEdInsertTags', [tagOpen, tagClose, sampleText]); } else if (wikeEdInsertTagsOriginal != null) { wikeEdInsertTagsOriginal(tagOpen, tagClose, sampleText); } return; } // // DefineUnicode: define character tables used in FixUnicode() // see http://kmi.open.ac.uk/projects/ceryle/doc/docs/NOTE-charents.html // removed because of internal use: < ['003c', 'lt']; > ['003e', 'gt']; & ['0026', 'amp'], ['00a0', 'nbsp'] function DefineUnicode() { // supported chars in Mozilla and IE wikEdSupportedChars = [ ['00a1', 'iexcl'], // ¡ ['00a2', 'cent'], // ¢ ['00a3', 'pound'], // £ ['00a4', 'curren'], // ¤ ['00a5', 'yen'], // ¥ ['00a6', 'brvbar'], // ¦ ['00a7', 'sect'], // § ['00a8', 'uml'], // ¨ ['00a9', 'copy'], // © ['00aa', 'ordf'], // ª ['00ab', 'laquo'], // « ['00ac', 'not'], // ¬ ['00ae', 'reg'], // ® ['00af', 'macr'], // ¯ ['00b0', 'deg'], // ° ['00b1', 'plusmn'], // ± ['00b2', 'sup2'], // ² ['00b3', 'sup3'], // ³ ['00b4', 'acute'], // ´ ['00b5', 'micro'], // µ ['00b6', 'para'], // ¶ ['00b7', 'middot'], // · ['00b8', 'cedil'], // ¸ ['00b9', 'sup1'], // ¹ ['00ba', 'ordm'], // º ['00bb', 'raquo'], // » ['00bc', 'frac14'], // ¼ ['00bd', 'frac12'], // ½ ['00be', 'frac34'], // ¾ ['00bf', 'iquest'], // ¿ ['00c0', 'Agrave'], // À ['00c1', 'Aacute'], // Á ['00c2', 'Acirc'], //  ['00c3', 'Atilde'], // à ['00c4', 'Auml'], // Ä ['00c5', 'Aring'], // Å ['00c6', 'AElig'], // Æ ['00c7', 'Ccedil'], // Ç ['00c8', 'Egrave'], // È ['00c9', 'Eacute'], // É ['00ca', 'Ecirc'], // Ê ['00cb', 'Euml'], // Ë ['00cc', 'Igrave'], // Ì ['00cd', 'Iacute'], // Í ['00ce', 'Icirc'], // Î ['00cf', 'Iuml'], // Ï ['00d0', 'ETH'], // Ð ['00d1', 'Ntilde'], // Ñ ['00d2', 'Ograve'], // Ò ['00d3', 'Oacute'], // Ó ['00d4', 'Ocirc'], // Ô ['00d5', 'Otilde'], // Õ ['00d6', 'Ouml'], // Ö ['00d7', 'times'], // × ['00d8', 'Oslash'], // Ø ['00d9', 'Ugrave'], // Ù ['00da', 'Uacute'], // Ú ['00db', 'Ucirc'], // Û ['00dc', 'Uuml'], // Ü ['00dd', 'Yacute'], // Ý ['00de', 'THORN'], // Þ ['00df', 'szlig'], // ß ['00e0', 'agrave'], // à ['00e1', 'aacute'], // á ['00e2', 'acirc'], // â ['00e3', 'atilde'], // ã ['00e4', 'auml'], // ä ['00e5', 'aring'], // å ['00e6', 'aelig'], // æ ['00e7', 'ccedil'], // ç ['00e8', 'egrave'], // è ['00e9', 'eacute'], // é ['00ea', 'ecirc'], // ê ['00eb', 'euml'], // ë ['00ec', 'igrave'], // ì ['00ed', 'iacute'], // í ['00ee', 'icirc'], // î ['00ef', 'iuml'], // ï ['00f0', 'eth'], // ð ['00f1', 'ntilde'], // ñ ['00f2', 'ograve'], // ò ['00f3', 'oacute'], // ó ['00f4', 'ocirc'], // ô ['00f5', 'otilde'], // õ ['00f6', 'ouml'], // ö ['00f7', 'divide'], // ÷ ['00f8', 'oslash'], // ø ['00f9', 'ugrave'], // ù ['00fa', 'uacute'], // ú ['00fb', 'ucirc'], // û ['00fc', 'uuml'], // ü ['00fd', 'yacute'], // ý ['00fe', 'thorn'], // þ ['00ff', 'yuml'], // ÿ ['0027', 'apos'], // ' ['0022', 'quot'], // " ['0152', 'OElig'], // Œ ['0153', 'oelig'], // œ ['0160', 'Scaron'], // Š ['0161', 'scaron'], // š ['0178', 'Yuml'], // Ÿ ['02c6', 'circ'], // ˆ ['02dc', 'tilde'], // ˜ ['2013', 'ndash'], // – ['2014', 'mdash'], // — ['2018', 'lsquo'], // ‘ ['2019', 'rsquo'], // ’ ['201a', 'sbquo'], // ‚ ['201c', 'ldquo'], // “ ['201d', 'rdquo'], // ” ['201e', 'bdquo'], // „ ['2020', 'dagger'], // † ['2021', 'Dagger'], // ‡ ['2030', 'permil'], // ‰ ['2039', 'lsaquo'], // ‹ ['203a', 'rsaquo'], // › ['20ac', 'euro'], // € ['0192', 'fnof'], // ƒ ['0391', 'Alpha'], // ? ['0392', 'Beta'], // ? ['0393', 'Gamma'], // G ['0394', 'Delta'], // ? ['0395', 'Epsilon'],// ? ['0396', 'Zeta'], // ? ['0397', 'Eta'], // ? ['0398', 'Theta'], // T ['0399', 'Iota'], // ? ['039a', 'Kappa'], // ? ['039b', 'Lambda'], // ? ['039c', 'Mu'], // ? ['039d', 'Nu'], // ? ['039e', 'Xi'], // ? ['039f', 'Omicron'],// ? ['03a0', 'Pi'], // ? ['03a1', 'Rho'], // ? ['03a3', 'Sigma'], // S ['03a4', 'Tau'], // ? ['03a5', 'Upsilon'],// ? ['03a6', 'Phi'], // F ['03a7', 'Chi'], // ? ['03a8', 'Psi'], // ? ['03a9', 'Omega'], // O ['03b1', 'alpha'], // a ['03b2', 'beta'], // ß ['03b3', 'gamma'], // ? ['03b4', 'delta'], // d ['03b5', 'epsilon'],// e ['03b6', 'zeta'], // ? ['03b7', 'eta'], // ? ['03b8', 'theta'], // ? ['03b9', 'iota'], // ? ['03ba', 'kappa'], // ? ['03bb', 'lambda'], // ? ['03bc', 'mu'], // µ ['03bd', 'nu'], // ? ['03be', 'xi'], // ? ['03bf', 'omicron'],// ? ['03c0', 'pi'], // p ['03c1', 'rho'], // ? ['03c2', 'sigmaf'], // ? ['03c3', 'sigma'], // s ['03c4', 'tau'], // t ['03c5', 'upsilon'],// ? ['03c6', 'phi'], // f ['03c7', 'chi'], // ? ['03c8', 'psi'], // ? ['03c9', 'omega'], // ? ['2022', 'bull'], // • ['2026', 'hellip'], // … ['2032', 'prime'], // ' ['2033', 'Prime'], // ? ['203e', 'oline'], // ? ['2044', 'frasl'], // / ['2122', 'trade'], // ™ ['2190', 'larr'], // ? ['2191', 'uarr'], // ? ['2192', 'rarr'], // ? ['2193', 'darr'], // ? ['2194', 'harr'], // ? ['21d2', 'rArr'], // ? ['21d4', 'hArr'], // ? ['2200', 'forall'], // ? ['2202', 'part'], // ? ['2203', 'exist'], // ? ['2207', 'nabla'], // ? ['2208', 'isin'], // ? ['220b', 'ni'], // ? ['220f', 'prod'], // ? ['2211', 'sum'], // ? ['2212', 'minus'], // - ['221a', 'radic'], // v ['221d', 'prop'], // ? ['221e', 'infin'], // 8 ['2220', 'ang'], // ? ['2227', 'and'], // ? ['2228', 'or'], // ? ['2229', 'cap'], // n ['222a', 'cup'], // ? ['222b', 'int'], // ? ['2234', 'there4'], // ? ['223c', 'sim'], // ~ ['2248', 'asymp'], // ˜ ['2260', 'ne'], // ? ['2261', 'equiv'], // = ['2264', 'le'], // = ['2265', 'ge'], // = ['2282', 'sub'], // ? ['2283', 'sup'], // ? ['2286', 'sube'], // ? ['2287', 'supe'], // ? ['2295', 'oplus'], // ? ['22a5', 'perp'], // ? ['25ca', 'loz'], // ? ['2660', 'spades'], // ? ['2663', 'clubs'], // ? ['2665', 'hearts'], // ? ['2666', 'diams'] // ? ]; // special chars (spaces and invisible characters) // wikEdSpecialChars = [ ['2002', 'ensp'], // en space ['00ad', 'shy'], // soft hyphen ['2003', 'emsp'], // em space ['2009', 'thinsp'], // ? thin space ['200c', 'zwnj'], // ? zero width non-joiner ['200d', 'zwj'], // ? zero width joiner ['200e', 'lrm'], // ? left-to-right mark ['200f', 'rlm'] // ? right-to-left mark ]; // unsupported chars in IE6 wikEdProblemChars = [ ['03d1', 'thetasym'], // ? ['03d2', 'upsih'], // ? ['03d6', 'piv'], // ? ['2118', 'weierp'], // P ['2111', 'image'], // I ['211c', 'real'], // R ['2135', 'alefsym'], // ? ['21b5', 'crarr'], // ? ['21d0', 'lArr'], // ? ['21d1', 'uArr'], // ? ['21d3', 'dArr'], // ? ['2205', 'empty'], // Ø ['2209', 'notin'], // ? ['2217', 'lowast'], // * ['2245', 'cong'], // ? ['2284', 'nsub'], // ? ['22a5', 'perp'], // ? ['2297', 'otimes'], // ? ['22c5', 'sdot'], // · ['2308', 'lceil'], // ? ['2309', 'rceil'], // ? ['230a', 'lfloor'], // ? ['230b', 'rfloor'], // ? ['2329', 'lang'], // < ['232a', 'rang'] // > ]; // ASCII control characters and invisibles, used for syntax highlighting wikEdControlChars = { '0': 'null', '1': 'start of heading', '2': 'start of text', '3': 'end of text', '4': 'end of transmission', '5': 'enquiry', '6': 'acknowledge', '7': 'bell', '8': 'backspace', '9': 'horizontal tab', '10': 'line feed, new line', '11': 'vertical tab', '12': 'form feed, new page', '13': 'carriage return', '14': 'shift out', '15': 'shift in', '16': 'data link escape', '17': 'device control 1', '18': 'device control 2', '19': 'device control 3', '20': 'device control 4', '21': 'negative acknowledge', '22': 'synchronous idle', '23': 'end of trans. block', '24': 'cancel', '25': 'end of medium', '25': 'substitute', '26': 'escape', '27': 'file separator', '28': 'group separator', '29': 'record separator', '30': 'unit separator', '173' : 'soft hyphen', // \u00ad '8204': 'zero width non-joiner', // \u200c '8205': 'zero width joiner', // \u200d '8206': 'left-to-right mark', // \u200e '8207': 'right-to-left mark', // \u200f '8232': 'line separator', // \u2028 '8233': 'paragraph separator' // \u2028 }; // strange spaces, used for syntax highlighting wikEdStrangeSpaces = { '31': 'non-breaking space', // \u00a0 '8194': 'en space', // \u2002 '8195': 'em space', // \u2003 '8201': 'thin space' // \u2009 }; return; } /* </nowiki></pre> */