Jump to content

User:Hashc0de/monobook.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/* <pre><nowiki> */

/*
Name:      wikEd (wikEd.js)
Version:   wikEd 0.9 (beta) (November, 2006). The code is currently under active development and might change rapidly
Update:    press SHIFT-Reload to update to the newest version
Homepage:  http://en.wikipedia.org/wiki/User:Cacycle/wikEd
Help:      http://en.wikipedia.org/wiki/User:Cacycle/wikEd_Help
Code:      http://en.wikipedia.org/wiki/User:Cacycle/wikEd.js
Author:    Cacycle (http://en.wikipedia.org/wiki/User:Cacycle)
Bugs:      surprisingly functional
Browsers:  The program works ONLY for Mozilla-based browsers (Mozilla, Mozilla Firefox, and Mozilla SeaMonkey)
License:   This code has been released into the public domain
What:      Comfortable JavaScript editor for Wikipedia and other MediaWikis
Important: This file might have to be saved as UTF-16 in order to preserve certain Unicode characters
*/

var wikEdProgramHomepage = 'http://en.wikipedia.org/wiki/User:Cacycle/wikEd';
var wikEdProgramVersion  = '0.9.7 (beta)';
var wikEdProgramDate     = 'November 14, 2006';


//
// user configurable variables
//


// CSS rules edit frame
var wikEdFrameCSS = wikEdFrameCSS || [];

wikEdFrameCSS['body']                      = wikEdFrameCSS['body']                      || 'background: #FFFFFF; margin: 0px; padding: 0.2em; overflow: -moz-scrollbars-vertical; overflow-x: auto; font-family: monospace;';

// syntax highlighting
wikEdFrameCSS['.wikEdBlock']               = wikEdFrameCSS['.wikEdBlock']               || 'background-color: #e8e8e8;';
wikEdFrameCSS['.wikEdBlockTag']            = wikEdFrameCSS['.wikEdBlockTag']            || 'color: #0000e0;';
wikEdFrameCSS['.wikEdInlineTag']           = wikEdFrameCSS['.wikEdInlineTag']           || 'color: #0000e0;';
wikEdFrameCSS['.wikEdUnknown']             = wikEdFrameCSS['.wikEdUnknown']             || 'background-image: url({wikEdUnknown});';
wikEdFrameCSS['.wikEdSubscript']           = wikEdFrameCSS['.wikEdSubscript']           || 'position: relative; top: 0.3em;';
wikEdFrameCSS['.wikEdSuperscript']         = wikEdFrameCSS['.wikEdSuperscript']         || 'position: relative; top: -0.3em;';
wikEdFrameCSS['.wikEdBold']                = wikEdFrameCSS['.wikEdBold']                || 'font-weight: bold;';
wikEdFrameCSS['.wikEdComment']             = wikEdFrameCSS['.wikEdComment']             || 'background-color: #fff0d0;';
wikEdFrameCSS['.wikEdDel']                 = wikEdFrameCSS['.wikEdDel']                 || 'text-decoration: line-through;';
wikEdFrameCSS['.wikEdIns']                 = wikEdFrameCSS['.wikEdIns']                 || 'text-decoration: underline;';
wikEdFrameCSS['.wikEdItalic']              = wikEdFrameCSS['.wikEdItalic']              || 'font-style: italic;';
wikEdFrameCSS['.wikEdRGB']                 = wikEdFrameCSS['.wikEdRGB']                 || '';

// horizontal rule
wikEdFrameCSS['.wikEdHR']                  = wikEdFrameCSS['.wikEdHR']                  || 'background-color: #d0d0d0;';
wikEdFrameCSS['.wikEdHRInline']            = wikEdFrameCSS['.wikEdHRInline']            || 'background-color: #d0d0d0;';

// wiki code
wikEdFrameCSS['.wikEdWiki']                = wikEdFrameCSS['.wikEdWiki']                || 'color: #0000e0;';
wikEdFrameCSS['.wikEdWikiRedir']           = wikEdFrameCSS['.wikEdWikiRedir']           || 'color: #0000e0; background-color: #ffffff; font-weight: bold;';

// headings
wikEdFrameCSS['.wikEdHeading']             = wikEdFrameCSS['.wikEdHeading']             || 'background-color: #e0e0e0; font-weight: bold;';
wikEdFrameCSS['.wikEdHeadingWp']           = wikEdFrameCSS['.wikEdHeadingWp']           || 'background-color: #d8e0ff; font-weight: bold;';

// tables
wikEdFrameCSS['.wikEdTableBlock']          = wikEdFrameCSS['.wikEdTableBlock']          || 'background-color: #e8e8e8;';
wikEdFrameCSS['.wikEdTableLine']           = wikEdFrameCSS['.wikEdTableLine']           || 'background-color: #e8e8e8;';
wikEdFrameCSS['.wikEdTableTag']            = wikEdFrameCSS['.wikEdTableTag']            || 'background-color: #e8e8e8; color: #0000e0;';

// list
wikEdFrameCSS['.wikEdListBlock']           = wikEdFrameCSS['.wikEdListBlock']           || 'background-color: #e8e8e8;';
wikEdFrameCSS['.wikEdListLine']            = wikEdFrameCSS['.wikEdListLine']            || 'background-color: #f0f0f0';
wikEdFrameCSS['.wikEdListTag']             = wikEdFrameCSS['.wikEdListTag']             || 'background-color: #e8e8e8; color: #0000e0; font-weight: bold;';

// space-pre
wikEdFrameCSS['.wikEdSpaceBlock']          = wikEdFrameCSS['.wikEdSpaceBlock']          || 'background-color: #e8e8e8;';
wikEdFrameCSS['.wikEdSpaceLine']           = wikEdFrameCSS['.wikEdSpaceLine']           || 'background-color: #e8e8e8;';
wikEdFrameCSS['.wikEdSpaceTag']            = wikEdFrameCSS['.wikEdSpaceTag']            || 'color: #0000e0; font-weight: bold;';

// wiki links, images, categories, templates
wikEdFrameCSS['.wikEdLinkTag']             = wikEdFrameCSS['.wikEdLinkTag']             || 'color: #0000e0;';
wikEdFrameCSS['.wikEdLink']                = wikEdFrameCSS['.wikEdLink']                || '';
wikEdFrameCSS['.wikEdImage']               = wikEdFrameCSS['.wikEdImage']               || 'background-color: #d5ffaa;';
wikEdFrameCSS['.wikEdCat']                 = wikEdFrameCSS['.wikEdCat']                 || 'background-color: #d0d8ff;';
wikEdFrameCSS['.wikEdTempl']               = wikEdFrameCSS['.wikEdTempl']               || 'background-color: #e0e8ff;';

// interlanguage
wikEdFrameCSS['.wikEdInter']               = wikEdFrameCSS['.wikEdInter']               || '';
wikEdFrameCSS['.wikEdLinkInter']           = wikEdFrameCSS['.wikEdLinkInter']           || 'background-color: #c8c8ff;';
wikEdFrameCSS['.wikEdImageInter']          = wikEdFrameCSS['.wikEdImageInter']          || 'background-color: #c8c8ff;';
wikEdFrameCSS['.wikEdCatInter']            = wikEdFrameCSS['.wikEdCatInter']            || 'background-color: #c8c8ff;';
wikEdFrameCSS['.wikEdTemplInter']          = wikEdFrameCSS['.wikEdTemplInter']          || 'background-color: #c8c8ff;';

// name
wikEdFrameCSS['.wikEdLinkName']            = wikEdFrameCSS['.wikEdLinkName']            || 'color: #f00000; font-weight: bold;';
wikEdFrameCSS['.wikEdImageName']           = wikEdFrameCSS['.wikEdImageName']           || 'font-weight: bold;';
wikEdFrameCSS['.wikEdCatName']             = wikEdFrameCSS['.wikEdCatName']             || 'color: #f00000; font-weight: bold;';
wikEdFrameCSS['.wikEdTemplName']           = wikEdFrameCSS['.wikEdTemplName']           || 'color: #f00000; font-weight: bold;';
wikEdFrameCSS['.wikEdURLLink']             = wikEdFrameCSS['.wikEdURLLink']             || 'color: #f00000; font-weight: bold;';

// text and parameters
wikEdFrameCSS['.wikEdLinkText']            = wikEdFrameCSS['.wikEdLinkText']            || 'font-weight: bold;';
wikEdFrameCSS['.wikEdImageText']           = wikEdFrameCSS['.wikEdImageText']           || '';
wikEdFrameCSS['.wikEdCatText']             = wikEdFrameCSS['.wikEdCatText']             || '';
wikEdFrameCSS['.wikEdTemplText']           = wikEdFrameCSS['.wikEdTemplText']           || '';
wikEdFrameCSS['.wikEdURLText']             = wikEdFrameCSS['.wikEdURLText']             || 'font-weight: bold;';

// insert wikicode here
wikEdFrameCSS['.wikEdInsertHere']          = wikEdFrameCSS['.wikEdInsertHere']          || 'background-color: orange; font-style: italic;';

// invisibles, control chars, and strange spaces
wikEdFrameCSS['.wikEdTab']                 = wikEdFrameCSS['.wikEdTab']                 || 'background-image: url({wikEdTab}); background-position: right bottom; background-repeat: no-repeat; display: inline;';
wikEdFrameCSS['.wikEdTabPlain']            = wikEdFrameCSS['.wikEdTabPlain']            || 'display: inline;';
wikEdFrameCSS['.wikEdCtrl']                = wikEdFrameCSS['.wikEdControl']             || 'background-image: url({wikEdCtrl}); background-position: left center; background-repeat: repeat-x; background-color: white; display: inline;';
wikEdFrameCSS['.wikEdCtrl:before']         = wikEdFrameCSS['.wikEdCtrl:before']         || 'content: \'\u00a0\'';
wikEdFrameCSS['.wikEdBlank']               = wikEdFrameCSS['.wikEdControl']             || 'background-image: url({wikEdBlank}); background-position: left center; background-repeat: repeat-x; background-color: white; display: inline;';

// CSS rules main window
var wikEdMainCSS = wikEdMainCSS || [];
wikEdMainCSS['.wikEdCombo']                = wikEdMainCSS['.wikEdCombo']                || 'font-size: smaller; padding-left: 0.1em; padding-right: 0.1em; margin-left: 0.1em; margin-right: 0.1em; height: 1.6em; vertical-align: bottom;';

// wikEd button areas
wikEdMainCSS['.wikEdButtonsFormat']        = wikEdMainCSS['.wikEdButtonsFormat']        || 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0.2em  0.6em 0 0    ; float: left;';
wikEdMainCSS['.wikEdButtonsFind']          = wikEdMainCSS['.wikEdButtonsFind']          || 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0.2em  0.6em 0 0    ; float: left;';
wikEdMainCSS['.wikEdButtonsFix']           = wikEdMainCSS['.wikEdButtonsFix']           || 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0.2em  0.6em 0 0    ; float: left';
wikEdMainCSS['.wikEdButtonsControl']       = wikEdMainCSS['.wikEdButtonsControl']       || 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: 0.2em  0     0 0    ; float: right;';
wikEdMainCSS['.wikEdButtonsPreview']       = wikEdMainCSS['.wikEdButtonsPreview']       || 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: -0.2em 0     0 0.6em; float: right;';
wikEdMainCSS['.wikEdButtonsPreviewFull']   = wikEdMainCSS['.wikEdButtonsPreviewFull']   || 'background: #d4d0cc; border: 1px black solid; padding: 0.1em; margin: -0.2em 0     0 0.6em; float: right;';

// wikEd buttons
wikEdMainCSS['.wikEdButton']               = wikEdMainCSS['.wikEdButton']               || 'vertical-align: text-top; font-size: small; text-decoration: underline; margin: 1px 2px; padding: 0; background: #d4d0cc; border: 1px #d4d0cc solid; cursor: pointer;';
wikEdMainCSS['.wikEdButton:hover']         = wikEdMainCSS['.wikEdButton:hover']         || 'background: #e4e0dd; border: 1px outset; cursor: pointer;';
wikEdMainCSS['.wikEdButton:active']        = wikEdMainCSS['.wikEdButton:active']        || 'background: #e4e0dc; border: 1px inset;  cursor: pointer;';
wikEdMainCSS['.wikEdButtonFloat']          = wikEdMainCSS['.wikEdButtonFloat']          || 'background: #d4d0cc; border: 1px outset; cursor: pointer; display: none; position: absolute; z-index: 5;';
wikEdMainCSS['.wikEdButtonChecked']        = wikEdMainCSS['.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;';
wikEdMainCSS['.wikEdButtonUnchecked']      = wikEdMainCSS['.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;';
wikEdMainCSS['.wikEdButtonPressed']        = wikEdMainCSS['.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;';
wikEdMainCSS['.wikEdButtonInactive']       = wikEdMainCSS['.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';
wikEdMainCSS['.wikEdLocalPreview']         = wikEdMainCSS['.wikEdLocalPreview']         || 'vertical-align: top; margin: 0 0.33em 0 0.15em; padding: 0;';
wikEdMainCSS['.wikEdLocalDiff']            = wikEdMainCSS['.wikEdLocalDiff']            || 'vertical-align: top; margin: 0 0.33em 0 -0.18em; padding: 0;';
wikEdMainCSS['.wikEdClearSummary']         = wikEdMainCSS['.wikEdClearSummary']         || 'vertical-align: middle; margin: 0 0.1em 0 0.5em; padding: 0 0 0.2em 0;';

// preview box
wikEdMainCSS['.wikEdPreviewBoxOuter']      = wikEdMainCSS['.wikEdPreviewBoxOuter']      || 'clear: both; margin-top: 0.5em; margin-bottom: 0; border-width: 1px; border-style: solid; border-color: #808080 #d0d0d0 #d0d0d0 #808080;';
wikEdMainCSS['.wikEdPreviewBox']           = wikEdMainCSS['.wikEdPreviewBox']           || 'background-color: #f9f9f9; padding: 5px; border-width: 1px; border-style: solid; border-color: #404040 #ffffff #ffffff #404040;';

// find field
wikEdMainCSS['.wikEdFindComboInput']       = wikEdMainCSS['.wikEdFindComboInput']       || 'position: relative; padding: 0; margin: 0 0.2em; font-style: normal;';
wikEdMainCSS['#wikEdFindText']             = wikEdMainCSS['#wikEdFindText']             || 'height: 1.4em; font-family: monospace; padding: 0; margin: 0; position: absolute; left: 0; top: 0; z-index: 2;';
wikEdMainCSS['#wikEdFindSelect']           = wikEdMainCSS['#wikEdFindSelect']           || 'height: 1.5em; font-family: monospace; border: none; padding: 0; margin: 0; position: relative; vertical-align: baseline; z-index: 1;';

// replace field
wikEdMainCSS['.wikEdReplaceComboInput']    = wikEdMainCSS['.wikEdReplaceComboInput']    || 'position: relative; padding: 0; margin: 0 0.2em; font-style: normal;';
wikEdMainCSS['#wikEdReplaceText']          = wikEdMainCSS['#wikEdReplaceText']          || 'height: 1.4em; font-family: monospace; padding: 0; margin: 0; position: absolute; left: 0; top: 0; z-index: 2;';
wikEdMainCSS['#wikEdReplaceSelect']        = wikEdMainCSS['#wikEdReplaceSelect']        || 'height: 1.5em; font-family: monospace; border: none; padding: 0; margin: 0; position: relative; vertical-align: baseline; z-index: 1;';

// summary field
wikEdMainCSS['.wikEdSummaryComboInput']    = wikEdMainCSS['.wikEdSummaryComboInput']    || 'position: relative;';
wikEdMainCSS['#wpSummary']                 = wikEdMainCSS['#wpSummary']                 || 'padding: 0; margin: 0; position: absolute; left: 0; top: 0; z-index: 2; width: auto;';
wikEdMainCSS['#wpSummarySelect']           = wikEdMainCSS['#wpSummarySelect']           || 'border: none; padding: 0; margin: 0; position: relative; vertical-align: middle; z-index: 1;';

// space around submit buttons
wikEdMainCSS['.editButtons']               = wikEdMainCSS['.editButtons']               || 'margin-top: 0.5em; margin-bottom: 0.5em;';

// frame
wikEdMainCSS['.wikEdFrameOuter']           = wikEdMainCSS['.wikEdFrameOuter']           || 'width: 100%; margin-top: 0.5em; margin-bottom: 0.1em; border-width: 1px; border-style: solid; border-color: #808080 #d0d0d0 #d0d0d0 #808080;';
wikEdMainCSS['.wikEdFrameInner']           = wikEdMainCSS['.wikEdFrameInner']           || 'padding: 0; border-width: 1px; border-style: solid; border-color: #404040 #ffffff #ffffff #404040;';
wikEdMainCSS['#wikEdFrame']                = wikEdMainCSS['#wikEdFrame']                || 'width: 100%; padding: 0; margin: 0; border: none;';

// various
wikEdMainCSS['.wikEdHelpSpan']             = wikEdMainCSS['.wikEdHelpSpan']             || '';

// summary
wikEdMainCSS['.wikEdSummaryWrapper']       = wikEdMainCSS['.wikEdSummaryWrapper']       || 'margin: 0.25em 0 0.4em 0;';
wikEdMainCSS['#wpSummaryLabel']            = wikEdMainCSS['#wpSummaryLabel']            || 'margin-right: 0.2em';
wikEdMainCSS['.editOptions']               = wikEdMainCSS['.editOptions']               || 'position: relative; top: 0.1em;';

// input wrapper
wikEdMainCSS['.wikEdInputWrapper']         = wikEdMainCSS['.wikEdInputWrapper']         || '';
wikEdMainCSS['.wikEdInputWrapperFull']     = wikEdMainCSS['.wikEdInputWrapperFull']     || 'position: fixed; top: 0; left: 0; right: 0; padding: 4px; background: white;';

// other wrappers
wikEdMainCSS['.wikEdToolbarWrapper']       = wikEdMainCSS['.wikEdToolbarWrapper']       || '';
wikEdMainCSS['.wikEdTextareaWrapper']      = wikEdMainCSS['.wikEdTextareaWrapper']      || '';
wikEdMainCSS['.wikEdFrameWrapper']         = wikEdMainCSS['.wikEdFrameWrapper']         || '';
wikEdMainCSS['.wikEdConsoleWrapper']       = wikEdMainCSS['.wikEdConsoleWrapper']       || '';
wikEdMainCSS['.wikEdButtonsWrapper']       = wikEdMainCSS['.wikEdButtonsWrapper']       || '';
wikEdMainCSS['.wikEdSubmitWrapper']        = wikEdMainCSS['.wikEdSubmitWrapper']        || '';
wikEdMainCSS['.wikEdSubmitButtonsWrapper'] = wikEdMainCSS['.wikEdSubmitButtonsWrapper'] || '';
wikEdMainCSS['.wikEdPreviewWrapper']       = wikEdMainCSS['.wikEdPreviewWrapper']       || '';
wikEdMainCSS['.wikEdInsertWrapper']        = wikEdMainCSS['.wikEdInsertWrapper']        || '';

// general settings


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

// presets for combo input fields dropdown options, {wikEdUsing} appends a link to this script
var wikEdComboPresetOptions = wikEdComboPresetOptions || [];
wikEdComboPresetOptions['summary'] = wikEdComboPresetOptions['summary'] || [
	'copyedit',
	'reply',
	'article created',
	'intro rewrite',
	'linkfix',
	'fixing typos',
	'removing linkspam',
	'reverting test',
	'reverting vandalism',
	'formatting source text',
	'({wikEdUsing})'
];

// text for summary link to this script
var wikEdSummaryUsing = wikEdSummaryUsing || 'using [[User:Cacycle/wikEd|wikEd]]';

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

// find ahead as you type checkbox preset
var wikEdFindAheadSelected = wikEdFindAheadSelected || true;

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

// enable wikEd preset
var useWikEd = useWikEd || true;

// use local copies of images for testing (set to true in local copy of edit page)
var wikEdUseLocalImages = wikEdUseLocalImages;

// path to local images used by wikEd for testing
var wikEdImagePathLocal = wikEdImagePathLocal || 'file:///D:/wikEd/images/';

// path to images used by wikEd
var wikEdImagePath = wikEdImagePath || '/media/wikipedia/commons/';

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

// remove invisible syntax highlighting comments after closing tag
var wikEdRemoveHighlightComments = wikEdRemoveHighlightComments || true;

// show the edit toolbar when the rich-text edit frame is active
var wikEdShowToolbar = wikEdShowToolbar || true;

// show the text-to-source button for testing purposes
var wikEdShowSourceButton = wikEdShowSourceButton || true;

// remove linebreak before minor edit checkbox
var wikEdNoLinebreak = wikEdNoLinebreak || true;

// show the text-to-source button for testing purposes
var wikEdHelpPageLink = wikEdHelpPageLink || ' | <a href="/wiki/User:Cacycle/wikEd_Help" target="helpwindow">wikEd_Help</a>';

// image filenames
var wikEdImage = wikEdImage || [];
wikEdImage['blank']           = wikEdImage['blank']           || wikEdImagePath + '5/51/WikEd_blank.png';
wikEdImage['bold']            = wikEdImage['bold']            || wikEdImagePath + '5/59/WikEd_bold.png';
wikEdImage['bulletList']      = wikEdImage['bulletList']      || wikEdImagePath + '6/62/WikEd_bullet_list.png';
wikEdImage['case']            = wikEdImage['case']            || wikEdImagePath + 'a/aa/WikEd_case.png';
wikEdImage['caseSensitive']   = wikEdImage['caseSensitive']   || wikEdImagePath + '0/0d/WikEd_case_sensitive.png';
wikEdImage['classic']         = wikEdImage['classic']         || wikEdImagePath + '9/9e/WikEd_classic.png';
wikEdImage['clearFind']       = wikEdImage['clearFind']       || wikEdImagePath + 'f/f0/WikEd_clear_find.png';
wikEdImage['clearHistory']    = wikEdImage['clearHistory']    || wikEdImagePath + 'c/c8/WikEd_clear_history.png';
wikEdImage['clearSummary']    = wikEdImage['clearSummary']    || wikEdImagePath + '2/2c/WikEd_clear_summary.png';
wikEdImage['close']           = wikEdImage['close']           || wikEdImagePath + '9/97/WikEd_close.png';
wikEdImage['ctrl']            = wikEdImage['ctrl']            || wikEdImagePath + '1/10/WikEd_ctrl.png';
wikEdImage['decreaseHeading'] = wikEdImage['decreaseHeading'] || wikEdImagePath + '7/72/WikEd_decrease_heading.png';
wikEdImage['definitionList']  = wikEdImage['definitionList']  || wikEdImagePath + 'f/f5/WikEd_definition_list.png';
wikEdImage['diff']            = wikEdImage['diff']            || wikEdImagePath + 'd/db/WikEd_diff.png';
wikEdImage['error']           = wikEdImage['error']           || wikEdImagePath + '3/3e/WikEd_error.png';
wikEdImage['findAhead']       = wikEdImage['findAhead']       || wikEdImagePath + '3/34/WikEd_find_ahead.png';
wikEdImage['findAll']         = wikEdImage['findAll']         || wikEdImagePath + '7/75/WikEd_find_all.png';
wikEdImage['findNext']        = wikEdImage['findNext']        || wikEdImagePath + 'a/ad/WikEd_find_next.png';
wikEdImage['findPrev']        = wikEdImage['findPrev']        || wikEdImagePath + 'f/f5/WikEd_find_prev.png';
wikEdImage['fixAll']          = wikEdImage['fixAll']          || wikEdImagePath + '8/86/WikEd_fix_all.png';
wikEdImage['fixBasic']        = wikEdImage['fixBasic']        || wikEdImagePath + '3/30/WikEd_fix_basic.png';
wikEdImage['fixCaps']         = wikEdImage['fixCaps']         || wikEdImagePath + '0/00/WikEd_fix_caps.png';
wikEdImage['fixUnicode']      = wikEdImage['fixUnicode']      || wikEdImagePath + 'd/d4/WikEd_fix_unicode.png';
wikEdImage['fixChem']         = wikEdImage['fixChem']         || wikEdImagePath + 'e/e7/WikEd_fix_chem.png';
wikEdImage['fixDash']         = wikEdImage['fixDash']         || wikEdImagePath + 'e/e5/WikEd_fix_dash.png';
wikEdImage['fixHtml']         = wikEdImage['fixHtml']         || wikEdImagePath + '0/05/WikEd_fix_html.png';
wikEdImage['fixMath']         = wikEdImage['fixMath']         || wikEdImagePath + '3/3f/WikEd_fix_math.png';
wikEdImage['fixPunct']        = wikEdImage['fixPunct']        || wikEdImagePath + 'd/db/WikEd_fix_punct.png';
wikEdImage['fixUnits']        = wikEdImage['fixUnits']        || wikEdImagePath + '6/69/WikEd_fix_units.png';
wikEdImage['textZoom']        = wikEdImage['textZoom']        || wikEdImagePath + '7/71/WikEd_font_size.png';
wikEdImage['fullScreen']      = wikEdImage['fullScreen']      || wikEdImagePath + 'd/d3/WikEd_fullscreen.png';
wikEdImage['getFind']         = wikEdImage['getFind']         || wikEdImagePath + '9/96/WikEd_get_selection.png';
//wikEdImage['getFindReplace']= wikEdImage['getFindReplace']  || wikEdImagePath + '9/95/WikEd_get_selection_both.png';
wikEdImage['highlightSyntax'] = wikEdImage['highlightSyntax'] || wikEdImagePath + '6/67/WikEd_syntax.png';
wikEdImage['image']           = wikEdImage['image']           || wikEdImagePath + '3/37/WikEd_image.png';
wikEdImage['increaseHeading'] = wikEdImage['increaseHeading'] || wikEdImagePath + '5/50/WikEd_increase_heading.png';
wikEdImage['indentList']      = wikEdImage['indentList']      || wikEdImagePath + '7/7a/WikEd_indent_list.png';
wikEdImage['italic']          = wikEdImage['italic']          || wikEdImagePath + 'd/d4/WikEd_italic.png';
wikEdImage['jumpTopBottom']   = wikEdImage['jumpTopBottom']   || wikEdImagePath + '5/5d/WikEd_jump_top_bottom.png';
wikEdImage['lastPos']         = wikEdImage['lastPos']         || wikEdImagePath + '5/54/WikEd_jump_next.png';
wikEdImage['logo']            = wikEdImage['logo']            || wikEdImagePath + '6/67/WikEd_logo.png';
wikEdImage['nowiki']          = wikEdImage['nowiki']          || wikEdImagePath + '5/5a/WikEd_nowiki.png';
wikEdImage['numberList']      = wikEdImage['numberList']      || wikEdImagePath + '3/3b/WikEd_number_list.png';
wikEdImage['prevPos']         = wikEdImage['prevPos']         || wikEdImagePath + 'c/c7/WikEd_jump_prev.png';
wikEdImage['preview']         = wikEdImage['preview']         || wikEdImagePath + '3/31/WikEd_preview.png';
wikEdImage['redirect']        = wikEdImage['redirect']        || wikEdImagePath + 'f/fa/WikEd_redirect.png';
wikEdImage['redo']            = wikEdImage['redo']            || wikEdImagePath + 'd/d7/WikEd_redo.png';
wikEdImage['redoAll']         = wikEdImage['redoAll']         || wikEdImagePath + '2/2d/WikEd_redo_all.png';
wikEdImage['regExp']          = wikEdImage['regExp']          || wikEdImagePath + '6/6a/WikEd_regexp.png';
wikEdImage['replaceAll']      = wikEdImage['replaceAll']      || wikEdImagePath + '2/2a/WikEd_replace_all.png';
wikEdImage['replaceNext']     = wikEdImage['replaceNext']     || wikEdImagePath + 'b/b0/WikEd_replace_next.png';
wikEdImage['replacePrev']     = wikEdImage['replacePrev']     || wikEdImagePath + 'a/a1/WikEd_replace_prev.png';
wikEdImage['scrollToButtons'] = wikEdImage['scrollToButtons'] || wikEdImagePath + '0/01/WikEd_align_buttons.png';
wikEdImage['scrollToText']    = wikEdImage['scrollToText']    || wikEdImagePath + '1/13/WikEd_align_top.png';
wikEdImage['source']          = wikEdImage['source']          || wikEdImagePath + '0/02/WikEd_source.png';
wikEdImage['strikethrough']   = wikEdImage['strikethrough']   || wikEdImagePath + '0/06/WikEd_strikethrough.png';
wikEdImage['subscript']       = wikEdImage['subscript']       || wikEdImagePath + '9/9e/WikEd_subscript.png';
wikEdImage['superscript']     = wikEdImage['superscript']     || wikEdImagePath + 'b/bf/WikEd_superscript.png';
wikEdImage['tab']             = wikEdImage['tab']             || wikEdImagePath + 'e/e7/WikEd_tab.png';
wikEdImage['table']           = wikEdImage['table']           || wikEdImagePath + 'b/bd/WikEd_table.png';
wikEdImage['textify']         = wikEdImage['textify']         || wikEdImagePath + 'c/cd/WikEd_textify.png';
wikEdImage['underline']       = wikEdImage['underline']       || wikEdImagePath + '2/21/WikEd_underline.png';
wikEdImage['undo']            = wikEdImage['undo']            || wikEdImagePath + 'e/e6/WikEd_undo.png';
wikEdImage['undoAll']         = wikEdImage['undoAll']         || wikEdImagePath + '0/08/WikEd_undo_all.png';
wikEdImage['unknown']         = wikEdImage['unknown']         || wikEdImagePath + '8/8a/WikEd_unknown.png';
wikEdImage['updateSyntax']    = wikEdImage['updateSyntax']    || wikEdImagePath + '6/67/WikEd_syntax.png';
wikEdImage['useWikEd']        = wikEdImage['useWikEd']        || wikEdImagePath + '6/67/WikEd_logo.png';
wikEdImage['webLink']         = wikEdImage['webLink']         || wikEdImagePath + '1/16/WikEd_weblink.png';
wikEdImage['wikify']          = wikEdImage['wikify']          || wikEdImagePath + '9/9f/WikEd_wikify.png';
wikEdImage['wikiLink']        = wikEdImage['wikiLink']        || wikEdImagePath + '2/21/WikEd_wikilink.png';


//
// end of user configurable variables
//


// global variables


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

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

// cache the parsed DOM object
var wikEdFrameDOMCache = null;

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

// global dom elements
var wikEdTextarea = {};
var wikEdFrame = {};
var wikEdFrameBody = {};
var wikEdFrameDocument = {};
var wikEdFrameWindow = {};

var wikEdInputWrapper = {};
var wikEdToolbarWrapper = {};
var wikEdTextareaWrapper = {};
var wikEdFrameWrapper = {};
var wikEdConsoleWrapper = {};
var wikEdButtonsWrapper = {};
var wikEdSummaryWrapper = {};
var wikEdSubmitWrapper = {};
var wikEdSubmitButtonsWrapper = {};
var wikEdPreviewWrapper = {};
var wikEdInsertWrapper = {};

var wikEdButtonsFormat = {};
var wikEdButtonsFind = {};
var wikEdButtonsFix = {};
var wikEdButtonsControl = {};
var wikEdButtonsPreview = {};
var wikEdPreviewBox = {};
var wikEdButtonsPreview2 = {};

var wikEdCaseSensitive = {};
var wikEdRegExp = {};
var wikEdFindAhead = {};

var wikEdFindText = {};
var wikEdReplaceText = {};
var wikEdSummaryText = {};

// various
var wikEdFullScreenMode = false;

var wikEdTextareaHeight;
var wikEdLastPosObj = null;

// counters
var i;
var j;


// add setup routine to addOnloadHook
if (window.addOnloadHook != null) {
	addOnloadHook(WikEdSetup);
}

// wiki file paths for use in regexps
var wikEdServer = wgServer;
var wikEdArticlePath = wgArticlePath;
var wikEdScriptPath = wgScriptPath;
wikEdServer = wikEdServer.replace(/(\W)/g, '\\$1');
wikEdArticlePath = wikEdArticlePath.replace(wgServer, '');
wikEdScriptPath = wikEdScriptPath.replace(wgServer, '');
wikEdArticlePath = wikEdArticlePath.replace(/\$1$/, '');
wikEdScriptPath = wikEdScriptPath.replace(/\/?$/, '/');;
wikEdArticlePath = wikEdArticlePath.replace(/(\W)/g, '\\$1');
wikEdScriptPath = wikEdScriptPath.replace(/(\W)/g, '\\$1');


//
// insertTags: override the insertTags function in wikibits.js
//

function insertTags(tagOpen, tagClose, sampleText) {

	if (useWikEd == true) {
		WikEdEditButton('wikEdInsertTags', [tagOpen, tagClose, sampleText]);
	}

//   apply tagOpen / tagClose to selection in textarea,
//   use sampleText instead of selection if there is none
//   taken from wikibits.js
	else {
		if (wikEdTextarea.selectionStart || wikEdTextarea.selectionStart == '0') {
			var replaced = false;
			var startPos = wikEdTextarea.selectionStart;
			var endPos = wikEdTextarea.selectionEnd;
			if (endPos - startPos) {
				replaced = true;
			}
			var scrollTop = wikEdTextarea.scrollTop;
			var myText = (wikEdTextarea.value).substring(startPos, endPos);
			if (! myText) {
				myText = sampleText;
			}

// exclude ending space char, if any
 			if (myText.charAt(myText.length - 1) == ' ') {
				subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + ' ';
			}
			else {
				subst = tagOpen + myText + tagClose;
			}
			wikEdTextarea.value = wikEdTextarea.value.substring(
				0, startPos) + subst + wikEdTextarea.value.substring(endPos, wikEdTextarea.value.length
			);
			wikEdTextarea.focus();

// set new selection
			if (replaced) {
				var cPos = startPos+(tagOpen.length + myText.length + tagClose.length);
				wikEdTextarea.selectionStart = cPos;
				wikEdTextarea.selectionEnd = cPos;
			}
			else {
				wikEdTextarea.selectionStart = startPos + tagOpen.length;
				wikEdTextarea.selectionEnd = startPos + tagOpen.length + myText.length;
			}
			wikEdTextarea.scrollTop = scrollTop;
		}

// reposition cursor if possible
		if (wikEdTextarea.createTextRange) {
			wikEdTextarea.caretPos = document.selection.createRange().duplicate();
		}
	}

	return;
}


//
// WikEdSetup: setup routine, called
//

function WikEdSetup() {

	var html = '';

// check if setup was already run
	if (document.getElementById('wikEdLogo') != null) {
		return;
	}

// insert logo into personal toolbar
	var logo = {};
	logo.img = document.createElement('img');
	logo.lnk = document.createElement('a');
	logo.lnk.href = wikEdProgramHomepage;
	logo.lnk.alt = 'WikEd Logo';
	logo.lnk.appendChild(logo.img);
	var listObj = document.createElement('li');
	listObj.id = 'wikEdLogo';
	listObj.appendChild(logo.lnk);
	var personalTools = document.getElementById('p-personal').getElementsByTagName('ul')[0];
	personalTools.appendChild(listObj);

// set error logo
	WikEdSetLogo(logo, false);

// at the moment this works only for mozilla browsers (Mozilla, Mozilla Firefox, Mozilla SeaMonkey)
	if (navigator.appName == null) {
		return;
	}
	var nameMatch = navigator.appName.match(/Netscape/i);
	if (nameMatch == null) {
		return;
	}
	var name = nameMatch[0];
	if ( (name == null) || (name == '') ) {
		return;
	}
	var version = navigator.appVersion.match(/\d+(\.\d+)/)[0];
	if ( (version == null) || (version < 5.0) ) {
		return;
	}

// check if this is an edit page
	wikEdTextarea = document.getElementById('wpTextbox1');
	if (wikEdTextarea == null) {

// reset error indicator
		WikEdSetLogo(logo);
		return;
	}

// get initial textarea height
	wikEdTextareaHeight = wikEdTextarea.offsetHeight;

// setup the undo buffers and save the original text for local changes view
	wikEdOrigVersion = wikEdTextarea.value;

// add stylesheet definitions
	var mainStyle = new WikEdStyleSheet();
	for (var rule in wikEdMainCSS) {
		mainStyle.addRule(rule, wikEdMainCSS[rule]);
	}

// rewrite image paths to local copies for testing
	if (wikEdUseLocalImages == true) {

// remove MediaWiki upload paths
		var regExpStr = '/[0-9a-f]+/[0-9a-f]+(/[\\w\\.]+)$';
		var regExp = new RegExp(regExpStr, 'g');
		for (i in wikEdImage) {
			wikEdImage[i] = wikEdImage[i].replace(regExp, '$1');
			wikEdImage[i] = wikEdImage[i].replace(wikEdImagePath, wikEdImagePathLocal);
		}
	}

// create wikEd element wrappers

// create input wrapper, this contains the whole fullscreen content
	wikEdInputWrapper = document.createElement('div');
	wikEdInputWrapper.id = 'wikEdInputWrapper';
	wikEdInputWrapper.className = 'wikEdInputWrapper';
	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';
	wikEdInputWrapper.appendChild(wikEdTextareaWrapper);

// create frame wrapper
	wikEdFrameWrapper = document.createElement('div');
	wikEdFrameWrapper.id = 'wikEdFrameWrapper';
	wikEdFrameWrapper.className = 'wikEdFrameWrapper';
	wikEdInputWrapper.appendChild(wikEdFrameWrapper);

// create console wrapper for buttons, summary, and submit
	wikEdConsoleWrapper = document.createElement('div');
	wikEdConsoleWrapper.id = 'wikEdConsoleWrapper';
	wikEdConsoleWrapper.className = 'wikEdConsoleWrapper';
	wikEdInputWrapper.appendChild(wikEdConsoleWrapper);

// create buttons wrapper for wikEd buttons
	wikEdButtonsWrapper = document.createElement('div');
	wikEdButtonsWrapper.id = 'wikEdButtonsWrapper';
	wikEdButtonsWrapper.className = 'wikEdButtonsWrapper';
	wikEdConsoleWrapper.appendChild(wikEdButtonsWrapper);

// create summary wrapper for summary, minor edit, and watch this page
	wikEdSummaryWrapper = document.createElement('div');
	wikEdSummaryWrapper.id = 'wikEdSummaryWrapper';
	wikEdSummaryWrapper.className = 'wikEdSummaryWrapper';
	wikEdConsoleWrapper.appendChild(wikEdSummaryWrapper);

// create submit wrapper for submit buttons and help links
	wikEdSubmitWrapper = document.createElement('div');
	wikEdSubmitWrapper.id = 'wikEdSubmitWrapper';
	wikEdSubmitWrapper.className = 'wikEdSubmitWrapper';
	wikEdConsoleWrapper.appendChild(wikEdSubmitWrapper);

// create submit wrapper for submit buttons and help links
	wikEdSubmitButtonsWrapper = document.createElement('div');
	wikEdSubmitButtonsWrapper.id = 'wikEdSubmitButtonsWrapper';
	wikEdSubmitButtonsWrapper.className = 'wikEdSubmitButtonsWrapper';
	wikEdSubmitWrapper.appendChild(wikEdSubmitButtonsWrapper);

// create preview wrapper for preview and diff box
	wikEdPreviewWrapper = document.createElement('div');
	wikEdPreviewWrapper.id = 'wikEdPreviewWrapper';
	wikEdPreviewWrapper.className = 'wikEdPreviewWrapper';
	wikEdPreviewWrapper.style.display = 'none';
	wikEdInputWrapper.appendChild(wikEdPreviewWrapper);

// create insert wrapper for insert special chars links
	wikEdInsertWrapper = document.createElement('div');
	wikEdInsertWrapper.id = 'wikEdInsertWrapper';
	wikEdInsertWrapper.className = 'wikEdInsertWrapper';
	wikEdInputWrapper.appendChild(wikEdInsertWrapper);

// append input wrapper to document
	wpEditform = document.getElementById('editform');
	wpEditform.insertBefore(wikEdInputWrapper, wpEditform.firstChild);

// fill the wrappers

// add toolbar to toolbar wrapper
	wpToolbar = document.getElementById('toolbar');
	if (wpToolbar != null) {
		wikEdToolbarWrapper.appendChild(wpToolbar);
	}

// call wikibits:mwSetupToolbar() now because it would terminate with an error after setting textarea to display: none
	if (useWikEd == true) {
		if (wpToolbar != null) {
			if (wpToolbar.getElementsByTagName('IMG').length == 0) {
				if (mwSetupToolbar != null) {
					mwSetupToolbar();
				}
				window.removeEventListener('load', mwSetupToolbar, false);
			}
		}
	}

// add summary elements to summary wrapper
	var summaryLabel = document.getElementById('wpSummaryLabel');
	wikEdSummaryWrapper.appendChild(summaryLabel);

	wikEdSummaryText = document.getElementById('wpSummary');
	wikEdSummaryWrapper.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);
	}

// crashes Mozilla when appended after filling the iframe
	var editOptions = document.getElementById('wpMinoredit').parentNode;
	wikEdSummaryWrapper.appendChild(editOptions);


// add textarea to textarea wrapper
	wikEdTextareaWrapper.appendChild(wikEdTextarea);

// add edit frame to frame wrapper
// any DOM changes to a starting iframe in designmode may crash the browser, including DOM move, display: none; and position: absolute;

// create the iframe
	html = '';
	html += '<div id="wikEdFrameOuter" class="wikEdFrameOuter">';
	html += '<div id="wikEdFrameInner" class="wikEdFrameInner">';
	html += '</div>';
	html += '<iframe id="wikEdFrame" name="wikEdFrame" style="height: ' + wikEdTextareaHeight + 'px;"></iframe>';
	html += '</div>';
	html += '</div>';

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

// fill the frame with content
	html = '';
	html += '<html><head></head>';
	html += '<body id="wikEdFrameBody" onload="window.document.designMode = \'on\'; window.document.execCommand(\'styleWithCSS\', false, false);">';
	html += '</body></html>';

	wikEdFrame = document.getElementById('wikEdFrame');
	wikEdFrameWindow = wikEdFrame.contentWindow;
	wikEdFrameDocument = wikEdFrameWindow.document;
	wikEdFrameDocument.open();
	wikEdFrameDocument.write(html);
	wikEdFrameDocument.close();
	wikEdFrameBody = wikEdFrameDocument.body;

// add wikEd buttons to buttons wrapper

// format buttons
	html = '';
	html += '<div class="wikEdButtonsFormat" id="wikEdButtonsFormat">';

	html += '<img class="wikEdButtonInactive"  src="' + wikEdImage['undo']            + '" width="16" height="16" alt="Undo"               title="Undo"                                                     id="wikEdUndo"                  onClick="javascript:WikEdEditButton(\'wikEdUndo\');">';
	html += '<img class="wikEdButtonInactive"  src="' + wikEdImage['redo']            + '" width="16" height="16" alt="Redo"               title="Redo"                                                     id="wikEdRedo"                  onClick="javascript:WikEdEditButton(\'wikEdRedo\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['bold']            + '" width="16" height="16" alt="Bold"               title="Bold text"                                                id="wikEdBold"                  onClick="javascript:WikEdEditButton(\'wikEdBold\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['italic']          + '" width="16" height="16" alt="Italic"             title="Italic text"                                              id="wikEdItalic"                onClick="javascript:WikEdEditButton(\'wikEdItalic\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['underline']       + '" width="16" height="16" alt="Underline"          title="Underline text"                                           id="wikEdUnderline"             onClick="javascript:WikEdEditButton(\'wikEdUnderline\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['strikethrough']   + '" width="16" height="16" alt="Strikethrough"      title="Strikethrough text"                                       id="wikEdStrikethrough"         onClick="javascript:WikEdEditButton(\'wikEdStrikethrough\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['nowiki']          + '" width="16" height="16" alt="Nowiki"             title="Nowiki markup text"                                       id="wikEdNowiki"                onClick="javascript:WikEdEditButton(\'wikEdNowiki\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['superscript']     + '" width="16" height="16" alt="Superscript"        title="Superscript text"                                         id="wikEdSuperscript"           onClick="javascript:WikEdEditButton(\'wikEdSuperscript\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['subscript']       + '" width="16" height="16" alt="Subscript"          title="Subscript text"                                           id="wikEdSubscript"             onClick="javascript:WikEdEditButton(\'wikEdSubscript\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['case']            + '" width="16" height="16" alt="Case"               title="Toggle between lowercase, uppercase first, and uppercase" id="wikEdCase"                  onClick="javascript:WikEdEditButton(\'wikEdCase\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['undoAll']         + '" width="16" height="16" alt="Undo all"           title="Undo all changes"                                         id="wikEdUndoAll"               onClick="javascript:WikEdEditButton(\'wikEdUndoAll\');">';
	html += '<img class="wikEdButtonInactive"  src="' + wikEdImage['redoAll']         + '" width="16" height="16" alt="Redo all"           title="Redo all changes"                                         id="wikEdRedoAll"               onClick="javascript:WikEdEditButton(\'wikEdRedoAll\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['updateSyntax']    + '" width="16" height="16" alt="Syntax"             title="Update syntax highlighting"                               id="wikEdUpdateSyntax"          onClick="javascript:WikEdEditButton(\'wikEdUpdateSyntax\');">';
	html += '<br />';

	html += '<img class="wikEdButton"          src="' + wikEdImage['wikiLink']        + '" width="16" height="16" alt="Link"               title="Wiki link"                                                id="wikEdWikiLink"              onClick="javascript:WikEdEditButton(\'wikEdWikiLink\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['webLink']         + '" width="16" height="16" alt="Weblink"            title="External weblink"                                         id="wikEdWebLink"               onClick="javascript:WikEdEditButton(\'wikEdWebLink\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['decreaseHeading'] + '" width="16" height="16" alt="Heading-"           title="Decrease heading levels"                                  id="wikEdDecreaseHeading"       onClick="javascript:WikEdEditButton(\'wikEdDecreaseHeading\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['increaseHeading'] + '" width="16" height="16" alt="Heading+"           title="Increase heading levels"                                  id="wikEdIncreaseHeading"       onClick="javascript:WikEdEditButton(\'wikEdIncreaseHeading\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['bulletList']      + '" width="16" height="16" alt="Bullet list"        title="Bulleted list"                                            id="wikEdBulletList"            onClick="javascript:WikEdEditButton(\'wikEdBulletList\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['numberList']      + '" width="16" height="16" alt="Number list"        title="Numbered list"                                            id="wikEdNumberList"            onClick="javascript:WikEdEditButton(\'wikEdNumberList\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['indentList']      + '" width="16" height="16" alt="Indent list"        title="Indented list"                                            id="wikEdIndentList"            onClick="javascript:WikEdEditButton(\'wikEdIndentList\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['definitionList']  + '" width="16" height="16" alt="Def list"           title="Definition list"                                          id="wikEdDefinitionList"        onClick="javascript:WikEdEditButton(\'wikEdDefinitionList\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['image']           + '" width="16" height="16" alt="Image"              title="Image"                                                    id="wikEdImage"                 onClick="javascript:WikEdEditButton(\'wikEdImage\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['table']           + '" width="16" height="16" alt="Table"              title="Table"                                                    id="wikEdTable"                 onClick="javascript:WikEdEditButton(\'wikEdTable\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['redirect']        + '" width="16" height="16" alt="Redirect"           title="Create redirect, deletes whole text"                      id="wikEdRedirect"              onClick="javascript:WikEdEditButton(\'wikEdRedirect\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['wikify']          + '" width="16" height="16" alt="Wikify"             title="Wikify pasted content"                                    id="wikEdWikify"                onClick="javascript:WikEdEditButton(\'wikEdWikify\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['textify']         + '" width="16" height="16" alt="Textify"            title="Convert pasted content to plain text"                     id="wikEdTextify"               onClick="javascript:WikEdEditButton(\'wikEdTextify\');">';
	html += '</div>';

// wikEd control buttons
	html += '<div class="wikEdButtonsControl" id="wikEdButtonsControl">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['textZoom']        + '" width="16" height="16" alt="Text zoom"          title="Text zoom cycling"                                        id="wikEdTextZoom"              onClick="javascript:WikEdButton(\'wikEdTextZoom\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['clearHistory']    + '" width="16" height="16" alt="Clear history"      title="Clear the find, replace, and summary history"             id="wikEdClearHistory"          onClick="javascript:WikEdButton(\'wikEdClearHistory\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['scrollToButtons'] + '" width="16" height="16" alt="Scroll buttons"     title="Scroll to edit buttons"                                   id="wikEdScrollToButtons"       onClick="javascript:WikEdButton(\'wikEdScrollToButtons\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['scrollToText']    + '" width="16" height="16" alt="Scroll up"          title="Scroll to edit window"                                    id="wikEdScrollToInput"         onClick="javascript:WikEdButton(\'wikEdScrollToInput\');">';
	html += '<br />';

	html += '<img class="wikEdButtonChecked"   src="' + wikEdImage['useWikEd']        + '" width="16" height="16" alt="Use wikEd"          title="Toggle between classic text area and wikEd"               id="wikEdUseWikEd"              onClick="javascript:WikEdButton(\'wikEdUseWikEd\', true);">';
	html += '<img class="wikEdButtonUnchecked" src="' + wikEdImage['highlightSyntax'] + '" width="16" height="16" alt="Syntax"             title="Toggle automatic syntax highlighting"                     id="wikEdHighlightSyntax"       onClick="javascript:WikEdButton(\'wikEdHighlightSyntax\', true);">';
	if (wikEdShowSourceButton == true) {
		html += '<img class="wikEdButton"        src="' + wikEdImage['source']          + '" width="16" height="16" alt="Source"             title="Show the source code for testing purposes"                id="wikEdSource"                onClick="javascript:WikEdEditButton(\'wikEdSource\');">';
	}
	html += '<img class="wikEdButton"          src="' + wikEdImage['fullScreen']      + '" width="16" height="16" alt="Fullscreen"         title="Toggle the fullscreen mode"                               id="wikEdFullScreen"            onClick="javascript:WikEdButton(\'wikEdFullScreen\', true);">';
	html += '</div>';

// find / replace buttons
	html += '<div class="wikEdButtonsFind" id="wikEdButtonsFind">';

	html += '<img class="wikEdButton"          src="' + wikEdImage['getFind']         + '" width="16" height="16" alt="Get find"           title="Copy selection to find field (double click: copy selection to find and to replace field)" id="wikEdGetFind" onClick="javascript:WikEdEditButton(\'wikEdGetFind\');" ondblclick="javascript:WikEdEditButton(\'wikEdGetFindReplace\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['findAll']         + '" width="16" height="16" alt="Find all"           title="Not yet implemented. Find all matches in whole text or selection"              id="wikEdFindAll"               onClick="javascript:WikEdEditButton(\'wikEdFindAll\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['findPrev']        + '" width="16" height="16" alt="Find prev"          title="Find previous match"                                      id="wikEdFindPrev"              onClick="javascript:WikEdEditButton(\'wikEdFindPrev\');">';

	html += '<span class="wikEdFindComboInput" id="wikEdFindComboInput">';
	html += '<input class="wikEdCombo" id="wikEdFindText" title="" type="text" value="" onfocus="javascript:this.setSelectionRange(0, this.textLength);">';
	html += '<select class="wikEdCombo" id="wikEdFindSelect" onfocus="javascript:WikEdSetComboOptions(\'find\')" onChange="javascript:WikEdChangeComboInput(\'find\');">';
	html += '</select>';
	html += '</span>';

	html += '<img class="wikEdButton"          src="' + wikEdImage['findNext']        + '" width="16" height="16" alt="Find next"          title="Find next match"                                          id="wikEdFindNext"              onClick="javascript:WikEdEditButton(\'wikEdFindNext\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['jumpTopBottom']   + '" width="16" height="16" alt="Jump up/down"       title="Jump to the top / bottom"                                 id="wikEdUpdown"                onClick="javascript:WikEdEditButton(\'wikEdUpdown\');">';
	html += '<img class="wikEdButtonInactive"  src="' + wikEdImage['prevPos']         + '" width="16" height="16" alt="Jump prev"          title="Jump to previously changed position"                      id="wikEdPrevPos"               onClick="javascript:WikEdEditButton(\'wikEdPrevPos\');">';
	html += '<img class="wikEdButtonInactive"  src="' + wikEdImage['lastPos']         + '" width="16" height="16" alt="Jump next"          title="Jump back to last position"                               id="wikEdLastPos"               onClick="javascript:WikEdEditButton(\'wikEdLastPos\');">';
	html += '<br />';

//html += '<img class="wikEdButton"          src="' + wikEdImage['getFindReplace']  + '" width="16" height="16" alt="Get find + replace" title="Copy selection to find and replace fields"                id="wikEdGetFind"               onClick="javascript:WikEdEditButton(\'wikEdGetFindReplace\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['clearFind']       + '" width="16" height="16" alt="Clear find"         title="Clear the find field (to search for selected text)"       id="wikEdClearFind"             onClick="javascript:WikEdButton(\'wikEdClearFind\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['replaceAll']      + '" width="16" height="16" alt="Replace all"        title="Not yet mplemented. Replace all matches in whole text or selection"           id="wikEdReplaceAll"            onClick="javascript:WikEdEditButton(\'wikEdReplaceAll\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['replacePrev']     + '" width="16" height="16" alt="Replace prev"       title="Replace previous match"                                   id="wikEdReplacePrev"           onClick="javascript:WikEdEditButton(\'wikEdReplacePrev\');">';

	html += '<span class="wikEdReplaceComboInput" id="wikEdReplaceComboInput">';
	html += '<input class="wikEdCombo" id="wikEdReplaceText" title="" type="text" value="" onfocus="this.setSelectionRange(0, this.textLength);">';
	html += '<select class="wikEdCombo" id="wikEdReplaceSelect" onfocus="WikEdSetComboOptions(\'replace\')" onChange="javascript:WikEdChangeComboInput(\'replace\');">';
	html += '</select>';
	html += '</span>';

	html += '<img class="wikEdButton"          src="' + wikEdImage['replaceNext']     + '" width="16" height="16" alt="Replace next"       title="Replace next match"                                       id="wikEdReplaceNext"           onClick="javascript:WikEdEditButton(\'wikEdReplaceNext\');">';
	html += '<img class="wikEdButtonUnchecked" src="' + wikEdImage['caseSensitive']   + '" width="16" height="16" alt="Case sensitive"     title="Search is case sensitive"                                 id="wikEdCaseSensitive"         onClick="javascript:WikEdButton(\'wikEdCaseSensitive\', true);">';
	html += '<img class="wikEdButtonUnchecked" src="' + wikEdImage['regExp']          + '" width="16" height="16" alt="RegExp"             title="Search field is a regular expression"                     id="wikEdRegExp"                onClick="javascript:WikEdButton(\'wikEdRegExp\', true);">';
	html += '<img class="wikEdButtonUnchecked" src="' + wikEdImage['findAhead']       + '" width="16" height="16" alt="Find ahead"         title="Find ahead as you type (only for non-regexp searches)"    id="wikEdFindAhead"             onClick="javascript:WikEdButton(\'wikEdFindAhead\', true);">';
	html += '</div>';

// fixing buttons
	html += '<div class="wikEdButtonsFix" id="wikEdButtonsFix">';

	html += '<img class="wikEdButton"          src="' + wikEdImage['fixBasic']        + '" width="16" height="16" alt="Fix basic"          title="Fix blanks and empty lines, also done by other fixing functions" id="wikEdFixBasic"       onClick="javascript:WikEdEditButton(\'wikEdFixBasic\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixHtml']         + '" width="16" height="16" alt="Fix html"           title="Fix html to wikicode"                                     id="wikEdFixHtml"               onClick="javascript:WikEdEditButton(\'wikEdFixHtml\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixCaps']         + '" width="16" height="16" alt="Fix caps"           title="Fix caps in headers and lists"                            id="wikEdFixCaps"               onClick="javascript:WikEdEditButton(\'wikEdFixCaps\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixUnicode']      + '" width="16" height="16" alt="Fix Unicode"        title="Fix Unicode character representations"                    id="wikEdfixUnicode"            onClick="javascript:WikEdEditButton(\'wikEdfixUnicode\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixAll']          + '" width="16" height="16" alt="Fix all"            title="Fix basic, html, capitalization, and Unicode"             id="wikEdFixAll"                onClick="javascript:WikEdEditButton(\'wikEdFixAll\');">';
	html += '<br />';

	html += '<img class="wikEdButton"          src="' + wikEdImage['fixDash']         + '" width="16" height="16" alt="Fix dashes"         title="Fix dashes"                                               id="wikEdFixDashes"             onClick="javascript:WikEdEditButton(\'wikEdFixDashes\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixPunct']        + '" width="16" height="16" alt="Fix puntuation"     title="Fix spaces before puntuation"                             id="wikEdFixPunct"              onClick="javascript:WikEdEditButton(\'wikEdFixPunct\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixMath']         + '" width="16" height="16" alt="Fix math"           title="Fix math"                                                 id="wikEdFixMath"               onClick="javascript:WikEdEditButton(\'wikEdFixMath\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixChem']         + '" width="16" height="16" alt="Fix chem"           title="Fix chemical formulas"                                    id="wikEdFixChem"               onClick="javascript:WikEdEditButton(\'wikEdFixChem\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['fixUnits']        + '" width="16" height="16" alt="Fix units"          title="Fix units"                                                id="wikEdFixUnits"              onClick="javascript:WikEdEditButton(\'wikEdFixUnits\');">';
	html += '</div>';
	html += '<br style="clear: both;">';

// add html to buttons wrapper
	wikEdButtonsWrapper.innerHTML = html;
	wikEdButtonsFormat = document.getElementById('wikEdButtonsFormat');
	wikEdButtonsFind = document.getElementById('wikEdButtonsFind');
	wikEdButtonsFix = document.getElementById('wikEdButtonsFix');
	wikEdButtonsControl = document.getElementById('wikEdButtonsControl');
	wikEdCaseSensitive = document.getElementById('wikEdCaseSensitive');
	wikEdRegExp = document.getElementById('wikEdRegExp');
	wikEdFindAhead = document.getElementById('wikEdFindAhead');
	wikEdFindText = document.getElementById('wikEdFindText');
	wikEdReplaceText = document.getElementById('wikEdReplaceText');

// add submit buttons to submit wrapper
	var wpEditButtons = document.getElementById('wpSave').parentNode;
	wikEdSubmitButtonsWrapper.appendChild(wpEditButtons);

// add preview box top bar to submit wrapper
	var buttonsPreview = document.createElement('div');
	buttonsPreview.id = 'wikEdButtonsPreview';
	buttonsPreview.className = 'wikEdButtonsPreview';

	html = '';
	html += '<img class="wikEdButton"          src="' + wikEdImage['preview']         + '" width="16" height="16" alt="Preview"            title="Show preview below"                                       id="wikEdPreview"               onClick="javascript:WikEdButton(\'wikEdPreview\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['diff']            + '" width="16" height="16" alt="Changes"            title="Show current changes below"                               id="wikEdDiff"                  onClick="javascript:WikEdButton(\'wikEdDiff\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['close']           + '" width="16" height="16" alt="Close"              title="Close preview box"                                        id="wikEdClose"                 onClick="javascript:WikEdButton(\'wikEdClose\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['scrollToButtons'] + '" width="16" height="16" alt="Scroll buttons"     title="Scroll to edit buttons"                                   id="wikEdScrollToButtons2"      onClick="javascript:WikEdButton(\'wikEdScrollToButtons2\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['scrollToText']    + '" width="16" height="16" alt="Scroll up"          title="Scroll to edit window"                                    id="wikEdScrollToInput2"        onClick="javascript:WikEdButton(\'wikEdScrollToInput2\');">';

	buttonsPreview.innerHTML = html;
	wikEdSubmitWrapper.insertBefore(buttonsPreview, wikEdSubmitWrapper.firstChild);
	wikEdButtonsPreview = document.getElementById('wikEdButtonsPreview');

// add preview box and its bottom bar to preview wrapper
	html = '';
	html += '<div id="wikEdPreviewBoxOuter" class="wikEdPreviewBoxOuter">';
	html += '<div id="wikEdPreviewBox" class="wikEdPreviewBox">';
	html += '</div>';
	html += '</div>';

	html += '<div id="wikEdButtonsPreview2" class="wikEdButtonsPreview2">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['preview']         + '" width="16" height="16" alt="Preview"            title="Show preview above"                                       id="wikEdPreview2"              onClick="javascript:WikEdButton(\'wikEdPreview2\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['diff']            + '" width="16" height="16" alt="Changes"            title="Show current changes above"                               id="wikEdDiff2"                 onClick="javascript:WikEdButton(\'wikEdDiff2\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['close']           + '" width="16" height="16" alt="Close"              title="Close preview box"                                        id="wikEdClose2"                onClick="javascript:WikEdButton(\'wikEdClose2\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['scrollToButtons'] + '" width="16" height="16" alt="Scroll buttons"     title="Scroll to edit buttons"                                   id="wikEdScrollToButtons3"      onClick="javascript:WikEdButton(\'wikEdScrollToButtons3\');">';
	html += '<img class="wikEdButton"          src="' + wikEdImage['scrollToText']    + '" width="16" height="16" alt="Scroll up"          title="Scroll to edit window"                                    id="wikEdScrollToInput3"        onClick="javascript:WikEdButton(\'wikEdScrollToInput3\');">';
	html += '</div>';

	wikEdPreviewWrapper.innerHTML = html;
	wikEdPreviewBox = document.getElementById('wikEdPreviewBox');
	wikEdButtonsPreview2 = document.getElementById('wikEdButtonsPreview2');

// add insert special chars to insert wrapper
	var wpSpecialchars = document.getElementById('editpage-specialchars');
	wikEdInsertWrapper.appendChild(wpSpecialchars);

// wrappers filled

// display only the textarea or the iframe
	if (useWikEd == true) {
		WikEdSetEditArea(true);
	}
	else {
		WikEdSetEditArea(false);
	}

// add local preview button next to submit button
	var localPreview = document.createElement('button');
	localPreview.type = 'button';
	localPreview.id = 'wikEdLocalPreview';
	localPreview.title = 'Show preview below';
	localPreview.className = 'wikEdLocalPreview';

	var localPreviewImg = document.createElement('img');
	localPreviewImg.id = 'wikEdLocalPreviewImg';
	localPreviewImg.src = wikEdImage['preview'];
	localPreviewImg.alt = 'Preview below';

	localPreview.appendChild(localPreviewImg);
	var previewButton = document.getElementById('wpPreview');
	previewButton.parentNode.insertBefore(localPreview, previewButton.nextSibling);

// add local diff button next to submit button
	var localDiff = document.createElement('button');
	localDiff.type = 'button';
	localDiff.id = 'wikEdLocalDiff';
	localDiff.title = 'Show current changes below';
	localDiff.className = 'wikEdLocalDiff';

	var localDiffImg = document.createElement('img');
	localDiffImg.id = 'wikEdLocalDiffImg';
	localDiffImg.src = wikEdImage['diff'];
	localDiffImg.alt = 'Changes below';

	localDiff.appendChild(localDiffImg);
	var previewButton = document.getElementById('wpDiff');
	previewButton.parentNode.insertBefore(localDiff, previewButton.nextSibling);

// initialize image buttons
	WikEdButton('wikEdSource', null, false);
	WikEdButton('wikEdHighlightSyntax', null, wikEdHighlightSyntax);
	WikEdButton('wikEdUseWikEd', null, useWikEd);
	WikEdButton('wikEdFullScreen', null, false);
	WikEdButton('wikEdCaseSensitive', null, false);
	WikEdButton('wikEdRegExp', null, false);
	WikEdButton('wikEdFindAhead', null, wikEdFindAheadSelected);
	WikEdButton('wikEdPreview', null, false, 'wikEdButton');
	WikEdButton('wikEdDiff', null, false, 'wikEdButton');
	WikEdButton('wikEdClose', null, false, 'wikEdButton');
	WikEdButton('wikEdPreview2', null, false, 'wikEdButton');
	WikEdButton('wikEdDiff2', null, false, 'wikEdButton');
	WikEdButton('wikEdClose2', null, false, 'wikEdButton');

// no linebreak before minor edit checkbox
	if (wikEdNoLinebreak == true) {
		var wpMinoredit = document.getElementById('wpMinoredit');
		var node = wpMinoredit.previousSibling;
		while (node != null) {
			if (node.tagName == 'BR') {
				node.parentNode.removeChild(node);
				break;
			}
			node = node.previousSibling;
		}
	}

// add a clear summary button left to the summary input field
	var clearSummary = document.createElement('button');
	clearSummary.type = 'button';
	clearSummary.id = 'wikEdClearSummary';
	clearSummary.className = 'wikEdClearSummary';
	clearSummary.alt = 'Clear summary';
	clearSummary.title = 'Clear the summary field';
	clearSummary.style.height = (wikEdSummaryText.clientHeight + 1) +'px';

// clear the summary onclick function
	clearSummary.onclick = function() {

// clear the summary if it is only a paragraph name
		if ( /^\/\* .*? \*\/ *$/.test(wikEdSummaryText.value) ) {
			wikEdSummaryText.value = '';
		}

// clear the summary but leave paragraph names
		else {
			wikEdSummaryText.value = wikEdSummaryText.value.replace(/^((\/\* .*? \*\/ )?).*/, '$1');
		}
		return;
	}
	var clearSummaryImg = document.createElement('img');
	clearSummaryImg.id = 'wikEdClearSummaryImg';
	clearSummaryImg.src = wikEdImage['clearSummary'];
	clearSummaryImg.alt = 'Clear summary';
	clearSummary.appendChild(clearSummaryImg);
	wikEdSummaryText.parentNode.insertBefore(clearSummary, wikEdSummaryText);

// make the summary a combo box

// style needs to be declared here so that it is not overridden by monobook.css
	wikEdSummaryText.style.width = 'auto';

	var summaryComboInput = document.createElement('span');
	summaryComboInput.id = 'wikEdSummaryComboInput';
	summaryComboInput.className = 'wikEdSummaryComboInput';

	var summarySelect = document.createElement('select');
	summarySelect.id = 'wpSummarySelect';
	summarySelect.onchange = function() {
		WikEdChangeComboInput('summary');
	}
	summarySelect.onfocus = function() {
		WikEdSetComboOptions('summary');
	}

	summaryComboInput = wikEdSummaryText.parentNode.insertBefore(summaryComboInput, wikEdSummaryText);
	summaryComboInput.appendChild(wikEdSummaryText);
	summaryComboInput.appendChild(summarySelect);

// shorten submit button texts and add onclick handler
	document.getElementById('wpPreview').value = 'Preview';
	document.getElementById('wpDiff').value = 'Changes';

// set up combo input boxes with history
	wikEdFieldHist ['find'] = [];
	wikEdCookieName['find'] = 'findHistory';
	wikEdInputElement['find'] = new Object(wikEdFindText);
	wikEdSelectElement['find'] = new Object(document.getElementById('wikEdFindSelect'));
	wikEdSelectElement['find'].style.height = (wikEdInputElement['find'].clientHeight + 1) +'px';

	wikEdFieldHist ['replace'] = [];
	wikEdCookieName['replace'] = 'replaceHistory';
	wikEdInputElement['replace'] = new Object(wikEdReplaceText);
	wikEdSelectElement['replace'] = new Object(document.getElementById('wikEdReplaceSelect'));
	wikEdSelectElement['replace'].style.height = (wikEdInputElement['replace'].clientHeight + 1) +'px';

	wikEdFieldHist ['summary'] = [];
	wikEdCookieName['summary'] = 'summaryHistory';
	wikEdInputElement['summary'] = new Object(wikEdSummaryText);
	wikEdSelectElement['summary'] = new Object(document.getElementById('wpSummarySelect'));
	wikEdSelectElement['summary'].style.height = (wikEdInputElement['summary'].clientHeight + 1) +'px';
	WikEdResizeComboInput('find');
	WikEdResizeComboInput('replace');
	WikEdResizeComboInput('summary');

// add a link to the wikEd help page
	var editHelpParent = previewButton;
	do {
		editHelpParent = editHelpParent.nextSibling;
	} while (editHelpParent.tagName != 'SPAN');

	var editHelp = editHelpParent.lastChild;
	while (editHelp.tagName != 'A') {
		editHelp = editHelp.previousSibling;
	}

	var wikEdHelpSpan = document.createElement('span');
	wikEdHelpSpan.className = 'wikEdHelpSpan';
	wikEdHelpSpan.innerHTML = wikEdHelpPageLink;
	editHelpParent.insertBefore(wikEdHelpSpan, editHelp.nextSibling);

// add frame stylesheet definition
	wikEdFrameBody.style.fontSize = parseInt(wikEdTextZoom) + '%;';
	var frameStyle = new WikEdStyleSheet(wikEdFrameDocument);
	for (var ruleName in wikEdFrameCSS) {
		var ruleStyle = wikEdFrameCSS[ruleName];
		ruleStyle = ruleStyle.replace(/\{wikEdUnknown\}/g, wikEdImage['unknown']);
		ruleStyle = ruleStyle.replace(/\{wikEdTab\}/g, wikEdImage['tab']);
		ruleStyle = ruleStyle.replace(/\{wikEdCtrl\}/g, wikEdImage['ctrl']);
		ruleStyle = ruleStyle.replace(/\{wikEdBlank\}/g, wikEdImage['blank']);
		frameStyle.addRule(ruleName, ruleStyle);
	}

// copy the textarea content to the iframe
	if (useWikEd == true) {
		WikEdUpdateFrame();
	}

// set frame events
	wikEdFrameDocument.addEventListener('keyup', WikEdKeyFrame, true);
	wikEdFrameDocument.addEventListener('keypress', WikEdKeyFrame, true);
	wikEdFrameDocument.addEventListener('mouseup', WikEdKeyFrame, true);

// find ahead events
	wikEdFindText.addEventListener('keyup', WikEdFindAhead, true);

// submit button events
	var saveButton = document.getElementById('wpSave');
	var previewButton = document.getElementById('wpPreview');
	var diffButton = document.getElementById('wpDiff');
	var localPreview = document.getElementById('wikEdLocalPreview');
	var localDiff = document.getElementById('wikEdLocalDiff');

// 'Save page' onclick function
	saveButton.onclick = function() {
		if (wikEdFullScreenMode == true) {
			WikEdFullScreen(false);
		}
		if (useWikEd == true) {
			WikEdUpdateTextarea();
		}
		WikEdAddToHistory('summary');
		saveButton.onclick = null;
		saveButton.click();
		return;
	};

// 'Show preview' onclick function
	previewButton.onclick = function() {
		if (wikEdFullScreenMode == true) {
			WikEdFullScreen(false);
		}
		if (useWikEd == true) {
			WikEdUpdateTextarea();
		}
		previewButton.onclick = null;
		previewButton.click();
		return;
	};

// 'Show changes' onclick function
	diffButton.onclick = function() {
		if (wikEdFullScreenMode == true) {
			WikEdFullScreen(false);
		}
		if (useWikEd == true) {
			WikEdUpdateTextarea();
		}
		diffButton.onclick = null;
		diffButton.click();
		return;
	};

// 'Show preview' image button onclick function
	localPreview.onclick = function() {
		WikEdButton('wikEdLocalPreview');
		return;
	};

// 'Show changes' image button onclick function
	localDiff.onclick = function() {
		WikEdButton('wikEdLocalDiff');
		return;
	};

// disable scrolling to edit window on next preview page
	document.getElementById('editform').action += '&noscroll';

// scroll to edit window if it is not a preview page
	if (window.location.search.match('noscroll') == null) {
		window.scroll(0, WikEdGetOffsetTop(wikEdInputWrapper) - 2);
	}

// focus the edit area
	if (useWikEd == true) {
		wikEdFrameWindow.focus();
	}
	else {
		wikEdTextarea.setSelectionRange(0, 0);
		wikEdTextarea.focus();
	}

// reset error indicator
	WikEdSetLogo(logo);

	return;
}


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

function WikEdSetLogo(logo, error) {

	if (error == false) {
		logo.img.src = wikEdImage['error'];
		logo.img.alt = 'WikEd error';
		logo.lnk.title = 'WikEd ' + wikEdProgramVersion + ' (' + wikEdProgramDate + '): Loading error';
	}
	else {
		logo.img.src = wikEdImage['logo'];
		logo.img.alt = 'WikEd';
		logo.lnk.title = 'WikEd ' + wikEdProgramVersion + ' (' + wikEdProgramDate + ')';
	}
	return;
}


//
// WikEdSetEditArea: apply css changes to switch between classic textarea and rich text frame
//

function WikEdSetEditArea(useFrame) {

// turn rich text frame on
	if (useFrame == true) {
		wikEdTextareaWrapper.style.position = 'absolute';
		wikEdTextareaWrapper.style.visibility = 'hidden';
		wikEdTextarea.style.display = 'none';

		wikEdFrameWrapper.style.position = 'static';
		wikEdFrameWrapper.style.visibility = 'visible';
		wikEdFrameBody.style.display = 'block';

		if (document.getElementById('toolbar') != null) {
			if (wikEdShowToolbar == true) {
				document.getElementById('toolbar').style.display = 'block';
			}
			else {
				document.getElementById('toolbar').style.display = 'none';
			}
		}
		wikEdButtonsFormat.style.display = 'block';
		wikEdButtonsFind.style.display = 'block';
		wikEdButtonsFix.style.display = 'block';
		wikEdButtonsControl.style.display = 'block';
	}

// turn classic textarea on
	else {
		wikEdFrameWrapper.style.position = 'absolute';
		wikEdFrameWrapper.style.visibility = 'hidden';
		wikEdFrameBody.style.display = 'none';

		wikEdTextareaWrapper.style.position = 'static';
		wikEdTextareaWrapper.style.visibility = 'visible';
		wikEdTextarea.style.display = 'block';

		if (document.getElementById('toolbar') != null) {
			document.getElementById('toolbar').style.display = 'block';
		}
		wikEdButtonsFormat.style.display = 'none';
		wikEdButtonsFind.style.display = 'none';
		wikEdButtonsFix.style.display = 'none';
		wikEdButtonsControl.style.display = 'block';
	}
	return;
}


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

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

// get the button object
	var buttonObj = document.getElementById(whichButton);
	if (buttonObj == null) {
		alert('Unknown button \'' + whichButton + '\'');
		return;
	}

// check if the button is disabled
	if (buttonObj.className == 'wikEdButtonInactive') {
		return;
	}

// set button to pressed, set cursor to hourglass
	buttonObj.style.cursor = 'wait';

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

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

// perform specific actions
	if ( ( (setButton == null) && (classButton == null) ) || (doButton == true) ) {

// remove active content
		WikEdRemoveElements(['script', 'object', 'applet', 'embed']);

		switch (whichButton) {

// switch between syntax highlighting and plain text
			case 'wikEdHighlightSyntax':
				var obj = {};
				obj.html = wikEdFrameBody.innerHTML;
				if (buttonObj.checked == true) {
					WikEdRemoveHighlighting(obj);
					wikEdHighlightSyntax = true;
					obj.html = obj.html.replace(/<br\b[^>]*>/g, '\n');
					WikEdHighlightSyntax(obj);
					obj.html = obj.html.replace(/\n/g, '<br />');
				}
				else {
					wikEdHighlightSyntax = false;
					WikEdRemoveHighlighting(obj);
					obj.html = obj.html.replace(/(\t)/g, '<' + 'pre class="wikEdTabPlain">$1<' + '/pre><!--wikEdTabPlain-->');
				}
				wikEdFrameBody.innerHTML = obj.html;
				break;

// align textbox with display top
			case 'wikEdScrollToInput':
			case 'wikEdScrollToInput2':
			case 'wikEdScrollToInput3':
				var wikEdInputWrapper = document.getElementById('wikEdInputWrapper');
				var inputWrapperTop = WikEdGetOffsetTop(wikEdInputWrapper);
				window.scroll(0, inputWrapperTop);
				break;

// align edit buttons with display top
			case 'wikEdScrollToButtons':
			case 'wikEdScrollToButtons2':
			case 'wikEdScrollToButtons3':
				var wikEdConsoleWrapper = document.getElementById('wikEdConsoleWrapper');
				var consoleWrapperTop = WikEdGetOffsetTop(wikEdConsoleWrapper);
				window.scroll(0, consoleWrapperTop);
				break;

// cycle through different font sizes
			case 'wikEdTextZoom':
				wikEdTextZoom = wikEdTextZoom / 1.2;
				if (wikEdTextZoom < 60) {
					wikEdTextZoom = Math.round(wikEdTextZoom * Math.pow(1.2, 4) );
				}
				wikEdFrameBody.style.fontSize = parseInt(wikEdTextZoom) + '%;';
				break;

// display local preview box
			case 'wikEdPreview':
			case 'wikEdPreview2':
			case 'wikEdLocalPreview':
				if (wikEdFullScreenMode == true) {
					WikEdFullScreen(false);
				}
				if (useWikEd == true) {
					WikEdUpdateTextarea();
				}
				wikEdPreviewBox.innerHTML = wiki2html(wikEdTextarea.value);
				wikEdPreviewWrapper.style.display = 'block';
				break;

// display local diff box
			case 'wikEdDiff':
			case 'wikEdDiff2':
			case 'wikEdLocalDiff':
				if (wikEdFullScreenMode == true) {
					WikEdFullScreen(false);
				}
				if (useWikEd == true) {
					WikEdUpdateTextarea();
				}
				var diffText = wikEdTextarea.value;
				diffText = StringDiff(wikEdOrigVersion, diffText);
				wikEdPreviewBox.innerHTML = diffText;
				wikEdPreviewWrapper.style.display = 'block';
				break;

// close the preview / diff box
			case 'wikEdClose':
			case 'wikEdClose2':
				wikEdPreviewWrapper.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);
					useWikEd = true;
				}

// disable wikEd
				else {
					if (wikEdFullScreenMode == true) {
						WikEdFullScreen(false);
					}
					WikEdUpdateTextarea();

// turn classic textarea on
					WikEdSetEditArea(false);
					useWikEd = false;
				}
				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);
				}
				else {
					WikEdFullScreen(false);
				}
				break;

// clear the find, replace, and summary history stored in cookies
			case 'wikEdClearHistory':
				WikEdClearHistory('find');
				WikEdClearHistory('replace');
				WikEdClearHistory('summary');
				break;

// clear the search find field to search for the selected text
			case 'wikEdClearFind':
				wikEdInputElement['find'].value = '';
				break;

// for testing
			case 'wikEdPlaceholder':
				break;
		}
	}

// reset the frame DOM cache because the frame content might have changed
	wikEdFrameDOMCache = null;

// reset cursor to normal
	buttonObj.style.cursor = 'pointer';

	return;
}


//
// WikEdEditButton: editing functions
//   used for buttons that require or change the text. More tome consuming than WikEdButton()


function WikEdEditButton(whichButton, parameterArray) {

// get the button object
	var buttonObj = document.getElementById(whichButton);

// check if button is disabled
	if (buttonObj != null) {
		if (buttonObj.className == 'wikEdButtonInactive') {
			return;
		}
	}

// remove active content
	WikEdRemoveElements(['script', 'object', 'applet', 'embed', 'textarea']);

// get ranges to apply the changes to:
// whole text, selection, cursor, word and line under cursor and selection
	var obj = {};

// setup whole object for the whole text
	obj.whole = {};
	obj.whole.plainArray = [];
	obj.whole.plainNode = [];
	obj.whole.plainStart = [];
	obj.whole.from = 'whole';

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

// get whole plain text
	WikEdGetInnerHTML(obj.whole, wikEdFrameBody);
	obj.whole.code = obj.whole.html;
	WikEdRemoveHighlightingWikify(obj.whole);
	obj.whole.plain = obj.whole.html;
	obj.whole.plain = obj.whole.plain.replace(/<br\b[^>]*>/g, '\n');
	obj.whole.plain = obj.whole.plain.replace(/\u00a0/g, ' ');
	obj.whole.range.setStartBefore(wikEdFrameBody.firstChild);
	obj.whole.range.setEndAfter(wikEdFrameBody.lastChild);

// setup selection object for the selected text
	obj.selection = {};
	obj.selection.from = 'selection';

// set selection range
 	obj.sel = wikEdFrameWindow.getSelection();
	obj.selection.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1);

// copy range to document fragment
	var documentFragment = obj.selection.range.cloneContents();

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

// setup cursor object for the cursor position
	obj.cursor = {};
	obj.cursor.from = 'cursor';
	obj.cursor.range = document.createRange();
	obj.cursor.range.setStart(obj.sel.focusNode, obj.sel.focusOffset);
	obj.cursor.range.setEnd(obj.sel.focusNode, obj.sel.focusOffset);
	obj.cursor.plain = '';

// setup focusWord object for the word under the cursor
	obj.focusWord = {};
	obj.focusWord.from = 'focusWord';
	obj.focusWord.range = document.createRange();

// setup focusLine object for the line under the cursor
	obj.focusLine = {};
	obj.focusLine.from = 'focusLine';
	obj.focusLine.range = document.createRange();

// setup selectionWord object for the words under the selection
	obj.selectionWord = {};
	obj.selectionWord.from = 'selectionWord';
	obj.selectionWord.range = document.createRange();

// setup selectionLine object for the lines under the selection
	obj.selectionLine = {};
	obj.selectionLine.from = 'selectionLine';
	obj.selectionLine.range = document.createRange();

// find the respective word and line boundaries
	WikEdFindBoundaries(obj.focusWord, obj.focusLine, obj.whole, obj.cursor);
	WikEdFindBoundaries(obj.selectionWord, obj.selectionLine, obj.whole, obj.selection);

// get the wikified plain text for the word under the cursor
	var documentFragment = obj.focusWord.range.cloneContents();
	WikEdGetInnerHTML(obj.focusWord, documentFragment);
	obj.focusWord.code = obj.focusWord.html;
	WikEdRemoveHighlightingWikify(obj.focusWord);
	obj.focusWord.plain = obj.focusWord.html;
	obj.focusWord.plain = obj.focusWord.plain.replace(/<br\b[^>]*>/g, '\n');
	obj.focusWord.plain = obj.focusWord.plain.replace(/\u00a0/g, ' ');

// get the wikified plain text for the line under the cursor
	var documentFragment = obj.focusLine.range.cloneContents();
	WikEdGetInnerHTML(obj.focusLine, documentFragment);
	obj.focusLine.code = obj.focusLine.html;
	WikEdRemoveHighlightingWikify(obj.focusLine);
	obj.focusLine.plain = obj.focusLine.html;
	obj.focusLine.plain = obj.focusLine.plain.replace(/<br\b[^>]*>/g, '\n');
	obj.focusLine.plain = obj.focusLine.plain.replace(/\u00a0/g, ' ');

// get the wikified plain text for the words under the selection
	var documentFragment = obj.selectionWord.range.cloneContents();
	WikEdGetInnerHTML(obj.selectionWord, documentFragment);
	obj.selectionWord.code = obj.selectionWord.html;
	WikEdRemoveHighlightingWikify(obj.selectionWord);
	obj.selectionWord.plain = obj.selectionWord.html;
	obj.selectionWord.plain = obj.selectionWord.plain.replace(/<br\b[^>]*>/g, '\n');
	obj.selectionWord.plain = obj.selectionWord.plain.replace(/\u00a0/g, ' ');

// get the wikified plain text for the lines under the selection
	var documentFragment = obj.selectionLine.range.cloneContents();
	WikEdGetInnerHTML(obj.selectionLine, documentFragment);
	obj.selectionLine.code = obj.selectionLine.html;
	WikEdRemoveHighlightingWikify(obj.selectionLine);
	obj.selectionLine.plain = obj.selectionLine.html;
	obj.selectionLine.plain = obj.selectionLine.plain.replace(/<br\b[^>]*>/g, '\n');
	obj.selectionLine.plain = obj.selectionLine.plain.replace(/\u00a0/g, ' ');

// select the appropriate object to change (whole, selection, cursor, focusWord, focusLine, selectionWord, or selectionLine)
	obj.changed = {};
	switch (whichButton) {

// undo: whole
		case 'wikEdUndo':
		case 'wikEdRedo':
			obj.changed = obj.cursor; // dummy
			break;

// whole text changes: whole
		case 'wikEdUndoAll':
		case 'wikEdRedoAll':
			obj.changed = obj.whole;
			break;

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

// character formatting: selection / focusWord
		case 'wikEdCase':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.focusWord;
			}
			break;

// update syntax highlighting: selection / whole
		case 'wikEdUpdateSyntax':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.whole;
			}
			break;

// multiple line changes: selectionLine
		case 'wikEdDecreaseHeading':
		case 'wikEdIncreaseHeading':
		case 'wikEdBulletList':
		case 'wikEdNumberList':
		case 'wikEdIndentList':
		case 'wikEdDefinitionList':
			if (obj.selection.plain != '') {
				obj.changed = obj.selectionLine;
			}
			else {
				obj.changed = obj.focusLine;
			}
			break;

// image: selectionWord (if text is selected) / cursor
		case 'wikEdImage':
			if (obj.selection.plain != '') {
				obj.changed = obj.selectionWord;
			}
			else  {
				obj.changed = obj.cursor;
			}
			break;

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

// wikify, textify: selection / whole
		case 'wikEdWikify':
		case 'wikEdTextify':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.whole;
			}
			break;

// redirect: whole
		case 'wikEdRedirect':
			obj.changed = obj.whole;
			break;

// character formatting: selection / focusWord
		case 'wikEdGetFind':
		case 'wikEdGetFindReplace':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.focusWord;
			}
			break;

// find and replace: find value / selection / focusWord
		case 'wikEdFindPrev':
		case 'wikEdFindNext':
		case 'wikEdReplacePrev':
		case 'wikEdReplaceNext':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else if (obj.focusWord.plain != '') {
				obj.changed = obj.focusWord;
			}
			else {
				obj.changed.plain = null;
			}
			break;

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

//////////////////////////////////
		case 'wikEdUpdown':
			obj.changed = obj.cursor; //dummy
			break;

// jump to position: dummy
		case 'wikEdPrevPos':
		case 'wikEdLastPos':
			obj.changed = obj.cursor; //dummy
			break;

// fixing buttons: selection / whole
		case 'wikEdFixBasic':
		case 'wikEdfixUnicode':
		case 'wikEdFixAll':
		case 'wikEdFixHtml':
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.whole
			}
			break;

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

// fixing buttons: selection / focusWord
			if (obj.selection.plain != '') {
				obj.changed = obj.selection;
			}
			else {
				obj.changed = obj.focusWord;
			}
			break;

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

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

// unknown edit function
		default:
			alert('Unknown edit function \'' + whichButton + '\'');

// reset button to active, reset cursor
			if (buttonObj != null) {
				if (buttonObj.className != 'wikEdButtonInactive') {
					buttonObj.className = 'wikEdButton';
				}
			}
			wikEdFrameBody.style.cursor = 'auto';

			return;
	}

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

// reset button to active, reset cursor
		if (buttonObj != null) {
			if (buttonObj.className != 'wikEdButtonInactive') {
				buttonObj.className = 'wikEdButton';
			}
		}
		return;
	}

// set local syntax highlighting flag
	var highlightSyntax = wikEdHighlightSyntax;

// manipulate the text
	var selectChange = true;
	switch (whichButton) {

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

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

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

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

// underline
		case 'wikEdUnderline':
			if ( /&lt;u&gt;(.*?)&lt;\/u&gt;/i.test(obj.changed.plain) ) {
				obj.changed.plain = obj.changed.plain.replace(/&lt;u&gt;(.*?)&lt;\/u&gt;/g, '$1');
			}
			else {
				obj.changed.plain = '&lt;u&gt;' + obj.changed.plain + '&lt;\/u&gt;';
				obj.changed.plain = obj.changed.plain.replace(/(&lt;u&gt;)( *)(.*?)( *)(&lt;\/u&gt;)/, '$2$1$3$5$4');
			}
			break;

// strikethrough
		case 'wikEdStrikethrough':
			if ( /&lt;s&gt;(.*?)&lt;\/s&gt;/i.test(obj.changed.plain) ) {
				obj.changed.plain = obj.changed.plain.replace(/&lt;s&gt;(.*?)&lt;\/s&gt;/g, '$1');
			}
			else {
				obj.changed.plain = '&lt;s&gt;' + obj.changed.plain + '&lt;\/s&gt;';
				obj.changed.plain = obj.changed.plain.replace(/(&lt;s&gt;)( *)(.*?)( *)(&lt;\/s&gt;)/, '$2$1$3$5$4');
			}
			break;

// nowiki
		case 'wikEdNowiki':
			if ( /&lt;nowiki&gt;(.*?)&lt;\/nowiki&gt;/i.test(obj.changed.plain) ) {
				obj.changed.plain = obj.changed.plain.replace(/&lt;nowiki&gt;(.*?)&lt;\/nowiki&gt;/g, '$1');
			}
			else {
				obj.changed.plain = '&lt;nowiki&gt;' + obj.changed.plain + '&lt;\/nowiki&gt;';
				obj.changed.plain = obj.changed.plain.replace(/(&lt;nowiki&gt;)( *)(.*?)( *)(&lt;\/nowiki&gt;)/, '$2$1$3$5$4');
			}
			break;

// superscript
		case 'wikEdSuperscript':
			if ( /&lt;sup&gt;(.*?)&lt;\/sup&gt;/i.test(obj.changed.plain) ) {
				obj.changed.plain = obj.changed.plain.replace(/&lt;sup&gt;(.*?)&lt;\/sup&gt;/g, '$1');
			}
			else {
				obj.changed.plain = '&lt;sup&gt;' + obj.changed.plain + '&lt;/sup&gt;';
				obj.changed.plain = obj.changed.plain.replace(/(&lt;sup&gt;)( *)(.*?)( *)(&lt;\/sup&gt;)/, '$2$1$3$5$4');
			}
			break;

// subscript
		case 'wikEdSubscript':
			if ( /&lt;sub&gt;(.*?)&lt;\/sub&gt;/i.test(obj.changed.plain) ) {
				obj.changed.plain = obj.changed.plain.replace(/&lt;sub&gt;(.*?)&lt;\/sub&gt;/g, '$1');
			}
			else {
				obj.changed.plain = '&lt;sub&gt;' + obj.changed.plain + '&lt;/sub&gt;';
				obj.changed.plain = obj.changed.plain.replace(/(&lt;sub&gt;)( *)(.*?)( *)(&lt;\/sub&gt;)/, '$2$1$3$5$4');
			}
			break;

// toggle lowercase / uppercase
		case 'wikEdCase':

// lowercase all uppercased text
			if (obj.changed.plain.toUpperCase() == obj.changed.plain) {
				obj.changed.plain = obj.changed.plain.toLowerCase();
			}

// first-letter-uppercase all lowercased text
			else if (obj.changed.plain.toLowerCase() == obj.changed.plain) {
				obj.changed.plain = obj.changed.plain.replace(/\b(\w)(\w*)/g,
					function (p, p1, p2) {
						return(p1.toUpperCase() + p2.toLowerCase());
					}
				);
			}

// uppercase mixed upper and lowercased text
			else {
				obj.changed.plain = obj.changed.plain.toUpperCase();
			}
			break;

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

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

// update syntax highlighting
		case 'wikEdUpdateSyntax':
			highlightSyntax = true;
			break;

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

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

// decrease heading level
		case 'wikEdDecreaseHeading':
			obj.changed.plain = obj.changed.plain.replace(/(^|\n)=(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1$2 $3 $2'); // decrease heading
			obj.changed.plain = obj.changed.plain.replace(/(^|\n)=(?!=) *([^\n]*?) *=+(?=\n|$)/g, '$1$2'); // remove heading
			obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1$2 $3 $2'); // adjust closing tags
			break;

// increase heading level
		case 'wikEdIncreaseHeading':
			obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1=$2 $3 $2='); // increase heading
			obj.changed.plain = obj.changed.plain.replace(/(^|\n)([^=\n\s][^\n]*?)(?=\n|$)/g, '$1== $2 =='); // create new heading
			obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *([^\n]*?) *=+(?=\n|$)/g, '$1$2 $3 $2'); // adjust closing tags
			break;

// create bullet list
		case 'wikEdBulletList':
			obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g,
				function (p, p1) {
					p1 = p1.replace(/^ *([\*\#\:\;]*) */g, '*$1 ');
					p1 = p1.replace(/^(\*{4,})([\*\#\:\;]*)/g, '$2');
					return(p1);
				}
			);
			break;

// create numbered list
		case 'wikEdNumberList':
			obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g,
				function (p, p1) {
					p1 = p1.replace(/^ *([\*\#\:\;]*) */g, '#$1 ');
					p1 = p1.replace(/^(\*{4,})([\*\#\:\;]*)/g, '$2');
					return(p1);
				}
			);
			break;

// create indented list
		case 'wikEdIndentList':
			obj.changed.plain = obj.changed.plain.replace(/([^\n]+)/g,
				function (p, p1) {
					p1 = p1.replace(/^ *([\*\#\:\;]*) */g, ':$1 ');
					p1 = p1.replace(/^(\*{4,})([\*\#\:\;]*)/g, '$2');
					return(p1);
				}
			);
			break;

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

// create image
		case 'wikEdImage':
			if (obj.changed.plain != '') {
				obj.changed.plain = '[[Image:<span class="wikEdInsertHere">filename</span>|thumb|<span class="wikEdInsertHere">width</span>px|' + obj.changed.plain + ']]';
			}
			else {
				obj.changed.plain = '[[Image:<span class="wikEdInsertHere">filename</span>|thumb|<span class="wikEdInsertHere">width</span>px|<span class="wikEdInsertHere"> </span>]]';
				if (obj.focusWord.plain != '') {
					obj.changed.plain = ' ' + obj.changed.plain + ' ';
				}
			}
			break;

// create table
		case 'wikEdTable':
			if (obj.changed.plain != '') {
				obj.changed.plain = obj.changed.plain.replace(/(^|\n) */g, '\n|-\n| ');
				obj.changed.plain = obj.changed.plain.replace(/^\n\|\-\n/, '\n{| {{Prettytable}}\n');
				obj.changed.plain = obj.changed.plain.replace(/$/g, '\n|}\n');
			}
			else {
				obj.changed.plain = '\n{| {{Prettytable}}\n|+ <span class="wikEdInsertHere">caption</span>\n! <span class="wikEdinserthere">heading</span> !! <span class="wikEdInsertHere">heading</span>\n|-\n| <span class="wikEdInsertHere">cell</span> || <span class="wikEdInsertHere">cell</span>\n|-\n| <span class="wikEdInsertHere">cell</span> || <span class="wikEdInsertHere">cell</span>\n|}\n';
				if (obj.focusLine.plain != '') {
					obj.changed.plain = '\n' + obj.changed.plain + '\n';
				}
			}
			break;

// wikify: always done above
		case 'wikEdWikify':
			break;

// textify: strip html from pasted content
		case 'wikEdTextify':
			var objTextify = {};

// get inner html without wikifying
			if (obj.changed.from == 'whole') {
				WikEdGetInnerHTML(objTextify, wikEdFrameBody);
			}
			else {
				obj.selection.range = obj.sel.getRangeAt(obj.sel.rangeCount - 1);
				var documentFragment = obj.selection.range.cloneContents();
				WikEdGetInnerHTML(objTextify, documentFragment);
			}

			WikEdTextify(objTextify);
			obj.changed.plain = objTextify.plain;
			obj.changed.plain = obj.changed.plain.replace(/\n/g, '<br />');
			break;

// redirect
		case 'wikEdRedirect':
			var linkTarget;
			if (obj.selectionWord.plain != '') {
				linkTarget = obj.selectionWord.plain;
			}
			else {
				linkTarget = '<span class="wikEdInsertHere">article link</span>';
			}

// remove leading and trailing spaces
			linkTarget = linkTarget.replace(/^\s+|\s+$/g, '');

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

// remove square brackets
			linkTarget = linkTarget.replace(/\[|\]/g, '');

// remove link leftovers
			linkTarget = linkTarget.replace(/ +\| +/g, ' ');

			obj.changed.plain = '#redirect [[' + linkTarget + ']]';

			if (wikEdInputElement['summary'].value == '') {
				wikEdInputElement['summary'].value = '#redirect [[' + linkTarget + ']]';
			}
			selectChange = false;
			break;

// copy selection to find field
		case 'wikEdGetFind':
			wikEdInputElement['find'].value = obj.changed.plain;
			obj.changed.plain = null;
			break;

// copy selection to find and to replace field
		case 'wikEdGetFindReplace':
			wikEdInputElement['find'].value = obj.changed.plain;
			wikEdInputElement['replace'].value = obj.changed.plain;
			obj.changed.plain = null;
			break;

// find and replace
		case 'wikEdFindPrev':
		case 'wikEdFindNext':
		case 'wikEdReplacePrev':
		case 'wikEdReplaceNext':
		case 'wikEdFindAll':
		case 'wikEdReplaceAll':

// get the find text //////////////////
			var findText;
			if (wikEdInputElement['find'].value != '') {
				findText = wikEdInputElement['find'].value;
			}
			else {
				if (obj.selection.plain == '') {
					obj.changed.plain = null;
					break;
				}
				else {
					findText = obj.selection.plain;
				}
			}

// get the replace text
			var replaceText = wikEdInputElement['replace'].value;

// format the find and replace texts as regexp or plain text
			if (wikEdRegExp.checked == false) {
				findText = findText.replace(/([\\^\$\*\+\?\.\(\)\[\]\{\}\:\=\!\|\,\-])/g, '\\$1');
			}

// replace \n with newline character
			else {
				replaceText = replaceText.replace(/((^|[^\\])(\\\\)*)\\n/g, '$1\n');
			}

// set regexp flags
			var regExpFlags = 'g';
			if ( ! wikEdCaseSensitive.checked ) {
				regExpFlags += 'i';
			}

// create regexp
			var regExpFind = new RegExp(findText, regExpFlags);

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

// find all
			if (whichButton == 'wikEdFindAll') {
////////////////////////// set selection with multiple ranges
				obj.changed.plain = null;
				break;
			}

// replace an existing selection
			else if ( (whichButton == 'wikEdReplacePrev') || (whichButton == 'wikEdReplaceNext') ) {
				if (regExpFind.test(obj.selection.plain)) {
					obj.changed.plain = obj.selection.plain.replace(regExpFind, replaceText);
					replacedFlag = true;
				}
				else {
					obj.changed.plain = null;
				}
			}
			else if ( (whichButton == 'wikEdFindNext') || (whichButton == 'wikEdFindPrev') ) {
				obj.changed.plain = null;
			}

			if ( (whichButton == 'wikEdFindNext') || (whichButton == 'wikEdFindPrev') || (whichButton == 'wikEdReplaceNext')  || (whichButton == 'wikEdReplacePrev') ) {
				if (replacedFlag == false) {

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

// get case sensitive
					var caseSensitive = false;
					if (wikEdCaseSensitive.checked == true) {
						caseSensitive = true;
					}

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

// save search history to cookie
			if ( (whichButton == 'wikEdFindPrev') || (whichButton == 'wikEdFindNext') ) {
				WikEdAddToHistory('find');
			}
			if ( (whichButton == 'wikEdReplacePrev') || (whichButton == 'wikEdReplaceNext') || (whichButton == 'wikEdReplaceAll') ) {
				WikEdAddToHistory('find');
				WikEdAddToHistory('replace');
			}
			break;

// jump to top or bottom
		case 'wikEdUpdown':

// jump to bottom
/////////////////////// also check which is closer!!!!!
			if ( (obj.cursor.range.startContainer == wikEdFrameBody) && (obj.cursor.range.startOffset == 0) ) {
				obj.changed.range.setEndAfter(wikEdFrameBody.lastChild);
				obj.changed.range.collapse(false);
				wikEdFrameBody.scrollTop = wikEdFrameBody.scrollHeight;
			}

// jump to top
			else {
				obj.changed.range.setStartBefore(wikEdFrameBody.firstChild);
				obj.changed.range.collapse(true);
				wikEdFrameBody.scrollTop = 0;
			}
			obj.changed.plain = null;
			break;

// jump to previously changed position
		case 'wikEdPrevPos':
			if (wikEdFrameDocument.queryCommandEnabled('undo') == true) {
				WikEdFrameExecCommand('undo');
				WikEdFrameExecCommand('redo');
				wikEdLastPosObj = obj.cursor;
			}
			obj.changed.plain = null
			break;

// jump back to last position
		case 'wikEdLastPos':
			if (wikEdLastPosObj != null) {
				obj.changed = wikEdLastPosObj;
				wikEdLastPosObj = null;
				obj.changed.plain = null;
			}
			else {
				obj.changed.plain = null;
			}
			break;

// fixbasic: fix characters, spaces, empty lines, certain headings, needed for all fixing functions
// to do: only certain changes in multiline tags: comments, tables, subst
		case 'wikEdFixBasic':
			WikEdFixBasic(obj.changed);
			break;
		case 'wikEdFixPunct':
			WikEdFixPunct(obj.changed);
			break;
		case 'wikEdFixMath':
			WikEdFixMath(obj.changed);
			break;
		case 'wikEdFixChem':
			WikEdFixChem(obj.changed);
			break;
		case 'wikEdfixUnicode':
			WikEdFixUnicode(obj.changed);
			break;
		case 'wikEdFixUnits':
			WikEdFixUnits(obj.changed);
			break;
		case 'wikEdFixDashes':
			WikEdFixDashes(obj.changed);
			break;
		case 'wikEdFixHtml':
			WikEdFixHTML(obj.changed);
			break;
		case 'wikEdFixCaps':
			WikEdFixCaps(obj.changed);
			break;
		case 'wikEdFixAll':
			WikEdFixAll(obj.changed);
			break;

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

// insert tags
		case 'wikEdInsertTags':
			var tagOpen = parameterArray[0] || '';
			var tagClose = parameterArray[1] || '';
			var sampleText = parameterArray[2] || '';
			tagOpen = tagOpen.replace(/&/g, '&amp;');
			tagOpen = tagOpen.replace(/</g, '&lt;');
			tagOpen = tagOpen.replace(/>/g, '&gt;');
			tagClose = tagClose.replace(/&/g, '&amp;');
			tagClose = tagClose.replace(/</g, '&lt;');
			tagClose = tagClose.replace(/>/g, '&gt;');
			tagsampleText = sampleText.replace(/&/g, '&amp;');
			tagsampleText = sampleText.replace(/</g, '&lt;');
			tagsampleText = sampleText.replace(/>/g, '&gt;');
			if ( (obj.changed.plain == '') && (sampleText.length > 0) ) {
				obj.changed.plain = tagOpen + sampleText + tagClose;
			}
			obj.changed.plain = tagOpen + obj.changed.plain + tagClose;
			break;

// default
		default:
			alert('Unknown edit function \'' + whichButton + '\'');
	}

// update the selection only, do not change the text
	if (obj.changed.plain == null) {
		obj.sel.removeAllRanges();
		obj.sel.addRange(obj.changed.range);

// scroll the selected text into the viewport by using a backwards find
		if (selectChange != false) {

// get the plain text of the selection
			var plainText = obj.sel.getRangeAt(obj.sel.rangeCount - 1).cloneContents().textContent;

// collapse the selection to the end and search backwards
			if (plainText.length > 0) {
				if (plainText.indexOf('\n') < 0) {
					obj.changed.range.collapse(false);

// function: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog)
					wikEdFrameWindow.find(plainText, true, true, false, false, false, false);
				}
			}
		}
	}

// apply text changes
	else {

// a text change erases the last version for redo all
		if ( (whichButton != 'wikEdUndo') && (whichButton != 'wikEdRedo') && (whichButton != 'wikEdUndoAll') ) {
			wikEdLastVersion = null;
		}

// highlight the syntax
		obj.html = obj.changed.plain;
		if (highlightSyntax == true) {
			WikEdHighlightSyntax(obj);
		}

// display tabs
		else {
			obj.html = obj.html.replace(/(\t)/g, '<' + 'pre class="wikEdTabPlain">$1<' + '/pre><!--wikEdTabPlain-->');
		}

// display multiple blanks as blank-&nbsp;
		obj.html = obj.html.replace(/  /g, '&nbsp; ');
		obj.html = obj.html.replace(/  /g, '&nbsp; ');

// newlines to <br />
		obj.html = obj.html.replace(/\n/g, '<br />');

// make changed range text the current selection
		obj.sel.removeAllRanges();
		obj.sel.addRange(obj.changed.range);

// get the scroll position
		var frameSrollTop;
		if (obj.changed.from == 'whole') {
			frameSrollTop = wikEdFrameBody.scrollTop
		}

// replace the selection with changed text
		if (obj.html != '') {
			WikEdFrameExecCommand('inserthtml', obj.html);
		}
		else {
			WikEdFrameExecCommand('delete');
		}

// select the whole text after replacing the whole text and scroll to same height
		if (obj.changed.from == 'whole') {
			wikEdFrameBody.scrollTop = frameSrollTop;
			var range = document.createRange();
			range.setStartBefore(wikEdFrameBody.firstChild);
			range.setEndAfter(wikEdFrameBody.lastChild);
			obj.sel.addRange(range);
			selectChange = false;
		}

// select the changed text and scroll it into the viewport by using a backwards find
		if (selectChange != false) {

// get the text content of the changed text
			var div = document.createElement('div');
			div.innerHTML = obj.changed.plain;
			var plainText = div.textContent;

// find the text
			if (plainText.length > 0) {
				if (plainText.indexOf('\n') < 0) {

// function: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog)
					wikEdFrameWindow.find(plainText, true, true, false, false, false, false);
				}
			}
		}
	}

// reset button to active, reset cursor
	if (buttonObj != null) {
		if (buttonObj.className != 'wikEdButtonInactive') {
			buttonObj.className = 'wikEdButton';
		}
		buttonObj.style.cursor = 'auto';
  }

// grey out inactive buttons
	WikEdInactiveButtons();

// reset the frame DOM cache because the frame content has been changed
	wikEdFrameDOMCache = null;

// focus the frame
	if (useWikEd == true) {
		wikEdFrameWindow.focus();
	}

	return;
}


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

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

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

// empty the range to avoid error messages for reverse direction ranges
	obj.changed.range = document.createRange();

// use the fast built-in find function for non-regexp searches
	if (regExp == null) {

// function: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog)
		var found = wikEdFrameWindow.find(findText, caseSensitive, backwards, false, false, false, false);
		if (found == false) {
			obj.changed.range.setStart(range.startContainer, range.startOffset);
			obj.changed.range.setEnd(range.endContainer, range.endOffset);
			obj.changed.range.collapse(backwards);
		}
		else {
			range = obj.sel.getRangeAt(obj.sel.rangeCount - 1);
			obj.changed.range.setStart(range.startContainer, range.startOffset);
			obj.changed.range.setEnd(range.endContainer, range.endOffset);
		}
	}

// slow javascript regexp find and replace
	else {

// perform find
		WikEdParseDOM(obj, wikEdFrameBody);
		var regExpMatch = [];

// find next, search to the right
		if (backwards == false) {

// set start position for search to right
			regExp.lastIndex = obj.plainFocus;

// execute the regexp search to the right
			regExpMatch = regExp.exec(obj.plain);

// collapse the selection to its end for no find
			if (regExpMatch == null) {
				obj.changed.range.setEnd(range.endContainer, range.endOffset);
				obj.changed.range.collapse(false);
			}
		}

// find previous, search to the left
		else {

// cycle through the matches to the left
			var regExpMatchNext;
			do {
				regExpMatch = regExpMatchNext;
				regExpMatchNext = regExp.exec(obj.plain);
				if (regExpMatchNext == null) {
					break;
				}
			} while (regExpMatchNext.index < obj.plainAnchor);

// collapse the selection to its start for no find
			if (regExpMatch == null) {
				obj.changed.range.setStart(range.startContainer, range.startOffset);
				obj.changed.range.collapse(true);
			}
		}

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


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

function WikEdTextify(obj) {

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

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

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

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

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

// lists
	obj.plain = obj.plain.replace(/<\/?(dir|dl|menu|ol|ul)\b[^>]*>/g, '\u0000');
	obj.plain = obj.plain.replace(/<\/(dd|dt|li)>/g, '\u0000');

// forms
	obj.plain = obj.plain.replace(/<\/?(select|textarea)\b[^>]*>/g, '\u0000');
	obj.plain = obj.plain.replace(/<\/(option|legend|optgroup)>/g, '\u0000');

// table
	obj.plain = obj.plain.replace(/<\/?(table|caption)\b[^>]*>/g, '\u0000');
	obj.plain = obj.plain.replace(/<\/(tr|th|td)>/g, '\u0000');

// finish html to plain conversion
	obj.plain = obj.plain.replace(/<[^>]*>/g, '');

// remove trailing spaces
	obj.plain = obj.plain.replace(/[ \t\u00a0]+([\n\u0000])/g, '$1');

// trim down \u0000 and \n
	obj.plain = obj.plain.replace(/\u0000+/g, '\n');
	obj.plain = obj.plain.replace(/^\n+/g, '');
	obj.plain = obj.plain.replace(/\n{2,}$/g, '\n');

	return;
}


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

function WikEdInactiveButtons() {

// undo, prevpos
	if (wikEdFrameDocument.queryCommandEnabled('undo') == true ) {
		document.getElementById('wikEdUndo').className = 'wikEdButton';
		document.getElementById('wikEdPrevPos').className = 'wikEdButton';
		document.getElementById('wikEdUndoAll').className = 'wikEdButton';
	}
	else {
		document.getElementById('wikEdUndo').className = 'wikEdButtonInactive';
		document.getElementById('wikEdPrevPos').className = 'wikEdButtonInactive';
		document.getElementById('wikEdUndoAll').className = 'wikEdButtonInactive';
	}

// redo
	if (wikEdFrameDocument.queryCommandEnabled('redo') == true ) {
		document.getElementById('wikEdRedo').className = 'wikEdButton';
	}
	else {
		document.getElementById('wikEdRedo').className = 'wikEdButtonInactive';
	}

// redo all
	if (wikEdLastVersion != null) {
		document.getElementById('wikEdRedoAll').className = 'wikEdButton';
	}
	else {
		document.getElementById('wikEdRedoAll').className = 'wikEdButtonInactive';
	}

// lastpos
	if (wikEdLastPosObj != null) {
		document.getElementById('wikEdLastPos').className = 'wikEdButton';
	}
	else {
		document.getElementById('wikEdLastPos').className = 'wikEdButtonInactive';
	}

	return;
}

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

/// change: double spaces ok after dot

function WikEdFixBasic(obj) {

// non-breaking space character to normal space
	obj.plain = obj.plain.replace(/(\u00a0)/g, ' ');

// remove trailing spaces
	obj.plain = obj.plain.replace(/( |&nbsp;)+\n/g, '\n');

// empty line before and after headings, spaces around word (lookahead)
	obj.plain = obj.plain.replace(/\n+(=+) *([^\n]*?) *(=+)(?=\n)\n*/g, '\n\n$1 $2 $3\n\n');

// uppercase well known headings
	obj.plain = obj.plain.replace(/\n=+ external links? =+\n/ig, '\n== External links ==\n');
	obj.plain = obj.plain.replace(/\n=+ see also =+\n/ig, '\n== See also ==\n');
	obj.plain = obj.plain.replace(/\n=+ references? =+\n/ig, '\n== References ==\n');

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

// empty line before and after tables
	obj.plain = obj.plain.replace(/\n+(\{\|)/g, '\n\n$1');
	obj.plain = obj.plain.replace(/(\n\|\}) *([^\n]*)[\n|$]+/g, '$1\n\n$2\n\n');

// empty line before and after lists
	obj.plain = obj.plain.replace(/(^|\n)([^\*\#\:\;].*?)\n+([\*\#\:\;])/g, '$1$2\n\n$3');
	obj.plain = obj.plain.replace(/(^|\n)([\*\#\:\;].*?)\n+([^\*\#\:\;])/g, '$1$2\n\n$3');

// split into lines and change single lines, used to handle tables
	var lines = obj.plain.split('\n');
	obj.plain = '';
	var tableflag = false;
	for (var i = 0; i < lines.length; i++) {
		var line = lines[i];

// do not change lines starting with a blank
		if ( ! line.match(/^ /) ) {

// detect table
			if ( line.match(/^(\{\||\!|\|[^}])/) ) {
				tableflag = true;
			}
			else if ( line.match(/^\|\}/) ) {
				tableflag = false;
			}

// changes only to be done in tables
			if (tableflag) {

// add spaces around ||
				line = line.replace(/ *\|\| */g, ' || ');
			}

// changes not to be done in tables
			if ( ! tableflag) {

// empty line before and after images
				line = line.replace(/^(\[\[image:.*?\]\])/ig, '\n$1');
				line = line.replace(/(\[\[image:.*?(\[\[.*?\]\].*?)*\]\])$/ig, '$1\n');

// empty line before and after includes
				line = line.replace(/^(\{\{.*?\}\})/g, '\n$1');
				line = line.replace(/(\{\{.*?\}\})$/g, '$1\n');

// to be done: convert single newlines into spaces
//      line = line.replace(/(\n[^\n \*\#\:\;\|\{].*?)\n([^\n \*\#\:\;\|\{])/g, '$1 $2');
			}
		}

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

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

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

// no space around pipes before brackets
	obj.plain = obj.plain.replace(/ +\| +\]\]/g, '|]]');

// no space around pipes before curly brackets
	obj.plain = obj.plain.replace(/ +\| +\}\}/g, '|}}');

// no empty line between headings and includes
	obj.plain = obj.plain.replace(/\n(=+ [^\n]*? =+\n)\n+(\{\{.*?\}\})/g, '\n$1$2');

// spaces in comments
	obj.plain = obj.plain.replace(/(&lt;!--) *([^\n]*?) *(--&gt;)/g, '$1 $2 $3');


/* ????
// empty lines around html comments
	obj.plain = obj.plain.replace(/\n+(&lt;!--.*?--&gt;)\n+/g, '\n$1\n\n');
	obj.plain = obj.plain.replace(/^(&lt;!--.*?--&gt;)\n+/g, '$1\n');
	obj.plain = obj.plain.replace(/\n+(&lt;!--.*?--&gt;)$/g, '\n$1');
*/

// empty line before and after categories
	obj.plain = obj.plain.replace(/( |\n)*(\[\[category:[^\n]*?\]\])( |\n)*/gi, '\n\n$2\n\n');

// categories not separated by empty lines (lookahead)
	obj.plain = obj.plain.replace(/(\[\[category:[^\n]*?\]\])\n*(?=\[\[category:[^\n]*?\]\])/gi, '$1\n');

// single empty lines only
	obj.plain = obj.plain.replace(/\n{3,}/g, '\n\n');

// remove leading and trailing newlines
	obj.plain = obj.plain.replace(/^\n+/, '');
	obj.plain = obj.plain.replace(/\n{2,}$/, '\n');

	return;
}


//
// WikEdFixPunct: remove space before .,:;
//

function WikEdFixPunct(obj) {
	WikEdFixBasic(obj);

	obj.plain = obj.plain.replace(/([\w\'\"\”\]\}\)]) +([\.\,\:\;])(\s+|$)/g, '$1$2 ');
	obj.plain = obj.plain.replace(/\s+$/g, '');

	return;
}


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

function WikEdFixUnicode(obj) {

// replace supported chars: change decimal, hex, and character entities into actual char
	for (i = 0; i < wikEdSupportedChars.length; i ++) {
		var replaceChar = String.fromCharCode(parseInt(wikEdSupportedChars[i][0], 16));

// decimal representation
		var regExpStr = '&#0*' + parseInt(wikEdSupportedChars[i][0], 16) + ';|';

// hex representation
		regExpStr += '&#x0*' + wikEdSupportedChars[i][0] + ';';

// case insensitive replace
		var regExp = new RegExp(regExpStr, 'gi');
		obj.plain = obj.plain.replace(regExp, replaceChar);

// character entity representation
		regExpStr = '&amp;' + wikEdSupportedChars[i][1] + ';';

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

// replace unsupported chars in IE6: change decimal, hex, and chars into character entities
	for (i = 0; i < wikEdProblemChars.length; i ++) {
		replaceChar = '&' + wikEdProblemChars[i][1] + ';';

// decimal representation
		regExpStr = '&#0*' + parseInt(wikEdProblemChars[i][0], 16) + ';|';

// hex representation
		regExpStr += '&#x0*' + wikEdProblemChars[i][0] + ';';

// case insensitive replace
		regExp = new RegExp(regExpStr, 'gi');
		obj.plain = obj.plain.replace(regExp, replaceChar);

// actual character representation
		regExpStr = '\\u' + wikEdProblemChars[i][0];

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

// replace special chars (spaces and invisible characters): change decimal, hex, and chars into character entities
	for (i = 0; i < wikEdSpecialChars.length; i ++) {
		var replaceChar = '&amp;' + wikEdSpecialChars[i][1] + ';';

// decimal representation
		var regExpStr = '&#0*' + parseInt(wikEdSpecialChars[i][0], 16) + ';|';

// hex representation
		regExpStr += '&#x0*' + wikEdSpecialChars[i][0] + ';';

// case insensitive replace
		var regExp = new RegExp(regExpStr, 'gi');
		obj.plain = obj.plain.replace(regExp, replaceChar);

// actual character representation
		regExpStr = '\\u' + wikEdSpecialChars[i][0];

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

// unicode line separator and paragraph separator
	obj.plain = obj.plain.replace(/\u2028/g, '\n');
	obj.plain = obj.plain.replace(/\u2029/g, '\n\n');

	return;
}


//
// WikEdFixMath: math character fixer, originally from User:Omegatron
//

function WikEdFixMath(obj) {

	WikEdFixBasic(obj);

// change only outside <math> </math> wikicode
	obj.plain = obj.plain.replace(/(.*?)((&lt;math(\b.*?)&gt;.*?&lt;\/math&gt;)|$)/gi,
		function (p, p1, p2) {

// convert html entities into actual dash characters
			p1 = p1.replace(/&plus;/g, '+');
			p1 = p1.replace(/&minus;/g, '\u2212');
			p1 = p1.replace(/&middot;/g, '·');

// convert dash next to a number into a minus sign character
			p1 = p1.replace(/([^\w\,\{])-(\d)/g, '$1\u2212$2');

// changes 2x3 to 2×3
			p1 = p1.replace(/(\d *)x( *\d)/g, '$1\u00d7$2');

// changes 10^3 to 10<sup>3</sup>
			p1 = p1.replace(/(\d*\.?\d+)\^(\u2212?\d+\.?\d*)/g, '$1&lt;sup&gt;$2&lt;/sup&gt;');

// change x^3 to x<sup>3</sup>
			p1 = p1.replace(/([\w])\^(\u2212?\d+\.?\d*) /g, '$1&lt;sup&gt;$2&lt;/sup&gt;');

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

// htmlize single char superscripts
			p1 = p1.replace(/(\u00b9|&sup1;)/g, '&lt;sup&gt;1&lt;/sup&gt;');
			p1 = p1.replace(/(\u00b2|&sup2;)/g, '&lt;sup&gt;2&lt;/sup&gt;');
			p1 = p1.replace(/(\u00b3|&sup3;)/g, '&lt;sup&gt;3&lt;/sup&gt;');

			return(p1 + p2);
		}
	);
	return;
}


//
// WikEdFixChem: fix chemical formulas
//

function WikEdFixChem(obj) {

	WikEdFixBasic(obj);

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

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

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

// fix superscripts
	obj.plain = obj.plain.replace(/&plus;/g, '+');
	obj.plain = obj.plain.replace(/&minus;/g, '\u2212');
	obj.plain = obj.plain.replace(/&middot;/g, '·');
	regExp = new RegExp('(' + realElements + pseudoElements + '|\\))(\\d*(\\+|-|\\u2212))', 'g');
	obj.plain = obj.plain.replace(regExp,
		function (p, p1, p2, p3) {
			p2 = p2.replace(/-/g, '\u2212');
			return(p1 + '&lt;sup&gt;' + p2 + '&lt;/sup&gt;');
		}
	);

// fix indices
	regExp = new RegExp('(' + realElements + pseudoElements + '|\\))(\\d+)', 'g');
	obj.plain = obj.plain.replace(regExp, '$1&lt;sub&gt;$2&lt;/sub&gt;');

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

// fix arrows
	obj.plain = obj.plain.replace(/ *-+&gt; */g, ' \u2192 ');
	obj.plain = obj.plain.replace(/ *&lt;-+ */g, ' \u2190 ');

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

// fix -
	obj.plain = obj.plain.replace(/(\w|\)|&gt;) +(-|\u2212) +(\w|\()/g, '$1 \u2212 $3');

	return;
}


//
// WikEdFixUnits: unit formatter - new tab adds spaces between number and units, makes units consistent
// originally from User:Omegatron
//

function WikEdFixUnits(obj) {
	WikEdFixBasic(obj);

// convert all &deg; into actual ° symbol
	obj.plain = obj.plain.replace(/&deg;/g, '°');

// convert the word ohm(s) or the html entity into the actual Omega symbol (not the actual ohm symbol &#8486;) and make sure it's spaced
	obj.plain = obj.plain.replace(/(\d) ?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|&mu;|µ|&micro;|n|p|f|a|z|y)? ?(&Omega;|&#8486;|(ohm|Ohm)s?)([\s.,:;\'\"\/\)])/g, '$1 $2\u03a9$5');

// convert various micro symbols into the actual micro symbol, make sure it's spaced
	obj.plain = obj.plain.replace(/(\d) ?(&mu;|&micro;)(g|s|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|O|F|Wb|T|H|S|Bq|Gy|Sv|kat|°C|M)([\s.,:;\'\"\/\)])/g, '$1 µ$3$4');

// convert capital K to lowercase k in units
	obj.plain = obj.plain.replace(/(\d) ?K(g|s|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|O|F|Wb|T|H|S|Bq|Gy|Sv|kat|°C|M)([\s.,:;\'\"\/\)])/g, '$1 k$2$3');

// capitalize units correctly
	obj.plain = obj.plain.replace(/(\d) ?(khz)([ ,.])/gi, '$1 kHz$3');
	obj.plain = obj.plain.replace(/(\d) ?(mhz)([ ,.])/gi, '$1 MHz$3');
	obj.plain = obj.plain.replace(/(\d) ?(ghz)([ ,.])/gi, '$1 GHz$3');
	obj.plain = obj.plain.replace(/(\d) ?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|&mu;|µ|&micro;|n|p|f|a|z|y)?(hz|HZ)([\s.,:;\'\"\/\)])/g, '$1 $2Hz$4');
	obj.plain = obj.plain.replace(/(\d) ?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|&mu;|µ|&micro;|n|p|f|a|z|y)?(pa|PA)([\s.,:;\'\"\/\)])/g, '$1 $2Pa$4');

// add a space before dB
	obj.plain = obj.plain.replace(/(\d) ?(dB)([\s.,:;\'\"\/\)])/g, '$1 $2$3');

// add a space before any units that were missed before
	obj.plain = obj.plain.replace(/(\d) ?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|&mu;|µ|&micro;|n|p|f|a|z|y)?(g|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|O|F|Wb|T|H|S|Bq|Gy|Sv|kat|°C|M)([\s.,:;\'\"\/\)])/g, '$1 $2$3$4');

// separate one for seconds since they give a lot of false positives like "1970s". Only difference is mandatory prefix.
	obj.plain = obj.plain.replace(/(\d) ?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|&mu;|µ|&micro;|n|p|f|a|z|y)(s)([\s.,:;\'\"\/\)])/g, '$1 $2$3$4');

// bps or b/s or bits/s --> bit/s
	obj.plain = obj.plain.replace(/([KkMmGgTtPpEeYyZz])(bps|bits?\/s|b\/s)/g, '$1bit/s');

// Bps or byte/s or bytes/s --> B/s
	obj.plain = obj.plain.replace(/([KkMmGgTtPpEeYyZz])(Bps|bytes?\/s)/g, '$1B/s');

// after that, make capitalization correct
	obj.plain = obj.plain.replace(/K(bit|B)\/s/g, 'k$1/s');
	obj.plain = obj.plain.replace(/m(bit|B)\/s/g, 'M$1/s');
	obj.plain = obj.plain.replace(/g(bit|B)\/s/g, 'G$1/s');
	obj.plain = obj.plain.replace(/t(bit|B)\/s/g, 'T$1/s');
	obj.plain = obj.plain.replace(/e(bit|B)\/s/g, 'E$1/s');
	obj.plain = obj.plain.replace(/y(bit|B)\/s/g, 'Y$1/s');
	obj.plain = obj.plain.replace(/z(bit|B)\/s/g, 'Z$1/s');

// fix a common error
	obj.plain = obj.plain.replace(/mibi(bit|byte)/g, 'mebi$1');

	return;
}


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

function WikEdFixDashes(obj) {
	WikEdFixBasic(obj);

// convert html entities into actual dash characters
	obj.plain = obj.plain.replace(/&mdash;/g, '—');
	obj.plain = obj.plain.replace(/&ndash;/g, '–');
	obj.plain = obj.plain.replace(/&minus;/g, '\u2212');

// convert -- and em dashes with or without spaces to em dash surrounded by spaces
	obj.plain = obj.plain.replace(/([a-zA-Z\'\"”\]\}\)]) *(--|—|&mdash;) *([a-zA-Z\'\"“\[\{\(])/g, '$1 — $3');

// convert - or en dashes with spaces to em dash character surrounded by spaces
	obj.plain = obj.plain.replace(/([a-zA-Z\'\"”\]\}])( |&nbsp;)+(\u2212|–|&ndash;) +([a-zA-Z\'\"“\[\{])/g, '$1$2— $4');

// convert hyphen next to lone number into a minus sign character
	obj.plain = obj.plain.replace(/([a-zA-Z\'\"”\]\>] )-(\d)/g, '$1\u2212$2');

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

	return;
}


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

function WikEdFixHTML(obj) {
	WikEdFixBasic(obj);

// remove syntax highlighting
	obj.html = obj.plain;
	obj.html = obj.html.replace(/\n/g, '<br />');
	WikEdRemoveHighlighting(obj);

// turn visible html code into real html, exclude comments
	obj.html = obj.html.replace(/&lt;(\/?\w.*?)&gt;/g, '<$1>');

// wikify
	WikEdWikifyHTML(obj);

// turn real html into visible html code
	obj.html = obj.html.replace(/<br\b[^>]*>/g, '\n');
	obj.html = obj.html.replace(/</g, '&lt;');
	obj.html = obj.html.replace(/>/g, '&gt;');
	obj.plain = obj.html;

	return;
}


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

function WikEdFixCaps(obj) {
	WikEdFixBasic(obj);

// uppercase lists
// start (listcode (char-ent|tag|category..|digit|non-word,non-ret))(word,non-digit..) end
	obj.plain = obj.plain.replace(/^([\*\#\:\;]+ (\&\w+\;|&lt;[^\n]*?&gt;|\{\{.*?\}\}[^\n]*|\d|[^\w\n])*)([^\W\d].*?)?$/gm,
		function (p, p1, p2, p3) {
			if ( ! p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda|$)/) ) {
				p3 = p3.substr(0, 1).toUpperCase() + p3.substr(1);
			}
			return(p1 + p3);
		}
	);

// uppercase link lists (link)
	obj.plain = obj.plain.replace(/^([\*\#\:\;]+ \[\[)([^\n]*?)(\]\])/gm,
		function (p, p1, p2, p3) {

// uppercase link
			p2 = p2.replace(/^((\&\w+\;|\W|\d)*)([^\W\d].*)$/,
				function (p, p1, p2, p3) {
					if ( ! p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/) ) {
						p3 = p3.substr(0, 1).toUpperCase() + p3.substr(1);
					}
					return(p1 + p3);
				}
			);

// uppercase comment
			p2 = p2.replace(/(\| *(\&\w+\;|&lt;[^\n]*?&gt;|\W|\d)*)([^\W\d].*)$/,
				function (p, p1, p2, p3) {
					if ( ! p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/) ) {
						p3 = p3.substr(0, 1).toUpperCase() + p3.substr(1);
					}
					return(p1 + p3);
				}
			);
			return(p1 + p2 + p3);
		}
	);

// uppercase headings
	obj.plain = obj.plain.replace(/^(=+ (\&\w+\;|&lt;[^\n]*?&gt;|\d|[^\w\n])*)([^\W\d].*? =+)$/gm,
		function (p, p1, p2, p3) {
			if ( ! p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/) ) {
				p3 = p3.substr(0, 1).toUpperCase() + p3.substr(1);
			}
			return(p1 + p3);
		}
	);

// uppercase images
	obj.plain = obj.plain.replace(/(\[\[)image:(\w)([^\n]*\]\])/igm,
		function (p, p1, p2, p3) {
			return(p1 + 'Image:' + p2.toUpperCase() + p3);
		}
	);

	return;
}

//
// WikEdFixAll:
//

function WikEdFixAll(obj) {
	WikEdFixBasic(obj);
	WikEdFixUnicode(obj);
	WikEdFixHTML(obj);
	WikEdFixCaps(obj);
	return;
}


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

function WikEdRemoveElements(tagNameArray) {

// cycle through the element names
	for each (var tagNameStr in tagNameArray) {
		var elementArray = wikEdFrameDocument.getElementsByTagName(tagNameStr);
		for (i = 0; i < elementArray.length; i ++) {
			elementArray[i].parentNode.removeChild(elementArray[i]);
		}
	}
	return;
}


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

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

// get the start node and offset
	var startNode = selection.range.startContainer;
	var startNodeOffset = selection.range.startOffset;

// get the end node and offset
	var endNode = selection.range.endContainer;
	var endNodeOffset = selection.range.endOffset;

	if (startNode.nodeType == 1) {
		startNode = startNode.childNodes[startNodeOffset];
		startNodeOffset = 0;
	}
	if (endNode.nodeType == 1) {
		endNode = endNode.childNodes[endNodeOffset];
		endNodeOffset = 0;
	}

// find the start and end nodes in the whole plain text arrays
	var startNodeIndex;
	var endNodeIndex;
	for (i = 0; i < whole.plainNode.length; i ++) {
		if (startNode == whole.plainNode[i]) {
			startNodeIndex = i;
		}
		if (endNode == whole.plainNode[i]) {
			endNodeIndex = i;
			break;
		}
	}

// find last previous word and line boundary
	var foundWord = false;
	var foundLine = false;
	var regExp = new RegExp('.*[^\\w\\-]', 'g');
	var plain = '';

// check text nodes left-wise for a boundary
	for (i = startNodeIndex; i >= 0; i --) {
		plain = whole.plainArray[i];

				plain = plain.replace(/&amp;/g, '&');
				plain = plain.replace(/&lt;/g, '<');
				plain = plain.replace(/&gt;/g, '>');

// boundary is a newline
		if (plain == '\n') {

// current newline is the start node
			if (i == startNodeIndex) {
				if (! foundWord) {
					word.range.setStartBefore(whole.plainNode[i]);
					foundWord = true;
				}
				line.range.setStartBefore(whole.plainNode[i]);
			}
			else {
				if (! foundWord) {
					word.range.setStartAfter(whole.plainNode[i]);
					foundWord = true;
				}
				line.range.setStartAfter(whole.plainNode[i]);
			}
			foundLine = true;
			break;
		}

// check text node for a word boundary
		else if (! foundWord) {
			if (i == startNodeIndex) {
				plain = plain.substr(0, startNodeOffset);

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

// boundary is start of text
	if (! foundLine) {
		line.range.setStartBefore(whole.plainNode[0]);
		if (! foundWord) {
			word.range.setStartBefore(whole.plainNode[0]);
		}
	}

// find next word and line boundary
	regExp = new RegExp('[^\\w\\-]', 'g');
	foundWord = false;
	foundLine = false;

// check text nodes right-wise for a boundary
	for (i = endNodeIndex; i < whole.plainArray.length; i ++) {
		plain = whole.plainArray[i];

				plain = plain.replace(/&amp;/g, '&');
				plain = plain.replace(/&lt;/g, '<');
				plain = plain.replace(/&gt;/g, '>');

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

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

// boundary is end of text
	if (! foundLine) {
		line.range.setEndAfter(whole.plainNode[whole.plainArray.length - 1]);
		if (! foundWord) {
			word.range.setEndAfter(whole.plainNode[whole.plainArray.length - 1]);
		}
	}
	return;
}


//
// remove syntax highlighting and wikify
//

function WikEdRemoveHighlightingWikify(obj) {

	if (obj.html != '') {

// remove syntax highlighting
		WikEdRemoveHighlighting(obj);

// wikify
		if (obj.htmlCode == true) {
			WikEdWikifyHTML(obj);
		}
	}
	return;
}


//
// WikEdWikifyHTML:
//   obj.html contains the text to be wikified
//   expects < > &lt; &gt; &amp;  spaces instead of &nbsp;  \n instead of <br />

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

function WikEdWikifyHTML(obj) {

	var regExpStr;
	var regExp;
	var regExpMatch;

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

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

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

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

// remove trailing spaces
	obj.html = obj.html.replace(/[ \t]+\n/g, '\n');

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

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

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

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

// remove comments
	obj.html = obj.html.replace(/<!--.*?-->/g, '');

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

// <i> <em> <dfn> <var> <cite> italic
	obj.html = obj.html.replace(/<(i|em|dfn|var|cite)\b[^>]*>/g, '\'\'');
	obj.html = obj.html.replace(/<\/(i|em|dfn|var|cite)\b[^>]*>/g, '\'\'');

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

// <h1> .. <h6> headings
	obj.html = obj.html.replace(/<span class=\"editsection\">.*?<\/span> */g, '');

	obj.html = obj.html.replace(/\s*<h1\b[^>]*>(.*?)<\/h1>\s*/g, '\n\n= $1 =\n\n');
	obj.html = obj.html.replace(/\s*<h2\b[^>]*>(.*?)<\/h2>\s*/g, '\n\n== $1 ==\n\n');
	obj.html = obj.html.replace(/\s*<h3\b[^>]*>(.*?)<\/h3>\s*/g, '\n\n=== $1 ===\n\n');
	obj.html = obj.html.replace(/\s*<h4\b[^>]*>(.*?)<\/h4>\s*/g, '\n\n==== $1 ====\n\n');
	obj.html = obj.html.replace(/\s*<h5\b[^>]*>(.*?)<\/h5>\s*/g, '\n\n===== $1 =====\n\n');
	obj.html = obj.html.replace(/\s*<h6\b[^>]*>(.*?)<\/h6>\s*/g, '\n\n====== $1 ======\n\n');

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

// sanitize <span> <div>
	obj.html = obj.html.replace(/<(span|div) ([^>]*)>/g,
		function (p, p1, p2) {
			return('<' + p1 + WikEdSanitizeAttributes(p1, p2) +  '>');
		}
	);

// remove <thead> <tbody> <tfoot>
	obj.html = obj.html.replace(/\s*<(thead|tbody|tfoot)\b[^>]*>\s*/g, '');

// line breaks in table cells
	obj.html = obj.html.replace(/(<(td|th)\b[^>]*>)\s*([^]*?)(<\/\2>)/g,
		function(p, p1, p2, p3, p4) {
			p3 = p3.replace(/\n/g, '&lt;br /&gt;\n');
			return(p1 + '<br />' + p3 + p4);
		}
	);

// remove table closing tags
	obj.html = obj.html.replace(/(<\/(td|th|tr|caption|thead|tbody|tfoot)>)/g, '');

// <td> table cells
	obj.html = obj.html.replace(/\s*<td>/g, '\n| ');
	obj.html = obj.html.replace(/\s*<(td) ([^>]*)>\s*/g,
		function (p, p1, p2) {
			return('\n|' + WikEdSanitizeAttributes(p1, p2) + ' | ');
		}
	);

// <th> table cells
	obj.html = obj.html.replace(/\s*<th>\s*/g, '\n| ');
	obj.html = obj.html.replace(/\s*<(th) ([^>]*)>\s*/g,
		function (p, p1, p2) {
			return('\n!' + WikEdSanitizeAttributes(p1, p2) + ' | ');
		}
	);

// line breaks in table cells continued
	obj.html = obj.html.replace(/<br\b[^>]*>/g, '\n');

// <tr> table rows
	obj.html = obj.html.replace(/\s*<tr>\s*/g, '\n|-\n');
	obj.html = obj.html.replace(/\s*<(tr) ([^>]*)>\s*/g,
		function (p, p1, p2) {
			return('\n|-' + WikEdSanitizeAttributes(p1, p2) + '\n');
		}
	);

// <caption> captionCaption
	obj.html = obj.html.replace(/\s*<caption>\s*/g, '\n|+ ');
	obj.html = obj.html.replace(/\s*<(caption) ([^>]*)>\s*/g,
		function (p, p1, p2) {
			return('\n|+' + WikEdSanitizeAttributes(p1, p2) + ' | ');
		}
	);

// <table> tables
	obj.html = obj.html.replace(/\s*<table>\s*(\|-\n)?/g, '\n\n{|\n');
	obj.html = obj.html.replace(/\s*<(table) ([^>]*)>\s*(\|-\n)?/g,
		function (p, p1, p2) {
			return('\n{|' + WikEdSanitizeAttributes(p1, p2) + '\n');
		}
	);
	obj.html = obj.html.replace(/\s*<\/table>\s*/g, '\n|}\n\n');

// convert links
	var regExpMatch = [];
	var regExpStr = '(<a(\\b[^>]*)>(.*?)</a>)';
	var regExp = new RegExp(regExpStr, 'gi');
	obj.html = obj.html.replace(regExp,
		function (p, p1, p2, p3) {
			var linkPar = p2;
			var linkText = p3;
			var linkArticle = '';
			var linkTitle = '';
			var imgWidth = '';

// internal wiki links

// get the title="" parameter
			regExpStr = ' href=\\"' + wikEdServer + '(' + wikEdArticlePath + '|' + wikEdScriptPath + ')([^\\">]*)\\"';
			regExp = new RegExp(regExpStr);
			regExpMatch = regExp.exec(linkPar);
			if (regExpMatch != null) {
				regExpStr = ' title=\\"([^\\">]*)\\"';
				regExp = new RegExp(regExpStr);
				regExpMatch = regExp.exec(linkPar);
				if (regExpMatch != null) {
					linkTitle = regExpMatch[1];
				}
			}

// get wiki article name from url parameter list
			regExpStr = ' href=\\"' + wikEdServer + wikEdScriptPath + 'index\\.php\\?[^\\"]*?\\btitle=([^\\"]*?)(&amp;|\\")';
			regExp = new RegExp(regExpStr);
			regExpMatch = regExp.exec(linkPar);
			if (regExpMatch != null) {
				linkArticle = regExpMatch[1];
				if (linkArticle != '') {
					linkArticle = linkArticle.replace(/_/g, ' ');
					linkArticle = decodeURIComponent(linkArticle);

// ISBN links
					regExpStr = ' href=\\"' + wikEdServer + wikEdScriptPath + 'index\\.php\\?[^\\"]*?\\bisbn=(\\d+)(&amp;|\\")';
					regExp = new RegExp(regExpStr);
					regExpMatch = regExp.exec(linkPar);
					if (regExpMatch != null) {
						return('ISBN ' + regExpMatch[1]);
					}
				}
			}

// get wiki article name from url
			if (linkArticle == '') {
				regExpStr = ' href=\\"' + wikEdServer + wikEdArticlePath + '([^\\"]*)\\"';
				regExp = new RegExp(regExpStr);
				regExpMatch = regExp.exec(linkPar);
				if (regExpMatch != null) {
					linkArticle = regExpMatch[1];
					if (linkArticle != '') {
						linkArticle = linkArticle.replace(/_/g, ' ');
						linkArticle = decodeURIComponent(linkArticle);
					}
				}
			}

// format wiki link
			if (linkArticle != '') {

// check for wiki image
				regExpStr = '^<img\\b[^>]*?\\bwidth=\\"(\\d+)\\"[^>]*?>$';
				regExp = new RegExp(regExpStr);
				regExpMatch = regExp.exec(linkText);
				if (regExpMatch != null) {
					imgWidth = regExpMatch[1];
					imgWidth = '|' + imgWidth + 'px';
					if ( (linkTitle != '') && (linkTitle != 'Enlarge') ) {
						linkTitle = '|' + linkTitle;
						return('[[' + linkArticle + imgWidth + linkTitle + ']]');
					}
					else {
						return('[[' + linkArticle + imgWidth + ']]');
					}
				}

// ISBN link
				regExpStr = '^' + wikEdServer + wikEdScriptPath + 'index\\.php\\?.*?\\btitle=.*?&amp;isbn=(\d+)';
				regExp = new RegExp(regExpStr);
				regExpMatch = regExp.exec(linkAddr);
				if (regExpMatch != null) {
					return('ISBN ' + regExpMatch[1]);
				}

// category link
				regExpMatch = /^category:(.*)/i.exec(linkArticle);
				if (regExpMatch != null) {
					return('[[Category:' + regExpMatch[1].substr(0, 1).toUpperCase() + linkText.substr(1) + ']]');
				}

// wiki link
				if (linkArticle == linkText.substr(0, 1).toUpperCase() + linkText.substr(1)) {
					return('[[' + linkText + ']]');
				}

// date link (English only)
				regExpMatch = /^(January|February|March|April|May|June|July|August|September|October|November|December) (\d{1,2})$/.exec(linkArticle);
				if (regExpMatch != null) {
					var month = regExpMatch[1];
					var day = regExpMatch[2];
					if (linkText == (day + ' ' + month) ) {
						return('[[' + linkArticle + ']]');
					}
				}

// lowercase the article name if the first char of the link text can exist in lower/uppercase and is lowercase
				if ( linkText.substr(0, 1).toLowerCase() != linkText.substr(0, 1).toUpperCase() ) {
					if ( linkText.substr(0, 1) == linkText.substr(0, 1).toLowerCase() ) {
						linkArticle = linkArticle.substr(0, 1).toLowerCase() + linkArticle.substr(1);
					}
				}

// suffix links
				regExpStr = '^' + linkArticle.replace(/(\W)/, '\\$1') + '(\\w+)$';
				regExp = new RegExp(regExpStr);
				regExpMatch = regExp.exec(linkText);
				if (regExpMatch != null) {
					return('[[' + linkText + ']]' + regExpMatch[1]);
				}
				return('[[' + linkArticle + '|' + linkText + ']]');
			}

// external link
			regExpMatch = linkPar.match(/ href=\"([^\">]*)\"/);
			if (regExpMatch != null) {
				var linkAddr = regExpMatch[1];
				if (linkAddr != '') {

// PubMed link
					regExpMatch = /^http:\/\/www\.ncbi\.nlm\.nih\.gov\/entrez\/query\.fcgi\?cmd=Retrieve&amp;db=pubmed&amp;.*?&amp;list_uids=(\d+)/.exec(linkAddr);
					if (regExpMatch != null) {
						return('PMID ' + regExpMatch[1]);
					}

// DOI link
					regExpMatch = /^http:\/\/dx\.doi\.org\/(.*)/.exec(linkAddr);
					if (regExpMatch != null) {
						return('{{doi|' + regExpMatch[1] + '}}');
					}

// other external link
					return('[' + linkAddr + ' ' + linkText + ']');
				}
			}

// return unchanged text
			return(p1);
		}
	);

// clean up MediaWiki category list
	obj.html = obj.html.replace(/<span\b[^>]*>(\[\[Category:[^\]]+\]\])<\/span>[\s\|]*/gi, '$1\n');

// clean up DOI
	obj.html = obj.html.replace(/\[\[Digital object identifier\|DOI\]\]:(\{\{doi\|[^\}\s]+\}\})/gi, '$1');

// convert images
	obj.html = obj.html.replace(/<img\b([^>]*)>/g,
		function (p, p1) {

// get and format parameters
			var address = '';
			var regExpMatch = /\bsrc\s*=\s*(\'|\")([^\'\"]*)(\'|\")/i.exec(p1);
			if (regExpMatch != null) {
				address = regExpMatch[2].replace(/^ +| +$/g, '');
			}

			var imgAlt = '';
			regExpMatch = /\balt\s*=\s*(\'|\")([^\'\"]*)(\'|\")/i.exec(p1);
			if (regExpMatch != null) {
				imgAlt = regExpMatch[2].replace(/^ +| +$/g, '');
				imgAlt = imgAlt.replace(/&amp;nbsp;|\n/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('[[Image:' + imgLink + imgWidth + imgAlt + ']]');
				}
			}
			return('');
		}
	);

// convert lists: * # : ;
	var listObj = {};
	listObj.prefix = '';
	obj.html = obj.html.replace(/ *<(\/?(ol|ul|li|dl|dd|dt))\b[^>]*> */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');
				case 'li':
				case 'dd':
					return('\u0000' + listObj.prefix + ' ');
				case 'dt':
					return('\u0000' + listObj.prefix.replace(/:$/, ';') + ' ');
				case '/li':
				case '/dt':
				case '/dd':
					return('');
			}
		}
	);
	obj.html = obj.html.replace(/\u0000+[#\*:\;]+ (?=\u0000)/g, '');
	obj.html = obj.html.replace(/\u0000+/g, '\n');

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

// 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, '');
	obj.html = obj.html.replace(/<(blockquote|center|div|math|gallery|noinclude|includeonly|ref|references)\b[^>]*><\/\1>/g, '\n');

// escape < >
	obj.html = obj.html.replace(/</g, '&lt;');
	obj.html = obj.html.replace(/>/g, '&gt;');

// newlines to <br />
	obj.html = obj.html.replace(/[ \t]+\n/g, '\n');
	obj.html = obj.html.replace(/\n{3,}/g, '\n\n');
	obj.html = obj.html.replace(/\n/g, '<br />');

	return;
}


//
// WikEdSanitizeAttributes: see Sanitizer.php
//

function WikEdSanitizeAttributes(tag, attributes) {

	var common = 'lang|dir|style|class'; // not needed: id|title
	var tablealign = '|align|char|charoff|valign';
	var tablecell = '|abbr|axis|headers|scope|rowspan|colspan|nowrap|width|height|bgcolor';
	tag = tag.toLowerCase();
	var sanitized = '';
	var regExp = /(\w+)\s*=\s*(\'|\")([^\'\"]*)(\'|\")/g;
	var regExpMatch;
	while (regExpMatch = regExp.exec(attributes)) {
		var attrib = regExpMatch[1];
		var attribValue = regExpMatch[3];
		if (attribValue == '') {
			continue;
		}
		var valid = false;
		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 + '|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor|frame|rules|border').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) {
		}
		if (valid == true) {

// remove non-standard styles and clean up
			if (attrib == 'style') {
				attribValue = attribValue.replace(/(^| )(-moz-[\w\-]+): [\w\-]+; */g, '$1');
				attribValue = attribValue.replace(/(^| )([\w\-]+): (-moz-[\w\-]+|windowtext); */g, '$1');
				attribValue = attribValue.replace(/\b0(%|in|cm|mm|em|ex|pt|pc|px)\b/g, '0');
				attribValue = attribValue.replace(/[\w\-]+ *\: *\; */g, '');
				attribValue = attribValue.replace(/ *(;|:) */g, '$1 ');
				attribValue = attribValue.replace(/( |;)+$/g, ';');
			}
			sanitized += ' ' + attrib + '="' + attribValue + '"';
		}
	}
	return(sanitized);
}


//
//
// WikEdRemoveHighlighting: remove syntax highlighting in obj.plain; sets obj.htmlCode if text contains html code
//

function WikEdRemoveHighlighting(obj) {

// remove highlighting and atttribute-free span tags
	var isRemove = [];
	obj.html = obj.html.replace(/(<(\/?)span\b([^>]*)>)/g,
		function (p, p1, p2, p3) {
			if (p2 == '') {
				if (/\bclass=\"wikEd\w+\"/.test(p3)) {
					isRemove.push(true);
					return('');
				}
				isRemove.push(false);
				return(p1);
			}
			if (isRemove.pop() == true) {
				return('');
			}
			return(p1);
		}
	);

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

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

// comments
	obj.html = obj.html.replace(/<!--wikEd\w+-->/g, '');
	obj.html = obj.html.replace(/\n|\r/g, '');

// check for pasted html content
	if (obj.html.match(/<(?!br\b)/)) {
		obj.htmlCode = true;
	}
	else {
		obj.htmlCode = false;
	}

	return;
}
//
//
// WikEdHighlightSyntax: highlight syntax in obj.html; if singleLine is set, no block syntax will be highlighted; call WikEdRemoveHighlighting first
//   expects < > &lt; &gt; &amp;  spaces instead of &nbsp;  \n instead of <br />

function WikEdHighlightSyntax(obj, singleLine) {

// block elements

// various blocks
	if (singleLine != true) {
		obj.html = obj.html.replace(/(&lt;(blockquote|center|div|pre)\b.*?&gt;)/gi, '<span class="wikEdBlock">$1');
		obj.html = obj.html.replace(/(&lt;\/(blockquote|center|div|pre)\b.*?&gt;)/gi, '$1</span><!--wikEdBlock-->');
	}

// lists * # : ;
	obj.html = obj.html.replace(/^([\*\#\:\;]+)(.*?)$/gm, '<span class="wikEdListLine"><span class="wikEdListTag">$1</span><!--wikEdListTag-->$2</span><!--wikEdListLine-->');
	if (singleLine != true) {
		obj.html = obj.html.replace(/((<span class=\"wikEdListLine\">[^\n]*\n)+)/g, '<span class="wikEdListBlock">$1');
		obj.html = obj.html.replace(/(<span class=\"wikEdListLine\">[^\n]*)(\n)(?!<span class=\"wikEdListLine\">)/g, '$1</span><!--wikEdListBlock-->$2');
	}

// #redirect (finish)
	obj.html = obj.html.replace(/(<span class=\"wikEdWikiRedir\">)(.*?<\/span><!--wikEdWikiRedir-->)/g, '$1#$2');

// space-pre
	if (singleLine != true) {
		obj.html = obj.html.replace(/^ ( *)(.*?)$/gm, '<span class="wikEdSpaceLine"><span class="wikEdSpaceTag">&nbsp;$1</span><!--wikEdSpaceTag-->$2</span><!--wikEdSpaceLine-->');
		obj.html = obj.html.replace(/((<span class=\"wikEdSpaceLine\">[^\n]*\n)+)/g, '<span class="wikEdSpaceBlock">$1');
		obj.html = obj.html.replace(/(<span class=\"wikEdSpaceLine\">[^\n]*)(\n)(?!<span class="wikEdSpaceLine">)/g, '$1</span><!--wikEdSpaceBlock-->$2');
	}

// ---- <hr> horizontal rule
	obj.html = obj.html.replace(/(^|\n|<[^>]*>)(----)(\n|<[^>]*>|$)/g, '$1<span class="wikEdHR">$2</span><!--wikEdHR-->$3');
	obj.html = obj.html.replace(/(&lt;hr&gt;)/g, '<span class="wikEdHRInline">$1</span><!--wikEdHRInline-->');

// == headings
	obj.html = obj.html.replace(/(^|\n|<[^>]*>)(=+ *)([^\n]*?)( *=+ *)(\n|<[^>]*>|$)/g,
		function (p, p1, p2, p3, p4, p5) {
			p2 = p2.replace(/(=+)/g, '<span class="wikEdWiki">$1</span><!--wikEdWiki-->');
			p4 = p4.replace(/(=+)/g, '<span class="wikEdWiki">$1</span><!--wikEdWiki-->');
			if ( /^(external links?|see also|references?)$/i.test(p3) ) {
				p1 = p1 + '<span class="wikEdHeadingWp">';
				p5 = '</span><!--wikEdHeadingWp-->' + p5;
			}
			else {
				p1 = p1 + '<span class="wikEdHeading">';
				p5 = '</span><!--wikEdHeading-->' + p5;
			}
			return(p1 + p2 + p3 + p4 + p5);
		}
	);

// tables                         {|   |+   |-   !  |}   |
	obj.html = obj.html.replace(/^(\{\||\|\+|\|\-|\!|\|\}|\|)(.*?)$/gm, '<span class="wikEdTableLine"><span class="wikEdTableTag">$1</span><!--wikEdTableTag-->$2</span><!--wikEdTableLine-->');
	if (singleLine != true) {
		obj.html = obj.html.replace(/(^|\n)((<[^>]*>)*\{\|)/g, '$1<span class="wikEdTableBlock">$2');
		obj.html = obj.html.replace(/(^|\n)((<[^>]*>)*\|\}(<[^>]*>)*)/g, '$1$2</span><!--wikEdTableBlock-->');
		obj.html = obj.html.replace(/(&lt;table\b.*?&gt;)/gi, '<span class="wikEdTableBlock">$1');
		obj.html = obj.html.replace(/(&lt;\/table\b.*?&gt;)/gi, '$1</span><!--wikEdTableBlock-->');
	}

// <gallery> wiki markup
	if (singleLine != true) {
		obj.html = obj.html.replace(/(&lt;(gallery)\b.*?&gt;)/gi, '$1<span class="wikEdWiki">$1');
		obj.html = obj.html.replace(/(&lt;\/(gallery)\b.*?&gt;)/gi, '$1</span><!--wikEdWiki-->');
	}

// various block tags
	obj.html = obj.html.replace(/(&lt;\/?(blockquote|center|div|pre)\b.*?&gt;)/gi, '<span class="wikEdBlockTag">$1</span><!--wikEdBlockTag-->');

// <p> ... </p> pairs with (wikEdBlockTag) and withhout attributes (wikEdUnknown)
	var isRemove = [];
	obj.html = obj.html.replace(/(&lt;(\/?)p\b(.*?)&gt;)/g,
		function (p, p1, p2, p3) {
			if (p2 == '') {
				if (p3 == '') {
					isRemove.push(true);
					return('<span class="wikEdUnknown">' + p1 + '</span><!--wikEdUnknown-->');
				}
				if (/\/$/.test(p3)) {
					return('<span class="wikEdUnknown">' + p1 + '</span><!--wikEdUnknown-->');
				}
				isRemove.push(false);
				return('<span class="wikEdBlockTag">' + p1 + '</span><!--wikEdBlockTag-->');
			}
			if (isRemove.pop() == true) {
				return('<span class="wikEdUnknown">' + p1 + '</span><!--wikEdUnknown-->');
			}
			return('<span class="wikEdBlockTag">' + p1 + '</span><!--wikEdBlockTag-->');
		}
	);

// inline elements

// <sup> </sub> <ins> <del>
	obj.html = obj.html.replace(/((&lt;)sup\b.*?(&gt;)(.*?)(&lt;)\/sup\b.*?(&gt;))/gi, '<span class="wikEdSuperscript">$1</span><!--wikEdSuperscript-->');
	obj.html = obj.html.replace(/((&lt;)sub\b.*?(&gt;)(.*?)(&lt;)\/sub\b.*?(&gt;))/gi, '<span class="wikEdSubscript">$1</span><!--wikEdSubscript-->');
	obj.html = obj.html.replace(/((&lt;)(ins|u)\b.*?(&gt;)(.*?)(&lt;)\/(ins|u)\b.*?(&gt;))/gi, '<span class="wikEdIns">$1</span><!--wikEdIns-->');
	obj.html = obj.html.replace(/((&lt;)(del|s|strike)\b.*?(&gt;)(.*?)(&lt;)\/(del|s|strike)\b.*?(&gt;))/gi, '<span class="wikEdDel">$1</span><!--wikEdDel-->');

// various inline tags
	obj.html = obj.html.replace(/(&lt;\/?(sub|sup|ins|u|del|s|strike|big|br|colgroup|code|font|small|span|tt|rb|rp|rt|ruby)\b.*?&gt;)/gi, '<span class="wikEdInlineTag">$1</span><!--wikEdInlineTag-->');

// unsupported or not needed <> tags
	obj.html = obj.html.replace(/(&lt;\/?)(\w+)(.*?\/?&gt;)/g,
		function (p, p1, p2, p3) {
			if ( ! /^(col|thead|tfoot|tbody|big|br|blockquote|colgroup|center|code|del|div|font|ins|p|pre|s|small|span|strike|sub|sup|tt|u|rb|rp|rt|ruby|nowiki|math|gallery|noinclude|includeonly|ref|references)$/i.test(p2) ) {
				p1 = '<span class="wikEdUnknown">' + p1;
				p3 = p3 + '</span><!--wikEdUnknown-->';
			}
			return(p1 + p2 + p3);
		}
	);

// comments
	obj.html = obj.html.replace(/(&lt;!--[^]*?--&gt;)/g, '<span class="wikEdComment">$1</span><!--wikEdComment-->');

// <nowiki> <math> <noinclude> <includeonly> <ref> <references> wiki markup
	obj.html = obj.html.replace(/((&lt;)(nowiki|math|gallery|noinclude|includeonly|ref|references)\b.*?(&gt;)(.*?)(&lt;)\/(nowiki|math|gallery|noinclude|includeonly|ref|references)\b.*?(&gt;))/gi, '<span class="wikEdWiki">$1</span><!--wikEdWiki-->');

// URLs, allowed chars: \w / . & ? = - @ # % ~ + (; allowed because of &amp; and common misuse)
	obj.html = obj.html.replace(/((http:\/\/|https:\/\/|ftp:\/\/|irc:\/\/|gopher:\/\/|news:|mailto:)[^\u0000-\u0020\!\"\$\'\(\)\*\,\:\<\>\[\\\]\^\`\{-\|\}\u007f-\uffff]*)/gi,
		function (p, p1, p2) {
			p1 = p1.replace(/(.*)/, '<span class="wikEdURLLink">$1</span><!--wikEdURLLink-->');
			return(p1);
		}
	);

// URLs with text
	obj.html = obj.html.replace(/(\[)( *<span class=\"wikEdURLLink\">.*?<\!--wikEdURLLink--> *)([^\]\n]*?)( *\])/gi,
		function (p, p1, p2, p3, p4) {

// link text
			p3 = p3.replace(/(.*)/, '<span class="wikEdURLText">$1</span><!--wikEdURLText-->');

// link tags
			p1 = p1.replace(/(\[)/, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->');
			p4 = p4.replace(/(\])/, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->');

			return(p1 + p2 + p3 + p4);
		}
	);

// [[ ]] links, images, categories
	obj.html = obj.html.replace(/(\[\[)([^\]]*)(\]\])/g,
		function (p, p1, p2, p3) {

// image
			if ( /^\s*image\s*:/i.test(p2) ) {
				if (p2.match(/\s*\w+\s*:\s*image\s*:/i)) {
					p1 = '<span class="wikEdImageInter">' + p1;
					p3 = p3 + '</span><!--wikEdImageInter-->';
				}
				else {
					p1 = '<span class="wikEdImage">' + p1;
					p3 = p3 + '</span><!--wikEdImage-->';
				}
				p2 = p2.replace(/^(\s*)(.*:)+/, '$1<span class="wikEdInter">$2</span><!--wikEdInter-->');
				p2 = p2.replace(/(\s*)([^>:\|]+)(\s*\|\s*|$)/, '$1<span class="wikEdImageName">$2</span><!--wikEdImageName-->$3');
				p2 = p2.replace(/(\|\s*)(.*)/,
					function (p, p1, p2) {
						p2 = p2.replace(/(.*?)(\s*(\||$))/g, '<span class="wikEdImageText">$1</span><!--wikEdImageText-->$2');
						return(p1 + p2);
					}
				);
			}

// category
			else if ( /^\s*category\s*:/i.test(p2) ) {
				if (p2.match(/\s*\w+\s*:\s*category\s*:/i)) {
					p1 = '<span class="wikEdCatInter">' + p1;
					p3 = p3 + '</span><!--wikEdCatInter-->';
				}
				else {
					p1 = '<span class="wikEdCat">' + p1;
					p3 = p3 + '</span><!--wikEdCat-->';
				}
				p2 = p2.replace(/^(\s*)(.*:)+/, '$1<span class="wikEdInter">$2</span><!--wikEdInter-->');
				p2 = p2.replace(/(\s*)([^>:\|]+)(\s*\|\s*|$)/, '$1<span class="wikEdCatName">$2</span><!--wikEdCatName-->$3');
				p2 = p2.replace(/(\|\s*)(.*)/,
					function (p, p1, p2) {
						p2 = p2.replace(/(.*?)(\s*(\||$))/g, '<span class="wikEdCatText">$1</span><!--wikEdCatText-->$2');
						return(p1 + p2);
					}
				);
			}

// wikilink
			else {
				if (p2.match(/^\s*\w+\s*:/)) {
					p1 = '<span class="wikEdLinkInter">' + p1;
					p3 = p3 + '</span><!--wikEdLinkInter-->';
				}
				else {
					p1 = '<span class="wikEdLink">' + p1;
					p3 = p3 + '</span><!--wikEdLink-->';
				}
				p2 = p2.replace(/^(\s*)(.*:)+/, '$1<span class="wikEdInter">$2</span><!--wikEdInter-->');
				p2 = p2.replace(/(\s*)([^>:\|]+)(\s*\|\s*|$)/, '$1<span class="wikEdLinkName">$2</span><!--wikEdLinkName-->$3');
				p2 = p2.replace(/(\|\s*)(.*)/,
					function (p, p1, p2) {
						p2 = p2.replace(/(.*?)(\s*(\||$))/g, '<span class="wikEdLinkText">$1</span><!--wikEdLinkText-->$2');
						return(p1 + p2);
					}
				);
			}

// link tags
			p1 = p1.replace(/(\[+)/, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->');
			p2 = p2.replace(/(\|)/gi, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->');
			p3 = p3.replace(/(\]+)/, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->');
			return(p1 + p2 + p3);
		}
	);

// {{ }}, {{{ }}} templates
	obj.html = obj.html.replace(/(\{\{+)([^\}]*)(\}\}+)/g,
		function (p, p1, p2, p3) {
			if (p2.match(/^\s*\w+\s*:/)) {
				p1 = '<span class="wikEdTemplInter">' + p1;
				p3 = p3 + '</span><!--wikEdTemplInter-->';
			}
			else {
				p1 = '<span class="wikEdTempl">' + p1;
				p3 = p3 + '</span><!--wikEdTempl-->';
			}
			p2 = p2.replace(/^(\s*)(.*:)+/, '$1<span class="wikEdInter">$2</span><!--wikEdInter-->');
			p2 = p2.replace(/(\s*)([^>:\|]+)(\s*\|\s*|$)/, '$1<span class="wikEdTemplName">$2</span><!--wikEdTemplName-->$3');
			p2 = p2.replace(/(\|\s*)(.*)/,
				function (p, p1, p2) {
					p2 = p2.replace(/(.*?)(\s*(\||$))/g, '<span class="wikEdTemplText">$1</span><!--wikEdTemplText-->$2');
					return(p1 + p2);
				}
			);

// template tags
			p1 = p1.replace(/(\{+)/, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->');
			p2 = p2.replace(/(\|)/g, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->');
			p3 = p3.replace(/(\}+)/, '<span class="wikEdLinkTag">$1</span><!--wikEdLinkTag-->');
			return(p1 + p2 + p3);
		}
	);

// #redirect
	obj.html = obj.html.replace(/(^|\n)(#)(redirect\b)/g, '$1<span class="wikEdWikiRedir">$3</span><!--wikEdWikiRedir-->');


/////////// blocks original place

// <b> <i>
	obj.html = obj.html.replace(/(\'\'\')(\'*)(.*?)(\'*)(\'\'\')/g, '<span class="wikEdBold">$2$3$4</span><!--wikEdBold-->');
	obj.html = obj.html.replace(/(\'\')(.*?)(\'\')/g, '<span class="wikEdItalic">$1$2$3</span><!--wikEdItalic-->');
	obj.html = obj.html.replace(/(<span class=\"wikEdBold\">)/g, '$1\'\'\'');
	obj.html = obj.html.replace(/(<\/span><!--wikEdBold-->)/g, '\'\'\'$1');
	obj.html = obj.html.replace(/(\'{2,})/g, '<span class="wikEdWiki">$1</span><!--wikEdWiki-->');

// named colors
	obj.html = obj.html.replace(/(\b(red|orange|yellow|fuchsia|white|lime|aqua|silver)\b)/g, '<span style="background-color: $1;" class="wikEdColors">$1</span><!--wikEdColors-->');
	obj.html = obj.html.replace(/(\b(maroon|olive|purple|green|navy|teal|blue|black|gray)\b)/g, '<span style="color: white; background-color: $1;" class="wikEdColors">$1</span><!--wikEdColors-->');

// RGB colors
	obj.html = obj.html.replace(/(#[0-9a-fA-F]{6})([\s\'\";])/g, '<span style="background-color: $1;" class="wikEdColors">$1</span><!--wikEdColors-->$2');
	obj.html = obj.html.replace(/(rgb\(\s*\d+,\s*\d+,\s*\d+\s*\))/gi, '<span style="background-color: $1;" class="wikEdColors">$1</span><!--wikEdColors-->');

// display control chars with popup title
	var regExpStr = '';
	for (var decimalValue in wikEdControlChars) {
		regExpStr += String.fromCharCode(decimalValue);
	}
	var regExp = new RegExp('([' + regExpStr + '])', 'g');
	obj.html = obj.html.replace(regExp,
		function (p, p1) {
			if (p1 == '\u0009') {
				p1 = '<' + 'pre class="wikEdTab" title="' + wikEdControlChars[p1.charCodeAt(0).toString()] + '">' + p1 + '<' + '/pre><!--wikEdTab-->';
			}
			else if (p1 != '\u000a') {
				p1 = '<' + 'pre class="wikEdCtrl" title="' + wikEdControlChars[p1.charCodeAt(0).toString()] + '">' + p1 + '<' + '/pre><!--wikEdCtrl-->';
			}
			return(p1);
		}
	);

// display strange spaces with popup title
	var regExpStr = '';
	for (var decimalValue in wikEdStrangeSpaces) {
		regExpStr += String.fromCharCode(decimalValue);
	}
	var regExp = new RegExp('([' + regExpStr + '])', 'g');
	obj.html = obj.html.replace(regExp,
		function (p, p1) {
			if (p1 != '\u000a') {
				p1 = '<' + 'pre class="wikEdBlank" title="' + wikEdStrangeSpaces[p1.charCodeAt(0).toString()] + '">' + p1 + '<' + '/pre><!--wikEdBlank-->';
			}
			return(p1);
		}
	);

// remove comments
	if (wikEdRemoveHighlightComments == true) {
		obj.html = obj.html.replace(/<!--wikEd\w+-->/g, '');
	}

	return;
}



//
// WikEdUpdateTextarea: copy frame content to textarea
//

function WikEdUpdateTextarea() {

// get frame content
	var obj = {};
	obj.html = wikEdFrameBody.innerHTML;

// textify so that no html formatting is submitted
	WikEdTextify(obj);
	obj.plain = obj.plain.replace(/&nbsp;/g, ' ');
	obj.plain = obj.plain.replace(/&lt;/g, '<');
	obj.plain = obj.plain.replace(/&gt;/g, '>');
	obj.plain = obj.plain.replace(/&amp;/g, '&');

// copy to textarea
	wikEdTextarea.value = obj.plain;

	return;
}


//
// WikEdUpdateFrame: copy textarea content to frame
//

function WikEdUpdateFrame() {

// get frame content
	var obj = {};
	obj.html = wikEdTextarea.value;
	obj.html = obj.html.replace(/&/g, '&amp;');
	obj.html = obj.html.replace(/>/g, '&gt;');
	obj.html = obj.html.replace(/</g, '&lt;');

// highlight the syntax
	if (wikEdHighlightSyntax == true) {
		WikEdHighlightSyntax(obj);
	}

// display tabs
	else {
		obj.html = obj.html.replace(/(\t)/g, '<' + 'pre class="wikEdTabPlain">$1<' + '/pre><!--wikEdTabPlain-->');
	}

// multiple blanks to blank-&nbsp;
	obj.html = obj.html.replace(/  /g, '&nbsp; ');
	obj.html = obj.html.replace(/  /g, '&nbsp; ');

// newlines to <br />
	obj.html = obj.html.replace(/\n/g, '<br />');

// set frame content
	wikEdFrameBody.innerHTML = obj.html;

	return;
}


//
// WikEdKeyFrame: event handler for key and mouse events in the frame
//

function WikEdKeyFrame(event) {

// grey out inactive buttons
	WikEdInactiveButtons();

// reset the frame DOM cache
	wikEdFrameDOMCache = null;

	return;
}


//
// WikEdFrameExecCommand: wrapper for execCommand method
//

function WikEdFrameExecCommand(command, option) {

	wikEdFrameDocument.execCommand(command, false, option);
	return;
}


//
// WikEdFindAhead: non-regexp and case-insensitive find-as-you-type, event handler for find field
//

function WikEdFindAhead() {

	if (wikEdFindAhead.checked == true) {

// get the find text
		var findText = wikEdFindText.value;
		if (findText == '') {
			return;
		}

// function: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog)
		var found = wikEdFrameWindow.find(findText, false, false, true, false, false, false);
		if (found == false) {
 			var sel = wikEdFrameWindow.getSelection();
			sel.collapse(sel.anchorNode, sel.anchorOffset);
		}
	}
	return;
}


//
// WikEdFullScreen: change to fullscreen edit area  or back to normal view
//

function WikEdFullScreen(fullscreen) {

// get dom nodes
	var wikEdButtonsPreview = document.getElementById('wikEdButtonsPreview');

// hide or show elements
	var displayStyle;
	if (fullscreen == true) {
		displayStyle = 'none';
	}
	else {
		displayStyle = 'block';
	}

// elements above input wrapper
	var node = document.getElementById('editform').previousSibling;
	while (node != null) {
		if ( (node.nodeName == 'DIV') || (node.nodeName == 'H3') ) {
			node.style.display = displayStyle;
		}
		node = node.previousSibling;
	}
	document.getElementsByTagName('H1')[0].style.display = displayStyle;

// divs below input wrapper
	var node = wikEdInputWrapper.nextSibling;
	while (node != null) {
		if (node.nodeName == 'DIV') {
			node.style.display = displayStyle;
		}
		node = node.nextSibling;
	}

// divs below input wrapper, some levels up
	var node = document.getElementById('column-one');
	while (node != null) {
		if (node.nodeName == 'DIV') {
			node.style.display = displayStyle;
		}
		node = node.nextSibling;
	}

// insert wrapper
	document.getElementById('wikEdInsertWrapper').style.display = displayStyle;

// change styles
	if (fullscreen) {
		wikEdInputWrapper.className = 'wikEdInputWrapperFull';
		wikEdButtonsPreview.className = 'wikEdButtonsPreviewFull';
	}
	else {
		wikEdInputWrapper.className = 'wikEdInputWrapper';
		wikEdButtonsPreview.className = 'wikEdButtonsPreview';
	}

// resize the frame
	if (fullscreen) {
		var consoleTop = WikEdGetOffsetTop(wikEdConsoleWrapper);
		var consoleHeight = wikEdConsoleWrapper.offsetHeight;
		var frameHeight = wikEdFrame.offsetHeight;
		var windowHeight = window.innerHeight;
		var windowWidth = window.innerWidth;
		var frameHeightNew =  frameHeight + (windowHeight - (consoleTop + consoleHeight) ) - 2;
		wikEdFrame.style.height = frameHeightNew + 'px';
	}
	else {
		wikEdFrame.style.height = wikEdTextareaHeight + 'px';
	}

// scroll to edit frame
	if (fullscreen == false) {
		window.scroll(0, WikEdGetOffsetTop(wikEdInputWrapper) - 2);
	}

// set the fullscreen button state
	WikEdButton('wikEdFullScreen', null, fullscreen);

// grey out or re-activate scroll-to buttons
	var buttonClass;
	if (fullscreen) {
		buttonClass = 'wikEdButtonInactive';
	}
	else {
		buttonClass = 'wikEdButton';
	}
	document.getElementById('wikEdScrollToInput').className = buttonClass;
	document.getElementById('wikEdScrollToInput2').className = buttonClass;
	document.getElementById('wikEdScrollToButtons').className = buttonClass;
	document.getElementById('wikEdScrollToButtons2').className = buttonClass;

	wikEdFullScreenMode = fullscreen;

	return;
}


//
// WikEdResizeComboInput: set the size of the background select boxes so that the button is visible
//

function WikEdResizeComboInput(field) {

// add a dummy option
	var dummy;
	if (wikEdSelectElement[field].options.length == 0) {
		wikEdSelectElement[field].options[0] = new Option('');
		dummy = true;
	}

// set option widths to 0
	for (i = 0; i < wikEdSelectElement[field].options.length; i ++) {
		wikEdSelectElement[field].options[i].style.width = '0';
	}

// calculate select width
	var inputWidth = wikEdInputElement[field].clientWidth;
	var selectWidth = wikEdSelectElement[field].clientWidth;
	var optionWidth = wikEdSelectElement[field].options[0].offsetWidth;
	var border = wikEdInputElement[field].offsetWidth - wikEdInputElement[field].clientWidth;
	wikEdSelectElement[field].style.width = (selectWidth - optionWidth + inputWidth - border) + 'px';

// delete dummy option
	if (dummy) {
		wikEdSelectElement[field].options[0] = null;
	}

// set option widths to auto
	for (i = 0; i < wikEdSelectElement[field].options.length; i ++) {
		wikEdSelectElement[field].options[i].style.width = 'auto';
	}
	return;
}


//
// WikEdChangeComboInput: set the input value to selected option; onchange event handler for select boxes
//

function WikEdChangeComboInput(field) {

// get selection index (-1 for unselected)
	var selected = wikEdSelectElement[field].selectedIndex;
	if (selected >= 0) {

// get selected option
		var option = wikEdSelectElement[field].options[selected];
		if (option.text != '') {

// add a tag to the summary box
			if (field == 'summary') {
				var text = wikEdInputElement[field].value;
				if ( (text != '') && (!text.match(/ \*\/ $/) ) ) {
					if (option.text.match(/^\w/)) {
						text += ', ';
					}
					else {
						text += ' ';
					}
				}
				text += option.text;
				wikEdInputElement[field].value = text;
			}

// add case and regexp checkboxes to find / replace fields
			else if (option.value == 'setcheck') {
				WikEdButton('wikEdCaseSensitive', null, (option.text.charAt(0) == wikEdCheckMarker[true]) );
				WikEdButton('wikEdRegExp',        null, (option.text.charAt(1) == wikEdCheckMarker[true]) );
				wikEdInputElement[field].value = option.text.substr(3);
			}

// add option text
			else {
				wikEdInputElement[field].value = option.text;
			}
		}
	}
	return;
}


//
// WikEdAddToHistory: add an input value to the cookie history
//

function WikEdAddToHistory(field) {

	if (wikEdInputElement[field].value != '') {

// load history from cookie
		WikEdLoadHistoryFromCookie(field);

// add current value to history
		wikEdFieldHist[field].unshift(wikEdInputElement[field].value);

// add case and regexp checkboxes to find / replace value
		if ( (field == 'find') || (field == 'replace') ) {
			wikEdFieldHist[field][0] =
				wikEdCheckMarker[ document.getElementById('wikEdCaseSensitive').checked ] +
				wikEdCheckMarker[ document.getElementById('wikEdRegExp').checked ] +
				' ' + wikEdFieldHist[field][0];
		}

// remove paragraph names from summary
		if (field == 'summary') {
			wikEdFieldHist[field][0] = wikEdFieldHist[field][0].replace(/^\/\* .*? \*\/ */, '');
		}

// remove multiple old copies from history
		i = 1;
		while (i < wikEdFieldHist[field].length) {
			if (wikEdFieldHist[field][i] == wikEdFieldHist[field][0]) {
				wikEdFieldHist[field].splice(i, 1);
			}
			else {
				i ++;
			}
		}

// remove new value if it is a preset value
		if (wikEdComboPresetOptions[field] != null) {
			i = 0;
			while (i < wikEdComboPresetOptions[field].length) {
				if (wikEdComboPresetOptions[field][i] == wikEdFieldHist[field][0]) {
					wikEdFieldHist[field].shift;
					break;
				}
				else {
					i ++;
				}
			}
		}

// cut history to maximal history length
		wikEdFieldHist[field] = wikEdFieldHist[field].slice(0, wikEdHistoryLength[field]);

// saved history to cookie
		WikEdSaveHistoryToCookie(field);
	}
	return;
}


//
// WikEdSetComboOptions: generate the select options from cookie history; onfocus handler for select box
//

function WikEdSetComboOptions(field) {

// load history from cookie
	WikEdLoadHistoryFromCookie(field);

	var option = {};
	var selected = null;
	j = 0;

// delete options
	var options = wikEdSelectElement[field].options;
	for (i = 0; i > options.length; i ++) {
		wikEdSelectElement[field].remove(i);
	}

// delete optgroup
	option = document.getElementById(field + 'Optgroup');
	if (option != null) {
		wikEdSelectElement[field].removeChild(option);
	}

// workaround for onchange not firing when selecting first option from unselected dropdown
	option = document.createElement('option');
	option.style.display = 'none';
	wikEdSelectElement[field].options[j++] = option;

// add history entries
	for (i = 0; i < wikEdFieldHist[field].length; i ++) {
		if (wikEdFieldHist[field][i] != null) {
			if (wikEdFieldHist[field][i] == wikEdInputElement[field].value) {
				selected = j;
			}
			option = document.createElement('option');
			option.text = wikEdFieldHist[field][i];
			if ( (field == 'find') || (field == 'replace') ) {
				option.value = 'setcheck';
			}
			wikEdSelectElement[field].options[j++] = option;
		}
	}

// add preset entries
	if (wikEdComboPresetOptions[field] != null) {
		var startPreset = j;
		for (i = 0; i < wikEdComboPresetOptions[field].length; i ++) {
			if (wikEdComboPresetOptions[field][i] != null) {
				if (wikEdComboPresetOptions[field][i] == wikEdInputElement[field].value) {
					selected = j;
				}
				option = document.createElement('option');
				option.text = wikEdComboPresetOptions[field][i];
				if (field == 'summary') {
					option.text = option.text.replace(/\{wikEdUsing\}/g, wikEdSummaryUsing);
				}
				wikEdSelectElement[field].options[j++] = option;
			}
		}

// add a blank separator
		if (startPreset > 1) {
			option = document.createElement('optgroup');
			option.label = '\u00a0';
			option.id = field + 'Optgroup';
			wikEdSelectElement[field].insertBefore(option, wikEdSelectElement[field].options[startPreset]);
		}
	}

// set the selection
	wikEdSelectElement[field].selectedIndex = selected;
	return;
}


//
// WikEdClearHistory: clear the history of combo input fields
//

function WikEdClearHistory(field) {
	var cookieExpire = new Date();
	cookieExpire.setTime( cookieExpire.getTime() + wikEdCookieExpireSec * 1000 );
	WikEdSetCookie(wikEdCookieName[field], '', cookieExpire.toGMTString());
	WikEdSetComboOptions(field);
	return;
}


//
// WikEdLoadHistoryFromCookie: get the input box history from the respective cookie
//

function WikEdLoadHistoryFromCookie(field) {
	var cookie = WikEdGetCookie(wikEdCookieName[field]);
	if (cookie != '') {
		cookie = decodeURIComponent(cookie);
		wikEdFieldHist[field] = cookie.split('\n');
	}
	else {
		wikEdFieldHist[field] = [];
	}
	return;
}


//
// WikEdSaveHistoryToCookie: save the input box history to the respective cookie
//

function WikEdSaveHistoryToCookie(field) {
	var cookieExpire = new Date();
	cookieExpire.setTime( cookieExpire.getTime() + wikEdCookieExpireSec * 1000 );
	var cookie = '';
	cookie = wikEdFieldHist[field].join('\n')
	cookie = cookie.replace(/\n$/, '');
	cookie = encodeURIComponent(cookie);
	WikEdSetCookie(wikEdCookieName[field], cookie, cookieExpire.toGMTString());
	return;
}


// WikEdGetStyle: get computed style properties for non-inline css definitions
function WikEdGetStyle(element, styleProperty) {
	var style;
	if (element != null) {
		style = document.defaultView.getComputedStyle(element, null).getPropertyValue(styleProperty);
	}
	return(style);
}


//
// WikEdGetCookie
//

function WikEdGetCookie(name) {
	var cookie = ' ' + document.cookie;
	var search = ' ' + name + '=';
	var setStr = '';
	var offset = 0;
	var end = 0;
	offset = cookie.indexOf(search);
	if (offset != -1) {
		offset += search.length;
		end = cookie.indexOf(';', offset)
		if (end == -1) {
			end = cookie.length;
		}
		setStr = cookie.substring(offset, end);
		setStr = setStr.replace(/\\+/g, ' ');
		setStr = decodeURIComponent(setStr);
	}
	return(setStr);
}


//
// WikEdSetCookie
//

function WikEdSetCookie(name, value, expires, path, domain, secure) {
	var cookie = name + '=' + encodeURIComponent(value);
	if (expires != null) {
		cookie += '; expires=' + expires
	}
	if (path != null) {
		cookie += '; path=' + path;
	}
	if (domain != null)  {
		cookie += '; domain=' + domain;
	}
	if (secure != null) {
		cookie += '; secure';
	}
	document.cookie = cookie;
}


//
// WikEdGetOffsetTop: get element offset relative to window top
//

function WikEdGetOffsetTop(element) {
	var offset = 0;
	do {
		offset += element.offsetTop;
	} while ( (element = element.offsetParent) != null );
	return(offset);
}


//
// WikEdGetOffsetLeft: get element offset relative to left window border
//

function WikEdGetOffsetLeft(element) {
	var offset = 0;
	do {
		offset += element.offsetLeft;
	} while ( (element = element.offsetParent) != null );
	return(offset);
}


// define leaf elements for WikEdGetInnerHTML
var wikEdLeafElements = [];
wikEdLeafElements['IMG'] = true;
wikEdLeafElements['HR'] = true;
wikEdLeafElements['BR'] = true;
wikEdLeafElements['INPUT'] = true;


//
// WikEdParseDOM: wikEdFrameDOMCache contains the last parse if the frame has not changed
//

function WikEdParseDOM(obj, topNode) {

/* problematic because of obj.changed //////////////////////
	if (wikEdFrameDOMCache != null) {
		obj = wikEdFrameDOMCache;
		return;
	}
*/

	obj.plainLength = 0;
	obj.plainArray = [];
	obj.plainNode = [];
	obj.plainStart = [];
	obj.plainPos = [];
	WikEdParseDOMRecursive(obj, topNode);
	obj.plain = obj.plainArray.join('');
	wikEdFrameDOMCache = obj;
	return;
}


//
// WikEdParseDOMRecursive:
//

function WikEdParseDOMRecursive(obj, currentNode) {

// cycle through the child nodes of currentNode
	for each (var childNode in currentNode.childNodes) {

		if (childNode == null) {
			break;
		}

// check for selection
		if (childNode == obj.sel.focusNode) {
			obj.plainFocus = obj.plainLength + obj.sel.focusOffset;
		}
		if (childNode == obj.sel.anchorNode) {
			obj.plainAnchor = obj.plainLength + obj.sel.anchorOffset;
		}
		var value = null;

// get text of child node
		switch (childNode.nodeType) {
			case 1:
				if ( (childNode.childNodes.length == 0) && (wikEdLeafElements[childNode.nodeName] == true) ) {
					if (childNode.nodeName == 'BR') {
						value = '\n';
					}
				}
				else {
					WikEdParseDOMRecursive(obj, childNode);
				}
				break;
			case 3:
				value = childNode.nodeValue;
				value = value.replace(/\n/g, ' ');
				break;
			case 5:
				value = '&' + childNode.nodeName + ';';
				break;
		}

// add text to text object
		if (value != null) {

// array of text fragments
			obj.plainArray.push(value);

// array of text fragment node references
			obj.plainNode.push(childNode);

// array of text fragment text positions
			obj.plainStart.push(obj.plainLength);

// node references containing text positions
 			obj.plainPos[childNode] = obj.plainLength;

// current text length
 			obj.plainLength += value.length;
		}
	}
	return;
}


//
// WikEdGetInnerHTML: get innerHTML from document fragment
//

function WikEdGetInnerHTML(obj, currentNode) {

// initialize string
	if (obj.html == null) {
		obj.html = '';
	}
	if (obj.plain == null) {
		obj.plain = '';
	}
	if (obj.plainArray == null) {
		obj.plainArray = [];
		obj.plainNode = [];
		obj.plainStart = [];
	}

	for (var i = 0; i < currentNode.childNodes.length; i ++) {
		var childNode = currentNode.childNodes.item(i);
		switch (childNode.nodeType) {
			case 1:
				obj.html += '<' + childNode.nodeName.toLowerCase();
				for (var j = 0; j < childNode.attributes.length; j ++) {
					if (childNode.attributes.item(j).nodeValue != null) {
						obj.html += ' ' + childNode.attributes.item(j).nodeName + '="' + childNode.attributes.item(j).nodeValue.replace(/</g, '&lt;').replace(/>/g, '&gt;') + '"';
					}
				}
				if ( (childNode.childNodes.length == 0) && wikEdLeafElements[childNode.nodeName] ) {
					obj.html += '>';
					if (childNode.nodeName == 'BR') {
						obj.plainArray.push('\n');
						obj.plainNode.push(childNode);
						obj.plainStart.push(obj.plain.length);
						obj.plain += '\n';
					}
				}
				else {
					obj.html += '>';
					WikEdGetInnerHTML(obj, childNode);
					obj.html += '</' + childNode.nodeName.toLowerCase() + '>'
				}
				break;
			case 3:
				var value = childNode.nodeValue;
				value = value.replace(/\n/g, ' '); // important for pasted page content
				obj.plainArray.push(value); // plain array contains & < > instead of &amp; &lt; &gt;
				obj.plainNode.push(childNode);
				obj.plainStart.push(obj.plain.length);
				value = value.replace(/&/g, '&amp;');
				value = value.replace(/</g, '&lt;');
				value = value.replace(/>/g, '&gt;');
				obj.html += value;
				obj.plain += value;
				break;
			case 4: obj.html += '<![CDATA[' + childNode.nodeValue + ']]>';
				break;
			case 5:
				var value = '&' + childNode.nodeName + ';';
				obj.plainArray.push(value);
				obj.plainNode.push(childNode);
				obj.plainStart.push(obj.plain.length);
				value = value.replace(/&/g, '&amp;');
				obj.html += value;
				obj.plain += value;
				break;
			case 8: obj.html += '<!--' + childNode.nodeValue + '-->';
				break;
		}
	}
	return;
}


// WikEdStyleSheet: create a new style sheet object
function WikEdStyleSheet(documentObject) {

	this.styleElement = null;
	if (documentObject == null) {
		documentObject = document;
	}

// IE
	if (documentObject.createStyleSheet) {
		this.styleElement = documentObject.createStyleSheet();
	}

// standards compliant browsers
	else {
		this.styleElement = documentObject.createElement('style');
		this.styleElement.from = 'text/css';
		var insert = documentObject.getElementsByTagName('head')[0];
		if (insert != null) {
			insert.appendChild(this.styleElement);
		}
	}

// add-a-rule method

// IE
	this.addRule = function(selector, declaration) {
		if (this.styleElement.addRule) {
			this.styleElement.addRule(selector, declaration);
		}

// standards compliant browsers
		else {
			if (this.styleElement.sheet != null) {
				if (this.styleElement.sheet.insertRule != null) {
					this.styleElement.sheet.insertRule(selector + ' { ' + declaration + ' } ', 0);
				}
			}
		}
	};
	return;
}


// WED: shortcut for WikEdDebug
function WED(objectName, object) {

	WikEdDebug(objectName, object);
	return;
}


// WikEdDebug: print the value of variables

function WikEdDebug(objectName, object) {

	document.getElementById('wikEdTextareaWrapper').style.position = 'static';
	document.getElementById('wikEdTextareaWrapper').style.visibility = 'visible';
	wikEdTextarea.style.display = 'block';
	if (objectName == null) {
		wikEdTextarea.value = '';
		wikEdTextarea.style.height = '25em';
	}
	else {
		wikEdTextarea.value += objectName + ': ' + object + '\n';
	}
	return;
}


//
// character tables used in FixUnicode()
//   see http://kmi.open.ac.uk/projects/ceryle/doc/docs/NOTE-charents.html
//   removed because of internal use: < ['003c', 'lt']; > ['003e', 'gt']; & ['0026', 'amp'], ['00a0', 'nbsp']


// supported chars in Mozilla and IE6
var wikEdSupportedChars = [
	['00a1', 'iexcl'],  // ¡
	['00a2', 'cent'],   // ¢
	['00a3', 'pound'],  // £
	['00a4', 'curren'], // ¤
	['00a5', 'yen'],    // ¥
	['00a6', 'brvbar'], // ¦
	['00a7', 'sect'],   // §
	['00a8', 'uml'],    // ¨
	['00a9', 'copy'],   // ©
	['00aa', 'ordf'],   // ª
	['00ab', 'laquo'],  // «
	['00ac', 'not'],    // ¬
	['00ae', 'reg'],    // ®
	['00af', 'macr'],   // ¯
	['00b0', 'deg'],    // °
	['00b1', 'plusmn'], // ±
	['00b2', 'sup2'],   // ²
	['00b3', 'sup3'],   // ³
	['00b4', 'acute'],  // ´
	['00b5', 'micro'],  // µ
	['00b6', 'para'],   // ¶
	['00b7', 'middot'], // ·
	['00b8', 'cedil'],  // ¸
	['00b9', 'sup1'],   // ¹
	['00ba', 'ordm'],   // º
	['00bb', 'raquo'],  // »
	['00bc', 'frac14'], // ¼
	['00bd', 'frac12'], // ½
	['00be', 'frac34'], // ¾
	['00bf', 'iquest'], // ¿
	['00c0', 'Agrave'], // À
	['00c1', 'Aacute'], // Á
	['00c2', 'Acirc'],  // Â
	['00c3', 'Atilde'], // Ã
	['00c4', 'Auml'],   // Ä
	['00c5', 'Aring'],  // Å
	['00c6', 'AElig'],  // Æ
	['00c7', 'Ccedil'], // Ç
	['00c8', 'Egrave'], // È
	['00c9', 'Eacute'], // É
	['00ca', 'Ecirc'],  // Ê
	['00cb', 'Euml'],   // Ë
	['00cc', 'Igrave'], // Ì
	['00cd', 'Iacute'], // Í
	['00ce', 'Icirc'],  // Î
	['00cf', 'Iuml'],   // Ï
	['00d0', 'ETH'],    // Ð
	['00d1', 'Ntilde'], // Ñ
	['00d2', 'Ograve'], // Ò
	['00d3', 'Oacute'], // Ó
	['00d4', 'Ocirc'],  // Ô
	['00d5', 'Otilde'], // Õ
	['00d6', 'Ouml'],   // Ö
	['00d7', 'times'],  // ×
	['00d8', 'Oslash'], // Ø
	['00d9', 'Ugrave'], // Ù
	['00da', 'Uacute'], // Ú
	['00db', 'Ucirc'],  // Û
	['00dc', 'Uuml'],   // Ü
	['00dd', 'Yacute'], // Ý
	['00de', 'THORN'],  // Þ
	['00df', 'szlig'],  // ß
	['00e0', 'agrave'], // à
	['00e1', 'aacute'], // á
	['00e2', 'acirc'],  // â
	['00e3', 'atilde'], // ã
	['00e4', 'auml'],   // ä
	['00e5', 'aring'],  // å
	['00e6', 'aelig'],  // æ
	['00e7', 'ccedil'], // ç
	['00e8', 'egrave'], // è
	['00e9', 'eacute'], // é
	['00ea', 'ecirc'],  // ê
	['00eb', 'euml'],   // ë
	['00ec', 'igrave'], // ì
	['00ed', 'iacute'], // í
	['00ee', 'icirc'],  // î
	['00ef', 'iuml'],   // ï
	['00f0', 'eth'],    // ð
	['00f1', 'ntilde'], // ñ
	['00f2', 'ograve'], // ò
	['00f3', 'oacute'], // ó
	['00f4', 'ocirc'],  // ô
	['00f5', 'otilde'], // õ
	['00f6', 'ouml'],   // ö
	['00f7', 'divide'], // ÷
	['00f8', 'oslash'], // ø
	['00f9', 'ugrave'], // ù
	['00fa', 'uacute'], // ú
	['00fb', 'ucirc'],  // û
	['00fc', 'uuml'],   // ü
	['00fd', 'yacute'], // ý
	['00fe', 'thorn'],  // þ
	['00ff', 'yuml'],   // ÿ
	['0027', 'apos'],   // '
	['0022', 'quot'],   // "
	['0152', 'OElig'],  // Œ
	['0153', 'oelig'],  // œ
	['0160', 'Scaron'], // Š
	['0161', 'scaron'], // š
	['0178', 'Yuml'],   // Ÿ
	['02c6', 'circ'],   // ˆ
	['02dc', 'tilde'],  // ˜
	['2013', 'ndash'],  // –
	['2014', 'mdash'],  // —
	['2018', 'lsquo'],  // ‘
	['2019', 'rsquo'],  // ’
	['201a', 'sbquo'],  // ‚
	['201c', 'ldquo'],  // “
	['201d', 'rdquo'],  // ”
	['201e', 'bdquo'],  // „
	['2020', 'dagger'], // †
	['2021', 'Dagger'], // ‡
	['2030', 'permil'], // ‰
	['2039', 'lsaquo'], // ‹
	['203a', 'rsaquo'], // ›
	['20ac', 'euro'],   // €
	['0192', 'fnof'],   // ƒ
	['0391', 'Alpha'],  // Α
	['0392', 'Beta'],   // Β
	['0393', 'Gamma'],  // Γ
	['0394', 'Delta'],  // Δ
	['0395', 'Epsilon'],// Ε
	['0396', 'Zeta'],   // Ζ
	['0397', 'Eta'],    // Η
	['0398', 'Theta'],  // Θ
	['0399', 'Iota'],   // Ι
	['039a', 'Kappa'],  // Κ
	['039b', 'Lambda'], // Λ
	['039c', 'Mu'],     // Μ
	['039d', 'Nu'],     // Ν
	['039e', 'Xi'],     // Ξ
	['039f', 'Omicron'],// Ο
	['03a0', 'Pi'],     // Π
	['03a1', 'Rho'],    // Ρ
	['03a3', 'Sigma'],  // Σ
	['03a4', 'Tau'],    // Τ
	['03a5', 'Upsilon'],// Υ
	['03a6', 'Phi'],    // Φ
	['03a7', 'Chi'],    // Χ
	['03a8', 'Psi'],    // Ψ
	['03a9', 'Omega'],  // Ω
	['03b1', 'alpha'],  // α
	['03b2', 'beta'],   // β
	['03b3', 'gamma'],  // γ
	['03b4', 'delta'],  // δ
	['03b5', 'epsilon'],// ε
	['03b6', 'zeta'],   // ζ
	['03b7', 'eta'],    // η
	['03b8', 'theta'],  // θ
	['03b9', 'iota'],   // ι
	['03ba', 'kappa'],  // κ
	['03bb', 'lambda'], // λ
	['03bc', 'mu'],     // μ
	['03bd', 'nu'],     // ν
	['03be', 'xi'],     // ξ
	['03bf', 'omicron'],// ο
	['03c0', 'pi'],     // π
	['03c1', 'rho'],    // ρ
	['03c2', 'sigmaf'], // ς
	['03c3', 'sigma'],  // σ
	['03c4', 'tau'],    // τ
	['03c5', 'upsilon'],// υ
	['03c6', 'phi'],    // φ
	['03c7', 'chi'],    // χ
	['03c8', 'psi'],    // ψ
	['03c9', 'omega'],  // ω
	['2022', 'bull'],   // •
	['2026', 'hellip'], // …
	['2032', 'prime'],  // ′
	['2033', 'Prime'],  // ″
	['203e', 'oline'],  // ‾
	['2044', 'frasl'],  // ⁄
	['2122', 'trade'],  // ™
	['2190', 'larr'],   // ←
	['2191', 'uarr'],   // ↑
	['2192', 'rarr'],   // →
	['2193', 'darr'],   // ↓
	['2194', 'harr'],   // ↔
	['21d2', 'rArr'],   // ⇒
	['21d4', 'hArr'],   // ⇔
	['2200', 'forall'], // ∀
	['2202', 'part'],   // ∂
	['2203', 'exist'],  // ∃
	['2207', 'nabla'],  // ∇
	['2208', 'isin'],   // ∈
	['220b', 'ni'],     // ∋
	['220f', 'prod'],   // ∏
	['2211', 'sum'],    // ∑
	['2212', 'minus'],  // −
	['221a', 'radic'],  // √
	['221d', 'prop'],   // ∝
	['221e', 'infin'],  // ∞
	['2220', 'ang'],    // ∠
	['2227', 'and'],    // ∧
	['2228', 'or'],     // ∨
	['2229', 'cap'],    // ∩
	['222a', 'cup'],    // ∪
	['222b', 'int'],    // ∫
	['2234', 'there4'], // ∴
	['223c', 'sim'],    // ∼
	['2248', 'asymp'],  // ≈
	['2260', 'ne'],     // ≠
	['2261', 'equiv'],  // ≡
	['2264', 'le'],     // ≤
	['2265', 'ge'],     // ≥
	['2282', 'sub'],    // ⊂
	['2283', 'sup'],    // ⊃
	['2286', 'sube'],   // ⊆
	['2287', 'supe'],   // ⊇
	['2295', 'oplus'],  // ⊕
	['22a5', 'perp'],   // ⊥
	['25ca', 'loz'],    // ◊
	['2660', 'spades'], // ♠
	['2663', 'clubs'],  // ♣
	['2665', 'hearts'], // ♥
	['2666', 'diams']   // ♦
];

// special chars (spaces and invisible characters)
//
var wikEdSpecialChars = [
	['2002', 'ensp'],   //   en space
	['00ad', 'shy'],    // ­ soft hyphen
	['2003', 'emsp'],   //   em space
	['2009', 'thinsp'], //    thin space
	['200c', 'zwnj'],   // ‌ zero width non-joiner
	['200d', 'zwj'],    // ‍ zero width joiner
	['200e', 'lrm'],    // ‎ left-to-right mark
	['200f', 'rlm']     // ‏ right-to-left mark
];

// unsupported chars in IE6
var wikEdProblemChars = [
	['03d1', 'thetasym'], // ϑ
	['03d2', 'upsih'],    // ϒ
	['03d6', 'piv'],      // ϖ
	['2118', 'weierp'],   // ℘
	['2111', 'image'],    // ℑ
	['211c', 'real'],     // ℜ
	['2135', 'alefsym'],  // ℵ
	['21b5', 'crarr'],    // ↵
	['21d0', 'lArr'],     // ⇐
	['21d1', 'uArr'],     // ⇑
	['21d3', 'dArr'],     // ⇓
	['2205', 'empty'],    // ∅
	['2209', 'notin'],    // ∉
	['2217', 'lowast'],   // ∗
	['2245', 'cong'],     // ≅
	['2284', 'nsub'],     // ⊄
	['22a5', 'perp'],     // ⊥
	['2297', 'otimes'],   // ⊗
	['22c5', 'sdot'],     // ⋅
	['2308', 'lceil'],    // ⌈
	['2309', 'rceil'],    // ⌉
	['230a', 'lfloor'],   // ⌊
	['230b', 'rfloor'],   // ⌋
	['2329', 'lang'],     // 〈
	['232a', 'rang']      // 〉
];

// ASCII control characters and invisibles, used for syntax highlighting
var wikEdControlChars = {
	'0': 'null',
	'1': 'start of heading',
	'2': 'start of text',
	'3': 'end of text',
	'4': 'end of transmission',
	'5': 'enquiry',
	'6': 'acknowledge',
	'7': 'bell',
	'8': 'backspace',
	'9': 'horizontal tab',
	'10': 'line feed, new line',
	'11': 'vertical tab',
	'12': 'form feed, new page',
	'13': 'carriage return',
	'14': 'shift out',
	'15': 'shift in',
	'16': 'data link escape',
	'17': 'device control 1',
	'18': 'device control 2',
	'19': 'device control 3',
	'20': 'device control 4',
	'21': 'negative acknowledge',
	'22': 'synchronous idle',
	'23': 'end of trans. block',
	'24': 'cancel',
	'25': 'end of medium',
	'25': 'substitute',
	'26': 'escape',
	'27': 'file separator',
	'28': 'group separator',
	'29': 'record separator',
	'30': 'unit separator',
	'173' : 'soft hyphen',           // \u00ad
	'8204': 'zero width non-joiner', // \u200c
	'8205': 'zero width joiner',     // \u200d
	'8206': 'left-to-right mark',    // \u200e
	'8207': 'right-to-left mark',    // \u200f
	'8232': 'line separator',        // \u2028
	'8233': 'paragraph separator'    // \u2028
};

// strange spaces, used for syntax highlighting
var wikEdStrangeSpaces = {
	'31': 'non-breaking space', // \u00a0
	'8194': 'en space',         // \u2002
	'8195': 'em space',         // \u2003
	'8201': 'thin space',       // \u2009
};

/* </nowiki></pre> */