User:Ais523/wikEd.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
![]() | Documentation for this user script can be added at User:Ais523/wikEd. |
// This line is numbered 2 in IE
// This is a copy of [[User:Cacycle/wikEd.js]], so I have my own modifiable copy
/* {{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).
User:ais523 is trying to get it to work on IE.
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.12a (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="/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 || '/media/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 wikEdServer = wgServer || '';
var wikEdArticlePath = wgArticlePath || '';
var wikEdScriptPath = wgScriptPath || '';
wikEdServer = wikEdServer.replace(/(\W)/g, '\\$1');
wikEdArticlePath = wikEdArticlePath.replace(wgServer, '');
wikEdScriptPath = wikEdScriptPath.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');
if (wikEdTextarea == 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();
WEDBA(1);
for (var rule in wikEdMainCSS) {
mainStyle.addRule(rule, wikEdMainCSS[rule]);
}
WEDBA(2);
// 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
WEDBA(3);
// 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 = document.getElementById('editform');
wpEditform.insertBefore(wikEdInputWrapper, wpEditform.firstChild);
// fill the wrappers
WEDBA(4);
// 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);
WEDBA(5);
// 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;
WEDBA(6);
// 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 + '>;';
html += '</body></html>';
wikEdFrame = document.getElementById('wikEdFrame');
wikEdFrameWindow = wikEdFrame.contentWindow;
wikEdFrameDocument = wikEdFrameWindow.document;
wikEdFrameDocument.designMode = 'on';
wikEdFrameDocument.open();
wikEdFrameDocument.write(html);
wikEdFrameDocument.close();
wikEdFrameBody = wikEdFrameDocument.getElementById('wikEdFrameBody');
// add wikEd buttons to buttons wrapper
WEDBA(7);
// 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;">';
WEDBA(8);
// 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';
WEDBA(9);
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');
WEDBA(10);
// 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
WEDBA(11);
// add local preview button next to submit button
var localPreview = document.createElement('button');
//localPreview.type = 'button'; Property is read-only in IE but defaults to '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);
WEDBA(12);
// 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);
}
WEDBA(13);
// add frame stylesheet definition
wikEdFrameBody.style.fontSize = parseInt(wikEdTextZoom) + '%';
WEDBA(13.05);
var frameStyle = new WikEdStyleSheet(wikEdFrameDocument);
WEDBA(13.1);
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']);
if(ruleStyle!='') frameStyle.addRule(ruleName, ruleStyle);
}
WEDBA(13.3);
// copy the textarea content to the iframe
if (wikEdUseWikEd == true) {
WikEdUpdateFrame();
}
WEDBA(13.5);
// set frame events
if(wikEdFrameDocument.addEventListener)
{
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);
}
else
{
wikEdFrameDocument.attachEvent('keydown', WikEdKeyFrame);
wikEdFrameDocument.attachEvent('keyup', WikEdKeyFrame);
wikEdFrameDocument.attachEvent('keypress', WikEdKeyFrame);
wikEdFrameDocument.attachEvent('mouseup', WikEdKeyFrame);
// find ahead events
wikEdFindText.attachEvent('keyup', WikEdFindAhead, true);
}
WEDBA(14);
// 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();
WEDBA(15);
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;
}
// This line is numbered 2918
//
// 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
var tagNameI;
for(tagNameI in tagNameArray) {
var elementArray = wikEdFrameDocument.getElementsByTagName(tagNameArray[tagNameI]);
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-->');
// This line is numbered 4661
// <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
var childNode, childNodeI;
for(childNodeI in currentNode.childNodes) {
childNode=currentNode.childNodes[childNodeI];
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;
}
// WEDBA: tracing function that puts up alerts
function WEDBA(value) { alert('Initializing: phase '+value); }
// 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;
}
//This line is numbered 5856
//
// 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'], // Γ
['0394', 'Delta'], // Δ
['0395', 'Epsilon'],// Ε
['0396', 'Zeta'], // Ζ
['0397', 'Eta'], // Η
['0398', 'Theta'], // Θ
['0399', 'Iota'], // Ι
['039a', 'Kappa'], // Κ
['039b', 'Lambda'], // Λ
['039c', 'Mu'], // Μ
['039d', 'Nu'], // Ν
['039e', 'Xi'], // Ξ
['039f', 'Omicron'],// Ο
['03a0', 'Pi'], // Π
['03a1', 'Rho'], // Ρ
['03a3', 'Sigma'], // Σ
['03a4', 'Tau'], // Τ
['03a5', 'Upsilon'],// Υ
['03a6', 'Phi'], // Φ
['03a7', 'Chi'], // Χ
['03a8', 'Psi'], // Ψ
['03a9', 'Omega'], // Ω
['03b1', 'alpha'], // α
['03b2', 'beta'], // β
['03b3', 'gamma'], // γ
['03b4', 'delta'], // δ
['03b5', 'epsilon'],// ε
['03b6', 'zeta'], // ζ
['03b7', 'eta'], // η
['03b8', 'theta'], // θ
['03b9', 'iota'], // ι
['03ba', 'kappa'], // κ
['03bb', 'lambda'], // λ
['03bc', 'mu'], // μ
['03bd', 'nu'], // ν
['03be', 'xi'], // ξ
['03bf', 'omicron'],// ο
['03c0', 'pi'], // π
['03c1', 'rho'], // ρ
['03c2', 'sigmaf'], // ς
['03c3', 'sigma'], // σ
['03c4', 'tau'], // τ
['03c5', 'upsilon'],// υ
['03c6', 'phi'], // φ
['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'], // √
['221d', 'prop'], // ∝
['221e', 'infin'], // ∞
['2220', 'ang'], // ∠
['2227', 'and'], // ∧
['2228', 'or'], // ∨
['2229', 'cap'], // ∩
['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'], // ℘
['2111', 'image'], // ℑ
['211c', 'real'], // ℜ
['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>