User:Qo01rl/monobook.js

From Wikipedia, the free encyclopedia

If a message on your talk page led you here, please be wary of who left it. The code below could contain malicious content capable of compromising your account; if your account appears to be compromised, it will be blocked. If you are unsure whether the code is safe, you can ask at the appropriate village pump.
Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.
/* {{en:User:Cacycle/wikEd_template}} <pre clear="all"><nowiki>
 
/*
Name:      wikEd (wikEd.js)
Version:   wikEd 0.9.x (beta) (December, 2006). The code is currently under active development and might change rapidly
What:      Comfortable JavaScript editor for Wikipedia and other MediaWikis
Update:    press SHIFT-Reload to update to the newest version
Homepage:  http://en.wikipedia.org/wiki/User:Cacycle/wikEd
Help:      http://en.wikipedia.org/wiki/User:Cacycle/wikEd_help
Code:      http://en.wikipedia.org/wiki/User:Cacycle/wikEd.js
Author:    Cacycle (http://en.wikipedia.org/wiki/User:Cacycle)
Browsers:  The program works ONLY for Mozilla-based browsers (Mozilla, Mozilla Firefox, and Mozilla SeaMonkey)
License:   This code has been released into the public domain
Important: This file might have to be saved as UTF-16 in your editor to preserve the Unicode characters at the end
*/
 
// version information
var wikEdProgramVersion  = '0.9.12b (beta)';
var wikEdProgramDate     = 'December 2, 2006';
 
 
//
// user configurable variables
//
 
 
// user readable texts, preset as wikEdText[''] = '';
// copy changes to http://en.wikipedia.org/wiki/User:Cacycle/wikEd_international_en.js
var wikEdText = wikEdText || [];
WikEdInitObject(wikEdText, {
 
// logo
	'wikEdLogo alt':               'WikEd',
	'wikEdLogo title':             'WikEd {wikEdProgramVersion} ({wikEdProgramDate}) Click to disable',
	'wikEdLogo error alt':         'WikEd error',
	'wikEdLogo error title':       'Loading error - WikEd {wikEdProgramVersion} ({wikEdProgramDate}) Click to disable',
	'wikEdLogo disabled alt':      '(WikEd)',
	'wikEdLogo disabled title':    'Disabled - WikEd {wikEdProgramVersion} ({wikEdProgramDate}) Click to enable',
 
// standard preview jumper
	'wikEdScrollToButtons4 alt':   'Scroll buttons',
	'wikEdScrollToButtons4 title': 'Scroll to edit buttons',
	'wikEdScrollToInput4 alt':     'Scroll edit',
	'wikEdScrollToInput4 title':   'Scroll to edit window',
 
// formatting buttons, top row
	'wikEdUndo alt':               'Undo',
	'wikEdUndo title':             'Undo',
	'wikEdRedo alt':               'Redo',
	'wikEdRedo title':             'Redo',
	'wikEdBold alt':               'Bold',
	'wikEdBold title':             'Bold text',
	'wikEdItalic alt':             'Italic',
	'wikEdItalic title':           'Italic text',
	'wikEdUnderline alt':          'Underline',
	'wikEdUnderline title':        'Underline text',
	'wikEdStrikethrough alt':      'Strikethrough',
	'wikEdStrikethrough title':    'Strikethrough text',
	'wikEdNowiki alt':             'Nowiki',
	'wikEdNowiki title':           'Nowiki markup text',
	'wikEdSuperscript alt':        'Superscript',
	'wikEdSuperscript title':      'Superscript text',
	'wikEdSubscript alt':          'Subscript',
	'wikEdSubscript title':        'Subscript text',
	'wikEdCase alt':               'Case',
	'wikEdCase title':             'Toggle between lowercase, uppercase first, and uppercase',
	'wikEdUndoAll alt':            'Undo all',
	'wikEdUndoAll title':          'Undo all changes',
	'wikEdRedoAll alt':            'Redo all',
	'wikEdRedoAll title':          'Redo all changes',
	'wikEdUpdateSyntax alt':       'Syntax',
	'wikEdUpdateSyntax title':     'Update syntax highlighting',
 
// formatting buttons, bottom row
	'wikEdWikiLink alt':           'Link',
	'wikEdWikiLink title':         'Wiki link',
	'wikEdWebLink alt':            'Weblink',
	'wikEdWebLink title':          'External weblink',
	'wikEdDecreaseHeading alt':    'Heading-',
	'wikEdDecreaseHeading title':  'Decrease heading levels',
	'wikEdIncreaseHeading alt':    'Heading+',
	'wikEdIncreaseHeading title':  'Increase heading levels',
	'wikEdBulletList alt':         'Bullet list',
	'wikEdBulletList title':       'Bulleted list',
	'wikEdNumberList alt':         'Number list',
	'wikEdNumberList title':       'Numbered list',
	'wikEdIndentList alt':         'Indent list',
	'wikEdIndentList title':       'Indented list',
	'wikEdDefinitionList alt':     'Def list',
	'wikEdDefinitionList title':   'Definition list',
	'wikEdImage alt':              'Image',
	'wikEdImage title':            'Image',
	'wikEdTable alt':              'Table',
	'wikEdTable title':            'Table',
	'wikEdRedirect alt':           'Redirect',
	'wikEdRedirect title':         'Create redirect, deletes whole text',
	'wikEdWikify alt':             'Wikify',
	'wikEdWikify title':           'Wikify pasted content',
	'wikEdTextify alt':            'Textify',
	'wikEdTextify title':          'Convert pasted content to plain text',
 
// wikEd control buttons, top row
	'wikEdTextZoom alt':           'Text zoom',
	'wikEdTextZoom title':         'Text zoom cycling',
	'wikEdClearHistory alt':       'Clear history',
	'wikEdClearHistory title':     'Clear the find, replace, and summary history',
	'wikEdScrollToButtons alt':    'Scroll buttons',
	'wikEdScrollToButtons title':  'Scroll to edit buttons',
	'wikEdScrollToInput alt':      'Scroll edit',
	'wikEdScrollToInput title':    'Scroll to edit window',
 
// wikEd control buttons, bottom row
	'wikEdUseWikEd alt':           'Use wikEd',
	'wikEdUseWikEd title':         'Toggle between classic text area and wikEd',
	'wikEdHighlightSyntax alt':    'Syntax',
	'wikEdHighlightSyntax title':  'Toggle automatic syntax highlighting',
	'wikEdSource alt':             'Source',
	'wikEdSource title':           'Show the source code for testing purposes',
	'wikEdUsing alt':              'Using',
	'wikEdUsing title':            'Automatically add \'\'…using wikEd\'\' to summaries',
	'wikEdFullScreen alt':         'Fullscreen',
	'wikEdFullScreen title':       'Toggle the fullscreen mode',
 
// find and replace buttons, top row
	'wikEdGetFind alt':            'Get find',
	'wikEdGetFind title':          'Copy selection to find field (double click: copy selection to find and to replace field)',
	'wikEdFindAll alt':            'Find all',
	'wikEdFindAll title':          'Not yet implemented. Find all matches in whole text or selection',
	'wikEdFindPrev alt':           'Find prev',
	'wikEdFindPrev title':         'Find previous match',
 
	'wikEdFindNext alt':           'Find next',
	'wikEdFindNext title':         'Find next match',
	'wikEdUpdown alt':             'Jump up/down',
	'wikEdUpdown title':           'Jump to the top / bottom',
	'wikEdPrevPos alt':            'Jump prev',
	'wikEdPrevPos title':          'Jump to previously changed position',
	'wikEdLastPos alt':            'Jump next',
	'wikEdLastPos title':          'Jump back to last position',
 
// find and replace buttons, bottom row
	'wikEdGetFind alt':            'Get find + replace',
	'wikEdGetFind title':          'Copy selection to find and replace fields',
	'wikEdClearFind alt':          'Clear find',
	'wikEdClearFind title':        'Clear the find field (to search for selected text)',
	'wikEdReplaceAll alt':         'Replace all',
	'wikEdReplaceAll title':       'Not yet implemented. Replace all matches in whole text or selection',
	'wikEdReplacePrev alt':        'Replace prev',
	'wikEdReplacePrev title':      'Replace previous match',
 
	'wikEdReplaceNext alt':        'Replace next',
	'wikEdReplaceNext title':      'Replace next match',
	'wikEdCaseSensitive alt':      'Case sensitive',
	'wikEdCaseSensitive title':    'Search is case sensitive',
	'wikEdRegExp alt':             'RegExp',
	'wikEdRegExp title':           'Search field is a regular expression',
	'wikEdFindAhead alt':          'Find ahead',
	'wikEdFindAhead title':        'Find ahead as you type (case-insensitive non-regexp search)',
 
// fix buttons, top row
	'wikEdFixBasic alt':           'Fix basic',
	'wikEdFixBasic title':         'Fix blanks and empty lines, also done by other fixing functions',
	'wikEdFixHtml alt':            'Fix html',
	'wikEdFixHtml title':          'Fix html to wikicode',
	'wikEdFixCaps alt':            'Fix caps',
	'wikEdFixCaps title':          'Fix caps in headers and lists',
	'wikEdfixUnicode alt':         'Fix Unicode',
	'wikEdfixUnicode title':       'Fix Unicode character representations',
	'wikEdFixAll alt':             'Fix all',
	'wikEdFixAll title':           'Fix basic, html, capitalization, and Unicode',
	'wikEdFixRegExTypo alt':       'Fix typos',
	'wikEdFixRegExTypo title':     'Fix typos using the AutoWikiBrowser RegExTypoFixer rules',
 
// fix buttons, bottom row
	'wikEdFixDashes alt':          'Fix dashes',
	'wikEdFixDashes title':        'Fix dashes',
	'wikEdFixPunct alt':           'Fix puntuation',
	'wikEdFixPunct title':         'Fix spaces before puntuation',
	'wikEdFixMath alt':            'Fix math',
	'wikEdFixMath title':          'Fix math',
	'wikEdFixChem alt':            'Fix chem',
	'wikEdFixChem title':          'Fix chemical formulas',
	'wikEdFixUnits alt':           'Fix units',
	'wikEdFixUnits title':         'Fix units',
 
// summary buttons
	'wikEdClearSummary alt':       'Clear summary',
	'wikEdClearSummary title':     'Clear the summary field',
	'wikEdPresetSummary': [
		'copyedit', 'reply', 'article created', 'intro rewrite',
		'linkfix', 'fixing typos', 'removing linkspam', 'reverting test',
		'reverting vandalism', 'formatting source text', '{wikEdUsing}'
	],
	'wikEdSummaryUsing':           '…using [[User:Cacycle/wikEd|wikEd]]',
 
// submit buttons
	'wikEdLocalPreviewImg alt':    'Preview below',
	'wikEdLocalPreview title':     'Show preview below',
	'wikEdLocalDiffImg alt':       'Changes below',
	'wikEdLocalDiff title':        'Show current changes below',
	'wikEdHelpPageLink':           ' | <a href="http://en.wikipedia.org/wiki/User:Cacycle/wikEd_help" target="helpwindow">wikEd help</a>',
 
// preview and changes buttons, top
	'wikEdPreview alt':            'Preview title',
	'wikEdPreview title':          'Show preview below',
	'wikEdDiff alt':               'Changes title',
	'wikEdDiff title':             'Show current changes below',
	'wikEdClose alt':              'Close title',
	'wikEdClose title':            'Close preview box',
	'wikEdScrollToButtons2 alt':   'Scroll buttons',
	'wikEdScrollToButtons2 title': 'Scroll to edit buttons',
	'wikEdScrollToInput2 alt':     'Scroll edit',
	'wikEdScrollToInput2 title':   'Scroll to edit window',
 
// preview and changes buttons, bottom
	'wikEdPreview2 alt':           'Preview title',
	'wikEdPreview2 title':         'Show preview above',
	'wikEdDiff2 alt':              'Changes title',
	'wikEdDiff2 title':            'Show current changes above',
	'wikEdClose alt':              'Close title',
	'wikEdClose title':            'Close preview box',
	'wikEdScrollToButtons3 alt':   'Scroll buttons',
	'wikEdScrollToButtons3 title': 'Scroll to edit buttons',
	'wikEdScrollToInput3 alt':     'Scroll edit',
	'wikEdScrollToInput3 title':   'Scroll to edit window',
 
// formatting functions
	'image filename':              'filename',
	'image width':                 'width',
	'table caption':               'caption',
	'table heading':               'heading',
	'table cell':                  'cell',
	'redirect article link':       'article link',
 
// fixing functions
	'External links':              'External links',
	'See also':                    'See also',
	'References':                  'References',
 
// language specific wiki code
	'wikicode Image':              'Image',
	'wikicode Category':           'Category',
 
// shortened button texts
	'shortenedPreview':            'Preview',
	'shortenedChanges':            'Changes'
});
 
// edit-frame css rules, preset as wikEdFrameCSS[''] = '';
var wikEdFrameCSS = wikEdFrameCSS || [];
WikEdInitObject(wikEdFrameCSS, {
 
// frame body
	'.wikedFrameBody':   'background: #FFFFFF; margin: 0px; padding: 0.2em; overflow: -moz-scrollbars-vertical; overflow-x: auto; font-family: monospace;',
 
// syntax highlighting
	'.wikEdBlock':       'background-color: #e8e8e8;',
	'.wikEdBlockTag':    'color: #0000e0;',
	'.wikEdInlineTag':   'color: #0000e0;',
	'.wikEdUnknown':     'background-image: url({wikEdUnknown});',
	'.wikEdSubscript':   'position: relative; top: 0.3em;',
	'.wikEdSuperscript': 'position: relative; top: -0.3em;',
	'.wikEdBold':        'font-weight: bold;',
	'.wikEdComment':     'background-color: #fff0d0;',
	'.wikEdDel':         'text-decoration: line-through;',
	'.wikEdIns':         'text-decoration: underline;',
	'.wikEdItalic':      'font-style: italic;',
	'.wikEdRGB':         '',
 
// horizontal rule
	'.wikEdHR':          'background-color: #d0d0d0;',
	'.wikEdHRInline':    'background-color: #d0d0d0;',
 
// wiki code
	'.wikEdWiki':        'color: #0000e0;',
	'.wikEdWikiRedir':   'color: #0000e0; background-color: #ffffff; font-weight: bold;',
 
// headings
	'.wikEdHeading':     'background-color: #e0e0e0; font-weight: bold;',
	'.wikEdHeadingWp':   'background-color: #d8e0ff; font-weight: bold;',
 
// tables
	'.wikEdTableBlock':  'background-color: #e8e8e8;',
	'.wikEdTableLine':   'background-color: #e8e8e8;',
	'.wikEdTableTag':    'background-color: #e8e8e8; color: #0000e0;',
 
// list
	'.wikEdListBlock':   'background-color: #e8e8e8;',
	'.wikEdListLine':    'background-color: #f0f0f0',
	'.wikEdListTag':     'background-color: #e8e8e8; color: #0000e0; font-weight: bold;',
 
// space-pre
	'.wikEdSpaceBlock':  'background-color: #e8e8e8;',
	'.wikEdSpaceLine':   'background-color: #e8e8e8;',
	'.wikEdSpaceTag':    'color: #0000e0; font-weight: bold;',
 
// wiki links, images, categories, templates
	'.wikEdLinkTag':     'color: #0000e0;',
	'.wikEdLink':        '',
	'.wikEdImage':       'background-color: #d5ffaa;',
	'.wikEdCat':         'background-color: #d0d8ff;',
	'.wikEdTempl':       'background-color: #e0e8ff;',
 
// interlanguage
	'.wikEdInter':       '',
	'.wikEdLinkInter':   'background-color: #c8c8ff;',
	'.wikEdImageInter':  'background-color: #c8c8ff;',
	'.wikEdCatInter':    'background-color: #c8c8ff;',
	'.wikEdTemplInter':  'background-color: #c8c8ff;',
 
// name
	'.wikEdLinkName':    'color: #f00000; font-weight: bold;',
	'.wikEdImageName':   'font-weight: bold;',
	'.wikEdCatName':     'color: #f00000; font-weight: bold;',
	'.wikEdTemplName':   'color: #f00000; font-weight: bold;',
	'.wikEdURLLink':     'color: #f00000; font-weight: bold;',
 
// pasted html
	'.wikEdPastedHtml':  'background-color: #FFC080;',
 
// text and parameters
	'.wikEdLinkText':    'font-weight: bold;',
	'.wikEdImageText':   '',
	'.wikEdCatText':     '',
	'.wikEdTemplText':   '',
	'.wikEdURLText':     'font-weight: bold;',
 
// insert wikicode here
	'.wikEdInsertHere':  'background-color: orange; font-style: italic;',
 
// invisibles, control chars, and strange spaces
	'.wikEdTab':         'white-space: pre; background-image: url({wikEdTab}); background-position: right bottom; background-repeat: no-repeat;',
	'.wikEdTabPlain':    'white-space: pre;',
	'.wikEdCtrl':        'white-space: pre; background-image: url({wikEdCtrl}); background-position: left center; background-repeat: repeat-x; background-color: white;',
	'.wikEdCtrl:before': 'content: \'\u00a0\'',
	'.wikEdBlank':       'white-space: -moz-pre-wrap; background-image: url({wikEdBlank}); background-position: left center; background-repeat: repeat-x; background-color: white;'
});
 
// main window css rules, preset as wikEdMainCSS[''] = '';
var wikEdMainCSS = wikEdMainCSS || [];
WikEdInitObject(wikEdMainCSS, {
 
// combo input box
	'.wikEdCombo':                'font-size: smaller; padding-left: 0.1em; padding-right: 0.1em; margin-left: 0.1em; margin-right: 0.1em; height: 1.6em; vertical-align: bottom;',
 
// wikEd button areas
	'.wikEdButtonsFormat':        'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0.2em  0.6em 0 0    ; float: left;',
	'.wikEdButtonsFind':          'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0.2em  0.6em 0 0    ; float: left;',
	'.wikEdButtonsFix':           'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0.2em  0.6em 0 0    ; float: left',
	'.wikEdButtonsControl':       'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0.2em  0     0 0    ; float: right;',
	'.wikEdButtonsPreview':       'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: -0.2em 0     0 0.6em; float: right;',
	'.wikEdButtonsPreviewFull':   'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: -0.2em 0     0 0.6em; float: right;',
	'.wikEdButtonsPreview2':      'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0.2em  0     0.4em 0; float: right;',
	'.wikEdButtonsJump':          'padding: 0.1em; margin: 0 0 0 0.6em; float: right;',
 
// wikEd buttons
	'.wikEdButton':               'vertical-align: text-top; font-size: small; text-decoration: underline; margin: 1px 2px; padding: 0; background: #d4d0cc; border: 1px #d4d0cc solid; cursor: pointer;',
	'.wikEdButton:hover':         'background: #e4e0dd; border: 1px outset; cursor: pointer;',
	'.wikEdButton:active':        'background: #e4e0dc; border: 1px inset;  cursor: pointer;',
	'.wikEdButtonSolo':           'vertical-align: text-top; font-size: small; text-decoration: underline; margin: 1px 2px; padding: 0; background: #d4d0cc; border: 1px solid; border-color: white black black white; cursor: pointer;',
	'.wikEdButtonSolo:hover':     'background: #e4e0dd; cursor: pointer;',
	'.wikEdButtonChecked':        'vertical-align: text-top; font-size: small; text-decoration: none; margin: 1px 2px; padding: 0; background: #ccc8c3; border: 1px solid; border-color: black white white black; cursor: pointer;',
	'.wikEdButtonUnchecked':      'vertical-align: text-top; font-size: small; text-decoration: none; margin: 1px 2px; padding: 0; background: #ddd8d3; border: 1px solid; border-color: white black black white; cursor: pointer;',
	'.wikEdButtonPressed':        'vertical-align: text-top; font-size: small; text-decoration: none; margin: 1px 2px; padding: 0; background: #ccc8c3; border: 1px solid; border-color: black white white black; cursor: wait;',
	'.wikEdButtonInactive':       'vertical-align: text-top; font-size: small; text-decoration: underline; margin: 1px 2px; padding: 0; background: #c0c0c0; border: 1px #b0b0b0 solid; cursor: not-allowed',
	'.wikEdLocalPreview':         'vertical-align: top; margin: 0 0.33em 0 0.15em; padding: 0;',
	'.wikEdLocalDiff':            'vertical-align: top; margin: 0 0.33em 0 -0.18em; padding: 0;',
	'.wikEdClearSummary':         'vertical-align: middle; margin: 0 0.1em 0 0.5em; padding: 0 0 0.2em 0;',
 
// preview box
	'.wikEdPreviewBoxOuter':      'clear: both; margin-top: 0.5em; margin-bottom: 0; border-width: 1px; border-style: solid; border-color: #808080 #d0d0d0 #d0d0d0 #808080;',
	'.wikEdPreviewBox':           'background-color: #f9f9f9; padding: 5px; border-width: 1px; border-style: solid; border-color: #404040 #ffffff #ffffff #404040;',
 
// find field
	'.wikEdFindComboInput':       'position: relative; padding: 0; margin: 0 0.2em; font-style: normal;',
	'#wikEdFindText':             'height: 1.4em; font-family: monospace; padding: 0; margin: 0; position: absolute; left: 0; top: 0; z-index: 2;',
	'#wikEdFindSelect':           'height: 1.5em; font-family: monospace; border: none; padding: 0; margin: 0; position: relative; vertical-align: baseline; z-index: 1;',
 
// replace field
	'.wikEdReplaceComboInput':    'position: relative; padding: 0; margin: 0 0.2em; font-style: normal;',
	'#wikEdReplaceText':          'height: 1.4em; font-family: monospace; padding: 0; margin: 0; position: absolute; left: 0; top: 0; z-index: 2;',
	'#wikEdReplaceSelect':        'height: 1.5em; font-family: monospace; border: none; padding: 0; margin: 0; position: relative; vertical-align: baseline; z-index: 1;',
 
// summary field
	'.wikEdSummaryComboInput':    'position: relative;',
	'.wikEdSummaryText':          'padding: 0; margin: 0; position: absolute; left: 0; top: 0; z-index: 2;',
	'.wikEdSummarySelect':        'border: none; padding: 0; margin: 0; position: relative; vertical-align: middle; z-index: 1;',
 
// space around submit buttons
	'.editButtons':               'margin-top: 0.5em; margin-bottom: 0.5em;',
 
// frame
	'.wikEdFrameOuter':           'width: 100%; margin-top: 0.5em; margin-bottom: 0.1em; border-width: 1px; border-style: solid; border-color: #808080 #d0d0d0 #d0d0d0 #808080;',
	'.wikEdFrameInner':           'padding: 0; border-width: 1px; border-style: solid; border-color: #404040 #ffffff #ffffff #404040;',
	'.wikEdFrame':                'width: 100%; padding: 0; margin: 0; border: none;',
 
// summary
	'.wikEdSummaryWrapper':       'margin: 0.25em 0 0.4em 0;',
	'#wpSummaryLabel':            'margin-right: 0.2em',
	'.editOptions':               'position: relative; top: 0.1em;',
 
// input wrapper
	'.wikEdInputWrapper':         'z-index: 100;',
	'.wikEdInputWrapperFull':     'position: fixed; top: 0; left: 0; right: 0; padding: 4px; background: white; z-index: 100;',
 
// other wrappers
	'.wikEdToolbarWrapper':       '',
	'.wikEdTextareaWrapper':      '',
	'.wikEdFrameWrapper':         '',
	'.wikEdConsoleWrapper':       '',
	'.wikEdButtonsWrapper':       '',
	'.wikEdSummaryInputWrapper':  'display: inline;',
	'.wikEdSummaryOptions':       'display: inline;',
	'.wikEdSubmitWrapper':        '',
	'.wikEdSubmitButtonsWrapper': '',
	'.wikEdLocalPrevWrapper':     '',
	'.wikEdInsertWrapper':        '',
 
// various
	'.wikEdHelpSpan':             '',
	'#editpage-specialchars':     'clear: both;'
});
 
// use local copies of images for testing (set to true in local copy of edit page)
var wikEdUseLocalImages = wikEdUseLocalImages || false;
 
// path to local images for testing
var wikEdImagePathLocal = wikEdImagePathLocal || 'file:///D:/wikEd/images/';
 
// path to images
var wikEdImagePath = wikEdImagePath || 'http://upload.wikimedia.org/wikipedia/commons/';
 
// image filenames
var wikEdImage = wikEdImage || [];
 
// image URLs, preset as wikEdImage[''] = '';
WikEdInitObject(wikEdImage, {
	'blank':           '5/51/WikEd_blank.png',
	'bold':            '5/59/WikEd_bold.png',
	'bulletList':      '6/62/WikEd_bullet_list.png',
	'case':            'a/aa/WikEd_case.png',
	'caseSensitive':   '0/0d/WikEd_case_sensitive.png',
	'clearFind':       'f/f0/WikEd_clear_find.png',
	'clearHistory':    'c/c8/WikEd_clear_history.png',
	'clearSummary':    '2/2c/WikEd_clear_summary.png',
	'close':           '9/97/WikEd_close.png',
	'ctrl':            '1/10/WikEd_ctrl.png',
	'decreaseHeading': '7/72/WikEd_decrease_heading.png',
	'definitionList':  'f/f5/WikEd_definition_list.png',
	'diff':            'd/db/WikEd_diff.png',
	'disabled':        '0/07/WikEd_disabled.png',
	'error':           '3/3e/WikEd_error.png',
	'findAhead':       '3/34/WikEd_find_ahead.png',
	'findAll':         '7/75/WikEd_find_all.png',
	'findNext':        'a/ad/WikEd_find_next.png',
	'findPrev':        'f/f5/WikEd_find_prev.png',
	'fixAll':          '8/86/WikEd_fix_all.png',
	'fixBasic':        '3/30/WikEd_fix_basic.png',
	'fixCaps':         '0/00/WikEd_fix_caps.png',
	'fixUnicode':      'd/d4/WikEd_fix_unicode.png',
	'fixChem':         'e/e7/WikEd_fix_chem.png',
	'fixDash':         'e/e5/WikEd_fix_dash.png',
	'fixHtml':         '0/05/WikEd_fix_html.png',
	'fixMath':         '3/3f/WikEd_fix_math.png',
	'fixPunct':        'd/db/WikEd_fix_punct.png',
	'fixRegExTypo':    '9/94/WikEd_fix_reg-ex-typo.png',
	'fixUnits':        '6/69/WikEd_fix_units.png',
	'textZoom':        '7/71/WikEd_font_size.png',
	'fullScreen':      'd/d3/WikEd_fullscreen.png',
	'getFind':         '9/96/WikEd_get_selection.png',
	'highlightSyntax': '6/67/WikEd_syntax.png',
	'image':           '3/37/WikEd_image.png',
	'increaseHeading': '5/50/WikEd_increase_heading.png',
	'indentList':      '7/7a/WikEd_indent_list.png',
	'italic':          'd/d4/WikEd_italic.png',
	'jumpTopBottom':   '5/5d/WikEd_jump_top_bottom.png',
	'lastPos':         '5/54/WikEd_jump_next.png',
	'logo':            '6/67/WikEd_logo.png',
	'nowiki':          '5/5a/WikEd_nowiki.png',
	'numberList':      '3/3b/WikEd_number_list.png',
	'prevPos':         'c/c7/WikEd_jump_prev.png',
	'preview':         '3/31/WikEd_preview.png',
	'redirect':        'f/fa/WikEd_redirect.png',
	'redo':            'd/d7/WikEd_redo.png',
	'redoAll':         '2/2d/WikEd_redo_all.png',
	'regExp':          '6/6a/WikEd_regexp.png',
	'replaceAll':      '2/2a/WikEd_replace_all.png',
	'replaceNext':     'b/b0/WikEd_replace_next.png',
	'replacePrev':     'a/a1/WikEd_replace_prev.png',
	'scrollToButtons': '0/01/WikEd_align_buttons.png',
	'scrollToText':    '1/13/WikEd_align_top.png',
	'source':          '0/02/WikEd_source.png',
	'strikethrough':   '0/06/WikEd_strikethrough.png',
	'subscript':       '9/9e/WikEd_subscript.png',
	'superscript':     'b/bf/WikEd_superscript.png',
	'tab':             'e/e7/WikEd_tab.png',
	'table':           'b/bd/WikEd_table.png',
	'textify':         'c/cd/WikEd_textify.png',
	'underline':       '2/21/WikEd_underline.png',
	'undo':            'e/e6/WikEd_undo.png',
	'undoAll':         '0/08/WikEd_undo_all.png',
	'unknown':         '8/8a/WikEd_unknown.png',
	'updateSyntax':    '6/67/WikEd_syntax.png',
	'useWikEd':        '6/67/WikEd_logo.png',
	'using':           'e/e0/WikEd_using.png',
	'webLink':         '1/16/WikEd_weblink.png',
	'wikify':          '9/9f/WikEd_wikify.png',
	'wikiLink':        '2/21/WikEd_wikilink.png'
});
 
// history length for find, replace, and summary fields
var wikEdHistoryLength = wikEdHistoryLength || [];
wikEdHistoryLength['find'] = 10;
wikEdHistoryLength['replace'] = 10;
wikEdHistoryLength['summary'] = 10;
 
// presets for combo input fields dropdown options, {wikEdUsing} appends a link to this script
var wikEdComboPresetOptions = wikEdComboPresetOptions || [];
wikEdComboPresetOptions['summary'] = wikEdComboPresetOptions['summary'] || wikEdText['wikEdPresetSummary'];
 
// text for summary link to this script
var wikEdSummaryUsing = wikEdSummaryUsing || wikEdText['wikEdSummaryUsing'];
 
// expiration time span for history cookies in seconds
var wikEdCookieExpireSec = wikEdCookieExpireSec || (30 * 24 * 60 * 60);
 
// find ahead as you type checkbox preset
var wikEdFindAheadSelected = wikEdFindAheadSelected || true;
 
// highlight syntax preset (set to false by single-session cookie wikEdSyntaxOff)
var wikEdHighlightSyntax = wikEdHighlightSyntax || true;
 
// enable wikEd preset (set to false by single-session cookie wikEdUseClassic)
var wikEdUseWikEd = wikEdUseWikEd || true;
 
// add '...using wikEd' to summary preset (set to true by single-session cookie wikEdSummaryUsing)
var wikEdUsing = wikEdUsing || false;
 
// fullscreen mode preset (set to true by single-session cookie wikEdFullscreen)
var wikEdFullScreenMode = wikEdFullScreenMode || false;
 
// initial text zoom for edit window (percentage)
var wikEdTextZoom = wikEdTextZoom || 100;
 
// remove invisible syntax highlighting comments after closing tag
var wikEdRemoveHighlightComments = wikEdRemoveHighlightComments || true;
 
// show the edit toolbar when the rich-text edit-frame is active
var wikEdShowToolbar = wikEdShowToolbar || true;
 
// show the text-to-source button for testing purposes
var wikEdShowSourceButton = wikEdShowSourceButton || false;
 
// remove linebreak before minor edit checkbox
var wikEdNoLinebreak = wikEdNoLinebreak || true;
 
// This is the wikEd help page link to be displayed after the editing help link, an empty string disables the link
var wikEdHelpPageLink = wikEdHelpPageLink || wikEdText['wikEdHelpPageLink'];
 
// use RegExTypoFix (http://en.wikipedia.org/wiki/User:Mboverload/RegExTypoFix), needs Wikipedia:AutoWikiBrowser/typos.js
var wikEdRegExTypoFix = wikEdRegExTypoFix || true;
 
 
//
// end of user configurable variables
//
 
 
// global variables
 
var wikEdLoaded = wikEdLoaded || false;
var wikEdDisabled = false;
 
// history
var wikEdFieldHist = [];
var wikEdCookieName = [];
var wikEdInputElement = [];
var wikEdSelectElement = [];
 
var wikEdCheckMarker = [];
wikEdCheckMarker[true] = '\u2022';
wikEdCheckMarker[false] = '\u22c5';
 
// cache the parsed DOM object
var wikEdFrameDOMCache = null;
 
// undo all, redo all
var wikEdOrigVersion = '';
var wikEdLastVersion = null;
 
// global dom elements
var wikEdLogo = {};
var wikEdLogoList = {};
 
var wikEdTextarea = {};
var wikEdFrame = {};
var wikEdFrameBody = {};
var wikEdFrameDocument = {};
var wikEdFrameWindow = {};
 
var wikEdInputWrapper = {};
var wikEdToolbarWrapper = {};
var wikEdTextareaWrapper = {};
var wikEdFrameWrapper = {};
var wikEdConsoleWrapper = {};
var wikEdButtonsWrapper = {};
var wikEdSummaryWrapper = {};
var wikEdSummaryInputWrapper = {};
var wikEdSummaryOptions = {};
var wikEdSubmitWrapper = {};
var wikEdSubmitButtonsWrapper = {};
var wikEdLocalPrevWrapper = {};
var wikEdInsertWrapper = {};
 
var wikEdButtonsFormat = {};
var wikEdButtonsFind = {};
var wikEdButtonsFix = {};
var wikEdButtonsControl = {};
var wikEdButtonsPreview = {};
var wikEdPreviewBox = {};
var wikEdButtonsPreview2 = {};
var wikEdButtonsJump = {};
 
var wikEdCaseSensitive = {};
var wikEdRegExp = {};
var wikEdFindAhead = {};
 
var wikEdFindText = {};
var wikEdReplaceText = {};
var wikEdSummaryText = {};
 
// various
var wikEdTextareaHeight;
var wikEdLastPosObj = null;
 
// counters
var i;
var j;
 
// wiki file paths for use in regexps
var wgServer = wgServer || '';
var wgArticlePath = wgArticlePath || '';
var wgScriptPath = wgScriptPath || '';
var wikEdServer = wgServer.replace(/(\W)/g, '\\$1');
var wikEdArticlePath = wgArticlePath.replace(wgServer, '');
var wikEdScriptPath = wgScriptPath.replace(wgServer, '');
wikEdArticlePath = wikEdArticlePath.replace(/\$1$/, '');
wikEdScriptPath = wikEdScriptPath.replace(/\/?$/, '/');;
wikEdArticlePath = wikEdArticlePath.replace(/(\W)/g, '\\$1');
wikEdScriptPath = wikEdScriptPath.replace(/(\W)/g, '\\$1');
 
// add setup routine to addOnloadHook
if (window.addOnloadHook != null) {
	addOnloadHook(WikEdSetup);
}
 
 
//
// WikEdInitObject: initialize object, keep pre-defined values
//
 
function WikEdInitObject(array, preset) {
 
	for (var key in preset) {
		if (array[key] == null) {
			array[key] = preset[key];
		}
	}
	return;
}
 
 
//
// insertTags: override the insertTags function in wikibits.js, used for the standard button toolbar
//
 
function insertTags(tagOpen, tagClose, sampleText) {
 
	if (wikEdUseWikEd == true) {
		WikEdEditButton('wikEdInsertTags', [tagOpen, tagClose, sampleText]);
	}
 
//   apply tagOpen / tagClose to selection in textarea,
//   use sampleText instead of selection if there is none
//   taken from wikibits.js
	else {
		if (wikEdTextarea.selectionStart || wikEdTextarea.selectionStart == '0') {
			var replaced = false;
			var startPos = wikEdTextarea.selectionStart;
			var endPos = wikEdTextarea.selectionEnd;
			if (endPos - startPos) {
				replaced = true;
			}
			var scrollTop = wikEdTextarea.scrollTop;
			var myText = (wikEdTextarea.value).substring(startPos, endPos);
			if (! myText) {
				myText = sampleText;
			}
 
// exclude ending space char, if any
			if (myText.charAt(myText.length - 1) == ' ') {
				subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + ' ';
			}
			else {
				subst = tagOpen + myText + tagClose;
			}
			wikEdTextarea.value = wikEdTextarea.value.substring(
				0, startPos) + subst + wikEdTextarea.value.substring(endPos, wikEdTextarea.value.length
			);
			wikEdTextarea.focus();
 
// set new selection
			if (replaced) {
				var cPos = startPos+(tagOpen.length + myText.length + tagClose.length);
				wikEdTextarea.selectionStart = cPos;
				wikEdTextarea.selectionEnd = cPos;
			}
			else {
				wikEdTextarea.selectionStart = startPos + tagOpen.length;
				wikEdTextarea.selectionEnd = startPos + tagOpen.length + myText.length;
			}
			wikEdTextarea.scrollTop = scrollTop;
		}
 
// reposition cursor if possible
		if (wikEdTextarea.createTextRange) {
			wikEdTextarea.caretPos = document.selection.createRange().duplicate();
		}
	}
 
	return;
}
 
 
//
// WikEdSetup: setup routine, called on page load
//
 
function WikEdSetup(scrollToText) {
 
	var html = '';
 
// add image path to image filename
	if (wikEdLogo.id == null) {
		if (wikEdUseLocalImages == true) {
 
// remove MediaWiki path prefixes
			for (i in wikEdImage) {
				wikEdImage[i] = wikEdImagePathLocal + wikEdImage[i].replace(/^[0-9a-f]+\/[0-9a-f]+\//, '');
			}
		}
		else {
			for (i in wikEdImage) {
				wikEdImage[i] = wikEdImagePath + wikEdImage[i];
			}
		}
 
// insert logo into personal toolbar
		wikEdLogo = document.createElement('img');
		wikEdLogo.id = 'wikEdLogoImg';
		wikEdLogo.onclick = WikEdMainSwitch;
 
		wikEdLogoList = document.createElement('li');
		wikEdLogoList.id = 'wikEdLogoList';
		wikEdLogoList.appendChild(wikEdLogo);
 
		var personalTools = document.getElementById('p-personal');
		if (personalTools != null) {
			personalTools.getElementsByTagName('ul')[0].appendChild(wikEdLogoList);
		}
	}
 
// check if disabled
	var cookie = WikEdGetCookie('wikEdDisabled');
	if (cookie != '') {
		wikEdDisabled = true;
		WikEdSetLogo();
		return;
	}
 
// check if setup was already run
	if (wikEdLoaded == true) {
		return;
	}
	wikEdLoaded = true;
 
// set error logo
	WikEdSetLogo('error');
 
// at the moment this works only for mozilla browsers (Mozilla, Mozilla Firefox, Mozilla SeaMonkey)
	if (navigator.appName == null) {
		return;
	}
	var nameMatch = navigator.appName.match(/Netscape/i);
	if (nameMatch == null) {
		return;
	}
	var name = nameMatch[0];
	if ( (name == null) || (name == '') ) {
		return;
	}
	var version = navigator.appVersion.match(/\d+(\.\d+)/)[0];
	if ( (version == null) || (version < 5.0) ) {
		return;
	}
 
// check if this is an edit page
	wikEdTextarea = document.getElementById('wpTextbox1');
	var wpEditform = document.getElementById('editform');
	if ( (wikEdTextarea == null) || (wpEditform == null) ) {
 
// reset error indicator
		WikEdSetLogo();
		return;
	}
 
// check if RegExTypoFix is available
	if (typeof(AWRegExTypoFix) != 'function') {
		wikEdRegExTypoFix = false;
	}
 
// get initial textarea height
	wikEdTextareaHeight = wikEdTextarea.offsetHeight;
 
// setup the undo buffers and save the original text for local changes view
	wikEdOrigVersion = wikEdTextarea.value;
 
// add stylesheet definitions
	var mainStyle = new WikEdStyleSheet();
	for (var rule in wikEdMainCSS) {
		mainStyle.addRule(rule, wikEdMainCSS[rule]);
	}
 
// get button settings from cookies
	var cookie = WikEdGetCookie('wikEdSummaryUsing');
	if (cookie != '') {
		wikEdUsing = true;
	}
 
	cookie = WikEdGetCookie('wikEdUseClassic');
	if (cookie != '') {
		wikEdUseWikEd = false;
	}
 
	cookie = WikEdGetCookie('wikEdSyntaxOff');
	if (cookie != '') {
		wikEdHighlightSyntax = false;
	}
 
	cookie = WikEdGetCookie('wikEdFullscreen');
	if (cookie != '') {
		wikEdFullScreenMode = true;
	}
 
	if (window.location.search.match('wikedpreview') != null) {
		wikEdFullScreenMode = false;
	}
 
// preset frame related styles to avoid browser crashes
	var styleFrameWrapperPosition;
	var styleFrameWrapperVisibility;
	var styleFrameBody;
	if (wikEdUseWikEd == true) {
		styleFrameBody = 'style="display: block;" ';
		styleFrameWrapperPosition = 'static';
		styleFrameWrapperVisibility = 'visible';
		styleTextareaWrapperPosition = 'absolute';
		styleTextareaWrapperVisibility = 'hidden';
	}
	else {
		styleFrameBody = 'style="display: none;" ';
		styleFrameWrapperPosition = 'absolute';
		styleFrameWrapperVisibility = 'hidden';
		styleTextareaWrapperPosition = 'static';
		styleTextareaWrapperVisibility = 'visible';
	}
	if (wikEdFullScreenMode == true) {
		wikEdInputWrapperClass = 'wikEdInputWrapperFull';
	}
	else {
		wikEdInputWrapperClass = 'wikEdInputWrapper';
	}
 
// create wikEd element wrappers
 
// create input wrapper, this contains the whole fullscreen content
	wikEdInputWrapper = document.createElement('div');
	wikEdInputWrapper.id = 'wikEdInputWrapper';
	wikEdInputWrapper.className = wikEdInputWrapperClass;
	wikEdTextarea.parentNode.insertBefore(wikEdInputWrapper, wikEdTextarea);
 
// create toolbar wrapper
	wikEdToolbarWrapper = document.createElement('div');
	wikEdToolbarWrapper.id = 'wikEdToolbarWrapper';
	wikEdToolbarWrapper.className = 'wikEdToolbarWrapper';
	wikEdInputWrapper.appendChild(wikEdToolbarWrapper);
 
// create textarea wrapper
	wikEdTextareaWrapper = document.createElement('div');
	wikEdTextareaWrapper.id = 'wikEdTextareaWrapper';
	wikEdTextareaWrapper.className = 'wikEdTextareaWrapper';
	wikEdTextareaWrapper.style.position = styleTextareaWrapperPosition;
	wikEdTextareaWrapper.style.visibility = styleTextareaWrapperVisibility;
	wikEdInputWrapper.appendChild(wikEdTextareaWrapper);
 
// create frame wrapper
	wikEdFrameWrapper = document.createElement('div');
	wikEdFrameWrapper.id = 'wikEdFrameWrapper';
	wikEdFrameWrapper.style.position = styleFrameWrapperPosition;
	wikEdFrameWrapper.style.visibility = styleFrameWrapperVisibility;
	wikEdInputWrapper.appendChild(wikEdFrameWrapper);
 
// create console wrapper for buttons, summary, and submit
	wikEdConsoleWrapper = document.createElement('div');
	wikEdConsoleWrapper.id = 'wikEdConsoleWrapper';
	wikEdConsoleWrapper.className = 'wikEdConsoleWrapper';
	wikEdInputWrapper.appendChild(wikEdConsoleWrapper);
 
// create buttons wrapper for wikEd buttons
	wikEdButtonsWrapper = document.createElement('div');
	wikEdButtonsWrapper.id = 'wikEdButtonsWrapper';
	wikEdButtonsWrapper.className = 'wikEdButtonsWrapper';
	wikEdConsoleWrapper.appendChild(wikEdButtonsWrapper);
 
// create summary wrapper for summary, minor edit, and watch this page
	wikEdSummaryWrapper = document.createElement('div');
	wikEdSummaryWrapper.id = 'wikEdSummaryWrapper';
	wikEdSummaryWrapper.className = 'wikEdSummaryWrapper';
	wikEdConsoleWrapper.appendChild(wikEdSummaryWrapper);
 
// create summary input wrapper
	wikEdSummaryInputWrapper = document.createElement('div');
	wikEdSummaryInputWrapper.id = 'wikEdSummaryInputWrapper';
	wikEdSummaryInputWrapper.className = 'wikEdSummaryInputWrapper';
	wikEdSummaryWrapper.appendChild(wikEdSummaryInputWrapper);
 
// create minor edit and watch page wrapper
	wikEdSummaryOptions = document.createElement('div');
	wikEdSummaryOptions.id = 'wikEdSummaryOptions';
	wikEdSummaryOptions.className = 'wikEdSummaryOptions';
	wikEdSummaryWrapper.appendChild(wikEdSummaryOptions);
 
// create submit wrapper for submit buttons and help links
	wikEdSubmitWrapper = document.createElement('div');
	wikEdSubmitWrapper.id = 'wikEdSubmitWrapper';
	wikEdSubmitWrapper.className = 'wikEdSubmitWrapper';
	wikEdConsoleWrapper.appendChild(wikEdSubmitWrapper);
 
// create submit wrapper for submit buttons and help links
	wikEdSubmitButtonsWrapper = document.createElement('div');
	wikEdSubmitButtonsWrapper.id = 'wikEdSubmitButtonsWrapper';
	wikEdSubmitButtonsWrapper.className = 'wikEdSubmitButtonsWrapper';
	wikEdSubmitWrapper.appendChild(wikEdSubmitButtonsWrapper);
 
// create preview wrapper for preview and diff box
	wikEdLocalPrevWrapper = document.createElement('div');
	wikEdLocalPrevWrapper.id = 'wikEdLocalPrevWrapper';
	wikEdLocalPrevWrapper.className = 'wikEdLocalPrevWrapper';
	wikEdLocalPrevWrapper.style.display = 'none';
	wikEdInputWrapper.appendChild(wikEdLocalPrevWrapper);
 
// create insert wrapper for insert special chars links
	wikEdInsertWrapper = document.createElement('div');
	wikEdInsertWrapper.id = 'wikEdInsertWrapper';
	wikEdInsertWrapper.className = 'wikEdInsertWrapper';
	wikEdInputWrapper.appendChild(wikEdInsertWrapper);
 
// append input wrapper to document
	wpEditform.insertBefore(wikEdInputWrapper, wpEditform.firstChild);
 
// fill the wrappers
 
// add toolbar to toolbar wrapper
	wpToolbar = document.getElementById('toolbar');
	if (wpToolbar != null) {
		wikEdToolbarWrapper.appendChild(wpToolbar);
	}
 
// call wikibits:mwSetupToolbar() now because it would terminate with an error after setting textarea to display: none
	if (wpToolbar != null) {
		if (wpToolbar.getElementsByTagName('IMG').length == 0) {
			if (typeof(mwSetupToolbar) == 'function') {
				mwSetupToolbar();
			}
			window.removeEventListener('load', mwSetupToolbar, false);
		}
	}
 
// add summary elements to summary input wrapper
	var summaryLabel = document.getElementById('wpSummaryLabel');
	wikEdSummaryInputWrapper.appendChild(summaryLabel);
 
	wikEdSummaryText = document.getElementById('wpSummary');
	wikEdSummaryInputWrapper.appendChild(wikEdSummaryText);
 
// move editpage-copywarn out of summary wrapper
// needs to be done before appending editOptions to summary wrapper otherwise a linebreak stays (Mozilla bug)
	var copywarn = document.getElementById('editpage-copywarn');
	if (copywarn != null) {
		wikEdInputWrapper.parentNode.insertBefore(copywarn, wikEdInputWrapper.nextSibling);
	}
 
// add summary elements to summary options wrapper
// crashes Mozilla when appended after filling the iframe
	var editOptions = document.getElementById('wpMinoredit').parentNode;
	wikEdSummaryOptions.appendChild(editOptions);
 
 
// add textarea to textarea wrapper
	wikEdTextareaWrapper.appendChild(wikEdTextarea);
 
// add edit-frame to frame wrapper
// any DOM changes to a starting iframe in designmode may crash the browser, including DOM move, display: none; and position: absolute;
 
// create the iframe
	html = '';
	html += '<div id="wikEdFrameOuter" class="wikEdFrameOuter">';
	html += '<div id="wikEdFrameInner" class="wikEdFrameInner">';
	html += '</div>';
	html += '<iframe id="wikEdFrame" class="wikEdFrame" name="wikEdFrame" style="height: ' + wikEdTextareaHeight + 'px;"></iframe>';
	html += '</div>';
	html += '</div>';
 
	wikEdFrameWrapper.innerHTML = html;
	wikEdInputWrapper.insertBefore(wikEdFrameWrapper, wikEdTextareaWrapper);
 
// fill the frame with content
	html = '';
	html += '<html><head></head>';
	html += '<body id="wikEdFrameBody" class="wikedFrameBody"' + styleFrameBody + 'onload="window.document.designMode = \'on\'; window.document.execCommand(\'styleWithCSS\', false, false);">';
	html += '</body></html>';
 
	wikEdFrame = document.getElementById('wikEdFrame');
	wikEdFrameWindow = wikEdFrame.contentWindow;
	wikEdFrameDocument = wikEdFrameWindow.document;
	wikEdFrameDocument.open();
	wikEdFrameDocument.write(html);
	wikEdFrameDocument.close();
	wikEdFrameBody = wikEdFrameDocument.body;
 
// add wikEd buttons to buttons wrapper
 
// format buttons
	html = '';
	html += '<div class="wikEdButtonsFormat" id="wikEdButtonsFormat">';
 
	html += '<img class="wikEdButtonInactive"  src="' + wikEdImage['undo']            + '" width="16" height="16" id="wikEdUndo"                  alt="' + wikEdText['wikEdUndo alt']                  + '" title="' + wikEdText['wikEdUndo title']                  + '" onClick="javascript:WikEdEditButton(\'wikEdUndo\');">';
	html += '<img class="wikEdButtonInactive"  src="' + wikEdImage['redo']            + '" width="16" height="16" id="wikEdRedo"                  alt="' + wikEdText['wikEdRedo alt']                  + '" title="' + wikEdText['wikEdRedo title']                  + '" onClick="javascript:WikEdEditButton(\'wikEdRedo\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['bold']            + '" width="16" height="16" id="wikEdBold"                  alt="' + wikEdText['wikEdBold alt']                  + '" title="' + wikEdText['wikEdBold title']                  + '" onClick="javascript:WikEdEditButton(\'wikEdBold\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['italic']          + '" width="16" height="16" id="wikEdItalic"                alt="' + wikEdText['wikEdItalic alt']                + '" title="' + wikEdText['wikEdItalic title']                + '" onClick="javascript:WikEdEditButton(\'wikEdItalic\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['underline']       + '" width="16" height="16" id="wikEdUnderline"             alt="' + wikEdText['wikEdUnderline alt']             + '" title="' + wikEdText['wikEdUnderline title']             + '" onClick="javascript:WikEdEditButton(\'wikEdUnderline\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['strikethrough']   + '" width="16" height="16" id="wikEdStrikethrough"         alt="' + wikEdText['wikEdStrikethrough alt']         + '" title="' + wikEdText['wikEdStrikethrough title']         + '" onClick="javascript:WikEdEditButton(\'wikEdStrikethrough\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['nowiki']          + '" width="16" height="16" id="wikEdNowiki"                alt="' + wikEdText['wikEdNowiki alt']                + '" title="' + wikEdText['wikEdNowiki title']                + '" onClick="javascript:WikEdEditButton(\'wikEdNowiki\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['superscript']     + '" width="16" height="16" id="wikEdSuperscript"           alt="' + wikEdText['wikEdSuperscript alt']           + '" title="' + wikEdText['wikEdSuperscript title']           + '" onClick="javascript:WikEdEditButton(\'wikEdSuperscript\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['subscript']       + '" width="16" height="16" id="wikEdSubscript"             alt="' + wikEdText['wikEdSubscript alt']             + '" title="' + wikEdText['wikEdSubscript title']             + '" onClick="javascript:WikEdEditButton(\'wikEdSubscript\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['case']            + '" width="16" height="16" id="wikEdCase"                  alt="' + wikEdText['wikEdCase alt']                  + '" title="' + wikEdText['wikEdCase title']                  + '" onClick="javascript:WikEdEditButton(\'wikEdCase\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['undoAll']         + '" width="16" height="16" id="wikEdUndoAll"               alt="' + wikEdText['wikEdUndoAll alt']               + '" title="' + wikEdText['wikEdUndoAll title']               + '" onClick="javascript:WikEdEditButton(\'wikEdUndoAll\');">';
	html += '<img class="wikEdButtonInactive"  src="' + wikEdImage['redoAll']         + '" width="16" height="16" id="wikEdRedoAll"               alt="' + wikEdText['wikEdRedoAll alt']               + '" title="' + wikEdText['wikEdRedoAll title']               + '" onClick="javascript:WikEdEditButton(\'wikEdRedoAll\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['updateSyntax']    + '" width="16" height="16" id="wikEdUpdateSyntax"          alt="' + wikEdText['wikEdUpdateSyntax alt']          + '" title="' + wikEdText['wikEdUpdateSyntax title']          + '" onClick="javascript:WikEdEditButton(\'wikEdUpdateSyntax\');">';
	html += '<br />';
 
	html += '<img class="wikEdButton"          src="' + wikEdImage['wikiLink']        + '" width="16" height="16" id="wikEdWikiLink"              alt="' + wikEdText['wikEdWikiLink alt']              + '" title="' + wikEdText['wikEdWikiLink title']              + '" onClick="javascript:WikEdEditButton(\'wikEdWikiLink\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['webLink']         + '" width="16" height="16" id="wikEdWebLink"               alt="' + wikEdText['wikEdWebLink alt']               + '" title="' + wikEdText['wikEdWebLink title']               + '" onClick="javascript:WikEdEditButton(\'wikEdWebLink\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['decreaseHeading'] + '" width="16" height="16" id="wikEdDecreaseHeading"       alt="' + wikEdText['wikEdDecreaseHeading alt']       + '" title="' + wikEdText['wikEdDecreaseHeading title']       + '" onClick="javascript:WikEdEditButton(\'wikEdDecreaseHeading\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['increaseHeading'] + '" width="16" height="16" id="wikEdIncreaseHeading"       alt="' + wikEdText['wikEdIncreaseHeading alt']       + '" title="' + wikEdText['wikEdIncreaseHeading title']       + '" onClick="javascript:WikEdEditButton(\'wikEdIncreaseHeading\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['bulletList']      + '" width="16" height="16" id="wikEdBulletList"            alt="' + wikEdText['wikEdBulletList alt']            + '" title="' + wikEdText['wikEdBulletList title']            + '" onClick="javascript:WikEdEditButton(\'wikEdBulletList\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['numberList']      + '" width="16" height="16" id="wikEdNumberList"            alt="' + wikEdText['wikEdNumberList alt']            + '" title="' + wikEdText['wikEdNumberList title']            + '" onClick="javascript:WikEdEditButton(\'wikEdNumberList\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['indentList']      + '" width="16" height="16" id="wikEdIndentList"            alt="' + wikEdText['wikEdIndentList alt']            + '" title="' + wikEdText['wikEdIndentList title']            + '" onClick="javascript:WikEdEditButton(\'wikEdIndentList\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['definitionList']  + '" width="16" height="16" id="wikEdDefinitionList"        alt="' + wikEdText['wikEdDefinitionList alt']        + '" title="' + wikEdText['wikEdDefinitionList title']        + '" onClick="javascript:WikEdEditButton(\'wikEdDefinitionList\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['image']           + '" width="16" height="16" id="wikEdImage"                 alt="' + wikEdText['wikEdImage alt']                 + '" title="' + wikEdText['wikEdImage title']                 + '" onClick="javascript:WikEdEditButton(\'wikEdImage\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['table']           + '" width="16" height="16" id="wikEdTable"                 alt="' + wikEdText['wikEdTable alt']                 + '" title="' + wikEdText['wikEdTable title']                 + '" onClick="javascript:WikEdEditButton(\'wikEdTable\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['redirect']        + '" width="16" height="16" id="wikEdRedirect"              alt="' + wikEdText['wikEdRedirect alt']              + '" title="' + wikEdText['wikEdRedirect title']              + '" onClick="javascript:WikEdEditButton(\'wikEdRedirect\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['wikify']          + '" width="16" height="16" id="wikEdWikify"                alt="' + wikEdText['wikEdWikify alt']                + '" title="' + wikEdText['wikEdWikify title']                + '" onClick="javascript:WikEdEditButton(\'wikEdWikify\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['textify']         + '" width="16" height="16" id="wikEdTextify"               alt="' + wikEdText['wikEdTextify alt']               + '" title="' + wikEdText['wikEdTextify title']               + '" onClick="javascript:WikEdEditButton(\'wikEdTextify\');">';
	html += '</div>';
 
// wikEd control buttons
	html += '<div class="wikEdButtonsControl" id="wikEdButtonsControl">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['textZoom']        + '" width="16" height="16" id="wikEdTextZoom"              alt="' + wikEdText['wikEdTextZoom alt']              + '" title="' + wikEdText['wikEdTextZoom title']              + '" onClick="javascript:WikEdButton(\'wikEdTextZoom\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['clearHistory']    + '" width="16" height="16" id="wikEdClearHistory"          alt="' + wikEdText['wikEdClearHistory alt']          + '" title="' + wikEdText['wikEdClearHistory title']          + '" onClick="javascript:WikEdButton(\'wikEdClearHistory\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['scrollToButtons'] + '" width="16" height="16" id="wikEdScrollToButtons"       alt="' + wikEdText['wikEdScrollToButtons alt']       + '" title="' + wikEdText['wikEdScrollToButtons title']       + '" onClick="javascript:WikEdButton(\'wikEdScrollToButtons\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['scrollToText']    + '" width="16" height="16" id="wikEdScrollToInput"         alt="' + wikEdText['wikEdScrollToInput alt']         + '" title="' + wikEdText['wikEdScrollToInput title']         + '" onClick="javascript:WikEdButton(\'wikEdScrollToInput\');">';
	html += '<br />';
 
	html += '<img class="wikEdButtonChecked"   src="' + wikEdImage['useWikEd']        + '" width="16" height="16" id="wikEdUseWikEd"              alt="' + wikEdText['wikEdUseWikEd alt']              + '" title="' + wikEdText['wikEdUseWikEd title']              + '" onClick="javascript:WikEdButton(\'wikEdUseWikEd\', true);">';
	html += '<img class="wikEdButtonUnchecked" src="' + wikEdImage['highlightSyntax'] + '" width="16" height="16" id="wikEdHighlightSyntax"       alt="' + wikEdText['wikEdHighlightSyntax alt']       + '" title="' + wikEdText['wikEdHighlightSyntax title']       + '" onClick="javascript:WikEdButton(\'wikEdHighlightSyntax\', true);">';
	if (wikEdShowSourceButton == true) {
		html += '<img class="wikEdButton"        src="' + wikEdImage['source']          + '" width="16" height="16" id="wikEdSource"                alt="' + wikEdText['wikEdSource alt']                + '" title="' + wikEdText['wikEdSource title']                + '" onClick="javascript:WikEdEditButton(\'wikEdSource\');">';
	}
	html += '<img class="wikEdButtonUnchecked" src="' + wikEdImage['using']           + '" width="16" height="16" id="wikEdUsing"                 alt="' + wikEdText['wikEdUsing alt']                 + '" title="' + wikEdText['wikEdUsing title']                 + '" onClick="javascript:WikEdButton(\'wikEdUsing\', true);">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fullScreen']      + '" width="16" height="16" id="wikEdFullScreen"            alt="' + wikEdText['wikEdFullScreen alt']            + '" title="' + wikEdText['wikEdFullScreen title']            + '" onClick="javascript:WikEdButton(\'wikEdFullScreen\', true);">';
	html += '</div>';
 
// find / replace buttons
	html += '<div class="wikEdButtonsFind" id="wikEdButtonsFind">';
 
	html += '<img class="wikEdButton"          src="' + wikEdImage['getFind']         + '" width="16" height="16" id="wikEdGetFind"               alt="' + wikEdText['wikEdGetFind alt']               + '" title="' + wikEdText['wikEdGetFind title']               + '" onClick="javascript:WikEdEditButton(\'wikEdGetFind\');" ondblclick="javascript:WikEdEditButton(\'wikEdGetFindReplace\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['findAll']         + '" width="16" height="16" id="wikEdFindAll"               alt="' + wikEdText['wikEdFindAll alt']               + '" title="' + wikEdText['wikEdFindAll title']               + '" onClick="javascript:WikEdEditButton(\'wikEdFindAll\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['findPrev']        + '" width="16" height="16" id="wikEdFindPrev"              alt="' + wikEdText['wikEdFindPrev alt']              + '" title="' + wikEdText['wikEdFindPrev title']              + '" onClick="javascript:WikEdEditButton(\'wikEdFindPrev\');">';
 
	html += '<span class="wikEdFindComboInput" id="wikEdFindComboInput">';
	html += '<input class="wikEdCombo" id="wikEdFindText" type="text" value="" onfocus="javascript:this.setSelectionRange(0, this.textLength);">';
	html += '<select class="wikEdCombo" id="wikEdFindSelect" onfocus="javascript:WikEdSetComboOptions(\'find\')" onChange="javascript:WikEdChangeComboInput(\'find\');">';
	html += '</select>';
	html += '</span>';
 
	html += '<img class="wikEdButton"          src="' + wikEdImage['findNext']        + '" width="16" height="16" id="wikEdFindNext"              alt="' + wikEdText['wikEdFindNext alt']              + '" title="' + wikEdText['wikEdFindNext title']              + '" onClick="javascript:WikEdEditButton(\'wikEdFindNext\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['jumpTopBottom']   + '" width="16" height="16" id="wikEdUpdown"                alt="' + wikEdText['wikEdUpdown alt']                + '" title="' + wikEdText['wikEdUpdown title']                + '" onClick="javascript:WikEdEditButton(\'wikEdUpdown\');">';
	html += '<img class="wikEdButtonInactive"  src="' + wikEdImage['prevPos']         + '" width="16" height="16" id="wikEdPrevPos"               alt="' + wikEdText['wikEdPrevPos alt']               + '" title="' + wikEdText['wikEdPrevPos title']               + '" onClick="javascript:WikEdEditButton(\'wikEdPrevPos\');">';
	html += '<img class="wikEdButtonInactive"  src="' + wikEdImage['lastPos']         + '" width="16" height="16" id="wikEdLastPos"               alt="' + wikEdText['wikEdLastPos alt']               + '" title="' + wikEdText['wikEdLastPos title']               + '" onClick="javascript:WikEdEditButton(\'wikEdLastPos\');">';
	html += '<br />';
 
	html += '<img class="wikEdButton"          src="' + wikEdImage['clearFind']       + '" width="16" height="16" id="wikEdClearFind"             alt="' + wikEdText['wikEdClearFind alt']             + '" title="' + wikEdText['wikEdClearFind title']             + '" onClick="javascript:WikEdButton(\'wikEdClearFind\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['replaceAll']      + '" width="16" height="16" id="wikEdReplaceAll"            alt="' + wikEdText['wikEdReplaceAll alt']            + '" title="' + wikEdText['wikEdReplaceAll title']            + '" onClick="javascript:WikEdEditButton(\'wikEdReplaceAll\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['replacePrev']     + '" width="16" height="16" id="wikEdReplacePrev"           alt="' + wikEdText['wikEdReplacePrev alt']           + '" title="' + wikEdText['wikEdReplacePrev title']           + '" onClick="javascript:WikEdEditButton(\'wikEdReplacePrev\');">';
 
	html += '<span class="wikEdReplaceComboInput" id="wikEdReplaceComboInput">';
	html += '<input class="wikEdCombo" id="wikEdReplaceText" type="text" value="" onfocus="this.setSelectionRange(0, this.textLength);">';
	html += '<select class="wikEdCombo" id="wikEdReplaceSelect" onfocus="WikEdSetComboOptions(\'replace\')" onChange="javascript:WikEdChangeComboInput(\'replace\');">';
	html += '</select>';
	html += '</span>';
 
	html += '<img class="wikEdButton"          src="' + wikEdImage['replaceNext']     + '" width="16" height="16" id="wikEdReplaceNext"           alt="' + wikEdText['wikEdReplaceNext alt']           + '" title="' + wikEdText['wikEdReplaceNext title']           + '" onClick="javascript:WikEdEditButton(\'wikEdReplaceNext\');">';
	html += '<img class="wikEdButtonUnchecked" src="' + wikEdImage['caseSensitive']   + '" width="16" height="16" id="wikEdCaseSensitive"         alt="' + wikEdText['wikEdCaseSensitive alt']         + '" title="' + wikEdText['wikEdCaseSensitive title']         + '" onClick="javascript:WikEdButton(\'wikEdCaseSensitive\', true);">';
	html += '<img class="wikEdButtonUnchecked" src="' + wikEdImage['regExp']          + '" width="16" height="16" id="wikEdRegExp"                alt="' + wikEdText['wikEdRegExp alt']                + '" title="' + wikEdText['wikEdRegExp title']                + '" onClick="javascript:WikEdButton(\'wikEdRegExp\', true);">';
	html += '<img class="wikEdButtonUnchecked" src="' + wikEdImage['findAhead']       + '" width="16" height="16" id="wikEdFindAhead"             alt="' + wikEdText['wikEdFindAhead alt']             + '" title="' + wikEdText['wikEdFindAhead title']             + '" onClick="javascript:WikEdButton(\'wikEdFindAhead\', true);">';
	html += '</div>';
 
// fixing buttons
	html += '<div class="wikEdButtonsFix" id="wikEdButtonsFix">';
 
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixBasic']        + '" width="16" height="16" id="wikEdFixBasic"              alt="' + wikEdText['wikEdFixBasic alt']              + '" title="' + wikEdText['wikEdFixBasic title']              + '" onClick="javascript:WikEdEditButton(\'wikEdFixBasic\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixHtml']         + '" width="16" height="16" id="wikEdFixHtml"               alt="' + wikEdText['wikEdFixHtml alt']               + '" title="' + wikEdText['wikEdFixHtml title']               + '" onClick="javascript:WikEdEditButton(\'wikEdFixHtml\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixCaps']         + '" width="16" height="16" id="wikEdFixCaps"               alt="' + wikEdText['wikEdFixCaps alt']               + '" title="' + wikEdText['wikEdFixCaps title']               + '" onClick="javascript:WikEdEditButton(\'wikEdFixCaps\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixUnicode']      + '" width="16" height="16" id="wikEdfixUnicode"            alt="' + wikEdText['wikEdfixUnicode alt']            + '" title="' + wikEdText['wikEdfixUnicode title']            + '" onClick="javascript:WikEdEditButton(\'wikEdfixUnicode\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixAll']          + '" width="16" height="16" id="wikEdFixAll"                alt="' + wikEdText['wikEdFixAll alt']                + '" title="' + wikEdText['wikEdFixAll title']                + '" onClick="javascript:WikEdEditButton(\'wikEdFixAll\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixRegExTypo']    + '" width="16" height="16" id="wikEdFixRegExTypo"          alt="' + wikEdText['wikEdFixRegExTypo alt']          + '" title="' + wikEdText['wikEdFixRegExTypo title']          + '" onClick="javascript:WikEdEditButton(\'wikEdFixRegExTypo\');">';
	html += '<br />';
 
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixDash']         + '" width="16" height="16" id="wikEdFixDashes"             alt="' + wikEdText['wikEdFixDashes alt']             + '" title="' + wikEdText['wikEdFixDashes title']             + '" onClick="javascript:WikEdEditButton(\'wikEdFixDashes\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixPunct']        + '" width="16" height="16" id="wikEdFixPunct"              alt="' + wikEdText['wikEdFixPunct alt']              + '" title="' + wikEdText['wikEdFixPunct title']              + '" onClick="javascript:WikEdEditButton(\'wikEdFixPunct\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixMath']         + '" width="16" height="16" id="wikEdFixMath"               alt="' + wikEdText['wikEdFixMath alt']               + '" title="' + wikEdText['wikEdFixMath title']               + '" onClick="javascript:WikEdEditButton(\'wikEdFixMath\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixChem']         + '" width="16" height="16" id="wikEdFixChem"               alt="' + wikEdText['wikEdFixChem alt']               + '" title="' + wikEdText['wikEdFixChem title']               + '" onClick="javascript:WikEdEditButton(\'wikEdFixChem\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixUnits']        + '" width="16" height="16" id="wikEdFixUnits"              alt="' + wikEdText['wikEdFixUnits alt']              + '" title="' + wikEdText['wikEdFixUnits title']              + '" onClick="javascript:WikEdEditButton(\'wikEdFixUnits\');">';
	html += '</div>';
	html += '<br style="clear: both;">';
 
// add html to buttons wrapper
	wikEdButtonsWrapper.innerHTML = html;
	wikEdButtonsFormat = document.getElementById('wikEdButtonsFormat');
	wikEdButtonsFind = document.getElementById('wikEdButtonsFind');
	wikEdButtonsFix = document.getElementById('wikEdButtonsFix');
	wikEdButtonsControl = document.getElementById('wikEdButtonsControl');
	wikEdCaseSensitive = document.getElementById('wikEdCaseSensitive');
	wikEdRegExp = document.getElementById('wikEdRegExp');
	wikEdFindAhead = document.getElementById('wikEdFindAhead');
	wikEdFindText = document.getElementById('wikEdFindText');
	wikEdReplaceText = document.getElementById('wikEdReplaceText');
 
// add submit buttons to submit wrapper
	var wpEditButtons = document.getElementById('wpSave').parentNode;
	wikEdSubmitButtonsWrapper.appendChild(wpEditButtons);
 
// add preview box top bar to submit wrapper
	var buttonsPreview = document.createElement('div');
	buttonsPreview.id = 'wikEdButtonsPreview';
	buttonsPreview.className = 'wikEdButtonsPreview';
 
	html = '';
	html += '<img class="wikEdButton"          src="' + wikEdImage['preview']         + '" width="16" height="16" id="wikEdPreview"               alt="' + wikEdText['wikEdPreview alt']               + '" title="' + wikEdText['wikEdPreview title']               + '" onClick="javascript:WikEdButton(\'wikEdPreview\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['diff']            + '" width="16" height="16" id="wikEdDiff"                  alt="' + wikEdText['wikEdDiff alt']                  + '" title="' + wikEdText['wikEdDiff title']                  + '" onClick="javascript:WikEdButton(\'wikEdDiff\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['close']           + '" width="16" height="16" id="wikEdClose"                 alt="' + wikEdText['wikEdClose alt']                 + '" title="' + wikEdText['wikEdClose title']                 + '" onClick="javascript:WikEdButton(\'wikEdClose\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['scrollToButtons'] + '" width="16" height="16" id="wikEdScrollToButtons2"      alt="' + wikEdText['wikEdScrollToButtons2 alt']      + '" title="' + wikEdText['wikEdScrollToButtons2 title']      + '" onClick="javascript:WikEdButton(\'wikEdScrollToButtons2\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['scrollToText']    + '" width="16" height="16" id="wikEdScrollToInput2"        alt="' + wikEdText['wikEdScrollToInput2 alt']        + '" title="' + wikEdText['wikEdScrollToInput2 title']        + '" onClick="javascript:WikEdButton(\'wikEdScrollToInput2\');">';
 
	buttonsPreview.innerHTML = html;
	wikEdSubmitWrapper.insertBefore(buttonsPreview, wikEdSubmitWrapper.firstChild);
	wikEdButtonsPreview = document.getElementById('wikEdButtonsPreview');
 
// add preview box and its bottom bar to preview wrapper
	html = '';
	html += '<div id="wikEdPreviewBoxOuter" class="wikEdPreviewBoxOuter">';
	html += '<div id="wikEdPreviewBox" class="wikEdPreviewBox">';
	html += '</div>';
	html += '</div>';
 
	html += '<div id="wikEdButtonsPreview2" class="wikEdButtonsPreview2">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['preview']         + '" width="16" height="16" id="wikEdPreview2"              alt="' + wikEdText['wikEdPreview2 alt']              + '" title="' + wikEdText['wikEdPreview2 title']              + '" onClick="javascript:WikEdButton(\'wikEdPreview2\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['diff']            + '" width="16" height="16" id="wikEdDiff2"                 alt="' + wikEdText['wikEdDiff2 alt']                 + '" title="' + wikEdText['wikEdDiff2 title']                 + '" onClick="javascript:WikEdButton(\'wikEdDiff2\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['close']           + '" width="16" height="16" id="wikEdClose2"                alt="' + wikEdText['wikEdClose2 alt']                + '" title="' + wikEdText['wikEdClose2 title']                + '" onClick="javascript:WikEdButton(\'wikEdClose2\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['scrollToButtons'] + '" width="16" height="16" id="wikEdScrollToButtons3"      alt="' + wikEdText['wikEdScrollToButtons3 alt']      + '" title="' + wikEdText['wikEdScrollToButtons3 title']      + '" onClick="javascript:WikEdButton(\'wikEdScrollToButtons3\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['scrollToText']    + '" width="16" height="16" id="wikEdScrollToInput3"        alt="' + wikEdText['wikEdScrollToInput3 alt']        + '" title="' + wikEdText['wikEdScrollToInput3 title']        + '" onClick="javascript:WikEdButton(\'wikEdScrollToInput3\');">';
	html += '</div>';
 
	wikEdLocalPrevWrapper.innerHTML = html;
	wikEdPreviewBox = document.getElementById('wikEdPreviewBox');
	wikEdButtonsPreview2 = document.getElementById('wikEdButtonsPreview2');
 
// add jump box to standard preview
	var wikiPreview = document.getElementById('wikiPreview');
	if (wikiPreview != null) {
		if (wikiPreview.firstChild != null) {
 
			var buttonsJump = document.createElement('div');
			buttonsJump.id = 'wikEdButtonsJump';
			buttonsJump.className = 'wikEdButtonsJump';
 
			html = '';
			html += '<img class="wikEdButtonSolo" src="' + wikEdImage['scrollToButtons'] + '" width="16" height="16" id="wikEdScrollToButtons4"      alt="' + wikEdText['wikEdScrollToButtons4 alt']      + '" title="' + wikEdText['wikEdScrollToButtons4 title']      + '" onClick="javascript:WikEdButton(\'wikEdScrollToButtons4\');">';
			html += '<img class="wikEdButtonSolo" src="' + wikEdImage['scrollToText']    + '" width="16" height="16" id="wikEdScrollToInput4"        alt="' + wikEdText['wikEdScrollToInput4 alt']        + '" title="' + wikEdText['wikEdScrollToInput4 title']        + '" onClick="javascript:WikEdButton(\'wikEdScrollToInput4\');">';
 
			buttonsJump.innerHTML = html;
			wikiPreview.insertBefore(buttonsJump, wikiPreview.firstChild);
			wikEdButtonsJump = document.getElementById('wikEdButtonsJump');
		}
	}
 
// add insert special chars to insert wrapper
	var wpSpecialchars = document.getElementById('editpage-specialchars');
	if (wpSpecialchars != null) {
		wikEdInsertWrapper.appendChild(wpSpecialchars);
	}
 
// wrappers filled
 
// add local preview button next to submit button
	var localPreview = document.createElement('button');
	localPreview.type = 'button';
	localPreview.id = 'wikEdLocalPreview';
	localPreview.title = 'Show preview below';
	localPreview.className = 'wikEdLocalPreview';
 
	var localPreviewImg = document.createElement('img');
	localPreviewImg.id = 'wikEdLocalPreviewImg';
	localPreviewImg.src = wikEdImage['preview'];
	localPreviewImg.alt = 'Preview below';
 
	localPreview.appendChild(localPreviewImg);
	var previewButton = document.getElementById('wpPreview');
	previewButton.parentNode.insertBefore(localPreview, previewButton.nextSibling);
 
// add local diff button next to submit button
	var localDiff = document.createElement('button');
	localDiff.type = 'button';
	localDiff.id = 'wikEdLocalDiff';
	localDiff.title = 'Show current changes below';
	localDiff.className = 'wikEdLocalDiff';
 
	var localDiffImg = document.createElement('img');
	localDiffImg.id = 'wikEdLocalDiffImg';
	localDiffImg.src = wikEdImage['diff'];
	localDiffImg.alt = 'Changes below';
 
	localDiff.appendChild(localDiffImg);
	var previewButton = document.getElementById('wpDiff');
	previewButton.parentNode.insertBefore(localDiff, previewButton.nextSibling);
 
// initialize image buttons
	WikEdButton('wikEdHighlightSyntax', null, wikEdHighlightSyntax);
	WikEdButton('wikEdUseWikEd', null, wikEdUseWikEd);
	WikEdButton('wikEdFullScreen', null, wikEdFullScreenMode);
	WikEdButton('wikEdUsing', null, wikEdUsing);
	WikEdButton('wikEdCaseSensitive', null, false);
	WikEdButton('wikEdRegExp', null, false);
	WikEdButton('wikEdFindAhead', null, wikEdFindAheadSelected);
	WikEdButton('wikEdPreview', null, false, 'wikEdButton');
	WikEdButton('wikEdDiff', null, false, 'wikEdButton');
	WikEdButton('wikEdClose', null, false, 'wikEdButton');
	WikEdButton('wikEdPreview2', null, false, 'wikEdButton');
	WikEdButton('wikEdDiff2', null, false, 'wikEdButton');
	WikEdButton('wikEdClose2', null, false, 'wikEdButton');
 
	if (wikEdRegExTypoFix == false) {
		document.getElementById('wikEdFixRegExTypo').className = 'wikEdButtonInactive';
	}
 
// no linebreak before minor edit checkbox
	if (wikEdNoLinebreak == true) {
		var wpMinoredit = document.getElementById('wpMinoredit');
		var node = wpMinoredit.previousSibling;
		while (node != null) {
			if (node.tagName == 'BR') {
				node.parentNode.removeChild(node);
				break;
			}
			node = node.previousSibling;
		}
	}
 
// add a clear summary button left to the summary input field
	var clearSummary = document.createElement('button');
	clearSummary.type = 'button';
	clearSummary.id = 'wikEdClearSummary';
	clearSummary.className = 'wikEdClearSummary';
	clearSummary.alt = wikEdText['wikEdClearSummary alt'];
	clearSummary.title = wikEdText['wikEdClearSummary title'];
	clearSummary.style.height = (wikEdSummaryText.clientHeight + 1) +'px';
 
// clear the summary onclick function
	clearSummary.onclick = function() {
 
// clear the summary if it is only a paragraph name
		if ( /^\/\* .*? \*\/ *$/.test(wikEdSummaryText.value) ) {
			wikEdSummaryText.value = '';
		}
 
// clear the summary but leave paragraph names
		else {
			wikEdSummaryText.value = wikEdSummaryText.value.replace(/^((\/\* .*? \*\/ )?).*/, '$1');
		}
		return;
	}
	var clearSummaryImg = document.createElement('img');
	clearSummaryImg.id = 'wikEdClearSummaryImg';
	clearSummaryImg.src = wikEdImage['clearSummary'];
	clearSummaryImg.alt = 'Clear summary';
	clearSummary.appendChild(clearSummaryImg);
	wikEdSummaryText.parentNode.insertBefore(clearSummary, wikEdSummaryText);
 
// make the summary a combo box
 
// style needs to be declared here so that it is not overridden by monobook.css
	wikEdSummaryText.style.width = 'auto';
	wikEdSummaryText.className = 'wikEdSummaryText';
 
	var summaryComboInput = document.createElement('span');
	summaryComboInput.id = 'wikEdSummaryComboInput';
	summaryComboInput.className = 'wikEdSummaryComboInput';
 
	var summarySelect = document.createElement('select');
	summarySelect.id = 'wikEdSummarySelect';
	summarySelect.className = 'wikEdSummarySelect';
	summarySelect.onchange = function() {
		WikEdChangeComboInput('summary');
	}
	summarySelect.onfocus = function() {
		WikEdSetComboOptions('summary');
	}
 
	summaryComboInput = wikEdSummaryText.parentNode.insertBefore(summaryComboInput, wikEdSummaryText);
	summaryComboInput.appendChild(wikEdSummaryText);
	summaryComboInput.appendChild(summarySelect);
 
// shorten submit button texts
	document.getElementById('wpPreview').value = wikEdText['shortenedPreview'];
	document.getElementById('wpDiff').value = wikEdText['shortenedChanges'];
 
// set up combo input boxes with history
	wikEdFieldHist ['find'] = [];
	wikEdCookieName['find'] = 'wikEdFindHistory';
	wikEdInputElement['find'] = new Object(wikEdFindText);
	wikEdSelectElement['find'] = new Object(document.getElementById('wikEdFindSelect'));
	wikEdSelectElement['find'].style.height = (wikEdInputElement['find'].clientHeight + 1) +'px';
 
	wikEdFieldHist ['replace'] = [];
	wikEdCookieName['replace'] = 'wikEdReplaceHistory';
	wikEdInputElement['replace'] = new Object(wikEdReplaceText);
	wikEdSelectElement['replace'] = new Object(document.getElementById('wikEdReplaceSelect'));
	wikEdSelectElement['replace'].style.height = (wikEdInputElement['replace'].clientHeight + 1) +'px';
 
	wikEdFieldHist ['summary'] = [];
	wikEdCookieName['summary'] = 'wikEdSummaryHistory';
	wikEdInputElement['summary'] = new Object(wikEdSummaryText);
	wikEdSelectElement['summary'] = new Object(document.getElementById('wikEdSummarySelect'));
	wikEdSelectElement['summary'].style.height = (wikEdInputElement['summary'].clientHeight + 1) +'px';
	WikEdResizeComboInput('find');
	WikEdResizeComboInput('replace');
	WikEdResizeComboInput('summary');
 
// display only the textarea or the iframe, dont change the frame
	if (wikEdUseWikEd == true) {
		WikEdSetEditArea(true, true);
	}
	else {
		WikEdSetEditArea(false, true);
	}
 
// add a link to the wikEd help page
	if ( (wikEdHelpPageLink != '') && (wikEdHelpPageLink != null) ) {
		var editHelpParent = previewButton;
		do {
			editHelpParent = editHelpParent.nextSibling;
		} while (editHelpParent.tagName != 'SPAN');
 
		var editHelp = editHelpParent.lastChild;
		while (editHelp.tagName != 'A') {
			editHelp = editHelp.previousSibling;
		}
 
		var wikEdHelpSpan = document.createElement('span');
		wikEdHelpSpan.className = 'wikEdHelpSpan';
		wikEdHelpSpan.innerHTML = wikEdHelpPageLink;
		editHelpParent.insertBefore(wikEdHelpSpan, editHelp.nextSibling);
	}
 
// add frame stylesheet definition
	wikEdFrameBody.style.fontSize = parseInt(wikEdTextZoom) + '%;';
	var frameStyle = new WikEdStyleSheet(wikEdFrameDocument);
	for (var ruleName in wikEdFrameCSS) {
		var ruleStyle = wikEdFrameCSS[ruleName];
		ruleStyle = ruleStyle.replace(/\{wikEdUnknown\}/g, wikEdImage['unknown']);
		ruleStyle = ruleStyle.replace(/\{wikEdTab\}/g, wikEdImage['tab']);
		ruleStyle = ruleStyle.replace(/\{wikEdCtrl\}/g, wikEdImage['ctrl']);
		ruleStyle = ruleStyle.replace(/\{wikEdBlank\}/g, wikEdImage['blank']);
		frameStyle.addRule(ruleName, ruleStyle);
	}
 
// copy the textarea content to the iframe
	if (wikEdUseWikEd == true) {
		WikEdUpdateFrame();
	}
 
// set frame events
	wikEdFrameDocument.addEventListener('keydown', WikEdKeyFrame, true);
	wikEdFrameDocument.addEventListener('keyup', WikEdKeyFrame, true);
	wikEdFrameDocument.addEventListener('keypress', WikEdKeyFrame, true);
	wikEdFrameDocument.addEventListener('mouseup', WikEdKeyFrame, true);
 
// find ahead events
	wikEdFindText.addEventListener('keyup', WikEdFindAhead, true);
 
// submit button events
	var saveButton = document.getElementById('wpSave');
	var previewButton = document.getElementById('wpPreview');
	var diffButton = document.getElementById('wpDiff');
	var localPreview = document.getElementById('wikEdLocalPreview');
	var localDiff = document.getElementById('wikEdLocalDiff');
 
// 'Save page' onclick function
	saveButton.onclick = function() {
		if (wikEdUseWikEd == true) {
			WikEdUpdateTextarea();
		}
 
// add "using wikEd" to summary
		var text = wikEdSummaryText.value;
		text = text.replace(/^[, ]+/, '');
		text = text.replace(/[, ]+$/, '');
		WikEdAddToHistory('summary');
		if ( (wikEdUsing == true) && (text != '') ) {
			if (text.lastIndexOf(wikEdSummaryUsing) < 0) {
				text += ' ' + wikEdSummaryUsing;
			}
		}
		wikEdSummaryText.value = text;
		saveButton.onclick = null;
		saveButton.click();
		return;
	};
 
// 'Show preview' onclick function
	previewButton.onclick = function() {
		if (wikEdUseWikEd == true) {
			WikEdUpdateTextarea();
		}
		previewButton.onclick = null;
		previewButton.click();
		return;
	};
 
// 'Show changes' onclick function
	diffButton.onclick = function() {
		if (wikEdFullScreenMode == true) {
			WikEdFullScreen(false);
		}
		if (wikEdUseWikEd == true) {
			WikEdUpdateTextarea();
		}
		diffButton.onclick = null;
		diffButton.click();
		return;
	};
 
// 'Show preview' image button onclick function
	localPreview.onclick = function() {
		WikEdButton('wikEdLocalPreview');
		return;
	};
 
// 'Show changes' image button onclick function
	localDiff.onclick = function() {
		WikEdButton('wikEdLocalDiff');
		return;
	};
 
// disable scrolling to edit window on next preview page
	document.getElementById('editform').action += '&wikedpreview';
 
// scroll to edit window if it is not a preview page
	if (scrollToText != false) {
		if (window.location.search.match('wikedpreview') == null) {
			window.scroll(0, WikEdGetOffsetTop(wikEdInputWrapper) - 2);
		}
 
// focus the edit area
		if (wikEdUseWikEd == true) {
			wikEdFrameWindow.focus();
		}
		else {
			wikEdTextarea.setSelectionRange(0, 0);
			wikEdTextarea.focus();
		}
	}
 
// fullscreen mode
	if (wikEdFullScreenMode == true) {
		WikEdFullScreen(wikEdFullScreenMode, true);
	}
 
// reset error indicator
	WikEdSetLogo();
 
	return;
}
 
 
//
// WikEdSetLogo: set the logo on top of the page
//
 
function WikEdSetLogo(state) {
 
	if (state == 'error') {
		wikEdLogo.src = wikEdImage['error'];
		wikEdLogo.alt = wikEdText['wikEdLogo error alt'];
		wikEdLogo.title = wikEdText['wikEdLogo error title'];
	}
	else {
		if (wikEdDisabled == true) {
			wikEdLogo.src = wikEdImage['disabled'];
			wikEdLogo.alt = wikEdText['wikEdLogo disabled alt'];
			wikEdLogo.title = wikEdText['wikEdLogo disabled title'];
		}
		else {
			wikEdLogo.src = wikEdImage['logo'];
			wikEdLogo.alt = wikEdText['wikEdLogo alt'];
			wikEdLogo.title = wikEdText['wikEdLogo title'];
		}
	}
 
	wikEdLogo.title = wikEdLogo.title.replace(/\{wikEdProgramVersion\}/g, wikEdProgramVersion);
	wikEdLogo.title = wikEdLogo.title.replace(/\{wikEdProgramDate\}/g, wikEdProgramDate);
 
	return;
}
 
 
//
// WikEdSetEditArea: apply css changes to switch between classic textarea and rich text frame
//
 
function WikEdSetEditArea(useFrame, notFrame) {
 
// turn rich text frame on
	if (useFrame == true) {
		wikEdTextareaWrapper.style.position = 'absolute';
		wikEdTextareaWrapper.style.visibility = 'hidden';
		wikEdTextarea.style.display = 'none';
 
		if (notFrame != true) {
			wikEdFrameWrapper.style.position = 'static';
			wikEdFrameWrapper.style.visibility = 'visible';
			wikEdFrameBody.style.display = 'block';
		}
 
		if (document.getElementById('toolbar') != null) {
			if (wikEdShowToolbar == true) {
				document.getElementById('toolbar').style.display = 'block';
			}
			else {
				document.getElementById('toolbar').style.display = 'none';
			}
		}
		wikEdButtonsFormat.style.display = 'block';
		wikEdButtonsFind.style.display = 'block';
		wikEdButtonsFix.style.display = 'block';
		wikEdButtonsControl.style.display = 'block';
	}
 
// turn classic textarea on
	else {
		if (notFrame != true) {
			wikEdFrameWrapper.style.position = 'absolute';
			wikEdFrameWrapper.style.visibility = 'hidden';
			wikEdFrameBody.style.display = 'none';
		}
 
		wikEdTextareaWrapper.style.position = 'static';
		wikEdTextareaWrapper.style.visibility = 'visible';
		wikEdTextarea.style.display = 'block';
 
		if (document.getElementById('toolbar') != null) {
			document.getElementById('toolbar').style.display = 'block';
		}
		wikEdButtonsFormat.style.display = 'none';
		wikEdButtonsFind.style.display = 'none';
		wikEdButtonsFix.style.display = 'none';
		wikEdButtonsControl.style.display = 'block';
	}
	return;
}
 
 
//
// WikEdButton: toggle or set button checked state
//   used for buttons that do not require nor change the text. Faster than WikEdEditButton()
 
function WikEdButton(whichButton, toggleButton, setButton, classButton, doButton) {
 
// get the button object
	var buttonObj = document.getElementById(whichButton);
	if (buttonObj == null) {
		alert('Unknown button \'' + whichButton + '\'');
		return;
	}
 
// check if the button is disabled
	if (buttonObj.className == 'wikEdButtonInactive') {
		return;
	}
 
// set button to pressed, set cursor to hourglass
	buttonObj.style.cursor = 'wait';
 
// init the button
	if (setButton != null) {
		if (setButton == false) {
			buttonObj.checked = false;
			if (classButton == null) {
				buttonObj.className = 'wikEdButtonUnchecked';
			}
		}
		else {
			buttonObj.checked = true;
			if (classButton == null) {
				buttonObj.className = 'wikEdButtonChecked';
			}
		}
	}
	else if (classButton != null) {
		buttonObj.className = classButton;
	}
 
// toggle the button
	if (toggleButton != null) {
		if (toggleButton == true) {
			if (buttonObj.checked == true) {
				buttonObj.checked = false;
				buttonObj.className = 'wikEdButtonUnchecked';
			}
			else {
				buttonObj.checked = true;
				buttonObj.className = 'wikEdButtonChecked';
			}
		}
	}
 
// perform specific actions
	if ( ( (setButton == null) && (classButton == null) ) || (doButton == true) ) {
 
// remove active content
		WikEdRemoveElements(['script', 'object', 'applet', 'embed']);
 
		switch (whichButton) {
 
// switch between syntax highlighting and plain text
			case 'wikEdHighlightSyntax':
				var obj = {};
				obj.html = wikEdFrameBody.innerHTML;
				obj.html = obj.html.replace(/(<br\b[^>]*>)\n* */g, '$1');
				if (buttonObj.checked == true) {
					WikEdRemoveHighlighting(obj);
					wikEdHighlightSyntax = true;
					obj.html = obj.html.replace(/<br\b[^>]*>/g, '\n');
					WikEdHighlightSyntax(obj);
					obj.html = obj.html.replace(/\n/g, '<br />');
					var cookieExpire = new Date();
					cookieExpire.setTime(cookieExpire.getTime() - 60 * 60 * 1000);
					WikEdSetCookie('wikEdSyntaxOff', '', cookieExpire.toGMTString(), '/');
				}
				else {
					wikEdHighlightSyntax = false;
					WikEdRemoveHighlighting(obj);
					obj.html = obj.html.replace(/(\t)/g, '<span class="wikEdTabPlain">$1</span><!--wikEdTabPlain-->');
					WikEdSetCookie('wikEdSyntaxOff', 'true', null, '/');
				}
				wikEdFrameBody.innerHTML = obj.html;
				break;
 
// align textbox with display top
			case 'wikEdScrollToInput':
			case 'wikEdScrollToInput2':
			case 'wikEdScrollToInput3':
			case 'wikEdScrollToInput4':
				var wikEdInputWrapper = document.getElementById('wikEdInputWrapper');
				var inputWrapperTop = WikEdGetOffsetTop(wikEdInputWrapper);
				window.scroll(0, inputWrapperTop);
				break;
 
// align edit buttons with display top
			case 'wikEdScrollToButtons':
			case 'wikEdScrollToButtons2':
			case 'wikEdScrollToButtons3':
			case 'wikEdScrollToButtons4':
				var wikEdConsoleWrapper = document.getElementById('wikEdConsoleWrapper');
				var consoleWrapperTop = WikEdGetOffsetTop(wikEdConsoleWrapper);
				window.scroll(0, consoleWrapperTop);
				break;
 
// cycle through different font sizes
			case 'wikEdTextZoom':
				wikEdTextZoom = wikEdTextZoom / 1.2;
				if (wikEdTextZoom < 60) {
					wikEdTextZoom = Math.round(wikEdTextZoom * Math.pow(1.2, 4) );
				}
				wikEdFrameBody.style.fontSize = parseInt(wikEdTextZoom) + '%;';
				break;
 
// display local preview box
			case 'wikEdPreview':
			case 'wikEdPreview2':
			case 'wikEdLocalPreview':
				if (wikEdFullScreenMode == true) {
					WikEdFullScreen(false);
				}
				if (wikEdUseWikEd == true) {
					WikEdUpdateTextarea();
				}
				wikEdPreviewBox.innerHTML = wiki2html(wikEdTextarea.value);
				wikEdLocalPrevWrapper.style.display = 'block';
				break;
 
// display local diff box
			case 'wikEdDiff':
			case 'wikEdDiff2':
			case 'wikEdLocalDiff':
				if (wikEdFullScreenMode == true) {
					WikEdFullScreen(false);
				}
				if (wikEdUseWikEd == true) {
					WikEdUpdateTextarea();
				}
				var diffText = wikEdTextarea.value;
				diffText = StringDiff(wikEdOrigVersion, diffText);
				wikEdPreviewBox.innerHTML = diffText;
				wikEdLocalPrevWrapper.style.display = 'block';
				break;
 
// close the preview / diff box
			case 'wikEdClose':
			case 'wikEdClose2':
				wikEdLocalPrevWrapper.style.display = 'none';
				break;
 
// switch between textarea and frame display
//   switching an iframe in design mode immediately after initialization between absolute/static may crash mozilla
			case 'wikEdUseWikEd':
 
// enble wikEd
				if (buttonObj.checked == true) {
					WikEdUpdateFrame();
 
// turn rich text frame on
					WikEdSetEditArea(true);
					wikEdUseWikEd = true;
					var cookieExpire = new Date();
					cookieExpire.setTime(cookieExpire.getTime() - 60 * 60 * 1000);
					WikEdSetCookie('wikEdUseClassic', '', cookieExpire.toGMTString(), '/');
				}
 
// disable wikEd
				else {
					if (wikEdFullScreenMode == true) {
						WikEdFullScreen(false);
					}
					WikEdUpdateTextarea();
 
// turn classic textarea on
					WikEdSetEditArea(false);
					wikEdUseWikEd = false;
					WikEdSetCookie('wikEdUseClassic', 'true', null, '/');
				}
				break;
 
 
// add "using wikEd" to summaries
			case 'wikEdUsing':
				if (buttonObj.checked == true) {
					wikEdUsing = true;
					WikEdSetCookie('wikEdSummaryUsing', 'true', null, '/');
				}
				else {
					wikEdUsing = false;
					var cookieExpire = new Date();
					cookieExpire.setTime(cookieExpire.getTime() - 60 * 60 * 1000);
					WikEdSetCookie('wikEdSummaryUsing', '', cookieExpire.toGMTString(), '/');
				}
				break;
 
// just toggle the case sensitive search button
			case 'wikEdCaseSensitive':
				break;
 
// just toggle the regexp search button
			case 'wikEdRegExp':
				break;
 
// just toggle the find-ahead-as-you-type search button
			case 'wikEdFindAhead':
				break;
 
// switch to fullscreen edit area
			case 'wikEdFullScreen':
				if (buttonObj.checked == true) {
					WikEdFullScreen(true);
					WikEdSetCookie('wikEdFullscreen', 'true', null, '/');
				}
				else {
					WikEdFullScreen(false);
					var cookieExpire = new Date();
					cookieExpire.setTime(cookieExpire.getTime() - 60 * 60 * 1000);
					WikEdSetCookie('wikEdFullscreen', '', cookieExpire.toGMTString(), '/');
				}
				break;
 
// clear the find, replace, and summary history stored in cookies
			case 'wikEdClearHistory':
				WikEdClearHistory('find');
				WikEdClearHistory('replace');
				WikEdClearHistory('summary');
				break;
 
// clear the search find field to search for the selected text
			case 'wikEdClearFind':
				wikEdInputElement['find'].value = '';
				break;
 
// for testing
			case 'wikEdPlaceholder':
				break;
		}
	}
 
// reset the frame DOM cache because the frame content might have changed
	wikEdFrameDOMCache = null;
 
// reset cursor to normal
	buttonObj.style.cursor = 'pointer';
 
	return;
}
 
 
//
// WikEdEditButton: editing functions
//   used for buttons that require or change the text. More tome consuming than WikEdButton()
 
 
function WikEdEditButton(whichButton, parameterArray) {
 
// get the button object
	var buttonObj = document.getElementById(whichButton);
 
// check if button is disabled
	if (buttonObj != null) {
		if (buttonObj.className == 'wikEdButtonInactive') {
			return;
		}
	}
 
// remove active content
	WikEdRemoveElements(['script', 'object', 'applet', 'embed', 'textarea']);
 
// get ranges to apply the changes to:
// whole text, selection, cursor, word and line under cursor and selection
	var obj = {};
 
// setup whole object for the whole text
	obj.whole = {};
	obj.whole.plainArray = [];
	obj.whole.plainNode = [];
	obj.whole.plainStart = [];
	obj.whole.from = 'whole';
 
// get whole range
	obj.whole.range = document.createRange();
	obj.whole.range.setStartBefore(wikEdFrameBody.firstChild);
	obj.whole.range.setEndAfter(wikEdFrameBody.lastChild);
 
// get whole plain text
	WikEdGetInnerHTML(obj.whole, wikEdFrameBody);
	obj.whole.code = obj.whole.html;
	WikEdRemoveHighlightingWikify(obj.whole);
	obj.whole.plain = obj.whole.html;
	obj.whole.plain = obj.whole.plain.replace(/<br\b[^>]*>/g, '\n');
	obj.whole.plain = obj.whole.plain.replace(/\u00a0/g, ' ');
	obj.whole.range.setStartBefore(wikEdFrameBody.firstChild);
	obj.whole.range.setEndAfter(wikEdFrameBody.lastChild);
 
// setup selection object for the selected text
	obj.selection = {};
	obj.selection.from = 'selection';
 
// set selection range
	obj.sel = wikEdFrameWindow.getSelection();
	obj.selection.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1);
 
// copy range to document fragment
	var documentFragment = obj.selection.range.cloneContents();
 
// get selected text
	WikEdGetInnerHTML(obj.selection, documentFragment);
	obj.selection.code = obj.selection.html;
	WikEdRemoveHighlightingWikify(obj.selection);
	obj.selection.plain = obj.selection.html;
	obj.selection.plain = obj.selection.plain.replace(/<br\b[^>]*>/g, '\n');
	obj.selection.plain = obj.selection.plain.replace(/\u00a0/g, ' ');
 
// setup cursor object for the cursor position
	obj.cursor = {};
	obj.cursor.from = 'cursor';
	obj.cursor.range = document.createRange();
	obj.cursor.range.setStart(obj.sel.focusNode, obj.sel.focusOffset);
	obj.cursor.range.setEnd(obj.sel.focusNode, obj.sel.focusOffset);
	obj.cursor.plain = '';
 
// setup focusWord object for the word under the cursor
	obj.focusWord = {};
	obj.focusWord.from = 'focusWord';
	obj.focusWord.range = document.createRange();
 
// setup focusLine object for the line under the cursor
	obj.focusLine = {};
	obj.focusLine.from = 'focusLine';
	obj.focusLine.range = document.createRange();
 
// setup selectionWord object for the words under the selection
	obj.selectionWord = {};
	obj.selectionWord.from = 'selectionWord';
	obj.selectionWord.range = document.createRange();
 
// setup selectionLine object for the lines under the selection
	obj.selectionLine = {};
	obj.selectionLine.from = 'selectionLine';
	obj.selectionLine.range = document.createRange();
 
// find the respective word and line boundaries
	WikEdFindBoundaries(obj.focusWord, obj.focusLine, obj.whole, obj.cursor);
	WikEdFindBoundaries(obj.selectionWord, obj.selectionLine, obj.whole, obj.selection);
 
// get the wikified plain text for the word under the cursor
	var documentFragment = obj.focusWord.range.cloneContents();
	WikEdGetInnerHTML(obj.focusWord, documentFragment);
	obj.focusWord.code = obj.focusWord.html;
	WikEdRemoveHighlightingWikify(obj.focusWord);
	obj.focusWord.plain = obj.focusWord.html;
	obj.focusWord.plain = obj.focusWord.plain.replace(/<br\b[^>]*>/g, '\n');
	obj.focusWord.plain = obj.focusWord.plain.replace(/\u00a0/g, ' ');
 
// get the wikified plain text for the line under the cursor
	var documentFragment = obj.focusLine.range.cloneContents();
	WikEdGetInnerHTML(obj.focusLine, documentFragment);
	obj.focusLine.code = obj.focusLine.html;
	WikEdRemoveHighlightingWikify(obj.focusLine);
	obj.focusLine.plain = obj.focusLine.html;
	obj.focusLine.plain = obj.focusLine.plain.replace(/<br\b[^>]*>/g, '\n');
	obj.focusLine.plain = obj.focusLine.plain.replace(/\u00a0/g, ' ');
 
// get the wikified plain text for the words under the selection
	var documentFragment = obj.selectionWord.range.cloneContents();
	WikEdGetInnerHTML(obj.selectionWord, documentFragment);
	obj.selectionWord.code = obj.selectionWord.html;
	WikEdRemoveHighlightingWikify(obj.selectionWord);
	obj.selectionWord.plain = obj.selectionWord.html;
	obj.selectionWord.plain = obj.selectionWord.plain.replace(/<br\b[^>]*>/g, '\n');
	obj.selectionWord.plain = obj.selectionWord.plain.replace(/\u00a0/g, ' ');
 
// get the wikified plain text for the lines under the selection
	var documentFragment = obj.selectionLine.range.cloneContents();
	WikEdGetInnerHTML(obj.selectionLine, documentFragment);
	obj.selectionLine.code = obj.selectionLine.html;
	WikEdRemoveHighlightingWikify(obj.selectionLine);
	obj.selectionLine.plain = obj.selectionLine.html;
	obj.selectionLine.plain = obj.selectionLine.plain.replace(/<br\b[^>]*>/g, '\n');
	obj.selectionLine.plain = obj.selectionLine.plain.replace(/\u00a0/g, ' ');
 
// select the appropriate object to change (whole, selection, cursor, focusWord, focusLine, selectionWord, or selectionLine)
	obj.changed = {};
	switch (whichButton) {
 
// undo: whole
		case 'wikEdUndo':
		case 'wikEdRedo':
			obj.changed = obj.cursor; // dummy
			break;
 
// whole text changes: whole
		case 'wikEdUndoAll':
		case 'wikEdRedoAll':
			obj.changed = obj.whole;
			break;
 
// basic wiki character formatting: selection / focusWord / cursor
		case 'wikEdBold':
		case 'wikEdItalic':
		case 'wikEdUnderline':
		case 'wikEdStrikethrough':
		case 'wikEdNowiki':
		case 'wikEdSuperscript':
		case 'wikEdSubscript':
		case 'wikEdWikiLink':
		case 'wikEdWebLink':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else if (obj.focusWord.plain != '') {
				obj.changed = obj.focusWord;
			}
			else  {
				obj.changed = obj.cursor;
			}
			break;
 
// character formatting: selection / focusWord
		case 'wikEdCase':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.focusWord;
			}
			break;
 
// update syntax highlighting: selection / whole
		case 'wikEdUpdateSyntax':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.whole;
			}
			break;
 
// multiple line changes: selectionLine
		case 'wikEdDecreaseHeading':
		case 'wikEdIncreaseHeading':
		case 'wikEdBulletList':
		case 'wikEdNumberList':
		case 'wikEdIndentList':
		case 'wikEdDefinitionList':
			if (obj.selection.plain != '') {
				obj.changed = obj.selectionLine;
			}
			else {
				obj.changed = obj.focusLine;
			}
			break;
 
// image: selectionWord (if text is selected) / cursor
		case 'wikEdImage':
			if (obj.selection.plain != '') {
				obj.changed = obj.selectionWord;
			}
			else  {
				obj.changed = obj.cursor;
			}
			break;
 
// table: selectionLine / cursor
		case 'wikEdTable':
			if (obj.selection.plain != '') {
				obj.changed = obj.selectionLine;
			}
			else  {
				obj.changed = obj.cursor;
			}
			break;
 
// wikify, textify: selection / whole
		case 'wikEdWikify':
		case 'wikEdTextify':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.whole;
			}
			break;
 
// redirect: whole
		case 'wikEdRedirect':
			obj.changed = obj.whole;
			break;
 
// character formatting: selection / focusWord
		case 'wikEdGetFind':
		case 'wikEdGetFindReplace':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.focusWord;
			}
			break;
 
// find and replace: find value / selection / focusWord
		case 'wikEdFindPrev':
		case 'wikEdFindNext':
		case 'wikEdReplacePrev':
		case 'wikEdReplaceNext':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else if (obj.focusWord.plain != '') {
				obj.changed = obj.focusWord;
			}
			else {
				obj.changed.plain = null;
			}
			break;
 
// replaceall: selection / whole
		case 'wikEdFindAll':
		case 'wikEdReplaceAll':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.whole;
			}
			break;
 
// jump to top or bottom: dummy
		case 'wikEdUpdown':
			obj.changed = obj.cursor; //dummy
			break;
 
// jump to position: dummy
		case 'wikEdPrevPos':
		case 'wikEdLastPos':
			obj.changed = obj.cursor; //dummy
			break;
 
// fixing buttons: selection / whole
		case 'wikEdFixBasic':
		case 'wikEdfixUnicode':
		case 'wikEdFixAll':
		case 'wikEdFixHtml':
		case 'wikEdFixRegExTypo':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.whole
			}
			break;
 
// fixing buttons: selection / focusLine
		case 'wikEdFixPunct':
		case 'wikEdFixMath':
		case 'wikEdFixUnits':
		case 'wikEdFixDashes':
		case 'wikEdFixCaps':
		case 'wikEdFixChem':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.focusLine;
			}
			break;
 
// fixing buttons: selection / focusWord
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.focusWord;
			}
			break;
 
// source: selection / whole
		case 'wikEdSource':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.whole;
			}
			break;
 
// insert tags: selection / focusWord / cursor
		case 'wikEdInsertTags':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else if (obj.focusWord.plain != '') {
				obj.changed = obj.focusWord;
			}
			else {
				obj.changed = obj.cursor;
			}
			break;
 
// unknown edit function
		default:
			alert('Unknown edit function \'' + whichButton + '\'');
 
// reset button to active, reset cursor
			if (buttonObj != null) {
				if (buttonObj.className != 'wikEdButtonInactive') {
					buttonObj.className = 'wikEdButton';
				}
			}
			wikEdFrameBody.style.cursor = 'auto';
 
			return;
	}
 
// exit
	if (obj.changed == null) {
		wikEdFrameWindow.focus();
 
// reset button to active, reset cursor
		if (buttonObj != null) {
			if (buttonObj.className != 'wikEdButtonInactive') {
				buttonObj.className = 'wikEdButton';
			}
		}
		return;
	}
 
// set local syntax highlighting flag
	var highlightSyntax = wikEdHighlightSyntax;
 
// manipulate the text
	var selectChange = true;
	switch (whichButton) {
 
// undo
		case 'wikEdUndo':
			if (wikEdLastVersion == null) {
				wikEdLastVersion = obj.changed.plain;
			}
			WikEdFrameExecCommand('undo');
			obj.changed.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1);
			obj.changed.plain = null;
			break;
 
// redo
		case 'wikEdRedo':
			WikEdFrameExecCommand('redo');
			obj.changed.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1);
			obj.changed.plain = null;
			break;
 
// bold
		case 'wikEdBold':
			if ( /\'\'\'([^\'].*?)\'\'\'/.test(obj.changed.plain) ) {
				obj.changed.plain = obj.changed.plain.replace(/\'\'\'([^\'].*?)\'\'\'/g, '$1');
			}
			else {
				obj.changed.plain = '\'\'\'' + obj.changed.plain + '\'\'\'';
				obj.changed.plain = obj.changed.plain.replace(/(\'\'\')( *)(.*?)( *)(\'\'\')/, '$2$1$3$5$4');
			}
			obj.changed.plain = obj.changed.plain.replace(/\'{6,}/g, '\'\'\'\'\'');
			break;
 
// italic
		case 'wikEdItalic':
			if ( /(\'{3,})\'\'([^\'].*?)\'\'(\'{3,})/.test(obj.changed.plain) ) {
				obj.changed.plain = obj.changed.plain.replace(/(\'{3,})\'\'([^\'].*?)\'\'(\'{3,})/g, '$1$2$3');
			}
			else if ( /(^|[^\'])\'\'([^\'].*?)\'\'([^\']|$)/.test(obj.changed.plain) ) {
				obj.changed.plain = obj.changed.plain.replace(/(^|[^\'])\'\'([^\'].*?)\'\'([^\']|$)/g, '$1$2$3');
			}
			else {
				obj.changed.plain = '\'\'' + obj.changed.plain + '\'\'';
				obj.changed.plain = obj.changed.plain.replace(/(\'\')( *)(.*?)( *)(\'\')/, '$2$1$3$5$4');
			}
			obj.changed.plain = obj.changed.plain.replace(/\'{6,}/g, '\'\'\'\'\'');
			break;
 
// underline
		case 'wikEdUnderline':
			if ( /&lt;u&gt;(.*?)&lt;\/u&gt;/i.test(obj.changed.plain) ) {
				obj.changed.plain = obj.changed.plain.replace(/&lt;u&gt;(.*?)&lt;\/u&gt;/g, '$1');
			}
			else {
				obj.changed.plain = '&lt;u&gt;' + obj.changed.plain + '&lt;\/u&gt;';
				obj.changed.plain = obj.changed.plain.replace(/(&lt;u&gt;)( *)(.*?)( *)(&lt;\/u&gt;)/, '$2$1$3$5$4');
			}
			break;
 
// strikethrough
		case 'wikEdStrikethrough':
			if ( /&lt;s&gt;(.*?)&lt;\/s&gt;/i.test(obj.changed.plain) ) {
				obj.changed.plain = obj.changed.plain.replace(/&lt;s&gt;(.*?)&lt;\/s&gt;/g, '$1');
			}
			else {
				obj.changed.plain = '&lt;s&gt;' + obj.changed.plain + '&lt;\/s&gt;';
				obj.changed.plain = obj.changed.plain.replace(/(&lt;s&gt;)( *)(.*?)( *)(&lt;\/s&gt;)/, '$2$1$3$5$4');
			}
			break;
 
// nowiki
		case 'wikEdNowiki':
			if ( /&lt;nowiki&gt;(.*?)&lt;\/nowiki&gt;/i.test(obj.changed.plain) ) {
				obj.changed.plain = obj.changed.plain.replace(/&lt;nowiki&gt;(.*?)&lt;\/nowiki&gt;/g, '$1');
			}
			else {
				obj.changed.plain = '&lt;nowiki&gt;' + obj.changed.plain + '&lt;\/nowiki&gt;';
				obj.changed.plain = obj.changed.plain.replace(/(&lt;nowiki&gt;)( *)(.*?)( *)(&lt;\/nowiki&gt;)/, '$2$1$3$5$4');
			}
			break;
 
// superscript
		case 'wikEdSuperscript':
			if ( /&lt;sup&gt;(.*?)&lt;\/sup&gt;/i.test(obj.changed.plain) ) {
				obj.changed.plain = obj.changed.plain.replace(/&lt;sup&gt;(.*?)&lt;\/sup&gt;/g, '$1');
			}
			else {
				obj.changed.plain = '&lt;sup&gt;' + obj.changed.plain + '&lt;/sup&gt;';
				obj.changed.plain = obj.changed.plain.replace(/(&lt;sup&gt;)( *)(.*?)( *)(&lt;\/sup&gt;)/, '$2$1$3$5$4');
			}
			break;
 
// subscript
		case 'wikEdSubscript':
			if ( /&lt;sub&gt;(.*?)&lt;\/sub&gt;/i.test(obj.changed.plain) ) {
				obj.changed.plain = obj.changed.plain.replace(/&lt;sub&gt;(.*?)&lt;\/sub&gt;/g, '$1');
			}
			else {
				obj.changed.plain = '&lt;sub&gt;' + obj.changed.plain + '&lt;/sub&gt;';
				obj.changed.plain = obj.changed.plain.replace(/(&lt;sub&gt;)( *)(.*?)( *)(&lt;\/sub&gt;)/, '$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, '&amp;');
			obj.changed.plain = obj.changed.plain.replace(/>/g, '&gt;');
			obj.changed.plain = obj.changed.plain.replace(/</g, '&lt;');
			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, '&amp;');
			obj.changed.plain = obj.changed.plain.replace(/</g, '&lt;');
			obj.changed.plain = obj.changed.plain.replace(/>/g, '&gt;');
			highlightSyntax = false;
			break;
 
// insert tags
		case 'wikEdInsertTags':
			var tagOpen = parameterArray[0] || '';
			var tagClose = parameterArray[1] || '';
			var sampleText = parameterArray[2] || '';
			tagOpen = tagOpen.replace(/&/g, '&amp;');
			tagOpen = tagOpen.replace(/</g, '&lt;');
			tagOpen = tagOpen.replace(/>/g, '&gt;');
			tagClose = tagClose.replace(/&/g, '&amp;');
			tagClose = tagClose.replace(/</g, '&lt;');
			tagClose = tagClose.replace(/>/g, '&gt;');
			tagsampleText = sampleText.replace(/&/g, '&amp;');
			tagsampleText = sampleText.replace(/</g, '&lt;');
			tagsampleText = sampleText.replace(/>/g, '&gt;');
			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-&nbsp;
		obj.html = obj.html.replace(/  /g, '&nbsp; ');
		obj.html = obj.html.replace(/  /g, '&nbsp; ');
 
// newlines to <br />
		obj.html = obj.html.replace(/\n/g, '<br />');
 
// make changed range text the current selection
		obj.sel.removeAllRanges();
		obj.sel.addRange(obj.changed.range);
 
// get the scroll position
		var frameSrollTop;
		if (obj.changed.from == 'whole') {
			frameSrollTop = wikEdFrameBody.scrollTop;
		}
 
// replace the selection with changed text
		if (obj.html != '') {
			WikEdFrameExecCommand('inserthtml', obj.html);
		}
		else {
			WikEdFrameExecCommand('delete');
		}
 
// select the whole text after replacing the whole text and scroll to same height
		if (obj.changed.from == 'whole') {
			wikEdFrameBody.scrollTop = frameSrollTop;
			var range = document.createRange();
			range.setStartBefore(wikEdFrameBody.firstChild);
			range.setEndAfter(wikEdFrameBody.lastChild);
			obj.sel.addRange(range);
			selectChange = false;
		}
 
// select the changed text and scroll it into the viewport by using a backwards find
		if (selectChange != false) {
 
// get the text content of the changed text
			var div = document.createElement('div');
			div.innerHTML = obj.changed.plain;
			var plainText = div.textContent;
 
// find the text
			if (plainText.length > 0) {
				if (plainText.indexOf('\n') < 0) {
 
// function: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog)
					wikEdFrameWindow.find(plainText, true, true, false, false, false, false);
				}
			}
		}
	}
 
// reset button to active, reset cursor
	if (buttonObj != null) {
		if (buttonObj.className != 'wikEdButtonInactive') {
			buttonObj.className = 'wikEdButton';
		}
		buttonObj.style.cursor = 'auto';
	}
 
// grey out inactive buttons
	WikEdInactiveButtons();
 
// reset the frame DOM cache because the frame content has been changed
	wikEdFrameDOMCache = null;
 
// focus the frame
	if (wikEdUseWikEd == true) {
		wikEdFrameWindow.focus();
	}
 
	return;
}
 
 
//
// WikEdFind: custom find function with regexp properties, sets obj.changed.range, uses obj ranges
//
 
function WikEdFind(obj, findText, caseSensitive, backwards, regExp) {
 
	var range = obj.sel.getRangeAt(obj.sel.rangeCount - 1);
 
// empty the range to avoid error messages for reverse direction ranges
	obj.changed.range = document.createRange();
 
// use the fast built-in find function for non-regexp searches
	if (regExp == null) {
 
// function: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog)
		var found = wikEdFrameWindow.find(findText, caseSensitive, backwards, false, false, false, false);
		if (found == false) {
			obj.changed.range.setStart(range.startContainer, range.startOffset);
			obj.changed.range.setEnd(range.endContainer, range.endOffset);
			obj.changed.range.collapse(backwards);
		}
		else {
			range = obj.sel.getRangeAt(obj.sel.rangeCount - 1);
			obj.changed.range.setStart(range.startContainer, range.startOffset);
			obj.changed.range.setEnd(range.endContainer, range.endOffset);
		}
	}
 
// slow javascript regexp find and replace
	else {
 
// perform find
		WikEdParseDOM(obj, wikEdFrameBody);
		var regExpMatch = [];
 
// find next, search to the right
		if (backwards == false) {
 
// set start position for search to right
			regExp.lastIndex = obj.plainFocus;
 
// execute the regexp search to the right
			regExpMatch = regExp.exec(obj.plain);
 
// collapse the selection to its end for no find
			if (regExpMatch == null) {
				obj.changed.range.setEnd(range.endContainer, range.endOffset);
				obj.changed.range.collapse(false);
			}
		}
 
// find previous, search to the left
		else {
 
// cycle through the matches to the left
			var regExpMatchNext;
			do {
				regExpMatch = regExpMatchNext;
				regExpMatchNext = regExp.exec(obj.plain);
				if (regExpMatchNext == null) {
					break;
				}
			} while (regExpMatchNext.index < obj.plainAnchor);
 
// collapse the selection to its start for no find
			if (regExpMatch == null) {
				obj.changed.range.setStart(range.startContainer, range.startOffset);
				obj.changed.range.collapse(true);
			}
		}
 
// select the find
		if (regExpMatch != null) {
			i = 0;
			while ( (obj.plainStart[i + 1] <= regExpMatch.index) && (obj.plainStart[i + 1] != null) ) {
				i ++;
			}
			j = i;
			while ( (obj.plainStart[j + 1] <= regExpMatch.index + regExpMatch[0].length) && (obj.plainStart[j + 1] != null) ) {
				j ++;
			}
			obj.changed.range.setEnd  (obj.plainNode[j], regExpMatch.index + regExpMatch[0].length - obj.plainStart[j]);
			obj.changed.range.setStart(obj.plainNode[i], regExpMatch.index - obj.plainStart[i]);
		}
	}
	return;
}
 
 
//
// WikEdTextify: strip html off of text
//
 
function WikEdTextify(obj) {
 
// convert html to plain
	obj.plain = obj.html;
	obj.plain = obj.plain.replace(/\n/g, ' ');
 
// delete tags
	obj.plain = obj.plain.replace(/<(style|script|object|applet|embed)\b[^>]*>.*?<\/\1>/g, '');
 
// newlines
	obj.plain = obj.plain.replace(/<(br)\b[^>]*>/g, '\n');
 
// remove highlighting pre tags
	var isRemove = [];
	obj.plain = obj.plain.replace(/(<(\/?)pre\b([^>]*)>)/g,
		function (p, p1, p2, p3) {
			if (p2 == '') {
				if (/\bclass=\"wikEd\w+\"/.test(p3)) {
					isRemove.push(true);
					return('');
				}
				isRemove.push(false);
				return(p1);
			}
			if (isRemove.pop() == true) {
				return('');
			}
			return(p1);
		}
	);
 
// blocks
	obj.plain = obj.plain.replace(/<\/?(address|blockquote|center|div|h1|h2|h3|h4|h5|h6|hr|isindex|p|pre)\b[^>]*>/g, '\u0000\u0000');
 
// lists
	obj.plain = obj.plain.replace(/<\/?(dir|dl|menu|ol|ul)\b[^>]*>/g, '\u0000');
	obj.plain = obj.plain.replace(/<\/(dd|dt|li)>/g, '\u0000');
 
// forms
	obj.plain = obj.plain.replace(/<\/?(select|textarea)\b[^>]*>/g, '\u0000');
	obj.plain = obj.plain.replace(/<\/(option|legend|optgroup)>/g, '\u0000');
 
// table
	obj.plain = obj.plain.replace(/<\/?(table|caption)\b[^>]*>/g, '\u0000');
	obj.plain = obj.plain.replace(/<\/(tr|th|td)>/g, '\u0000');
 
// finish html to plain conversion
	obj.plain = obj.plain.replace(/<[^>]*>/g, '');
 
// remove spaces
	obj.plain = obj.plain.replace(/[ \t\u00a0]+(\u0000)/g, '$1');
	obj.plain = obj.plain.replace(/(\u0000)[ \t\u00a0]+/g, '$1');
 
// trim down \u0000 and \n
	obj.plain = obj.plain.replace(/\u0000+/g, '\n');
 
	return;
}
 
 
//
// WikEdInactiveButtons: grey out inactive buttons, called after every change and click
//
 
function WikEdInactiveButtons() {
 
// undo, prevpos
	if (wikEdFrameDocument.queryCommandEnabled('undo') == true ) {
		document.getElementById('wikEdUndo').className = 'wikEdButton';
		document.getElementById('wikEdPrevPos').className = 'wikEdButton';
		document.getElementById('wikEdUndoAll').className = 'wikEdButton';
	}
	else {
		document.getElementById('wikEdUndo').className = 'wikEdButtonInactive';
		document.getElementById('wikEdPrevPos').className = 'wikEdButtonInactive';
		document.getElementById('wikEdUndoAll').className = 'wikEdButtonInactive';
	}
 
// redo
	if (wikEdFrameDocument.queryCommandEnabled('redo') == true ) {
		document.getElementById('wikEdRedo').className = 'wikEdButton';
	}
	else {
		document.getElementById('wikEdRedo').className = 'wikEdButtonInactive';
	}
 
// redo all
	if (wikEdLastVersion != null) {
		document.getElementById('wikEdRedoAll').className = 'wikEdButton';
	}
	else {
		document.getElementById('wikEdRedoAll').className = 'wikEdButtonInactive';
	}
 
// lastpos
	if (wikEdLastPosObj != null) {
		document.getElementById('wikEdLastPos').className = 'wikEdButton';
	}
	else {
		document.getElementById('wikEdLastPos').className = 'wikEdButtonInactive';
	}
 
	return;
}
 
//
// WikEdFixBasic: fix characters, spaces, empty lines, certain headings, needed for all fixing functions
//
 
/// change: double spaces ok after dot
 
function WikEdFixBasic(obj) {
 
// non-breaking space character to normal space
	obj.plain = obj.plain.replace(/(\u00a0)/g, ' ');
 
// remove trailing spaces
	obj.plain = obj.plain.replace(/( |&nbsp;)+\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(/(&lt;!--) *([^\n]*?) *(--&gt;)/g, '$1 $2 $3');
 
 
/* ????
// empty lines around html comments
	obj.plain = obj.plain.replace(/\n+(&lt;!--.*?--&gt;)\n+/g, '\n$1\n\n');
	obj.plain = obj.plain.replace(/^(&lt;!--.*?--&gt;)\n+/g, '$1\n');
	obj.plain = obj.plain.replace(/\n+(&lt;!--.*?--&gt;)$/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 = '&#0*' + parseInt(wikEdSupportedChars[i][0], 16) + ';|';
 
// hex representation
		regExpStr += '&#x0*' + wikEdSupportedChars[i][0] + ';';
 
// case insensitive replace
		var regExp = new RegExp(regExpStr, 'gi');
		obj.plain = obj.plain.replace(regExp, replaceChar);
 
// character entity representation
		regExpStr = '&amp;' + 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 = '&#0*' + parseInt(wikEdProblemChars[i][0], 16) + ';|';
 
// hex representation
		regExpStr += '&#x0*' + 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 = '&amp;' + wikEdSpecialChars[i][1] + ';';
 
// decimal representation
		var regExpStr = '&#0*' + parseInt(wikEdSpecialChars[i][0], 16) + ';|';
 
// hex representation
		regExpStr += '&#x0*' + 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(/(.*?)((&lt;math(\b.*?)&gt;.*?&lt;\/math&gt;)|$)/gi,
		function (p, p1, p2) {
 
// convert html entities into actual dash characters
			p1 = p1.replace(/&plus;/g, '+');
			p1 = p1.replace(/&minus;/g, '\u2212');
			p1 = p1.replace(/&middot;/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&lt;sup&gt;$2&lt;/sup&gt;');
 
// change x^3 to x<sup>3</sup>
			p1 = p1.replace(/([\w])\^(\u2212?\d+\.?\d*) /g, '$1&lt;sup&gt;$2&lt;/sup&gt;');
 
// change +/- to ±
			p1 = p1.replace(/( |\d)\+\/(-|\u2212)( |\d)/g, '$1\u00b1$3');
 
// htmlize single char superscripts
			p1 = p1.replace(/(\u00b9|&sup1;)/g, '&lt;sup&gt;1&lt;/sup&gt;');
			p1 = p1.replace(/(\u00b2|&sup2;)/g, '&lt;sup&gt;2&lt;/sup&gt;');
			p1 = p1.replace(/(\u00b3|&sup3;)/g, '&lt;sup&gt;3&lt;/sup&gt;');
 
			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(/&plus;/g, '+');
	obj.plain = obj.plain.replace(/&minus;/g, '\u2212');
	obj.plain = obj.plain.replace(/&middot;/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 + '&lt;sup&gt;' + p2 + '&lt;/sup&gt;');
		}
	);
 
// fix indices
	regExp = new RegExp('(' + realElements + pseudoElements + '|\\))(\\d+)', 'g');
	obj.plain = obj.plain.replace(regExp, '$1&lt;sub&gt;$2&lt;/sub&gt;');
 
// fix prefixes
	regExp = new RegExp('(\\d+) *(\\(|' + realElements + pseudoElements + ')', 'g');
	obj.plain = obj.plain.replace(regExp, '$1$2');
 
// fix arrows
	obj.plain = obj.plain.replace(/ *-+&gt; */g, ' \u2192 ');
	obj.plain = obj.plain.replace(/ *&lt;-+ */g, ' \u2190 ');
 
// &hdarr; and "leftwards harpoon over rightwards harpoon" not supported in IE6
//	obj.plain = obj.plain.replace(/ *(&lt;=+&gt;|&hdarr;|&harr;|\u2190 *\u2192) */g, ' \u21cc ');
	obj.plain = obj.plain.replace(/ *(&lt;==+&gt;|&hdarr;|&harr;|\u21cc|\u2190 *\u2192) */g, ' <=> ');
 
// fix -
	obj.plain = obj.plain.replace(/(\w|\)|&gt;) +(-|\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 &deg; into actual ° symbol
	obj.plain = obj.plain.replace(/&deg;/g, '°');
 
// convert the word ohm(s) or the html entity into the actual Omega symbol (not the actual ohm symbol &#8486;) 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|&mu;|µ|&micro;|n|p|f|a|z|y)? ?(&Omega;|&#8486;|(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) ?(&mu;|&micro;)(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|&mu;|µ|&micro;|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|&mu;|µ|&micro;|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|&mu;|µ|&micro;|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|&mu;|µ|&micro;|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(/&mdash;/g, '—');
	obj.plain = obj.plain.replace(/&ndash;/g, '–');
	obj.plain = obj.plain.replace(/&minus;/g, '\u2212');
 
// convert -- and em dashes with or without spaces to em dash surrounded by spaces
	obj.plain = obj.plain.replace(/([a-zA-Z\'\"”\]\}\)]) *(--|—|&mdash;) *([a-zA-Z\'\"“\[\{\(])/g, '$1 — $3');
 
// convert - or en dashes with spaces to em dash character surrounded by spaces
	obj.plain = obj.plain.replace(/([a-zA-Z\'\"”\]\}])( |&nbsp;)+(\u2212|–|&ndash;) +([a-zA-Z\'\"“\[\{])/g, '$1$2— $4');
 
// convert hyphen next to lone number into a minus sign character
	obj.plain = obj.plain.replace(/([a-zA-Z\'\"”\]\>] )-(\d)/g, '$1\u2212$2');
 
// convert dashes to en dashes in dates
	obj.plain = obj.plain.replace(/([ \(][12]\d\d\d) ?(--?|—|&mdash;) ?([12]\d\d\d|\d\d)([ \),.;])/g, '$1–$3$4');
 
	return;
}
 
 
//
// WikEdFixHTML: fix html to wikicode
//
 
function WikEdFixHTML(obj) {
	WikEdFixBasic(obj);
 
// remove syntax highlighting
	obj.html = obj.plain;
	obj.html = obj.html.replace(/\n/g, '<br />');
	WikEdRemoveHighlighting(obj);
 
// turn visible html code into real html, exclude comments
	obj.html = obj.html.replace(/&lt;(\/?\w.*?)&gt;/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, '&lt;');
	obj.html = obj.html.replace(/>/g, '&gt;');
	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+\;|&lt;[^\n]*?&gt;|\{\{.*?\}\}[^\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+\;|&lt;[^\n]*?&gt;|\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+\;|&lt;[^\n]*?&gt;|\d|[^\w\n])*)([^\W\d].*? =+)$/gm,
		function (p, p1, p2, p3) {
			if ( ! p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/) ) {
				p3 = p3.substr(0, 1).toUpperCase() + p3.substr(1);
			}
			return(p1 + p3);
		}
	);
 
// uppercase images
	regExp = new RegExp('(\\[\\[)' + wikEdText['wikicode Image'] + ':(\\w)([^\\n]*\\]\\])', 'igm');
	obj.plain = obj.plain.replace(regExp,
		function (p, p1, p2, p3) {
			return(p1 + wikEdText['wikicode Image'] + ':' + p2.toUpperCase() + p3);
		}
	);
 
	return;
}
 
//
// WikEdFixAll:
//
 
function WikEdFixAll(obj) {
	WikEdFixBasic(obj);
	WikEdFixUnicode(obj);
	WikEdFixHTML(obj);
	WikEdFixCaps(obj);
	return;
}
 
 
//
// WikEdRemoveElements: remove elements by tag name
//
 
function WikEdRemoveElements(tagNameArray) {
 
// cycle through the element names
	for each (var tagNameStr in tagNameArray) {
		var elementArray = wikEdFrameDocument.getElementsByTagName(tagNameStr);
		for (i = 0; i < elementArray.length; i ++) {
			elementArray[i].parentNode.removeChild(elementArray[i]);
		}
	}
	return;
}
 
 
//
// WikEdFindBoundaries: find word boundaries and line boundaries starting from selection.range
//
 
function WikEdFindBoundaries(word, line, whole, selection) {
 
// get the start node and offset
	var startNode = selection.range.startContainer;
	var startNodeOffset = selection.range.startOffset;
 
// get the end node and offset
	var endNode = selection.range.endContainer;
	var endNodeOffset = selection.range.endOffset;
 
	if (startNode.nodeType == 1) {
		startNode = startNode.childNodes[startNodeOffset];
		startNodeOffset = 0;
	}
	if (endNode.nodeType == 1) {
		endNode = endNode.childNodes[endNodeOffset];
		endNodeOffset = 0;
	}
 
// find the start and end nodes in the whole plain text arrays
	var startNodeIndex;
	var endNodeIndex;
	for (i = 0; i < whole.plainNode.length; i ++) {
		if (startNode == whole.plainNode[i]) {
			startNodeIndex = i;
		}
		if (endNode == whole.plainNode[i]) {
			endNodeIndex = i;
			break;
		}
	}
 
// find last previous word and line boundary
	var foundWord = false;
	var foundLine = false;
	var regExp = new RegExp('.*[^\\w\\-]', 'g');
	var plain = '';
 
// check text nodes left-wise for a boundary
	for (i = startNodeIndex; i >= 0; i --) {
		plain = whole.plainArray[i];
 
				plain = plain.replace(/&amp;/g, '&');
				plain = plain.replace(/&lt;/g, '<');
				plain = plain.replace(/&gt;/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(/&amp;/g, '&');
				plain = plain.replace(/&lt;/g, '<');
				plain = plain.replace(/&gt;/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(/&amp;/g, '&');
				plain = plain.replace(/&lt;/g, '<');
				plain = plain.replace(/&gt;/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 < > &lt; &gt; &amp;  spaces instead of &nbsp;  \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, '&amp;');
 
// 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, '&lt;br /&gt;');
			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=([^\\"]*?)(&amp;|\\")';
			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+)(&amp;|\\")';
					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=.*?&amp;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&amp;db=pubmed&amp;.*?&amp;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(/&amp;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, '&lt;');
	obj.html = obj.html.replace(/>/g, '&gt;');
 
// 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 < > &lt; &gt; &amp;  spaces instead of &nbsp;  \n instead of <br />
 
function WikEdHighlightSyntax(obj, singleLine) {
 
// block elements
 
// various blocks
	if (singleLine != true) {
		obj.html = obj.html.replace(/(&lt;(blockquote|center|div|pre)\b.*?&gt;)/gi, '<span class="wikEdBlock">$1');
		obj.html = obj.html.replace(/(&lt;\/(blockquote|center|div|pre)\b.*?&gt;)/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">&nbsp;$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(/(&lt;hr&gt;)/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(/(&lt;table\b.*?&gt;)/gi, '<span class="wikEdTableBlock">$1');
		obj.html = obj.html.replace(/(&lt;\/table\b.*?&gt;)/gi, '$1</span><!--wikEdTableBlock-->');
	}
 
// <gallery> wiki markup
	if (singleLine != true) {
		obj.html = obj.html.replace(/(&lt;(gallery)\b.*?&gt;)/gi, '<span class="wikEdWiki">$1');
		obj.html = obj.html.replace(/(&lt;\/(gallery)\b.*?&gt;)/gi, '$1</span><!--wikEdWiki-->');
	}
 
// various block tags
	obj.html = obj.html.replace(/(&lt;\/?(blockquote|center|div|pre)\b.*?&gt;)/gi, '<span class="wikEdBlockTag">$1</span><!--wikEdBlockTag-->');
 
// <p> ... </p> pairs with (wikEdBlockTag) and withhout attributes (wikEdUnknown)
	var isRemove = [];
	obj.html = obj.html.replace(/(&lt;(\/?)p\b(.*?)&gt;)/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(/((&lt;)sup\b.*?(&gt;)(.*?)(&lt;)\/sup\b.*?(&gt;))/gi, '<span class="wikEdSuperscript">$1</span><!--wikEdSuperscript-->');
	obj.html = obj.html.replace(/((&lt;)sub\b.*?(&gt;)(.*?)(&lt;)\/sub\b.*?(&gt;))/gi, '<span class="wikEdSubscript">$1</span><!--wikEdSubscript-->');
	obj.html = obj.html.replace(/((&lt;)(ins|u)\b.*?(&gt;)(.*?)(&lt;)\/(ins|u)\b.*?(&gt;))/gi, '<span class="wikEdIns">$1</span><!--wikEdIns-->');
	obj.html = obj.html.replace(/((&lt;)(del|s|strike)\b.*?(&gt;)(.*?)(&lt;)\/(del|s|strike)\b.*?(&gt;))/gi, '<span class="wikEdDel">$1</span><!--wikEdDel-->');
 
// various inline tags
	obj.html = obj.html.replace(/(&lt;\/?(sub|sup|ins|u|del|s|strike|big|br|colgroup|code|font|small|span|tt|rb|rp|rt|ruby)\b.*?&gt;)/gi, '<span class="wikEdInlineTag">$1</span><!--wikEdInlineTag-->');
 
// unsupported or not needed <> tags
	obj.html = obj.html.replace(/(&lt;\/?)(\w+)(.*?\/?&gt;)/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(/(&lt;!--[^]*?--&gt;)/g, '<span class="wikEdComment">$1</span><!--wikEdComment-->');
 
// <nowiki> <math> <noinclude> <includeonly> <ref> <references> wiki markup
	obj.html = obj.html.replace(/((&lt;)(nowiki|math|gallery|noinclude|includeonly|ref|references)\b.*?(&gt;)(.*?)(&lt;)\/(nowiki|math|gallery|noinclude|includeonly|ref|references)\b.*?(&gt;))/gi, '<span class="wikEdWiki">$1</span><!--wikEdWiki-->');
 
// URLs, allowed chars: \w / . & ? = - @ # % ~ + (; allowed because of &amp; 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(/&nbsp;/g, ' ');
	obj.plain = obj.plain.replace(/&lt;/g, '<');
	obj.plain = obj.plain.replace(/&gt;/g, '>');
	obj.plain = obj.plain.replace(/&amp;/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, '&amp;');
	obj.html = obj.html.replace(/>/g, '&gt;');
	obj.html = obj.html.replace(/</g, '&lt;');
 
// 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-&nbsp;
	obj.html = obj.html.replace(/  /g, '&nbsp; ');
	obj.html = obj.html.replace(/  /g, '&nbsp; ');
	obj.html = obj.html.replace(/ \n/g, '&nbsp;\n');
 
// newlines to <br />
	obj.html = obj.html.replace(/\n/g, '<br />');
 
// set frame content
	wikEdFrameBody.innerHTML = obj.html;
 
	return;
}
 
 
//
// WikEdKeyFrame: event handler for key and mouse events in the frame
//
 
function WikEdKeyFrame(event) {
 
	if ( (wikEdDisabled == false) && (wikEdUseWikEd == true) ) {
		switch (event.type) {
 
// trap the tab key
			case 'keydown':
				switch (event.keyCode) {
					case 9:
						if (event.shiftKey == false) {
							event.preventDefault();
 
// scroll to text input top
							if (wikEdFullScreenMode == false) {
								var wikEdInputWrapper = document.getElementById('wikEdInputWrapper');
								var inputWrapperTop = WikEdGetOffsetTop(wikEdInputWrapper);
								window.scroll(0, inputWrapperTop);
							}
 
// focus the summary
							wikEdSummaryText.focus();
						}
						break;
				}
				break;
 
// trap any other frame event
			case 'keyup':
			case 'keypress':
			case 'mouseup':
 
// grey out inactive buttons
				WikEdInactiveButtons();
 
// reset the frame DOM cache
				wikEdFrameDOMCache = null;
				break;
		}
	}
 
	return;
}
 
 
//
// WikEdFrameExecCommand: wrapper for execCommand method
//
 
function WikEdFrameExecCommand(command, option) {
 
	wikEdFrameDocument.execCommand(command, false, option);
	return;
}
 
 
//
// WikEdFindAhead: non-regexp and case-insensitive find-as-you-type, event handler for find field
//
 
function WikEdFindAhead() {
 
	if (wikEdFindAhead.checked == true) {
 
// get the find text
		var findText = wikEdFindText.value;
		if (findText == '') {
			return;
		}
 
// remember position
		var sel = wikEdFrameWindow.getSelection();
		var range = sel.getRangeAt(sel.rangeCount - 1).cloneRange();
		var rangeClone = range.cloneRange();
		var frameSrollTop = wikEdFrameBody.scrollTop;
 
// function: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog)
		sel.removeAllRanges();
		sel.addRange(range);
		range.collapse(true);
 
// function: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog)
		var found = wikEdFrameWindow.find(findText, false, false, true, false, false, false);
 
// start from top if not found
		if (found == false) {
 
// set cursor to start and search again
			sel.collapse(wikEdFrameBody, 0);
			found = wikEdFrameWindow.find(findText, false, false, true, false, false, false);
 
// add original selection
			if (found == false) {
				wikEdFrameBody.scrollTop = frameSrollTop;
				sel.removeAllRanges();
				sel.addRange(rangeClone);
			}
		}
	}
	return;
}
 
 
//
// WikEdMainSwitch: onclick handler for program logo
//
 
function WikEdMainSwitch() {
 
 
// enable wikEd
	if (wikEdDisabled == true) {
		wikEdDisabled = false;
		WikEdSetLogo();
		var cookieExpire = new Date();
		cookieExpire.setTime(cookieExpire.getTime() - 60 * 60 * 1000);
		WikEdSetCookie('wikEdDisabled', '', cookieExpire.toGMTString(), '/');
 
// turn rich text frame on
		if (wikEdLoaded == true) {
			WikEdUpdateFrame();
			WikEdSetEditArea(true);
			wikEdButtonsControl.style.display = 'block';
			wikEdButtonsPreview.style.display = 'block';
			wikEdButtonsJump.style.display = 'block';
		}
 
// setup wikEd
		else {
			WikEdSetup(false);
			return;
		}
	}
 
// disable wikEd
	else {
		wikEdDisabled = true;
		WikEdSetLogo();
		var cookieExpire = new Date();
		cookieExpire.setTime(cookieExpire.getTime() + wikEdCookieExpireSec * 1000);
		WikEdSetCookie('wikEdDisabled', 'true', cookieExpire.toGMTString(), '/');
		if (wikEdLoaded == true) {
			if (wikEdFullScreenMode == true) {
				WikEdFullScreen(false);
			}
 
// turn classic textarea on
			WikEdUpdateTextarea();
			WikEdSetEditArea(false);
			wikEdButtonsControl.style.display = 'none';
			wikEdButtonsPreview.style.display = 'none';
			wikEdLocalPrevWrapper.style.display = 'none';
			wikEdButtonsJump.style.display = 'none';
		}
	}
 
	return;
}
 
 
//
// WikEdFullScreen: change to fullscreen edit area  or back to normal view
//
 
function WikEdFullScreen(fullscreen, notFrame) {
 
// get dom nodes
	var wikEdButtonsPreview = document.getElementById('wikEdButtonsPreview');
 
// hide or show elements
	var displayStyle;
	if (fullscreen == true) {
		displayStyle = 'none';
	}
	else {
		displayStyle = 'block';
	}
 
// elements above input wrapper
	var node = document.getElementById('editform').previousSibling;
	while (node != null) {
		if ( (node.nodeName == 'DIV') || (node.nodeName == 'H3') ) {
			node.style.display = displayStyle;
		}
		node = node.previousSibling;
	}
	document.getElementsByTagName('H1')[0].style.display = displayStyle;
 
// divs below input wrapper
	var node = wikEdInputWrapper.nextSibling;
	while (node != null) {
		if (node.nodeName == 'DIV') {
			node.style.display = displayStyle;
		}
		node = node.nextSibling;
	}
 
// divs below input wrapper, some levels up
	var node = document.getElementById('column-one');
	while (node != null) {
		if (node.nodeName == 'DIV') {
			node.style.display = displayStyle;
		}
		node = node.nextSibling;
	}
 
// insert wrapper
	document.getElementById('wikEdInsertWrapper').style.display = displayStyle;
 
// change styles
	if (fullscreen) {
		if (notFrame != true) {
			wikEdInputWrapper.className = 'wikEdInputWrapperFull';
		}
		wikEdButtonsPreview.className = 'wikEdButtonsPreviewFull';
	}
	else {
		if (notFrame != true) {
			wikEdInputWrapper.className = 'wikEdInputWrapper';
		}
		wikEdButtonsPreview.className = 'wikEdButtonsPreview';
	}
 
// resize the frame
		if (fullscreen) {
			var consoleTop = WikEdGetOffsetTop(wikEdConsoleWrapper);
			var consoleHeight = wikEdConsoleWrapper.offsetHeight;
			var frameHeight = wikEdFrame.offsetHeight;
			var windowHeight = window.innerHeight;
			var windowWidth = window.innerWidth;
			var frameHeightNew =  frameHeight + (windowHeight - (consoleTop + consoleHeight) ) - 2;
			wikEdFrame.style.height = frameHeightNew + 'px';
		}
		else {
			wikEdFrame.style.height = wikEdTextareaHeight + 'px';
		}
 
// scroll to edit-frame
	if (fullscreen == false) {
		window.scroll(0, WikEdGetOffsetTop(wikEdInputWrapper) - 2);
	}
 
// set the fullscreen button state
	WikEdButton('wikEdFullScreen', null, fullscreen);
 
// grey out or re-activate scroll-to buttons
	var buttonClass;
	if (fullscreen) {
		buttonClass = 'wikEdButtonInactive';
	}
	else {
		buttonClass = 'wikEdButton';
	}
	document.getElementById('wikEdScrollToInput').className = buttonClass;
	document.getElementById('wikEdScrollToInput2').className = buttonClass;
	document.getElementById('wikEdScrollToButtons').className = buttonClass;
	document.getElementById('wikEdScrollToButtons2').className = buttonClass;
 
	wikEdFullScreenMode = fullscreen;
 
	return;
}
 
 
//
// WikEdResizeComboInput: set the size of the background select boxes so that the button is visible
//
 
function WikEdResizeComboInput(field) {
 
// add a dummy option
	var dummy;
	if (wikEdSelectElement[field].options.length == 0) {
		wikEdSelectElement[field].options[0] = new Option('');
		dummy = true;
	}
 
// set option widths to 0
	for (i = 0; i < wikEdSelectElement[field].options.length; i ++) {
		wikEdSelectElement[field].options[i].style.width = '0';
	}
 
// calculate select width
	var inputWidth = wikEdInputElement[field].clientWidth;
	var selectWidth = wikEdSelectElement[field].clientWidth;
	var optionWidth = wikEdSelectElement[field].options[0].offsetWidth;
	var border = wikEdInputElement[field].offsetWidth - wikEdInputElement[field].clientWidth;
	wikEdSelectElement[field].style.width = (selectWidth - optionWidth + inputWidth - border) + 'px';
 
// delete dummy option
	if (dummy == true) {
		wikEdSelectElement[field].options[0] = null;
	}
 
// set option widths to auto
	for (i = 0; i < wikEdSelectElement[field].options.length; i ++) {
		wikEdSelectElement[field].options[i].style.width = 'auto';
	}
	return;
}
 
 
//
// WikEdChangeComboInput: set the input value to selected option; onchange event handler for select boxes
//
 
function WikEdChangeComboInput(field) {
 
// get selection index (-1 for unselected)
	var selected = wikEdSelectElement[field].selectedIndex;
	if (selected >= 0) {
 
// get selected option
		var option = wikEdSelectElement[field].options[selected];
		if (option.text != '') {
 
// add a tag to the summary box
			if (field == 'summary') {
				wikEdInputElement[field].value = WikEdAppendToSummary(wikEdInputElement[field].value, option.text);
			}
 
// add case and regexp checkboxes to find / replace fields
			else if (option.value == 'setcheck') {
				WikEdButton('wikEdCaseSensitive', null, (option.text.charAt(0) == wikEdCheckMarker[true]) );
				WikEdButton('wikEdRegExp',        null, (option.text.charAt(1) == wikEdCheckMarker[true]) );
				wikEdInputElement[field].value = option.text.substr(3);
			}
 
// add option text
			else {
				wikEdInputElement[field].value = option.text;
			}
		}
	}
 
// find the new text
	if ( (field == 'find') && (wikEdFindAhead.checked == true) ) {
		WikEdFindAhead();
	}
 
	return;
}
 
 
//
// WikEdAppendToSummary: append a phrase to the summary text
//
 
function WikEdAppendToSummary(summary, append) {
 
	summary = summary.replace(/^[, ]+/, '');
	summary = summary.replace(/[, ]+$/, '');
	if (summary != '') {
		if (summary.match(/ \*\/$/) != null) {
			summary += ' ';
		}
		else if (summary.match(/[\.\;\:]$/) != null) {
			summary += ' ';
		}
		else if (summary.match(/^[\w\(\)\"\'\+\-]/) == null) {
			summary += ' ';
		}
		else {
			summary += ', ';
		}
	}
	summary += append;
 
	return(summary);
}
 
 
//
// WikEdAddToHistory: add an input value to the cookie history
//
 
function WikEdAddToHistory(field) {
 
	if (wikEdInputElement[field].value != '') {
 
// load history from cookie
		WikEdLoadHistoryFromCookie(field);
 
// add current value to history
		wikEdFieldHist[field].unshift(wikEdInputElement[field].value);
 
// add case and regexp checkboxes to find / replace value
		if ( (field == 'find') || (field == 'replace') ) {
			wikEdFieldHist[field][0] =
				wikEdCheckMarker[ document.getElementById('wikEdCaseSensitive').checked ] +
				wikEdCheckMarker[ document.getElementById('wikEdRegExp').checked ] +
				' ' + wikEdFieldHist[field][0];
		}
 
// remove paragraph names from summary
		if (field == 'summary') {
			wikEdFieldHist[field][0] = wikEdFieldHist[field][0].replace(/^\/\* .*? \*\/ */, '');
		}
 
// remove multiple old copies from history
		i = 1;
		while (i < wikEdFieldHist[field].length) {
			if (wikEdFieldHist[field][i] == wikEdFieldHist[field][0]) {
				wikEdFieldHist[field].splice(i, 1);
			}
			else {
				i ++;
			}
		}
 
// remove new value if it is a preset value
		if (wikEdComboPresetOptions[field] != null) {
			i = 0;
			while (i < wikEdComboPresetOptions[field].length) {
				if (wikEdComboPresetOptions[field][i] == wikEdFieldHist[field][0]) {
					wikEdFieldHist[field].shift();
					break;
				}
				else {
					i ++;
				}
			}
		}
 
// cut history number to maximal history length
		wikEdFieldHist[field] = wikEdFieldHist[field].slice(0, wikEdHistoryLength[field]);
 
// saved history to cookie
		if (wikEdFieldHist[field][0] != '') {
			WikEdSaveHistoryToCookie(field);
		}
	}
	return;
}
 
 
//
// WikEdSetComboOptions: generate the select options from cookie history; onfocus handler for select box
//
 
function WikEdSetComboOptions(field) {
 
// load history from cookie
	WikEdLoadHistoryFromCookie(field);
 
	var option = {};
	var selected = null;
 
// delete options
	var options = wikEdSelectElement[field].options;
	for (i = 0; i < options.length; i ++) {
		wikEdSelectElement[field].remove(i);
	}
 
// delete optgroup
	option = document.getElementById(field + 'Optgroup');
	if (option != null) {
		wikEdSelectElement[field].removeChild(option);
	}
 
// workaround for onchange not firing when selecting first option from unselected dropdown
	option = document.createElement('option');
	option.style.display = 'none';
	j = 0;
	wikEdSelectElement[field].options[j++] = option;
 
// add history entries
	for (i = 0; i < wikEdFieldHist[field].length; i ++) {
		if (wikEdFieldHist[field][i] != null) {
			if (wikEdFieldHist[field][i] == wikEdInputElement[field].value) {
				selected = j;
			}
			option = document.createElement('option');
			option.text = wikEdFieldHist[field][i];
			if ( (field == 'find') || (field == 'replace') ) {
				option.value = 'setcheck';
			}
			wikEdSelectElement[field].options[j++] = option;
		}
	}
 
// add preset entries
	if (wikEdComboPresetOptions[field] != null) {
		var startPreset = j;
		for (i = 0; i < wikEdComboPresetOptions[field].length; i ++) {
			if (wikEdComboPresetOptions[field][i] != null) {
				if (wikEdComboPresetOptions[field][i] == wikEdInputElement[field].value) {
					selected = j;
				}
				option = document.createElement('option');
				option.text = wikEdComboPresetOptions[field][i];
				if (field == 'summary') {
					option.text = option.text.replace(/\{wikEdUsing\}/g, wikEdSummaryUsing);
				}
				wikEdSelectElement[field].options[j++] = option;
			}
		}
 
// add a blank separator
		if (startPreset > 1) {
			option = document.createElement('optgroup');
			option.label = '\u00a0';
			option.id = field + 'Optgroup';
			wikEdSelectElement[field].insertBefore(option, wikEdSelectElement[field].options[startPreset]);
		}
	}
 
// set the selection
	wikEdSelectElement[field].selectedIndex = selected;
	return;
}
 
 
//
// WikEdClearHistory: clear the history of combo input fields
//
 
function WikEdClearHistory(field) {
	var cookieExpire = new Date();
	cookieExpire.setTime( cookieExpire.getTime() + wikEdCookieExpireSec * 1000 );
	WikEdSetCookie(wikEdCookieName[field], '', cookieExpire.toGMTString(), '/');
	WikEdSetComboOptions(field);
	return;
}
 
 
//
// WikEdLoadHistoryFromCookie: get the input box history from the respective cookie
//
 
function WikEdLoadHistoryFromCookie(field) {
	var cookie = WikEdGetCookie(wikEdCookieName[field]);
	if (cookie != '') {
		cookie = decodeURIComponent(cookie);
		wikEdFieldHist[field] = cookie.split('\n');
	}
	else {
		wikEdFieldHist[field] = [];
	}
	return;
}
 
 
//
// WikEdSaveHistoryToCookie: save the input box history to the respective cookie
//
 
function WikEdSaveHistoryToCookie(field) {
	var cookieExpire = new Date();
	cookieExpire.setTime( cookieExpire.getTime() + wikEdCookieExpireSec * 1000 );
	var cookie = '';
	cookie = wikEdFieldHist[field].join('\n')
	cookie = cookie.replace(/\n$/, '');
	cookie = encodeURIComponent(cookie);
	WikEdSetCookie(wikEdCookieName[field], cookie, cookieExpire.toGMTString(), '/');
	return;
}
 
 
// WikEdGetStyle: get computed style properties for non-inline css definitions
function WikEdGetStyle(element, styleProperty) {
	var style;
	if (element != null) {
		style = document.defaultView.getComputedStyle(element, null).getPropertyValue(styleProperty);
	}
	return(style);
}
 
 
//
// WikEdGetCookie
//
 
function WikEdGetCookie(name) {
	var cookie = ' ' + document.cookie;
	var search = ' ' + name + '=';
	var setStr = '';
	var offset = 0;
	var end = 0;
	offset = cookie.indexOf(search);
	if (offset != -1) {
		offset += search.length;
		end = cookie.indexOf(';', offset)
		if (end == -1) {
			end = cookie.length;
		}
		setStr = cookie.substring(offset, end);
		setStr = setStr.replace(/\\+/g, ' ');
		setStr = decodeURIComponent(setStr);
	}
	return(setStr);
}
 
 
//
// WikEdSetCookie
//
 
function WikEdSetCookie(name, value, expires, path, domain, secure) {
	var cookie = name + '=' + encodeURIComponent(value);
	if (expires != null) {
		cookie += '; expires=' + expires
	}
	if (path != null) {
		cookie += '; path=' + path;
	}
	if (domain != null)  {
		cookie += '; domain=' + domain;
	}
	if (secure != null) {
		cookie += '; secure';
	}
	document.cookie = cookie;
}
 
 
//
// WikEdGetOffsetTop: get element offset relative to window top
//
 
function WikEdGetOffsetTop(element) {
	var offset = 0;
	do {
		offset += element.offsetTop;
	} while ( (element = element.offsetParent) != null );
	return(offset);
}
 
 
//
// WikEdGetOffsetLeft: get element offset relative to left window border
//
 
function WikEdGetOffsetLeft(element) {
	var offset = 0;
	do {
		offset += element.offsetLeft;
	} while ( (element = element.offsetParent) != null );
	return(offset);
}
 
 
// define leaf elements for WikEdGetInnerHTML
var wikEdLeafElements = [];
wikEdLeafElements['IMG'] = true;
wikEdLeafElements['HR'] = true;
wikEdLeafElements['BR'] = true;
wikEdLeafElements['INPUT'] = true;
 
 
//
// WikEdParseDOM: wikEdFrameDOMCache contains the last parse if the frame has not changed
//
 
function WikEdParseDOM(obj, topNode) {
 
/* problematic because of obj.changed //////////////////////
	if (wikEdFrameDOMCache != null) {
		obj = wikEdFrameDOMCache;
		return;
	}
*/
 
	obj.plainLength = 0;
	obj.plainArray = [];
	obj.plainNode = [];
	obj.plainStart = [];
	obj.plainPos = [];
	WikEdParseDOMRecursive(obj, topNode);
	obj.plain = obj.plainArray.join('');
	wikEdFrameDOMCache = obj;
	return;
}
 
 
//
// WikEdParseDOMRecursive:
//
 
function WikEdParseDOMRecursive(obj, currentNode) {
 
// cycle through the child nodes of currentNode
	for each (var childNode in currentNode.childNodes) {
 
		if (childNode == null) {
			break;
		}
 
// check for selection
		if (childNode == obj.sel.focusNode) {
			obj.plainFocus = obj.plainLength + obj.sel.focusOffset;
		}
		if (childNode == obj.sel.anchorNode) {
			obj.plainAnchor = obj.plainLength + obj.sel.anchorOffset;
		}
		var value = null;
 
// get text of child node
		switch (childNode.nodeType) {
			case 1:
				if ( (childNode.childNodes.length == 0) && (wikEdLeafElements[childNode.nodeName] == true) ) {
					if (childNode.nodeName == 'BR') {
						value = '\n';
					}
				}
				else {
					WikEdParseDOMRecursive(obj, childNode);
				}
				break;
			case 3:
				value = childNode.nodeValue;
				value = value.replace(/\n/g, ' ');
				break;
			case 5:
				value = '&' + childNode.nodeName + ';';
				break;
		}
 
// add text to text object
		if (value != null) {
 
// array of text fragments
			obj.plainArray.push(value);
 
// array of text fragment node references
			obj.plainNode.push(childNode);
 
// array of text fragment text positions
			obj.plainStart.push(obj.plainLength);
 
// node references containing text positions
			obj.plainPos[childNode] = obj.plainLength;
 
// current text length
			obj.plainLength += value.length;
		}
	}
	return;
}
 
 
//
// WikEdGetInnerHTML: get the innerHTML from a document fragment
//
 
function WikEdGetInnerHTML(obj, currentNode) {
 
// initialize string
	if (obj.html == null) {
		obj.html = '';
	}
	if (obj.plain == null) {
		obj.plain = '';
	}
	if (obj.plainArray == null) {
		obj.plainArray = [];
		obj.plainNode = [];
		obj.plainStart = [];
	}
 
	for (var i = 0; i < currentNode.childNodes.length; i ++) {
		var childNode = currentNode.childNodes.item(i);
		switch (childNode.nodeType) {
			case 1:
				obj.html += '<' + childNode.nodeName.toLowerCase();
				for (var j = 0; j < childNode.attributes.length; j ++) {
					if (childNode.attributes.item(j).nodeValue != null) {
						obj.html += ' ' + childNode.attributes.item(j).nodeName + '="' + childNode.attributes.item(j).nodeValue.replace(/</g, '&lt;').replace(/>/g, '&gt;') + '"';
					}
				}
				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 &amp; &lt; &gt;
				obj.plainNode.push(childNode);
				obj.plainStart.push(obj.plain.length);
				value = value.replace(/&/g, '&amp;');
				value = value.replace(/</g, '&lt;');
				value = value.replace(/>/g, '&gt;');
				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, '&amp;');
				obj.html += value;
				obj.plain += value;
				break;
			case 8: obj.html += '<!--' + childNode.nodeValue + '-->';
				break;
		}
	}
	return;
}
 
 
// WikEdStyleSheet: create a new style sheet object
function WikEdStyleSheet(documentObject) {
 
	this.styleElement = null;
	if (documentObject == null) {
		documentObject = document;
	}
 
// IE
	if (documentObject.createStyleSheet) {
		this.styleElement = documentObject.createStyleSheet();
	}
 
// standards compliant browsers
	else {
		this.styleElement = documentObject.createElement('style');
		this.styleElement.from = 'text/css';
		var insert = documentObject.getElementsByTagName('head')[0];
		if (insert != null) {
			insert.appendChild(this.styleElement);
		}
	}
 
// add-a-rule method
 
// IE
	this.addRule = function(selector, declaration) {
		if (this.styleElement.addRule) {
			this.styleElement.addRule(selector, declaration);
		}
 
// standards compliant browsers
		else {
			if (this.styleElement.sheet != null) {
				if (this.styleElement.sheet.insertRule != null) {
					this.styleElement.sheet.insertRule(selector + ' { ' + declaration + ' } ', 0);
				}
			}
		}
	};
	return;
}
 
 
// WED: shortcut for WikEdDebug
function WED(objectName, object) {
 
	WikEdDebug(objectName, object);
	return;
}
 
 
// WikEdDebug: print the value of variables
 
function WikEdDebug(objectName, object) {
 
	document.getElementById('wikEdTextareaWrapper').style.position = 'static';
	document.getElementById('wikEdTextareaWrapper').style.visibility = 'visible';
	wikEdTextarea.style.display = 'block';
	if (objectName == null) {
		wikEdTextarea.value = '';
		wikEdTextarea.style.height = '25em';
	}
	else {
		wikEdTextarea.value += objectName + ': ' + object + '\n';
	}
	return;
}
 
 
//
// character tables used in FixUnicode()
//   see http://kmi.open.ac.uk/projects/ceryle/doc/docs/NOTE-charents.html
//   removed because of internal use: < ['003c', 'lt']; > ['003e', 'gt']; & ['0026', 'amp'], ['00a0', 'nbsp']
 
// supported chars in Mozilla and IE
var wikEdSupportedChars = [
	['00a1', 'iexcl'],  // ¡
	['00a2', 'cent'],   // ¢
	['00a3', 'pound'],  // £
	['00a4', 'curren'], // ¤
	['00a5', 'yen'],    // ¥
	['00a6', 'brvbar'], // ¦
	['00a7', 'sect'],   // §
	['00a8', 'uml'],    // ¨
	['00a9', 'copy'],   // ©
	['00aa', 'ordf'],   // ª
	['00ab', 'laquo'],  // «
	['00ac', 'not'],    // ¬
	['00ae', 'reg'],    // ®
	['00af', 'macr'],   // ¯
	['00b0', 'deg'],    // °
	['00b1', 'plusmn'], // ±
	['00b2', 'sup2'],   // ²
	['00b3', 'sup3'],   // ³
	['00b4', 'acute'],  // ´
	['00b5', 'micro'],  // µ
	['00b6', 'para'],   // ¶
	['00b7', 'middot'], // ·
	['00b8', 'cedil'],  // ¸
	['00b9', 'sup1'],   // ¹
	['00ba', 'ordm'],   // º
	['00bb', 'raquo'],  // »
	['00bc', 'frac14'], // ¼
	['00bd', 'frac12'], // ½
	['00be', 'frac34'], // ¾
	['00bf', 'iquest'], // ¿
	['00c0', 'Agrave'], // À
	['00c1', 'Aacute'], // Á
	['00c2', 'Acirc'],  // Â
	['00c3', 'Atilde'], // Ã
	['00c4', 'Auml'],   // Ä
	['00c5', 'Aring'],  // Å
	['00c6', 'AElig'],  // Æ
	['00c7', 'Ccedil'], // Ç
	['00c8', 'Egrave'], // È
	['00c9', 'Eacute'], // É
	['00ca', 'Ecirc'],  // Ê
	['00cb', 'Euml'],   // Ë
	['00cc', 'Igrave'], // Ì
	['00cd', 'Iacute'], // Í
	['00ce', 'Icirc'],  // Î
	['00cf', 'Iuml'],   // Ï
	['00d0', 'ETH'],    // Ð
	['00d1', 'Ntilde'], // Ñ
	['00d2', 'Ograve'], // Ò
	['00d3', 'Oacute'], // Ó
	['00d4', 'Ocirc'],  // Ô
	['00d5', 'Otilde'], // Õ
	['00d6', 'Ouml'],   // Ö
	['00d7', 'times'],  // ×
	['00d8', 'Oslash'], // Ø
	['00d9', 'Ugrave'], // Ù
	['00da', 'Uacute'], // Ú
	['00db', 'Ucirc'],  // Û
	['00dc', 'Uuml'],   // Ü
	['00dd', 'Yacute'], // Ý
	['00de', 'THORN'],  // Þ
	['00df', 'szlig'],  // ß
	['00e0', 'agrave'], // à
	['00e1', 'aacute'], // á
	['00e2', 'acirc'],  // â
	['00e3', 'atilde'], // ã
	['00e4', 'auml'],   // ä
	['00e5', 'aring'],  // å
	['00e6', 'aelig'],  // æ
	['00e7', 'ccedil'], // ç
	['00e8', 'egrave'], // è
	['00e9', 'eacute'], // é
	['00ea', 'ecirc'],  // ê
	['00eb', 'euml'],   // ë
	['00ec', 'igrave'], // ì
	['00ed', 'iacute'], // í
	['00ee', 'icirc'],  // î
	['00ef', 'iuml'],   // ï
	['00f0', 'eth'],    // ð
	['00f1', 'ntilde'], // ñ
	['00f2', 'ograve'], // ò
	['00f3', 'oacute'], // ó
	['00f4', 'ocirc'],  // ô
	['00f5', 'otilde'], // õ
	['00f6', 'ouml'],   // ö
	['00f7', 'divide'], // ÷
	['00f8', 'oslash'], // ø
	['00f9', 'ugrave'], // ù
	['00fa', 'uacute'], // ú
	['00fb', 'ucirc'],  // û
	['00fc', 'uuml'],   // ü
	['00fd', 'yacute'], // ý
	['00fe', 'thorn'],  // þ
	['00ff', 'yuml'],   // ÿ
	['0027', 'apos'],   // '
	['0022', 'quot'],   // "
	['0152', 'OElig'],  // Œ
	['0153', 'oelig'],  // œ
	['0160', 'Scaron'], // Š
	['0161', 'scaron'], // š
	['0178', 'Yuml'],   // Ÿ
	['02c6', 'circ'],   // ˆ
	['02dc', 'tilde'],  // ˜
	['2013', 'ndash'],  // –
	['2014', 'mdash'],  // —
	['2018', 'lsquo'],  // ‘
	['2019', 'rsquo'],  // ’
	['201a', 'sbquo'],  // ‚
	['201c', 'ldquo'],  // “
	['201d', 'rdquo'],  // ”
	['201e', 'bdquo'],  // „
	['2020', 'dagger'], // †
	['2021', 'Dagger'], // ‡
	['2030', 'permil'], // ‰
	['2039', 'lsaquo'], // ‹
	['203a', 'rsaquo'], // ›
	['20ac', 'euro'],   // €
	['0192', 'fnof'],   // ƒ
	['0391', 'Alpha'],  // ?
	['0392', 'Beta'],   // ?
	['0393', 'Gamma'],  // G
	['0394', 'Delta'],  // ?
	['0395', 'Epsilon'],// ?
	['0396', 'Zeta'],   // ?
	['0397', 'Eta'],    // ?
	['0398', 'Theta'],  // T
	['0399', 'Iota'],   // ?
	['039a', 'Kappa'],  // ?
	['039b', 'Lambda'], // ?
	['039c', 'Mu'],     // ?
	['039d', 'Nu'],     // ?
	['039e', 'Xi'],     // ?
	['039f', 'Omicron'],// ?
	['03a0', 'Pi'],     // ?
	['03a1', 'Rho'],    // ?
	['03a3', 'Sigma'],  // S
	['03a4', 'Tau'],    // ?
	['03a5', 'Upsilon'],// ?
	['03a6', 'Phi'],    // F
	['03a7', 'Chi'],    // ?
	['03a8', 'Psi'],    // ?
	['03a9', 'Omega'],  // O
	['03b1', 'alpha'],  // a
	['03b2', 'beta'],   // ß
	['03b3', 'gamma'],  // ?
	['03b4', 'delta'],  // d
	['03b5', 'epsilon'],// e
	['03b6', 'zeta'],   // ?
	['03b7', 'eta'],    // ?
	['03b8', 'theta'],  // ?
	['03b9', 'iota'],   // ?
	['03ba', 'kappa'],  // ?
	['03bb', 'lambda'], // ?
	['03bc', 'mu'],     // µ
	['03bd', 'nu'],     // ?
	['03be', 'xi'],     // ?
	['03bf', 'omicron'],// ?
	['03c0', 'pi'],     // p
	['03c1', 'rho'],    // ?
	['03c2', 'sigmaf'], // ?
	['03c3', 'sigma'],  // s
	['03c4', 'tau'],    // t
	['03c5', 'upsilon'],// ?
	['03c6', 'phi'],    // f
	['03c7', 'chi'],    // ?
	['03c8', 'psi'],    // ?
	['03c9', 'omega'],  // ?
	['2022', 'bull'],   // •
	['2026', 'hellip'], // …
	['2032', 'prime'],  // '
	['2033', 'Prime'],  // ?
	['203e', 'oline'],  // ?
	['2044', 'frasl'],  // /
	['2122', 'trade'],  // ™
	['2190', 'larr'],   // ?
	['2191', 'uarr'],   // ?
	['2192', 'rarr'],   // ?
	['2193', 'darr'],   // ?
	['2194', 'harr'],   // ?
	['21d2', 'rArr'],   // ?
	['21d4', 'hArr'],   // ?
	['2200', 'forall'], // ?
	['2202', 'part'],   // ?
	['2203', 'exist'],  // ?
	['2207', 'nabla'],  // ?
	['2208', 'isin'],   // ?
	['220b', 'ni'],     // ?
	['220f', 'prod'],   // ?
	['2211', 'sum'],    // ?
	['2212', 'minus'],  // -
	['221a', 'radic'],  // v
	['221d', 'prop'],   // ?
	['221e', 'infin'],  // 8
	['2220', 'ang'],    // ?
	['2227', 'and'],    // ?
	['2228', 'or'],     // ?
	['2229', 'cap'],    // n
	['222a', 'cup'],    // ?
	['222b', 'int'],    // ?
	['2234', 'there4'], // ?
	['223c', 'sim'],    // ~
	['2248', 'asymp'],  // ˜
	['2260', 'ne'],     // ?
	['2261', 'equiv'],  // =
	['2264', 'le'],     // =
	['2265', 'ge'],     // =
	['2282', 'sub'],    // ?
	['2283', 'sup'],    // ?
	['2286', 'sube'],   // ?
	['2287', 'supe'],   // ?
	['2295', 'oplus'],  // ?
	['22a5', 'perp'],   // ?
	['25ca', 'loz'],    // ?
	['2660', 'spades'], // ?
	['2663', 'clubs'],  // ?
	['2665', 'hearts'], // ?
	['2666', 'diams']   // ?
];
 
// special chars (spaces and invisible characters)
//
var wikEdSpecialChars = [
	['2002', 'ensp'],   //   en space
	['00ad', 'shy'],    // ­ soft hyphen
	['2003', 'emsp'],   //   em space
	['2009', 'thinsp'], // ?  thin space
	['200c', 'zwnj'],   // ? zero width non-joiner
	['200d', 'zwj'],    // ? zero width joiner
	['200e', 'lrm'],    // ? left-to-right mark
	['200f', 'rlm']     // ? right-to-left mark
];
 
// unsupported chars in IE6
var wikEdProblemChars = [
	['03d1', 'thetasym'], // ?
	['03d2', 'upsih'],    // ?
	['03d6', 'piv'],      // ?
	['2118', 'weierp'],   // P
	['2111', 'image'],    // I
	['211c', 'real'],     // R
	['2135', 'alefsym'],  // ?
	['21b5', 'crarr'],    // ?
	['21d0', 'lArr'],     // ?
	['21d1', 'uArr'],     // ?
	['21d3', 'dArr'],     // ?
	['2205', 'empty'],    // Ø
	['2209', 'notin'],    // ?
	['2217', 'lowast'],   // *
	['2245', 'cong'],     // ?
	['2284', 'nsub'],     // ?
	['22a5', 'perp'],     // ?
	['2297', 'otimes'],   // ?
	['22c5', 'sdot'],     // ·
	['2308', 'lceil'],    // ?
	['2309', 'rceil'],    // ?
	['230a', 'lfloor'],   // ?
	['230b', 'rfloor'],   // ?
	['2329', 'lang'],     // <
	['232a', 'rang']      // >
];
 
// ASCII control characters and invisibles, used for syntax highlighting
var wikEdControlChars = {
	'0': 'null',
	'1': 'start of heading',
	'2': 'start of text',
	'3': 'end of text',
	'4': 'end of transmission',
	'5': 'enquiry',
	'6': 'acknowledge',
	'7': 'bell',
	'8': 'backspace',
	'9': 'horizontal tab',
	'10': 'line feed, new line',
	'11': 'vertical tab',
	'12': 'form feed, new page',
	'13': 'carriage return',
	'14': 'shift out',
	'15': 'shift in',
	'16': 'data link escape',
	'17': 'device control 1',
	'18': 'device control 2',
	'19': 'device control 3',
	'20': 'device control 4',
	'21': 'negative acknowledge',
	'22': 'synchronous idle',
	'23': 'end of trans. block',
	'24': 'cancel',
	'25': 'end of medium',
	'25': 'substitute',
	'26': 'escape',
	'27': 'file separator',
	'28': 'group separator',
	'29': 'record separator',
	'30': 'unit separator',
	'173' : 'soft hyphen',           // \u00ad
	'8204': 'zero width non-joiner', // \u200c
	'8205': 'zero width joiner',     // \u200d
	'8206': 'left-to-right mark',    // \u200e
	'8207': 'right-to-left mark',    // \u200f
	'8232': 'line separator',        // \u2028
	'8233': 'paragraph separator'    // \u2028
};
 
// strange spaces, used for syntax highlighting
var wikEdStrangeSpaces = {
	'31': 'non-breaking space', // \u00a0
	'8194': 'en space',         // \u2002
	'8195': 'em space',         // \u2003
	'8201': 'thin space',       // \u2009
};
 
/* </nowiki></pre> */