User:Foxall/wikedjs

Ka Wiktionary

1[wax ka badal]

// version info var wikEdProgramVersion = '0.9.37b'; var wikEdProgramDate = 'May 26, 2007';

/*

wiked[wax ka badal]

A full-featured JavaScript in-browser editor for Wikipedia and other MediaWiki edit pages The program works currently ONLY for Mozilla-based browsers (Mozilla, Mozilla Firefox, and Mozilla SeaMonkey)

Homepage: http://en.wikipedia.org/wiki/User:Cacycle/wikEd Author: Cacycle (http://en.wikipedia.org/wiki/User:Cacycle) License: This code has been released into the public domain

This file has to be saved as UTF-8 in your editor to preserve Unicode characters like ♥ (heart)

Installation[wax ka badal]

// ---- START INSTALLATION CODE ----

// install User:Cacycle/wikEd in-browser text editor document.write('<script type="text/javascript" src="' + 'http://en.wikipedia.org/w/index.php?title=User:Cacycle/wikEd.js' + '&action=raw&ctype=text/javascript"></script>');

// ---- END INSTALLATION CODE ----

  • /


// // user configurable variables //


// user readable texts, copy changes to http://en.wikipedia.org/wiki/User:Cacycle/wikEd_international_en.js, also defined in wikEdDiff.js var wikEdText = wikEdText || [];

// WikedInitText: define built-in user interface texts function WikedInitText() {

   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 browser alt':       '(wikEd)',
       'wikEdLogo browser title':     'Browser not supported - wikEd {wikEdProgramVersion} ({wikEdProgramDate})',
       'wikEdLogo disabled alt':      '(wikEd)',
       'wikEdLogo disabled title':    'Disabled - wikEd {wikEdProgramVersion} ({wikEdProgramDate}) Click to enable',

// top jumper

       'wikEdScrollToEdit4 alt':      'Scroll to edit',
       'wikEdScrollToEdit4 title':    'Scroll to edit field',

// button bar grip titles

       'wikEdGripFormat title':       'Formatting buttons (click to hide or show)',
       'wikEdGripCustom1 title':      'Custom buttons (click to hide or show)',
       'wikEdGripFind title':         'Find buttons (click to hide or show)',
       'wikEdGripFix title':          'Fixing buttons (click to hide or show)',
       'wikEdGripCustom2 title':      'Custom buttons (click to hide or show)',
       'wikEdGripControl title':      'wikEd control buttons (click to hide or show)',

// formatting buttons, top row

       'wikEdUndo alt':               'Undo',
       'wikEdUndo title':             'Undo',
       'wikEdRedo alt':               'Redo',
       'wikEdRedo title':             'Redo',
       'wikEdBold title':             'Bold text',
       'wikEdItalic alt':             'Italic',
       'wikEdItalic title':           'Italic text',
       'wikEdUnderline alt':          'Underline',
       'wikEdUnderline title':        'Underline text',
       'wikEdStrikethrough alt':      'Strikethrough',
       'wikEdStrikethrough title':    'Strikethrough text',
       'wikEdNowiki alt':             'Nowiki',
       'wikEdNowiki title':           'Nowiki markup text',
       'wikEdSuperscript alt':        'Superscript',
       'wikEdSuperscript title':      'Superscript text',
       'wikEdSubscript alt':          'Subscript',
       'wikEdSubscript title':        'Subscript text',
       'wikEdRef alt':                'Ref',
       'wikEdRef title':              'In-text reference',
       'wikEdCase alt':               'Case',
       'wikEdCase title':             'Toggle between lowercase, uppercase first, and uppercase',
       'wikEdRedirect alt':           'Redirect',
       'wikEdRedirect title':         'Create redirect, deletes whole text',
       'wikEdUndoAll alt':            'Undo all',
       'wikEdUndoAll title':          'Undo all changes',
       'wikEdRedoAll alt':            'Redo all',
       'wikEdRedoAll title':          'Redo all changes',

// formatting buttons, bottom row

       'wikEdWikiLink alt':           'Link',
       'wikEdWikiLink title':         'Wiki link',
       'wikEdWebLink alt':            'Weblink',
       'wikEdWebLink title':          'External weblink',
       'wikEdHeading alt':            'Heading',
       'wikEdHeading title':          'Increase heading levels (shift-click: decrease)',
       'wikEdBulletList alt':         'Bullet list',
       'wikEdBulletList title':       'Increase bulleted list level (shift-click: decrease)',
       'wikEdNumberList alt':         'Number list',
       'wikEdNumberList title':       'Increase numbered list level (shift-click: decrease)',
       'wikEdIndentList alt':         'Indent list',
       'wikEdIndentList title':       'Increase indention (shift-click: decrease)',
       'wikEdDefinitionList alt':     'Def list',
       'wikEdDefinitionList title':   'Definition list',
       'wikEdImage alt':              'Image',
       'wikEdImage title':            'Image',
       'wikEdTable alt':              'Table',
       'wikEdTable title':            'Table',
       'wikEdReferences alt':         'References',
       'wikEdReferences title':       'References location (shift-click: small Wikipedia style)',
       'wikEdWikify alt':             'Wikify',
       'wikEdWikify title':           'Convert pasted content to wiki code, update highlighting',
       'wikEdTextify alt':            'Textify',
       'wikEdTextify title':          'Convert pasted content to plain text, update highlighting',

// find and replace buttons, top row

       'wikEdFindAll alt':            'Find all',
       'wikEdFindAll title':          'Find all matches',
       'wikEdFindPrev alt':           'Find prev',
       'wikEdFindPrev title':         'Find previous match',
       'wikEdFindSelect title':       'Select a previous search or jump to a heading',
       'wikEdFindNext alt':           'Find next',
       'wikEdFindNext title':         'Find next match (shift-click: get selection)',
       'wikEdJumpPrev alt':           'Selected prev',
       'wikEdJumpPrev title':         'Find the selected text backwards',
       'wikEdJumpNext alt':           'Selected next',
       'wikEdJumpNext title':         'Find the selected text forwards',

// find and replace buttons, bottom row

       'wikEdReplaceAll alt':         'Replace all',
       'wikEdReplaceAll title':       'Replace all matches in whole text or selection',
       'wikEdReplacePrev alt':        'Replace prev',
       'wikEdReplacePrev title':      'Replace previous match',
       'wikEdReplaceSelect title':    'Select a previous replacement',
       'wikEdReplaceNext alt':        'Replace next (shift-click: get selection)',
       '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 punctuation',
       'wikEdFixPunct title':         'Fix spaces before punctuation',
       'wikEdFixMath alt':            'Fix math',
       'wikEdFixMath title':          'Fix math',
       'wikEdFixChem alt':            'Fix chem',
       'wikEdFixChem title':          'Fix chemical formulas',
       'wikEdFixUnits alt':           'Fix units',
       'wikEdFixUnits title':         'Fix units',

// wikEd control buttons, top row

       'wikEdRefHide alt':            'Hide <ref>',
       'wikEdRefHide title':          'Toggle <ref> tag hiding',
       'wikEdTextZoom alt':           'Text zoom',
       'wikEdTextZoom title':         'Text zoom cycling (shift-click: reverse)',
       'wikEdClearHistory alt':       'Clear history',
       'wikEdClearHistory title':     'Clear the find, replace, and summary history',
       'wikEdScrollToPreview alt':    'Scroll to preview',
       'wikEdScrollToPreview title':  'Scroll to preview field',
       'wikEdScrollToEdit alt':       'Scroll to edit',
       'wikEdScrollToEdit title':     'Scroll to edit field',

// wikEd control buttons, bottom row

       'wikEdUseWikEd alt':           'Use wikEd',
       'wikEdUseWikEd title':         'Toggle between classic text area and wikEd',
       'wikEdHighlightSyntax alt':    'Syntax',
       'wikEdHighlightSyntax title':  'Toggle automatic syntax highlighting',
       'wikEdSource alt':             'Source',
       'wikEdCloseToolbar title':     'Close the standard non-wikEd toolbar',
       'wikEdCloseToolbar alt':       'Close toolbar',
       'wikEdSource title':           'Show the source code for testing purposes',
       'wikEdUsing alt':              'Using',
       'wikEdUsing title':            'Automatically add \'\'…using wikEd\'\' to summaries',
       'wikEdDiff alt':               'wikEdDiff',
       'wikEdDiff title':             'Toggle automatic improved diff view',
       'wikEdFullScreen alt':         'Fullscreen',
       'wikEdFullScreen title':       'Toggle the fullscreen mode',

// summary buttons

       'wikEdClearSummary alt':       'Clear summary',
       'wikEdClearSummary title':     'Clear the summary field',
       'wikEdSummarySelect title':    'Select a previous summary',
       'wikEdPresetSummary': [
           '/*  */ ', 'copyedit', 'reply', 'article created', 'intro rewrite',
           'linkfix', 'fixing typos', 'removing linkspam', 'reverting test',
           'reverting vandalism', 'formatting source text', '{wikEdUsing}'
       ],
       'wikEdSummaryUsing':           '…using ',

// 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

       'wikEdClose alt':              'Close',
       'wikEdClose title':            'Close preview box',
       'wikEdScrollToPreview2 alt':   'Scroll to preview',
       'wikEdScrollToPreview2 title': 'Scroll to preview field',
       'wikEdScrollToEdit2 alt':      'Scroll to edit',
       'wikEdScrollToEdit2 title':    'Scroll to edit field',

// preview and changes buttons, bottom

       'wikEdClose alt':              'Close',
       'wikEdClose title':            'Close preview box',
       'wikEdScrollToPreview3 alt':   'Scroll to preview',
       'wikEdScrollToPreview3 title': 'Scroll to preview field',
       'wikEdScrollToEdit3 alt':      'Scroll to edit',
       'wikEdScrollToEdit3 title':    'Scroll to edit field',

// formatting functions

       'image filename':              'filename',
       'image width':                 'width',
       'table caption':               'caption',
       'table heading':               'heading',
       'table cell':                  'cell',
       'redirect article link':       'article link',

// fixing functions

       'External links':              'External links',
       'See also':                    'See also',
       'References':                  'References',

// language specific wiki code

       'wikicode Image':              'Image',
       'wikicode Category':           'Category',
       'wikicode Template':           'Template',

'wikEdReferencesSection': '\n== References ==\n\n

\n\n

\n',

// shortened button texts

       'shortenedPreview':            'Preview',
       'shortenedChanges':            'Changes',

// follow link popup

       'followLink':                  '(Ctrl-click)'
   });

}

// use local copies of images for testing (set to true in local copy of edit page), also defined in wikEdDiff.js if (typeof(wikEdUseLocalImages) == 'undefined') { var wikEdUseLocalImages = false; }

// path to local images for testing, also defined in wikEdDiff.js var wikEdImagePathLocal = wikEdImagePathLocal || 'file:///D:/wikEd/images/';

// path to images, also defined in wikEdDiff.js var wikEdImagePath = wikEdImagePath || 'http://upload.wikimedia.org/wikipedia/commons/';

// image filenames, also defined in wikEdDiff.js var wikEdImage = wikEdImage || [];

// WikedInitImage: define built-in image URLs function WikedInitImage() {

   WikEdInitImage(wikEdImage, {
       'blank':               '5/51/WikEd_blank.png',
       'bold':                '5/59/WikEd_bold.png',
       'browser':             '0/07/WikEd_disabled.png',
       'bulletList':          '6/62/WikEd_bullet_list.png',
       'case':                'a/aa/WikEd_case.png',
       'caseSensitive':       '0/0d/WikEd_case_sensitive.png',
       'clearHistory':        'c/c8/WikEd_clear_history.png',
       'clearSummary':        '2/2c/WikEd_clear_summary.png',
       'close':               '9/97/WikEd_close.png',
       'closeToolbar':        '1/1d/WikEd_close_toolbar.png',
       'ctrl':                '1/10/WikEd_ctrl.png',
       'definitionList':      'f/f5/WikEd_definition_list.png',
       'diff':                'd/db/WikEd_diff.png',
       'disabled':            '0/07/WikEd_disabled.png',
       'dummy':               'c/c5/WikEd_dummy.png',
       'error':               '3/3e/WikEd_error.png',
       'findAhead':           '3/34/WikEd_find_ahead.png',
       'findAll':             '7/75/WikEd_find_all.png',
       'findNext':            'a/ad/WikEd_find_next.png',
       'findPrev':            'f/f5/WikEd_find_prev.png',
       'fixAll':              '8/86/WikEd_fix_all.png',
       'fixBasic':            '3/30/WikEd_fix_basic.png',
       'fixCaps':             '0/00/WikEd_fix_caps.png',
       'fixUnicode':          'd/d4/WikEd_fix_unicode.png',
       'fixChem':             'e/e7/WikEd_fix_chem.png',
       'fixDash':             'e/e5/WikEd_fix_dash.png',
       'fixHtml':             '0/05/WikEd_fix_html.png',
       'fixMath':             '3/3f/WikEd_fix_math.png',
       'fixPunct':            'd/db/WikEd_fix_punct.png',
       'fixRegExTypo':        '9/94/WikEd_fix_reg-ex-typo.png',
       'fixUnits':            '6/69/WikEd_fix_units.png',
       'textZoom':            '7/71/WikEd_font_size.png',
       'fullScreen':          'd/d3/WikEd_fullscreen.png',
       'getFind':             '9/96/WikEd_get_selection.png',
       'grip':                'a/ad/WikEd_grip.png',
       'heading':             '0/07/WikEd_heading.png',
       'highlightSyntax':     '6/67/WikEd_syntax.png',
       'image':               '3/37/WikEd_image.png',
       'indentList':          '7/7a/WikEd_indent_list.png',
       'italic':              'd/d4/WikEd_italic.png',
       'jumpNext':            '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',
       'jumpPrev':            'c/c7/WikEd_jump_prev.png',
       'preview':             '3/31/WikEd_preview.png',
       'redirect':            'f/fa/WikEd_redirect.png',
       'redo':                'd/d7/WikEd_redo.png',
       'ref':                 'b/ba/WikEd_ref.png',
       'refHide':             '0/0b/WikEd_ref_hide.png',
       'references':          '6/66/WikEd_references.png',
       'redoAll':             '2/2d/WikEd_redo_all.png',
       'regExp':              '6/6a/WikEd_regexp.png',
       'replaceAll':          '2/2a/WikEd_replace_all.png',
       'replaceNext':         'b/b0/WikEd_replace_next.png',
       'replacePrev':         'a/a1/WikEd_replace_prev.png',
       'scrollToEdit':        '1/13/WikEd_align_top.png',
       'scrollToPreview':     '3/37/WikEd_align_preview.png',
       'scrollToEditDown':    'a/a8/WikEd_align_down.png',
       'scrollToPreviewDown': '5/58/WikEd_align_preview_down.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',
       'useWikEd':            '6/67/WikEd_logo.png',
       'using':               'e/e0/WikEd_using.png',
       'webLink':             '1/16/WikEd_weblink.png',
       'wikEdDiff':           'c/c6/WikEdDiff.png',
       'wikify':              '9/9f/WikEd_wikify.png',
       'wikiLink':            '2/21/WikEd_wikilink.png'
   });

}

// edit-frame css rules var wikEdFrameCSS = wikEdFrameCSS || [];

// WikedInitFrameCSS: define built-in edit frame css function WikedInitFrameCSS() {

   WikEdInitObject(wikEdFrameCSS, {

// frame body

       '.wikedFrameBody':    'background: #FFFFFF; margin: 0px; padding: 0.2em; overflow: -moz-scrollbars-vertical; overflow-x: auto; font-family: monospace;',

// syntax highlighting

       '.wikEdBlock':        'background-color: #e8e8e8;',
       '.wikEdBlockTag':     'color: #0000e0;',
       '.wikEdInlineTag':    'color: #0000e0;',
       '.wikEdUnknown':      'background-image: url({wikEdUnknown});',
       '.wikEdSubscript':    'position: relative; top: 0.3em;',
       '.wikEdSuperscript':  'position: relative; top: -0.3em;',
       '.wikEdBold':         'font-weight: bold;',
       '.wikEdRef':          'color: #808080; background-color: #e8e8e8;',
       '.wikEdRefHide':      'color: #c0c0c0;',
       '.wikEdComment':      'background-color: #fff0d0;',
       '.wikEdDel':          'text-decoration: line-through;',
       '.wikEdIns':          'text-decoration: underline;',
       '.wikEdItalic':       'font-style: italic;',
       '.wikEdNowiki':       'background-color: #e8e8e8;',
       '.wikEdRGB':          ,

// horizontal rule

       '.wikEdHR':           'background-color: #d0d0d0;',
       '.wikEdHRInline':     'background-color: #d0d0d0;',

// wiki code

       '.wikEdWiki':         'color: #0000e0;',
       '.wikEdWikiRedir':    'color: #0000e0; background-color: #ffffff; font-weight: bold;',
       '.wikEdMagic':        'color: #0000e0; background-color: #e0e0e0; font-weight: bold;',

// headings

       '.wikEdHeading':      'background-color: #e0e0e0; font-weight: bold;',
       '.wikEdHeadingWp':    'background-color: #d8e0ff; font-weight: bold;',

// tables

       '.wikEdTableBlock':   'background-color: #e8e8e8;',
       '.wikEdTableLine':    'background-color: #e8e8e8;',
       '.wikEdTableTag':     'background-color: #e8e8e8; color: #0000e0;',

// list

       '.wikEdListBlock':    'background-color: #e8e8e8;',
       '.wikEdListLine':     'background-color: #f0f0f0',
       '.wikEdListTag':      'background-color: #e8e8e8; color: #0000e0; font-weight: bold;',

// space-pre

       '.wikEdSpaceBlock':   'background-color: #e8e8e8;',
       '.wikEdSpaceLine':    'background-color: #e8e8e8;',
       '.wikEdSpaceTag':     'color: #0000e0; font-weight: bold;',

// wiki links, images, categories, templates

       '.wikEdLinkTag':      'color: #0000e0;',
       '.wikEdLink':         ,
       '.wikEdImage':        'background-color: #d5ffaa;',
       '.wikEdCat':          'background-color: #d0d8ff;',
       '.wikEdTemplTag':     'color: #0000e0;',
       '.wikEdTempl':        'background-color: #e0e8ff;',

// interlanguage

       '.wikEdInter':        'color: #000000;',
       '.wikEdLinkInter':    'background-color: #c8c8ff;',
       '.wikEdImageInter':   'background-color: #c8c8ff;',
       '.wikEdCatInter':     'background-color: #c8c8ff;',
       '.wikEdTemplInter':   'background-color: #c8c8ff;',

// name

       '.wikEdLinkName':     'color: #f00000; font-weight: bold;',
       '.wikEdImageName':    'color: #000000; font-weight: bold;',
       '.wikEdCatName':      'color: #f00000; font-weight: bold;',
       '.wikEdTemplName':    'color: #f00000; font-weight: bold;',
       '.wikEdURLLink':      'color: #f00000; font-weight: bold;',

// links

       '.wikEdHighlightLink': 'text-decoration: none; color: #909090;',
       ':hover.wikEdHighlightLink': 'text-decoration: underline; color: #909090;',

// pasted html

       '.wikEdPastedHtml':   'background-color: #ffc080;',

// text and parameters

       '.wikEdLinkText':     'color: #000000; font-weight: bold;',
       '.wikEdImageParam':   'color: #0000e0;',
       '.wikEdImageCaption': 'color: #000000;',
       '.wikEdCatText':      'color: #000000;',
       '.wikEdTemplText':    'color: #000000;',
       '.wikEdURLText':      'color: #000000; font-weight: bold;',

// insert wikicode here

       '.wikEdInsertHere':   'background-color: orange; font-style: italic;',

// colors

       '.wikEdColorsLight':  'color: black;',
       '.wikEdColorsDark':   'color: white;',

// invisibles, control chars, and strange spaces

       '.wikEdTab':          'white-space: pre; background-image: url({wikEdTab}); background-position: right bottom; background-repeat: no-repeat;',
       '.wikEdTabPlain':     'white-space: pre;',
       '.wikEdCtrl':         'white-space: pre; background-image: url({wikEdCtrl}); background-position: left center; background-repeat: repeat-x; background-color: white;',
       '.wikEdCtrl:before':  'content: \'\u00a0\,
       '.wikEdBlank':        'white-space: -moz-pre-wrap; background-image: url({wikEdBlank}); background-position: left center; background-repeat: repeat-x; background-color: white;'
   });

}

// main window css rules var wikEdMainCSS = wikEdMainCSS || [];

// WikedInitMainCSS: define built-in main window css function WikedInitMainCSS() {

   WikEdInitObject(wikEdMainCSS, {

// combo input box

       '.wikEdCombo':                 'font-size: smaller; padding-left: 0.1em; padding-right: 0.1em; margin: 0 0.1em 0 0.1em; height: 1.6em; vertical-align: bottom;',

// wikEd button areas

// button bar margins

       '.wikEdButtonBarFormat':       'margin: 0 8px 3px 0; float: left;',
       '.wikEdButtonBarCustom1':      'margin: 0 8px 3px 0; float: left;',
       '.wikEdButtonBarFind':         'margin: 0 8px 3px 0; float: left;',
       '.wikEdButtonBarFix':          'margin: 0 8px 3px 0; float: left;',
       '.wikEdButtonBarCustom2':      'margin: 0 8px 3px 0; float: left;',
       '.wikEdButtonBarControl':      'margin: 0 0 3px 0; float: right;',
       '.wikEdButtonBarPreview':      'margin: 0 0 0.15em 0.6em; float: right;',
       '.wikEdButtonBarPreviewFull':  'margin: -0.2em 0 0 0.6em; float: right;',
       '.wikEdButtonBarPreview2':     'margin: 0.2em 0 0.4em 0; float: right;',
       '.wikEdButtonBarJump':         'margin: 0 0 0 0.6em; float: right;',

// button bar inner wrapper: border (hidden: invisible)

       '.wikedButtonBarInnerWrapperVisible':   'border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0;',
       '.wikedButtonBarInnerWrapperHidden':    ,

// button bar grip wrapper: invisible (hidden: border)

       '.wikedButtonBarGripWrapperVisible':    'float: left;',
       '.wikedButtonBarGripWrapperHidden':     'float: left; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0;',

// button bar buttons wrapper: invisible (hidden: border)

       '.wikedButtonBarButtonsWrapperVisible': 'float: left; background: #d4d0cc; ',
       '.wikedButtonBarButtonsWrapperHidden':  'float: left; background: #d4d0cc; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0; z-index: 4;',

// button bar grip

       '.wikedButtonBarGrip':         'background: #d4d0cc; padding: 0; background-image: url({wikEdGrip}); background-repeat: repeat-y; cursor: pointer;',

// button bar buttons

       '.wikEdButtonsFormat':         'background: #d4d0cc; padding: 2px 2px 0 0px;',
       '.wikEdButtonsCustom1':        'background: #d4d0cc; padding: 2px 2px 0 0px;',
       '.wikEdButtonsFind':           'background: #d4d0cc; padding: 0px 2px 0 0px;',
       '.wikEdButtonsFix':            'background: #d4d0cc; padding: 2px 2px 0 0px;',
       '.wikEdButtonsCustom2':        'background: #d4d0cc; padding: 2px 2px 0 0px;',
       '.wikEdButtonsControl':        'background: #d4d0cc; padding: 2px 2px 0 1px;',
       '.wikEdButtonsPreview':        'background: #d4d0cc; padding: 2px; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0;',
       '.wikEdButtonsPreviewFull':    'background: #d4d0cc; padding: 2px; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0;',
       '.wikEdButtonsPreview2':       'background: #d4d0cc; padding: 2px; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0;',
       '.wikEdButtonsJump':           'background: #d4d0cc; padding: 2px; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0;',

// 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 #d4d0cc solid; cursor: pointer;',
       '.wikEdButtonSolo:hover':      'background: #e4e0dd; border: 1px outset; cursor: pointer;',
       '.wikEdButtonChecked':         'vertical-align: text-top; font-size: small; text-decoration: none; margin: 1px 2px; padding: 0; background: #ccc8c3; border: 1px solid; border-color: black white white black; cursor: pointer;',
       '.wikEdButtonUnchecked':       'vertical-align: text-top; font-size: small; text-decoration: none; margin: 1px 2px; padding: 0; background: #ddd8d3; border: 1px solid; border-color: white black black white; cursor: pointer;',
       '.wikEdButtonPressed':         'vertical-align: text-top; font-size: small; text-decoration: none; margin: 1px 2px; padding: 0; background: #ccc8c3; border: 1px solid; border-color: black white white black; cursor: wait;',
       '.wikEdButtonInactive':        'vertical-align: text-top; font-size: small; text-decoration: underline; margin: 1px 2px; padding: 0; background: #c0c0c0; border: 1px #b0b0b0 solid; cursor: not-allowed',
       '.wikEdLocalPreview':          'vertical-align: top; margin: 0 0.33em 0 0.15em; padding: 0;',
       '.wikEdLocalDiff':             'vertical-align: top; margin: 0 0.33em 0 -0.18em; padding: 0;',
       '.wikEdButtonDummy':           'vertical-align: text-top; margin: 1px 2px; padding: 1px; background: #d4d0cc;',

// preview box

       '.wikEdPreviewBoxOuter':       'clear: both; margin: 0; border-width: 1px; border-style: solid; border-color: #808080 #d0d0d0 #d0d0d0 #808080;',
       '.wikEdPreviewBox':            'background-color: #faf8f6; padding: 5px; border-width: 1px; border-style: solid; border-color: #404040 #ffffff #ffffff #404040;',

// find field

       '.wikEdFindComboInput':        'position: relative; padding: 0; margin: 0 0.2em; font-style: normal; white-space: nowrap;',
       '#wikEdFindText':              'height: 1.4em; font-family: monospace; padding: 0; margin: 0; position: absolute; width: 170px; left: 0; top: 0; z-index: 2;',
       '#wikEdFindSelect':            'height: 1.5em; font-family: monospace; padding: 0; margin: 0; position: relative; border: none; vertical-align: baseline; z-index: 1;',

// replace field

       '.wikEdReplaceComboInput':     'position: relative; padding: 0; margin: 0 0.2em; font-style: normal; white-space: nowrap;',
       '#wikEdReplaceText':           'height: 1.4em; font-family: monospace; padding: 0; margin: 0; position: absolute; width: 170px; left: 0; top: 0; z-index: 2;',
       '#wikEdReplaceSelect':         'height: 1.5em; font-family: monospace; padding: 0; margin: 0; position: relative; border: none; vertical-align: baseline; z-index: 1;',

// summary field

       '.wikEdSummaryComboInput':     'position: relative; white-space: nowrap; margin: 0 0 0 0.1em;',
       '.wikEdSummaryText':           'padding: 0; margin: 0; position: absolute; left: 0; top: 0; z-index: 2;',
       '.wikEdSummarySelect':         'border: none; padding: 0; margin: 0; position: relative; vertical-align: middle; z-index: 1;',

// space around submit buttons

       '.editButtons':                'margin: 0;',

// frame

       '.wikEdFrameOuter':            'width: 100%; margin: 0; border-width: 1px; border-style: solid; border-color: #808080 #d0d0d0 #d0d0d0 #808080;',
       '.wikEdFrameInner':            'padding: 0; border-width: 1px; border-style: solid; border-color: #404040 #ffffff #ffffff #404040;',
       '.wikEdFrame':                 'width: 100%; padding: 0; margin: 0; border: none;',

// summary

       '.wikEdSummaryWrapper':        'margin: 0 0 0.4em 0;',
       '.wikEdSummaryWrapperTop':     'margin: 0.1em 0 0.4em 0;',
       '#wpSummaryLabel':             'margin: 0 0.2em 0 0;',
       '.editOptions':                'position: relative; top: 0.1em;',
       '.wikEdClearSummaryForm':      'display: inline;',
       '.wikEdClearSummary':          'vertical-align: middle; margin: 0 0.1em 0 0.5em; padding: 0 0 0.2em 0;',

// input wrapper

       '.wikEdInputWrapper':          'z-index: 100; clear: both; margin-top: 0.5em;',
       '.wikEdInputWrapperFull':      'position: fixed; top: 0; left: 0; right: 0; padding: 4px; background: white; z-index: 100;',

// other wrappers

       '.wikEdToolbarWrapper':        'margin: 0 0 0.25em 0;',
       '.wikEdTextareaWrapper':       'margin: 0 0 0.35em 0;',
       '.wikEdFrameWrapper':          'margin: 0 0 0.35em 0;',
       '.wikEdConsoleWrapper':        ,
       '.wikEdButtonsWrapper':        ,
       '.wikEdSummaryInputWrapper':   'display: inline; white-space: nowrap;',
       '.wikEdSummaryOptions':        'display: inline;',
       '.wikEdSubmitWrapper':         'margin: 0 0 0.25em 0;',
       '.wikEdSubmitButtonsWrapper':  ,
       '.wikEdLocalPrevWrapper':      ,
       '.wikEdInsertWrapper':         ,

// various

       '.wikEdEditOptions':           'display: inline; vertical-align: baseline; margin-right: 0.75em; white-space: nowrap;',
       '.wikEdEditHelp':              'vertical-align: baseline; margin-right: 0.5em; white-space: nowrap;',
       '#editpage-specialchars':      'clear: both;'
   });

}

// buttons (id, class, popup title, image src, width, height, alt text, onClick and parameters) var wikEdButton = wikEdButton || [];

// WikedInitButton: define built-in buttons (id, class, popup title, image src, width, height, alt text, onClick and parameters) function WikedInitButton() {

   WikEdInitObject(wikEdButton, {

// format top

        1: ['wikEdUndo',             'wikEdButtonInactive',  wikEdText['wikEdUndo title'],             wikEdImage['undo'],                '16', '16', wikEdText['wikEdUndo alt'],             'javascript:WikEdEditButton(this, this.id);' ],
        2: ['wikEdRedo',             'wikEdButtonInactive',  wikEdText['wikEdRedo title'],             wikEdImage['redo'],                '16', '16', wikEdText['wikEdRedo alt'],             'javascript:WikEdEditButton(this, this.id);' ],
        3: ['wikEdBold',             'wikEdButton',          wikEdText['wikEdBold title'],             wikEdImage['bold'],                '16', '16', wikEdText['wikEdBold alt'],             'javascript:WikEdEditButton(this, this.id);' ],
        4: ['wikEdItalic',           'wikEdButton',          wikEdText['wikEdItalic title'],           wikEdImage['italic'],              '16', '16', wikEdText['wikEdItalic alt'],           'javascript:WikEdEditButton(this, this.id);' ],
        5: ['wikEdUnderline',        'wikEdButton',          wikEdText['wikEdUnderline title'],        wikEdImage['underline'],           '16', '16', wikEdText['wikEdUnderline alt'],        'javascript:WikEdEditButton(this, this.id);' ],
        6: ['wikEdStrikethrough',    'wikEdButton',          wikEdText['wikEdStrikethrough title'],    wikEdImage['strikethrough'],       '16', '16', wikEdText['wikEdStrikethrough alt'],    'javascript:WikEdEditButton(this, this.id);' ],
        7: ['wikEdNowiki',           'wikEdButton',          wikEdText['wikEdNowiki title'],           wikEdImage['nowiki'],              '16', '16', wikEdText['wikEdNowiki alt'],           'javascript:WikEdEditButton(this, this.id);' ],
        8: ['wikEdSuperscript',      'wikEdButton',          wikEdText['wikEdSuperscript title'],      wikEdImage['superscript'],         '16', '16', wikEdText['wikEdSuperscript alt'],      'javascript:WikEdEditButton(this, this.id);' ],
        9: ['wikEdSubscript',        'wikEdButton',          wikEdText['wikEdSubscript title'],        wikEdImage['subscript'],           '16', '16', wikEdText['wikEdSubscript alt'],        'javascript:WikEdEditButton(this, this.id);' ],
       10: ['wikEdRef',              'wikEdButton',          wikEdText['wikEdRef title'],              wikEdImage['ref'],                 '16', '16', wikEdText['wikEdRef alt'],              'javascript:WikEdEditButton(this, this.id);' ],
       12: ['wikEdCase',             'wikEdButton',          wikEdText['wikEdCase title'],             wikEdImage['case'],                '16', '16', wikEdText['wikEdCase alt'],             'javascript:WikEdEditButton(this, this.id);' ],
       25: ['wikEdRedirect',         'wikEdButton',          wikEdText['wikEdRedirect title'],         wikEdImage['redirect'],            '16', '16', wikEdText['wikEdRedirect alt'],         'javascript:WikEdEditButton(this, this.id);' ],
       13: ['wikEdUndoAll',          'wikEdButton',          wikEdText['wikEdUndoAll title'],          wikEdImage['undoAll'],             '16', '16', wikEdText['wikEdUndoAll alt'],          'javascript:WikEdEditButton(this, this.id);' ],
       14: ['wikEdRedoAll',          'wikEdButtonInactive',  wikEdText['wikEdRedoAll title'],          wikEdImage['redoAll'],             '16', '16', wikEdText['wikEdRedoAll alt'],          'javascript:WikEdEditButton(this, this.id);' ],

// format bottom

       15: ['wikEdWikiLink',         'wikEdButton',          wikEdText['wikEdWikiLink title'],         wikEdImage['wikiLink'],            '16', '16', wikEdText['wikEdWikiLink alt'],         'javascript:WikEdEditButton(this, this.id);' ],
       16: ['wikEdWebLink',          'wikEdButton',          wikEdText['wikEdWebLink title'],          wikEdImage['webLink'],             '16', '16', wikEdText['wikEdWebLink alt'],          'javascript:WikEdEditButton(this, this.id);' ],
       17: ['wikEdHeading',          'wikEdButton',          wikEdText['wikEdHeading title'],          wikEdImage['heading'],             '16', '16', wikEdText['wikEdHeading alt'],          'if (!event.shiftKey) { javascript:WikEdEditButton(this, \'wikEdIncreaseHeading\'); } else { javascript:WikEdEditButton(this, \'wikEdDecreaseHeading\'); }' ],
       19: ['wikEdBulletList',       'wikEdButton',          wikEdText['wikEdBulletList title'],       wikEdImage['bulletList'],          '16', '16', wikEdText['wikEdBulletList alt'],       'if (!event.shiftKey) { javascript:WikEdEditButton(this, \'wikEdIncreaseBulletList\'); } else { javascript:WikEdEditButton(this, \'wikEdDecreaseBulletList\'); }' ],
       20: ['wikEdNumberList',       'wikEdButton',          wikEdText['wikEdNumberList title'],       wikEdImage['numberList'],          '16', '16', wikEdText['wikEdNumberList alt'],       'if (!event.shiftKey) { javascript:WikEdEditButton(this, \'wikEdIncreaseNumberList\'); } else { javascript:WikEdEditButton(this, \'wikEdDecreaseNumberList\'); }' ],
       21: ['wikEdIndentList',       'wikEdButton',          wikEdText['wikEdIndentList title'],       wikEdImage['indentList'],          '16', '16', wikEdText['wikEdIndentList alt'],       'if (!event.shiftKey) { javascript:WikEdEditButton(this, \'wikEdIncreaseIndentList\'); } else { javascript:WikEdEditButton(this, \'wikEdDecreaseIndentList\'); }' ],
       22: ['wikEdDefinitionList',   'wikEdButton',          wikEdText['wikEdDefinitionList title'],   wikEdImage['definitionList'],      '16', '16', wikEdText['wikEdDefinitionList alt'],   'javascript:WikEdEditButton(this, this.id);' ],
       23: ['wikEdImage',            'wikEdButton',          wikEdText['wikEdImage title'],            wikEdImage['image'],               '16', '16', wikEdText['wikEdImage alt'],            'javascript:WikEdEditButton(this, this.id);' ],
       24: ['wikEdTable',            'wikEdButton',          wikEdText['wikEdTable title'],            wikEdImage['table'],               '16', '16', wikEdText['wikEdTable alt'],            'javascript:WikEdEditButton(this, this.id);' ],
       11: ['wikEdReferences',       'wikEdButton',          wikEdText['wikEdReferences title'],       wikEdImage['references'],          '16', '16', wikEdText['wikEdReferences alt'],       'if (!event.shiftKey) { javascript:WikEdEditButton(this, this.id); } else { javascript:WikEdEditButton(this, \'wikEdReferencesSection\'); }' ],
       26: ['wikEdWikify',           'wikEdButton',          wikEdText['wikEdWikify title'],           wikEdImage['wikify'],              '16', '16', wikEdText['wikEdWikify alt'],           'javascript:WikEdEditButton(this, this.id);' ],
       27: ['wikEdTextify',          'wikEdButton',          wikEdText['wikEdTextify title'],          wikEdImage['textify'],             '16', '16', wikEdText['wikEdTextify alt'],          'javascript:WikEdEditButton(this, this.id);' ],

// control top

       77: ['wikEdRefHide',          'wikEdButtonUnchecked', wikEdText['wikEdRefHide title'],          wikEdImage['refHide'],             '16', '16', wikEdText['wikEdRefHide alt'],          'javascript:WikEdButton(this, this.id, true);' ],
       29: ['wikEdTextZoom',         'wikEdButton',          wikEdText['wikEdTextZoom title'],         wikEdImage['textZoom'],            '16', '16', wikEdText['wikEdTextZoom alt'],         'if (!event.shiftKey) { javascript:WikEdButton(this, \'wikEdTextZoomDown\'); } else { javascript:WikEdButton(this, \'wikEdTextZoomUp\'); }' ],
       30: ['wikEdClearHistory',     'wikEdButton',          wikEdText['wikEdClearHistory title'],     wikEdImage['clearHistory'],        '16', '16', wikEdText['wikEdClearHistory alt'],     'javascript:WikEdButton(this, this.id);' ],
       31: ['wikEdScrollToPreview',  'wikEdButton',          wikEdText['wikEdScrollToPreview title'],  wikEdImage['scrollToPreviewDown'], '16', '16', wikEdText['wikEdScrollToPreview alt'],  'javascript:WikEdButton(this, this.id);' ],
       32: ['wikEdScrollToEdit',     'wikEdButton',          wikEdText['wikEdScrollToEdit title'],     wikEdImage['scrollToEditDown'],    '16', '16', wikEdText['wikEdScrollToEdit alt'],     'javascript:WikEdButton(this, this.id);' ],

// control bottom

       33: ['wikEdUseWikEd',         'wikEdButtonChecked',   wikEdText['wikEdUseWikEd title'],         wikEdImage['useWikEd'],            '16', '16', wikEdText['wikEdUseWikEd alt'],         'javascript:WikEdButton(this, this.id, true);' ],
       34: ['wikEdHighlightSyntax',  'wikEdButtonUnchecked', wikEdText['wikEdHighlightSyntax title'],  wikEdImage['highlightSyntax'],     '16', '16', wikEdText['wikEdHighlightSyntax alt'],  'javascript:WikEdButton(this, this.id, true);' ],
       35: ['wikEdSource',           'wikEdButton',          wikEdText['wikEdSource title'],           wikEdImage['source'],              '16', '16', wikEdText['wikEdSource alt'],           'javascript:WikEdEditButton(this, this.id);' ],
       75: ['wikEdCloseToolbar',     'wikEdButtonUnchecked', wikEdText['wikEdCloseToolbar title'],     wikEdImage['closeToolbar'],        '16', '16', wikEdText['wikEdCloseToolbar alt'],     'javascript:WikEdButton(this, this.id, true);' ],
       36: ['wikEdUsing',            'wikEdButtonUnchecked', wikEdText['wikEdUsing title'],            wikEdImage['using'],               '16', '16', wikEdText['wikEdUsing alt'],            'javascript:WikEdButton(this, this.id, true);' ],
       37: ['wikEdFullScreen',       'wikEdButtonUnchecked', wikEdText['wikEdFullScreen title'],       wikEdImage['fullScreen'],          '16', '16', wikEdText['wikEdFullScreen alt'],       'javascript:WikEdButton(this, this.id, true);' ],

// find top

       39: ['wikEdFindAll',          'wikEdButton',          wikEdText['wikEdFindAll title'],          wikEdImage['findAll'],             '16', '16', wikEdText['wikEdFindAll alt'],          'javascript:WikEdEditButton(this, this.id);' ],
       40: ['wikEdFindPrev',         'wikEdButton',          wikEdText['wikEdFindPrev title'],         wikEdImage['findPrev'],            '16', '16', wikEdText['wikEdFindPrev alt'],         'javascript:WikEdEditButton(this, this.id);' ],
       41: ['wikEdFindNext',         'wikEdButton',          wikEdText['wikEdFindNext title'],         wikEdImage['findNext'],            '16', '16', wikEdText['wikEdFindNext alt'],         'if (event.shiftKey) { javascript:WikEdEditButton(this, this.id, \'shift\'); } else { javascript:WikEdEditButton(this, this.id); }' ],
       43: ['wikEdJumpPrev',         'wikEdButton',          wikEdText['wikEdJumpPrev title'],         wikEdImage['jumpPrev'],            '16', '16', wikEdText['wikEdJumpPrev alt'],         'javascript:WikEdEditButton(this, this.id);' ],
       44: ['wikEdJumpNext',         'wikEdButton',          wikEdText['wikEdJumpNext title'],         wikEdImage['jumpNext'],            '16', '16', wikEdText['wikEdJumpNext alt'],         'javascript:WikEdEditButton(this, this.id);' ],

// find bottom

       46: ['wikEdReplaceAll',       'wikEdButton',          wikEdText['wikEdReplaceAll title'],       wikEdImage['replaceAll'],          '16', '16', wikEdText['wikEdReplaceAll alt'],       'javascript:WikEdEditButton(this, this.id);' ],
       47: ['wikEdReplacePrev',      'wikEdButton',          wikEdText['wikEdReplacePrev title'],      wikEdImage['replacePrev'],         '16', '16', wikEdText['wikEdReplacePrev alt'],      'javascript:WikEdEditButton(this, this.id);' ],
       48: ['wikEdReplaceNext',      'wikEdButton',          wikEdText['wikEdReplaceNext title'],      wikEdImage['replaceNext'],         '16', '16', wikEdText['wikEdReplaceNext alt'],      'if (event.shiftKey) { javascript:WikEdEditButton(this, this.id, \'shift\'); } else { javascript:WikEdEditButton(this, this.id); }' ],
       49: ['wikEdCaseSensitive',    'wikEdButtonUnchecked', wikEdText['wikEdCaseSensitive title'],    wikEdImage['caseSensitive'],       '16', '16', wikEdText['wikEdCaseSensitive alt'],    'javascript:WikEdButton(this, this.id, true);' ],
       50: ['wikEdRegExp',           'wikEdButtonUnchecked', wikEdText['wikEdRegExp title'],           wikEdImage['regExp'],              '16', '16', wikEdText['wikEdRegExp alt'],           'javascript:WikEdButton(this, this.id, true);' ],
       51: ['wikEdFindAhead',        'wikEdButtonUnchecked', wikEdText['wikEdFindAhead title'],        wikEdImage['findAhead'],           '16', '16', wikEdText['wikEdFindAhead alt'],        'javascript:WikEdButton(this, this.id, true);' ],

// fix top

       52: ['wikEdFixBasic',         'wikEdButton',          wikEdText['wikEdFixBasic title'],         wikEdImage['fixBasic'],            '16', '16', wikEdText['wikEdFixBasic alt'],         'javascript:WikEdEditButton(this, this.id);' ],
       53: ['wikEdFixHtml',          'wikEdButton',          wikEdText['wikEdFixHtml title'],          wikEdImage['fixHtml'],             '16', '16', wikEdText['wikEdFixHtml alt'],          'javascript:WikEdEditButton(this, this.id);' ],
       54: ['wikEdFixCaps',          'wikEdButton',          wikEdText['wikEdFixCaps title'],          wikEdImage['fixCaps'],             '16', '16', wikEdText['wikEdFixCaps alt'],          'javascript:WikEdEditButton(this, this.id);' ],
       55: ['wikEdfixUnicode',       'wikEdButton',          wikEdText['wikEdfixUnicode title'],       wikEdImage['fixUnicode'],          '16', '16', wikEdText['wikEdfixUnicode alt'],       'javascript:WikEdEditButton(this, this.id);' ],
       56: ['wikEdFixAll',           'wikEdButton',          wikEdText['wikEdFixAll title'],           wikEdImage['fixAll'],              '16', '16', wikEdText['wikEdFixAll alt'],           'javascript:WikEdEditButton(this, this.id);' ],
       57: ['wikEdFixRegExTypo',     'wikEdButton',          wikEdText['wikEdFixRegExTypo title'],     wikEdImage['fixRegExTypo'],        '16', '16', wikEdText['wikEdFixRegExTypo alt'],     'javascript:WikEdEditButton(this, this.id);' ],

// fix bottom

       58: ['wikEdFixDashes',        'wikEdButton',          wikEdText['wikEdFixDashes title'],        wikEdImage['fixDash'],             '16', '16', wikEdText['wikEdFixDashes alt'],        'javascript:WikEdEditButton(this, this.id);' ],
       59: ['wikEdFixPunct',         'wikEdButton',          wikEdText['wikEdFixPunct title'],         wikEdImage['fixPunct'],            '16', '16', wikEdText['wikEdFixPunct alt'],         'javascript:WikEdEditButton(this, this.id);' ],
       60: ['wikEdFixMath',          'wikEdButton',          wikEdText['wikEdFixMath title'],          wikEdImage['fixMath'],             '16', '16', wikEdText['wikEdFixMath alt'],          'javascript:WikEdEditButton(this, this.id);' ],
       61: ['wikEdFixChem',          'wikEdButton',          wikEdText['wikEdFixChem title'],          wikEdImage['fixChem'],             '16', '16', wikEdText['wikEdFixChem alt'],          'javascript:WikEdEditButton(this, this.id);' ],
       62: ['wikEdFixUnits',         'wikEdButton',          wikEdText['wikEdFixUnits title'],         wikEdImage['fixUnits'],            '16', '16', wikEdText['wikEdFixUnits alt'],         'javascript:WikEdEditButton(this, this.id);' ],

// preview top

       65: ['wikEdClose',            'wikEdButton',          wikEdText['wikEdClose title'],            wikEdImage['close'],               '16', '16', wikEdText['wikEdClose alt'],            'javascript:WikEdButton(this, this.id);' ],
       66: ['wikEdScrollToPreview2', 'wikEdButton',          wikEdText['wikEdScrollToPreview2 title'], wikEdImage['scrollToPreviewDown'], '16', '16', wikEdText['wikEdScrollToPreview2 alt'], 'javascript:WikEdButton(this, this.id);' ],
       67: ['wikEdScrollToEdit2',    'wikEdButton',          wikEdText['wikEdScrollToEdit2 title'],    wikEdImage['scrollToEdit'],        '16', '16', wikEdText['wikEdScrollToEdit2 alt'],    'javascript:WikEdButton(this, this.id);' ],

// preview bottom

       70: ['wikEdClose2',           'wikEdButton',          wikEdText['wikEdClose2 title'],           wikEdImage['close'],               '16', '16', wikEdText['wikEdClose2 alt'],           'javascript:WikEdButton(this, this.id);' ],
       71: ['wikEdScrollToPreview3', 'wikEdButton',          wikEdText['wikEdScrollToPreview3 title'], wikEdImage['scrollToPreview'],     '16', '16', wikEdText['wikEdScrollToPreview3 alt'], 'javascript:WikEdButton(this, this.id);' ],
       72: ['wikEdScrollToEdit3',    'wikEdButton',          wikEdText['wikEdScrollToEdit3 title'],    wikEdImage['scrollToEdit'],        '16', '16', wikEdText['wikEdScrollToEdit3 alt'],    'javascript:WikEdButton(this, this.id);' ],

// jump

       78: ['wikEdDiff',             'wikEdButtonUnchecked', wikEdText['wikEdDiff title'],             wikEdImage['wikEdDiff'],           '16', '16', wikEdText['wikEdDiff alt'],             'javascript:WikEdButton(this, this.id, true);' ],
       74: ['wikEdScrollToEdit4',    'wikEdButtonSolo',      wikEdText['wikEdScrollToEdit4 title'],    wikEdImage['scrollToEditDown'],    '16', '16', wikEdText['wikEdScrollToEdit4 alt'],    'javascript:WikEdButton(this, this.id);' ],

// dummy

       76: ['wikEdDummy',            'wikEdButtonDummy',     ,                                       wikEdImage['dummy'],               '16', '16', ,                                      ]
   });

}

// button bars (id, class, button numbers) var wikEdButtonBar = wikEdButtonBar || [];

// WikedInitButtonBar: define built-in button bars (id outer, class outer, id inner, class inner, height, grip title, button numbers) function WikedInitButtonBar() {

   WikEdInitObject(wikEdButtonBar, {
       'format':    ['wikEdButtonBarFormat',    'wikEdButtonBarFormat',    'wikEdButtonsFormat',    'wikEdButtonsFormat',    44, wikEdText['wikEdGripFormat title'],  [1,2,3,4,5,6,7,8,9,10,12,13,14,'br',15,16,17,19,20,21,22,23,24,11,25,26,27] ],
       'custom1':   ['wikEdButtonBarCustom1',   'wikEdButtonBarCustom1',   'wikEdButtonsCustom1',   'wikEdButtonsCustom1',   44, wikEdText['wikEdGripCustom1 title'], [ ] ],
       'find':      ['wikEdButtonBarFind',      'wikEdButtonBarFind',      'wikEdButtonsFind',      'wikEdButtonsFind',      44, wikEdText['wikEdGripFind title'],    [39,40,'find',41,76,43,44,'br',46,47,'replace',48,49,50,51] ],
       'fix':       ['wikEdButtonBarFix',       'wikEdButtonBarFix',       'wikEdButtonsFix',       'wikEdButtonsFix',       44, wikEdText['wikEdGripFix title'],     [52,53,54,55,56,57,'br',58,59,60,61,62] ],
       'custom2':   ['wikEdButtonBarCustom2',   'wikEdButtonBarCustom2',   'wikEdButtonsCustom2',   'wikEdButtonsCustom2',   44, wikEdText['wikEdGripCustom2 title'], [ ] ],
       'control':   ['wikEdButtonBarControl',   'wikEdButtonBarControl',   'wikEdButtonsControl',   'wikEdButtonsControl',   44, wikEdText['wikEdGripControl title'], [77,29,30,31,32,'br',33,34,35,75,36,78,37] ],
       'preview':   ['wikEdButtonBarPreview',   'wikEdButtonBarPreview',   'wikEdButtonsPreview',   'wikEdButtonsPreview',    0, null,                                [66,67,65] ],
       'preview2':  ['wikEdButtonBarPreview2',  'wikEdButtonBarPreview2',  'wikEdButtonsPreview2',  'wikEdButtonsPreview2',   0, null,                                [71,72,70] ],
       'jump':      ['wikEdButtonBarJump',      'wikEdButtonBarJump',      'wikEdButtonsJump',      'wikEdButtonsJump',       0, null,                                [74] ]
   });

}

// history length for find, replace, and summary fields var wikEdHistoryLength = wikEdHistoryLength || []; wikEdHistoryLength['find'] = 10; wikEdHistoryLength['replace'] = 10; wikEdHistoryLength['summary'] = 10;

// presets for combo input fields dropdown options, {wikEdUsing} appends a link to this script var wikEdComboPresetOptions = wikEdComboPresetOptions || []; wikEdComboPresetOptions['summary'] = wikEdComboPresetOptions['summary'] || wikEdText['wikEdPresetSummary'];

// text for summary link to this script var wikEdSummaryUsing = wikEdSummaryUsing || wikEdText['wikEdSummaryUsing'];

// expiration time span for permanent cookies in seconds var wikEdCookieExpireSec = wikEdCookieExpireSec || (30 * 24 * 60 * 60);

// find ahead as you type checkbox preset if (typeof(wikEdHighlightSyntaxPreset) == 'undefined') { var wikEdFindAheadSelected = true; }

// highlight syntax preset var wikEdHighlightSyntaxPreset = wikEdHighlightSyntaxPreset || true;

// enable wikEd preset if (typeof(wikEdUseWikEdPreset) == 'undefined') { var wikEdUseWikEdPreset = true; }

// add '...using wikEd' to summary preset (set to true by single-session cookie wikEdSummaryUsing) if (typeof(wikEdUsingPreset) == 'undefined') { var wikEdUsingPreset = false; }

// wikEdDiff preset if (typeof(wikEdDiffPreset) == 'undefined') { var wikEdDiffPreset = false; }

// fullscreen mode preset if (typeof(wikEdFullScreenModePreset) == 'undefined') { var wikEdFullScreenModePreset = false; }

// show MediaWiki toolbar preset if (typeof(wikEdCloseToolbarPreset) == 'undefined') { var wikEdCloseToolbarPreset = false; }

// hide ref tags preset if (typeof(wikEdRefHidePreset) == 'undefined') { var wikEdRefHidePreset = false; }

// initial text zoom for edit window (percentage) var wikEdTextZoom = wikEdTextZoom || 100;

// remove invisible syntax highlighting comments after closing tag if (typeof(wikEdRemoveHighlightComments) == 'undefined') { var wikEdRemoveHighlightComments = true; }

// show the text-to-source button for testing purposes if (typeof(wikEdShowSourceButton) == 'undefined') { var wikEdShowSourceButton = false; }

// show the using-wiked button if (typeof(wikEdShowUsingButton) == 'undefined') { var wikEdShowUsingButton = false; }

// the wikEd help page link to be displayed after the editing help link, an empty string disables the link var wikEdHelpPageLink = wikEdHelpPageLink || wikEdText['wikEdHelpPageLink'];

// display the wikEd button bars on top of the edit box if (typeof(wikEdButtonsOnTop) == 'undefined') { var wikEdButtonsOnTop = true; }

// enable external diff script if (typeof(wikEdLoadDiffScript) == 'undefined') { var wikEdLoadDiffScript = true; }

// diff script URL var wikEdDiffScriptSrc = wikEdDiffScriptSrc || 'http://en.wikipedia.org/w/index.php?title=User:Cacycle/diff.js&action=raw&ctype=text/javascript';

// enable external wikEdDiff script if (typeof(wikEdLoadDiff) == 'undefined') { var wikEdLoadDiff = true; }

// wikEdDiff script URL, also defined in wikEdDiff.js var wikEdDiffSrc = wikEdDiffSrc || 'http://en.wikipedia.org/w/index.php?title=User:Cacycle/wikEdDiff.js&action=raw&ctype=text/javascript';

// enable external InstaView script if (typeof(wikEdLoadInstaView) == 'undefined') { var wikEdLoadInstaView = true; }

// InstaView script URL var wikEdInstaViewSrc = wikEdInstaViewSrc || 'http://en.wikipedia.org/w/index.php?title=User:Pilaf/include/instaview.js&action=raw&ctype=text/javascript';

// enable external RegExTypoFix script if (typeof(wikEdLoadRegExTypoFix) == 'undefined') { var wikEdLoadRegExTypoFix = false; }

// RegExTypoFix script URL var wikEdRegExTypoFixSrc = wikEdRegExTypoFixSrc || 'http://en.wikipedia.org/w/index.php?title=User:Cacycle/wikEdTypoFix.js&action=raw&ctype=text/javascript';

// enable RegExTypoFix (http://en.wikipedia.org/wiki/User:Mboverload/RegExTypoFix), needs User:Cacycle/wikEdTypoFix.js or translation if (typeof(wikEdRegExTypoFix) == 'undefined') { var wikEdRegExTypoFix = true; }

// enable highlighting as links if (typeof(wikEdFollowHighlightedLinks) == 'undefined') { var wikEdFollowHighlightedLinks = false; }

// skip the browser detection to run wikEd under IE and Opera if (typeof(wikEdSkipBrowserTest) == 'undefined') { var wikEdSkipBrowserTest = false; }

// set the button bar grip width in px var wikEdButtonBarGripWidth = wikEdButtonBarGripWidth || 8;

// enable local preview (Pilaf's InstaView) if (typeof(wikEdUseLocalPreview) == 'undefined') { var wikEdUseLocalPreview = true; }

// allow ajax requests from local copy for testing, also defined in wikEdDiff.js if (typeof(wikEdAllowLocalAjax) == 'undefined') { var wikEdAllowLocalAjax = false; }

// enable server preview (Ajax) if (typeof(wikEdUseAjaxPreview) == 'undefined') { var wikEdUseAjaxPreview = true; }

// enable auto update (Ajax) if (typeof(wikEdAutoUpdate) == 'undefined') { var wikEdAutoUpdate = true; }

// hours between update check var wikEdAutoUpdateHours = wikEdAutoUpdateHours || 20;

// auto update version url (ajax) var wikEdAutoUpdateUrl = wikEdAutoUpdateUrl || 'http://en.wikipedia.org/w/index.php?title=User:Cacycle/wikEd_current_version&action=raw&maxage=0';

// show complete unshortened article text for local diff, also defined in wikEdDiff.js if (typeof(wikEdFullDiff) == 'undefined') { var wikEdFullDiff = false; }

// make links ctrl-clickable if (typeof(wikEdFollowLinks) == 'undefined') { var wikEdFollowLinks = true; }

// correct tab order between check boxes and submit buttons if (typeof(wikEdSubmitTabOrder) == 'undefined') { var wikEdSubmitTabOrder = false; }

// // end of user configurable variables //

{{subst:1|globals}}

// global variables

var wikEdLoaded; var wikEdDisabled = false;

// history var wikEdFieldHist = []; var wikEdCookieName = []; var wikEdInputElement = []; var wikEdSelectElement = [];

var wikEdCheckMarker = []; wikEdCheckMarker[true] = '\u2022'; wikEdCheckMarker[false] = '\u22c5';

// cache the parsed DOM object var wikEdFrameDOMCache;

// undo all, redo all var wikEdOrigVersion = ; var wikEdLastVersion;

// global dom elements var wikEdLogo; var wikEdLogoList;

var wikEdTextarea; var wikEdFrame; var wikEdFrameBody; var wikEdFrameDocument; var wikEdFrameWindow;

var wikEdInputWrapper; var wikEdToolbarWrapper; var wikEdTextareaWrapper; var wikEdFrameWrapper; var wikEdConsoleWrapper; var wikEdButtonsWrapper; var wikEdSummaryWrapper; var wikEdSummaryInputWrapper; var wikEdSummaryOptions; var wikEdSubmitWrapper; var wikEdSubmitButtonsWrapper; var wikEdLocalPrevWrapper; var wikEdInsertWrapper;

var wikEdButtonBarFormat; var wikEdButtonBarCustom1; var wikEdButtonBarFind; var wikEdButtonBarFix; var wikEdButtonBarCustom2; var wikEdButtonBarControl; var wikEdButtonBarPreview; var wikEdButtonBarPreview2; var wikEdButtonBarJump; var wikEdPreviewBox; var wikEdClearSummary; var wikEdClearSummaryImg;

var wikEdCaseSensitive; var wikEdRegExp; var wikEdFindAhead;

var wikEdFindText; var wikEdReplaceText; var wikEdSummaryText; var wikEdSummarySelect;

var wikEdEditOptions; var wikEdEditHelp;

var wikEdSaveButton; var wikEdPreviewButton; var wikEdLDiffButton; var wikEdLocalPreview; var wikEdLocalDiff; var wikEdDiffPreviewButton; var wikEdSummaryLabel;

// various var wikEdTextareaHeight; var wikEdClearSummaryWidth; var wikEdFullScreenMode = false; var wikeEdInsertTagsOriginal; var wikEdAddNewSection; var wikEdBrowserNotSupported var wikEdFrameScrollTop;

// wikEd settings var wikEdRefHide; var wikEdUsing; var wikEdUseWikEd; var wikEdCloseToolbar; var wikEdHighlightSyntax; var wikEdDiff;

// unicode fixing var wikEdControlCharsStr = ; var wikEdSupportedChars; var wikEdSpecialChars; var wikEdProblemChars; var wikEdControlChars; var wikEdStrangeSpaces;

// debugging time measurement, usage: wikEdDebugTimer.push([1234, new Date]); WikEdDebugTimer(); var wikEdDebugTimer = [];

// MediaWiki file paths for use in regexps var wikEdServer = ; var wikEdArticlePath = ; var wikEdScriptPath = ; var wikEdArticlePrefix = ;

// hash of loaded scripts, also defined in wikEdDiff.js var wikEdExternalScripts = wikEdExternalScripts || [];

// check for updates WikEdAutoUpdate();

// call the setup routine if (typeof(addOnloadHook) == 'function') {

   addOnloadHook(WikEdSetup);

} else {

   window.onload = WikEdSetup;

}


// // WikEdInitObject: initialize object, keep pre-defined values //

function WikEdInitObject(array, preset) {

   for (var key in preset) {
       if (array[key] == null) {
           array[key] = preset[key];
       }
   }
   return;

}


// // WikEdInitImage: initialize images, keep pre-defined values //

function WikEdInitImage(array, preset) {

   for (var key in preset) {
       if (array[key] == null) {

// remove MediaWiki path prefixes and add local path

           if (wikEdUseLocalImages == true) {
               array[key] = wikEdImagePathLocal + preset[key].replace(/^[0-9a-f]+\/[0-9a-f]+\//, );
           }

// add path

           else {
               array[key] = wikEdImagePath + preset[key];
           }
       }
   }
   return;

}


// // WikEdSetup: setup routine, called on page load //

function WikEdSetup(scrollToText) {

// initialize texts and images (needed here for logo)

   WikedInitText();
   WikedInitImage();

// add image path to image filename

   if (wikEdLogo == null) {

// 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);
       }
   }

// detect already loaded external scripts

   if (wikEdExternalScripts == null) {
       var pageScripts = document.getElementsByTagName('script');
       for (var i = 0; i < pageScripts.length; i ++) {
           var nameMatch = pageScripts[i].src.match(/\/([^\/]*?)($|\?)/);
           if (nameMatch != null) {
               var scriptName = nameMatch[1];
               if (scriptName != ) {
                   wikEdExternalScripts[scriptName] = true;
               }
           }
       }
   }

// load the external diff script

   var head =    document.getElementsByTagName('head')[0];
   if ( (wikEdLoadDiffScript == true) && (wikEdExternalScripts['diff.js'] == null) ) {
       var script = document.createElement('script');
       script.type = 'text/javascript';
       script.src  = wikEdDiffScriptSrc;
       head.appendChild(script);
       wikEdExternalScripts['diff.js'] = true;
   }

// load the external wikEdDiff script

   if ( (wikEdLoadDiff == true) && (wikEdExternalScripts['wikEdDiff.js'] == null) ) {
       var script = document.createElement('script');
       script.type = 'text/javascript';
       script.src  = wikEdDiffSrc;
       head.appendChild(script);
       wikEdExternalScripts['wikEdDiff.js'] = true;
   }

// check if disabled

   var cookie = WikEdGetCookie('wikEdDisabled');
   if (cookie != ) {
       wikEdDisabled = true;
       wikEdUseWikEd = false;
       WikEdSetLogo();
       return;
   }

// check if setup was already run

   if (wikEdLoaded == true) {
       return;
   }

// set error logo

   WikEdSetLogo('error');

// at the moment this works only for Mozilla browsers (Mozilla, Mozilla Firefox, Mozilla SeaMonkey)

   if (wikEdSkipBrowserTest != true) {

// no id no wikEd

       if (navigator.appName == null) {
           wikEdBrowserNotSupported = true;
       }
       else {

// check if it is a Netscape descendant

           var origin = navigator.appName.match(/Netscape/i);
           if ( (origin == null) || (origin == ) ) {
               wikEdBrowserNotSupported = true;
           }

// check the generation

           var generation = navigator.appVersion.match(/\d+(\.\d+)/);
           if ( (generation == null) || (generation[0] < 5.0) ) {
               wikEdBrowserNotSupported = true;
           }

// check if it is a Gecko browser

           var geckoDate = navigator.userAgent.match(/\bGecko\/(\d+)/i);
           if (geckoDate != null) {
               if ( (geckoDate[1] != ) && (geckoDate[1] < 20050000) ) {
                   wikEdBrowserNotSupported = true;
               }
           }

// check browser and version

           var agent = navigator.userAgent.match(/(Firefox|Netscape|SeaMonkey)\/(\d+\.\d+)/i);
           if (agent != null) {
               var browser = agent[1];
               var version = agent[2];
               if (
                   (browser == 'Firefox') && (version < 1.5) ||
                   (browser == 'Netscape') && (version < 8.0) ||
                   (browser == 'SeaMonkey') && (version < 1.0)
               ) {
                   wikEdBrowserNotSupported = true;
               }
           }
       }

// browser not supported, set error message

       if (wikEdBrowserNotSupported == true) {
           WikEdSetLogo('browser');
           return;
       }
   }

// check if this is an edit page

   wikEdTextarea = document.getElementsByName('wpTextbox1')[0];
   var wpEditform = document.getElementById('editform');
   wikEdSaveButton = document.getElementById('wpSave');
   if ( (wikEdTextarea == null) || (wpEditform == null) || (wikEdSaveButton == null) ) {

// reset error indicator

       WikEdSetLogo();
       return;
   }

// initialize frame css, main css, buttons, and button bars

   WikedInitFrameCSS();
   WikedInitMainCSS();
   WikedInitButton();
   WikedInitButtonBar();

// define Unicode characters for fixing function

   WikEdInitUnicode();

// detect if we add a new section (+ tab)

   if (/(\?|&)section=new\b/.test(window.location.search) == true) {
       wikEdAddNewSection = true;
   }

// load the external InstaView script

   if ( (wikEdLoadInstaView == true) && (wikEdExternalScripts['instaview.js'] == null) ) {
       var script = document.createElement('script');
       script.type = 'text/javascript';
       script.src  = wikEdInstaViewSrc;
       head.appendChild(script);
       wikEdExternalScripts['instaview.js'] = true;
   }
   else if (wikEdLoadInstaView != true) {
       wikEdUseLocalPreview = false;
   }

// load the external RegExTypoFix script

   if ( (wikEdLoadRegExTypoFix == true) && (wikEdExternalScripts['RegExTypoFix.js'] == null) ) {
       var script = document.createElement('script');
       script.type = 'text/javascript';
       script.src  = wikEdRegExTypoFixSrc;
       head.appendChild(script);
       wikEdExternalScripts['RegExTypoFix.js'] = true;
   }
   else if (wikEdLoadRegExTypoFix != true) {
       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();
   var rules = ;
   for (var ruleName in wikEdMainCSS) {
       var ruleStyle = wikEdMainCSS[ruleName];
       ruleStyle = ruleStyle.replace(/\{wikEdGrip\}/g, wikEdImage['grip']);
       rules += ruleName + ' {' + ruleStyle + '}\n';
   }
   mainStyle.addRules(rules);

// get button settings from cookies

   wikEdUsing = WikEdGetCookieSetting('wikEdSummaryUsing', wikEdUsingPreset);
   wikEdUseWikEd = WikEdGetCookieSetting('wikEdUseClassic', wikEdUseWikEdPreset);
   wikEdHighlightSyntax = WikEdGetCookieSetting('wikEdSyntaxOff', wikEdHighlightSyntaxPreset);
   wikEdFullScreenMode = WikEdGetCookieSetting('wikEdFullscreen', wikEdFullScreenModePreset);
   wikEdCloseToolbar = WikEdGetCookieSetting('wikEdCloseToolbar', wikEdCloseToolbarPreset);
   wikEdRefHide = WikEdGetCookieSetting('wikEdRefHide', wikEdRefHidePreset);
   wikEdDiff = WikEdGetCookieSetting('wikEdDiff', wikEdDiffPreset);

// no fullscreen for preview pages

   if (window.location.search.match(/(\?|&)action=submit\b/) != null) {
       wikEdFullScreenMode = false;
   }

// disable wikEd for js pages

   if ( (typeof(wgTitle) == 'string') && (typeof(wgCanonicalNamespace) == 'string') ) {
       if (/\.js$/.test(wgTitle) == true) {
           if ( (wgCanonicalNamespace != 'User_talk') && (wgCanonicalNamespace != 'Talk') ) {
               if (wikEdOrigVersion.length > 20000) {
                   wikEdUseWikEd = false;
               }
               else {
                   wikEdHighlightSyntax = false;
               }
           }
       }
   }

// preset frame related styles to avoid browser crashes

   var styleFrameBody;
   var styleFrameWrapperPosition;
   var styleFrameWrapperVisibility;
   var styleTextareaWrapperPosition;
   var styleTextareaWrapperVisibility;
   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';
   }
   var wikEdInputWrapperClass;
   if (wikEdFullScreenMode == true) {
       wikEdInputWrapperClass = 'wikEdInputWrapperFull';
   }
   else {
       wikEdInputWrapperClass = 'wikEdInputWrapper';
   }

// create wikEd element wrappers

// create input wrapper, this contains the whole fullscreen content

   wikEdInputWrapper = document.createElement('div');
   wikEdInputWrapper.id = 'wikEdInputWrapper';
   wikEdInputWrapper.className = wikEdInputWrapperClass;
   wikEdTextarea.parentNode.insertBefore(wikEdInputWrapper, wikEdTextarea);

// create toolbar wrapper

   wikEdToolbarWrapper = document.createElement('div');
   wikEdToolbarWrapper.id = 'wikEdToolbarWrapper';
   wikEdToolbarWrapper.className = 'wikEdToolbarWrapper';
   wikEdInputWrapper.appendChild(wikEdToolbarWrapper);

// create textarea wrapper

   wikEdTextareaWrapper = document.createElement('div');
   wikEdTextareaWrapper.id = 'wikEdTextareaWrapper';
   wikEdTextareaWrapper.className = 'wikEdTextareaWrapper';
   wikEdTextareaWrapper.style.position = styleTextareaWrapperPosition;
   wikEdTextareaWrapper.style.visibility = styleTextareaWrapperVisibility;
   wikEdInputWrapper.appendChild(wikEdTextareaWrapper);

// create frame wrapper

   wikEdFrameWrapper = document.createElement('div');
   wikEdFrameWrapper.id = 'wikEdFrameWrapper';
   wikEdFrameWrapper.className = 'wikEdFrameWrapper';
   wikEdFrameWrapper.style.position = styleFrameWrapperPosition;
   wikEdFrameWrapper.style.visibility = styleFrameWrapperVisibility;
   wikEdInputWrapper.appendChild(wikEdFrameWrapper);

// create console wrapper for buttons, summary, and submit

   wikEdConsoleWrapper = document.createElement('div');
   wikEdConsoleWrapper.id = 'wikEdConsoleWrapper';
   wikEdConsoleWrapper.className = 'wikEdConsoleWrapper';
   wikEdInputWrapper.appendChild(wikEdConsoleWrapper);

// create buttons wrapper for wikEd buttons

   wikEdButtonsWrapper = document.createElement('div');
   wikEdButtonsWrapper.id = 'wikEdButtonsWrapper';
   wikEdButtonsWrapper.className = 'wikEdButtonsWrapper';
   if (wikEdButtonsOnTop == true) {
       wikEdInputWrapper.insertBefore(wikEdButtonsWrapper, wikEdTextareaWrapper);
   }
   else {
       wikEdConsoleWrapper.appendChild(wikEdButtonsWrapper);
   }

// create summary wrapper for summary, minor edit, and watch this page

   wikEdSummaryWrapper = document.createElement('div');
   wikEdSummaryWrapper.id = 'wikEdSummaryWrapper';

// add summary above the edit field if we add a new section (+ tab)

   if (wikEdAddNewSection == true) {
       wikEdSummaryWrapper.className = 'wikEdSummaryWrapperTop';
       wikEdInputWrapper.insertBefore(wikEdSummaryWrapper, wikEdFrameWrapper);
   }
   else {
   wikEdSummaryWrapper.className = 'wikEdSummaryWrapper';
       wikEdConsoleWrapper.appendChild(wikEdSummaryWrapper);
   }

// create summary input wrapper

   wikEdSummaryInputWrapper = document.createElement('div');
   wikEdSummaryInputWrapper.id = 'wikEdSummaryInputWrapper';
   wikEdSummaryInputWrapper.className = 'wikEdSummaryInputWrapper';
   wikEdSummaryWrapper.appendChild(wikEdSummaryInputWrapper);

// create minor edit and watch page wrapper

   wikEdSummaryOptions = document.createElement('div');
   wikEdSummaryOptions.id = 'wikEdSummaryOptions';
   wikEdSummaryOptions.className = 'wikEdSummaryOptions';
   wikEdSummaryWrapper.appendChild(wikEdSummaryOptions);

// create submit wrapper for submit elements

   wikEdSubmitWrapper = document.createElement('div');
   wikEdSubmitWrapper.id = 'wikEdSubmitWrapper';
   wikEdSubmitWrapper.className = 'wikEdSubmitWrapper';
   wikEdConsoleWrapper.appendChild(wikEdSubmitWrapper);

// create submit buttons wrapper for submit buttons and help links

   wikEdSubmitButtonsWrapper = document.createElement('div');
   wikEdSubmitButtonsWrapper.id = 'wikEdSubmitButtonsWrapper';
   wikEdSubmitButtonsWrapper.className = 'wikEdSubmitButtonsWrapper';
   wikEdSubmitWrapper.appendChild(wikEdSubmitButtonsWrapper);

// create preview wrapper for preview and diff box

   wikEdLocalPrevWrapper = document.createElement('div');
   wikEdLocalPrevWrapper.id = 'wikEdLocalPrevWrapper';
   wikEdLocalPrevWrapper.className = 'wikEdLocalPrevWrapper';
   wikEdLocalPrevWrapper.style.display = 'none';
   wikEdInputWrapper.appendChild(wikEdLocalPrevWrapper);

// create insert wrapper for insert special chars links

   wikEdInsertWrapper = document.createElement('div');
   wikEdInsertWrapper.id = 'wikEdInsertWrapper';
   wikEdInsertWrapper.className = 'wikEdInsertWrapper';
   wikEdInputWrapper.appendChild(wikEdInsertWrapper);

// append input wrapper to document

   wpEditform.insertBefore(wikEdInputWrapper, wpEditform.firstChild);

// fill the wrappers

// wikEdDiff enhanced ajax diff

   if (typeof(wikEdDiffTable) == 'object') {
       if ( (wikEdDiffTable != null) && (wikEdDiff == true) ) {
           if (typeof(WikEdDiff) == 'function') {
               WikEdDiff();
           }
       }
   }

// add toolbar to toolbar wrapper

   var wpToolbar = document.getElementById('toolbar');
   if (wikEdCloseToolbar == true) {
       wikEdToolbarWrapper.style.display = 'none';
   }
   else {
       wikEdToolbarWrapper.style.display = 'block';
   }
   if (wpToolbar != null) {
       wikEdToolbarWrapper.appendChild(wpToolbar);
   }

// call wikibits:mwSetupToolbar() now because it would terminate with an error after setting textarea to display: none

   if (wpToolbar != null) {
       if (wpToolbar.getElementsByTagName('IMG').length == 0) {
           if (typeof(mwSetupToolbar) == 'function') {
               mwSetupToolbar();
               window.removeEventListener('load', mwSetupToolbar, false);
           }
       }
   }
   wikEdEditOptions = document.getElementsByName('wpSummary')[0].parentNode;
   wikEdEditOptions.className = 'wikEdEditOptions';

// add summary elements to summary input wrapper

   wikEdSummaryLabel = document.getElementById('wpSummaryLabel');
   if (wikEdSummaryLabel != null) {
       wikEdSummaryInputWrapper.appendChild(wikEdSummaryLabel);
   }
   wikEdSummaryText = document.getElementsByName('wpSummary')[0];
   wikEdSummaryInputWrapper.appendChild(wikEdSummaryText);

// move editpage-copywarn out of summary wrapper // needs to be done before appending editOptions to summary wrapper otherwise a linebreak stays (Mozilla bug)

   var copywarn = document.getElementById('editpage-copywarn');
   if (copywarn != null) {
       wikEdInputWrapper.parentNode.insertBefore(copywarn, wikEdInputWrapper.nextSibling);
   }

// add submit buttons to submit wrapper

   var wpEditButtons = wikEdSaveButton.parentNode;
   wikEdSubmitWrapper.insertBefore(wpEditButtons, wikEdSubmitButtonsWrapper);

// move edit options after submit buttons; crashes Mozilla when appended after filling the iframe

   var previewButton = document.getElementById('wpDiff');
   previewButton.parentNode.insertBefore(wikEdEditOptions, previewButton.nextSibling);

// remove linebreak before minor edit checkbox

   var node = wikEdEditOptions.firstChild;
   while (node != null) {
       if (node.tagName != null) {
           if (node.tagName == 'BR') {
               node.parentNode.removeChild(node);
               break;
           }
       }
       node = node.nextSibling;
   }

// correct tab order between check boxes and submits

   wikEdPreviewButton = document.getElementById('wpPreview');
   wikEdDiffPreviewButton = document.getElementById('wpDiff');
   if (wikEdSubmitTabOrder == true) {
       var wpMinoredit = document.getElementById('wpMinoredit');
       var wpWatchthis = document.getElementById('wpWatchthis');
       if ( (wpMinoredit != null) && (wpWatchthis != null) ) {
           var tabIndex = [];
           tabIndex.push(wpMinoredit.tabIndex, wpWatchthis.tabIndex, wikEdSaveButton.tabIndex, wikEdPreviewButton.tabIndex, wikEdDiffPreviewButton.tabIndex);
           wikEdSaveButton.tabIndex = tabIndex.shift();
           wikEdPreviewButton.tabIndex = tabIndex.shift();
           wikEdDiffPreviewButton.tabIndex = tabIndex.shift();
           wpMinoredit.tabIndex = tabIndex.shift();
           wpWatchthis.tabIndex = tabIndex.shift();
       }
   }

// 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 mozilla, including DOM move, display: none; and position: absolute;

// create the iframe

   var html = ;

html += '

'; html += '
';
   html += '<iframe id="wikEdFrame" class="wikEdFrame" name="wikEdFrame" style="height: ' + wikEdTextareaHeight + 'px;"></iframe>';
html += '
'; html += '

';

   wikEdFrameWrapper.innerHTML = html;
   wikEdInputWrapper.insertBefore(wikEdTextareaWrapper, wikEdFrameWrapper);

// fill the frame with content

   html = ;
   html += '<html><head></head>';
   html += '<body id="wikEdFrameBody" class="wikedFrameBody"' + styleFrameBody + 'onload="window.document.designMode = \'on\'; window.document.execCommand(\'styleWithCSS\', false, false);">';
   html += '</body></html>';
   wikEdFrame = document.getElementById('wikEdFrame');
   wikEdFrameWindow = wikEdFrame.contentWindow;
   wikEdFrameDocument = wikEdFrameWindow.document;
   wikEdFrameDocument.open();
   wikEdFrameDocument.write(html);
   wikEdFrameDocument.close();
   wikEdFrameBody = wikEdFrameDocument.body;

// generate button bars and add them to the buttons wrapper // form wrapper has been added against summary input submit defaulting to this button

   wikEdButtonBarFormat = MakeButtonBar(wikEdButtonBar['format']);
   wikEdButtonsWrapper.appendChild(wikEdButtonBarFormat);
   wikEdButtonBarControl = MakeButtonBar(wikEdButtonBar['control']);
   wikEdButtonsWrapper.appendChild(wikEdButtonBarControl);
   if (wikEdButtonBar['custom1'][6].length > 0) {
       wikEdButtonBarCustom1 = MakeButtonBar(wikEdButtonBar['custom1']);
       wikEdButtonsWrapper.appendChild(wikEdButtonBarCustom1);
   }
   wikEdButtonBarFind = MakeButtonBar(wikEdButtonBar['find']);
   wikEdButtonsWrapper.appendChild(wikEdButtonBarFind);
   wikEdButtonBarFix = MakeButtonBar(wikEdButtonBar['fix']);
   wikEdButtonsWrapper.appendChild(wikEdButtonBarFix);
   if (wikEdButtonBar['custom2'][6].length > 0) {
       wikEdButtonBarCustom2 = MakeButtonBar(wikEdButtonBar['custom2']);
       wikEdButtonsWrapper.appendChild(wikEdButtonBarCustom2);
   }
   var br = document.createElement('br');
   br.style.clear = 'both';
   wikEdButtonsWrapper.appendChild(br);
   wikEdCaseSensitive = document.getElementById('wikEdCaseSensitive');
   wikEdRegExp = document.getElementById('wikEdRegExp');
   wikEdFindAhead = document.getElementById('wikEdFindAhead');
   wikEdFindText = document.getElementById('wikEdFindText');
   wikEdReplaceText = document.getElementById('wikEdReplaceText');

// add preview box top bar to submit wrapper

   wikEdButtonBarPreview = MakeButtonBar(wikEdButtonBar['preview']);
   wikEdSubmitWrapper.insertBefore(wikEdButtonBarPreview, wikEdSubmitWrapper.firstChild);

// add preview box and its bottom bar to preview wrapper

   var div = document.createElement('div');
   div.id = 'wikEdPreviewBoxOuter';
   div.className = 'wikEdPreviewBoxOuter';
   wikEdLocalPrevWrapper.appendChild(div);
   wikEdPreviewBox = document.createElement('div');
   wikEdPreviewBox.id = 'wikEdPreviewBox';
   wikEdPreviewBox.className = 'wikEdPreviewBox';
   div.appendChild(wikEdPreviewBox);
   wikEdButtonBarPreview2 = MakeButtonBar(wikEdButtonBar['preview2']);
   wikEdLocalPrevWrapper.appendChild(wikEdButtonBarPreview2);

// add jump box to standard preview

   var wikiPreview = document.getElementById('wikiPreview');
   if (wikiPreview != null) {
       if (wikiPreview.firstChild != null) {
           wikEdButtonBarJump = MakeButtonBar(wikEdButtonBar['jump']);
           wikiPreview.insertBefore(wikEdButtonBarJump, wikiPreview.firstChild);
       }
   }

// add insert special chars to insert wrapper

   var wpSpecialchars = document.getElementById('editpage-specialchars');
   if (wpSpecialchars != null) {
       wikEdInsertWrapper.appendChild(wpSpecialchars);
   }

// wrappers filled

// add local preview button next to submit button

   wikEdLocalPreview = document.createElement('button');
   wikEdLocalPreview.id = 'wikEdLocalPreview';
   wikEdLocalPreview.title = wikEdText['wikEdLocalPreview title'];
   wikEdLocalPreview.className = 'wikEdLocalPreview';
   var localPreviewImg = document.createElement('img');
   localPreviewImg.id = 'wikEdLocalPreviewImg';
   localPreviewImg.src = wikEdImage['preview'];
   localPreviewImg.alt = wikEdText['wikEdLocalPreviewImg alt'];
   localPreviewImg.title = wikEdText['wikEdLocalPreviewImg title'];
   wikEdLocalPreview.appendChild(localPreviewImg);
   wikEdPreviewButton.parentNode.insertBefore(wikEdLocalPreview, wikEdPreviewButton.nextSibling);

// add local diff button next to submit button

   wikEdLocalDiff = document.createElement('button');
   wikEdLocalDiff.id = 'wikEdLocalDiff';
   wikEdLocalDiff.title = wikEdText['wikEdLocalDiff title'];
   wikEdLocalDiff.className = 'wikEdLocalDiff';
   var localDiffImg = document.createElement('img');
   localDiffImg.id = 'wikEdLocalDiffImg';
   localDiffImg.src = wikEdImage['diff'];
   localDiffImg.alt = wikEdText['wikEdLocalDiffImg alt'];
   localDiffImg.title = wikEdText['wikEdLocalDiffImg title'];
   wikEdLocalDiff.appendChild(localDiffImg);
   wikEdDiffPreviewButton.parentNode.insertBefore(wikEdLocalDiff, wikEdDiffPreviewButton.nextSibling);

// initialize image buttons

   WikEdButton(document.getElementById('wikEdDiff'),            'wikEdDiff', null, wikEdDiff);
   WikEdButton(document.getElementById('wikEdRefHide'),         'wikEdRefHide', null, wikEdRefHide);
   WikEdButton(document.getElementById('wikEdHighlightSyntax'), 'wikEdHighlightSyntax', null, wikEdHighlightSyntax);
   WikEdButton(document.getElementById('wikEdUseWikEd'),        'wikEdUseWikEd', null, wikEdUseWikEd);
   WikEdButton(document.getElementById('wikEdCloseToolbar'),    'wikEdCloseToolbar', null, wikEdCloseToolbar);
   WikEdButton(document.getElementById('wikEdFullScreen'),      'wikEdFullScreen', null, wikEdFullScreenMode);
   WikEdButton(document.getElementById('wikEdUsing'),           'wikEdUsing', null, wikEdUsing);
   WikEdButton(document.getElementById('wikEdCaseSensitive'),   'wikEdCaseSensitive', null, false);
   WikEdButton(document.getElementById('wikEdRegExp'),          'wikEdRegExp', null, false);
   WikEdButton(document.getElementById('wikEdFindAhead'),       'wikEdFindAhead', null, wikEdFindAheadSelected);
   WikEdButton(document.getElementById('wikEdClose'),           'wikEdClose', null, false, 'wikEdButton');
   WikEdButton(document.getElementById('wikEdClose2'),          'wikEdClose2', null, false, 'wikEdButton');
   if (wikEdRegExTypoFix == false) {
       document.getElementById('wikEdFixRegExTypo').style.display = 'none';
   }

// add a clear summary button left to the summary input field

   var clearSummaryForm = document.createElement('form');
   clearSummaryForm.id = 'wikEdClearSummaryForm';
   clearSummaryForm.className = 'wikEdClearSummaryForm';
   wikEdSummaryText.parentNode.insertBefore(clearSummaryForm, wikEdSummaryText);
   wikEdClearSummary = document.createElement('button');
   wikEdClearSummary.id = 'wikEdClearSummary';
   wikEdClearSummary.className = 'wikEdClearSummary';
   wikEdClearSummary.alt = wikEdText['wikEdClearSummary alt'];
   wikEdClearSummary.title = wikEdText['wikEdClearSummary title'];
   wikEdClearSummary.style.height = (wikEdSummaryText.clientHeight + 1) +'px';
   clearSummaryForm.appendChild(wikEdClearSummary);
   wikEdClearSummaryImg = document.createElement('img');
   wikEdClearSummaryImg.id = 'wikEdClearSummaryImg';
   wikEdClearSummaryImg.src = wikEdImage['clearSummary'];
   wikEdClearSummaryImg.alt = 'Clear summary';
   wikEdClearSummary.appendChild(wikEdClearSummaryImg);

// remember button width, might be without image

   wikEdClearSummaryWidth = wikEdClearSummary.offsetWidth;

// make the summary a combo box

   var summaryComboInput = document.createElement('span');
   summaryComboInput.id = 'wikEdSummaryComboInput';
   summaryComboInput.className = 'wikEdSummaryComboInput';
   summaryComboInput = wikEdSummaryText.parentNode.insertBefore(summaryComboInput, wikEdSummaryText);
   wikEdSummaryText = wikEdSummaryText.parentNode.removeChild(wikEdSummaryText);
   wikEdSummaryText.className = 'wikEdSummaryText';
   var wikEdSummaryTextWidth = wikEdSummaryWrapper.offsetWidth - wikEdSummaryInputWrapper.offsetWidth;
   if (wikEdSummaryTextWidth < 150) {
       wikEdSummaryTextWidth = 150;
   }
   wikEdSummaryText.style.width = wikEdSummaryTextWidth + 'px';
   wikEdSummarySelect = document.createElement('select');
   wikEdSummarySelect.id = 'wikEdSummarySelect';
   wikEdSummarySelect.className = 'wikEdSummarySelect';
   wikEdSummarySelect.onchange = function() {
       WikEdChangeComboInput('summary');
   }
   wikEdSummarySelect.onfocus = function() {
       WikEdSetComboOptions('summary');
   }
   summaryComboInput.appendChild(wikEdSummaryText);
   summaryComboInput.appendChild(wikEdSummarySelect);

// shorten submit button texts

   wikEdPreviewButton.value = wikEdText['shortenedPreview'];
   wikEdDiffPreviewButton.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';
   wikEdSelectElement['find'].title = wikEdText['wikEdFindSelect title'];
   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';
   wikEdSelectElement['replace'].title = wikEdText['wikEdReplaceSelect title'];
   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';
   wikEdSelectElement['summary'].title = wikEdText['wikEdSummarySelect title'];

// adjust the select field widths to that of the text input fields

   WikEdResizeComboInput('find');
   WikEdResizeComboInput('replace');
   WikEdResizeComboInput('summary');

// hide the button bars per cookie setting

   WikEdButtonBarInit(wikEdButtonBarFormat);
   WikEdButtonBarInit(wikEdButtonBarControl);
   if (wikEdButtonBarCustom1 != null) {
       WikEdButtonBarInit(wikEdButtonBarCustom1);
   }
   WikEdButtonBarInit(wikEdButtonBarFind);
   WikEdButtonBarInit(wikEdButtonBarFix);
   if (wikEdButtonBarCustom2 != null) {
       WikEdButtonBarInit(wikEdButtonBarCustom2);
   }

// display only the textarea or the iframe, dont change the frame

   if (wikEdUseWikEd == true) {
       WikEdSetEditArea(true, true);
   }
   else {
       WikEdSetEditArea(false, true);
   }

// add a link to the wikEd help page

   if ( (wikEdHelpPageLink != ) && (wikEdHelpPageLink != null) ) {
       var editHelpParent = previewButton;
       do {
           editHelpParent = editHelpParent.nextSibling;
       } while (editHelpParent.tagName != 'SPAN');
       var editHelp = editHelpParent.lastChild;
       while (editHelp.tagName != 'A') {
           editHelp = editHelp.previousSibling;
       }
       wikEdHelpSpan = document.createElement('span');
       wikEdHelpSpan.id = 'wikEdHelpSpan';
       wikEdHelpSpan.className = 'wikEdHelpSpan';
       wikEdHelpSpan.innerHTML = wikEdHelpPageLink;
       editHelpParent.insertBefore(wikEdHelpSpan, editHelp.nextSibling);
       wikEdEditHelp = wikEdHelpSpan.parentNode;
       wikEdEditHelp.id = 'wikEdEditHelp';
       wikEdEditHelp.className = 'wikEdEditHelp';
   }

// add frame stylesheet definition

   wikEdFrameBody.style.fontSize = parseInt(wikEdTextZoom) + '%;';
   var frameStyle = new WikEdStyleSheet(wikEdFrameDocument);
   var rules = ;
   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']);
       ruleStyle = ruleStyle.replace(/\{wikEdGrip\}/g, wikEdImage['grip']);
       rules += ruleName + ' {' + ruleStyle + '}\n';
   }
   frameStyle.addRules(rules);

// copy the textarea content to the iframe

   if (wikEdUseWikEd == true) {
       WikEdUpdateFrame();
   }

// set the summary shrinking event after loading the 'Clear summary' image handler

   wikEdClearSummaryImg.addEventListener('load', WikEdShrinkSummaryHandler, true);

// set the summary resize event for window resizing

   window.addEventListener('resize', WikEdResizeSummaryHandler, true);

// set frame events

   wikEdFrameDocument.addEventListener('keydown', WikEdKeyFrame, true);
   wikEdFrameDocument.addEventListener('keyup', WikEdKeyFrame, true);
   wikEdFrameDocument.addEventListener('keypress', WikEdKeyFrame, true);
   wikEdFrameDocument.addEventListener('mouseup', WikEdKeyFrame, true);

// set find ahead events

   wikEdFindText.addEventListener('keyup', WikEdFindAhead, true);

// set submit button events

   wikEdSaveButton.addEventListener('click', WikEdSaveButtonHandler, true);
   wikEdPreviewButton.addEventListener('click', WikEdPreviewButtonHandler, true);
   wikEdDiffPreviewButton.addEventListener('click', wikEdDiffPreviewButtonHandler, true);
   wikEdLocalPreview.addEventListener('click', WikEdLocalPreviewHandler, true);
   wikEdLocalDiff.addEventListener('click', WikEdLocalDiffHandler, true);

// set button bar grip area events

   wikEdButtonBarFormat.firstChild.firstChild.addEventListener('click', WikEdButtonBarGripHandler, false);
   wikEdButtonBarControl.firstChild.firstChild.addEventListener('click', WikEdButtonBarGripHandler, false);
   if (wikEdButtonBarCustom1 != null) {
       if (wikEdButtonBarCustom1.firstChild.firstChild != null) {
           wikEdButtonBarCustom1.firstChild.firstChild.addEventListener('click', WikEdButtonBarGripHandler, false);
       }
   }
   wikEdButtonBarFind.firstChild.firstChild.addEventListener('click', WikEdButtonBarGripHandler, false);
   wikEdButtonBarFix.firstChild.firstChild.addEventListener('click', WikEdButtonBarGripHandler, false);
   if (wikEdButtonBarCustom2 != null) {
       if (wikEdButtonBarCustom2.firstChild.firstChild != null) {
           wikEdButtonBarCustom2.firstChild.firstChild.addEventListener('click', WikEdButtonBarGripHandler, false);
       }
   }

// set the clear summary onclick handler

   wikEdClearSummary.addEventListener('click', WikEdClearSummaryHandler, true);

// select the text on focus for find and replace fields

   wikEdFindText.addEventListener('focus', WikEdFindReplaceHandler, true);
   wikEdReplaceText.addEventListener('focus', WikEdFindReplaceHandler, true);

// tab / shift-tab between find and replace fields

   wikEdFindText.addEventListener('keydown', WikEdFindReplaceHandler, true);
   wikEdReplaceText.addEventListener('keydown', WikEdFindReplaceHandler, true);

// scroll to edit window if it is not a preview page

   if (scrollToText != false) {
       if (window.location.search.match(/(\?|&)action=submit\b/) == null) {
           window.scroll(0, WikEdGetOffsetTop(wikEdInputWrapper) - 2);
       }

// focus the edit area

       if (wikEdUseWikEd == true) {
           wikEdFrameWindow.focus();
       }
       else {
           wikEdTextarea.setSelectionRange(0, 0);
           wikEdTextarea.focus();
       }
   }

// init MediaWiki file paths for use in regexps

   if (typeof(wgServer) == 'string') {
       wikEdServer = wgServer.replace(/(\W)/g, '\\$1');
   }
   if (typeof(wgArticlePath) == 'string') {
       wikEdArticlePath = wgArticlePath.replace(wgServer, );
       wikEdArticlePrefix = wgArticlePath.replace(/\$1$/, );
   }
   if (typeof(wgScriptPath) == 'string') {
       wikEdScriptPath = wgScriptPath.replace(wgServer, );
   }
   wikEdArticlePath = wikEdArticlePath.replace(/\$1$/, );
   wikEdScriptPath = wikEdScriptPath.replace(/\/?$/, '/');
   wikEdArticlePath = wikEdArticlePath.replace(/(\W)/g, '\\$1');
   wikEdScriptPath = wikEdScriptPath.replace(/(\W)/g, '\\$1');

// fullscreen mode

   if (wikEdFullScreenMode == true) {
       WikEdFullScreen(wikEdFullScreenMode, true);
   }

// overwrite the insertTags function in wikibits.js used by the standard button toolbar and the editpage special chars

   if (typeof(insertTags) == 'function') {
       wikeEdInsertTagsOriginal = insertTags;
       insertTags = WikEdInsertTags;
   }

// reset error indicator

   WikEdSetLogo();
   wikEdLoaded = true;
   return;

}


// // WikEdAutoUpdate: check for the latest version //

function WikEdAutoUpdate() {

// check if autoupdate is enabled

   if (wikEdAutoUpdate != true) {
       return;
   }

// check only on non-interaction pages

   if (/(\?|&)action=/.test(window.location.search) == true) {
       return;
   }

// check cookie for last update check date

   var cookie = WikEdGetCookie('wikEdAutoUpdate');
   var lastCheck = new Date(cookie);

// fix missing or corrupt cookie

   if (isNaN(lastCheck.valueOf()) == true) {
       WikEdSetCookie('wikEdAutoUpdate', 'January 1, 1970', 0, '/');
       return;
   }

// get the hours since last update check

   var currentDate = new Date();
   var diffHours = (currentDate - lastCheck) / 1000 / 60 / 60;
   if (diffHours < wikEdAutoUpdateHours) {
       return;
   }

// save current update check date to cookie

   WikEdSetCookie('wikEdAutoUpdate', currentDate.toUTCString(), 0, '/');

// allow ajax request from local copy for testing

   if (wikEdAllowLocalAjax == true) {
       if (typeof(netscape) == 'object') {
           netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
       }
   }

// make the ajax request

   var ajax = WikEdAjaxInitObject();
   if (ajax == null) {
       return;
   }
   ajax.open('GET', wikEdAutoUpdateUrl, true);
   ajax.send(null);

// ajax response handler function

   ajax.onreadystatechange = function() {
       if (ajax.readyState != 4) {
           return;
       }

// get response

       var html = ajax.responseText;

// get current version number from string

       var ver = wikEdProgramVersion.match(/(\d+)\.(\d+)\.(\d+)(\w?)/);
       if (ver == null) {
           return;
       }
       var currentVersion = ((Number(ver[1]) * 1000 + Number(ver[2])) * 1000 + Number(ver[3])) * 100 + (ver[4] + '0').charCodeAt(0);

// get new version number from string

       var ver = html.match(/(\d+)\.(\d+)\.(\d+)(\w?)/);
       if (ver == null) {
           return;
       }
       var newVersion = ((Number(ver[1]) * 1000 + Number(ver[2])) * 1000 + Number(ver[3])) * 100 + (ver[4] + '0').charCodeAt(0);

// compare the versions

       if (currentVersion >= newVersion) {
           return;
       }

// update wikEd by reloading the page with cache bypassing (equivalent to Shift-Reload or Shift-F5)

       window.location.reload(true);
   }
   return;

}


// // WikEdShrinkSummaryHandler: shrink the summary after loading the 'Clear summary' image //

function WikEdShrinkSummaryHandler(event) {

   var diffWidth = wikEdClearSummary.offsetWidth - wikEdClearSummaryWidth;
   wikEdInputElement['summary'].style.width = (wikEdInputElement['summary'].clientWidth - diffWidth) + 'px';
   wikEdSelectElement['summary'].style.width = (wikEdSelectElement['summary'].clientWidth - diffWidth) + 'px';
   wikEdClearSummaryWidth = wikEdClearSummary.offsetWidth;
   return;

}


// // WikEdResizeSummaryHandler: adjust the summary width after resizing the window //

function WikEdResizeSummaryHandler(event) {

   WikEdResizeSummary();
   return;

}


// // WikEdSaveButtonHandler: 'Save page' onclick handler //

function WikEdSaveButtonHandler(event) {

   wikEdSaveButton.removeEventListener('click', WikEdSaveButtonHandler, true);

// update textarea

   if (wikEdUseWikEd == true) {
       WikEdUpdateTextarea();
   }

// add "using wikEd" to summary, not for adding a new section (+ tab)

   var text = wikEdSummaryText.value;
   text = text.replace(/^[, ]+/, );
   text = text.replace(/[, ]+$/, );
   WikEdAddToHistory('summary');
   if ( (wikEdUsing == true) && (text != ) ) {
       if (text.lastIndexOf(wikEdSummaryUsing) < 0) {
           if (wikEdAddNewSection != true) {
               text += ' ' + wikEdSummaryUsing;
           }
       }
   }
   wikEdSummaryText.value = text;

// submit

   wikEdSaveButton.click();

// reinstate handler in case the browser back button will be used

   wikEdSaveButton.addEventListener('click', WikEdSaveButtonHandler, true);
   return;

}


// // WikEdPreviewButtonHandler: 'Show preview' onclick handler //

function WikEdPreviewButtonHandler(event) {

   if (wikEdUseWikEd == true) {
       WikEdUpdateTextarea();
   }
   return;

}


// // wikEdDiffPreviewButtonHandler: 'Show changes' onclick handler //

function wikEdDiffPreviewButtonHandler(event) {

   if (wikEdFullScreenMode == true) {
       WikEdFullScreen(false);
   }
   if (wikEdUseWikEd == true) {
       WikEdUpdateTextarea();
   }
   return;

}


// // WikEdFollowLinkHandler: open highlighted link in new window/tab //

function WikEdFollowLinkHandler(event) {

   if (event.ctrlKey == true) {
       if (event.currentTarget.onclick != null) {
           event.stopPropagation();
           var onClickCode = event.currentTarget.onclick.toString();
           var linkMatch = onClickCode.match(/\svar linkUrl *= *[\'\"](.*)[\'\"]/);
           if (linkMatch != null) {
               var linkUrl = linkMatch[1];
               linkUrl = linkUrl.replace(/_/g, ' ');
               window.open(linkUrl);
               window.focus();
           }
       }
   }
   return;

}


// // WikEdLocalPreviewHandler: local 'Show preview' image button onclick handler //

function WikEdLocalPreviewHandler(event) {

   event.preventDefault();
   WikEdButton(wikEdLocalPreview, 'wikEdLocalPreview');
   return;

}


// // WikEdLocalDiffHandler: local 'Show changes' image button onclick handler //

function WikEdLocalDiffHandler(event) {

   event.preventDefault();
   WikEdButton(wikEdLocalDiff, 'wikEdLocalDiff');
   return;

}


// // WikEdButtonBarGripHandler: click, mouseover handler, see also WikEdButtonBarInit() //

function WikEdButtonBarGripHandler(event) {

   event.stopPropagation();
   var grip = event.target;
   var gripWrapper = grip.parentNode;
   var buttonsWrapper = gripWrapper.nextSibling;
   var buttons = buttonsWrapper.firstChild;
   var barInnerWrapper = gripWrapper.parentNode;
   var bar = barInnerWrapper.parentNode;
   if (event.type == 'click') {
       buttonsWrapper.style.position = 'static';

// hide the buttons bar

       if (buttonsWrapper.minimized != true) {
           barInnerWrapper.className = 'wikedButtonBarInnerWrapperHidden';
           gripWrapper.className = 'wikedButtonBarGripWrapperHidden';
           buttonsWrapper.className = 'wikedButtonBarButtonsWrapperHidden';
           buttonsWrapper.widthOriginal = buttonsWrapper.offsetWidth;
           buttonsWrapper.style.display = 'none';
           buttonsWrapper.minimized = true;
           grip.addEventListener('mouseover', WikEdButtonBarGripHandler, false);
           WikEdSetCookie(bar.id + 'Hidden', '1', null, '/');
       }

// unhide the buttons bar

       else {
           barInnerWrapper.className = 'wikedButtonBarInnerWrapperVisible';
           gripWrapper.className = 'wikedButtonBarGripWrapperVisible';
           buttonsWrapper.className = 'wikedButtonBarButtonsWrapperVisible';
           buttonsWrapper.style.display = 'block';
           buttonsWrapper.minimized = false;
           grip.removeEventListener('mouseover', WikEdButtonBarGripHandler, false);
           WikEdSetCookie(bar.id + 'Hidden', , -1, '/');
       }
   }

// show the buttons bar on mouseover

   else if (event.type == 'mouseover') {
       if (buttonsWrapper.minimized == true) {
           bar.addEventListener('mouseout', WikEdButtonBarHandler, false);

// show buttons to the right

           if (bar.offsetParent.clientWidth > grip.offsetLeft + grip.offsetWidth + buttonsWrapper.widthOriginal) {
               buttonsWrapper.style.left = (grip.offsetLeft + grip.offsetWidth) + 'px';
           }

// show buttons to the left

           else {
               buttonsWrapper.style.left = (gripWrapper.offsetLeft - buttonsWrapper.widthOriginal) + 'px';
           }

// a mozilla bug sometimes gives offsetTop - 1 when the wikEdToolbarWrapper is hidden

           buttonsWrapper.style.top = gripWrapper.offsetTop + 'px';
           buttonsWrapper.style.position = 'absolute';
           buttonsWrapper.style.display = 'block';
       }
   }
   return;

}


// // WikEdButtonBarGripHandler: mouseout handler //

function WikEdButtonBarHandler(event) {

   event.stopPropagation();
   var bar = event.currentTarget;
   var barInnerWrapper = bar.firstChild;
   var gripWrapper = barInnerWrapper.firstChild;
   var grip = gripWrapper.firstChild;
   var buttonsWrapper = gripWrapper.nextSibling;
   var buttons = buttonsWrapper.firstChild;

// hide the buttons

   if (event.type == 'mouseout') {
       if (buttonsWrapper.minimized == true) {

// filter the events for mouseouts actually leaving the bar

           if (
               (
                   ( (event.target == grip) || (event.target == gripWrapper) ) &&
                   (event.relatedTarget != gripWrapper) && (event.relatedTarget != buttonsWrapper) && (event.relatedTarget != buttons) && (event.relatedTarget.parentNode != buttons)
               ) ||
               (
                   ( (event.target.parentNode.parentNode == buttons) || (event.target.parentNode == buttons) || (event.target == buttons) || (event.target == buttonsWrapper) ) &&
                   (event.relatedTarget.parentNode.parentNode != buttons) && (event.relatedTarget.parentNode != buttons) && (event.relatedTarget != buttons) && (event.relatedTarget != buttonsWrapper) && (event.relatedTarget != gripWrapper) && (event.relatedTarget != grip)
               )
           ) {
               bar.removeEventListener('mouseout', WikEdButtonBarHandler, false);
               buttonsWrapper.style.display = 'none';
               buttonsWrapper.style.position = 'static';
           }
       }
   }
   return;

}


// // clear the summary onclick handler //

function WikEdClearSummaryHandler(event) {

   event.preventDefault();

// clear the summary if it is only a paragraph name

   if ( /^\/\* .*? \*\/ *$/.test(wikEdSummaryText.value) ) {
       wikEdSummaryText.value = ;
   }

// clear the summary but leave paragraph names

   else {
       wikEdSummaryText.value = wikEdSummaryText.value.replace(/^((\/\* .*? \*\/ *)?).*/,
           function (p, p1, p2) {
               if (p1.length > 0) {
                   p1 = p1 + ' ';
               }
               return(p1);
           }
       );
   }
   wikEdSummaryText.focus();
   return;

}


// // WikEdFindReplaceHandler: find and replace: tab and shift-tab between fields, select on focus //

function WikEdFindReplaceHandler(event) {

// tab / shift-tab between fields

   if (event.type == 'keydown') {
       if (event.keyCode == 9) {
           if (event.target == wikEdFindText) {
               event.preventDefault();
               wikEdReplaceText.removeEventListener('focus', WikEdFindReplaceHandler, true);
               wikEdReplaceText.focus();
               wikEdReplaceText.addEventListener('focus', WikEdFindReplaceHandler, true);
           }
           else if (event.target == wikEdReplaceText) {
               event.preventDefault();
               wikEdFindText.removeEventListener('focus', WikEdFindReplaceHandler, true);
               wikEdFindText.focus();
               wikEdFindText.addEventListener('focus', WikEdFindReplaceHandler, true);
           }
       }
   }

// select on focus

   else if (event.type == 'focus') {
       event.target.setSelectionRange(0, this.textLength);
   }
   return;

}


// // WikEdSetLogo: set the logo on top of the page //

function WikEdSetLogo(state) {

   if (state == 'error') {
       wikEdLogo.src = wikEdImage['error'];
       wikEdLogo.alt = wikEdText['wikEdLogo error alt'];
       wikEdLogo.title = wikEdText['wikEdLogo error title'];
   }
   else if (state == 'browser') {
       wikEdLogo.src = wikEdImage['browser'];
       wikEdLogo.alt = wikEdText['wikEdLogo browser alt'];
       wikEdLogo.title = wikEdText['wikEdLogo browser title'];
   }
   else {
       if (wikEdDisabled == true) {
           wikEdLogo.src = wikEdImage['disabled'];
           wikEdLogo.alt = wikEdText['wikEdLogo disabled alt'];
           wikEdLogo.title = wikEdText['wikEdLogo disabled title'];
       }
       else {
           wikEdLogo.src = wikEdImage['logo'];
           wikEdLogo.alt = wikEdText['wikEdLogo alt'];
           wikEdLogo.title = wikEdText['wikEdLogo title'];
       }
   }
   wikEdLogo.title = wikEdLogo.title.replace(/\{wikEdProgramVersion\}/g, wikEdProgramVersion);
   wikEdLogo.title = wikEdLogo.title.replace(/\{wikEdProgramDate\}/g, wikEdProgramDate);
   return;

}


// // MakeButtonBar: generate button bar div element //

function MakeButtonBar(bar) {

// id outer, class outer, id inner, class inner, alt, button numbers

   var barId = bar[0];
   var barClass = bar[1];
   var buttonsId = bar[2];
   var buttonsClass = bar[3];
   var barHeight = bar[4];
   var gripTitle = bar[5];
   var buttonNumbers = bar[6];

// collect the buttons

   var buttons = ;
   for (var property in buttonNumbers) {
       switch (buttonNumbers[property]) {
           case 'br':
               buttons += '
'; break; case 'find': buttons += ''; buttons += '<input class="wikEdCombo" id="wikEdFindText" type="text" value="">'; buttons += '<select class="wikEdCombo" id="wikEdFindSelect" onfocus="javascript:WikEdSetComboOptions(\'find\')" onChange="javascript:WikEdChangeComboInput(\'find\');">'; buttons += '</select>'; buttons += ''; break; case 'replace': buttons += ''; buttons += '<input class="wikEdCombo" id="wikEdReplaceText" type="text" value="">'; buttons += '<select class="wikEdCombo" id="wikEdReplaceSelect" onfocus="WikEdSetComboOptions(\'replace\')" onChange="javascript:WikEdChangeComboInput(\'replace\');">'; buttons += '</select>'; buttons += ''; break; default: var currButton = wikEdButton[buttonNumbers[property]]; if (typeof(currButton) != 'object') { alert('Loading error: The button "' + buttonNumbers[property] + '" is not defined.'); } if ( (currButton[0] == 'wikEdSource') && (wikEdShowSourceButton != true) ) { break; } if ( (currButton[0] == 'wikEdUsing') && (wikEdShowUsingButton != true) ) { break; } buttons += '<img id="' + currButton[0] + '" class="' + currButton[1] + '" title="' + currButton[2] + '" src="' + currButton[3] + '" width="' + currButton[4] + '" height="' + currButton[5] + '" alt="' + currButton[6] + '" onClick="' + currButton[7] + '">'; } }

// create the button bar div

   var div = document.createElement('div');
   div.id = barId;
   div.className = barClass;
   var buttonsStyle = ;
   if (barHeight > 0) {
       buttonsStyle = ' style="height: ' + barHeight + 'px;"';
   }

// make a grip bar

   var html = ;
   if (gripTitle != null) {
       var gripStyle = 'width: ' + wikEdButtonBarGripWidth + 'px; ';
       if (barHeight > 0) {
           gripStyle += 'height: ' + barHeight + 'px; ';
       }
       if (gripStyle.length > 0){
           gripStyle = ' style="' + gripStyle + '"';
       }

html += '

'; html += '
'; html += '
';
       html += ' ';
html += '
'; html += '
'; html += '
'; html += '
';
       html += buttons;
html += '
'; html += '
'; html += '

';

   }

// make a standard no-grip bar

   else {

html += '

';
       html += buttons;
html += '

';

   }
   div.innerHTML = html;
   return(div);

}


// // WikEdButtonBarInit: hide buttons bar, see also WikEdButtonBarGripHandler() //

function WikEdButtonBarInit(bar) {

   var cookie = WikEdGetCookie(bar.id + 'Hidden');
   if (cookie != ) {
       var barInnerWrapper = bar.firstChild;
       var gripWrapper = barInnerWrapper.firstChild;
       var grip = gripWrapper.firstChild;
       var buttonsWrapper = gripWrapper.nextSibling;
       var buttons = buttonsWrapper.firstChild;
       barInnerWrapper.className = 'wikedButtonBarInnerWrapperHidden';
       gripWrapper.className = 'wikedButtonBarGripWrapperHidden';
       buttonsWrapper.className = 'wikedButtonBarButtonsWrapperHidden';
       buttonsWrapper.widthOriginal = buttonsWrapper.offsetWidth;
       buttonsWrapper.style.display = 'none';
       buttonsWrapper.minimized = true;
       grip.addEventListener('mouseover', WikEdButtonBarGripHandler, true);
   }
   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 (wikEdCloseToolbar == true) {
               wikEdToolbarWrapper.style.display = 'none';
           }
           else {
               wikEdToolbarWrapper.style.display = 'block';
           }
       }
       wikEdButtonBarFormat.style.display = 'block';
       if (wikEdButtonBarCustom1 != null) {
           wikEdButtonBarCustom1.style.display = 'block';
       }
       wikEdButtonBarFind.style.display = 'block';
       wikEdButtonBarFix.style.display = 'block';
       if (wikEdButtonBarCustom2 != null) {
           wikEdButtonBarCustom2.style.display = 'block';
       }
       wikEdButtonBarControl.style.display = 'block';
   }

// turn classic textarea on

   else {
       if (notFrame != true) {
           wikEdFrameWrapper.style.position = 'absolute';
           wikEdFrameWrapper.style.visibility = 'hidden';

// Mozilla or wikEd bug:
insertion before text a while after setting display to 'none', test with setTimeout('alert(wikEdFrameBody.innerHTML)', 1000); // wikEdFrameBody.style.display = 'none';

       }
       wikEdTextareaWrapper.style.position = 'static';
       wikEdTextareaWrapper.style.visibility = 'visible';
       wikEdTextarea.style.display = 'block';
       if (document.getElementById('toolbar') != null) {
           wikEdToolbarWrapper.style.display = 'block';
       }
       wikEdButtonBarFormat.style.display = 'none';
       if (wikEdButtonBarCustom1 != null) {
           wikEdButtonBarCustom1.style.display = 'none';
       }
       wikEdButtonBarFind.style.display = 'none';
       wikEdButtonBarFix.style.display = 'none';
       if (wikEdButtonBarCustom2 != null) {
           wikEdButtonBarCustom2.style.display = 'none';
       }
       wikEdButtonBarControl.style.display = 'block';
   }
   return;

}


// // WikEdButton: toggle or set button checked state // used for buttons that do not require nor change the text. Faster than WikEdEditButton() //

function WikEdButton(buttonObj, whichButton, toggleButton, setButton, classButton, doButton) {

   if (buttonObj != null) {

// check if the button is disabled

       if (buttonObj.className == 'wikEdButtonInactive') {
           return;
       }

// set button to pressed, set cursor to hourglass

       buttonObj.style.cursor = 'wait';

// init the button

       if (setButton != null) {
           if (setButton == false) {
               buttonObj.checked = false;
               if (classButton == null) {
                   buttonObj.className = 'wikEdButtonUnchecked';
               }
           }
           else {
               buttonObj.checked = true;
               if (classButton == null) {
                   buttonObj.className = 'wikEdButtonChecked';
               }
           }
       }
       else if (classButton != null) {
           buttonObj.className = classButton;
       }

// toggle the button

       if (toggleButton != null) {
           if (toggleButton == true) {
               if (buttonObj.checked == true) {
                   buttonObj.checked = false;
                   buttonObj.className = 'wikEdButtonUnchecked';
               }
               else {
                   buttonObj.checked = true;
                   buttonObj.className = 'wikEdButtonChecked';
               }
           }
       }
   }

// perform specific actions

   if ( ( (setButton == null) && (classButton == null) ) || (doButton == true) ) {

// remove active content

       WikEdRemoveElements(['script', 'object', 'applet', 'embed']);
       switch (whichButton) {

// switch between syntax highlighting and plain text

           case 'wikEdHighlightSyntax':
               var obj = {};
               obj.html = wikEdFrameBody.innerHTML;
               obj.html = obj.html.replace(/(<br\b[^>]*>)\n* */g, '$1');
               if (buttonObj.checked == true) {
                   WikEdRemoveHighlighting(obj);
                   wikEdHighlightSyntax = true;
                   obj.html = obj.html.replace(/<br\b[^>]*>/g, '\n');
                   WikEdHighlightSyntax(obj);
                   obj.html = obj.html.replace(/\n/g, '
'); WikEdSetCookie('wikEdSyntaxOff', , -1, '/'); } else { wikEdHighlightSyntax = false; WikEdRemoveHighlighting(obj); obj.html = obj.html.replace(/(\t)/g, '$1'); WikEdSetCookie('wikEdSyntaxOff', '1', 0, '/'); } wikEdFrameBody.innerHTML = obj.html; break;

// align textbox with display top

           case 'wikEdScrollToPreview':
           case 'wikEdScrollToPreview2':
           case 'wikEdScrollToPreview3':
               window.scroll(0, WikEdGetOffsetTop(wikEdSubmitWrapper));
               break;

// align edit buttons with display top

           case 'wikEdScrollToEdit':
           case 'wikEdScrollToEdit2':
           case 'wikEdScrollToEdit3':
           case 'wikEdScrollToEdit4':
               window.scroll(0, WikEdGetOffsetTop(wikEdInputWrapper));
               break;

// cycle through different font sizes

           case 'wikEdTextZoomDown':
               wikEdTextZoom = wikEdTextZoom / 1.2;
               if (wikEdTextZoom < 100 / 1.2 / 1.2) {
                   wikEdTextZoom = 100 * 1.2 * 1.2;
               }
               wikEdFrameBody.style.fontSize = parseInt(wikEdTextZoom) + '%;';
               break;

// cycle through different font sizes

           case 'wikEdTextZoomUp':
               wikEdTextZoom = wikEdTextZoom * 1.2;
               if (wikEdTextZoom > 100 * 1.2 * 1.2) {
                   wikEdTextZoom = 100 / 1.2 / 1.2;
               }
               wikEdFrameBody.style.fontSize = parseInt(wikEdTextZoom) + '%;';
               break;

// display local preview box

           case 'wikEdLocalPreview':
               if (wikEdFullScreenMode == true) {
                   WikEdFullScreen(false);
               }
               if (wikEdUseWikEd == true) {
                   WikEdUpdateTextarea();
               }

// scroll to edit or preview field

               if (whichButton == 'wikEdLocalPreview') {
                   window.scroll(0, WikEdGetOffsetTop(wikEdInputWrapper));
               }
               else {
                   window.scroll(0, WikEdGetOffsetTop(wikEdSubmitWrapper));
               }

// prepare a local preview (Pilaf's InstaView)

               if ( (wikEdUseLocalPreview == true) && (typeof(InstaView) == 'object') ) {
                   InstaView.conf.user.name = wgUserName;
                   wikEdPreviewBox.innerHTML = InstaView.convert(wikEdTextarea.value);
                   wikEdLocalPrevWrapper.style.display = 'block';
               }

// prepare ajax preview

               if ( (wikEdUseAjaxPreview == true) && (typeof(sajax_init_object) == 'function') ) {
                   wikEdLocalPrevWrapper.style.display = 'block';

// prepare the data

                   var boundary = '--(fR*3briuStOum6#v)--';
                   var postData = document.getElementById('wpTextbox1').value;
                   postData = '--' + boundary + '\nContent-Disposition: form-data; name="wpTextbox1"\n\n' + postData + '\n--' + boundary;

// allow ajax request from local copy for testing

                   if (wikEdAllowLocalAjax == true) {
                       if (typeof(netscape) == 'object') {
                           if (typeof(netscape) == 'object') {
                               netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
                           }
                       }
                   }

// make the ajax request

                   var ajax = WikEdAjaxInitObject();
                   if (ajax == null) {
                       break;
                   }
                   ajax.open('POST', document.editform.action + '&live', true);
                   ajax.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
                   if (ajax.overrideMimeType !=  null) {
                       ajax.overrideMimeType('text/html');
                   }
                   ajax.send(postData);

// ajax response handler function

                   ajax.onreadystatechange = function() {
                       if (ajax.readyState != 4) {
                           return;
                       }

// get response

                       var html = ajax.responseText;

// html-ize

                       html = html.replace(/</g, '<');
                       html = html.replace(/>/g, '>');
                       html = html.replace(/&/g, '&');
                       html = html.replace(/"/g, '"')
                       html = html.replace(/'/g, '\);

html = html.replace(/(<preview>)

.*?<\/h2>(.|\n)*?
(.|\n)*?<\/div>/, '$1');

// update the preview

                       wikEdPreviewBox.innerHTML = html;
                   };
               }
               break;

// display local diff box

           case 'wikEdDiffPreview':
           case 'wikEdDiffPreview2':
           case 'wikEdLocalDiff':
               if (typeof(WDiffString) != 'function') {
                   break;
               }
               if (wikEdFullScreenMode == true) {
                   WikEdFullScreen(false);
               }
               if (wikEdUseWikEd == true) {
                   WikEdUpdateTextarea();
               }

// scroll to edit or preview field

               if (whichButton == 'wikEdLocalDiff') {
                   window.scroll(0, WikEdGetOffsetTop(wikEdInputWrapper));
               }
               else {
                   window.scroll(0, WikEdGetOffsetTop(wikEdSubmitWrapper));
               }

// call external diff program

               var diffText = WDiffString(wikEdOrigVersion, wikEdTextarea.value);
               if (wikEdFullDiff != true) {
                   diffText = WDiffShortenOutput(diffText);
               }
               wikEdPreviewBox.innerHTML = diffText;
               wikEdLocalPrevWrapper.style.display = 'block';
               break;

// toggle wikEdDiff

           case 'wikEdDiff':

// turn wikEdDiff off

               if (buttonObj.checked != true) {
                   wikEdDiff = false;
                   WikEdSetCookie('wikEdDiff', , -1, '/');
                   if (typeof(wikEdDiffDiv) == 'object') {
                       wikEdDiffDiv.style.display = 'none';
                   }
                   window.scroll(0, WikEdGetOffsetTop(wikEdInputWrapper));
               }

// turn wikEdDiff on

               else {
                   wikEdDiff = true;
                   WikEdSetCookie('wikEdDiff', '1', 0, '/');
                   if (typeof(wikEdDiffDiv) == 'object') {
                       wikEdDiffDiv.style.display = 'block';
                       window.scroll(0, WikEdGetOffsetTop(wikEdDiffDiv));
                       WikEdDiff();
                   }
               }
               break;

// close the preview / diff box

           case 'wikEdClose':
           case 'wikEdClose2':
               window.scroll(0, WikEdGetOffsetTop(wikEdInputWrapper));
               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;
                   WikEdSetCookie('wikEdUseClassic', , -1, '/');
               }

// turn classic textarea on, disable wikEd

               else {
                   WikEdUpdateTextarea();
                   WikEdSetEditArea(false);
                   wikEdUseWikEd = false;
                   WikEdSetCookie('wikEdUseClassic', '1', 0, '/');
               }
               break;

// add "using wikEd" to summaries

           case 'wikEdUsing':
               if (buttonObj.checked == true) {
                   wikEdUsing = true;
                   WikEdSetCookie('wikEdSummaryUsing', '1', 0, '/');
               }
               else {
                   wikEdUsing = false;
                   WikEdSetCookie('wikEdSummaryUsing', , -1, '/');
               }
               break;

// hide ref tags

           case 'wikEdRefHide':
               if (buttonObj.checked == true) {
                   wikEdRefHide = true;
                   WikEdSetCookie('wikEdRefHide', '1', 0, '/');
               }
               else {
                   wikEdRefHide = false;
                   WikEdSetCookie('wikEdRefHide', , -1, '/');
               }
               if (wikEdUseWikEd == true) {
                   WikEdEditButton(null, 'wikEdWikify', 'whole');
               }
               break;

// close the toolbar

           case 'wikEdCloseToolbar':
               if (buttonObj.checked == true) {
                   wikEdCloseToolbar = true;
                   if (document.getElementById('toolbar') != null) {
                       wikEdToolbarWrapper.style.display = 'none';
                   }
                   WikEdSetCookie('wikEdCloseToolbar', '1', 0, '/');
               }
               else {
                   wikEdCloseToolbar = false;
                   if (document.getElementById('toolbar') != null) {
                       wikEdToolbarWrapper.style.display = 'block';
                   }
                   WikEdSetCookie('wikEdCloseToolbar', , -1, '/');
               }
               if (wikEdFullScreenMode == true) {
                   WikEdFullScreen(wikEdFullScreenMode);
               }
               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', '1', 0, '/');
               }
               else {
                   WikEdFullScreen(false);
                   WikEdSetCookie('wikEdFullscreen', , -1, '/');
               }
               break;

// clear the cookies for find, replace, and summary history

           case 'wikEdClearHistory':
               WikEdClearHistory('find');
               WikEdClearHistory('replace');
               WikEdClearHistory('summary');
               break;

// for testing

           case 'wikEdPlaceholder':
               break;
       }
   }

// reset the frame DOM cache because the frame content might have changed

   wikEdFrameDOMCache = null;

// reset cursor to normal

   if (buttonObj != null) {
       buttonObj.style.cursor = 'pointer';
   }
   return;

}


// // WikEdEditButton: editing functions // used for buttons that require or change the text, more time consuming than WikEdButton() //

function WikEdEditButton(buttonObj, whichButton, parameters, CustomHandler) {

// check if button is disabled

   if (buttonObj != null) {
       if (buttonObj.className == 'wikEdButtonInactive') {
           return;
       }
   }

// remove active and non-text content

   WikEdRemoveElements(['script', 'object', 'applet', 'embed', 'textarea']);

// select the appropriate text change targets (whole, selection, cursor, focusWord, focusLine, selectionWord, or selectionLine)

   var obj = {};
   obj.changed = {};
   switch (whichButton) {

// undo, redo: whole

       case 'wikEdUndo':
       case 'wikEdRedo':
       case 'wikEdUndoAll':
       case 'wikEdRedoAll':
           WikEdGetText(obj, 'whole');
           obj.changed = obj.whole;
           break;

// basic wiki character formatting: selection / focusWord / cursor

       case 'wikEdBold':
       case 'wikEdItalic':
       case 'wikEdUnderline':
       case 'wikEdStrikethrough':
       case 'wikEdNowiki':
       case 'wikEdSuperscript':
       case 'wikEdSubscript':
       case 'wikEdWikiLink':
       case 'wikEdWebLink':
           WikEdGetText(obj, 'selection, cursor');
           if (obj.selection.plain != ) {
               obj.changed = obj.selection;
           }
           else {
               WikEdGetText(obj, 'focusWord');
               if (obj.focusWord.plain != ) {
                   obj.changed = obj.focusWord;
               }
               else  {
                   obj.changed = obj.cursor;
               }
           }
           break;

// reference: selection / cursor

       case 'wikEdRef':
           WikEdGetText(obj, 'selection, cursor');
           if (obj.selection.plain != ) {
               obj.changed = obj.selection;
           }
           else {
               obj.changed = obj.cursor;
           }
           break;

// references and small references: selection / cursor

       case 'wikEdReferences':
       case 'wikEdReferencesSection':
           WikEdGetText(obj, 'selection, cursor');
           if (obj.selection.plain != ) {
               obj.changed = obj.selection;
           }
           else {
               obj.changed = obj.cursor;
           }
           break;

// character formatting: selection / focusWord / cursor

       case 'wikEdCase':
           WikEdGetText(obj, 'selection, cursor');
           if (obj.selection.plain != ) {
               obj.changed = obj.selection;
           }
           else {
               WikEdGetText(obj, 'focusWord');
               if (obj.focusWord.plain != ) {
                   obj.changed = obj.focusWord;
               }
               else {
                   obj.changed = obj.cursor;
               }
           }
           break;

// multiple line changes: selectionLine / focusLine / cursor

       case 'wikEdDecreaseHeading':
       case 'wikEdIncreaseHeading':
       case 'wikEdIncreaseBulletList':
       case 'wikEdDecreaseBulletList':
       case 'wikEdIncreaseNumberList':
       case 'wikEdDecreaseNumberList':
       case 'wikEdIncreaseIndentList':
       case 'wikEdDecreaseIndentList':
       case 'wikEdDefinitionList':
           WikEdGetText(obj, 'selection, cursor');
           if (obj.selection.plain != ) {
               WikEdGetText(obj, 'selectionLine');
               obj.changed = obj.selectionLine;
           }
           else {
               WikEdGetText(obj, 'focusLine');
               if (obj.focusLine.plain != ) {
                   obj.changed = obj.focusLine;
               }
               else {
                   obj.changed = obj.cursor;
               }
           }
           break;

// image: selectionWord (if text is selected) / cursor

       case 'wikEdImage':
           WikEdGetText(obj, 'selection, cursor');
           if (obj.selection.plain != ) {
               WikEdGetText(obj, 'selectionWord');
               obj.changed = obj.selectionWord;
           }
           else  {
               obj.changed = obj.cursor;
           }
           break;

// table: selectionLine / cursor

       case 'wikEdTable':
           WikEdGetText(obj, 'selection, cursor');
           if (obj.selection.plain != ) {
               WikEdGetText(obj, 'selectionLine');
               obj.changed = obj.selectionLine;
           }
           else  {
               WikEdGetText(obj, 'focusLine');
               obj.changed = obj.cursor;
           }
           break;

// wikify: selection / whole

       case 'wikEdWikify':
           if (parameters == 'whole') {
               WikEdGetText(obj, 'whole');
               obj.changed = obj.whole;
           }
           else {
               WikEdGetText(obj, 'selection');
               if (obj.selection.plain != ) {
                   obj.changed = obj.selection;
               }
               else {
                   WikEdGetText(obj, 'whole');
                   obj.changed = obj.whole;
               }
           }
           break;

// textify: selection / whole, without wikifying

       case 'wikEdTextify':
           WikEdGetText(obj, 'selection', true);
           if (obj.selection.plain != ) {
               obj.changed = obj.selection;
           }
           else {
               WikEdGetText(obj, 'whole', true);
               obj.changed = obj.whole;
           }
           break;

// redirect: whole

       case 'wikEdRedirect':
           WikEdGetText(obj, 'whole, selection, cursor');
           if (obj.selection.plain == ) {
               WikEdGetText(obj, 'selectionWord');
           }
           obj.changed = obj.whole;
           break;

// find and replace: selection / focusWord / cursor

       case 'wikEdFindPrev':
       case 'wikEdFindNext':
       case 'wikEdJumpPrev':
       case 'wikEdJumpNext':
       case 'wikEdReplacePrev':
       case 'wikEdReplaceNext':
       case 'wikEdFindAll':
           WikEdGetText(obj, 'selection');
           if (obj.selection.plain != ) {
               obj.changed = obj.selection;
           }
           else {
               WikEdGetText(obj, 'focusWord');
               if (obj.focusWord.plain != ) {
                   obj.changed = obj.focusWord;
               }
               else {
                   obj.changed = obj.cursor;
               }
           }
           break;

// replace all: selection / whole

       case 'wikEdReplaceAll':
           WikEdGetText(obj, 'selection');
           if (obj.selection.plain != ) {
               obj.changed = obj.selection;
           }
           else {
               WikEdGetText(obj, 'whole');
               obj.changed = obj.whole;
           }
           break;

// fixing buttons: selection / whole

       case 'wikEdFixBasic':
       case 'wikEdfixUnicode':
       case 'wikEdFixAll':
       case 'wikEdFixHtml':
       case 'wikEdFixRegExTypo':
           WikEdGetText(obj, 'selection');
           if (obj.selection.plain != ) {
               obj.changed = obj.selection;
           }
           else {
               WikEdGetText(obj, 'whole');
               obj.changed = obj.whole
           }
           break;

// fixing buttons: selection / focusLine / cursor

       case 'wikEdFixPunct':
       case 'wikEdFixMath':
       case 'wikEdFixUnits':
       case 'wikEdFixDashes':
       case 'wikEdFixCaps':
       case 'wikEdFixChem':
           WikEdGetText(obj, 'selection, cursor');
           if (obj.selection.plain != ) {
               obj.changed = obj.selection;
           }
           else {
               WikEdGetText(obj, 'focusLine');
               if (obj.focusLine.plain != ) {
                   obj.changed = obj.focusLine;
               }
               else {
                   obj.changed = obj.cursor;
               }
           }
           break;

// fixing buttons: selection / focusWord / cursor

           WikEdGetText(obj, 'selection, cursor');
           if (obj.selection.plain != ) {
               obj.changed = obj.selection;
           }
           else {
               WikEdGetText(obj, 'focusWord');
               if (obj.focusWord.plain != ) {
                   obj.changed = obj.focusWord;
               }
               else {
                   obj.changed = obj.cursor;
               }
           }
           break;

// source: selection / whole

       case 'wikEdSource':
           WikEdGetText(obj, 'selection');
           if (obj.selection.plain != ) {
               obj.changed = obj.selection;
           }
           else {
               WikEdGetText(obj, 'whole');
               obj.changed = obj.whole;
           }
           break;

// insert tags: selection / focusWord / cursor

       case 'wikEdInsertTags':
           WikEdGetText(obj, 'selection, cursor');
           if (obj.selection.plain != ) {
               obj.changed = obj.selection;
           }
           else {
               WikEdGetText(obj, 'focusWord');
               if (obj.focusWord.plain != ) {
                   obj.changed = obj.focusWord;
               }
               else {
                   obj.changed = obj.selection;
               }
           }
           break;

// custom edit functions have to call WikEdGetText() themselves

       default:
           WikEdGetText(obj, 'cursor');
           obj.changed = obj.cursor;
           break;
   }

// exit

   if (obj.changed == null) {
       wikEdFrameWindow.focus();

// reset button to active, reset cursor

       if (buttonObj != null) {
           if (buttonObj.className != 'wikEdButtonInactive') {
               buttonObj.className = 'wikEdButton';
           }
       }
       return;
   }

// set local syntax highlighting flag

   var highlightSyntax = wikEdHighlightSyntax;

// manipulate the text

   var selectChange = true;
   switch (whichButton) {

// undo

       case 'wikEdUndo':
           if (wikEdLastVersion == null) {
               wikEdLastVersion = obj.changed.plain;
           }
           WikEdFrameExecCommand('undo');
           obj.changed.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1);
           obj.changed.plain = null;
           obj.changed.keepSel = true;
           break;

// redo

       case 'wikEdRedo':
           WikEdFrameExecCommand('redo');
           obj.changed.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1);
           obj.changed.plain = null;
           obj.changed.keepSel = true;
           break;

// bold

       case 'wikEdBold':
           if ( /\'\'\'([^\'].*?)\'\'\'/.test(obj.changed.plain) ) {
               obj.changed.plain = obj.changed.plain.replace(/\'\'\'([^\'].*?)\'\'\'/g, '$1');
           }
           else {
               obj.changed.plain = '\'\'\ + obj.changed.plain + '\'\'\;
               obj.changed.plain = obj.changed.plain.replace(/(\'\'\')( *)(.*?)( *)(\'\'\')/, '$2$1$3$5$4');
           }
           obj.changed.plain = obj.changed.plain.replace(/\'{6,}/g, '\'\'\'\'\);
           obj.changed.keepSel = true;
           break;

// italic

       case 'wikEdItalic':
           if ( /(\'{3,})\'\'([^\'].*?)\'\'(\'{3,})/.test(obj.changed.plain) ) {
               obj.changed.plain = obj.changed.plain.replace(/(\'{3,})\'\'([^\'].*?)\'\'(\'{3,})/g, '$1$2$3');
           }
           else if ( /(^|[^\'])\'\'([^\'].*?)\'\'([^\']|$)/.test(obj.changed.plain) ) {
               obj.changed.plain = obj.changed.plain.replace(/(^|[^\'])\'\'([^\'].*?)\'\'([^\']|$)/g, '$1$2$3');
           }
           else {
               obj.changed.plain = '\'\ + obj.changed.plain + '\'\;
               obj.changed.plain = obj.changed.plain.replace(/(\'\')( *)(.*?)( *)(\'\')/, '$2$1$3$5$4');
           }
           obj.changed.plain = obj.changed.plain.replace(/\'{6,}/g, '\'\'\'\'\);
           obj.changed.keepSel = true;
           break;

// underline

       case 'wikEdUnderline':
           if ( /<u>(.*?)<\/u>/i.test(obj.changed.plain) ) {
               obj.changed.plain = obj.changed.plain.replace(/<u>(.*?)<\/u>/gi, '$1');
           }
           else {
               obj.changed.plain = '<u>' + obj.changed.plain + '<\/u>';
               obj.changed.plain = obj.changed.plain.replace(/(<u>)( *)(.*?)( *)(<\/u>)/, '$2$1$3$5$4');
           }
           obj.changed.keepSel = true;
           break;

// strikethrough

       case 'wikEdStrikethrough':
           if ( /<s>(.*?)<\/s>/i.test(obj.changed.plain) ) {
               obj.changed.plain = obj.changed.plain.replace(/<s>(.*?)<\/s>/gi, '$1');
           }
           else {
               obj.changed.plain = '<s>' + obj.changed.plain + '<\/s>';
               obj.changed.plain = obj.changed.plain.replace(/(<s>)( *)(.*?)( *)(<\/s>)/, '$2$1$3$5$4');
           }
           obj.changed.keepSel = true;
           break;

// nowiki

       case 'wikEdNowiki':
           if ( /<nowiki>(.*?)<\/nowiki>/i.test(obj.changed.plain) ) {
               obj.changed.plain = obj.changed.plain.replace(/<nowiki>(.*?)<\/nowiki>/gi, '$1');
           }
           else {
               obj.changed.plain = '<nowiki>' + obj.changed.plain + '<\/nowiki>';
               obj.changed.plain = obj.changed.plain.replace(/(<nowiki>)( *)(.*?)( *)(<\/nowiki>)/, '$2$1$3$5$4');
           }
           obj.changed.keepSel = true;
           break;

// superscript

       case 'wikEdSuperscript':
           if ( /<sup>(.*?)<\/sup>/i.test(obj.changed.plain) ) {
               obj.changed.plain = obj.changed.plain.replace(/<sup>(.*?)<\/sup>/gi, '$1');
           }
           else {
               obj.changed.plain = '<sup>' + obj.changed.plain + '</sup>';
               obj.changed.plain = obj.changed.plain.replace(/(<sup>)( *)(.*?)( *)(<\/sup>)/, '$2$1$3$5$4');
           }
           obj.changed.keepSel = true;
           break;

// subscript

       case 'wikEdSubscript':
           if ( /<sub>(.*?)<\/sub>/i.test(obj.changed.plain) ) {
               obj.changed.plain = obj.changed.plain.replace(/<sub>(.*?)<\/sub>/gi, '$1');
           }
           else {
               obj.changed.plain = '<sub>' + obj.changed.plain + '</sub>';
               obj.changed.plain = obj.changed.plain.replace(/(<sub>)( *)(.*?)( *)(<\/sub>)/, '$2$1$3$5$4');
           }
           obj.changed.keepSel = true;
           break;

// in-text reference

       case 'wikEdRef':
           if (obj.changed.plain == ) {
               obj.changed.plain = '<ref name=\"\"/>';
           }
           else if ( /<ref name=\"\" ?\/>/i.test(obj.changed.plain) ) {
               obj.changed.plain = ;
           }
           else if ( /<ref( name=\"\")?>(.*?)<\/ref>/i.test(obj.changed.plain) ) {
               obj.changed.plain = obj.changed.plain.replace(/<ref( name=\"\")?>(.*?)<\/ref>/gi, '$2');
           }
           else {
               obj.changed.plain = '<ref name=\"\">' + obj.changed.plain + '</ref>';
               obj.changed.plain = obj.changed.plain.replace(/(<ref name=\"\">)( *)(.*?)( *)(<\/ref>)/, '$2$1$3$5$4');
           }
           obj.changed.keepSel = true;
           break;

// references location

       case 'wikEdReferences':
       case 'wikEdReferencesSection':
           var ref = wikEdText['wikEdReferencesSection'];
           ref = ref.replace(/</g, '<');
           ref = ref.replace(/>/g, '>');
           var refEscaped = ref;
           refEscaped = refEscaped.replace(/([^\w\s\;\&])/g, '\\$1');
           refEscaped = refEscaped.replace(/^\n|\n$/g, '\\n*');
           refEscaped = refEscaped.replace(/(\n)/g, '\\n');
           var    regExp = new RegExp(refEscaped, 'gi');

// plain references tag

           if (whichButton == 'wikEdReferences') {
               if (obj.changed.plain == ) {
                   obj.changed.plain = '<references/>';
               }
               else if (regExp.test(obj.changed.plain)) {
                   obj.changed.plain = obj.changed.plain.replace(regExp, );
               }
               else if ( /<references ?\/>/i.test(obj.changed.plain) ) {
                   obj.changed.plain = obj.changed.plain.replace(/<references ?\/>/gi, );
               }
               else {
                   obj.changed = obj.cursor;
                   obj.changed.plain = '<references/>';
               }
           }

// complete references code

           else {
               if (obj.changed.plain == ) {
                   obj.changed.plain = ref;
               }
               else if (regExp.test(obj.changed.plain)) {
                   obj.changed.plain = obj.changed.plain.replace(regExp, );
               }
               else if ( /<references ?\/>/i.test(obj.changed.plain) ) {
                   obj.changed.plain = obj.changed.plain.replace(/<references ?\/>/gi, );
               }
               else {
                   obj.changed = obj.cursor;
                   obj.changed.plain = ref;
               }
           }
           obj.changed.keepSel = true;
           break;

// toggle lowercase / uppercase

       case 'wikEdCase':

// lowercase all uppercased text

           if (obj.changed.plain == ) {
               obj.changed.plain = null;
           }
           else {
               if (obj.changed.plain.toUpperCase() == obj.changed.plain) {
                   obj.changed.plain = obj.changed.plain.toLowerCase();
               }

// first-letter-uppercase all lowercased text

               else if (obj.changed.plain.toLowerCase() == obj.changed.plain) {
                   obj.changed.plain = obj.changed.plain.replace(/\b([\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9])([\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]*)/g,
                       function (p, p1, p2) {
                           return(p1.toUpperCase() + p2.toLowerCase());
                       }
                   );
               }

// uppercase mixed upper and lowercased text

               else {
                   obj.changed.plain = obj.changed.plain.toUpperCase();
               }
           }
           obj.changed.keepSel = true;
           break;

// undo all

       case 'wikEdUndoAll':
           if (wikEdLastVersion == null) {
               wikEdLastVersion = obj.changed.plain;
           }
           obj.changed.plain = wikEdOrigVersion;
           obj.changed.plain = obj.changed.plain.replace(/&/g, '&');
           obj.changed.plain = obj.changed.plain.replace(/>/g, '>');
           obj.changed.plain = obj.changed.plain.replace(/</g, '<');
           break;

// redo all

       case 'wikEdRedoAll':
           if (wikEdLastVersion != null) {
               obj.changed.plain = wikEdLastVersion;
           }
           break;

// create wikilink

       case 'wikEdWikiLink':
           if ( /\[\[(.*?)\]\]/.test(obj.changed.plain) ) {
               obj.changed.plain = obj.changed.plain.replace(/\[\[(.*?)\]\]/g, '$1');
           }
           else {
               obj.changed.plain = '\[\[' + obj.changed.plain + '\]\]';
               obj.changed.plain = obj.changed.plain.replace(/(\[\[)( *)(.*?)( *)(\]\])/, '$2$1$3$5$4');
           }
           obj.changed.keepSel = true;
           break;

// create weblink

       case 'wikEdWebLink':
           if ( /\[(.*?)\]/.test(obj.changed.plain) ) {
               obj.changed.plain = obj.changed.plain.replace(/\[(.*?)\]/g, '$1');
           }
           else {
               obj.changed.plain = '\[' + obj.changed.plain + '\]';
               obj.changed.plain = obj.changed.plain.replace(/(\[)( *)(.*?)( *)(\])/, '$2$1$3$5$4');
           }
           obj.changed.keepSel = true;
           break;

// decrease heading level

       case 'wikEdDecreaseHeading':

// decrease heading

           obj.changed.plain = obj.changed.plain.replace(/(^|\n)=(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1$2 $3 $2');

// remove heading

           obj.changed.plain = obj.changed.plain.replace(/(^|\n)=(?!=) *([^\n]*?) *=+(?=\n|$)/g, '$1$2');

// adjust closing tags

           obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1$2 $3 $2');
           obj.changed.keepSel = true;
           break;

// increase heading level

       case 'wikEdIncreaseHeading':

// increase heading

           obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1=$2 $3 $2=');

// create new heading

           if (/\n/.test(obj.changed.plain) == false) {
               obj.changed.plain = obj.changed.plain.replace(/(^|\n)([^=\n\s][^\n]*?)(?=\n|$)/g, '$1== $2 ==');
           }

// adjust closing tags

           obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1$2 $3 $2');
           obj.changed.keepSel = true;
           break;

// increase bullet list

       case 'wikEdIncreaseBulletList':
           obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g,
               function (p, p1) {
                   p1 = p1.replace(/^ *([\*\#\:\;]*) */g, '*$1 ');
                   return(p1);
               }
           );
           obj.changed.keepSel = true;
           break;

// decrease bullet list

       case 'wikEdDecreaseBulletList':
           obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g,
               function (p, p1) {
                   p1 = p1.replace(/^\* */g, );
                   return(p1);
               }
           );
           obj.changed.keepSel = true;
           break;

// increase numbered list

       case 'wikEdIncreaseNumberList':
           obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g,
               function (p, p1) {
                   p1 = p1.replace(/^ *([\*\#\:\;]*) */g, '#$1 ');
                   return(p1);
               }
           );
           obj.changed.keepSel = true;
           break;

// decrease numbered list

       case 'wikEdDecreaseNumberList':
           obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g,
               function (p, p1) {
                   p1 = p1.replace(/^\# */g, );
                   return(p1);
               }
           );
           obj.changed.keepSel = true;
           break;

// increase indented list

       case 'wikEdIncreaseIndentList':
           obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g,
               function (p, p1) {
                   p1 = p1.replace(/^ *([\*\#\:\;]*) */g, ':$1 ');
                   return(p1);
               }
           );
           obj.changed.keepSel = true;
           break;

// decrease indented list

       case 'wikEdDecreaseIndentList':
           obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g,
               function (p, p1) {
                   p1 = p1.replace(/^\# */g, );
                   return(p1);
               }
           );
           obj.changed.keepSel = true;
           break;

// create definition list

       case 'wikEdDefinitionList':
           obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g,
               function (p, p1) {
                   p1 = p1.replace(/^ *([^\s\;]+) */g, '; $1 : ');
                   return(p1);
               }
           );
           break;

// create image

       case 'wikEdImage':
           if (obj.changed.plain != ) {
               obj.changed.plain = '[[Image:' + wikEdText['image filename'] + '|thumb|' + wikEdText['image width'] + 'px|' + obj.changed.plain + ']]';
           }
           else {
               obj.changed.plain = '[[Image:' + wikEdText['image filename'] + '|thumb|' + wikEdText['image width'] + 'px| ]]';
               if (obj.focusWord != null) {
                   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|+ ' + wikEdText['table caption'] + '\n! ' + wikEdText['table heading'] + ' !! ' + wikEdText['table heading'] + '\n|-\n| ' + wikEdText['table cell'] + ' || ' + wikEdText['table cell'] + '\n|-\n| ' + wikEdText['table cell'] + ' || ' + wikEdText['table cell'] + '\n|}\n';
               if (obj.focusLine.plain != ) {
                   obj.changed.plain = '\n' + obj.changed.plain + '\n';
               }
           }
           break;

// wikify: always done above

       case 'wikEdWikify':
           break;

// textify: strip html from pasted content

       case 'wikEdTextify':
           WikEdTextify(obj.changed);
           break;

// get inner html without wikifying

           if (obj.selection.plain != ) {
               obj.selection.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1);
               var documentFragment = obj.selection.range.cloneContents();
               WikEdGetInnerHTML(objTextify, documentFragment);
           }
           else {
               obj.changed.from = 'whole';
               obj.changed.range.setStartBefore(wikEdFrameBody.firstChild);
               obj.changed.range.setEndAfter(wikEdFrameBody.lastChild);
               WikEdGetInnerHTML(objTextify, wikEdFrameBody);
           }
           break;

// redirect

       case 'wikEdRedirect':
           var linkTarget;
           if (obj.selection.plain != ) {
               linkTarget = obj.selection.plain;
           }
           else if (obj.selectionWord.plain != ) {
               linkTarget = obj.selectionWord.plain;
           }
           else {
               linkTarget = '' + wikEdText['redirect article link'] + '';
           }

// remove leading and trailing spaces

           linkTarget = linkTarget.replace(/^\s+|\s+$/g, );

// remove link text

           linkTarget = linkTarget.replace(/\|.*?(\]|$)/g, '$1');

// remove square brackets

           linkTarget = linkTarget.replace(/\[|\]/g, );

// remove link leftovers

           linkTarget = linkTarget.replace(/ +\| +/g, ' ');
           obj.changed.plain = '#redirect ' + linkTarget + '';

// append to summary

           if ( (obj.selection.plain != ) || (obj.selectionWord.plain != ) ) {
               wikEdInputElement['summary'].value = wikEdInputElement['summary'].value.replace(/#redirect( \[\^\*\]\])?(, *)?/g, );
               wikEdInputElement['summary'].value = WikEdAppendToSummary(wikEdInputElement['summary'].value, '#redirect ' + linkTarget + '');
           }
           else {
               wikEdInputElement['summary'].value = WikEdAppendToSummary(wikEdInputElement['summary'].value, '#redirect');
           }
           selectChange = false;
           break;

// find and replace

       case 'wikEdFindPrev':
       case 'wikEdFindNext':
       case 'wikEdJumpPrev':
       case 'wikEdJumpNext':
       case 'wikEdReplacePrev':
       case 'wikEdReplaceNext':
       case 'wikEdFindAll':
       case 'wikEdReplaceAll':

// get the find text

           var findText;

// unescape <, >, and &

           obj.changed.plain = obj.changed.plain.replace(/</g, '<');
           obj.changed.plain = obj.changed.plain.replace(/>/g, '>');
           obj.changed.plain = obj.changed.plain.replace(/&/g, '&');

// copy selection/word under cursor to find field

           if ( (parameters == 'shift') && ( (whichButton == 'wikEdFindNext') || (whichButton == 'wikEdReplaceNext') ) ) {
               if (/\n/.test(obj.changed.plain) == false) {
                   if (whichButton == 'wikEdFindNext') {
                       wikEdInputElement['find'].value = obj.changed.plain;
                   }
                   else {
                       wikEdInputElement['replace'].value = obj.changed.plain;
                   }
                   obj.changed.keepSel = true;
                   obj.changed.plain = null;
                   break;
               }
           }

// get the find text from the find field

           if ( (whichButton == 'wikEdJumpPrev') || (whichButton == 'wikEdJumpNext') ) {
               findText = obj.changed.plain;
               if (obj.selection.plain == ) {
                   obj.changed.keepSel = true;
                   obj.changed.plain = null;
                   break;
               }
           }

// get the find text from the find field

           else {
               if (wikEdInputElement['find'].value != ) {
                   findText = wikEdInputElement['find'].value;
               }
               else {
                   obj.changed.plain = null;
                   break;
               }
           }

// handle newlines and special blanks for built-in search

           if (wikEdRegExp.checked == false) {
               findText = findText.replace(/\n/g, );
               findText = findText.replace(/\s/g, ' ');
           }

// get the replace text

           var replaceText = wikEdInputElement['replace'].value;
           var regExpFind;

// set regexp flags

           var regExpFlags = 'g';
           if (wikEdCaseSensitive.checked == false) {
               regExpFlags += 'i';
           }

// format the find and replace texts for a plain text search

           if ( (wikEdRegExp.checked == false) || (whichButton == 'wikEdJumpPrev') || (whichButton == 'wikEdJumpNext') ) {
               regExpFind = new RegExp(findText.replace(/([\\^\$\*\+\?\.\(\)\[\]\{\}\:\=\!\|\,\-])/g, '\\$1'), regExpFlags);
           }

// format the find and replace texts for a regular expression search

           else {
               regExpFind = new RegExp(findText, regExpFlags);
               replaceText = replaceText.replace(/((^|[^\\])(\\\\)*)\\n/g, '$1\n');
           }

// replace all

           var replacedFlag = false;
           if (whichButton == 'wikEdReplaceAll') {
               if (regExpFind.test(obj.changed.plain)) {
                   obj.changed.plain = obj.changed.plain.replace(regExpFind, replaceText);
                   replacedFlag = true;
               }
               else {
                   obj.changed.plain = null;
               }
           }

// replace an existing selection

           else if ( (whichButton == 'wikEdReplacePrev') || (whichButton == 'wikEdReplaceNext') ) {
               if (regExpFind.test(obj.selection.plain)) {
                   var replaced = obj.selection.plain.replace(regExpFind, replaceText);
                   if (obj.changed.plain != replaced) {
                       obj.changed.plain = replaced;
                       replacedFlag = true;
                   }
                   else {
                       obj.changed.plain = null;
                   }
               }
               else {
                   obj.changed.plain = null;
               }
           }
           else if (
               (whichButton == 'wikEdFindNext') || (whichButton == 'wikEdFindPrev') ||
               (whichButton == 'wikEdJumpNext') || (whichButton == 'wikEdJumpPrev')
           ) {
               obj.changed.plain = null;
           }
           if (
               (whichButton == 'wikEdFindNext') || (whichButton == 'wikEdFindPrev') ||
               (whichButton == 'wikEdJumpNext') || (whichButton == 'wikEdJumpPrev') ||
               (whichButton == 'wikEdReplaceNext') || (whichButton == 'wikEdReplacePrev') ||
               (whichButton == 'wikEdFindAll')
           ) {
               if (replacedFlag == false) {

// get direction

                   var backwards = false;
                   if ( (whichButton == 'wikEdFindPrev') || (whichButton == 'wikEdJumpPrev') || (whichButton == 'wikEdReplacePrev') ) {
                       backwards = true;
                   }

// get case sensitive

                   var caseSensitive = false;
                   if (wikEdCaseSensitive.checked == true) {
                       caseSensitive = true;
                   }

// find all

                   if (whichButton == 'wikEdFindAll') {
                       var found;
                       var foundRanges = [];

// start at top of text

                       obj.sel.removeAllRanges();
                       var range = document.createRange();
                       range.setStartBefore(wikEdFrameBody.firstChild);
                       range.collapse(true);
                       range = obj.sel.addRange(range);

// cycle through matches

                       var scrollTop = wikEdFrameBody.scrollTop;
                       do {

// use regexp seach

                           if (wikEdRegExp.checked == true) {
                               found = WikEdFind(obj, findText, caseSensitive, false, false, regExpFind);
                           }

// use built-in sarch

                           else {
                               found = WikEdFind(obj, findText, caseSensitive, false, false, null);
                           }
                           if (found == true) {
                               foundRanges.push(obj.changed.range.cloneRange());
                           }
                       } while (found == true);

// scroll back

                       if (wikEdRegExp.checked == false) {
                           wikEdFrameBody.scrollTop = scrollTop;
                       }

// add the found ranges

                       obj.sel.removeAllRanges();
                       for (range in foundRanges) {
                           obj.sel.addRange(foundRanges[range]);
                       }
                       obj.changed.plain = null;
                   }

// normal find

                   else {
                       if (wikEdRegExp.checked) {
                           WikEdFind(obj, findText, caseSensitive, backwards, true, regExpFind);
                       }
                       else {
                           WikEdFind(obj, findText, caseSensitive, backwards, true, null);
                           selectChange = false;
                       }
                   }
               }
           }

// escape <, >, and &

           if (obj.changed.plain != null) {
               obj.changed.plain = obj.changed.plain.replace(/&/g, '&');
               obj.changed.plain = obj.changed.plain.replace(/</g, '<');
               obj.changed.plain = obj.changed.plain.replace(/>/g, '>');
           }

// save search history to cookie

           if ( (whichButton == 'wikEdFindPrev') || (whichButton == 'wikEdFindNext') || (whichButton == 'wikEdFindAll') ) {
               WikEdAddToHistory('find');
           }
           if ( (whichButton == 'wikEdReplacePrev') || (whichButton == 'wikEdReplaceNext') || (whichButton == 'wikEdReplaceAll') ) {
               WikEdAddToHistory('find');
               WikEdAddToHistory('replace');
           }
           obj.changed.keepSel = true;
           break;

// fixbasic: fix characters, spaces, empty lines, certain headings, needed for all fixing functions // to do: only certain changes in multiline tags: comments, tables, subst

       case 'wikEdFixBasic':
           WikEdFixBasic(obj.changed);
           obj.changed.keepSel = true;
           break;
       case 'wikEdFixPunct':
           WikEdFixPunct(obj.changed);
           obj.changed.keepSel = true;
           break;
       case 'wikEdFixMath':
           WikEdFixMath(obj.changed);
           obj.changed.keepSel = true;
           break;
       case 'wikEdFixChem':
           WikEdFixChem(obj.changed);
           obj.changed.keepSel = true;
           break;
       case 'wikEdfixUnicode':
           WikEdFixUnicode(obj.changed);
           obj.changed.keepSel = true;
           break;
       case 'wikEdFixUnits':
           WikEdFixUnits(obj.changed);
           obj.changed.keepSel = true;
           break;
       case 'wikEdFixDashes':
           WikEdFixDashes(obj.changed);
           obj.changed.keepSel = true;
           break;
       case 'wikEdFixHtml':
           WikEdFixHTML(obj.changed);
           obj.changed.keepSel = true;
           break;
       case 'wikEdFixRegExTypo':
           if (typeof(AWRegExTypoFix) == 'function') {
               var objFix = {}
               objFix.str = obj.changed.plain;
               AWRegExTypoFix(objFix);
               obj.changed.plain = objFix.str;
           }
           else {
               obj.changed.plain = null;
           }
           obj.changed.keepSel = true;
           break;
       case 'wikEdFixCaps':
           WikEdFixCaps(obj.changed);
           obj.changed.keepSel = true;
           break;
       case 'wikEdFixAll':
           WikEdFixAll(obj.changed);
           obj.changed.keepSel = true;
           break;

// source on

       case 'wikEdSource':
           obj.changed.plain = obj.changed.code;
           obj.changed.plain = obj.changed.plain.replace(/(<(br|p)\b[^>]*>)/g, '$1\n');
           obj.changed.plain = obj.changed.plain.replace(/&/g, '&');
           obj.changed.plain = obj.changed.plain.replace(/</g, '<');
           obj.changed.plain = obj.changed.plain.replace(/>/g, '>');
           highlightSyntax = false;
           break;

// insert tags

       case 'wikEdInsertTags':
           var tagOpen = parameters[0] || ;
           var tagClose = parameters[1] || ;
           var sampleText = parameters[2] || ;
           tagOpen = tagOpen.replace(/&/g, '&');
           tagOpen = tagOpen.replace(/</g, '<');
           tagOpen = tagOpen.replace(/>/g, '>');
           tagClose = tagClose.replace(/&/g, '&');
           tagClose = tagClose.replace(/</g, '<');
           tagClose = tagClose.replace(/>/g, '>');
           tagsampleText = sampleText.replace(/&/g, '&');
           tagsampleText = sampleText.replace(/</g, '<');
           tagsampleText = sampleText.replace(/>/g, '>');

// single string to insert

           if ( (tagOpen.length > 0) && (tagClose.length == 0) && (sampleText.length == 0) ) {
               obj.changed = obj.cursor;
               obj.changed.plain = tagOpen;
           }

// opening and closing strings

           else if ( (obj.changed.plain == ) && (sampleText.length > 0) ) {
               obj.changed.plain = tagOpen + sampleText + tagClose;
           }
           else {
               obj.changed.plain = tagOpen + obj.changed.plain + tagClose;
           }
           break;

// custom edit functions

       default:
           if (CustomHandler != null) {
               CustomHandler(obj);
           }
           else {
               alert('Unknown edit function \ + whichButton + '\);
           }
           break;
   }

// update the selection only, do not change the text

   if (obj.changed.plain == null) {
       if (whichButton != 'wikEdFindAll') {
           obj.sel.removeAllRanges();
           obj.sel.addRange(obj.changed.range);

// scroll the selected text into the viewport by using a backwards find

           if (selectChange != false) {

// get the plain text of the selection

               var plainText = obj.sel.getRangeAt(obj.sel.rangeCount - 1).cloneContents().textContent;

// collapse the selection to the end and search backwards

               if (plainText.length > 0) {
                   plainText = plainText.replace(/\n/g, );
                   obj.changed.range.collapse(false);

// parameters: 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, '$1');
       }

// display multiple blanks as blank- 

       obj.html = obj.html.replace(/  /g, '  ');
       obj.html = obj.html.replace(/  /g, '  ');

// newlines to

       obj.html = obj.html.replace(/\n/g, '
');

// make changed range text the current selection

       obj.sel.removeAllRanges();
       obj.sel.addRange(obj.changed.range);

// get the scroll position

       var scrollTop;
       if (obj.changed.from == 'whole') {
           scrollTop = wikEdFrameBody.scrollTop;
       }

// replace the selection with changed text

       if (obj.html != ) {
           WikEdFrameExecCommand('inserthtml', obj.html);
       }
       else {
           WikEdFrameExecCommand('delete');
       }

// select the whole text after replacing the whole text and scroll to same height

       if (obj.changed.from == 'whole') {
           obj.sel.removeAllRanges();
           wikEdFrameBody.scrollTop = scrollTop;
           var range = document.createRange();
           range.setStartBefore(wikEdFrameBody.firstChild);
           range.setEndAfter(wikEdFrameBody.lastChild);
           obj.sel.addRange(range);
           selectChange = false;
       }

// select the changed text and scroll it into the viewport by using a backwards find

       if (selectChange != false) {

// get the text content of the changed text

           var div = document.createElement('div');
           div.innerHTML = obj.changed.plain;
           var plainText = div.textContent;

// find the text

           if (plainText.length > 0) {
               plainText = plainText.replace(/\n/g, );

// parameters: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog)

               wikEdFrameWindow.find(plainText, true, true, false, false, false, false);
           }
       }
   }

// remove selection, keep whole text auto-selection as warning

   if (
       ( (obj.changed.keepSel != true) && (obj.changed.from != 'whole') ) ||
       (whichButton == 'wikEdRedirect') ||
       ( (whichButton == 'wikEdWikify') && (parameters == 'whole') )
   ) {

// workaround for Firefox 1.5 bug using: obj.sel.getRangeAt(obj.sel.rangeCount - 1).collapse(false);

       var range = document.createRange();
       range.setStart(obj.sel.focusNode, obj.sel.focusOffset);
       range.collapse(true);
       obj.sel.removeAllRanges();
       obj.sel.addRange(range);
   }

// 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();
   }

// add event handler to make highlighted frame links ctrl-clickable

   if ( (highlightSyntax == true) && (obj.changed.plain != null) ) {
       WikEdFollowLinks();
   }
   return;

}


// // WikEdFollowLinks: add event handler to make highlighted frame links ctrl-clickable //

function WikEdFollowLinks() {

   if (wikEdFollowLinks == true) {
       var spanArray = wikEdFrameBody.getElementsByTagName('span');
       for (var i = 0; i < spanArray.length; i ++) {
           if (spanArray[i].onclick != null) {
               var onClickCode = spanArray[i].onclick.toString();
               var linkMatch = onClickCode.match(/\svar linkName *= *[\'\"](.*)[\'\"]/);
               if (linkMatch != null) {
                   spanArray[i].title = linkMatch[1] + ' ' + wikEdText['followLink'];
               }
               spanArray[i].addEventListener('click', WikEdFollowLinkHandler, true);
           }
       }
   }
   return;

}


// // WikEdGetText: get the text fragments to manipulate //

function WikEdGetText(obj, whichFragment, noWikify) {

// get selection object

   if (obj.sel == null) {
       obj.sel = wikEdFrameWindow.getSelection();
   }

// cursor for the cursor position (always done)

   if (obj.cursor == null) {
       obj.cursor = {};
       obj.cursor.from = 'cursor';
       obj.cursor.keepSel = false;
       obj.cursor.range = document.createRange();
       obj.cursor.range.setStart(obj.sel.focusNode, obj.sel.focusOffset);
       obj.cursor.range.setEnd(obj.sel.focusNode, obj.sel.focusOffset);
       obj.cursor.plain = ;
   }

// whole for the whole text

   if (obj.whole == null) {
       if (/whole|selectionWord|selectionLine|focusWord|focusLine/.test(whichFragment) == true) {
           obj.whole = {};
           obj.whole.plainArray = [];
           obj.whole.plainNode = [];
           obj.whole.plainStart = [];
           obj.whole.from = 'whole';
           obj.whole.keepSel = false;

// set whole range

           obj.whole.range = document.createRange();
           obj.whole.range.setStartBefore(wikEdFrameBody.firstChild);
           obj.whole.range.setEndAfter(wikEdFrameBody.lastChild);

// get whole plain text

           WikEdGetInnerHTML(obj.whole, wikEdFrameBody);
           obj.whole.code = obj.whole.html;
           WikEdRemoveHighlightingWikify(obj.whole, noWikify);
           obj.whole.plain = obj.whole.html;
           obj.whole.plain = obj.whole.plain.replace(/<br\b[^>]*>/g, '\n');
           obj.whole.plain = obj.whole.plain.replace(/\u00a0/g, ' ');
       }
   }

// selection for the selected text

   if (obj.selection == null) {
       if (/selection\b|selectionWord|selectionLine/.test(whichFragment) == true) {
           obj.selection = {};
           obj.selection.from = 'selection';
           obj.selection.keepSel = false;

// copy range to document fragment

           obj.selection.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1);
           var documentFragment = obj.selection.range.cloneContents();

// get selected text

           WikEdGetInnerHTML(obj.selection, documentFragment);
           obj.selection.code = obj.selection.html;
           WikEdRemoveHighlightingWikify(obj.selection, noWikify);
           obj.selection.plain = obj.selection.html;
           obj.selection.plain = obj.selection.plain.replace(/<br\b[^>]*>/g, '\n');
           obj.selection.plain = obj.selection.plain.replace(/\u00a0/g, ' ');
       }
   }

// focusWord and focusLine for the complete words and lines under the cursor

   if (obj.focusWord == null) {
       if (/focusWord|focusLine/.test(whichFragment) == true) {
           obj.focusWord = {};
           obj.focusWord.from = 'focusWord';
           obj.focusWord.range = document.createRange();

// setup focusLine object for the line under the cursor

           obj.focusLine = {};
           obj.focusLine.from = 'focusLine';
           obj.focusLine.keepSel = false;
           obj.focusLine.range = document.createRange();

// find the word and line boundaries

           WikEdFindBoundaries(obj.focusWord, obj.focusLine, obj.whole, obj.cursor);

// get the wikified plain text for the word under the cursor

           var documentFragment = obj.focusWord.range.cloneContents();
           WikEdGetInnerHTML(obj.focusWord, documentFragment);
           obj.focusWord.code = obj.focusWord.html;
           WikEdRemoveHighlightingWikify(obj.focusWord, noWikify);
           obj.focusWord.plain = obj.focusWord.html;
           obj.focusWord.plain = obj.focusWord.plain.replace(/<br\b[^>]*>/g, '\n');
           obj.focusWord.plain = obj.focusWord.plain.replace(/\u00a0/g, ' ');

// get the wikified plain text for the line under the cursor

           var documentFragment = obj.focusLine.range.cloneContents();
           WikEdGetInnerHTML(obj.focusLine, documentFragment);
           obj.focusLine.code = obj.focusLine.html;
           WikEdRemoveHighlightingWikify(obj.focusLine, noWikify);
           obj.focusLine.plain = obj.focusLine.html;
           obj.focusLine.plain = obj.focusLine.plain.replace(/<br\b[^>]*>/g, '\n');
           obj.focusLine.plain = obj.focusLine.plain.replace(/\u00a0/g, ' ');
       }
   }

// selectionWord and selectionLine for the complete words and lines under the selection

   if (obj.selectionWord == null) {
       if (/selectionWord|selectionLine/.test(whichFragment) == true) {

// setup selectionWord object for the words under the selection

           obj.selectionWord = {};
           obj.selectionWord.from = 'selectionWord';
           obj.selectionWord.keepSel = false;
           obj.selectionWord.range = document.createRange();

// setup selectionLine object for the lines under the selection

           obj.selectionLine = {};
           obj.selectionLine.from = 'selectionLine';
           obj.selectionLine.range = document.createRange();

// find the word and line boundaries

           WikEdFindBoundaries(obj.selectionWord, obj.selectionLine, obj.whole, obj.selection);

// get the wikified plain text for the words under the selection

           var documentFragment = obj.selectionWord.range.cloneContents();
           WikEdGetInnerHTML(obj.selectionWord, documentFragment);
           obj.selectionWord.code = obj.selectionWord.html;
           WikEdRemoveHighlightingWikify(obj.selectionWord, noWikify);
           obj.selectionWord.plain = obj.selectionWord.html;
           obj.selectionWord.plain = obj.selectionWord.plain.replace(/<br\b[^>]*>/g, '\n');
           obj.selectionWord.plain = obj.selectionWord.plain.replace(/\u00a0/g, ' ');

// get the wikified plain text for the lines under the selection

           var documentFragment = obj.selectionLine.range.cloneContents();
           WikEdGetInnerHTML(obj.selectionLine, documentFragment);
           obj.selectionLine.code = obj.selectionLine.html;
           WikEdRemoveHighlightingWikify(obj.selectionLine, noWikify);
           obj.selectionLine.plain = obj.selectionLine.html;
           obj.selectionLine.plain = obj.selectionLine.plain.replace(/<br\b[^>]*>/g, '\n');
           obj.selectionLine.plain = obj.selectionLine.plain.replace(/\u00a0/g, ' ');
       }
   }
   return;

}


// // WikEdFind: custom find function with regexp properties, sets obj.changed.range, uses obj ranges //

function WikEdFind(obj, findText, caseSensitive, backwards, wrap, regExp) {

   var range = obj.sel.getRangeAt(obj.sel.rangeCount - 1);
   var found = false;

// empty the range to avoid error messages for reverse direction ranges

   obj.changed.range = document.createRange();

// use the fast built-in find function for non-regexp searches

   if (regExp == null) {

// parameters: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog)

       found = wikEdFrameWindow.find(findText, caseSensitive, backwards, wrap, false, true, false);
       if (found == true) {
           range = obj.sel.getRangeAt(obj.sel.rangeCount - 1);
       }
       obj.changed.range = range.cloneRange();
   }

// slow javascript regexp find and replace

   else {

// perform find

       if (obj.plainArray === undefined) {
           WikEdParseDOM(obj, wikEdFrameBody);
       }
       var regExpMatch = [];

// find next, search to the right

       if (backwards == false) {

// set start position for search to right

           regExpMatch = regExp.exec(obj.plain);
           regExp.lastIndex = obj.plainFocus;

// execute the regexp search to the right

           regExpMatch = regExp.exec(obj.plain);

// remember position for repeated searches

           obj.plainFocus = regExp.lastIndex;

// wrap around, start at beginning

           if ( (wrap == true) && (regExpMatch == null) ) {
               regExp.lastIndex = 0;
               regExpMatch = regExp.exec(obj.plain);
           }
       }

// 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);

// wrap around, find last occurrence

           if ( (wrap == true) && (regExpMatch == null) ) {
               do {
                   regExpMatch = regExpMatchNext;
                   regExpMatchNext = regExp.exec(obj.plain);
               } while (regExpMatchNext != null);
           }
       }

// select the find

       if (regExpMatch != null) {
           found = true;
           var i = 0;
           while ( (obj.plainStart[i + 1] <= regExpMatch.index) && (obj.plainStart[i + 1] != null) ) {
               i ++;
           }
           var j = i;
           while ( (obj.plainStart[j + 1] <= regExpMatch.index + regExpMatch[0].length) && (obj.plainStart[j + 1] != null) ) {
               j ++;
           }
           obj.changed.range.setEnd  (obj.plainNode[j], regExpMatch.index + regExpMatch[0].length - obj.plainStart[j]);
           obj.changed.range.setStart(obj.plainNode[i], regExpMatch.index - obj.plainStart[i]);
       }
   }
   return(found);

}


// // WikEdTextify: strip html off of text //

function WikEdTextify(obj) {

// convert html to plain

   obj.plain = obj.html;
   obj.plain = obj.plain.replace(/\n/g, ' ');

// delete tags

   obj.plain = obj.plain.replace(/<(style|script|object|applet|embed)\b[^>]*>.*?<\/\1>/g, );

// newlines

   obj.plain = obj.plain.replace(/<(br)\b[^>]*>/g, '\n');

// remove highlighting pre tags

   var isRemove = [];
   obj.plain = obj.plain.replace(/(<(\/?)pre\b([^>]*)>)/g,
       function (p, p1, p2, p3) {
           if (p2 == ) {
               if (/\bclass=\"wikEd\w+\"/.test(p3)) {
                   isRemove.push(true);
                   return();
               }
               isRemove.push(false);
               return(p1);
           }
           if (isRemove.pop() == true) {
               return();
           }
           return(p1);
       }
   );

// blocks

   obj.plain = obj.plain.replace(/<\/?(address|blockquote|center|div|hr|isindex|p|pre)\b[^>]*>/g, '\u0000\u0000');

// keep headings only if starting with a newline

   obj.html = obj.html.replace(/[\s|\u0000]*(^|\n|\u0000)[\s|\u0000]*<h[1-6]\b[^>]*>(.*?)<\/h[1-6]>[\s|\u0000]*/g, '\u0000\u0000$2\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{3,}/g, '\n\n');
   obj.plain = obj.plain.replace(/\u0000/g, '\n');

// remove empty lines and spaces from article start and end

   if (obj.from == 'whole') {
       obj.html = obj.html.replace(/^\s+|\s+$/g, );
   }
   return;

}


// // WikEdInactiveButtons: grey out inactive buttons, called after every change and click //

function WikEdInactiveButtons() {

// undo

   if (wikEdFrameDocument.queryCommandEnabled('undo') == true ) {
       document.getElementById('wikEdUndo').className = 'wikEdButton';
       document.getElementById('wikEdUndoAll').className = 'wikEdButton';
   }
   else {
       document.getElementById('wikEdUndo').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';
   }
   return;

}

// // WikEdFixBasic: fix characters, spaces, empty lines, certain headings, needed for all fixing functions //

/// change: double spaces ok after dot

function WikEdFixBasic(obj) {

// non-breaking space character to normal space

   obj.plain = obj.plain.replace(/(\u00a0)/g, ' ');

// remove trailing spaces

   obj.plain = obj.plain.replace(/( | )+\n/g, '\n');

// empty line before and after headings, spaces around word (lookahead)

   obj.plain = obj.plain.replace(/\n+(=+) *([^\n]*?) *(=+)(?=\n)\n*/g, '\n\n$1 $2 $3\n\n');

// uppercase well known headings

   var regExp = new RegExp('\\n=+ ' + wikEdText['External links'] + '? =+\\n', 'gi');
   obj.plain = obj.plain.replace(regExp, '\n== ' + wikEdText['External links'] + ' ==\n');
   regExp = new RegExp('\\n=+ ' + wikEdText['See also'] + ' =+\\n', 'gi');
   obj.plain = obj.plain.replace(regExp, '\n== ' + wikEdText['See also'] + ' ==\n');
   regExp = new RegExp('\\n=+ ' + wikEdText['References'] + '? =+\\n', 'gi');
   obj.plain = obj.plain.replace(regExp, '\n== ' + wikEdText['References'] + ' ==\n');

// add space after * # : ; (list) and after {| |- | (table)

   obj.plain = obj.plain.replace(/(^|\n)([\*\#\:\;]+|\{\||\|\-|\|\}|\|) */g, '$1$2 ');
   obj.plain = obj.plain.replace(/ +\n/g, '\n');

// empty line before and after tables

   obj.plain = obj.plain.replace(/\n+(\{\|)/g, '\n\n$1');
   obj.plain = obj.plain.replace(/(\n\|\}([^\}]|$)) *([^\n]*)[\n|$]+/g, '$1\n\n$3\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 (/^ /.test(line) == false) {

// 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');
           }
       }

// concatenate the lines

       obj.plain += line;
       if (i < lines.length - 1) {
           obj.plain += '\n';
       }
   }

// remove underscores in wikilinks

   obj.plain = obj.plain.replace(/\[\[(.*?)(\|.*?)?\]\]/g,
       function (p, p1, p2) {
           p1 = p1.replace(/_/g, ' ');
           return('' + p1 + p2 + '');
       }
   );

// remove spaces in wikilinks

   obj.plain = obj.plain.replace(/\[\[ *([^\n]*?) *\]\]/g, '$1');

// remove spaces in external links

   obj.plain = obj.plain.replace(/\[ *([^\n]*?) *\]/g, '[$1]');

// no space around pipes before brackets

   obj.plain = obj.plain.replace(/ +\| +\]\]/g, '|]]');

// no space around pipes before curly brackets

   obj.plain = obj.plain.replace(/ +\| +\}\}/g, '|}}');

// no empty line between headings and includes

   obj.plain = obj.plain.replace(/\n(=+ [^\n]*? =+\n)\n+(\{\{.*?\}\})/g, '\n$1$2');

// spaces in comments

   obj.plain = obj.plain.replace(/(<!--) *([^\n]*?) *(-->)/g, '$1 $2 $3');

// empty 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À-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\'\"”\]\}\)]) +([\.\,\:\;])(\s+|$)/g, '$1$2 ');
   obj.plain = obj.plain.replace(/\s+$/g, );
   return;

}


// // WikEdFixUnicode: fix unicode character representations //

function WikEdFixUnicode(obj) {

// replace supported chars: change decimal, hex, and character entities into actual char

   for (var i = 0; i < wikEdSupportedChars.length; i ++) {
       var replaceChar = String.fromCharCode(parseInt(wikEdSupportedChars[i][0], 16));

// decimal representation

       var regExpStr = '&#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 = '&' + wikEdSupportedChars[i][1] + ';';

// case sensitive replace

       regExp = new RegExp(regExpStr, 'g');
       obj.plain = obj.plain.replace(regExp, replaceChar);
   }

// replace unsupported chars in IE6: change decimal, hex, and chars into character entities

   for (var i = 0; i < wikEdProblemChars.length; i ++) {
       replaceChar = '&' + wikEdProblemChars[i][1] + ';';

// decimal representation

       regExpStr = '&#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 (var i = 0; i < wikEdSpecialChars.length; i ++) {
       var replaceChar = '&' + 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 wikicode

   obj.plain = obj.plain.replace(/(.*?)((<math(\b.*?)>.*?<\/math>)|$)/gi,
       function (p, p1, p2) {

// convert html entities into actual dash characters

           p1 = p1.replace(/+/g, '+');
           p1 = p1.replace(/−/g, '\u2212');
           p1 = p1.replace(/·/g, '·');

// convert dash next to a number into a minus sign character

           p1 = p1.replace(/([^\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\,\{])-(\d)/g, '$1\u2212$2');

// changes 2x3 to 2×3

           p1 = p1.replace(/(\d *)x( *\d)/g, '$1\u00d7$2');

// changes 10^3 to 103

           p1 = p1.replace(/(\d*\.?\d+)\^(\u2212?\d+\.?\d*)/g, '$1<sup>$2</sup>');

// change x^3 to x3

           p1 = p1.replace(/([\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9])\^(\u2212?\d+\.?\d*) /g, '$1<sup>$2</sup>');

// change +/- to ±

           p1 = p1.replace(/( |\d)\+\/(-|\u2212)( |\d)/g, '$1\u00b1$3');

// htmlize single char superscripts

           p1 = p1.replace(/(\u00b9|¹)/g, '<sup>1</sup>');
           p1 = p1.replace(/(\u00b2|²)/g, '<sup>2</sup>');
           p1 = p1.replace(/(\u00b3|³)/g, '<sup>3</sup>');
           return(p1 + p2);
       }
   );
   return;

}


// // WikEdFixChem: fix chemical formulas //

function WikEdFixChem(obj) {

   WikEdFixBasic(obj);
   var realElements = 'H|He|Li|Be|B|C|N|O|F|Ne|Na|Mg|Al|Si|P|S|Cl|Ar|K|Ca|Sc|Ti|V|Cr|Mn|Fe|Co|Ni|Cu|Zn|Ga|Ge|As|Se|Br|Kr|Rb|Sr|Y|Zr|Nb|Mo|Tc|Ru|Rh|Pd|Ag|Cd|In|Sn|Sb|Te|I|Xe|Cs|Ba|Hf|Ta|W|Re|Os|Ir|Pt|Au|Hg|Tl|Pb|Bi|Po|At|Rn|Fr|Ra|Rf|Db|Sg|Bh|Hs|Mt|Ds|Rg|La|Ce|Pr|Nd|Pm|Sm|Eu|Gd|Tb|Dy|Ho|Er|Tm|Yb|Lu|Ac|Th|Pa|U|Np|Pu|Am|Cm|Bk|Cf|Es|Fm|Md|No|Lr';
   var pseudoElements = '|Me|Et|Pr|Bu|e';

// fix common typos

   obj.plain = obj.plain.replace(/(^|[^a-z])h2o([^a-z]|$)/g, '$1H2O$2');
   obj.plain = obj.plain.replace(/(^|[^a-z])h3o+/g, '$1H3O+');
   obj.plain = obj.plain.replace(/(^|[^a-z])oh-/g, '$1OH+');

// uppercase lowercased elements

   var regExp = new RegExp('(^|[^a-zA-Z])(' + realElements.toLowerCase() + pseudoElements.toLowerCase() + ')([^a-zA-Z]|$)', 'g');
   obj.plain = obj.plain.replace(regExp,
       function (p, p1, p2, p3) {
           if (p2 != 'e') {
               p2 = p2.substr(0, 1).toUpperCase() + p2.substr(1).toLowerCase();
           }
           return(p1 + p2 + p3);
       }
   );

// fix superscripts

   obj.plain = obj.plain.replace(/+/g, '+');
   obj.plain = obj.plain.replace(/−/g, '\u2212');
   obj.plain = obj.plain.replace(/·/g, '·');
   regExp = new RegExp('(' + realElements + pseudoElements + '|\\))(\\d*(\\+|-|\\u2212))', 'g');
   obj.plain = obj.plain.replace(regExp,
       function (p, p1, p2, p3) {
           p2 = p2.replace(/-/g, '\u2212');
           return(p1 + '<sup>' + p2 + '</sup>');
       }
   );

// fix indices

   regExp = new RegExp('(' + realElements + pseudoElements + '|\\))(\\d+)', 'g');
   obj.plain = obj.plain.replace(regExp, '$1<sub>$2</sub>');

// fix prefixes

   regExp = new RegExp('(\\d+) *(\\(|' + realElements + pseudoElements + ')', 'g');
   obj.plain = obj.plain.replace(regExp, '$1$2');

// fix arrows

   obj.plain = obj.plain.replace(/ *-+> */g, ' \u2192 ');
   obj.plain = obj.plain.replace(/ *<-+ */g, ' \u2190 ');

// &hdarr; and "leftwards harpoon over rightwards harpoon" not supported in IE6 // obj.plain = obj.plain.replace(/ *(<=+>|&hdarr;|↔|\u2190 *\u2192) */g, ' \u21cc ');

   obj.plain = obj.plain.replace(/ *(<==+>|&hdarr;|↔|\u21cc|\u2190 *\u2192) */g, ' <=> ');

// fix -

   obj.plain = obj.plain.replace(/([\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|\)|>) +(-|\u2212) +([\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|\()/g, '$1 \u2212 $3');
   return;

}


// // WikEdFixUnits: unit formatter //

function WikEdFixUnits(obj) {

   WikEdFixBasic(obj);

// convert into actual characters

   obj.plain = obj.plain.replace(/&deg;|&#00b0;/g, '°');
   obj.plain = obj.plain.replace(/&#00b5;|&mu;|&micro;/g, 'µ');
   obj.plain = obj.plain.replace(/&Omega;|&#8486;/g, '\u03a9');

// add space before units, remove space around /, and use abreviations

   obj.plain = obj.plain.replace(/( *\/ *|\d *)(Y|yotta|Z|zetta|E|exa|P|peta|T|tera|G|giga|M|mega|k|kilo|K|h|hecto|da|deca|d|deci|c|centi|m|mill?i|micro|u|µ|n|nano|p|pico|f|femto|a|atto|z|zepto|y|yocto|mibi|mebi|)(gramm?s?|g|metres?|meters?|m|amperes?|Amperes?|amps?|Amps?|A|Angstroms?|Angströms?|Å|Kelvins?|kelvins?|K|moles?|Moles?|mol|candelas?|cd|rad|Ci|sr|Hert?z|hert?z|Hz|newtons?|Newtons?|N|Joules?|joules?|J|watts?|Watts?|W|pascals?|Pascals?|Pa|lm|lx|C|volts?|Volts?|V|O|Farads?|F|Wb|T|H|S|bequerels?|Bequerels?|Bq|Gy|Sv|kat|centigrades?|°C|decibels?|db|dB|M|ohms?|Ohms?|\u03a9|sec|seconds?|s|minutes?|min|hour?|h|bits?|Bits?|bit|bytes?|Bytes?|B|bps|Bps)(?=[^\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|$)/g,
       function (p, p1, p2, p3) {
           p1 = p1.replace(/ *\/ */g, '/');
           p1 = p1.replace(/(\d) */g, '$1 ');
           p2 = p2.replace(/yotta/g, 'Y');
           p2 = p2.replace(/zetta/g, 'Z');
           p2 = p2.replace(/exa/g, 'E');
           p2 = p2.replace(/peta/g, 'P');
           p2 = p2.replace(/tera/g, 'T');
           p2 = p2.replace(/giga/g, 'G');
           p2 = p2.replace(/mega/g, 'M');
           p2 = p2.replace(/kilo/g, 'k');
           p2 = p2.replace(/K/g, 'k');
           p2 = p2.replace(/hecto/g, 'h');
           p2 = p2.replace(/deca/g, 'da');
           p2 = p2.replace(/deci/g, 'd');
           p2 = p2.replace(/centi/g, 'c');
           p2 = p2.replace(/mill?i/g, 'm');
           p2 = p2.replace(/micro|u/g, 'µ');
           p2 = p2.replace(/nano/g, 'n');
           p2 = p2.replace(/pico/g, 'p');
           p2 = p2.replace(/femto/g, 'f');
           p2 = p2.replace(/atto/g, 'a');
           p2 = p2.replace(/zepto/g, 'z');
           p2 = p2.replace(/yocto/g, 'y');
           p2 = p2.replace(/mibi/g, 'mebi');
           p3 = p3.replace(/gramm?s?/g, 'g');
           p3 = p3.replace(/metres?|meters?/g, 'm');
           p3 = p3.replace(/amperes?|Amperes?|amps?|Amps?/g, 'A');
           p3 = p3.replace(/Angstroms?|Angströms?/g, 'Å');
           p3 = p3.replace(/Kelvins?|kelvins?/g, 'K');
           p3 = p3.replace(/moles?|Moles?/g, 'mol');
           p3 = p3.replace(/candelas?/g, 'cd');
           p3 = p3.replace(/Hert?z|hert?z/g, 'Hz');
           p3 = p3.replace(/newtons?|Newtons?/g, 'N');
           p3 = p3.replace(/Joules?|joules?/g, 'J');
           p3 = p3.replace(/watts?|Watts?/g, 'W');
           p3 = p3.replace(/pascals?|Pascals?/g, 'Pa');
           p3 = p3.replace(/volts?|Volts?/g, 'V');
           p3 = p3.replace(/ohms?|Ohms?/g, '\u03a9');
           p3 = p3.replace(/bequerels?|Bequerels?/g, 'Bq');
           p3 = p3.replace(/Farads?/g, 'F');
           p3 = p3.replace(/bits?|Bits?/g, 'bit');
           p3 = p3.replace(/bytes?|Bytes?/g, 'B');
           p3 = p3.replace(/sec|seconds?/g, 's');
           p3 = p3.replace(/minutes?/g, 'min');
           p3 = p3.replace(/hours?/g, 'h');
           p3 = p3.replace(/sec|seconds?/g, 's');
           p3 = p3.replace(/bps/g, 'bit/s');
           p3 = p3.replace(/Bps/g, 'B/s');
           return(p1 + p2 + p3);
       }
   );

// fix prefix casing

   obj.plain = obj.plain.replace(/ K(bit\/s|B\/s)([^\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|$)/g, ' k$1$2');
   obj.plain = obj.plain.replace(/ m(bit\/s|B\/s)([^\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|$)/g, ' M$1$2');
   obj.plain = obj.plain.replace(/ g(bit\/s|B\/s)([^\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|$)/g, ' G$1$2');
   obj.plain = obj.plain.replace(/ t(bit\/s|B\/s)([^\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|$)/g, ' T$1$2');
   obj.plain = obj.plain.replace(/ e(bit\/s|B\/s)([^\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|$)/g, ' E$1$2');
   return;

}


// // WikEdFixDashes: dash fixer - fixes several obvious en/em dash, minus sign, and such special characters. // originally from User:Omegatron //

function WikEdFixDashes(obj) {

   WikEdFixBasic(obj);

// convert html entities into actual dash characters

   obj.plain = obj.plain.replace(/&mdash;/g, '—');
   obj.plain = obj.plain.replace(/&ndash;/g, '–');
   obj.plain = obj.plain.replace(/&minus;/g, '\u2212');

// convert -- and em dashes with or without spaces to em dash surrounded by spaces

   obj.plain = obj.plain.replace(/([a-zA-Z\'\"”\]\}\)]) *(--|—|&mdash;) *([a-zA-Z\'\"“\[\{\(])/g, '$1 — $3');

// convert - or en dashes with spaces to em dash character surrounded by spaces

   obj.plain = obj.plain.replace(/([a-zA-Z\'\"”\]\}])( |&nbsp;)+(\u2212|–|&ndash;) +([a-zA-Z\'\"“\[\{])/g, '$1$2— $4');

// convert hyphen next to lone number into a minus sign character

   obj.plain = obj.plain.replace(/([a-zA-Z\'\"”\]\>] )-(\d)/g, '$1\u2212$2');

// convert dashes to en dashes in dates

   obj.plain = obj.plain.replace(/([ \(][12]\d\d\d) ?(--?|—|&mdash;) ?([12]\d\d\d|\d\d)([ \),.;])/g, '$1–$3$4');
   return;

}


// // WikEdFixHTML: fix html to wikicode //

function WikEdFixHTML(obj) {

   WikEdFixBasic(obj);

// remove syntax highlighting

   obj.html = obj.plain;
   obj.html = obj.html.replace(/\n/g, '
'); WikEdRemoveHighlighting(obj);

// turn visible html code into real html, exclude comments

   obj.html = obj.html.replace(/<(\/?\w.*?)>/g, '<$1>');

// wikify, keep user added attribute

   WikEdWikifyHTML(obj, true);

// turn real html into visible html code

   obj.html = obj.html.replace(/<br\b[^>]*>/g, '\n');
   obj.html = obj.html.replace(/</g, '<');
   obj.html = obj.html.replace(/>/g, '>');
   obj.plain = obj.html;
   return;

}


// // WikEdFixCaps: fix capitalizing of lists, linklists, images, headings //

function WikEdFixCaps(obj) {

   WikEdFixBasic(obj);

// uppercase lists // start (listcode (char-ent|tag|category..|digit|non-word,non-ret))(word,non-digit..) end

   obj.plain = obj.plain.replace(/^([\*\#\:\;]+ (\&\w+\;|<[^\n]*?>|\{\{.*?\}\}[^\n]*|\d|[^\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\n])*)([^\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\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À-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|\d)*)([a-zA-ZÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9_].*)$/,
               function (p, p1, p2, p3) {
                   if ( ! p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/) ) {
                       p3 = p3.substr(0, 1).toUpperCase() + p3.substr(1);
                   }
                   return(p1 + p3);
               }
           );

// uppercase comment

           p2 = p2.replace(/(\| *(\&\w+\;|<[^\n]*?>|[^\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|\d)*)([a-zA-ZÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9_].*)$/,
               function (p, p1, p2, p3) {
                   if ( ! p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/) ) {
                       p3 = p3.substr(0, 1).toUpperCase() + p3.substr(1);
                   }
                   return(p1 + p3);
               }
           );
           return(p1 + p2 + p3);
       }
   );

// uppercase headings

   obj.plain = obj.plain.replace(/^(=+ (\&\w+\;|<[^\n]*?>|\d|[^\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\n])*)([a-zA-ZÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9_].*? =+)$/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À-ÖØ-öø-\\u0220\\u0222-\\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\\u0400-\\u0481\\u048a-\\u04ce\\u04d0-\\u04f5\\u04f8\\u04f9])([^\\n]*\\]\\])', 'igm');
   obj.plain = obj.plain.replace(regExp,
       function (p, p1, p2, p3) {
           return(p1 + wikEdText['wikicode Image'] + ':' + p2.toUpperCase() + p3);
       }
   );
   return;

}


// // WikEdFixAll: //

function WikEdFixAll(obj) {

   WikEdFixBasic(obj);
   WikEdFixUnicode(obj);
   WikEdFixHTML(obj);
   WikEdFixCaps(obj);
   return;

}


// // WikEdRemoveElements: remove elements by tag name //

function WikEdRemoveElements(tagNameArray) {

// cycle through the element names

   for (var property in tagNameArray) {
       var elementArray = wikEdFrameDocument.getElementsByTagName(tagNameArray[property]);
       for (var i = 0; i < elementArray.length; i ++) {
           elementArray[i].parentNode.removeChild(elementArray[i]);
       }
   }
   return;

}


// // WikEdFindBoundaries: find word boundaries and line boundaries starting from selection.range //

function WikEdFindBoundaries(word, line, whole, selection) {

// get the start node and offset

   var startNode = selection.range.startContainer;
   var startNodeOffset = selection.range.startOffset;

// get the end node and offset

   var endNode = selection.range.endContainer;
   var endNodeOffset = selection.range.endOffset;
   if (startNode.nodeType == 1) {
       startNode = startNode.childNodes[startNodeOffset];
       startNodeOffset = 0;
   }
   if (endNode.nodeType == 1) {
       endNode = endNode.childNodes[endNodeOffset];
       endNodeOffset = 0;
   }

// find the start and end nodes in the whole plain text arrays

   var startNodeIndex;
   var endNodeIndex;
   for (var i = 0; i < whole.plainNode.length; i ++) {
       if (startNode == whole.plainNode[i]) {
           startNodeIndex = i;
       }
       if (endNode == whole.plainNode[i]) {
           endNodeIndex = i;
           break;
       }
   }

// find last previous word and line boundary

   var foundWord = false;
   var foundLine = false;
   var regExp = new RegExp('.*[^\\wÀ-ÖØ-öø-\\u0220\\u0222-\\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\\u0400-\\u0481\\u048a-\\u04ce\\u04d0-\\u04f5\\u04f8\\u04f9\\-]', 'g');
   var plain = ;

// check text nodes left-wise for a boundary

   for (var i = startNodeIndex; i >= 0; i --) {
       plain = whole.plainArray[i];
               plain = plain.replace(/&/g, '&');
               plain = plain.replace(/</g, '<');
               plain = plain.replace(/>/g, '>');

// boundary is a newline

       if (plain == '\n') {

// current newline is the start node

           if (i == startNodeIndex) {
               if (! foundWord) {
                   word.range.setStartBefore(whole.plainNode[i]);
                   foundWord = true;
               }
               line.range.setStartBefore(whole.plainNode[i]);
           }
           else {
               if (! foundWord) {
                   word.range.setStartAfter(whole.plainNode[i]);
                   foundWord = true;
               }
               line.range.setStartAfter(whole.plainNode[i]);
           }
           foundLine = true;
           break;
       }

// check text node for a word boundary

       else if (! foundWord) {
           if (i == startNodeIndex) {
               plain = plain.substr(0, startNodeOffset);
               plain = plain.replace(/&/g, '&');
               plain = plain.replace(/</g, '<');
               plain = plain.replace(/>/g, '>');
           }
           regExp.lastIndex = 0;
           if (regExp.exec(plain) != null) {
               word.range.setStart(whole.plainNode[i], regExp.lastIndex);
               foundWord = true;
           }
       }
   }

// boundary is start of text

   if (! foundLine) {
       line.range.setStartBefore(whole.plainNode[0]);
       if (! foundWord) {
           word.range.setStartBefore(whole.plainNode[0]);
       }
   }

// find next word and line boundary

   regExp = new RegExp('[^\\wÀ-ÖØ-öø-\\u0220\\u0222-\\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\\u0400-\\u0481\\u048a-\\u04ce\\u04d0-\\u04f5\\u04f8\\u04f9\\-]', 'g');
   foundWord = false;
   foundLine = false;

// check text nodes right-wise for a boundary

   for (var i = endNodeIndex; i < whole.plainArray.length; i ++) {
       plain = whole.plainArray[i];
               plain = plain.replace(/&/g, '&');
               plain = plain.replace(/</g, '<');
               plain = plain.replace(/>/g, '>');

// boundary is a newline

       if (plain == '\n') {
           if (! foundWord) {
               word.range.setEndBefore(whole.plainNode[i]);
               foundWord = true;
           }
           line.range.setEndBefore(whole.plainNode[i]);
           foundLine = true;
           break;
       }

// check text node for a word boundary

       else if (! foundWord) {
           if (i == endNodeIndex) {
               regExp.lastIndex = endNodeOffset;
           }
           else {
               regExp.lastIndex = 0;
           }
           var regExpArray = regExp.exec(plain);
           if (regExpArray != null) {
               word.range.setEnd(whole.plainNode[i], regExpArray.index);
               foundWord = true;
           }
       }
   }

// boundary is end of text

   if (! foundLine) {
       line.range.setEndAfter(whole.plainNode[whole.plainArray.length - 1]);
       if (! foundWord) {
           word.range.setEndAfter(whole.plainNode[whole.plainArray.length - 1]);
       }
   }
   return;

}


// // remove syntax highlighting and wikify //

function WikEdRemoveHighlightingWikify(obj, noWikify) {

   if (obj.html != ) {

// remove syntax highlighting

       WikEdRemoveHighlighting(obj);

// wikify, don't allow many attributes

       if ( (obj.htmlCode == true) && (noWikify != true) ) {
           WikEdWikifyHTML(obj, false);
       }
   }
   return;

}


// // WikEdWikifyHTML: // obj.html contains the text to be wikified // expects < > < > & spaces instead of  
(not \n) // returns
(not \n)

/*

   allowed and converted tags:
           br|p
           h1|h2|h3|h4|h5|h6
           hr
           i|dfn|cite|em|var
           b|strong
           table|caption|col|thead|tfoot|tbody|tr|td|th
           dl|dt|dd|li|ol|ul
           a
   not allowed yet:
           bdo|q|kbd|samp|abbr|acronym|label
   other allowed tags:
           big|blockquote|colgroup|center|code|del|div|font|ins|pre|s|small|span|strike|sub|sup|tt|u|rb|rp|rt|ruby
   mediawiki tags:
           nowiki|math|gallery|noinclude|includeonly|ref|references
  • /

function WikEdWikifyHTML(obj, relaxed) {

   var regExpStr;
   var regExp;
   var regExpMatch;

// delete tags: <style>

   obj.html = obj.html.replace(/<(style)\b[^>]*>.*?<\/\1>/g, );

// remove MediaWiki section edit spans

   obj.html = obj.html.replace(/<span[^>]*class=\"editsection\"[^>]*>.*?<\/span>\s*/g, );

// remove MediaWiki heading spans

   obj.html = obj.html.replace(/<span\b[^>]*\bclass=\"mw-headline\"[^>]*>(.*?)<\/span>\s*/g, '$1');

// remove MediaWiki divs from article top

   obj.html = obj.html.replace(/<h3\b[^>]*\bid=\"siteSub\"[^>]*>.*?<\/h3>\s*/g, );
   obj.html = obj.html.replace(/<div\b[^>]*\bid=\"contentSub\"[^>]*>.*?<\/div>\s*/g, );
   obj.html = obj.html.replace(/<div\b[^>]*\bid=\"jump-to-nav\"[^>]*>.*?<\/div>\s*/g, );

// remove MediaWiki table of contents

   obj.html = obj.html.replace(/<table\b[^>]*?\bid=\"toc\"[^>]*>.*?<\/table>\s*/g, );

// remove MediaWiki print footer

   obj.html = obj.html.replace(/<div\b[^>]*?\bclass=\"printfooter\"[^>]*>[^<>\"]+\"<a\b[^>]*>[^<]+<\/a>\"<\/div>\s*/g, );

// remove MediaWiki category list tags

   regExp = /<div\b[^>]*\bid=\"catlinks\"[^>]*>(.*?)<\/div>\s*/g;
   while(regExp.test(obj.html) == true) {
       obj.html = obj.html.replace(regExp, '$1');
   }
   regExp = /<p\b[^>]*?\bclass=\"catlinks\"[^>]*>(.*?)<a\b[^>]*>[^<>]+<\/a>: (.*?)<\/p>/g;
   while(regExp.test(obj.html) == true) {
       obj.html = obj.html.replace(regExp, '$1$2');
   }
// sanitize

   obj.html = obj.html.replace(/<(span|div|p)\b *(.*?) *\/?>/g,
       function (p, p1, p2) {
           return('<' + p1 + WikEdSanitizeAttributes(p1, p2, relaxed) +  '>');
       }
   );

// remove ... 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

...

pairs withhout attributes
   var isRemove = [];
   obj.html = obj.html.replace(/(<(\/?)p\b([^>]*)>)/g,
       function (p, p1, p2, p3) {
           if (p2 == ) {
               if (p3 == ) {
                   isRemove.push(true);
                   return('\u0000\u0000');
               }
               isRemove.push(false);
               return(p1);
           }
           if (isRemove.pop() == true) {
               return('\u0000\u0000');
           }
           return(p1);
       }
   );

// escape character entities

   obj.html = obj.html.replace(/&(?!(amp;|lt;|gt;))/g, '&');

// remove comments

   obj.html = obj.html.replace(//g, );
//
horizontal rule
   obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<hr\b[^>]*>(\s|<br\b[^>]*>|\u0000)*/i, '\u0000\u0000----\u0000\u0000');

// 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, '\'\);

// bold

   obj.html = obj.html.replace(/<(b|strong)\b[^>]*>/g, '\'\'\);
   obj.html = obj.html.replace(/<\/(b|strong)\b[^>]*>/g, '\'\'\);
//

..

headings obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(^|\n|<br\b[^>]*>|\u0000)(\s|<br\b[^>]*>|\u0000)*<h1\b[^>]*>(.*?)<\/h1>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000\u0000= $4 =\u0000\u0000'); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(^|\n|<br\b[^>]*>|\u0000)(\s|<br\b[^>]*>|\u0000)*<h2\b[^>]*>(.*?)<\/h2>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000\u0000== $4 ==\u0000\u0000'); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(^|\n|<br\b[^>]*>|\u0000)(\s|<br\b[^>]*>|\u0000)*<h3\b[^>]*>(.*?)<\/h3>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000\u0000=== $4 ===\u0000\u0000'); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(^|\n|<br\b[^>]*>|\u0000)(\s|<br\b[^>]*>|\u0000)*<h4\b[^>]*>(.*?)<\/h4>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000\u0000==== $4 ====\u0000\u0000'); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(^|\n|<br\b[^>]*>|\u0000)(\s|<br\b[^>]*>|\u0000)*<h5\b[^>]*>(.*?)<\/h5>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000\u0000===== $4 =====\u0000\u0000'); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(^|\n|<br\b[^>]*>|\u0000)(\s|<br\b[^>]*>|\u0000)*<h6\b[^>]*>(.*?)<\/h6>(\s|<br\b[^>]*>|\u0000)*/g, '\u0000\u0000====== $4 ======\u0000\u0000'); obj.html = obj.html.replace(/<(h[0-6])\b[^>]*>(.*?)<\/\1>/g, '$2'); // remove <thead> <tbody> <tfoot> obj.html = obj.html.replace(/(\s|\u0000|<br\b[^>]*>)<\/?(thead|tbody|tfoot)\b[^>]*>(\s|\u0000|<br\b[^>]*>)*/g, '$1'); // remove <col></col> and <colgroup></colgroup>\s obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<(col)\b[^>]*>.*?<\/\2>(|<br\b[^>]*>|\u0000)*/g, ); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<(colgroup)\b[^>]*>.*?<\/\2>(|<br\b[^>]*>|\u0000)*/g, ); // line breaks in table cells obj.html = obj.html.replace(/(<(td|th|caption)\b[^>]*>)(.*?)(<\/\2>)/g, function(p, p1, p2, p3, p4) { p3 = p3.replace(/^(\s|<br\b[^>]*|\u0000>)+/g, ); p3 = p3.replace(/(\s|<br\b[^>]*|\u0000>)+$/g, ); p3 = p3.replace(/<br\b[^>]*> */g, '<br />'); return(p1 + p3 + p4); } ); // remove table closing tags obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<\/(tr|thead|tbody|tfoot)>(\s|<br\b[^>]*>|\u0000)*/g, ); // table cells obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(\s|<br\b[^>]*>|\u0000)*/g, '\u0000| ');
   obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<(td) +([^>]*)>(\s|<br\b[^>]*>|\u0000)*/g,
       function (p, p1, p2, p3, p4) {
           p3 = WikEdSanitizeAttributes(p2, p3, relaxed);
           if (p3 == ) {
               return('\u0000| ');
           }
           else {
               return('\u0000|' + p3 + ' | ');
           }
       }
   );
// table cells obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(\s|<br\b[^>]*>|\u0000)*/g, '\u0000| ');
   obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<(th) +([^>]*)>(\s|<br\b[^>]*>|\u0000)*/g,
       function (p, p1, p2, p3, p4) {
           p3 = WikEdSanitizeAttributes(p2, p3, relaxed);
           if (p3 == ) {
               return('\u0000| ');
           }
           else {
               return('\u0000|' + p3 + ' | ');
           }
       }
   );
// table rows obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(\s|<br\b[^>]*>|\u0000)*/g, '\u0000|-\u0000'); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<(tr) +([^>]*)>(\s|<br\b[^>]*>|\u0000)*/g, function (p, p1, p2, p3, p4) { return('\u0000|-' + WikEdSanitizeAttributes(p2, p3, relaxed) + '\u0000'); } ); // table caption obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*(\s|<br\b[^>]*>|\u0000)*/g, '\u0000|+ '); obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\u0000)*<(caption) +([^>]*)>(\s|<br\b[^>]*>|\u0000)*/g, function (p, p1, p2, p3, p4) { p3 = WikEdSanitizeAttributes(p2, p3, relaxed); if (p3 == ) { return('\u0000|+ '); } else { return('\u0000|+' + p3 + ' | '); } } ); // remove closing tags obj.html = obj.html.replace(/\s*<\/(td|th|caption)>\s*/g, ); // line breaks, also in table cells (continued) obj.html = obj.html.replace(/<br\b[^>]*>/g, '\u0000'); // obj.html = obj.html.replace(/[\s\u0000]*
[\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 pathArticle = ; var linkTitle = ; var urlPar = ; var imgWidth = ; var paramLink = false; // check if it is a wiki article link, get path article name and url parameters regExpStr = ' href=\\"(' + wikEdServer + '|\\.|(\\.\\.\/)*\\.\\.)(' + wikEdArticlePath + '([^\\"\\?]+)|' + wikEdScriptPath + 'index\\.php)(\\?([^\\"]*))?(\\"|#)'; regExp = new RegExp(regExpStr); regExpMatch = regExp.exec(linkPar); if (regExpMatch != null) { urlPar = regExpMatch[6]; if (regExpMatch[4] != null) { pathArticle = regExpMatch[4]; } // check for links with special parameters, not title, action=edit, isbn regExp = new RegExp('(\\?|&)(\\w+)=([^\\"\\&]+)', 'g'); while ( (regExpMatch = regExp.exec(linkPar)) != null) { if ( (regExpMatch[2] != 'title') && (regExpMatch[2] != 'isbn') && ( (regExpMatch[2] != 'action') || (regExpMatch[3] != 'edit') ) ) { paramLink = true; break; } } } // get article name from path: /article if (paramLink != true) { if (pathArticle != ) { linkArticle = pathArticle; linkArticle = linkArticle.replace(/_/g, ' '); linkArticle = decodeURIComponent(linkArticle); } // get article name from title="" html parameter else { regExpMatch = / title=\"([^\">]+)\"/.exec(linkPar); if (regExpMatch != null) { linkArticle = regExpMatch[1]; } // get article name from title= url parameter else if (urlPar != ) { regExpMatch = /(^|&)title=([^&]+)/.exec(urlPar); if (regExpMatch != null) { linkArticle = regExpMatch[2]; linkArticle = linkArticle.replace(/_/g, ' '); linkArticle = decodeURIComponent(linkArticle); // ISBN links regExpMatch = /(^|&)isbn=(\\d+)/.exec(urlPar); if (regExpMatch != null) { var isbn = regExpMatch[2]; regExpMatch = /((\d\-?){13}|(\d\-?){10})/.exec(linkText); if (regExpMatch != null) { isbn = regExpMatch[1]; } return('ISBN ' + isbn); } } } } } // format wiki link if (linkArticle != ) { // check for wiki image regExpStr = '^<img\\b[^>]*?\\bwidth=\\"(\\d+)\\"[^>]*?>$'; regExp = new RegExp(regExpStr); regExpMatch = regExp.exec(linkText); if (regExpMatch != null) { imgWidth = regExpMatch[1]; imgWidth = '|' + imgWidth + 'px'; if ( (linkTitle != ) && (linkTitle != 'Enlarge') ) { linkTitle = '|' + linkTitle; return('' + linkArticle + imgWidth + linkTitle + ''); } else { return('' + linkArticle + imgWidth + ''); } } // category link var regExp = new RegExp('^' + wikEdText['wikicode Category'] + ':(.*)','i'); regExpMatch = regExp.exec(linkArticle); if (regExpMatch != null) { return('[[' + wikEdText['wikicode Category'] + ':' + regExpMatch[1].substr(0, 1).toUpperCase() + linkText.substr(1) + ']]'); } // wiki link if (linkArticle == linkText.substr(0, 1).toUpperCase() + linkText.substr(1)) { return('' + linkText + ''); } // date link (English only) regExpMatch = /^(January|February|March|April|May|June|July|August|September|October|November|December) (\d{1,2})$/.exec(linkArticle); if (regExpMatch != null) { var month = regExpMatch[1]; var day = regExpMatch[2]; if (linkText == (day + ' ' + month) ) { return('' + linkArticle + ''); } } // lowercase the article name if the first char of the link text can exist in lower/uppercase and is lowercase if ( linkText.substr(0, 1).toLowerCase() != linkText.substr(0, 1).toUpperCase() ) { if ( linkText.substr(0, 1) == linkText.substr(0, 1).toLowerCase() ) { linkArticle = linkArticle.substr(0, 1).toLowerCase() + linkArticle.substr(1); } } // suffix links regExpStr = '^' + linkArticle.replace(/([^\wÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9])/, '\\$1') + '([\\wÀ-ÖØ-öø-\\u0220\\u0222-\\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\\u0400-\\u0481\\u048a-\\u04ce\\u04d0-\\u04f5\\u04f8\\u04f9]+)$'; regExp = new RegExp(regExpStr); regExpMatch = regExp.exec(linkText); if (regExpMatch != null) { return('' + linkText + '' + regExpMatch[1]); } return('' + linkText + ''); } // external link regExpMatch = linkPar.match(/ href=\"([^\">]*)\"/); if (regExpMatch != null) { var linkAddr = regExpMatch[1]; if (linkAddr != ) { // PubMed link regExpMatch = /^http:\/\/www\.ncbi\.nlm\.nih\.gov\/entrez\/query\.fcgi\?cmd=Retrieve&db=pubmed&.*?&list_uids=(\d+)/.exec(linkAddr); if (regExpMatch != null) { return('PMID ' + regExpMatch[1]); } // DOI link regExpMatch = /^http:\/\/dx\.doi\.org\/(.*)/.exec(linkAddr); if (regExpMatch != null) { return('Template:doi'); } // other external link return('[' + linkAddr + ' ' + linkText + ']'); } } // return unchanged text return(p1); } ); // clean up MediaWiki category list var regExp = new RegExp('<span\\b[^>]*>(\\[\\[' + wikEdText['wikicode Category'] + ':[^\\]]+\\]\\])<\\/span>[\\s\\u0000\\|]*', 'gi'); obj.html = obj.html.replace(regExp, '$1\u0000'); // clean up DOI obj.html = obj.html.replace(/\[\[Digital object identifier\|DOI\]\]:(\{\{doi\|[^\}\s]+\}\})/gi, '$1'); // convert images obj.html = obj.html.replace(/<img\b([^>]*)>/g, function (p, p1) { // get and format parameters var address = ; var regExpMatch = /\bsrc\s*=\s*(\'|\")([^\'\"]*)(\'|\")/i.exec(p1); if (regExpMatch != null) { address = regExpMatch[2].replace(/^ +| +$/g, ); } var imgAlt = ; regExpMatch = /\balt\s*=\s*(\'|\")([^\'\"]*)(\'|\")/i.exec(p1); if (regExpMatch != null) { imgAlt = regExpMatch[2].replace(/^ +| +$/g, ); imgAlt = imgAlt.replace(/&nbsp;|[\n\u0000]/g, ' '); imgAlt = imgAlt.replace(/ {2,}/g, ' '); imgAlt = imgAlt.replace(/^ | $/g, ); if (imgAlt != ) { imgAlt = '|' + imgAlt; } } var imgWidth = ; regExpMatch = /\bwidth\s*=\s*(\'|\")([^\'\"]*)(\'|\")/i.exec(p1); if (regExpMatch != null) { imgWidth = '|' + regExpMatch[2].replace(/^ +| +$/g, ) + 'px'; } var imgLink = ; regExpMatch = /([^\/]+)$/.exec(address); if (regExpMatch != null) { imgLink = regExpMatch[1]; if (imgLink != ) { return('[[' + wikEdText['wikicode Image'] + ':' + imgLink + imgWidth + imgAlt + ']]'); } } return(); } ); // convert lists: * # : ; var listObj = {}; listObj.prefix = ; obj.html = obj.html.replace(/[\s\u0000]*<(\/?(ol|ul|li|dl|dd|dt))\b[^>]*>[\s\u0000]*/g, function (p, p1, p2, p3, p4) { switch (p1.toLowerCase()) { case 'ol': listObj.prefix += '#'; return('\u0000'); case 'ul': listObj.prefix += '*'; return('\u0000'); case 'dl': listObj.prefix += ':'; return('\u0000'); case '/ol': case '/ul': case '/dl': listObj.prefix = listObj.prefix.substr(0, listObj.prefix.length - 1); return('\u0000\u0000'); case 'li': case 'dd': return('\u0000' + listObj.prefix + ' '); case 'dt': return('\u0000' + listObj.prefix.replace(/:$/, ';') + ' '); case '/li': case '/dt': case '/dd': return(); } 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 + '>'); } ); // unformat italic or bold blanks obj.html = obj.html.replace(/\'\'\'([\s\u0000]+)\'\'\'/g, '$1'); obj.html = obj.html.replace(/\'\'([\s\u0000]+)\'\'/g, '$1'); // 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 trailing linebreaks from table cells obj.html = obj.html.replace(/\u0000{2,}(\|)/g, '\u0000$1'); // remove leading and trailing spaces obj.html = obj.html.replace(/>\s+\u0000/g, '>\u0000'); obj.html = obj.html.replace(/\u0000\s+</g, '\u0000<'); // remove empty inline and block tag pairs obj.html = obj.html.replace(/( *)<(big|colgroup|code|del|font|ins|pre|s|small|span|strike|sub|sup|tt|u|rb|rp|rt|ruby|nowiki)\b[^>]*><\/\1> */g, '$1'); obj.html = obj.html.replace(/[\s\u0000]*<(blockquote|center|div|math|gallery|noinclude|includeonly|ref|references)\b[^>]*><\/\1>[\s\u0000]*/g, '\u0000\u0000'); // remove empty lines from div tags obj.html = obj.html.replace(/(<div\b[^>]*>)[\s\u0000]+/g, '$1'); obj.html = obj.html.replace(/[\s\u0000]+(<\/div>)/g, '$1'); // escape < > obj.html = obj.html.replace(/</g, '<'); obj.html = obj.html.replace(/>/g, '>'); // newlines to
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, '
'); // remove empty lines from article start and end if (obj.from == 'whole') { obj.html = obj.html.replace(/^(<br\b[^>]*>)+/g, ); obj.html = obj.html.replace(/(<br\b[^>]*>)+$/g, ); } return; } // // WikEdSanitizeAttributes: see Sanitizer.php // function WikEdSanitizeAttributes(tag, attributes, relaxed) { var common; var tablealign; var tablecell; var table; if (relaxed == true) { common = 'lang|dir|style|class'; // not needed: id|title tablealign = '|align|char|charoff|valign'; table = '|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor'; tablecell = '|abbr|axis|headers|scope|rowspan|colspan|nowrap|width|height|bgcolor'; } else { common = 'lang|dir'; table = '|border|cellspacing|cellpadding|align|bgcolor'; tablealign = '|align|valign'; tablecell = '|rowspan|colspan|nowrap|bgcolor'; } tag = tag.toLowerCase(); var sanitized = ; var regExp = /(\w+)\s*=\s*(\'|\")([^\'\"]*)(\'|\")/g; var regExpMatch; while ( (regExpMatch = regExp.exec(attributes)) != null) { var attrib = regExpMatch[1]; var attribValue = regExpMatch[3]; if (attribValue == ) { continue; } var valid = false; // relaxed, for existing text tags 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) { } else if ('gallery'.indexOf(tag) >= 0) { if ((common + '|perrow|widths|heights').indexOf(attrib) >= 0) { valid = true; } } } // strict, for html code to be wikified from external sources (websites, Word) 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) { } else if ('gallery'.indexOf(tag) >= 0) { } } // clean up if (valid == true) { // clean up defaults for align if (attrib == 'align') { if ('tr|td|th'.indexOf(tag) >= 0) { if (attribValue == 'left') { attribValue = ; } } } // clean up defaults for valign else if (attrib == 'valign') { if ('tr|td|th'.indexOf(tag) >= 0) { if (attribValue == 'top') { attribValue = ; } } } // clean up style else if (attrib == 'style') { // remove non-standard Mozilla styles attribValue = attribValue.replace(/(^| )(-moz-[\w\-]+): [\w\-]+; */g, '$1'); attribValue = attribValue.replace(/(^| )([\w\-]+): [^;]*(-moz-[\w\-]+|windowtext)[^;]*; */g, '$1'); // remove dimensions from null values attribValue = attribValue.replace(/\b0(%|in|cm|mm|em|ex|pt|pc|px)\b/g, '0'); // remove empty definitions and spaces attribValue = attribValue.replace(/[\w\-]+ *\: *\; */g, ); attribValue = attribValue.replace(/ *(;|:) */g, '$1 '); attribValue = attribValue.replace(/( |;)+$/g, ';'); } // clean up class else if (attrib == 'class') { // remove MS Word classes attribValue = attribValue.replace(/^Ms.*$/g, ); } if (attribValue != ) { sanitized += ' ' + attrib + '="' + attribValue + '"'; } } } return(sanitized); } // // // WikEdRemoveHighlighting: remove syntax highlighting in obj.html; sets obj.htmlCode if text contains html code // expects
instead of \n function WikEdRemoveHighlighting(obj) { // remove highlighting and atttribute-free span tags var isRemove = []; obj.html = obj.html.replace(/(<(\/?)span\b([^>]*)>)/g, function (p, p1, p2, p3) { if (p2 == ) { if (/\bclass=\"wikEd\w+\"/.test(p3)) { isRemove.push(true); return(); } isRemove.push(false); return(p1); } if (isRemove.pop() == true) { return(); } return(p1); } ); // remove highlighting div tags var isRemove = []; obj.html = obj.html.replace(/(<(\/?)div\b([^>]*)>)/g, function (p, p1, p2, p3) { if (p2 == ) { if (/\bclass=\"wikEd\w+\"/.test(p3)) { isRemove.push(true); return(); } isRemove.push(false); return(p1); } if (isRemove.pop() == true) { return(); } return(p1); } ); // remove highlighting pre tags var isRemove = []; obj.html = obj.html.replace(/(<(\/?)pre\b([^>]*)>)/g, function (p, p1, p2, p3) { if (p2 == ) { if (/\bclass=\"wikEd\w+\"/.test(p3)) { isRemove.push(true); return(); } isRemove.push(false); return(p1); } if (isRemove.pop() == true) { return(); } return(p1); } ); // comments obj.html = obj.html.replace(//g, ); // newlines obj.html = obj.html.replace(/[\n\r ]+/g, ' '); // non-breaking spaces obj.html = obj.html.replace(/ /g, '\u00a0'); // 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 < > < > & \u00a0 instead of   \n instead of
function WikEdHighlightSyntax(obj, singleLine) { // < and > to \u0000 and \u0001 obj.html = obj.html.replace(/</g, '\u0000'); obj.html = obj.html.replace(/>/g, '\u0001'); // #redirect obj.html = obj.html.replace(/(^|\n)(#)(redirect\b)/g, '$1$3'); // nowiki (no html highlighting) obj.html = obj.html.replace(/(\u0000nowiki\b.*?\u0001)(.*?)(\u0000\/nowiki\b.*?\u0001)/gi, function (p, p1, p2, p3) { p2 = p2.replace(/\u0000/g, '<'); p2 = p2.replace(/\u0001/g, '>'); return(p1 + p2 + p3); } ); // blocks // lists * # : ; obj.html = obj.html.replace(/^([\*\#\:\;]+)(.*?)$/gm, '$1$2'); if (singleLine != true) { obj.html = obj.html.replace(/(([^\n]*\n)+)/g, '$1'); obj.html = obj.html.replace(/([^\n]*)(\n)(?!)/g, '$1$2'); } // #redirect (finish) obj.html = obj.html.replace(/()(.*?<\/span>)/g, '$1#$2'); // various blocks if (singleLine != true) { obj.html = obj.html.replace(/(\u0000(blockquote|center|div|pre|timeline|imagemap)\b[^\u0001]*\u0001.*?\u0000\/\2\u0001)/gi, '$1'); } // space-pre if (singleLine != true) { obj.html = obj.html.replace(/^[\u00a0 ]([\u00a0 ]*)(.*?)$/gm, ' $1$2'); obj.html = obj.html.replace(/(([^\n]*\n)+)/g, '$1'); obj.html = obj.html.replace(/([^\n]*)(\n)(?!)/g, '$1$2'); } // ----
horizontal rule
   obj.html = obj.html.replace(/(^|\n|<[^>]*>)(----)(\n|<[^>]*>|$)/g, '$1$2$3');
   obj.html = obj.html.replace(/(\u0000hr\u0001)/g, '$1');

// == headings

   obj.html = obj.html.replace(/(^|\n|<[^>]*>)(=+[\u00a0 ]*)([^\n]*?)([\u00a0 ]*=+)(?=([\u00a0 ]|<[^>]*>)*(\n|$))/g,
       function (p, p1, p2, p3, p4) {
           p2 = p2.replace(/(=+)/g, '$1');
           p4 = p4.replace(/(=+)/g, '$1');
           if ( /^(external links?|see also|references?)$/i.test(p3) ) {
               p1 = p1 + '';
               p4 = p4 + '';
           }
           else {
               p1 = p1 + '';
               p4 = p4 + '';
           }
           return(p1 + p2 + p3 + p4);
       }
   );

// tables {| |+ |-  ! |} |

   obj.html = obj.html.replace(/^(\{\||\|\+|\|\-|\!|\|\}([^\}]|$)|\|)(.*?)$/gm, '$1$3');
   if (singleLine != true) {
       obj.html = obj.html.replace(/(^|\n)((<[^>]*>)*\{\|)/g, '$1$2');
       obj.html = obj.html.replace(/(^|\n)((<[^>]*>)*\|\}(<[^>]*>)*)/g, '$1$2');
       obj.html = obj.html.replace(/(\u0000table\b[^\u0001]*\u0001)/gi, '$1');
       obj.html = obj.html.replace(/(\u0000\/table\u0001)/gi, '$1');
   }

// <gallery> wiki markup

   if (singleLine != true) {
       obj.html = obj.html.replace(/(\u0000(gallery)\b[^\u0001]*\u0001)/gi, '$1');
       obj.html = obj.html.replace(/(\u0000\/(gallery)\u0001)/gi, '$1');
   }

// various block tags

   obj.html = obj.html.replace(/(\u0000\/?(blockquote|center|div|pre|timeline|imagemap)\b[^\u0001]*\u0001)/gi, '$1');
//

...

pairs with (wikEdBlockTag) and withhout attributes (wikEdUnknown)
   var isRemove = [];
   obj.html = obj.html.replace(/(\u0000(\/?)p\b([^\u0001]*?)\u0001)/g,
       function (p, p1, p2, p3) {
           if (p2 == ) {
               if (p3 == ) {
                   isRemove.push(true);
                   return('' + p1 + '');
               }
               if (/\/$/.test(p3)) {
                   return('' + p1 + '');
               }
               isRemove.push(false);
               return('' + p1 + '');
           }
           if (isRemove.pop() == true) {
               return('' + p1 + '');
           }
           return('' + p1 + '');
       }
   );

// inline elements

// magic words

   obj.html = obj.html.replace(/(__(NOTOC|FORCETOC|TOC|NOEDITSECTION|NEWSECTIONLINK|NOCONTENTCONVERT|NOCC|NOGALLERY|NOTITLECONVERT|NOTC|END|START)__)/gi, '$1');

//

   obj.html = obj.html.replace(/(\u0000sup\b[^\u0001]*\u0001((.|\n)*?)\u0000\/sup\u0001)/gi, '$1');
   obj.html = obj.html.replace(/(\u0000sub\b[^\u0001]*\u0001((.|\n)*?)\u0000\/sub\u0001)/gi, '$1');
   obj.html = obj.html.replace(/(\u0000(ins|u)\b[^\u0001]*\u0001((.|\n)*?)\u0000\/(ins|u)\u0001)/gi, '$1');
   obj.html = obj.html.replace(/(\u0000(del|s|strike)\b[^\u0001]*\u0001((.|\n)*?)\u0000\/(del|s|strike)\u0001)/gi, '$1');

// Cite error: The opening <ref> tag is malformed or has a bad name and <ref> wiki markup

   if (wikEdRefHide != true) {
       obj.html = obj.html.replace(/\u0000(ref\b[^\u0001]*?\/)\u0001/gi, '<$1>');
       obj.html = obj.html.replace(/(\u0000ref\b[^\u0001]*\u0001((.|\n)*?)\u0000\/ref\u0001)/gi, '$1');
   }

// various inline tags

   obj.html = obj.html.replace(/(\u0000\/?(sub|sup|ins|u|del|s|strike|big|br|colgroup|code|font|small|span|tt|rb|rp|rt|ruby|ref)\b[^\u0001]*\u0001)/gi, '$1');

// wiki markup

   obj.html = obj.html.replace(/\u0000((references)\b[^\u0001]*?\/)\u0001/gi, '<$1>');

// <math>