Участник:ArmorAdmin/monobook.js — различия между версиями

Материал из Бронетанковой Энциклопедии — armor.kiev.ua/wiki
Перейти к: навигация, поиск
 
Строка 1: Строка 1:
/* <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 || 'http://upload.wikimedia.org/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="http://en.wikipedia.org/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> */
 

Текущая версия на 21:11, 16 ноября 2006