User:Qo01rl/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.
/* {{en:User:Cacycle/wikEd_template}} <pre clear="all"><nowiki> /* Name: wikEd (wikEd.js) Version: wikEd 0.9.x (beta) (December, 2006). The code is currently under active development and might change rapidly What: Comfortable JavaScript editor for Wikipedia and other MediaWikis Update: press SHIFT-Reload to update to the newest version Homepage: http://en.wikipedia.org/wiki/User:Cacycle/wikEd Help: http://en.wikipedia.org/wiki/User:Cacycle/wikEd_help Code: http://en.wikipedia.org/wiki/User:Cacycle/wikEd.js Author: Cacycle (http://en.wikipedia.org/wiki/User:Cacycle) Browsers: The program works ONLY for Mozilla-based browsers (Mozilla, Mozilla Firefox, and Mozilla SeaMonkey) License: This code has been released into the public domain Important: This file might have to be saved as UTF-16 in your editor to preserve the Unicode characters at the end */ // version information var wikEdProgramVersion = '0.9.12b (beta)'; var wikEdProgramDate = 'December 2, 2006'; // // user configurable variables // // user readable texts, preset as wikEdText[''] = ''; // copy changes to http://en.wikipedia.org/wiki/User:Cacycle/wikEd_international_en.js var wikEdText = wikEdText || []; 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', 'wikEdCase alt': 'Case', 'wikEdCase title': 'Toggle between lowercase, uppercase first, and uppercase', 'wikEdUndoAll alt': 'Undo all', 'wikEdUndoAll title': 'Undo all changes', 'wikEdRedoAll alt': 'Redo all', 'wikEdRedoAll title': 'Redo all changes', 'wikEdUpdateSyntax alt': 'Syntax', 'wikEdUpdateSyntax title': 'Update syntax highlighting', // formatting buttons, bottom row 'wikEdWikiLink alt': 'Link', 'wikEdWikiLink title': 'Wiki link', 'wikEdWebLink alt': 'Weblink', 'wikEdWebLink title': 'External weblink', 'wikEdDecreaseHeading alt': 'Heading-', 'wikEdDecreaseHeading title': 'Decrease heading levels', 'wikEdIncreaseHeading alt': 'Heading+', 'wikEdIncreaseHeading title': 'Increase heading levels', 'wikEdBulletList alt': 'Bullet list', 'wikEdBulletList title': 'Bulleted list', 'wikEdNumberList alt': 'Number list', 'wikEdNumberList title': 'Numbered list', 'wikEdIndentList alt': 'Indent list', 'wikEdIndentList title': 'Indented list', 'wikEdDefinitionList alt': 'Def list', 'wikEdDefinitionList title': 'Definition list', 'wikEdImage alt': 'Image', 'wikEdImage title': 'Image', 'wikEdTable alt': 'Table', 'wikEdTable title': 'Table', 'wikEdRedirect alt': 'Redirect', 'wikEdRedirect title': 'Create redirect, deletes whole text', 'wikEdWikify alt': 'Wikify', 'wikEdWikify title': 'Wikify pasted content', 'wikEdTextify alt': 'Textify', 'wikEdTextify title': 'Convert pasted content to plain text', // wikEd control buttons, top row 'wikEdTextZoom alt': 'Text zoom', 'wikEdTextZoom title': 'Text zoom cycling', 'wikEdClearHistory alt': 'Clear history', 'wikEdClearHistory title': 'Clear the find, replace, and summary history', 'wikEdScrollToButtons alt': 'Scroll buttons', 'wikEdScrollToButtons title': 'Scroll to edit buttons', 'wikEdScrollToInput alt': 'Scroll edit', 'wikEdScrollToInput title': 'Scroll to edit window', // 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', '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', // find and replace buttons, top row 'wikEdGetFind alt': 'Get find', 'wikEdGetFind title': 'Copy selection to find field (double click: copy selection to find and to replace field)', 'wikEdFindAll alt': 'Find all', 'wikEdFindAll title': 'Not yet implemented. Find all matches in whole text or selection', '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 'wikEdGetFind alt': 'Get find + replace', 'wikEdGetFind title': 'Copy selection to find and replace fields', 'wikEdClearFind alt': 'Clear find', 'wikEdClearFind title': 'Clear the find field (to search for selected text)', 'wikEdReplaceAll alt': 'Replace all', 'wikEdReplaceAll title': 'Not yet implemented. 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', // 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', 'wikEdScrollToButtons2 alt': 'Scroll buttons', 'wikEdScrollToButtons2 title': 'Scroll to edit buttons', 'wikEdScrollToInput2 alt': 'Scroll edit', 'wikEdScrollToInput2 title': 'Scroll to edit window', // 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', 'wikEdScrollToButtons3 alt': 'Scroll buttons', 'wikEdScrollToButtons3 title': 'Scroll to edit buttons', 'wikEdScrollToInput3 alt': 'Scroll edit', 'wikEdScrollToInput3 title': 'Scroll to edit window', // 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', // shortened button texts 'shortenedPreview': 'Preview', 'shortenedChanges': 'Changes' }); // edit-frame css rules, preset as wikEdFrameCSS[''] = ''; var wikEdFrameCSS = wikEdFrameCSS || []; 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;', '.wikEdComment': 'background-color: #fff0d0;', '.wikEdDel': 'text-decoration: line-through;', '.wikEdIns': 'text-decoration: underline;', '.wikEdItalic': 'font-style: italic;', '.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;', // 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': '', '.wikEdLinkInter': 'background-color: #c8c8ff;', '.wikEdImageInter': 'background-color: #c8c8ff;', '.wikEdCatInter': 'background-color: #c8c8ff;', '.wikEdTemplInter': 'background-color: #c8c8ff;', // name '.wikEdLinkName': 'color: #f00000; font-weight: bold;', '.wikEdImageName': 'font-weight: bold;', '.wikEdCatName': 'color: #f00000; font-weight: bold;', '.wikEdTemplName': 'color: #f00000; font-weight: bold;', '.wikEdURLLink': 'color: #f00000; font-weight: bold;', // pasted html '.wikEdPastedHtml': 'background-color: #FFC080;', // text and parameters '.wikEdLinkText': 'font-weight: bold;', '.wikEdImageText': '', '.wikEdCatText': '', '.wikEdTemplText': '', '.wikEdURLText': 'font-weight: bold;', // insert wikicode here '.wikEdInsertHere': 'background-color: orange; font-style: italic;', // 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, preset as wikEdMainCSS[''] = ''; var wikEdMainCSS = wikEdMainCSS || []; WikEdInitObject(wikEdMainCSS, { // combo input box '.wikEdCombo': 'font-size: smaller; padding-left: 0.1em; padding-right: 0.1em; margin-left: 0.1em; margin-right: 0.1em; height: 1.6em; vertical-align: bottom;', // wikEd button areas '.wikEdButtonsFormat': 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0.2em 0.6em 0 0 ; float: left;', '.wikEdButtonsFind': 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0.2em 0.6em 0 0 ; float: left;', '.wikEdButtonsFix': 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0.2em 0.6em 0 0 ; float: left', '.wikEdButtonsControl': 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0.2em 0 0 0 ; float: right;', '.wikEdButtonsPreview': 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: -0.2em 0 0 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;', '.wikEdClearSummary': 'vertical-align: middle; margin: 0 0.1em 0 0.5em; padding: 0 0 0.2em 0;', // preview box '.wikEdPreviewBoxOuter': 'clear: both; margin-top: 0.5em; margin-bottom: 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;', '#wikEdFindText': 'height: 1.4em; font-family: monospace; padding: 0; margin: 0; position: absolute; left: 0; top: 0; z-index: 2;', '#wikEdFindSelect': 'height: 1.5em; font-family: monospace; border: none; padding: 0; margin: 0; position: relative; vertical-align: baseline; z-index: 1;', // replace field '.wikEdReplaceComboInput': 'position: relative; padding: 0; margin: 0 0.2em; font-style: normal;', '#wikEdReplaceText': 'height: 1.4em; font-family: monospace; padding: 0; margin: 0; position: absolute; left: 0; top: 0; z-index: 2;', '#wikEdReplaceSelect': 'height: 1.5em; font-family: monospace; border: none; padding: 0; margin: 0; position: relative; vertical-align: baseline; z-index: 1;', // summary field '.wikEdSummaryComboInput': 'position: relative;', '.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-top: 0.5em; margin-bottom: 0.5em;', // frame '.wikEdFrameOuter': 'width: 100%; margin-top: 0.5em; margin-bottom: 0.1em; 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.25em 0 0.4em 0;', '#wpSummaryLabel': 'margin-right: 0.2em', '.editOptions': 'position: relative; top: 0.1em;', // input wrapper '.wikEdInputWrapper': 'z-index: 100;', '.wikEdInputWrapperFull': 'position: fixed; top: 0; left: 0; right: 0; padding: 4px; background: white; z-index: 100;', // other wrappers '.wikEdToolbarWrapper': '', '.wikEdTextareaWrapper': '', '.wikEdFrameWrapper': '', '.wikEdConsoleWrapper': '', '.wikEdButtonsWrapper': '', '.wikEdSummaryInputWrapper': 'display: inline;', '.wikEdSummaryOptions': 'display: inline;', '.wikEdSubmitWrapper': '', '.wikEdSubmitButtonsWrapper': '', '.wikEdLocalPrevWrapper': '', '.wikEdInsertWrapper': '', // various '.wikEdHelpSpan': '', '#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 || []; // image URLs, preset as wikEdImage[''] = ''; WikEdInitObject(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', 'ctrl': '1/10/WikEd_ctrl.png', 'decreaseHeading': '7/72/WikEd_decrease_heading.png', 'definitionList': 'f/f5/WikEd_definition_list.png', 'diff': 'd/db/WikEd_diff.png', 'disabled': '0/07/WikEd_disabled.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', 'highlightSyntax': '6/67/WikEd_syntax.png', 'image': '3/37/WikEd_image.png', 'increaseHeading': '5/50/WikEd_increase_heading.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', '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' }); // 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 (set to false by single-session cookie wikEdSyntaxOff) var wikEdHighlightSyntax = wikEdHighlightSyntax || true; // enable wikEd preset (set to false by single-session cookie wikEdUseClassic) var wikEdUseWikEd = wikEdUseWikEd || true; // add '...using wikEd' to summary preset (set to true by single-session cookie wikEdSummaryUsing) var wikEdUsing = wikEdUsing || false; // fullscreen mode preset (set to true by single-session cookie wikEdFullscreen) var wikEdFullScreenMode = wikEdFullScreenMode || 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 edit toolbar when the rich-text edit-frame is active var wikEdShowToolbar = wikEdShowToolbar || true; // show the text-to-source button for testing purposes var wikEdShowSourceButton = wikEdShowSourceButton || false; // remove linebreak before minor edit checkbox var wikEdNoLinebreak = wikEdNoLinebreak || true; // 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']; // use RegExTypoFix (http://en.wikipedia.org/wiki/User:Mboverload/RegExTypoFix), needs Wikipedia:AutoWikiBrowser/typos.js var wikEdRegExTypoFix = wikEdRegExTypoFix || true; // // end of user configurable variables // // global variables var wikEdLoaded = 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 = null; // undo all, redo all var wikEdOrigVersion = ''; var wikEdLastVersion = null; // 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 wikEdButtonsFind = {}; var wikEdButtonsFix = {}; var wikEdButtonsControl = {}; var wikEdButtonsPreview = {}; var wikEdPreviewBox = {}; var wikEdButtonsPreview2 = {}; var wikEdButtonsJump = {}; var wikEdCaseSensitive = {}; var wikEdRegExp = {}; var wikEdFindAhead = {}; var wikEdFindText = {}; var wikEdReplaceText = {}; var wikEdSummaryText = {}; // various var wikEdTextareaHeight; var wikEdLastPosObj = null; // counters var i; var j; // 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'); // add setup routine to addOnloadHook if (window.addOnloadHook != null) { addOnloadHook(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; } // // insertTags: override the insertTags function in wikibits.js, used for the standard button toolbar // function insertTags(tagOpen, tagClose, sampleText) { if (wikEdUseWikEd == true) { WikEdEditButton('wikEdInsertTags', [tagOpen, tagClose, sampleText]); } // apply tagOpen / tagClose to selection in textarea, // use sampleText instead of selection if there is none // taken from wikibits.js else { if (wikEdTextarea.selectionStart || wikEdTextarea.selectionStart == '0') { var replaced = false; var startPos = wikEdTextarea.selectionStart; var endPos = wikEdTextarea.selectionEnd; if (endPos - startPos) { replaced = true; } var scrollTop = wikEdTextarea.scrollTop; var myText = (wikEdTextarea.value).substring(startPos, endPos); if (! myText) { myText = sampleText; } // exclude ending space char, if any if (myText.charAt(myText.length - 1) == ' ') { subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + ' '; } else { subst = tagOpen + myText + tagClose; } wikEdTextarea.value = wikEdTextarea.value.substring( 0, startPos) + subst + wikEdTextarea.value.substring(endPos, wikEdTextarea.value.length ); wikEdTextarea.focus(); // set new selection if (replaced) { var cPos = startPos+(tagOpen.length + myText.length + tagClose.length); wikEdTextarea.selectionStart = cPos; wikEdTextarea.selectionEnd = cPos; } else { wikEdTextarea.selectionStart = startPos + tagOpen.length; wikEdTextarea.selectionEnd = startPos + tagOpen.length + myText.length; } wikEdTextarea.scrollTop = scrollTop; } // reposition cursor if possible if (wikEdTextarea.createTextRange) { wikEdTextarea.caretPos = document.selection.createRange().duplicate(); } } return; } // // WikEdSetup: setup routine, called on page load // function WikEdSetup(scrollToText) { var html = ''; // add image path to image filename if (wikEdLogo.id == null) { if (wikEdUseLocalImages == true) { // remove MediaWiki path prefixes for (i in wikEdImage) { wikEdImage[i] = wikEdImagePathLocal + wikEdImage[i].replace(/^[0-9a-f]+\/[0-9a-f]+\//, ''); } } else { for (i in wikEdImage) { wikEdImage[i] = wikEdImagePath + wikEdImage[i]; } } // 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; 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 (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; } // check if RegExTypoFix is available if (typeof(AWRegExTypoFix) != 'function') { 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; } cookie = WikEdGetCookie('wikEdUseClassic'); if (cookie != '') { wikEdUseWikEd = false; } cookie = WikEdGetCookie('wikEdSyntaxOff'); if (cookie != '') { wikEdHighlightSyntax = false; } cookie = WikEdGetCookie('wikEdFullscreen'); if (cookie != '') { wikEdFullScreenMode = true; } 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.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'; 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 buttons and help links wikEdSubmitWrapper = document.createElement('div'); wikEdSubmitWrapper.id = 'wikEdSubmitWrapper'; wikEdSubmitWrapper.className = 'wikEdSubmitWrapper'; wikEdConsoleWrapper.appendChild(wikEdSubmitWrapper); // create submit 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 (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 summary elements to summary options wrapper // crashes Mozilla when appended after filling the iframe var editOptions = document.getElementById('wpMinoredit').parentNode; wikEdSummaryOptions.appendChild(editOptions); // 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 += '</div>'; 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; // add wikEd buttons to buttons wrapper // format buttons html = ''; html += '<div class="wikEdButtonsFormat" id="wikEdButtonsFormat">'; html += '<img class="wikEdButtonInactive" src="' + wikEdImage['undo'] + '" width="16" height="16" id="wikEdUndo" alt="' + wikEdText['wikEdUndo alt'] + '" title="' + wikEdText['wikEdUndo title'] + '" onClick="javascript:WikEdEditButton(\'wikEdUndo\');">'; html += '<img class="wikEdButtonInactive" src="' + wikEdImage['redo'] + '" width="16" height="16" id="wikEdRedo" alt="' + wikEdText['wikEdRedo alt'] + '" title="' + wikEdText['wikEdRedo title'] + '" onClick="javascript:WikEdEditButton(\'wikEdRedo\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['bold'] + '" width="16" height="16" id="wikEdBold" alt="' + wikEdText['wikEdBold alt'] + '" title="' + wikEdText['wikEdBold title'] + '" onClick="javascript:WikEdEditButton(\'wikEdBold\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['italic'] + '" width="16" height="16" id="wikEdItalic" alt="' + wikEdText['wikEdItalic alt'] + '" title="' + wikEdText['wikEdItalic title'] + '" onClick="javascript:WikEdEditButton(\'wikEdItalic\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['underline'] + '" width="16" height="16" id="wikEdUnderline" alt="' + wikEdText['wikEdUnderline alt'] + '" title="' + wikEdText['wikEdUnderline title'] + '" onClick="javascript:WikEdEditButton(\'wikEdUnderline\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['strikethrough'] + '" width="16" height="16" id="wikEdStrikethrough" alt="' + wikEdText['wikEdStrikethrough alt'] + '" title="' + wikEdText['wikEdStrikethrough title'] + '" onClick="javascript:WikEdEditButton(\'wikEdStrikethrough\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['nowiki'] + '" width="16" height="16" id="wikEdNowiki" alt="' + wikEdText['wikEdNowiki alt'] + '" title="' + wikEdText['wikEdNowiki title'] + '" onClick="javascript:WikEdEditButton(\'wikEdNowiki\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['superscript'] + '" width="16" height="16" id="wikEdSuperscript" alt="' + wikEdText['wikEdSuperscript alt'] + '" title="' + wikEdText['wikEdSuperscript title'] + '" onClick="javascript:WikEdEditButton(\'wikEdSuperscript\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['subscript'] + '" width="16" height="16" id="wikEdSubscript" alt="' + wikEdText['wikEdSubscript alt'] + '" title="' + wikEdText['wikEdSubscript title'] + '" onClick="javascript:WikEdEditButton(\'wikEdSubscript\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['case'] + '" width="16" height="16" id="wikEdCase" alt="' + wikEdText['wikEdCase alt'] + '" title="' + wikEdText['wikEdCase title'] + '" onClick="javascript:WikEdEditButton(\'wikEdCase\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['undoAll'] + '" width="16" height="16" id="wikEdUndoAll" alt="' + wikEdText['wikEdUndoAll alt'] + '" title="' + wikEdText['wikEdUndoAll title'] + '" onClick="javascript:WikEdEditButton(\'wikEdUndoAll\');">'; html += '<img class="wikEdButtonInactive" src="' + wikEdImage['redoAll'] + '" width="16" height="16" id="wikEdRedoAll" alt="' + wikEdText['wikEdRedoAll alt'] + '" title="' + wikEdText['wikEdRedoAll title'] + '" onClick="javascript:WikEdEditButton(\'wikEdRedoAll\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['updateSyntax'] + '" width="16" height="16" id="wikEdUpdateSyntax" alt="' + wikEdText['wikEdUpdateSyntax alt'] + '" title="' + wikEdText['wikEdUpdateSyntax title'] + '" onClick="javascript:WikEdEditButton(\'wikEdUpdateSyntax\');">'; html += '<br />'; html += '<img class="wikEdButton" src="' + wikEdImage['wikiLink'] + '" width="16" height="16" id="wikEdWikiLink" alt="' + wikEdText['wikEdWikiLink alt'] + '" title="' + wikEdText['wikEdWikiLink title'] + '" onClick="javascript:WikEdEditButton(\'wikEdWikiLink\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['webLink'] + '" width="16" height="16" id="wikEdWebLink" alt="' + wikEdText['wikEdWebLink alt'] + '" title="' + wikEdText['wikEdWebLink title'] + '" onClick="javascript:WikEdEditButton(\'wikEdWebLink\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['decreaseHeading'] + '" width="16" height="16" id="wikEdDecreaseHeading" alt="' + wikEdText['wikEdDecreaseHeading alt'] + '" title="' + wikEdText['wikEdDecreaseHeading title'] + '" onClick="javascript:WikEdEditButton(\'wikEdDecreaseHeading\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['increaseHeading'] + '" width="16" height="16" id="wikEdIncreaseHeading" alt="' + wikEdText['wikEdIncreaseHeading alt'] + '" title="' + wikEdText['wikEdIncreaseHeading title'] + '" onClick="javascript:WikEdEditButton(\'wikEdIncreaseHeading\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['bulletList'] + '" width="16" height="16" id="wikEdBulletList" alt="' + wikEdText['wikEdBulletList alt'] + '" title="' + wikEdText['wikEdBulletList title'] + '" onClick="javascript:WikEdEditButton(\'wikEdBulletList\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['numberList'] + '" width="16" height="16" id="wikEdNumberList" alt="' + wikEdText['wikEdNumberList alt'] + '" title="' + wikEdText['wikEdNumberList title'] + '" onClick="javascript:WikEdEditButton(\'wikEdNumberList\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['indentList'] + '" width="16" height="16" id="wikEdIndentList" alt="' + wikEdText['wikEdIndentList alt'] + '" title="' + wikEdText['wikEdIndentList title'] + '" onClick="javascript:WikEdEditButton(\'wikEdIndentList\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['definitionList'] + '" width="16" height="16" id="wikEdDefinitionList" alt="' + wikEdText['wikEdDefinitionList alt'] + '" title="' + wikEdText['wikEdDefinitionList title'] + '" onClick="javascript:WikEdEditButton(\'wikEdDefinitionList\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['image'] + '" width="16" height="16" id="wikEdImage" alt="' + wikEdText['wikEdImage alt'] + '" title="' + wikEdText['wikEdImage title'] + '" onClick="javascript:WikEdEditButton(\'wikEdImage\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['table'] + '" width="16" height="16" id="wikEdTable" alt="' + wikEdText['wikEdTable alt'] + '" title="' + wikEdText['wikEdTable title'] + '" onClick="javascript:WikEdEditButton(\'wikEdTable\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['redirect'] + '" width="16" height="16" id="wikEdRedirect" alt="' + wikEdText['wikEdRedirect alt'] + '" title="' + wikEdText['wikEdRedirect title'] + '" onClick="javascript:WikEdEditButton(\'wikEdRedirect\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['wikify'] + '" width="16" height="16" id="wikEdWikify" alt="' + wikEdText['wikEdWikify alt'] + '" title="' + wikEdText['wikEdWikify title'] + '" onClick="javascript:WikEdEditButton(\'wikEdWikify\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['textify'] + '" width="16" height="16" id="wikEdTextify" alt="' + wikEdText['wikEdTextify alt'] + '" title="' + wikEdText['wikEdTextify title'] + '" onClick="javascript:WikEdEditButton(\'wikEdTextify\');">'; html += '</div>'; // wikEd control buttons html += '<div class="wikEdButtonsControl" id="wikEdButtonsControl">'; html += '<img class="wikEdButton" src="' + wikEdImage['textZoom'] + '" width="16" height="16" id="wikEdTextZoom" alt="' + wikEdText['wikEdTextZoom alt'] + '" title="' + wikEdText['wikEdTextZoom title'] + '" onClick="javascript:WikEdButton(\'wikEdTextZoom\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['clearHistory'] + '" width="16" height="16" id="wikEdClearHistory" alt="' + wikEdText['wikEdClearHistory alt'] + '" title="' + wikEdText['wikEdClearHistory title'] + '" onClick="javascript:WikEdButton(\'wikEdClearHistory\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['scrollToButtons'] + '" width="16" height="16" id="wikEdScrollToButtons" alt="' + wikEdText['wikEdScrollToButtons alt'] + '" title="' + wikEdText['wikEdScrollToButtons title'] + '" onClick="javascript:WikEdButton(\'wikEdScrollToButtons\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['scrollToText'] + '" width="16" height="16" id="wikEdScrollToInput" alt="' + wikEdText['wikEdScrollToInput alt'] + '" title="' + wikEdText['wikEdScrollToInput title'] + '" onClick="javascript:WikEdButton(\'wikEdScrollToInput\');">'; html += '<br />'; html += '<img class="wikEdButtonChecked" src="' + wikEdImage['useWikEd'] + '" width="16" height="16" id="wikEdUseWikEd" alt="' + wikEdText['wikEdUseWikEd alt'] + '" title="' + wikEdText['wikEdUseWikEd title'] + '" onClick="javascript:WikEdButton(\'wikEdUseWikEd\', true);">'; html += '<img class="wikEdButtonUnchecked" src="' + wikEdImage['highlightSyntax'] + '" width="16" height="16" id="wikEdHighlightSyntax" alt="' + wikEdText['wikEdHighlightSyntax alt'] + '" title="' + wikEdText['wikEdHighlightSyntax title'] + '" onClick="javascript:WikEdButton(\'wikEdHighlightSyntax\', true);">'; if (wikEdShowSourceButton == true) { html += '<img class="wikEdButton" src="' + wikEdImage['source'] + '" width="16" height="16" id="wikEdSource" alt="' + wikEdText['wikEdSource alt'] + '" title="' + wikEdText['wikEdSource title'] + '" onClick="javascript:WikEdEditButton(\'wikEdSource\');">'; } html += '<img class="wikEdButtonUnchecked" src="' + wikEdImage['using'] + '" width="16" height="16" id="wikEdUsing" alt="' + wikEdText['wikEdUsing alt'] + '" title="' + wikEdText['wikEdUsing title'] + '" onClick="javascript:WikEdButton(\'wikEdUsing\', true);">'; html += '<img class="wikEdButton" src="' + wikEdImage['fullScreen'] + '" width="16" height="16" id="wikEdFullScreen" alt="' + wikEdText['wikEdFullScreen alt'] + '" title="' + wikEdText['wikEdFullScreen title'] + '" onClick="javascript:WikEdButton(\'wikEdFullScreen\', true);">'; html += '</div>'; // find / replace buttons html += '<div class="wikEdButtonsFind" id="wikEdButtonsFind">'; html += '<img class="wikEdButton" src="' + wikEdImage['getFind'] + '" width="16" height="16" id="wikEdGetFind" alt="' + wikEdText['wikEdGetFind alt'] + '" title="' + wikEdText['wikEdGetFind title'] + '" onClick="javascript:WikEdEditButton(\'wikEdGetFind\');" ondblclick="javascript:WikEdEditButton(\'wikEdGetFindReplace\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['findAll'] + '" width="16" height="16" id="wikEdFindAll" alt="' + wikEdText['wikEdFindAll alt'] + '" title="' + wikEdText['wikEdFindAll title'] + '" onClick="javascript:WikEdEditButton(\'wikEdFindAll\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['findPrev'] + '" width="16" height="16" id="wikEdFindPrev" alt="' + wikEdText['wikEdFindPrev alt'] + '" title="' + wikEdText['wikEdFindPrev title'] + '" onClick="javascript:WikEdEditButton(\'wikEdFindPrev\');">'; html += '<span class="wikEdFindComboInput" id="wikEdFindComboInput">'; html += '<input class="wikEdCombo" id="wikEdFindText" type="text" value="" onfocus="javascript:this.setSelectionRange(0, this.textLength);">'; html += '<select class="wikEdCombo" id="wikEdFindSelect" onfocus="javascript:WikEdSetComboOptions(\'find\')" onChange="javascript:WikEdChangeComboInput(\'find\');">'; html += '</select>'; html += '</span>'; html += '<img class="wikEdButton" src="' + wikEdImage['findNext'] + '" width="16" height="16" id="wikEdFindNext" alt="' + wikEdText['wikEdFindNext alt'] + '" title="' + wikEdText['wikEdFindNext title'] + '" onClick="javascript:WikEdEditButton(\'wikEdFindNext\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['jumpTopBottom'] + '" width="16" height="16" id="wikEdUpdown" alt="' + wikEdText['wikEdUpdown alt'] + '" title="' + wikEdText['wikEdUpdown title'] + '" onClick="javascript:WikEdEditButton(\'wikEdUpdown\');">'; html += '<img class="wikEdButtonInactive" src="' + wikEdImage['prevPos'] + '" width="16" height="16" id="wikEdPrevPos" alt="' + wikEdText['wikEdPrevPos alt'] + '" title="' + wikEdText['wikEdPrevPos title'] + '" onClick="javascript:WikEdEditButton(\'wikEdPrevPos\');">'; html += '<img class="wikEdButtonInactive" src="' + wikEdImage['lastPos'] + '" width="16" height="16" id="wikEdLastPos" alt="' + wikEdText['wikEdLastPos alt'] + '" title="' + wikEdText['wikEdLastPos title'] + '" onClick="javascript:WikEdEditButton(\'wikEdLastPos\');">'; html += '<br />'; html += '<img class="wikEdButton" src="' + wikEdImage['clearFind'] + '" width="16" height="16" id="wikEdClearFind" alt="' + wikEdText['wikEdClearFind alt'] + '" title="' + wikEdText['wikEdClearFind title'] + '" onClick="javascript:WikEdButton(\'wikEdClearFind\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['replaceAll'] + '" width="16" height="16" id="wikEdReplaceAll" alt="' + wikEdText['wikEdReplaceAll alt'] + '" title="' + wikEdText['wikEdReplaceAll title'] + '" onClick="javascript:WikEdEditButton(\'wikEdReplaceAll\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['replacePrev'] + '" width="16" height="16" id="wikEdReplacePrev" alt="' + wikEdText['wikEdReplacePrev alt'] + '" title="' + wikEdText['wikEdReplacePrev title'] + '" onClick="javascript:WikEdEditButton(\'wikEdReplacePrev\');">'; html += '<span class="wikEdReplaceComboInput" id="wikEdReplaceComboInput">'; html += '<input class="wikEdCombo" id="wikEdReplaceText" type="text" value="" onfocus="this.setSelectionRange(0, this.textLength);">'; html += '<select class="wikEdCombo" id="wikEdReplaceSelect" onfocus="WikEdSetComboOptions(\'replace\')" onChange="javascript:WikEdChangeComboInput(\'replace\');">'; html += '</select>'; html += '</span>'; html += '<img class="wikEdButton" src="' + wikEdImage['replaceNext'] + '" width="16" height="16" id="wikEdReplaceNext" alt="' + wikEdText['wikEdReplaceNext alt'] + '" title="' + wikEdText['wikEdReplaceNext title'] + '" onClick="javascript:WikEdEditButton(\'wikEdReplaceNext\');">'; html += '<img class="wikEdButtonUnchecked" src="' + wikEdImage['caseSensitive'] + '" width="16" height="16" id="wikEdCaseSensitive" alt="' + wikEdText['wikEdCaseSensitive alt'] + '" title="' + wikEdText['wikEdCaseSensitive title'] + '" onClick="javascript:WikEdButton(\'wikEdCaseSensitive\', true);">'; html += '<img class="wikEdButtonUnchecked" src="' + wikEdImage['regExp'] + '" width="16" height="16" id="wikEdRegExp" alt="' + wikEdText['wikEdRegExp alt'] + '" title="' + wikEdText['wikEdRegExp title'] + '" onClick="javascript:WikEdButton(\'wikEdRegExp\', true);">'; html += '<img class="wikEdButtonUnchecked" src="' + wikEdImage['findAhead'] + '" width="16" height="16" id="wikEdFindAhead" alt="' + wikEdText['wikEdFindAhead alt'] + '" title="' + wikEdText['wikEdFindAhead title'] + '" onClick="javascript:WikEdButton(\'wikEdFindAhead\', true);">'; html += '</div>'; // fixing buttons html += '<div class="wikEdButtonsFix" id="wikEdButtonsFix">'; html += '<img class="wikEdButton" src="' + wikEdImage['fixBasic'] + '" width="16" height="16" id="wikEdFixBasic" alt="' + wikEdText['wikEdFixBasic alt'] + '" title="' + wikEdText['wikEdFixBasic title'] + '" onClick="javascript:WikEdEditButton(\'wikEdFixBasic\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['fixHtml'] + '" width="16" height="16" id="wikEdFixHtml" alt="' + wikEdText['wikEdFixHtml alt'] + '" title="' + wikEdText['wikEdFixHtml title'] + '" onClick="javascript:WikEdEditButton(\'wikEdFixHtml\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['fixCaps'] + '" width="16" height="16" id="wikEdFixCaps" alt="' + wikEdText['wikEdFixCaps alt'] + '" title="' + wikEdText['wikEdFixCaps title'] + '" onClick="javascript:WikEdEditButton(\'wikEdFixCaps\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['fixUnicode'] + '" width="16" height="16" id="wikEdfixUnicode" alt="' + wikEdText['wikEdfixUnicode alt'] + '" title="' + wikEdText['wikEdfixUnicode title'] + '" onClick="javascript:WikEdEditButton(\'wikEdfixUnicode\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['fixAll'] + '" width="16" height="16" id="wikEdFixAll" alt="' + wikEdText['wikEdFixAll alt'] + '" title="' + wikEdText['wikEdFixAll title'] + '" onClick="javascript:WikEdEditButton(\'wikEdFixAll\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['fixRegExTypo'] + '" width="16" height="16" id="wikEdFixRegExTypo" alt="' + wikEdText['wikEdFixRegExTypo alt'] + '" title="' + wikEdText['wikEdFixRegExTypo title'] + '" onClick="javascript:WikEdEditButton(\'wikEdFixRegExTypo\');">'; html += '<br />'; html += '<img class="wikEdButton" src="' + wikEdImage['fixDash'] + '" width="16" height="16" id="wikEdFixDashes" alt="' + wikEdText['wikEdFixDashes alt'] + '" title="' + wikEdText['wikEdFixDashes title'] + '" onClick="javascript:WikEdEditButton(\'wikEdFixDashes\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['fixPunct'] + '" width="16" height="16" id="wikEdFixPunct" alt="' + wikEdText['wikEdFixPunct alt'] + '" title="' + wikEdText['wikEdFixPunct title'] + '" onClick="javascript:WikEdEditButton(\'wikEdFixPunct\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['fixMath'] + '" width="16" height="16" id="wikEdFixMath" alt="' + wikEdText['wikEdFixMath alt'] + '" title="' + wikEdText['wikEdFixMath title'] + '" onClick="javascript:WikEdEditButton(\'wikEdFixMath\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['fixChem'] + '" width="16" height="16" id="wikEdFixChem" alt="' + wikEdText['wikEdFixChem alt'] + '" title="' + wikEdText['wikEdFixChem title'] + '" onClick="javascript:WikEdEditButton(\'wikEdFixChem\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['fixUnits'] + '" width="16" height="16" id="wikEdFixUnits" alt="' + wikEdText['wikEdFixUnits alt'] + '" title="' + wikEdText['wikEdFixUnits title'] + '" onClick="javascript:WikEdEditButton(\'wikEdFixUnits\');">'; html += '</div>'; html += '<br style="clear: both;">'; // add html to buttons wrapper wikEdButtonsWrapper.innerHTML = html; wikEdButtonsFormat = document.getElementById('wikEdButtonsFormat'); wikEdButtonsFind = document.getElementById('wikEdButtonsFind'); wikEdButtonsFix = document.getElementById('wikEdButtonsFix'); wikEdButtonsControl = document.getElementById('wikEdButtonsControl'); wikEdCaseSensitive = document.getElementById('wikEdCaseSensitive'); wikEdRegExp = document.getElementById('wikEdRegExp'); wikEdFindAhead = document.getElementById('wikEdFindAhead'); wikEdFindText = document.getElementById('wikEdFindText'); wikEdReplaceText = document.getElementById('wikEdReplaceText'); // add submit buttons to submit wrapper var wpEditButtons = document.getElementById('wpSave').parentNode; wikEdSubmitButtonsWrapper.appendChild(wpEditButtons); // add preview box top bar to submit wrapper var buttonsPreview = document.createElement('div'); buttonsPreview.id = 'wikEdButtonsPreview'; buttonsPreview.className = 'wikEdButtonsPreview'; html = ''; html += '<img class="wikEdButton" src="' + wikEdImage['preview'] + '" width="16" height="16" id="wikEdPreview" alt="' + wikEdText['wikEdPreview alt'] + '" title="' + wikEdText['wikEdPreview title'] + '" onClick="javascript:WikEdButton(\'wikEdPreview\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['diff'] + '" width="16" height="16" id="wikEdDiff" alt="' + wikEdText['wikEdDiff alt'] + '" title="' + wikEdText['wikEdDiff title'] + '" onClick="javascript:WikEdButton(\'wikEdDiff\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['close'] + '" width="16" height="16" id="wikEdClose" alt="' + wikEdText['wikEdClose alt'] + '" title="' + wikEdText['wikEdClose title'] + '" onClick="javascript:WikEdButton(\'wikEdClose\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['scrollToButtons'] + '" width="16" height="16" id="wikEdScrollToButtons2" alt="' + wikEdText['wikEdScrollToButtons2 alt'] + '" title="' + wikEdText['wikEdScrollToButtons2 title'] + '" onClick="javascript:WikEdButton(\'wikEdScrollToButtons2\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['scrollToText'] + '" width="16" height="16" id="wikEdScrollToInput2" alt="' + wikEdText['wikEdScrollToInput2 alt'] + '" title="' + wikEdText['wikEdScrollToInput2 title'] + '" onClick="javascript:WikEdButton(\'wikEdScrollToInput2\');">'; buttonsPreview.innerHTML = html; wikEdSubmitWrapper.insertBefore(buttonsPreview, wikEdSubmitWrapper.firstChild); wikEdButtonsPreview = document.getElementById('wikEdButtonsPreview'); // add preview box and its bottom bar to preview wrapper html = ''; html += '<div id="wikEdPreviewBoxOuter" class="wikEdPreviewBoxOuter">'; html += '<div id="wikEdPreviewBox" class="wikEdPreviewBox">'; html += '</div>'; html += '</div>'; html += '<div id="wikEdButtonsPreview2" class="wikEdButtonsPreview2">'; html += '<img class="wikEdButton" src="' + wikEdImage['preview'] + '" width="16" height="16" id="wikEdPreview2" alt="' + wikEdText['wikEdPreview2 alt'] + '" title="' + wikEdText['wikEdPreview2 title'] + '" onClick="javascript:WikEdButton(\'wikEdPreview2\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['diff'] + '" width="16" height="16" id="wikEdDiff2" alt="' + wikEdText['wikEdDiff2 alt'] + '" title="' + wikEdText['wikEdDiff2 title'] + '" onClick="javascript:WikEdButton(\'wikEdDiff2\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['close'] + '" width="16" height="16" id="wikEdClose2" alt="' + wikEdText['wikEdClose2 alt'] + '" title="' + wikEdText['wikEdClose2 title'] + '" onClick="javascript:WikEdButton(\'wikEdClose2\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['scrollToButtons'] + '" width="16" height="16" id="wikEdScrollToButtons3" alt="' + wikEdText['wikEdScrollToButtons3 alt'] + '" title="' + wikEdText['wikEdScrollToButtons3 title'] + '" onClick="javascript:WikEdButton(\'wikEdScrollToButtons3\');">'; html += '<img class="wikEdButton" src="' + wikEdImage['scrollToText'] + '" width="16" height="16" id="wikEdScrollToInput3" alt="' + wikEdText['wikEdScrollToInput3 alt'] + '" title="' + wikEdText['wikEdScrollToInput3 title'] + '" onClick="javascript:WikEdButton(\'wikEdScrollToInput3\');">'; html += '</div>'; wikEdLocalPrevWrapper.innerHTML = html; wikEdPreviewBox = document.getElementById('wikEdPreviewBox'); wikEdButtonsPreview2 = document.getElementById('wikEdButtonsPreview2'); // add jump box to standard preview var wikiPreview = document.getElementById('wikiPreview'); if (wikiPreview != null) { if (wikiPreview.firstChild != null) { var buttonsJump = document.createElement('div'); buttonsJump.id = 'wikEdButtonsJump'; buttonsJump.className = 'wikEdButtonsJump'; html = ''; html += '<img class="wikEdButtonSolo" src="' + wikEdImage['scrollToButtons'] + '" width="16" height="16" id="wikEdScrollToButtons4" alt="' + wikEdText['wikEdScrollToButtons4 alt'] + '" title="' + wikEdText['wikEdScrollToButtons4 title'] + '" onClick="javascript:WikEdButton(\'wikEdScrollToButtons4\');">'; html += '<img class="wikEdButtonSolo" src="' + wikEdImage['scrollToText'] + '" width="16" height="16" id="wikEdScrollToInput4" alt="' + wikEdText['wikEdScrollToInput4 alt'] + '" title="' + wikEdText['wikEdScrollToInput4 title'] + '" onClick="javascript:WikEdButton(\'wikEdScrollToInput4\');">'; buttonsJump.innerHTML = html; wikiPreview.insertBefore(buttonsJump, wikiPreview.firstChild); wikEdButtonsJump = document.getElementById('wikEdButtonsJump'); } } // 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 var localPreview = document.createElement('button'); localPreview.type = 'button'; localPreview.id = 'wikEdLocalPreview'; localPreview.title = 'Show preview below'; localPreview.className = 'wikEdLocalPreview'; var localPreviewImg = document.createElement('img'); localPreviewImg.id = 'wikEdLocalPreviewImg'; localPreviewImg.src = wikEdImage['preview']; localPreviewImg.alt = 'Preview below'; localPreview.appendChild(localPreviewImg); var previewButton = document.getElementById('wpPreview'); previewButton.parentNode.insertBefore(localPreview, previewButton.nextSibling); // add local diff button next to submit button var localDiff = document.createElement('button'); localDiff.type = 'button'; localDiff.id = 'wikEdLocalDiff'; localDiff.title = 'Show current changes below'; localDiff.className = 'wikEdLocalDiff'; var localDiffImg = document.createElement('img'); localDiffImg.id = 'wikEdLocalDiffImg'; localDiffImg.src = wikEdImage['diff']; localDiffImg.alt = 'Changes below'; localDiff.appendChild(localDiffImg); var previewButton = document.getElementById('wpDiff'); previewButton.parentNode.insertBefore(localDiff, previewButton.nextSibling); // initialize image buttons WikEdButton('wikEdHighlightSyntax', null, wikEdHighlightSyntax); WikEdButton('wikEdUseWikEd', null, wikEdUseWikEd); WikEdButton('wikEdFullScreen', null, wikEdFullScreenMode); WikEdButton('wikEdUsing', null, wikEdUsing); WikEdButton('wikEdCaseSensitive', null, false); WikEdButton('wikEdRegExp', null, false); WikEdButton('wikEdFindAhead', null, wikEdFindAheadSelected); WikEdButton('wikEdPreview', null, false, 'wikEdButton'); WikEdButton('wikEdDiff', null, false, 'wikEdButton'); WikEdButton('wikEdClose', null, false, 'wikEdButton'); WikEdButton('wikEdPreview2', null, false, 'wikEdButton'); WikEdButton('wikEdDiff2', null, false, 'wikEdButton'); WikEdButton('wikEdClose2', null, false, 'wikEdButton'); if (wikEdRegExTypoFix == false) { document.getElementById('wikEdFixRegExTypo').className = 'wikEdButtonInactive'; } // no linebreak before minor edit checkbox if (wikEdNoLinebreak == true) { var wpMinoredit = document.getElementById('wpMinoredit'); var node = wpMinoredit.previousSibling; while (node != null) { if (node.tagName == 'BR') { node.parentNode.removeChild(node); break; } node = node.previousSibling; } } // add a clear summary button left to the summary input field var clearSummary = document.createElement('button'); clearSummary.type = 'button'; clearSummary.id = 'wikEdClearSummary'; clearSummary.className = 'wikEdClearSummary'; clearSummary.alt = wikEdText['wikEdClearSummary alt']; clearSummary.title = wikEdText['wikEdClearSummary title']; clearSummary.style.height = (wikEdSummaryText.clientHeight + 1) +'px'; // clear the summary onclick function clearSummary.onclick = function() { // 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(/^((\/\* .*? \*\/ )?).*/, '$1'); } return; } var clearSummaryImg = document.createElement('img'); clearSummaryImg.id = 'wikEdClearSummaryImg'; clearSummaryImg.src = wikEdImage['clearSummary']; clearSummaryImg.alt = 'Clear summary'; clearSummary.appendChild(clearSummaryImg); wikEdSummaryText.parentNode.insertBefore(clearSummary, wikEdSummaryText); // make the summary a combo box // style needs to be declared here so that it is not overridden by monobook.css wikEdSummaryText.style.width = 'auto'; wikEdSummaryText.className = 'wikEdSummaryText'; var summaryComboInput = document.createElement('span'); summaryComboInput.id = 'wikEdSummaryComboInput'; summaryComboInput.className = 'wikEdSummaryComboInput'; var summarySelect = document.createElement('select'); summarySelect.id = 'wikEdSummarySelect'; summarySelect.className = 'wikEdSummarySelect'; summarySelect.onchange = function() { WikEdChangeComboInput('summary'); } summarySelect.onfocus = function() { WikEdSetComboOptions('summary'); } summaryComboInput = wikEdSummaryText.parentNode.insertBefore(summaryComboInput, wikEdSummaryText); 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; } var wikEdHelpSpan = document.createElement('span'); wikEdHelpSpan.className = 'wikEdHelpSpan'; wikEdHelpSpan.innerHTML = wikEdHelpPageLink; editHelpParent.insertBefore(wikEdHelpSpan, editHelp.nextSibling); } // 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 frame events wikEdFrameDocument.addEventListener('keydown', WikEdKeyFrame, true); wikEdFrameDocument.addEventListener('keyup', WikEdKeyFrame, true); wikEdFrameDocument.addEventListener('keypress', WikEdKeyFrame, true); wikEdFrameDocument.addEventListener('mouseup', WikEdKeyFrame, true); // find ahead events wikEdFindText.addEventListener('keyup', WikEdFindAhead, true); // submit button events var saveButton = document.getElementById('wpSave'); var previewButton = document.getElementById('wpPreview'); var diffButton = document.getElementById('wpDiff'); var localPreview = document.getElementById('wikEdLocalPreview'); var localDiff = document.getElementById('wikEdLocalDiff'); // 'Save page' onclick function saveButton.onclick = function() { if (wikEdUseWikEd == true) { WikEdUpdateTextarea(); } // add "using wikEd" to summary var text = wikEdSummaryText.value; text = text.replace(/^[, ]+/, ''); text = text.replace(/[, ]+$/, ''); WikEdAddToHistory('summary'); if ( (wikEdUsing == true) && (text != '') ) { if (text.lastIndexOf(wikEdSummaryUsing) < 0) { text += ' ' + wikEdSummaryUsing; } } wikEdSummaryText.value = text; saveButton.onclick = null; saveButton.click(); return; }; // 'Show preview' onclick function previewButton.onclick = function() { if (wikEdUseWikEd == true) { WikEdUpdateTextarea(); } previewButton.onclick = null; previewButton.click(); return; }; // 'Show changes' onclick function diffButton.onclick = function() { if (wikEdFullScreenMode == true) { WikEdFullScreen(false); } if (wikEdUseWikEd == true) { WikEdUpdateTextarea(); } diffButton.onclick = null; diffButton.click(); return; }; // 'Show preview' image button onclick function localPreview.onclick = function() { WikEdButton('wikEdLocalPreview'); return; }; // 'Show changes' image button onclick function localDiff.onclick = function() { WikEdButton('wikEdLocalDiff'); return; }; // 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); } // reset error indicator WikEdSetLogo(); 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; } // // 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 (wikEdShowToolbar == true) { document.getElementById('toolbar').style.display = 'block'; } else { document.getElementById('toolbar').style.display = 'none'; } } wikEdButtonsFormat.style.display = 'block'; wikEdButtonsFind.style.display = 'block'; wikEdButtonsFix.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) { document.getElementById('toolbar').style.display = 'block'; } wikEdButtonsFormat.style.display = 'none'; wikEdButtonsFind.style.display = 'none'; wikEdButtonsFix.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(whichButton, toggleButton, setButton, classButton, doButton) { // get the button object var buttonObj = document.getElementById(whichButton); if (buttonObj == null) { alert('Unknown button \'' + whichButton + '\''); return; } // 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 wikEdInputWrapper = document.getElementById('wikEdInputWrapper'); var inputWrapperTop = WikEdGetOffsetTop(wikEdInputWrapper); window.scroll(0, inputWrapperTop); break; // align edit buttons with display top case 'wikEdScrollToButtons': case 'wikEdScrollToButtons2': case 'wikEdScrollToButtons3': case 'wikEdScrollToButtons4': var wikEdConsoleWrapper = document.getElementById('wikEdConsoleWrapper'); var consoleWrapperTop = WikEdGetOffsetTop(wikEdConsoleWrapper); window.scroll(0, consoleWrapperTop); break; // cycle through different font sizes case 'wikEdTextZoom': wikEdTextZoom = wikEdTextZoom / 1.2; if (wikEdTextZoom < 60) { wikEdTextZoom = Math.round(wikEdTextZoom * Math.pow(1.2, 4) ); } 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; // 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 buttonObj.style.cursor = 'pointer'; return; } // // WikEdEditButton: editing functions // used for buttons that require or change the text. More tome consuming than WikEdButton() function WikEdEditButton(whichButton, parameterArray) { // get the button object var buttonObj = document.getElementById(whichButton); // check if button is disabled if (buttonObj != null) { if (buttonObj.className == 'wikEdButtonInactive') { return; } } // remove active content WikEdRemoveElements(['script', 'object', 'applet', 'embed', 'textarea']); // get ranges to apply the changes to: // whole text, selection, cursor, word and line under cursor and selection var obj = {}; // setup whole object for the whole text obj.whole = {}; obj.whole.plainArray = []; obj.whole.plainNode = []; obj.whole.plainStart = []; obj.whole.from = 'whole'; // get 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); 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, ' '); obj.whole.range.setStartBefore(wikEdFrameBody.firstChild); obj.whole.range.setEndAfter(wikEdFrameBody.lastChild); // setup selection object for the selected text obj.selection = {}; obj.selection.from = 'selection'; // set selection range obj.sel = wikEdFrameWindow.getSelection(); obj.selection.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1); // copy range to document fragment var documentFragment = obj.selection.range.cloneContents(); // get selected text WikEdGetInnerHTML(obj.selection, documentFragment); obj.selection.code = obj.selection.html; WikEdRemoveHighlightingWikify(obj.selection); 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, ' '); // setup cursor object for the cursor position 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 = ''; // setup focusWord object for the word under the cursor 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(); // 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 respective word and line boundaries WikEdFindBoundaries(obj.focusWord, obj.focusLine, obj.whole, obj.cursor); WikEdFindBoundaries(obj.selectionWord, obj.selectionLine, obj.whole, obj.selection); // 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); 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); 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, ' '); // 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); 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); 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, ' '); // select the appropriate object to change (whole, selection, cursor, focusWord, focusLine, selectionWord, or selectionLine) obj.changed = {}; switch (whichButton) { // undo: whole case 'wikEdUndo': case 'wikEdRedo': obj.changed = obj.cursor; // dummy break; // whole text changes: whole case 'wikEdUndoAll': case 'wikEdRedoAll': 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': if (obj.selection.plain != '') { obj.changed = obj.selection; } else if (obj.focusWord.plain != '') { obj.changed = obj.focusWord; } else { obj.changed = obj.cursor; } break; // character formatting: selection / focusWord case 'wikEdCase': if (obj.selection.plain != '') { obj.changed = obj.selection; } else { obj.changed = obj.focusWord; } break; // update syntax highlighting: selection / whole case 'wikEdUpdateSyntax': if (obj.selection.plain != '') { obj.changed = obj.selection; } else { obj.changed = obj.whole; } break; // multiple line changes: selectionLine case 'wikEdDecreaseHeading': case 'wikEdIncreaseHeading': case 'wikEdBulletList': case 'wikEdNumberList': case 'wikEdIndentList': case 'wikEdDefinitionList': if (obj.selection.plain != '') { obj.changed = obj.selectionLine; } else { obj.changed = obj.focusLine; } break; // image: selectionWord (if text is selected) / cursor case 'wikEdImage': if (obj.selection.plain != '') { obj.changed = obj.selectionWord; } else { obj.changed = obj.cursor; } break; // table: selectionLine / cursor case 'wikEdTable': if (obj.selection.plain != '') { obj.changed = obj.selectionLine; } else { obj.changed = obj.cursor; } break; // wikify, textify: selection / whole case 'wikEdWikify': case 'wikEdTextify': if (obj.selection.plain != '') { obj.changed = obj.selection; } else { obj.changed = obj.whole; } break; // redirect: whole case 'wikEdRedirect': obj.changed = obj.whole; break; // character formatting: selection / focusWord case 'wikEdGetFind': case 'wikEdGetFindReplace': if (obj.selection.plain != '') { obj.changed = obj.selection; } else { obj.changed = obj.focusWord; } break; // find and replace: find value / selection / focusWord case 'wikEdFindPrev': case 'wikEdFindNext': case 'wikEdReplacePrev': case 'wikEdReplaceNext': if (obj.selection.plain != '') { obj.changed = obj.selection; } else if (obj.focusWord.plain != '') { obj.changed = obj.focusWord; } else { obj.changed.plain = null; } break; // replaceall: selection / whole case 'wikEdFindAll': case 'wikEdReplaceAll': if (obj.selection.plain != '') { obj.changed = obj.selection; } else { obj.changed = obj.whole; } break; // jump to top or bottom: dummy case 'wikEdUpdown': obj.changed = obj.cursor; //dummy break; // jump to position: dummy case 'wikEdPrevPos': case 'wikEdLastPos': obj.changed = obj.cursor; //dummy break; // fixing buttons: selection / whole case 'wikEdFixBasic': case 'wikEdfixUnicode': case 'wikEdFixAll': case 'wikEdFixHtml': case 'wikEdFixRegExTypo': if (obj.selection.plain != '') { obj.changed = obj.selection; } else { obj.changed = obj.whole } break; // fixing buttons: selection / focusLine case 'wikEdFixPunct': case 'wikEdFixMath': case 'wikEdFixUnits': case 'wikEdFixDashes': case 'wikEdFixCaps': case 'wikEdFixChem': if (obj.selection.plain != '') { obj.changed = obj.selection; } else { obj.changed = obj.focusLine; } break; // fixing buttons: selection / focusWord if (obj.selection.plain != '') { obj.changed = obj.selection; } else { obj.changed = obj.focusWord; } break; // source: selection / whole case 'wikEdSource': if (obj.selection.plain != '') { obj.changed = obj.selection; } else { obj.changed = obj.whole; } break; // insert tags: selection / focusWord / cursor case 'wikEdInsertTags': if (obj.selection.plain != '') { obj.changed = obj.selection; } else if (obj.focusWord.plain != '') { obj.changed = obj.focusWord; } else { obj.changed = obj.cursor; } break; // unknown edit function default: alert('Unknown edit function \'' + whichButton + '\''); // reset button to active, reset cursor if (buttonObj != null) { if (buttonObj.className != 'wikEdButtonInactive') { buttonObj.className = 'wikEdButton'; } } wikEdFrameBody.style.cursor = 'auto'; return; } // 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; break; // redo case 'wikEdRedo': WikEdFrameExecCommand('redo'); obj.changed.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1); obj.changed.plain = null; 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, '\'\'\'\'\''); 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, '\'\'\'\'\''); break; // underline case 'wikEdUnderline': if ( /<u>(.*?)<\/u>/i.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/<u>(.*?)<\/u>/g, '$1'); } else { obj.changed.plain = '<u>' + obj.changed.plain + '<\/u>'; obj.changed.plain = obj.changed.plain.replace(/(<u>)( *)(.*?)( *)(<\/u>)/, '$2$1$3$5$4'); } break; // strikethrough case 'wikEdStrikethrough': if ( /<s>(.*?)<\/s>/i.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/<s>(.*?)<\/s>/g, '$1'); } else { obj.changed.plain = '<s>' + obj.changed.plain + '<\/s>'; obj.changed.plain = obj.changed.plain.replace(/(<s>)( *)(.*?)( *)(<\/s>)/, '$2$1$3$5$4'); } break; // nowiki case 'wikEdNowiki': if ( /<nowiki>(.*?)<\/nowiki>/i.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/<nowiki>(.*?)<\/nowiki>/g, '$1'); } else { obj.changed.plain = '<nowiki>' + obj.changed.plain + '<\/nowiki>'; obj.changed.plain = obj.changed.plain.replace(/(<nowiki>)( *)(.*?)( *)(<\/nowiki>)/, '$2$1$3$5$4'); } break; // superscript case 'wikEdSuperscript': if ( /<sup>(.*?)<\/sup>/i.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/<sup>(.*?)<\/sup>/g, '$1'); } else { obj.changed.plain = '<sup>' + obj.changed.plain + '</sup>'; obj.changed.plain = obj.changed.plain.replace(/(<sup>)( *)(.*?)( *)(<\/sup>)/, '$2$1$3$5$4'); } break; // subscript case 'wikEdSubscript': if ( /<sub>(.*?)<\/sub>/i.test(obj.changed.plain) ) { obj.changed.plain = obj.changed.plain.replace(/<sub>(.*?)<\/sub>/g, '$1'); } else { obj.changed.plain = '<sub>' + obj.changed.plain + '</sub>'; obj.changed.plain = obj.changed.plain.replace(/(<sub>)( *)(.*?)( *)(<\/sub>)/, '$2$1$3$5$4'); } break; // toggle lowercase / uppercase case 'wikEdCase': // lowercase all uppercased text 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(); } 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'); } 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'); } break; // decrease heading level case 'wikEdDecreaseHeading': obj.changed.plain = obj.changed.plain.replace(/(^|\n)=(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1$2 $3 $2'); // decrease heading obj.changed.plain = obj.changed.plain.replace(/(^|\n)=(?!=) *([^\n]*?) *=+(?=\n|$)/g, '$1$2'); // remove heading obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1$2 $3 $2'); // adjust closing tags break; // increase heading level case 'wikEdIncreaseHeading': obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1=$2 $3 $2='); // increase heading obj.changed.plain = obj.changed.plain.replace(/(^|\n)([^=\n\s][^\n]*?)(?=\n|$)/g, '$1== $2 =='); // create new heading obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1$2 $3 $2'); // adjust closing tags break; // create bullet list case 'wikEdBulletList': obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g, function (p, p1) { p1 = p1.replace(/^ *([\*\#\:\;]*) */g, '*$1 '); p1 = p1.replace(/^(\*{4,})([\*\#\:\;]*)/g, '$2'); return(p1); } ); break; // create numbered list case 'wikEdNumberList': obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g, function (p, p1) { p1 = p1.replace(/^ *([\*\#\:\;]*) */g, '#$1 '); p1 = p1.replace(/^(\*{4,})([\*\#\:\;]*)/g, '$2'); return(p1); } ); break; // create indented list case 'wikEdIndentList': obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g, function (p, p1) { p1 = p1.replace(/^ *([\*\#\:\;]*) */g, ':$1 '); p1 = p1.replace(/^(\*{4,})([\*\#\:\;]*)/g, '$2'); return(p1); } ); 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': var objTextify = {}; // get inner html without wikifying if (obj.changed.from == 'whole') { WikEdGetInnerHTML(objTextify, wikEdFrameBody); } else { obj.selection.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1); var documentFragment = obj.selection.range.cloneContents(); WikEdGetInnerHTML(objTextify, documentFragment); } WikEdTextify(objTextify); obj.changed.plain = objTextify.plain; obj.changed.plain = obj.changed.plain.replace(/\n/g, '<br />'); 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 wikEdInputElement['summary'].value = WikEdAppendToSummary(wikEdInputElement['summary'].value, '#redirect [[' + linkTarget + ']]'); selectChange = false; break; // copy selection to find field case 'wikEdGetFind': wikEdInputElement['find'].value = obj.changed.plain; obj.changed.plain = null; 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; 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; // format the find and replace texts as regexp or plain text if (wikEdRegExp.checked == false) { findText = findText.replace(/([\\^\$\*\+\?\.\(\)\[\]\{\}\:\=\!\|\,\-])/g, '\\$1'); } // replace \n with newline character else { replaceText = replaceText.replace(/((^|[^\\])(\\\\)*)\\n/g, '$1\n'); } // set regexp flags var regExpFlags = 'g'; if ( ! wikEdCaseSensitive.checked ) { regExpFlags += 'i'; } // create regexp var regExpFind = new RegExp(findText, regExpFlags); // 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; } } // find all if (whichButton == 'wikEdFindAll') { ////////////////////////// set selection with multiple ranges obj.changed.plain = null; break; } // replace an existing selection else if ( (whichButton == 'wikEdReplacePrev') || (whichButton == 'wikEdReplaceNext') ) { if (regExpFind.test(obj.selection.plain)) { obj.changed.plain = obj.selection.plain.replace(regExpFind, replaceText); replacedFlag = true; } else { obj.changed.plain = null; } } else if ( (whichButton == 'wikEdFindNext') || (whichButton == 'wikEdFindPrev') ) { obj.changed.plain = null; } if ( (whichButton == 'wikEdFindNext') || (whichButton == 'wikEdFindPrev') || (whichButton == 'wikEdReplaceNext') || (whichButton == 'wikEdReplacePrev') ) { 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 the text 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') ) { WikEdAddToHistory('find'); } if ( (whichButton == 'wikEdReplacePrev') || (whichButton == 'wikEdReplaceNext') || (whichButton == 'wikEdReplaceAll') ) { WikEdAddToHistory('find'); WikEdAddToHistory('replace'); } 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) { WikEdFrameExecCommand('undo'); WikEdFrameExecCommand('redo'); wikEdLastPosObj = obj.cursor; } obj.changed.plain = null break; // jump back to last position case 'wikEdLastPos': if (wikEdLastPosObj != null) { obj.changed = wikEdLastPosObj; wikEdLastPosObj = 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); break; case 'wikEdFixPunct': WikEdFixPunct(obj.changed); break; case 'wikEdFixMath': WikEdFixMath(obj.changed); break; case 'wikEdFixChem': WikEdFixChem(obj.changed); break; case 'wikEdfixUnicode': WikEdFixUnicode(obj.changed); break; case 'wikEdFixUnits': WikEdFixUnits(obj.changed); break; case 'wikEdFixDashes': WikEdFixDashes(obj.changed); break; case 'wikEdFixHtml': WikEdFixHTML(obj.changed); 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; } break; case 'wikEdFixCaps': WikEdFixCaps(obj.changed); break; case 'wikEdFixAll': WikEdFixAll(obj.changed); 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, '>'); if ( (obj.changed.plain == '') && (sampleText.length > 0) ) { obj.changed.plain = tagOpen + sampleText + tagClose; } obj.changed.plain = tagOpen + obj.changed.plain + tagClose; break; // default default: alert('Unknown edit function \'' + whichButton + '\''); } // update the selection only, do not change the text if (obj.changed.plain == null) { 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) { if (plainText.indexOf('\n') < 0) { 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 frameSrollTop; if (obj.changed.from == 'whole') { frameSrollTop = 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') { wikEdFrameBody.scrollTop = frameSrollTop; 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) { if (plainText.indexOf('\n') < 0) { // function: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog) wikEdFrameWindow.find(plainText, true, true, false, false, false, false); } } } } // 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; } // // 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); // 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) var found = wikEdFrameWindow.find(findText, caseSensitive, backwards, false, false, false, false); if (found == false) { obj.changed.range.setStart(range.startContainer, range.startOffset); obj.changed.range.setEnd(range.endContainer, range.endOffset); obj.changed.range.collapse(backwards); } else { range = obj.sel.getRangeAt(obj.sel.rangeCount - 1); obj.changed.range.setStart(range.startContainer, range.startOffset); obj.changed.range.setEnd(range.endContainer, range.endOffset); } } // slow javascript regexp find and replace else { // perform find WikEdParseDOM(obj, wikEdFrameBody); var regExpMatch = []; // find next, search to the right if (backwards == false) { // set start position for search to right regExp.lastIndex = obj.plainFocus; // execute the regexp search to the right regExpMatch = regExp.exec(obj.plain); // collapse the selection to its end for no find if (regExpMatch == null) { obj.changed.range.setEnd(range.endContainer, range.endOffset); 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.setStart(range.startContainer, range.startOffset); obj.changed.range.collapse(true); } } // select the find if (regExpMatch != null) { i = 0; while ( (obj.plainStart[i + 1] <= regExpMatch.index) && (obj.plainStart[i + 1] != null) ) { i ++; } 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; } // // 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 (wikEdLastPosObj != 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 (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 (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 (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 - new tab adds spaces between number and units, makes units consistent // originally from User:Omegatron // function WikEdFixUnits(obj) { WikEdFixBasic(obj); // convert all ° into actual ° symbol obj.plain = obj.plain.replace(/°/g, '°'); // convert the word ohm(s) or the html entity into the actual Omega symbol (not the actual ohm symbol Ω) and make sure it's spaced obj.plain = obj.plain.replace(/(\d) ?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|μ|µ|µ|n|p|f|a|z|y)? ?(Ω|Ω|(ohm|Ohm)s?)([\s.,:;\'\"\/\)])/g, '$1 $2\u03a9$5'); // convert various micro symbols into the actual micro symbol, make sure it's spaced obj.plain = obj.plain.replace(/(\d) ?(μ|µ)(g|s|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|O|F|Wb|T|H|S|Bq|Gy|Sv|kat|°C|M)([\s.,:;\'\"\/\)])/g, '$1 µ$3$4'); // convert capital K to lowercase k in units obj.plain = obj.plain.replace(/(\d) ?K(g|s|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|O|F|Wb|T|H|S|Bq|Gy|Sv|kat|°C|M)([\s.,:;\'\"\/\)])/g, '$1 k$2$3'); // capitalize units correctly obj.plain = obj.plain.replace(/(\d) ?(khz)([ ,.])/gi, '$1 kHz$3'); obj.plain = obj.plain.replace(/(\d) ?(mhz)([ ,.])/gi, '$1 MHz$3'); obj.plain = obj.plain.replace(/(\d) ?(ghz)([ ,.])/gi, '$1 GHz$3'); obj.plain = obj.plain.replace(/(\d) ?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|μ|µ|µ|n|p|f|a|z|y)?(hz|HZ)([\s.,:;\'\"\/\)])/g, '$1 $2Hz$4'); obj.plain = obj.plain.replace(/(\d) ?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|μ|µ|µ|n|p|f|a|z|y)?(pa|PA)([\s.,:;\'\"\/\)])/g, '$1 $2Pa$4'); // add a space before dB obj.plain = obj.plain.replace(/(\d) ?(dB)([\s.,:;\'\"\/\)])/g, '$1 $2$3'); // add a space before any units that were missed before obj.plain = obj.plain.replace(/(\d) ?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|μ|µ|µ|n|p|f|a|z|y)?(g|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|O|F|Wb|T|H|S|Bq|Gy|Sv|kat|°C|M)([\s.,:;\'\"\/\)])/g, '$1 $2$3$4'); // separate one for seconds since they give a lot of false positives like "1970s". Only difference is mandatory prefix. obj.plain = obj.plain.replace(/(\d) ?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|μ|µ|µ|n|p|f|a|z|y)(s)([\s.,:;\'\"\/\)])/g, '$1 $2$3$4'); // bps or b/s or bits/s --> bit/s obj.plain = obj.plain.replace(/([KkMmGgTtPpEeYyZz])(bps|bits?\/s|b\/s)/g, '$1bit/s'); // Bps or byte/s or bytes/s --> B/s obj.plain = obj.plain.replace(/([KkMmGgTtPpEeYyZz])(Bps|bytes?\/s)/g, '$1B/s'); // after that, make capitalization correct obj.plain = obj.plain.replace(/K(bit|B)\/s/g, 'k$1/s'); obj.plain = obj.plain.replace(/m(bit|B)\/s/g, 'M$1/s'); obj.plain = obj.plain.replace(/g(bit|B)\/s/g, 'G$1/s'); obj.plain = obj.plain.replace(/t(bit|B)\/s/g, 'T$1/s'); obj.plain = obj.plain.replace(/e(bit|B)\/s/g, 'E$1/s'); obj.plain = obj.plain.replace(/y(bit|B)\/s/g, 'Y$1/s'); obj.plain = obj.plain.replace(/z(bit|B)\/s/g, 'Z$1/s'); // fix a common error obj.plain = obj.plain.replace(/mibi(bit|byte)/g, 'mebi$1'); return; } // // WikEdFixDashes: dash fixer - adds a tab that 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(/—/g, '—'); obj.plain = obj.plain.replace(/–/g, '–'); obj.plain = obj.plain.replace(/−/g, '\u2212'); // convert -- and em dashes with or without spaces to em dash surrounded by spaces obj.plain = obj.plain.replace(/([a-zA-Z\'\"â€\]\}\)]) *(--|—|—) *([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\'\"â€\]\}])( | )+(\u2212|–|–) +([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) ?(--?|—|—) ?([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 each (var tagNameStr in tagNameArray) { var elementArray = wikEdFrameDocument.getElementsByTagName(tagNameStr); for (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 (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 (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 (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) { if (obj.html != '') { // remove syntax highlighting WikEdRemoveHighlighting(obj); // wikify, don't allow many attributes if (obj.htmlCode == true) { WikEdWikifyHTML(obj, false); } } return; } // // WikEdWikifyHTML: // obj.html contains the text to be wikified // expects < > < > & spaces instead of \n instead of <br /> /* 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, ''); // 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 MediaWiki table of contents obj.html = obj.html.replace(/<table\b[^>]*?\bid=\"toc\"[^>]*>.*?<\/table>/g, ''); // remove MediaWiki print footer obj.html = obj.html.replace(/<div\b[^>]*?\bclass=\"printfooter\"[^>]*>[^<>\"]+\"<a\b[^>]*>[^<]+<\/a>\"<\/div> */g, ''); // remove MediaWiki category list tags regExp = /<div\b[^>]*\bid=\"catlinks\"[^>]*>(.*?)<\/div>/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'); } // remove comments obj.html = obj.html.replace(/<!--.*?-->/g, ''); // <hr> horizontal rule obj.html = obj.html.replace(/(\n|\u0000|\s)*<hr\b[^>]*>(\n|\u0000|\s)*/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(/<span class=\"editsection\">.*?<\/span> */g, ''); obj.html = obj.html.replace(/[\s\u0000]*<h1\b[^>]*>(.*?)<\/h1>[\s\u0000]*/g, '\u0000\u0000= $1 =\u0000\u0000'); obj.html = obj.html.replace(/[\s\u0000]*<h2\b[^>]*>(.*?)<\/h2>[\s\u0000]*/g, '\u0000\u0000== $1 ==\u0000\u0000'); obj.html = obj.html.replace(/[\s\u0000]*<h3\b[^>]*>(.*?)<\/h3>[\s\u0000]*/g, '\u0000\u0000=== $1 ===\u0000\u0000'); obj.html = obj.html.replace(/[\s\u0000]*<h4\b[^>]*>(.*?)<\/h4>[\s\u0000]*/g, '\u0000\u0000==== $1 ====\u0000\u0000'); obj.html = obj.html.replace(/[\s\u0000]*<h5\b[^>]*>(.*?)<\/h5>[\s\u0000]*/g, '\u0000\u0000===== $1 =====\u0000\u0000'); obj.html = obj.html.replace(/[\s\u0000]*<h6\b[^>]*>(.*?)<\/h6>[\s\u0000]*/g, '\u0000\u0000====== $1 ======\u0000\u0000'); obj.html = obj.html.replace(/<span\b[^>]*\bclass=\"mw-headline\">(.*?)<\/span> */g, '$1'); // remove <thead> <tbody> <tfoot> obj.html = obj.html.replace(/([\s\u0000])<\/?(thead|tbody|tfoot)\b[^>]*>[\s\u0000]*/g, '$1'); // remove <col></col> and <colgroup></colgroup> obj.html = obj.html.replace(/[\s\u0000]*<(col)\b[^>]*>.*?<\/\1>[\s\u0000]*/g, ''); obj.html = obj.html.replace(/[\s\u0000]*<(colgroup)\b[^>]*>.*?<\/\1>[\s\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|\u0000|<br\b[^>]*>)+/g, ''); p3 = p3.replace(/(\s|\u0000|<br\b[^>]*>)+$/g, ''); p3 = p3.replace(/<br\b[^>]*> */g, '<br />'); return(p1 + p3 + p4); } ); // remove table closing tags obj.html = obj.html.replace(/[\s\u0000]*<\/(tr|thead|tbody|tfoot)>[\s\u0000]*/g, ''); // <td> table cells obj.html = obj.html.replace(/[\s\u0000]*<td>[\s\u0000]*/g, '\u0000| '); obj.html = obj.html.replace(/[\s\u0000]*<(td) +([^>]*)>[\s\u0000]*/g, function (p, p1, p2) { p2 = WikEdSanitizeAttributes(p1, p2, relaxed); if (p2 == '') { return('\u0000| '); } else { return('\u0000|' + p2 + ' | '); } } ); // <th> table cells obj.html = obj.html.replace(/[\s\u0000]*<th>[\s\u0000]*/g, '\u0000| '); obj.html = obj.html.replace(/[\s\u0000]*<(th) +([^>]*)>[\s\u0000]*/g, function (p, p1, p2) { p2 = WikEdSanitizeAttributes(p1, p2, relaxed); if (p2 == '') { return('\u0000| '); } else { return('\u0000|' + p2 + ' | '); } } ); // <tr> table rows obj.html = obj.html.replace(/[\s\u0000]*<tr>[\s\u0000]*/g, '\u0000|-\u0000'); obj.html = obj.html.replace(/[\s\u0000]*<(tr) +([^>]*)>[\s\u0000]*/g, function (p, p1, p2) { return('\u0000|-' + WikEdSanitizeAttributes(p1, p2, relaxed) + '\u0000'); } ); // <caption> table caption obj.html = obj.html.replace(/[\s\u0000]*<caption>[\s\u0000]*/g, '\u0000|+ '); obj.html = obj.html.replace(/[\s\u0000]*<(caption) +([^>]*)>[\s\u0000]*/g, function (p, p1, p2) { p2 = WikEdSanitizeAttributes(p1, p2, relaxed); if (p2 == '') { return('\u0000|+ '); } else { return('\u0000|+' + p2 + ' | '); } } ); // remove closing tags obj.html = obj.html.replace(/\s*<\/(td|th|caption)>\s*/g, ''); // line breaks 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[1]; 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) { return('ISBN ' + regExpMatch[1]); } } } // 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[1]; 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 + ']]'); } } // ISBN link regExpStr = '^' + wikEdServer + wikEdScriptPath + 'index\\.php\\?.*?\\btitle=.*?&isbn=(\d+)'; regExp = new RegExp(regExpStr); regExpMatch = regExp.exec(linkAddr); if (regExpMatch != null) { return('ISBN ' + regExpMatch[1]); } // 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 />'); 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 and 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); } ); // 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) { // block elements // various blocks if (singleLine != true) { obj.html = obj.html.replace(/(<(blockquote|center|div|pre)\b.*?>)/gi, '<span class="wikEdBlock">$1'); obj.html = obj.html.replace(/(<\/(blockquote|center|div|pre)\b.*?>)/gi, '$1</span><!--wikEdBlock-->'); } // 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'); // 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(/(<hr>)/g, '<span class="wikEdHRInline">$1</span><!--wikEdHRInline-->'); // == headings obj.html = obj.html.replace(/(^|\n|<[^>]*>)(=+ *)([^\n]*?)( *=+ *)(\n|<[^>]*>|$)/g, function (p, p1, p2, p3, p4, p5) { 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">'; p5 = '</span><!--wikEdHeadingWp-->' + p5; } else { p1 = p1 + '<span class="wikEdHeading">'; p5 = '</span><!--wikEdHeading-->' + p5; } return(p1 + p2 + p3 + p4 + p5); } ); // 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(/(<table\b.*?>)/gi, '<span class="wikEdTableBlock">$1'); obj.html = obj.html.replace(/(<\/table\b.*?>)/gi, '$1</span><!--wikEdTableBlock-->'); } // <gallery> wiki markup if (singleLine != true) { obj.html = obj.html.replace(/(<(gallery)\b.*?>)/gi, '<span class="wikEdWiki">$1'); obj.html = obj.html.replace(/(<\/(gallery)\b.*?>)/gi, '$1</span><!--wikEdWiki-->'); } // various block tags obj.html = obj.html.replace(/(<\/?(blockquote|center|div|pre)\b.*?>)/gi, '<span class="wikEdBlockTag">$1</span><!--wikEdBlockTag-->'); // <p> ... </p> pairs with (wikEdBlockTag) and withhout attributes (wikEdUnknown) var isRemove = []; obj.html = obj.html.replace(/(<(\/?)p\b(.*?)>)/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 // <sup> </sub> <ins> <del> obj.html = obj.html.replace(/((<)sup\b.*?(>)(.*?)(<)\/sup\b.*?(>))/gi, '<span class="wikEdSuperscript">$1</span><!--wikEdSuperscript-->'); obj.html = obj.html.replace(/((<)sub\b.*?(>)(.*?)(<)\/sub\b.*?(>))/gi, '<span class="wikEdSubscript">$1</span><!--wikEdSubscript-->'); obj.html = obj.html.replace(/((<)(ins|u)\b.*?(>)(.*?)(<)\/(ins|u)\b.*?(>))/gi, '<span class="wikEdIns">$1</span><!--wikEdIns-->'); obj.html = obj.html.replace(/((<)(del|s|strike)\b.*?(>)(.*?)(<)\/(del|s|strike)\b.*?(>))/gi, '<span class="wikEdDel">$1</span><!--wikEdDel-->'); // various inline tags obj.html = obj.html.replace(/(<\/?(sub|sup|ins|u|del|s|strike|big|br|colgroup|code|font|small|span|tt|rb|rp|rt|ruby)\b.*?>)/gi, '<span class="wikEdInlineTag">$1</span><!--wikEdInlineTag-->'); // unsupported or not needed <> tags obj.html = obj.html.replace(/(<\/?)(\w+)(.*?\/?>)/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(/(<!--[^]*?-->)/g, '<span class="wikEdComment">$1</span><!--wikEdComment-->'); // <nowiki> <math> <noinclude> <includeonly> <ref> <references> wiki markup obj.html = obj.html.replace(/((<)(nowiki|math|gallery|noinclude|includeonly|ref|references)\b.*?(>)(.*?)(<)\/(nowiki|math|gallery|noinclude|includeonly|ref|references)\b.*?(>))/gi, '<span class="wikEdWiki">$1</span><!--wikEdWiki-->'); // 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) { 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); } ); // [[ ]] links, images, categories obj.html = obj.html.replace(/(\[\[)([^\]]*)(\]\])/g, function (p, p1, p2, p3) { // image ////////////// detect common uploads var regExpImg = new RegExp('^\\s*' + wikEdText['wikicode Image'] + '\\s*:', 'i'); var regExpCat = new RegExp('^\\s*' + wikEdText['wikicode Category'] + '\\s*:', 'i'); if (regExpImg.test(p2)) { var regExp = new RegExp('\\s*\\w+\\s*:\\s*' + wikEdText['wikicode Image'] + '\\s*:', 'i'); if (p2.match(regExp)) { p1 = '<span class="wikEdImageInter">' + p1; p3 = p3 + '</span><!--wikEdImageInter-->'; } else { p1 = '<span class="wikEdImage">' + p1; p3 = p3 + '</span><!--wikEdImage-->'; } p2 = p2.replace(/^(\s*)(.*:)+/, '$1<span class="wikEdInter">$2</span><!--wikEdInter-->'); p2 = p2.replace(/(\s*)([^>:\|]+)(\s*\|\s*|$)/, '$1<span class="wikEdImageName">$2</span><!--wikEdImageName-->$3'); p2 = p2.replace(/(\|\s*)(.*)/, function (p, p1, p2) { p2 = p2.replace(/(.*?)(\s*(\||$))/g, '<span class="wikEdImageText">$1</span><!--wikEdImageText-->$2'); return(p1 + p2); } ); } // category else 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(/(\|)/gi, '<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); } ); // #redirect obj.html = obj.html.replace(/(^|\n)(#)(redirect\b)/g, '$1<span class="wikEdWikiRedir">$3</span><!--wikEdWikiRedir-->'); /////////// blocks original place // <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(red|orange|yellow|fuchsia|white|lime|aqua|silver)\b)/g, '<span style="background-color: $1;" class="wikEdColors">$1</span><!--wikEdColors-->'); obj.html = obj.html.replace(/(\b(maroon|olive|purple|green|navy|teal|blue|black|gray)\b)/g, '<span style="color: white; background-color: $1;" class="wikEdColors">$1</span><!--wikEdColors-->'); // RGB colors obj.html = obj.html.replace(/(#[0-9a-fA-F]{6})([\s\'\";])/g, '<span style="background-color: $1;" class="wikEdColors">$1</span><!--wikEdColors-->$2'); obj.html = obj.html.replace(/(rgb\(\s*\d+,\s*\d+,\s*\d+\s*\))/gi, '<span style="background-color: $1;" class="wikEdColors">$1</span><!--wikEdColors-->'); // 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 ( (wikEdDisabled == false) && (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 wikEdInputWrapper = document.getElementById('wikEdInputWrapper'); 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 frameSrollTop = 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 = frameSrollTop; 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) { // get dom nodes var wikEdButtonsPreview = document.getElementById('wikEdButtonsPreview'); // 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('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 (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; wikEdSelectElement[field].style.width = (selectWidth - optionWidth + inputWidth - border) + 'px'; // delete dummy option if (dummy == true) { wikEdSelectElement[field].options[0] = null; } // set option widths to auto for (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('wikEdCaseSensitive', null, (option.text.charAt(0) == wikEdCheckMarker[true]) ); WikEdButton('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 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) { 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 (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 (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 (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 each (var childNode in currentNode.childNodes) { 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; } // // 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'] // supported chars in Mozilla and IE var 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) // var 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 var 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 var 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 var wikEdStrangeSpaces = { '31': 'non-breaking space', // \u00a0 '8194': 'en space', // \u2002 '8195': 'em space', // \u2003 '8201': 'thin space', // \u2009 }; /* </nowiki></pre> */