<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity=60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
/***
|''Name:''|AdjustEditorRows|
|''Version:''||
|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|
|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|
|''Type:''|WikiBar addon|
|''Required:''|WikiBar 2.0.0+|
!Description
adjust rows of editor
!Installation
#install WikiBar at first
#create your addon as a tiddler with tag 'wikibarAddons'
!Code
***/
//{{{

//----------------------------------------------------------------------------
// addon install function: this is a must
//----------------------------------------------------------------------------
function wikibar_addonInstall(unused){

  // define tools
  var adjustEditorRows={
  		  CAPTION:'adjust rows of editor',
  		  HANDLER: AdjustEditorRows_getRows
  		};

  // register tools
  wikibarStore.addon.adjustEditorRows = adjustEditorRows;
}

function AdjustEditorRows_getRows(param){
  var rows = prompt('input rows of editor', config.maxEditRows);
  if(rows && !isNaN(rows)){
    config.maxEditRows = rows;

    var editor = param.button.editor;
    editor.rows = rows;
  }
}



//}}}
Background: #ffffff
Foreground: #000033
PrimaryPale: #e5edf4
PrimaryLight: #679DC2
PrimaryMid: #005B99
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #FFA02F
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

MainAccent: #e22882
MainAccentLight: #ee7fb4

SecondAccent: #5bbf21
SecondAccentLight: #9DD97B
SecondAccentSuperLight: #E7F6DF

MuchLessSubtle: #666;
LessSubtle: #999;
Subtle: #ccc
SubtleLight: #ddd
SubtleSuperLight: #eee

HeaderBG:#FF3300
/***
|''Name:''|CssStripper|
|''Version:''||
|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|
|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|
|''Type:''|WikiBar addon|
|''Required:''|WikiBar 2.0.0+|
!Description
reduce the size of css
!Installation
#install WikiBar at first
#create your addon as a tiddler with tag 'wikibarAddons'
!Code
***/
//{{{

//----------------------------------------------------------------------------
// addon install function: this is a must
//----------------------------------------------------------------------------
function wikibar_addonInstall(unused){

  // define tools
  var cssStripper={
  		  CAPTION:'css stripper',
  		  HANDLER: CssStripper_doIt
  		};

  // register tools
  wikibarStore.addon.cssStripper = cssStripper;
}

CssStripper_doIt = function(param){

  clearMessage();
  try{
    var editor = param.button.editor;
    var codes = editor.value;

    // strip multi-line javascript comment
    codes = codes.replace(/\/\*(\s*|.*?)*\*\//g, '');

    // strip single-line comment, except ://
//    codes = codes.replace(/[^\:]\/\/.*$/gm, '');

//    // convert tab to space
//    codes = codes.replace(/\t/g, '  ');
//
//    // rtirm
//    codes = codes.replace(/([ ]+$)/gm, ''); // ltrim | rtrim

    // strip redundant white-spaces or tabs
    codes = codes.replace(/(\t|[ ])+/g, ' ');
    codes = codes.replace(/((^[ ]+)|([ ]+$))/gm, ''); // ltrim | rtrim

//    // strip redundant newline
//    codes = codes.replace(/(\n|\r)+/g, '\n');

    // strip all newline
    codes = codes.replace(/(\n|\r)+/g, '');

    // strip redundant white-space between delimiters
    delis = ',:;{}()';
    for(i=0; i<delis.length; i++){
     deli = delis.charAt(i);
     var regx = new RegExp('[ ]*\\' + deli + '[ ]*', 'g');
     //print(regx);
     codes = codes.replace(regx, deli);
    }

    if(editor.value!=codes){
      editor.value=codes;
      displayMessage('CSS strip ok!');
    }else{
      displayMessage('nothing changed');
    }

  }catch(ex){
    alert('error: ' + ex);
  }
}


// for debugging: you can turn it off in final release ----------------------
wikibar_addonInstall();


//}}}
/***
|''Name:''|DateFormatString|
|''Version:''||
|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|
|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|
|''Type:''|WikiBar addon|
|''Required:''|WikiBar 2.0.0+|
!Description
Add date format string syntax.
!Installation
#Install WikiBar firstly.
#Create your addon as a tiddler and add 'wikibarAddons' tag.
!Code
***/
//{{{

//----------------------------------------------------------------------------
// addon install function: this is a must
//----------------------------------------------------------------------------
function wikibar_addonInstall(unused)
{
  // define tools
  var dateFormatString={
    TYPE:'MENU',
    CAPTION: 'date format string',
    TOOLTIP: 'often used with \"today\" macro',
    YYYY:
    {
      TOOLTIP:    'full year',
      syntax: 'YYYY',
      HANDLER: wikibar_editFormatByCursor
    },
    YY:
    {
      TOOLTIP:    '2-digit year',
      syntax: 'YY',
      HANDLER: wikibar_editFormatByCursor
    },
    MMM:
    {
      TOOLTIP:    'month name',
      syntax: 'MMM',
      HANDLER: wikibar_editFormatByCursor
    },
    MM:
    {
      TOOLTIP:    'month',
      syntax: 'MM',
      HANDLER: wikibar_editFormatByCursor
    },
    OMM:
    {
      TOOLTIP:    'zero-leading month',
      syntax: '0MM',
      HANDLER: wikibar_editFormatByCursor
    },
    DDD:
    {
      TOOLTIP:    'week day',
      syntax: 'DDD',
      HANDLER: wikibar_editFormatByCursor
    },
    DD:
    {
      TOOLTIP:    'day',
      syntax: 'DD',
      HANDLER: wikibar_editFormatByCursor
    },
    '0DD':
    {
      TOOLTIP:    'zero-leading day',
      syntax: '0DD',
      HANDLER: wikibar_editFormatByCursor
    },
    DDth:
    {
      TOOLTIP:    'day with trailing (English) suffix',
      syntax: 'DDth',
      HANDLER: wikibar_editFormatByCursor
    },
    hh:
    {
      TOOLTIP:    'hour',
      syntax: 'hh',
      HANDLER: wikibar_editFormatByCursor
    },
    '0hh':
    {
      TOOLTIP:    'zero-leading hour',
      syntax: '0hh',
      HANDLER: wikibar_editFormatByCursor
    },
    mm:
    {
      TOOLTIP:    'minute',
      syntax: 'mm',
      HANDLER: wikibar_editFormatByCursor
    },
    '0mm':
    {
      TOOLTIP:    'zero-leading minute',
      syntax: '0mm',
      HANDLER: wikibar_editFormatByCursor
    },
    ss:
    {
      TOOLTIP:    'second',
      syntax: 'ss',
      HANDLER: wikibar_editFormatByCursor
    },
    '0ss':
    {
      TOOLTIP:    'zero-leading second',
      syntax: '0ss',
      HANDLER: wikibar_editFormatByCursor
    }
  };

  // register tools
  wikibarStore.addon.dateFormatString = dateFormatString;
}

// for debugging: you can turn it off in final release ----------------------
wikibar_addonInstall();


//}}}
[[Добро пожаловать!]]
<!--{{{-->
<div class='title' macro='view title'></div>
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler wikibar'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
[[Copyright]]

<<slider chkSliderOptionsPanel SiteMap "site index »" >>

<<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
Для того, чтобы начать работать с TiddlyWiki, вы можете поменять следующие записи:
* SiteTitle & SiteSubtitle: Заголовок и подзаголовок сайта (после сохранения вы увидите их в заголовке окна)
* MainMenu: Меню (оно обычно слева)
* DefaultTiddlers: Список записей, которые будут открыты при запуске wiki.
Имя, которым будут подписаны ваши записи, можете ввести тут: <<option txtUserName>>
<<importTiddlers>>
/***
|''Name:''|JsStripper|
|''Version:''||
|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|
|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|
|''Type:''|WikiBar addon|
|''Required:''|WikiBar 2.0.0+|
!Description
reduce the size of javascript
!Installation
#install WikiBar at first
#create your addon as a tiddler with tag 'wikibarAddons'
!Code
***/
//{{{

//----------------------------------------------------------------------------
// addon install function: this is a must
//----------------------------------------------------------------------------
function wikibar_addonInstall(unused){

  // define tools
  var jsStripper={
        TYPE:'MENU',
  		  CAPTION:'stripper',
  		  doit:{
  		    CAPTION: 'go!',
  		    HANDLER: JsStripper_doIt
  		  },
        SEPERATOR:{/*-----------------------------*/},
        options:{
          TYPE:'MENU',
          DYNAITEM: JsStripper_genOptions
        }
  		};

  // register tools
  if(!wikibarStore.addon.javascript){ wikibarStore.addon.javascript = { TYPE:'MENU' }; }
  wikibarStore.addon.javascript.jsStripper = jsStripper;

  JsStripper_init();
}

function JsStripper_init(){

  // set default value
  var cookies = [
    {name: 'chkJsStripperSetAndGo', value: false},
    {name: 'chkJsStripperRemoveComment', value: true},
    {name: 'chkJsStripperLTrim', value: false},
    {name: 'chkJsStripperRTrim', value: true},
    {name: 'chkJsStripperRemoveCrlf', value: true},
    {name: 'chkJsStripperRemoveAllCrlf', value: false}
  ];

  for(var i=0; i<cookies.length; i++){
    if(config.options[cookies[i].name]==null){
      config.options[cookies[i].name]=cookies[i].value;
      saveOptionCookie(cookies[i].name);
    }
  }

}

function JsStripper_genOptions(){
  return {
    setAndGo:{
      CAPTION:'set and go',
      SELECTED: config.options['chkJsStripperSetAndGo'],
      HANDLER: function(param){
        config.options['chkJsStripperSetAndGo'] = !config.options['chkJsStripperSetAndGo'];
        saveOptionCookie('chkJsStripperSetAndGo');
      }
    },
    SEPERATOR:{/*-----------------------------*/},
    removeComment: {
      CAPTION:'remove comments',
      SELECTED: config.options['chkJsStripperRemoveComment'],
      HANDLER: function(param){
        config.options['chkJsStripperRemoveComment'] = !config.options['chkJsStripperRemoveComment'];
        saveOptionCookie('chkJsStripperRemoveComment');
        if(config.options['chkJsStripperRemoveComment'] && config.options['chkJsStripperSetAndGo']){ JsStripper_removeComment(param); }
      }
    },
    lTrim: {
      CAPTION:'trim leading spaces',
      SELECTED: config.options['chkJsStripperLTrim'],
      HANDLER: function(param){
        config.options['chkJsStripperLTrim'] = !config.options['chkJsStripperLTrim'];
        saveOptionCookie('chkJsStripperLTrim');
        if(config.options['chkJsStripperLTrim'] && config.options['chkJsStripperSetAndGo']){ JsStripper_lTrim(param); }
      }
    },
    rTrim: {
      CAPTION:'trim tailing spaces',
      SELECTED: config.options['chkJsStripperRTrim'],
      HANDLER: function(param){
        config.options['chkJsStripperRTrim'] = !config.options['chkJsStripperRTrim'];
        saveOptionCookie('chkJsStripperRTrim');
        if(config.options['chkJsStripperRTrim'] && config.options['chkJsStripperSetAndGo']){ JsStripper_rTrim(param); }
      }
    },
    removeCrlf: {
      TYPE:'MENU',
      CAPTION:'remove new-lines',
      removeRedundant:{
        CAPTION:'remove redundant',
        SELECTED: config.options['chkJsStripperRemoveCrlf'],
        HANDLER: function(param){
          config.options['chkJsStripperRemoveCrlf'] = !config.options['chkJsStripperRemoveCrlf'];
          saveOptionCookie('chkJsStripperRemoveCrlf');
          if(!config.options['chkJsStripperRemoveCrlf']){ config.options['chkJsStripperRemoveAllCrlf'] = false; }
          if(config.options['chkJsStripperRemoveCrlf'] && config.options['chkJsStripperSetAndGo']){ JsStripper_removeCrlf(param); }
        }
      },
      removeAllCrlf:{
        CAPTION:'remove all',
        SELECTED: config.options['chkJsStripperRemoveAllCrlf'],
        HANDLER: function(param){
          config.options['chkJsStripperRemoveAllCrlf'] = !config.options['chkJsStripperRemoveAllCrlf'];
          saveOptionCookie('chkJsStripperRemoveAllCrlf');
          if(config.options['chkJsStripperRemoveAllCrlf']){ config.options['chkJsStripperRemoveCrlf'] = true; }
          if(config.options['chkJsStripperRemoveAllCrlf'] && config.options['chkJsStripperSetAndGo']){ JsStripper_removeCrlf(param); }
        }
      }
    }
  };
}

function JsStripper_removeComment(param){

  var editor = param.button.editor;
  var codes = editor.value;

  if(config.options['chkJsStripperRemoveComment']){
    // remove multi-line javascript comment
    codes = codes.replace(/\/\*(\s*|.*?)*\*\//g, '');

    // remove single-line comment
    // note: those has '//' in string should in '\/\/' format!!
    codes = codes.replace(/\/\/.*$/gm, '');
  }

  if(editor.value != codes){ editor.value = codes; }
};

function JsStripper_lTrim(param){

  var editor = param.button.editor;
  var codes = editor.value;

  if(config.options['chkJsStripperLTrim']){
    codes = codes.replace(/(^(\t|[ ])+)/gm, '');
  }

  if(editor.value != codes){ editor.value = codes; }
};

function JsStripper_rTrim(param){

  var editor = param.button.editor;
  var codes = editor.value;

  if(config.options['chkJsStripperRTrim']){
    codes = codes.replace(/((\t|[ ])+$)/gm, '');
  }

  if(editor.value != codes){ editor.value = codes; }
};

function JsStripper_removeCrlf(param){

  var editor = param.button.editor;
  var codes = editor.value;

  if(config.options['chkJsStripperRemoveCrlf']){
    codes = codes.replace(/(\n|\r)+/g, '\n'); // 多個crlf轉為一個
  }else if(config.options['chkJsStripperRemoveAllCrlf']){
    codes = codes.replace(/(\n|\r)/g, '');  // 全部移除
  }

  if(editor.value != codes){ editor.value = codes; }
};

function JsStripper_doIt(param){

  clearMessage();
  try{
    var editor = param.button.editor;
    var codes = editor.value;

    // remove comments
    JsStripper_removeComment(param);

    // replace tab to spaces
    //codes = codes.replace(/(\t)/g, '  ');

    // strip redundant white-spaces or tabs
    //codes = codes.replace(/(\t|[ ])+/g, ' ');

    // right trim
    JsStripper_rTrim(param);

    // left trim
    JsStripper_lTrim(param);

    // strip newline
    JsStripper_removeCrlf(param);

//    // strip redundant white-space between delimiters: 這可能破壞字串內容!
//    delis = '!%&*()-+=\/{}:;<>,?';
//    for(i=0; i<delis.length; i++){
//     deli = delis.charAt(i);
//     var regx = new RegExp('[ ]*\\' + deli + '[ ]*', 'g');
//     //print(regx);
//     codes = codes.replace(regx, deli);
//    }

//    // strip redundant white spaces
//    codes = codes.replace(/\s/gm, '');

    if(editor.value!=codes){
      //editor.value=codes;
      displayMessage('JS strip ok!');
      wikibar_editSelectAll(param);
    }else{
      displayMessage('nothing changed');
    }

  }catch(ex){
    alert('error: ' + ex);
  }
};


// for debugging: you can turn it off in final release ----------------------
wikibar_addonInstall();


//}}}
/***
|''Name:''|JsVerifier|
|''Version:''||
|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|
|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|
|''Type:''|WikiBar addon|
|''Required:''|WikiBar 2.0.0+|
!Description
Javascript verifier, refer to http://www.crockford.com/jslint/index.html
!Installation
#install WikiBar at first
#create your addon as a tiddler with tag 'wikibarAddons'
!Code
***/
//{{{

//----------------------------------------------------------------------------
// addon install function: this is a must
//----------------------------------------------------------------------------
function wikibar_addonInstall(unused){

  // define tools
  var jsVerifier={
    TYPE:'MENU',
    CAPTION:'verifier',
    doit:{
  	  CAPTION:'go!',
  	  TOOLTIP:'javascript verifier',
  	  HANDLER: JsVerifier_doIt
  	},
  	DYNAITEM: JsVerifier_genCloseReport,
  	SEPERATOR:{/*-----------------------------*/},
  	options:{
  	  TYPE:'MENU',
      DYNAITEM: JsVerifier_genOptions
    },
    about:{
      HANDLER: function(){
        clearMessage();
        displayMessage('Refer to www.JSLint.com for more informations', 'http:\/\/www.JSLint.com');
      }
    }
	};

  // register tools
  if(!wikibarStore.addon.javascript){ wikibarStore.addon.javascript = { TYPE:'MENU' }; }
  wikibarStore.addon.javascript.jsVerifier = jsVerifier;

  // set style
  setStylesheet(
    '#JsVerifierDiv { background-color: #fff; display:block; overflow:auto; border: 1px solid;}',
    'JsLintStyleSheet' );

  // init
  JsVerifier_init();
}

String.prototype.entityify = function () {
  return this.
              replace(/[&]/g, '&amp;').
              replace(/[<]/g, '&lt;').
              replace(/[>]/g, '&gt;');
};

function JsVerifier_genCloseReport(){
  return {
    closeReport:{
  	  CAPTION:'close report',
  	  DISABLED: !document.getElementById('JsVerifierDiv'), // check if report exist
  	  HANDLER: JsVerifier_closeReport
  	}
  };
}

function JsVerifier_init(){

  // set default value
  cookies = [
    {name: 'chkJsVerifierlaxLineEnd', value: false},
    {name: 'chkJsVerifierplusplus', value: false},
    {name: 'chkJsVerifiercap', value: false},
    {name: 'chkJsVerifierjscript', value: false},
    {name: 'chkJsVerifierdebug', value: false}
  ];

  for(var i=0; i<cookies.length; i++){
    if(config.options[cookies[i].name]===null){
      config.options[cookies[i].name]=cookies[i].value;
      saveOptionCookie(cookies[i].name);
    }
  }
}

function JsVerifier_genOptions(){
  return {
    //TYPE:'MENU',
    laxLineEnd: {
      CAPTION:'strict line ending',
      SELECTED: !config.options['chkJsVerifierlaxLineEnd'],
      HANDLER: function(){
        config.options['chkJsVerifierlaxLineEnd'] = !config.options['chkJsVerifierlaxLineEnd'];
        saveOptionCookie('chkJsVerifierlaxLineEnd');
      }
    },
    plusplus: {
      CAPTION:'++ and -- considered harmful',
      SELECTED: config.options['chkJsVerifierplusplus'],
      HANDLER: function(){
        config.options['chkJsVerifierplusplus'] = !config.options['chkJsVerifierplusplus'];
        saveOptionCookie('chkJsVerifierplusplus');
      }
    },
    cap: {
      CAPTION:'tolerate HTML case',
      SELECTED: config.options['chkJsVerifiercap'],
      HANDLER: function(){
        config.options['chkJsVerifiercap'] = !config.options['chkJsVerifiercap'];
        saveOptionCookie('chkJsVerifiercap');
      }
    },
    jscript: {
      CAPTION:'tolerate JScript deviations',
      SELECTED: config.options['chkJsVerifierjscript'],
      HANDLER: function(){
        config.options['chkJsVerifierjscript'] = !config.options['chkJsVerifierjscript'];
        saveOptionCookie('chkJsVerifierjscript');
      }
    },
    debug: {
      CAPTION:'allow debugger statements',
      SELECTED: config.options['chkJsVerifierdebug'],
      HANDLER: function(){
        config.options['chkJsVerifierdebug'] = !config.options['chkJsVerifierdebug'];
        saveOptionCookie('chkJsVerifierdebug');
      }
    }
  };
}

function JsVerifier_doIt(param){

  try{
    // set jslint options
    jslint.laxLineEnd = config.options['chkJsVerifierlaxLineEnd'];
    jslint.plusplus   = config.options['chkJsVerifierplusplus'];
    jslint.cap        = config.options['chkJsVerifiercap'];
    jslint.jscript    = config.options['chkJsVerifierjscript'];
    jslint.debug      = config.options['chkJsVerifierdebug'];

    var editor = param.button.editor;

    if (jslint(editor.value)) {
        JsVerifier_report(true, jslint.report(), param);
    } else {
        var e = jslint.error;
        r = '<table>'+
            '<tr><td>error</td><td>line: ' + (e.line + 1) + ', character: ' + (e.character + 1) + '</td></tr>' +
            '<tr><td>reason</td><td>' + e.reason.entityify() + '</td></tr>' +
            '<tr><td>code</td><td>' + e.evidence.entityify() + '</td></tr>' +
            '</table>';
        JsVerifier_report(false, r, param);
    }

  }catch(ex){
    alert('Error: '+ex);
  }
}

// close report
function JsVerifier_closeReport(unused){
  var d=document.getElementById('JsVerifierDiv');
  if(d){ d.parentNode.removeChild(d); }
}

// create a div to report
function JsVerifier_report(result, r, param){

  JsVerifier_closeReport();

  if(r.trim().length<=0){return;}

  var editor = param.button.editor;
  var div = createTiddlyElement(editor.parentNode,'div','JsVerifierDiv','viewer'); // CSS: #JsVerifierDiv
  div.innerHTML = r;

//  div.style.left = findPosX(editor) + 'px';
//  div.style.top = findPosY(editor) + 'px';
  div.style.width = editor.offsetWidth + 'px';
  div.style.height = (result? parseInt(editor.offsetHeight,10): parseInt(editor.offsetHeight/2,10)) + 'px';
}


//------------------------------------------------------------------------------------------------
// (C)2002 Douglas Crockford
// www.JSLint.com
// http://www.crockford.com/jslint/jslint.js
//------------------------------------------------------------------------------------------------
var jslint;String.prototype.isAlpha=function(){return(this>='a'&&this<='z\uffff')||(this>='A'&&this<='Z\uffff');};String.prototype.isDigit=function(){return(this>='0'&&this<='9');};(function(){var anonname,builtin,funlab,funstack,functions,lex,lookahead,member,prevtoken,stack,syntax={},token,verb,xmode,xtype,tx=/^([(){}[.,:;'"~]|\](\]>)?|\?>?|==?=?|\/(\*(global)*|=|)|\*[\/=]?|\+[+=]?|-[-=]?|%[=>]?|&[&=]?|\|[|=]?|>>?>?=?|<([\/=%\?]|\!(\[|--)?|<=?)?|\^=?|\!=?=?|[a-zA-Z_$][a-zA-Z0-9_$]*|[0-9]+([xX][0-9a-fA-F]+|\.[0-9]*)?([eE][+-]?[0-9]+)?)/,sx=/^((\\[^\x00-\x1f]|[^\x00-\x1f'\\])*)'/,qx=/^((\\[^\x00-\x1f]|[^\x00-\x1f"\\])*)"/,rx=/^(\\[^\x00-\x1f]|\[(\\[^\x00-\x1f]|[^\x00-\x1f\\\/])*\]|[^\x00-\x1f\\\/\[])+\/[gim]*/,lx=/\*\/|\/\*/,gx=/^([a-zA-Z_$][a-zA-Z0-9_$]*)/,hx=/^[\x00-\x20,]*(\*\/)?/,wx=/^\s*(\/\/.*\r*$)?/;jslint=function(s){functions=[];error.free=true;xmode=false;xtype='';stack=null;funlab={};member={};funstack=[];lookahead=[];lex=new Lex(s);builtin={Array:9,Boolean:9,Date:9,decodeURI:9,decodeURIComponent:9,encodeURI:9,encodeURIComponent:9,Error:9,escape:9,EvalError:9,Function:9,isFinite:9,isNaN:9,Math:9,Number:9,Object:9,parseInt:9,parseFloat:9,RangeError:9,ReferenceError:9,RegExp:9,String:9,SyntaxError:9,TypeError:9,unescape:9,URIError:9};prevtoken=token=syntax['(begin)'];advance();try{if(token.value.charAt(0)==='<'){xml();}else{statements();advance('(end)');}}catch(e){jslint.error=error;return false;}
jslint.error=null;return true;};function object(o){var r=function(){};r.prototype=o;return new r();}
function Lex(lines,filename){if(typeof lines==='string'){lines=lines.split('\n');if(lines.length==1){lines=lines[0].split('\r');}}
jslint.lines=lines;var line=0,character=0,from=0,s=lines[0];function nextLine(){line+=1;if(line>=lines.length){return false;}
character=0;s=lines[line];return true;}
this.token=function(){function string(x){r=x.exec(s);if(r){t=r[1];l=r[0].length;s=s.substr(l);character+=l;if(xmode=='script'){if(t.indexOf('<\/')>=0){throw error('Expected "...<\\/..." and instead saw "...<\/...".',token);}}
return it('(string)',r[1]);}else{if(!xmode){throw error("Unclosed string: "+s,line,character);}
while(error.free){if(!nextLine()){throw error("Unclosed string.",token);}
i=s.indexOf('"');if(i>=0){break;}}
s=s.substr(i+1);return it('(string)');}}
var c,i,l,r,t;while(error.free){if(!s){if(nextLine()){return it('(endline)','');}else{return it('(end)','');}}
r=wx.exec(s);if(!r||!r[0]){break;}
l=r[0].length;s=s.substr(l);character+=l;if(s){break;}}
from=character;r=tx.exec(s);if(r){t=r[0];l=t.length;s=s.substr(l);character+=l;c=t.substr(0,1);if(c.isAlpha()||c==='_'||c==='$'){return it('(identifier)',t);}
if(c.isDigit()){if(token.id==='.'){throw error("A decimal fraction should have a zero before the decimal point.",token);}
if(!isFinite(Number(t))){throw error("Bad number: '"+t+"'.",line,character);}
if(s.substr(0,1).isAlpha()){throw error("Space is required after a number: '"+
t+"'.",line,character);}
if(c==='0'&&t.substr(1,1).isDigit()){throw error("Don't use extra leading zeros: '"+
t+"'.",line,character);}
if(t.substr(t.length-1)==='.'){throw error("A trailing decimal point can be confused with a dot: '"+t+"'.",line,character);}
return it('(number)',t);}
if(t==='"'){return(xmode==='"'||xmode==='string')?it('(punctuator)',t):string(qx);}
if(t==="'"){return(xmode==="'"||xmode==='string')?it('(punctuator)',t):string(sx);}
if(t==='/*'){while(error.free){i=s.search(lx);if(i>=0){break;}
if(!nextLine()){throw error("Unclosed comment.",token);}}
character+=i+2;if(s.substr(i,1)==='/'){throw error("Nested comment.");}
s=s.substr(i+2);return this.token();}
if(t==='/*global'){while(error.free){r=hx.exec(s);if(r){l=r[0].length;s=s.substr(l);character+=l;if(r[1]==='*/'){return this.token();}}
if(s){r=gx.exec(s);if(r){l=r[0].length;s=s.substr(l);character+=l;builtin[r[1]]=9;}else{throw error("Bad global identifier: '"+
s+"'.",line,character);}}else if(!nextLine()){throw error("Unclosed comment.");}}}
return it('(punctuator)',t);}
throw error("Unexpected token: "+(t||s.substr(0,1)),line,character);};this.skip=function(to){if(token.id){if(!to){to='';if(token.id.substr(0,1)==='<'){lookahead.push(token);return true;}}else if(token.id.indexOf(to)>=0){return true;}}
prevtoken=token;token=syntax['(error)'];while(error.free){var i=s.indexOf(to||'<');if(i>=0){character+=i+to.length;s=s.substr(i+to.length);return true;}
if(!nextLine()){break;}}
return false;};this.regex=function(){var l,r=rx.exec(s),x;if(r){l=r[0].length;character+=l;s=s.substr(l);x=r[1];return it('(regex)',x);}
throw error("Bad regular expression: "+s);};function it(type,value){var t;if(type==='(punctuator)'){t=syntax[value];}else if(type==='(identifier)'){t=syntax[value];if(!t||typeof t!='object'){t=syntax[type];}}else{t=syntax[type];}
if(!t||typeof t!='object'){throw error("Unrecognized symbol: '"+value+"' "+type);}
t=object(t);if(value||type==='(string)'){t.value=value;}
t.line=line;t.character=character;t.from=from;t.filename=filename;return t;}}
var error=function(m,x,y){var l,c,t=typeof x==='object'?x:token;if(typeof x==='number'){l=x;c=y||0;}else{if(t.id==='(end)'){t=prevtoken;}
l=t.line||0;c=t.from||0;}
if(error.free){error.free=false;error.id='(error)';error.reason=m;error.evidence=jslint.lines[l]||'';error.line=l;error.character=c;token=syntax['(error)'];token.reason=error.reason;}
return error;};function addlabel(t,type){if(t){if(t==='arguments'){if(type==='global'||type==='var*'){funlab[t]='parameter';return;}else{throw error("Incorrect use of 'arguments'.",prevtoken);}}
if(typeof funlab[t]==='string'){switch(funlab[t]){case'var':case'var*':if(type==='global'){funlab[t]='var*';return;}
break;case'global':if(type==='var'){throw error('Var '+t+' was used before it was declared.',prevtoken);}
if(type==='var*'||type==='global'){return;}
break;case'function':case'parameter':if(type==='global'){return;}
break;}
throw error("Identifier '"+t+"' already declared as "+
funlab[t],prevtoken);}
funlab[t]=type;}}
function peek(i){var j=0,t;if(token==syntax['(error)']){return token;}
i=i||0;while(j<=i){t=lookahead[j];if(!t){t=lookahead[j]=lex.token();}
j+=1;}
return t;}
var badbreak={')':true,']':true,'++':true,'--':true};function advance(id,t){var l;switch(prevtoken.id){case'(number)':if(token.id==='.'){throw error("A dot following a number can be confused with a decimal point.",prevtoken);}
break;case'-':if(token.id==='-'||token.id==='--'){throw error("Confusing minusses.");}
break;case'+':if(token.id==='+'||token.id==='++'){throw error("Confusing plusses.");}
break;}
if(prevtoken.type==='(string)'||prevtoken.identifier){anonname=prevtoken.value;}
if(id&&token.value!=id){if(t){if(token.id==='(end)'){throw error("Unmatched '"+t.id+"'.",t);}else{throw error("Expected '"+id+"' to match '"+
t.id+"' from line "+(t.line+1)+" and instead saw '"+token.value+"'.");}}else{throw error("Expected '"+id+"' and instead saw '"+
token.value+"'.");}}
prevtoken=token;while(error.free){token=lookahead.shift()||lex.token();if(token.id==='<!['&&xtype!=='html'){if(xmode==='script'){token=lex.token();if(token.value!=='CDATA'){throw error("Expected 'CDATA'");}
token=lex.token();if(token.id!=='['){throw error("Expected '['");}
xmode='CDATA';}else if(xmode==='xml'){lex.skip(']]>');}else{throw error("Unexpected token '<!['");}}else if(token.id===']]>'){if(xmode==='CDATA'){xmode='script';}else{throw error("Unexpected token ']]>");}}else if(token.id!=='(endline)'){break;}
if(xmode==='"'||xmode==="'"){throw error("Missing '"+xmode+"'.",prevtoken);}
l=!xmode&&!jslint.laxLineEnd&&(prevtoken.type=='(string)'||prevtoken.type=='(number)'||prevtoken.type=='(identifier)'||badbreak[prevtoken.id]);}
if(l&&token.id!='{'&&token.id!='}'&&token.id!=']'){throw error("Strict line ending error: '"+
prevtoken.value+"'.",prevtoken);}
if(xtype==='widget'&&xmode==='script'&&token.id){l=token.id.charAt(0);if(l==='<'||l==='&'){token.nud=token.led=null;token.lbp=0;token.reach=true;}}}
function advanceregex(){token=lex.regex();}
function beginfunction(i){var f={'(name)':i,'(line)':token.line+1,'(context)':funlab};funstack.push(funlab);funlab=f;functions.push(funlab);}
function endfunction(){funlab=funstack.pop();}
function parse(rbp,initial){var l,left,o;if(token.id&&token.id==='/'){if(prevtoken.id!='('&&prevtoken.id!='='&&prevtoken.id!=':'&&prevtoken.id!=','&&prevtoken.id!='='){throw error("Expected to see a '(' or '=' or ':' or ',' preceding a regular expression literal, and instead saw '"+
prevtoken.value+"'.",prevtoken);}
advanceregex();}
if(token.id==='(end)'){throw error("Unexpected early end of program",prevtoken);}
advance();if(initial){anonname='anonymous';verb=prevtoken.value;}
if(initial&&prevtoken.fud){prevtoken.fud();}else{if(prevtoken.nud){o=prevtoken.exps;left=prevtoken.nud();}else{if(token.type==='(number)'&&prevtoken.id==='.'){throw error("A leading decimal point can be confused with a dot: ."+token.value,prevtoken);}
throw error("Expected an identifier and instead saw '"+
prevtoken.id+"'.",prevtoken);}
while(rbp<token.lbp){o=token.exps;advance();if(prevtoken.led){left=prevtoken.led(left);}else{throw error("Expected an operator and instead saw '"+
prevtoken.id+"'.");}}
if(initial&&!o){throw error("Expected an assignment or function call and instead saw an expression.",prevtoken);}}
if(l){funlab[l]='label';}
return left;}
function symbol(s,p){return syntax[s]||(syntax[s]={id:s,lbp:p,value:s});}
function delim(s){return symbol(s,0);}
function stmt(s,f){var x=delim(s);x.identifier=x.reserved=true;x.fud=f;return x;}
function blockstmt(s,f){var x=stmt(s,f);x.block=true;return x;}
function prefix(s,f){var x=symbol(s,150);x.nud=(typeof f==='function')?f:function(){parse(150);return this;};return x;}
function type(s,f){var x=delim(s);x.type=s;x.nud=f;return x;}
function reserve(s,f){var x=type(s,f);x.identifier=x.reserved=true;return x;}
function reservevar(s){return reserve(s,function(){return this;});}
function infix(s,f,p){var x=symbol(s,p);x.led=(typeof f==='function')?f:function(left){return[f,left,parse(p)];};return x;}
function assignop(s,f){symbol(s,20).exps=true;return infix(s,function(left){if(left){if(left===true||(left.identifier&&!left.reserved)){parse(19);return left;}
if(left==syntax['function']){if(jslint.jscript){parse(19);return left;}else{throw error("Expected an identifier in an assignment, and instead saw a function invocation.",prevtoken);}}}
throw error("Bad assignment.",this);},20);}
function suffix(s,f){var x=symbol(s,150);x.led=function(left){if(jslint.plusplus){throw error("This operator is considered harmful: "+this.id,this);}
return[f,left];};return x;}
function optionalidentifier(){if(token.reserved){throw error("Expected an identifier and instead saw '"+
token.id+"' (a reserved word).");}
if(token.identifier&&!token.reserved){advance();return prevtoken.value;}}
function identifier(){var i=optionalidentifier();if(i){return i;}
throw error("Expected an identifier and instead saw '"+
token.value+"'.",token);}
function reachable(s){var i=0,t;if(token.id!=';'){return;}
while(error.free){t=peek(i);if(t.reach){return;}
if(t.id!='(endline)'){if(t.id==='function'){throw error("Inner functions should be listed at the top of the outer function.",t);}
throw error("Unreachable '"+t.value+"' after '"+s+"'.",t);}
i+=1;}}
function statement(){var t=token;if(t.identifier&&!t.reserved&&peek().id===':'){advance();advance(':');addlabel(t.value,'live*');if(!token.labelled){throw error("Label '"+t.value+"' on unlabelable statement '"+token.value+"'.",token);}
if(t.value.toLowerCase()=='javascript'){throw error("Label '"+t.value+"' looks like a javascript url.",token);}
token.label=t.value;t=token;}
parse(0,true);if(!t.block&&error.free){if(token.id!=';'){throw error("Expected ';' and instead saw '"+token.value+"'.",prevtoken.line,prevtoken.from+prevtoken.value.length);}
advance(';');}}
function statements(){while(error.free&&!token.reach){statement();}}
function block(){var t=token;advance('{');statements();advance('}',t);verb=null;}
function idValue(){return this;}
function countMember(m){if(typeof member[m]==='number'){member[m]+=1;}else{member[m]=1;}}
type('(number)',idValue);type('(string)',idValue);syntax['(identifier)']={type:'(identifier)',lbp:0,identifier:true,nud:function(){addlabel(this.value,'global');return this;},led:function(){throw error("Expected an operator and instead saw '"+
token.value+"'.");}};type('(regex)',function(){return[this.id,this.value,this.flags];});delim('(endline)');delim('(begin)');delim('(end)').reach=true;delim('</').reach=true;delim('<![').reach=true;delim('<%');delim('<?');delim('<!');delim('<!--');delim('%>');delim('?>');delim('(error)').reach=true;delim('}').reach=true;delim(')');delim(']');delim(']]>').reach=true;delim('"').reach=true;delim("'").reach=true;delim(';');delim(':').reach=true;delim(',');reserve('else');reserve('case').reach=true;reserve('default').reach=true;reserve('catch');reserve('finally');reservevar('this');reservevar('true');reservevar('false');reservevar('Infinity');reservevar('NaN');reservevar('null');reservevar('undefined');assignop('=','assign',20);assignop('+=','assignadd',20);assignop('-=','assignsub',20);assignop('*=','assignmult',20);assignop('/=','assigndiv',20).nud=function(){throw error("A regular expression literal can be confused with '/='.");};assignop('%=','assignmod',20);assignop('&=','assignbitand',20);assignop('|=','assignbitor',20);assignop('^=','assignbitxor',20);assignop('<<=','assignshiftleft',20);assignop('>>=','assignshiftright',20);assignop('>>>=','assignshiftrightunsigned',20);infix('?',function(left){parse(10);advance(':');parse(10);},30);infix('||','or',40);infix('&&','and',50);infix('|','bitor',70);infix('^','bitxor',80);infix('&','bitand',90);infix('==',function(left){var t=token;if((t.type==='(number)'&&!+t.value)||(t.type==='(string)'&&!t.value)||t.type==='true'||t.type==='false'||t.type==='undefined'||t.type==='null'){throw error("Use '===' to compare with '"+t.value+"'.",t);}
return['==',left,parse(100)];},100);infix('===','equalexact',100);infix('!=',function(left){var t=token;if((t.type==='(number)'&&!+t.value)||(t.type==='(string)'&&!t.value)||t.type==='true'||t.type==='false'||t.type==='undefined'||t.type==='null'){throw error("Use '!==' to compare with '"+t.value+"'.",t);}
return['!=',left,parse(100)];},100);infix('!==','notequalexact',100);infix('<','less',110);infix('>','greater',110);infix('<=','lessequal',110);infix('>=','greaterequal',110);infix('<<','shiftleft',120);infix('>>','shiftright',120);infix('>>>','shiftrightunsigned',120);infix('in','in',120);infix('instanceof','instanceof',120);infix('+','addconcat',130);prefix('+','num');infix('-','sub',130);prefix('-','neg');infix('*','mult',140);infix('/','div',140);infix('%','mod',140);suffix('++','postinc');prefix('++','preinc');syntax['++'].exps=true;suffix('--','postdec');prefix('--','predec');syntax['--'].exps=true;prefix('delete',function(){parse(0);}).exps=true;prefix('~','bitnot');prefix('!','not');prefix('typeof','typeof');prefix('new',function(){parse(160);advance('(');if(token.id!==')'){while(error.free){parse(10);if(token.id!==','){break;}
advance(',');}}
advance(')');return syntax['function'];});syntax['new'].exps=true;infix('.',function(left){var m=identifier();if(typeof m==='string'){countMember(m);}
return true;},160);infix('(',function(left){var n=0;if(token.id!==')'){while(error.free){parse(10);n+=1;if(token.id!==','){break;}
advance(',');}}
advance(')');if(left&&left.value=='parseInt'&&n==1){throw error("Missing radix parameter",left);}
return syntax['function'];},160).exps=true;prefix('(',function(){parse(0);advance(')',this);});infix('[',function(left){var e=parse(0);if(e&&e.type==='(string)'){countMember(e.value);}
advance(']',this);return true;},160);prefix('[',function(){if(token.id===']'){advance(']');return;}
while(error.free){parse(10);if(token.id===','){advance(',');if(token.id===']'||token.id===','){throw error('Extra comma.',prevtoken);}}else{advance(']',this);return;}}},160);(function(x){x.nud=function(){var i;if(token.id==='}'){advance('}');return;}
while(error.free){i=optionalidentifier(true);if(!i&&(token.id==='(string)'||token.id==='(number)')){i=token.id;advance();}
if(!i){throw error("Expected an identifier and instead saw '"+
token.value+"'.");}
if(typeof i.value==='string'){countMember(i.value);}
advance(':');parse(10);if(token.id===','){advance(',');if(token.id===','||token.id==='}'){throw error("Extra comma.");}}else{advance('}',this);return;}}};x.fud=function(){throw error("Expected to see a statement and instead saw a block.");};})(delim('{'));function varstatement(){while(error.free){addlabel(identifier(),'var');if(token.id==='='){advance('=');parse(20);}
if(token.id===','){advance(',');}else{return;}}}
stmt('var',varstatement);function functionparams(){var t=token;advance('(');if(token.id===')'){advance(')');return;}
while(error.free){addlabel(identifier(),'parameter');if(token.id===','){advance(',');}else{advance(')',t);return;}}}
blockstmt('function',function(){var i=identifier();addlabel(i,'var*');beginfunction(i);addlabel(i,'function');functionparams();block();endfunction();});prefix('function',function(){var i=optionalidentifier()||('"'+anonname+'"');beginfunction(i);addlabel(i,'function');functionparams();block();endfunction();});blockstmt('if',function(){var t=token;advance('(');parse(20);advance(')',t);block();if(token.id==='else'){advance('else');if(token.id==='if'||token.id==='switch'){statement();}else{block();}}});blockstmt('try',function(){var b;block();if(token.id==='catch'){advance('catch');beginfunction('"catch"');functionparams();block();endfunction();b=true;}
if(token.id==='finally'){advance('finally');beginfunction('"finally"');block();endfunction();return;}else if(!b){throw error("Expected 'catch' or 'finally' and instead saw '"+
token.value+"'.");}});blockstmt('while',function(){var t=token;advance('(');parse(20);advance(')',t);block();}).labelled=true;reserve('with');blockstmt('switch',function(){var t=token;advance('(');var g=false;parse(20);advance(')',t);t=token;advance('{');while(error.free){switch(token.id){case'case':switch(verb){case'break':case'case':case'continue':case'return':case'switch':case'throw':break;default:throw error("Expected a 'break' statement before 'case'.",prevtoken);}
advance('case');parse(20);g=true;advance(':');verb='case';break;case'default':switch(verb){case'break':case'continue':case'return':case'throw':break;default:throw error("Expected a 'break' statement before 'default'.",prevtoken);}
advance('default');g=true;advance(':');break;case'}':advance('}',t);return;default:if(g){statements();}else{throw error("Expected to see 'case' and instead saw '"+
token.value+"'.");}}}}).labelled=true;stmt('debugger',function(){if(!jslint.debug){throw error("All debugger statements should be removed.");}});stmt('do',function(){block();advance('while');var t=token;advance('(');parse(20);advance(')',t);}).labelled=true;blockstmt('for',function(){var t=token;advance('(');if(peek(token.id==='var'?1:0).id==='in'){if(token.id==='var'){advance('var');addlabel(identifier(),'var');}else{advance();}
advance('in');parse(20);advance(')',t);block();return;}else{if(token.id!=';'){if(token.id==='var'){advance('var');varstatement();}else{for(;;){parse(0);if(token.id!==','){break;}
advance(',');}}}
advance(';');if(token.id!=';'){parse(20);}
advance(';');if(token.id===';'){throw error("Expected to see ')' and instead saw ';'");}
if(token.id!=')'){for(;;){parse(0);if(token.id!==','){break;}
advance(',');}}
advance(')',t);block();}}).labelled=true;stmt('throw',function(){parse(20);reachable('throw');});stmt('return',function(){if(token.id!=';'&&!token.reach){parse(20);}
reachable('return');});stmt('break',function(){if(funlab[token.value]==='live*'){advance();}
reachable('break');});stmt('continue',function(){if(funlab[token.id]==='live*'){advance();}
reachable('continue');});reserve('abstract');reserve('as');reserve('boolean');reserve('byte');reserve('char');reserve('class');reserve('const');reserve('double');reserve('enum');reserve('export');reserve('extends');reserve('final');reserve('float');reserve('goto');reserve('implements');reserve('import');reserve('int');reserve('interface');reserve('long');reserve('native');reserve('package');reserve('private');reserve('protected');reserve('public');reserve('short');reserve('static');reserve('super');reserve('synchronized');reserve('throws');reserve('transient');reserve('use');reserve('void');reserve('volatile');function Token(s){this.id=s;this.lbp=0;this.identifier=true;syntax[s]=this;}
Token.prototype.nud=function(){addlabel(this.id,'global');return this.id;};Token.prototype.led=function(){throw error("Expected an operator and instead saw '"+
token.id+"'.");};jslint.report=function(){var a=[],c,cc,f,i,k,o='',s;function detail(h){if(s.length){return'<div>'+h+':&nbsp; '+s.sort().join(', ')+'</div>';}
return'';}
for(k in member){a.push(k);}
if(a.length){a=a.sort();for(i=0;i<a.length;i+=1){a[i]='<tr><td><tt>'+a[i]+'</tt></td><td>'+
member[a[i]]+'</td></tr>';}
o+='<table><tbody><tr><th>Members</th><th>Occurrences</th></tr>'+
a.join('')+'</tbody></table>';}
for(i=0;i<functions.length;++i){f=functions[i];for(k in f){if(f[k]==='global'){c=f['(context)'];while(error.free){cc=c['(context)'];if(!cc){if((!funlab[k]||funlab[k]==='var?')&&builtin[k]!=9){funlab[k]='var?';f[k]='global?';}
break;}
if(c[k]==='parameter!'||c[k]==='var!'){f[k]='var.';break;}
if(c[k]==='var'||c[k]==='var*'||c[k]==='var!'){f[k]='var.';c[k]='var!';break;}
if(c[k]==='parameter'){f[k]='var.';c[k]='parameter!';break;}
c=cc;}}}}
s=[];for(k in funlab){if(funlab[k].substr(0,3)==='var'){if(funlab[k]==='var?'){s.push('<tt>'+k+'</tt><small>&nbsp;(?)</small>');}else{s.push('<tt>'+k+'</tt>');}}}
o+=detail('Global');if(functions.length){o+='<p>Function:</p><ol style="padding-left:0.5in">';}
for(i=0;i<functions.length;i+=1){f=functions[i];o+='<li value='+
f['(line)']+'><tt>'+(f['(name)']||'')+'</tt>';s=[];for(k in f){if(k.charAt(0)!='('){switch(f[k]){case'parameter':s.push('<tt>'+k+'</tt>');break;case'parameter!':s.push('<tt>'+k+'</tt><small>&nbsp;(closure)</small>');break;}}}
o+=detail('Parameter');s=[];for(k in f){if(k.charAt(0)!='('){switch(f[k]){case'var':s.push('<tt>'+k+'</tt><small>&nbsp;(unused)</small>');break;case'var*':s.push('<tt>'+k+'</tt>');break;case'var!':s.push('<tt>'+k+'</tt><small>&nbsp;(closure)</small>');break;case'var.':s.push('<tt>'+k+'</tt><small>&nbsp;(outer)</small>');break;}}}
o+=detail('Var');s=[];c=f['(context)'];for(k in f){if(k.charAt(0)!='('&&f[k].substr(0,6)==='global'){if(f[k]==='global?'){s.push('<tt>'+k+'</tt><small>&nbsp;(?)</small>');}else{s.push('<tt>'+k+'</tt>');}}}
o+=detail('Global');s=[];for(k in f){if(k.charAt(0)!='('&&f[k]==='label'){s.push(k);}}
o+=detail('Label');o+='</li>';}
if(functions.length){o+='</ol>';}
return o;};var scriptstring={onload:true,onunload:true,onclick:true,ondblclick:true,onmousedown:true,onmouseup:true,onmouseover:true,onmousemove:true,onmouseout:true,onfocus:true,onblur:true,onkeypress:true,onkeydown:true,onkeyup:true,onsubmit:true,onreset:true,onselect:true,onchange:true};var xmltype={HTML:{doBegin:function(n){if(!jslint.cap){throw error("HTML case error.");}
xmltype.html.doBegin();}},html:{doBegin:function(n){xtype='html';xmltype.html.script=false;builtin.alert=9;builtin.document=9;builtin.navigator=9;builtin.window=9;},doTagName:function(n,p){var i,t=xmltype.html.tag[n],x;if(!t){throw error('Unrecognized tag: <'+n+'>. '+
(n===n.toLowerCase()?'Did you mean <'+n.toLowerCase()+'>?':''));}
x=t.parent;if(x){if(x.indexOf(' '+p+' ')<0){throw error('A <'+n+'> must be within <'+x+'>',prevtoken);}}else{i=stack.length;do{if(i<=0){throw error('A <'+n+'> must be within the body',prevtoken);}
i-=1;}while(stack[i].name!=='body');}
xmltype.html.script=n==='script';return t.simple;},doAttribute:function(n,a){if(n==='script'&&a==='src'){xmltype.html.script=false;return'string';}
return scriptstring[a]&&'script';},doIt:function(n){return xmltype.html.script?'script':n!=='html'&&xmltype.html.tag[n].special&&'special';},tag:{a:{},abbr:{},acronym:{},address:{},applet:{},area:{simple:true,parent:' map '},b:{},base:{simple:true,parent:' head '},bdo:{},big:{},blockquote:{},body:{parent:' html noframes '},br:{simple:true},button:{},caption:{parent:' table '},center:{},cite:{},code:{},col:{simple:true,parent:' table colgroup '},colgroup:{parent:' table '},dd:{parent:' dl '},del:{},dfn:{},dir:{},div:{},dl:{},dt:{parent:' dl '},em:{},embed:{},fieldset:{},font:{},form:{},frame:{simple:true,parent:' frameset '},frameset:{parent:' html frameset '},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},head:{parent:' html '},html:{},hr:{simple:true},i:{},iframe:{},img:{simple:true},input:{simple:true},ins:{},kbd:{},label:{},legend:{parent:' fieldset '},li:{parent:' dir menu ol ul '},link:{simple:true,parent:' head '},map:{},menu:{},meta:{simple:true,parent:' head noscript '},noframes:{parent:' html body '},noscript:{parent:' html head body frameset '},object:{},ol:{},optgroup:{parent:' select '},option:{parent:' optgroup select '},p:{},param:{simple:true,parent:' applet object '},pre:{},q:{},samp:{},script:{parent:' head body p div span abbr acronym address bdo blockquote cite code del dfn em ins kbd pre samp strong th td var '},select:{},small:{},span:{},strong:{},style:{parent:' head ',special:true},sub:{},sup:{},table:{},tbody:{parent:' table '},td:{parent:' tr '},textarea:{},tfoot:{parent:' table '},th:{parent:' tr '},thead:{parent:' table '},title:{parent:' head '},tr:{parent:' tbody thead tfoot '},tt:{},u:{},ul:{},'var':{}}},widget:{doBegin:function(n){xtype='widget';builtin.alert=9;builtin.appleScript=9;builtin.beep=9;builtin.bytesToUIString=9;builtin.chooseColor=9;builtin.chooseFile=9;builtin.chooseFolder=9;builtin.convertPathToHFS=9;builtin.convertPathToPlatform=9;builtin.closeWidget=9;builtin.escape=9;builtin.focusWidget=9;builtin.form=9;builtin.include=9;builtin.isApplicationRunning=9;builtin.konfabulatorVersion=9;builtin.log=9;builtin.openURL=9;builtin.play=9;builtin.popupMenu=9;builtin.print=9;builtin.prompt=9;builtin.reloadWidget=9;builtin.resolvePath=9;builtin.resumeUpdates=9;builtin.runCommand=9;builtin.runCommandInBg=9;builtin.saveAs=9;builtin.savePreferences=9;builtin.showWidgetPreferences=9;builtin.sleep=9;builtin.speak=9;builtin.suppressUpdates=9;builtin.tellWidget=9;builtin.unescape=9;builtin.updateNow=9;builtin.yahooCheckLogin=9;builtin.yahooLogin=9;builtin.yahooLogout=9;builtin.COM=9;builtin.filesystem=9;builtin.preferenceGroups=9;builtin.preferences=9;builtin.screen=9;builtin.system=9;builtin.iTunes=9;builtin.URL=9;builtin.animator=9;builtin.CustomAnimation=9;builtin.FadeAnimation=9;builtin.MoveAnimation=9;builtin.RotateAnimation=9;builtin.XMLDOM=9;builtin.XMLHttpRequest=9;},doTagName:function(n,p){var t=xmltype.widget.tag[n];if(!t){throw error('Unrecognized tag: <'+n+'>. ');}
var x=t.parent;if(x.indexOf(' '+p+' ')<0){throw error('A <'+n+'> must be within <'+x+'>',prevtoken);}},doAttribute:function(n,a){var t=xmltype.widget.tag[a];if(!t){throw error('Unrecognized attribute: <'+n+' '+a+'>. ');}
var x=t.parent;if(x.indexOf(' '+n+' ')<0){throw error('Attribute '+a+' does not belong in <'+
n+'>');}
return t.script?'script':a==='name'?'define':'string';},doIt:function(n){var x=xmltype.widget.tag[n];return x&&x.script&&'script';},tag:{"about-box":{parent:' widget '},"about-image":{parent:' about-box '},"about-text":{parent:' about-box '},"about-version":{parent:' about-box '},action:{parent:' widget ',script:true},alignment:{parent:' image text textarea window '},author:{parent:' widget '},autoHide:{parent:' scrollbar '},bgColor:{parent:' text textarea '},bgOpacity:{parent:' text textarea '},checked:{parent:' image '},clipRect:{parent:' image '},color:{parent:' about-text about-version shadow text textarea '},contextMenuItems:{parent:' frame image text textarea window '},colorize:{parent:' image '},columns:{parent:' textarea '},company:{parent:' widget '},copyright:{parent:' widget '},data:{parent:' about-text about-version text textarea '},debug:{parent:' widget '},defaultValue:{parent:' preference '},defaultTracking:{parent:' widget '},description:{parent:' preference '},directory:{parent:' preference '},editable:{parent:' textarea '},enabled:{parent:' menuItem '},extension:{parent:' preference '},file:{parent:' action preference '},fillMode:{parent:' image '},font:{parent:' about-text about-version text textarea '},frame:{parent:' frame window '},group:{parent:' preference '},hAlign:{parent:' frame image scrollbar text textarea '},height:{parent:' frame image scrollbar text textarea window '},hidden:{parent:' preference '},hLineSize:{parent:' frame '},hOffset:{parent:' about-text about-version frame image scrollbar shadow text textarea window '},hotkey:{parent:' widget '},hRegistrationPoint:{parent:' image '},hslAdjustment:{parent:' image '},hslTinting:{parent:' image '},hScrollBar:{parent:' frame '},icon:{parent:' preferenceGroup '},image:{parent:' about-box frame window widget '},interval:{parent:' action timer '},key:{parent:' hotkey '},kind:{parent:' preference '},level:{parent:' window '},lines:{parent:' textarea '},loadingSrc:{parent:' image '},max:{parent:' scrollbar '},maxLength:{parent:' preference '},menuItem:{parent:' contextMenuItems '},min:{parent:' scrollbar '},minimumVersion:{parent:' widget '},minLength:{parent:' preference '},missingSrc:{parent:' image '},modifier:{parent:' hotkey '},name:{parent:' hotkey image preference preferenceGroup text textarea timer window '},notSaved:{parent:' preference '},onContextMenu:{parent:' frame image text textarea window ',script:true},onDragDrop:{parent:' frame image text textarea ',script:true},onDragEnter:{parent:' frame image text textarea ',script:true},onDragExit:{parent:' frame image text textarea ',script:true},onFirstDisplay:{parent:' window ',script:true},onGainFocus:{parent:' textarea window ',script:true},onKeyDown:{parent:' hotkey text textarea ',script:true},onKeyPress:{parent:' textarea ',script:true},onKeyUp:{parent:' hotkey text textarea ',script:true},onImageLoaded:{parent:' image ',script:true},onLoseFocus:{parent:' textarea window ',script:true},onMouseDown:{parent:' frame image text textarea ',script:true},onMouseEnter:{parent:' frame image text textarea ',script:true},onMouseExit:{parent:' frame image text textarea ',script:true},onMouseMove:{parent:' frame image text ',script:true},onMouseUp:{parent:' frame image text textarea ',script:true},onMouseWheel:{parent:' frame ',script:true},onMultiClick:{parent:' frame image text textarea window ',script:true},onSelect:{parent:' menuItem ',script:true},onTimerFired:{parent:' timer ',script:true},onValueChanged:{parent:' scrollbar ',script:true},opacity:{parent:' frame image scrollbar shadow text textarea window '},option:{parent:' preference widget '},optionValue:{parent:' preference '},order:{parent:' preferenceGroup '},orientation:{parent:' scrollbar '},pageSize:{parent:' scrollbar '},preference:{parent:' widget '},preferenceGroup:{parent:' widget '},remoteAsync:{parent:' image '},requiredPlatform:{parent:' widget '},rotation:{parent:' image '},scrollX:{parent:' frame '},scrollY:{parent:' frame '},secure:{parent:' preference textarea '},scrollbar:{parent:' text textarea '},shadow:{parent:' about-text text window '},size:{parent:' about-text about-version text textarea '},spellcheck:{parent:' textarea '},src:{parent:' image '},srcHeight:{parent:' image '},srcWidth:{parent:' image '},style:{parent:' about-text about-version preference text textarea '},text:{parent:' frame window '},textarea:{parent:' frame window '},timer:{parent:' widget '},thumbColor:{parent:' scrollbar '},ticking:{parent:' timer '},ticks:{parent:' preference '},tickLabel:{parent:' preference '},tileOrigin:{parent:' image '},title:{parent:' menuItem preference preferenceGroup window '},tooltip:{parent:' image text textarea '},truncation:{parent:' text '},tracking:{parent:' image '},trigger:{parent:' action '},truncation:{parent:' text textarea '},type:{parent:' preference '},useFileIcon:{parent:' image '},vAlign:{parent:' frame image scrollbar text textarea '},value:{parent:' preference scrollbar '},version:{parent:' widget '},visible:{parent:' frame image scrollbar text textarea window '},vLineSize:{parent:' frame '},vOffset:{parent:' about-text about-version frame image scrollbar shadow text textarea window '},vRegistrationPoint:{parent:' image '},vScrollBar:{parent:' frame '},width:{parent:' frame image scrollbar text textarea window '},window:{parent:' widget '},zOrder:{parent:' frame image scrollbar text textarea '}}}};function xmlword(tag){var w=token.value;if(!token.identifier){if(token.id==='<'){throw error(tag?"Expected &lt; and saw '<'":"Missing '>'",prevtoken);}else{throw error("Missing quotes",prevtoken);}}
advance();while(token.id==='-'||token.id===':'){w+=token.id;advance();if(!token.identifier){throw error('Bad name: '+w+token.value);}
w+=token.value;advance();}
return w;}
function xml(){var a,e,n,q,t;xmode='xml';stack=[];while(error.free){switch(token.value){case'<':advance('<');t=token;n=xmlword(true);t.name=n;if(!xtype){if(xmltype[n]){xmltype[n].doBegin();n=xtype;e=false;}else{throw error("Unrecognized <"+n+">");}}else{if(jslint.cap&&xtype==='html'){n=n.toLowerCase();}
e=xmltype[xtype].doTagName(n,stack[stack.length-1].type);}
t.type=n;while(error.free){if(token.id==='/'){advance('/');e=true;break;}
if(token.id&&token.id.substr(0,1)==='>'){break;}
a=xmlword();switch(xmltype[xtype].doAttribute(n,a)){case'script':xmode='string';advance('=');q=token.id;if(q!=='"'&&q!=="'"){throw error('Missing quote.');}
xmode=q;advance(q);statements();if(token.id!==q){throw error('Missing close quote on script attribute');}
xmode='xml';advance(q);break;case'value':advance('=');if(!token.identifier&&token.type!='(string)'&&token.type!='(number)'){throw error('Bad value: '+token.value);}
advance();break;case'string':advance('=');if(token.type!=='(string)'){throw error('Bad value: '+token.value);}
advance();break;case'define':advance('=');if(token.type!=='(string)'){throw error('Bad value: '+token.value);}
addlabel(token.value,'global');advance();break;default:if(token.id==='='){advance('=');if(!token.identifier&&token.type!='(string)'&&token.type!='(number)'){}
advance();}}}
switch(xmltype[xtype].doIt(n)){case'script':xmode='script';advance('>');statements();xmode='xml';break;case'special':e=true;n='</'+t.name+'>';if(!lex.skip(n)){throw error("Missing "+n,t);}
break;default:lex.skip('>');}
if(!e){stack.push(t);}
break;case'</':advance('</');n=xmlword(true);t=stack.pop();if(!t){throw error('Unexpected close tag: </'+n+'>');}
if(t.name!=n){throw error('Expected </'+t.name+'> and instead saw </'+n+'>');}
if(token.id!=='>'){throw error("Expected '>'");}
lex.skip('>');break;case'<!':while(error.free){advance();if(token.id==='>'){break;}
if(token.id==='<'||token.id==='(end)'){throw error("Missing '>'.",prevtoken);}}
lex.skip('>');break;case'<!--':lex.skip('-->');break;case'<%':lex.skip('%>');break;case'<?':while(error.free){advance();if(token.id==='?>'){break;}
if(token.id==='<?'||token.id==='<'||token.id==='>'||token.id==='(end)'){throw error("Missing '?>'.",prevtoken);}}
lex.skip('?>');break;case'<=':case'<<':case'<<=':throw error("Expected '&lt;'.");case'(end)':return;}
if(!lex.skip('')){if(stack.length){t=stack.pop();throw error('Missing </'+t.name+'>',t);}
return;}
advance();}}})();
//}}}

//{{{
// for debugging: you can turn it off in final release ----------------------
wikibar_addonInstall();
//}}}
/***
|''Name:''|Templater|
|''Version:''||
|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|
|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|
|''Type:''|WikiBarPlugin addon|
|''Required:''|WikiBarPlugin 1.0.0+|
!Description
Load a tiddler template.
!Installation
#install WikiBar at first
#create your addon as a tiddler with tag 'wikibarAddons'
!Code
***/
//{{{

//----------------------------------------------------------------------------
// addon install function: this is a must
//----------------------------------------------------------------------------
function wikibar_addonInstall(unused){

  // define tools
  var loadTemplate={
        TYPE:'MENU',
  		  CAPTION:'template',
  		  options:{
  		    TYPE:'MENU',
  		    DYNAITEM: loadTemplate_genOptions
  		  },
  		  SEPERATOR: {/*---------------------------*/},
  		  DYNAITEM: loadTemplate_genTemplates
  		};

  // register tools
  wikibarStore.addon.loadTemplate = loadTemplate;

  // init
  loadTemplate_init();
}

function loadTemplate_init(){

  // set default value
  var cookies = [
    {name: 'chkLoadTemplateReplaceTitle', value: false},
    {name: 'chkLoadTemplateAppendTag', value: true},
    {name: 'chkLoadTemplateReplaceText', value: false}
  ];

  for(var i=0; i<cookies.length; i++){
    if(config.options[cookies[i].name]==null){
      config.options[cookies[i].name]=cookies[i].value;
      saveOptionCookie(cookies[i].name);
    }
  }

}

function loadTemplate_selectTemplate(param){

  var title = param.button.tiddlerTitle;
  var tiddlerWrapper = document.getElementById('tiddler'+title);
  var theTitle = wikibar_resolveEditItem(tiddlerWrapper, 'title');
  var theTag = wikibar_resolveEditItem(tiddlerWrapper, 'tags');
  var editor = param.button.editor;

  // get tiddler data
  var tiddler = store.getTiddler(this.title);

  if(config.options['chkLoadTemplateReplaceTitle']){
    theTitle.value = tiddler.title;
  }

  if(config.options['chkLoadTemplateAppendTag']){
    theTag.value = tiddler.getTags();
  }

  if(config.options['chkLoadTemplateReplaceText']){
    editor.value = tiddler.text;
    wikibar_editSelectAll(param);
  }else{  // inset current cursor
    param.params = tiddler.text;
    wikibar_editFormatByCursor(param);
  }

}

function loadTemplate_genOptions(){
  var toolset={};

  toolset.replaceTitle = {
    CAPTION:'replace title',
    TOOLTIP:'current title will be replaced',
    SELECTED: config.options['chkLoadTemplateReplaceTitle'],
    HANDLER:function(param){
      config.options['chkLoadTemplateReplaceTitle'] = !config.options['chkLoadTemplateReplaceTitle'];
      saveOptionCookie('chkLoadTemplateReplaceTitle');
    }
  };

  toolset.appendTag = {
    CAPTION:'append tags',
    TOOLTIP:'template tags will be appended',
    SELECTED: config.options['chkLoadTemplateAppendTag'],
    HANDLER:function(param){
      config.options['chkLoadTemplateAppendTag'] = !config.options['chkLoadTemplateAppendTag'];
      saveOptionCookie('chkLoadTemplateAppendTag');
    }
  };

  toolset.replaceText = {
    CAPTION:'replace text',
    TOOLTIP:'current text will be replaced',
    SELECTED: config.options['chkLoadTemplateReplaceText'],
    HANDLER:function(param){
      config.options['chkLoadTemplateReplaceText'] = !config.options['chkLoadTemplateReplaceText'];
      saveOptionCookie('chkLoadTemplateReplaceText');
    }
  };

  return toolset;
}

function loadTemplate_genTemplates(){

  try{

  	var tiddlers = store.getTaggedTiddlers('TiddlerTemplates');
  	if(!tiddlers) {
  	  displayMessage('Template not found! You can create a new tiddler and add \"TiddlerTemplates\" tag');
  	  return;
  	}

    var toolset={};
//    toolset.TYPE='MENU';

  	for(i=0; i<tiddlers.length; i++){
  		var title = tiddlers[i].title.trim();
      toolset[title] = {
        title: title,
        HANDLER: loadTemplate_selectTemplate
      };
  	}

    return toolset;

  }catch(ex){alert(ex);}

}

//}}}

//{{{
// for debugging: you can turn it off in final release ----------------------
wikibar_addonInstall();
//}}}

----
*[[О проекте]]

*[[Настройка сервера]]
**[[файл access]]
**[[Настройка dnsbl]]
**[[Другие средства]]

*[[dnsbl.rymsho.ru]]
**[[Политика|dnsbl-pol]]
**[[Настройка|dnsbl-set]]

*[[rhsbl.rymsho.ru]]
**[[Политика|rhsbl-pol]]
**[[Настройка|rhsbl-set]]

*[[Контакты]]
----
TiddlyWiki
These interface options for customising TiddlyWiki are saved in your browser

<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

Also see AdvancedOptions
<!--{{{-->
	
  <div class='header'>
      <div class='headerShadow'>
        <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
        <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
      </div>
      <div class='headerForeground'>
        <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
        <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
      </div>
  </div>
  <div id='topMenu' refresh='content' tiddler='TopMenu'></div>
  <div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
  <div id='displayArea'>
    <div id='messageArea'></div>
    <div id='tiddlerDisplay'></div>
  </div>
  <div id='footer' refresh='content' force='true' tiddler='Footer'></div>

<!--}}}-->
/***
|''Name:''|RuStyle|
|''Description:''|TW russianization|
|''Version:''|0.6.0|
|''Date:''|2006|
|''Source:''|http://www.glebsite.ru|
|''Author:''|Глеб Тржемецкий (Gleb Trzhemetski)|
|''License:''|BSD open source license|
|''CoreVersion:''|2.1.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|

***/

//{{{

merge(config.messages,{
	customConfigError: "Возникли проблемы при загрузке плагинов. См. PluginManager ",
	pluginError: "Ошибка: %0",
	pluginDisabled: "Не задействован, так как помечен 'systemConfigDisable' ",
	pluginForced: "Задействован, так как помечен 'systemConfigForce' ",
	pluginVersionError: "Не задействован из-за несоответствия версий",
	nothingSelected: "Ничего не выделено.",
	savedSnapshotError: "Похоже, эта wiki была неправильно сохранена. См. http://www.tiddlywiki.com/#DownloadSoftware ",
	subtitleUnknown: "(неизвестно)",
	undefinedTiddlerToolTip: "Записи '%0' не существует",
	shadowedTiddlerToolTip: "Запись '%0' заполнена по умолчанию.",
	tiddlerLinkTooltip: "%0 - %1, %2",
	externalLinkTooltip: "Ссылка: %0",
	noTags: "Нет помеченных записей",
	notFileUrlError: "Сохраните TiddlyWiki в файл, чтобы иметь возможность сохранять изменения ",
	cantSaveError: "Сохранение невозможно. Либо ваш браузер не подерживает эту функцию (используйте по возможности FireFox), либо путь к файлу содержит недопустимые символы",
	invalidFileError: "Файл '%0' не похож на файл TiddlyWiki",
	backupSaved: "Резервная копия сохранена",
	backupFailed: "Не получилось сохранить резервную копию",
	rssSaved: "RSS сохранен",
	rssFailed: "Не получилось сохранить RSS",
	emptySaved: "Пустой шаблон сохранен",
	emptyFailed: "Не получилось сохранить пустой шаблон",
	mainSaved: "Файл TiddlyWiki сохранен",
	mainFailed: "Не получилось сохранить файл TiddlyWiki. Изменения не сохранены",
	macroError: "Ошибка в сценарии <<%0>>",
	macroErrorDetails: "Ошибка при выполнении сценария  <<%0>>:\n%1",
	missingMacro: "Нет такого сценария",
	overwriteWarning: "Запись '%0' уже есть. Нажмите OK, чтобы перезаписать",
	unsavedChangesWarning: "ВНИМАНИЕ! Есть несохраненные изменения! \n\nНажмите OK, чтобы сохранить\nНажмите CANCEL чтобы не сохранять",
	confirmExit: "--------------------------------\n\nИзменения в TiddlyWiki не сохранены. Если вы продолжите, они потеряются.\n\n--------------------------------",
	saveInstructions: "SaveChanges",
	unsupportedTWFormat: "Неподдерживаемый TiddlyWiki формат '%0'",
	tiddlerSaveError: "Ошибка при сохранении записи '%0'",
	tiddlerLoadError: "Ошибка при открытии записи '%0'",
	wrongSaveFormat: "Не получается сохранить в формате '%0'. Сохранено в стандартном формате.",
	invalidFieldName: "Недопустимое имя поля %0",
	fieldCannotBeChanged: "Поле '%0' нельзя изменять"});

merge(config.messages.messageClose,{
	text: "×",
	tooltip: "скрыть сообщение"});

config.messages.dates.months = ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября","декабря"];
config.messages.dates.days = ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"];
config.messages.dates.shortMonths = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"];
config.messages.dates.shortDays = ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"];

merge(config.views.wikified.tag,{
	labelNoTags: "меток нет",
	labelTags: "метки: ",
	openTag: "Открыть метку '%0'",
	tooltip: "Показать записи, помеченные как '%0'",
	openAllText: "Открыть все",
	openAllTooltip: "Открыть все эти записи",
	popupNone: "Нет других записей с меткой '%0'"});

merge(config.views.wikified,{
	defaultText: "Записи '%0' не существует. Создайте ее двойным щелчком.",
	defaultModifier: "(?)",
	shadowModifier: "(системная запись)",
	createdPrompt: "создана: "});

merge(config.views.editor,{
	tagPrompt: "Введите метки, разделенные пробелами, [[используйте квадратные скобки]] если нужно, или выберите метки из списка.",
	defaultText: "Здесь мог бы быть осмысленный текст на тему '%0'"});

merge(config.views.editor.tagChooser,{
	text: "метки",
	tooltip: "Выберите метки из списка",
	popupNone: "Меток пока нет",
	tagTooltip: "Добавить метку '%0'"});

merge(config.macros.search,{
	label: "поиск",
	prompt: "Поиск по всем записям",
	accessKey: "F",
	successMsg: "%0 записей, соответствующих критерию: %1",
	failureMsg: "Не найдено записей по запросу: %0"});

merge(config.macros.tagging,{
	label: "отмечены: ",
	labelNotTag: "нету",
	tooltip: "Список записей, помеченных: '%0'"});

merge(config.macros.timeline,{
	dateFormat: "DD.mmm.YYYY"});

merge(config.macros.allTags,{
	tooltip: "Показать записи, помеченные '%0'",
	noTags: "Нет таких записей"});

config.macros.list.all.prompt = "Все записи по алфавиту";
config.macros.list.missing.prompt = "Ненаписанные";
config.macros.list.orphans.prompt = "Записи, на которые нет ссылок";
config.macros.list.shadowed.prompt = "Системные записи";

merge(config.macros.closeAll,{
	label: "закрыть все",
	prompt: "Закрыть все записи \(кроме редактируемых\)"});

merge(config.macros.permaview,{
	label: "ссылка",
	prompt: "Постоянная ссылка"});

merge(config.macros.saveChanges,{
	label: "сохранить изменения",
	prompt: "Сохранить всё",
	accessKey: "S"});

merge(config.macros.newTiddler,{
	label: "новая запись",
	prompt: "Создать новую запись",
	title: "Новая запись",
	accessKey: "N"});

merge(config.macros.newJournal,{
	label: "новая датированная запись",
	prompt: "Создать запись, с названием, соответствующим текущей дате",
	accessKey: "J"});

merge(config.macros.plugins,{
	skippedText: "(Этот плагин не запущен, так как был добавлен после запуска)",
	noPluginText: "Плагинов нет",
	confirmDeleteText: "Вы действительно хотите удалить записи:\n\n%0",
	listViewTemplate : {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Title', field: 'title', tiddlerLink: 'title', title: "Title", type: 'TiddlerLink'},
			{name: 'Forced', field: 'forced', title: "Forced", tag: 'systemConfigForce', type: 'TagCheckbox'},
			{name: 'Disabled', field: 'disabled', title: "Disabled", tag: 'systemConfigDisable', type: 'TagCheckbox'},
			{name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},
			{name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},
			{name: 'Log', field: 'log', title: "Log", type: 'StringList'}
			],
		rowClasses: [
			{className: 'error', field: 'error'},
			{className: 'warning', field: 'warning'}
			],
		actions: [
			{caption: "Действия...", name: ''},
			{caption: "Сделать не системной записью", name: 'remove'},
			{caption: "Удалить из wiki", name: 'delete'}
			]}
	});

merge(config.macros.refreshDisplay,{
	label: "обновить",
	prompt: "Обновить отображение"
	});

merge(config.macros.importTiddlers,{
	defaultPath: "http://www.tiddlywiki.com/index.html",
	fetchLabel: "загрузить",
	fetchPrompt: "Загрузить файл TiddlyWiki",
	fetchError: "Ошибка при загрузке файла",
	confirmOverwriteText: "Вы уверены, что хотите перезаписать следующие записи:\n\n%0",
	wizardTitle: "Импорт записей из файла TiddlyWiki",
	step1: "Шаг 1: Введите путь к файлу",
	step1prompt: "Введите URL или путь к локальному файлу: ",
	step1promptFile: "...или выберите тут: ",
	step1promptFeeds: "...или из предустановленных: ",
	step1feedPrompt: "Выберите...",
	step2: "Шаг 2: Загрузка файла",
	step2Text: "Дождитесь окончания загрузки: %0",
	step3: "Шаг 3: Выберите записи для импорта:",
	step4: "%0 записей импортировано",
	step5: "Готово!",
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Title', field: 'title', title: "Title", type: 'String'},
			{name: 'Snippet', field: 'text', title: "Snippet", type: 'String'},
			{name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}
			],
		rowClasses: [
			],
		actions: [
			{caption: "Действия...", name: ''},
			{caption: "Импортировать", name: 'import'}
			]}
	});

merge(config.commands.closeTiddler,{
	text: "закрыть",
	tooltip: "Закрыть запись"});

merge(config.commands.closeOthers,{
	text: "закрыть остальные",
	tooltip: "Закрыть все записи, кроме этой"});

merge(config.commands.editTiddler,{
	text: "редактировать",
	tooltip: "Редактировать запись",
	readOnlyText: "исходный код",
	readOnlyTooltip: "Просмотреть исходный код записи"});

merge(config.commands.saveTiddler,{
	text: "готово",
	tooltip: "Сохранить изменения"});

merge(config.commands.cancelTiddler,{
	text: "отменить",
	tooltip: "Отменить изменения",
	warning: "Вы уверены, что не хотите сохранить запись '%0'?",
	readOnlyText: "обычный вид",
	readOnlyTooltip: "Вернуться к обычному просмотру"});

merge(config.commands.deleteTiddler,{
	text: "удалить",
	tooltip: "Удалить запись",
	warning: "Вы действительно хотите удалить '%0'?"});

merge(config.commands.permalink,{
	text: "ссылка",
	tooltip: "Постоянная ссылка на эту запись"});

merge(config.commands.references,{
	text: "ссылки сюда",
	tooltip: "Показать записи, ссылающиеся на эту",
	popupNone: "Ссылок нет"});

merge(config.commands.jump,{
	text: "перейти...",
	tooltip: "Перейти на другие открытые записи"});

merge(config.shadowTiddlers,{
	DefaultTiddlers: "GettingStarted",
	MainMenu: "GettingStarted",
	SiteTitle: "~TiddlyWiki(ru)",
	SiteSubtitle: "нелинейный гипертекстовый органайзер",
	SiteUrl: "http://www.tiddlywiki.com/",
	GettingStarted: "Для того, чтобы начать работать с TiddlyWiki, вы можете поменять следующие записи:\n* SiteTitle & SiteSubtitle: Заголовок и подзаголовок сайта (после сохранения вы увидите их в заголовке окна)\n* MainMenu: Меню (оно обычно слева)\n* DefaultTiddlers: Список записей, которые будут открыты при запуске wiki.\nИмя, которым будут подписаны ваши записи, можете ввести тут: <<option txtUserName>>",
	SideBarOptions: "<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY г.'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'установки »' 'Различные опции TidlyWiki'>>",
	OptionsPanel: "Эти установки сохраняются в&nbsp\;Вашем браузере\n\nВаше имя для подписывания заметок. Лучше, если вы напишете его WotTak\n\n<<option txtUserName>>\n<<option chkSaveBackups>> Сохранять резервные копии\n<<option chkAutoSave>> Автосохранение\n<<option chkRegExpSearch>> Поиск с&nbsp\;регулярными выражениями\n<<option chkCaseSensitiveSearch>> Поиск чувствителен к&nbsp\;регистру?\n<<option chkAnimate>> Анимация\n\n----\n[[Дополнительно|AdvancedOptions]]\n[[Плагины|PluginManager]]\n[[Импорт записей|ImportTiddlers]]",
	AdvancedOptions: "<<option chkGenerateAnRssFeed>> Публиковать RSS\n<<option chkOpenInNewWindow>>  Ссылки в новом окне\n<<option chkSaveEmptyTemplate>> Сохранять пустой шаблон\n<<option chkToggleLinks>> Щелчок по ссылке на открытую заметку закрывает ее\n^^(с Ctrl или другой функциональной клавишей не&nbsp\;будет срабатывать)^^\n<<option chkHttpReadOnly>> Не показывать инструменты редактирования через HTTP\n<<option chkForceMinorUpdate>> Не менять дату заметки при редактировании\n^^(для изменеия - жмите Shift при сохранеии, либо сохраняйте, нажимая Ctrl-Shift-Enter^^\n<<option chkConfirmDelete>> Подтверждать удаление\nМаксимум строк в&nbsp\;поле редактирования: <<option txtMaxEditRows>>\nСохранять бэкапы в&nbsp\;папке: <<option txtBackupFolder>>\n<<option chkInsertTabs>> При нажатии Tab вводить знак табуляции, а&nbsp\;не&nbsp\;переходить к&nbsp\;следующему элементу формы",
	SideBarTabs: "<<tabs txtMainTab История История TabTimeline Все 'Все заметки' TabAll Метки 'Все метки' TabTags Ещё... 'Остальные списки' TabMore>>",
	TabTimeline: "<<timeline>>",
	TabAll: "<<list all>>",
	TabTags: "<<allTags>>",
	TabMore: "<<tabs txtMoreTab Нужные 'Ненаписанные заметки' TabMoreMissing Забытые 'Забытые заметки' TabMoreOrphans Системные 'Системные записи' TabMoreShadowed>>",
	TabMoreMissing: "<<list missing>>",
	TabMoreOrphans: "<<list orphans>>",
	TabMoreShadowed: "<<list shadowed>>",
	PluginManager: "<<plugins>>",
	ImportTiddlers: "<<importTiddlers>>"});



//}}}
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
Настраиваем почтовый сервер
Антиспам
/*{{{*/

body { text-align:center; background:#ffd url(bg_top.png) repeat-x top left; }

#contentWrapper { width:1000px; text-align:left; margin-left:auto; margin-right:auto; position:relative; overflow:hidden; clear:both; }

div.header { display:block; height:80px; overflow:hidden; clear:both; position:relative; }
div.header div.headerForeground { padding-top:2em; }
div.header div.headerForeground span.siteTitle h1 { position:absolute; margin:0; padding:0; top:10px; left:8px;}
div.header div.headerShadow { display:none; }

#topMenu ul { margin:0; padding:0; list-style:none; width:100%; overflow:hidden; clear:both; }
#topMenu ul li { float:left; margin:0; padding:0; }
#topMenu ul li a { height:18px; vertical-align: middle; text-decoration:none; display:block; float:left; font-size:12px;  font-weight:bold; color:[[ColorPalette::Background]]; margin:0 20px 0 0; padding:5px 8px 5px 8px }
#topMenu ul li a:hover { background-color:[[ColorPalette::MainAccentLight]]; }
#topMenu a.button { float:right; margin:0.8em 0 0 1.5em; color:[[ColorPalette::MainAccentLight]]; border-width:0;}
#topMenu a.button:hover { color:[[ColorPalette::MainAccent]]; background-color:[[ColorPalette::Background]];}

#mainMenu { margin:30px 0 4em 0; padding:0; width:160px;  text-align:left; line-height:1em; overflow:hidden; clear:both; float:left; position: inherit;}
#mainMenu ul { list-style:none; margin:0; padding:0; }
#mainMenu ul li {margin:0; padding:0;}
#mainMenu ul li a.tiddlyLink {margin:0; padding:6px 8px; display:block; text-decoration:none; font-size:1.1em; font-weight:bold; color:[[ColorPalette::Foreground]]; text-align:left; clear:left; }
#mainMenu ul li a.tiddlyLink:hover { color:[[ColorPalette::Background]]; background-color:[[ColorPalette::Foreground]]; }
#mainMenu a.button {margin-left:8px;  color:[[ColorPalette::MainAccentLight]]; border-width:0px; }
#mainMenu a.button:hover { color:[[ColorPalette::MainAccent]]; background-color:[[ColorPalette::Background]];}
#mainMenu input.txtOptionInput {border:solid 1px #ddd; border-top:solid 1px #aaa; border-bottom:solid 1px #eee; margin:4px 0 0 8px; padding:2px 4px; color:[[ColorPalette::LessSubtle]]; background:transparent url(./images/bg_search.png) repeat-x top left;}

#sidebar { top:120px; right:0; overflow:hidden; clear:both;}

#displayArea { float:right; margin:30px 0 4em 10px;}
#tiddlerDisplay { float:left; margin:0; width:820px;}

#footer { margin-top:40px; border-top:solid 1px [[ColorPalette::Subtle]]; padding:20px 0; color:[[ColorPalette::Subtle]];  overflow:hidden; clear:both}
#footer a.button { color:[[ColorPalette::MainAccent]]; border-width:0;}
#footer a.button:hover { color:[[ColorPalette::MainAccentLight]]; background-color:[[ColorPalette::Background]];}

div.tiddler { margin:0em 0 4em 0; padding-top:0em; }
div.tiddler div.title { font-size:2em; margin-left:0; color:[[ColorPalette::MainAccent]];  display:inline;}
div.tiddler div.viewer { font-size:1.3em; margin-left:0px; width:750px;}
div.tiddler div.subtitle { display:none; }
div.tiddler div.toolbar { text-align:left; margin-left:0.5em; display:inline;}
div.tiddler div.toolbar > a.button { color:[[ColorPalette::Subtle]]; border-width:0;}
div.tiddler div.toolbar > a.button:hover { color:[[ColorPalette::LessSubtle]]; background:[[ColorPalette::Background]];}
div.tiddler div.tagged { background-color:[[ColorPalette::Background]]; border-width:0; margin:0 0 2em 0;}
div.tiddler div.tagged ul li.listTitle { display:none; }
div.tiddler div.tagged ul li a { font-size:1em; display:block; border:solid 1px [[ColorPalette::Background]]; margin-bottom:2px; padding:3px 3px 3px 20px; text-decoration:none; background:transparent url(tags_matrix.png) no-repeat top left; color:[[ColorPalette::SecondAccent]]; }
div.tiddler div.tagged ul li a:hover { border-color:[[ColorPalette::SecondAccentLight]]; background:[[ColorPalette::SecondAccentLight]] url(tags_matrix.png) no-repeat 0 -59px; background-position: 0 -59px; color:[[ColorPalette::SecondAccent]];}
div.tiddler div.tagging { float:none; border:solid 1px [[ColorPalette::SubtleLight]]; padding:3px; background-color:[[ColorPalette::SubtleSuperLight]]; overflow:hidden; clear:both; zoom:1;}
div.tiddler div.tagging ul li { float:left; margin:0 1.5em 0 0; color:[[ColorPalette::LessSubtle]]; }
div.tiddler div.tagging ul li a { color:[[ColorPalette::MainAccentLight]]; }
div.tiddler div.tagging ul li a:hover { color:[[ColorPalette::MainAccent]]; background-color:[[ColorPalette::SubtleSuperLight]];}
div.tiddler div.viewer img { float:left; clear:left; margin:0 1em 1em 0;}
div.tiddler table {margin:0; border-width:0px; }
div.tiddler table tr { border-width:0px; }
div.tiddler table tr td { border-width:0px; vertical-align:top; }
div.tiddler table tr td * { float:left; clear:left; }

.viewer pre { font-size:0.85em; }

#popup { border:solid 1px [[ColorPalette::Subtle]]; border-bottom:solid 1px [[ColorPalette::LessSubtle]]; border-right:solid 1px [[ColorPalette::LessSubtle]]; background-color:[[ColorPalette::Background]]; padding:1px 0 0 0;}
#popup li a { background-color:[[ColorPalette::SubtleSuperLight]]; color:[[ColorPalette::MuchLessSubtle]]; text-align:left;}
#popup li a:hover { background-color:[[ColorPalette::SubtleLight]]; color:[[ColorPalette::MuchLessSubtle]];}
#popup li.listBreak div {border-bottom:solid 1px [[ColorPalette::Background]]; border-top:solid 1px [[ColorPalette::SubtleLight]]; margin:0;}

form.wizard {font-size:0.8em;}

h1, h2, h3, h4, h5 { color:[[ColorPalette::MainAccentLight]] }

/*}}}*/
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::HeaderBG]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity=60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}
body {font-size:.75em; font-family:arial,helvetica; margin:0;
padding:0;}
h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}
hr {height:1px;}
a {text-decoration:none;}
dt {font-weight:bold;}
ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}
.txtOptionInput {width:11em;}
#contentWrapper .chkOptionInput {border:0;}
.externalLink {text-decoration:underline;}
.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}
.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}
/* the 'a' is required for IE, otherwise it renders the whole tiddler
in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}
#mainMenu .tiddlyLinkExisting, #mainMenu .tiddlyLinkNonExisting,
#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal;
font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}
.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px;
top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em;
left:0px; top:0px;}
.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}
#mainMenu {position:absolute; left:0; width:10em; text-align:right;
line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}
#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em;
display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em;
font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline;
padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}
.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none;
padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none;
padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}
#messageArea {position:fixed; top:2em; right:0em; margin:0.5em;
padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em
0.2em 0.2em;}
#messageArea a {text-decoration:underline;}
.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em
1em; margin:0;}
.popup {position:absolute; z-index:300; font-size:.9em; padding:0;
list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0;
margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal;
cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}
.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}
#contentWrapper {display:block;}
#splashScreen {display:none;}
#displayArea {margin:1em 17em 0em 14em;}
.toolbar {text-align:right; font-size:.9em;}
.tiddler {padding:1em 1em 0em 1em;}
.missing .viewer,.missing .title {font-style:italic;}
.title {font-size:1.6em; font-weight:bold;}
.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}
.tiddler .button {padding:0.2em 0.4em;}
.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}
.footer {font-size:.9em;}
.footer li {display:inline;}
.annotation {padding:0.5em; margin:0.5em;}
* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em;
padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}
.viewer table, table.twtable {border-collapse:collapse; margin:0.8em
1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th,
.twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px
3px 0px 3px;}
.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em;
line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}
.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%;
font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}
.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}
.sparkline {line-height:1em;}
.sparktick {outline:0;}
.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}
* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden;
z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em
0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175;
top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em
0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute;
margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute;
width:100%; height:100px;}
.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
|''Name:''|TWMacro|
|''Version:''||
|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|
|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|
|''Type:''|WikiBar addon|
|''Required:''|WikiBar 2.0.0+|
!Description
support TiddlyWiki macro syntaxes
!Installation
#install WikiBar at first
#create your addon as a tiddler with tag 'wikibarAddons'
!Code
***/
//{{{

//----------------------------------------------------------------------------
// addon install function: this is a must
//----------------------------------------------------------------------------
function wikibar_addonInstall(unused){

  // register tools
  wikibarStore.macro = {
    TYPE: 'MENU',
    TOOLTIP: 'system macros',
    systemInfo:{
      TYPE: 'MENU',
      CAPTION:'system information',
      allTags:{
  			TOOLTIP:'display all TiddlyWiki tags',
  			syntax: '<<allTags>>',
  			HANDLER: wikibar_editFormatByWord
  		},
  		tag:{
  			TOOLTIP:'display specified tag',
  			syntax: '<<tag %1>>',
  			HANDLER: wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param: 	'tagName(ex: systemConfig)'
  		},
  		message:{
  		  TOOLTIP:'get system message',
  		  syntax:'<<message %1>>',
  			HANDLER: wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param: 	'customConfigError'
  		},
  		option:{
  			TOOLTIP:'display specified option',
  			syntax: '<<option %1>>[%2]\n',
  			HANDLER: wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param: 	'chkOpenInNewWindow \"Open link in new window\"'
  		},
  		saveChanges:{
  			TOOLTIP:'save changes',
  			syntax: '<<saveChanges>>',
  			HANDLER: wikibar_editFormatByWord
  		},
  		search:{
  			TOOLTIP:'display search button and input box',
  			syntax: '<<search>>',
  			HANDLER: wikibar_editFormatByWord
  		},
  		timeline:{
  		  TYPE:'MENU',
  		  TOOLTIP:'list tiddlers in date order',
  		  modified:{
    			TOOLTIP:'list tiddlers in modified date order',
    			syntax: '<<timeline>>',
    			HANDLER: wikibar_editFormatByWord
    		},
    		created:{
    			TOOLTIP:'list tiddlers in created date order',
    			syntax: '<<timeline created>>',
    			HANDLER: wikibar_editFormatByWord
    		}
  		},
  		version:{
  			TOOLTIP:'display TiddlyWiki version',
  			syntax: '<<version>>',
  			HANDLER: wikibar_editFormatByWord
  		},
      list:{
        TYPE: 'MENU',
    		list:{
    			TOOLTIP:'list all tiddlers in alphabetical order',
    			syntax: '<<list>>',
    			HANDLER: wikibar_editFormatByWord
    		},
    		listMissing:{
    		  CAPTION:'list missing',
    			TOOLTIP:'list all undefined tiddlers',
    			syntax: '<<list missing>>',
    			HANDLER: wikibar_editFormatByWord
    		},
    		listOrphans:{
    			CAPTION:'list orphans',
    		  TOOLTIP:'tiddlers that are not linked to from any other tiddlers',
    			syntax: '<<list orphans>>',
    			HANDLER: wikibar_editFormatByWord
    		}
      }
    },  // systemInfo
    tiddlerOperate:{
      TYPE: 'MENU',
      CAPTION:'tiddler operation',
  		newJournal:{
  			TOOLTIP:'create a new tiddler from current date and time',
  			syntax: '<<newJournal %1>>',
  			HANDLER:   wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param: 	'\"journal title\"'
  		},
  		newTiddler:{
  			TOOLTIP:'create new tiddler',
  			syntax: '<<newTiddler>>',
  			HANDLER: wikibar_editFormatByWord
  		},
  		closeAll:{
  			TOOLTIP:'close all tiddlers',
  			syntax: '<<closeAll>>',
  			HANDLER: wikibar_editFormatByWord
  		}
    },  // tiddlerOperate
    tiddlerInfo:{
      TYPE: 'MENU',
      CAPTION:'tiddler information',
  		tiddler:{
  			TOOLTIP:'display specified tiddler text',
  			syntax: '<<tiddler %1>>',
  			HANDLER: wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param: 	'tiddlerTitle'
  		}
    },  // tiddlerInfo
    template:{
      TYPE:'MENU',
      CAPTION:'template only',
      toolbar:{
        TYPE:'MENU',
        TOOLTIP:'toolbar macro command',
    		closeTiddler:{
    			TOOLTIP:    'close current tiddler',
    			syntax: 'closeTiddler',
    			HANDLER: wikibar_editFormatByWord
    		},
    		closeOthers:{
    			TOOLTIP:    'close other opened tiddlers',
    			syntax: 'closeOthers',
    			HANDLER: wikibar_editFormatByWord
    		},
    		editTiddler:{
    			TOOLTIP:    'edit current tiddler',
    			syntax: 'editTiddler',
    			HANDLER: wikibar_editFormatByWord
    		},
    		saveTiddler:{
    			TOOLTIP:    'save current tiddler',
    			syntax: 'saveTiddler',
    			HANDLER: wikibar_editFormatByWord
    		},
    		cancelTiddler:{
    			TOOLTIP:    'cancel current tiddler',
    			syntax: 'cancelTiddler',
    			HANDLER: wikibar_editFormatByWord
    		},
    		deleteTiddler:{
    			TOOLTIP:    'delete current tiddler',
    			syntax: 'deleteTiddler',
    			HANDLER: wikibar_editFormatByWord
    		},
    		permalink:{
    			TOOLTIP:'display current tiddler link',
    			syntax: 'permalink',
    			HANDLER: wikibar_editFormatByWord
    		},
    		references:{
    			TOOLTIP:'current tiddler references',
    			syntax: 'references',
    			HANDLER: wikibar_editFormatByWord
    		},
    		jump:{
    			TOOLTIP:'jump to other opened tiddler',
    			syntax: 'jump',
    			HANDLER: wikibar_editFormatByWord
    		},
    		tagChooser:{
    			TOOLTIP:'add tag(s) to current tiddler',
    			syntax: 'tagChooser',
    			HANDLER: wikibar_editFormatByWord
    		}
      },
      edit:{
        TYPE:'MENU',
        editTitle:{
          CAPTION:'edit title',
    			TOOLTIP:'display title input box',
    			syntax: "macro='edit title'",
    			HANDLER: wikibar_editFormatByWord
        },
        editTags:{
          CAPTION:'edit tags',
    			TOOLTIP:'display tags input box',
    			syntax: "macro='edit tags'",
    			HANDLER: wikibar_editFormatByWord
        },
        editText:{
          CAPTION:'edit text',
    			TOOLTIP:'display tiddler text edit box',
    			syntax: "macro='edit text'",
    			HANDLER: wikibar_editFormatByWord
        }
      },
      view:{
        TYPE:'MENU',
        viewTitle:{
          CAPTION:'view title',
    			TOOLTIP:'display title',
    			syntax: "macro='view title'",
    			HANDLER: wikibar_editFormatByWord
        },
        viewTags:{
          CAPTION:'view tags',
    			TOOLTIP:'display tags',
    			syntax: "macro='view tags'",
    			HANDLER: wikibar_editFormatByWord
        },
        viewText:{
          CAPTION:'view text',
    			TOOLTIP:'display tiddler text',
    			syntax: "macro='view text'",
    			HANDLER: wikibar_editFormatByWord
        }
      }
    },
    misc:{
      TYPE: 'MENU',
  		gradient:{
  			TOOLTIP:    'gradient',
  			syntax: '<<gradient vert %1 #ffffff %1>>user_text\n>>',
  			HANDLER: wikibar_getColorCode,
  			doMore: wikibar_editFormatByWord
  		},
  		slider:{
  			TOOLTIP:    'slider',
  			syntax: '<<slider %1 %2 %3>>',
  			HANDLER:   wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param: 	'sliderID sliderTiddler sliderLabel'
  		},
  		sparkline:{
  			TOOLTIP:    'sparkline',
  			syntax: '<<sparkline %N>>',
  			HANDLER:   wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param:	'number_list(ex: 100 123 ...)'
  		},
  		tabs:{
  			TOOLTIP:    'tabs',
  			syntax: '<<tabs [%N]>>',
  			HANDLER:   wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param: 	'indentifier tabLabel tabName Tiddler'
  		},
  		today:{
  			TOOLTIP:    'today',
  			syntax: '<<today [%1]>>',
  			HANDLER:   wikibar_getMacroParam,
  			doMore: wikibar_editFormatByWord,
  			param:  '"YYYY/MM/DD hh:mm:ss"'
  		}
    } // misc
  };  // macro

}

//}}}
//{{{
// for debugging: you can turn it off in final release ----------------------
wikibar_addonInstall();
//}}}
/***
|''Name:''|Templater|
|''Version:''||
|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|
|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|
|''Type:''|WikiBarPlugin addon|
|''Required:''|WikiBarPlugin 1.0.0+|
!Description
Load a tiddler template.
!Installation
#install WikiBar at first
#create your addon as a tiddler with tag 'wikibarAddons'
!Code
***/
//{{{

//----------------------------------------------------------------------------
// addon install function: this is a must
//----------------------------------------------------------------------------
function wikibar_addonInstall(unused){

  // define tools
  var loadTemplate={
        TYPE:'MENU',
  		  CAPTION:'template',
  		  options:{
  		    TYPE:'MENU',
  		    DYNAITEM: loadTemplate_genOptions
  		  },
  		  SEPERATOR: {/*---------------------------*/},
  		  DYNAITEM: loadTemplate_genTemplates
  		};

  // register tools
  wikibarStore.addon.loadTemplate = loadTemplate;

  // init
  loadTemplate_init();
}

function loadTemplate_init(){

  // set default value
  var cookies = [
    {name: 'chkLoadTemplateReplaceTitle', value: false},
    {name: 'chkLoadTemplateAppendTag', value: true},
    {name: 'chkLoadTemplateReplaceText', value: false}
  ];

  for(var i=0; i<cookies.length; i++){
    if(config.options[cookies[i].name]==null){
      config.options[cookies[i].name]=cookies[i].value;
      saveOptionCookie(cookies[i].name);
    }
  }

}

function loadTemplate_selectTemplate(param){

  var title = param.button.tiddlerTitle;
  var tiddlerWrapper = document.getElementById('tiddler'+title);
  var theTitle = wikibar_resolveEditItem(tiddlerWrapper, 'title');
  var theTag = wikibar_resolveEditItem(tiddlerWrapper, 'tags');
  var editor = param.button.editor;

  // get tiddler data
  var tiddler = store.getTiddler(this.title);

  if(config.options['chkLoadTemplateReplaceTitle']){
    theTitle.value = tiddler.title;
  }

  if(config.options['chkLoadTemplateAppendTag']){
    theTag.value = tiddler.getTags();
  }

  if(config.options['chkLoadTemplateReplaceText']){
    editor.value = tiddler.text;
    wikibar_editSelectAll(param);
  }else{  // inset current cursor
    param.params = tiddler.text;
    wikibar_editFormatByCursor(param);
  }

}

function loadTemplate_genOptions(){
  var toolset={};

  toolset.replaceTitle = {
    CAPTION:'replace title',
    TOOLTIP:'current title will be replaced',
    SELECTED: config.options['chkLoadTemplateReplaceTitle'],
    HANDLER:function(param){
      config.options['chkLoadTemplateReplaceTitle'] = !config.options['chkLoadTemplateReplaceTitle'];
      saveOptionCookie('chkLoadTemplateReplaceTitle');
    }
  };

  toolset.appendTag = {
    CAPTION:'append tags',
    TOOLTIP:'template tags will be appended',
    SELECTED: config.options['chkLoadTemplateAppendTag'],
    HANDLER:function(param){
      config.options['chkLoadTemplateAppendTag'] = !config.options['chkLoadTemplateAppendTag'];
      saveOptionCookie('chkLoadTemplateAppendTag');
    }
  };

  toolset.replaceText = {
    CAPTION:'replace text',
    TOOLTIP:'current text will be replaced',
    SELECTED: config.options['chkLoadTemplateReplaceText'],
    HANDLER:function(param){
      config.options['chkLoadTemplateReplaceText'] = !config.options['chkLoadTemplateReplaceText'];
      saveOptionCookie('chkLoadTemplateReplaceText');
    }
  };

  return toolset;
}

function loadTemplate_genTemplates(){

  try{

  	var tiddlers = store.getTaggedTiddlers('TiddlerTemplates');
  	if(!tiddlers) {
  	  displayMessage('Template not found! You can create a new tiddler and add \"TiddlerTemplates\" tag');
  	  return;
  	}

    var toolset={};
//    toolset.TYPE='MENU';

  	for(i=0; i<tiddlers.length; i++){
  		var title = tiddlers[i].title.trim();
      toolset[title] = {
        title: title,
        HANDLER: loadTemplate_selectTemplate
      };
  	}

    return toolset;

  }catch(ex){alert(ex);}

}

//}}}

//{{{
// for debugging: you can turn it off in final release ----------------------
wikibar_addonInstall();
//}}}

Всё, здесь написанное, сделано на Вики-движке [[TiddlyWiki | http://tiddlywiki.com]], с использованием руссификатора, взятого [[вот здесь | http://glebsite.ru/tw]]
Причина, по которой я выбрал именно такой инструмент для самовыражения, проста: всё работает именно так, как мне бы хотелось. А удобство подхода, когда весь сайт фактически помешается в одном файле -- трудно переоценить.
*Верхнее меню:
*[[О проекте]]    [[Настройка сервера]]     [[Другие средства]]    [[dnsbl.rymsho.ru]]    [[rhsbl.rymsho.ru]]
<<closeAll>><<permaview>><<saveChanges>>
<!--{{{-->
<div class='title' macro='view title'></div>
<div class='toolbar' macro='toolbar closeTiddler
+editTiddler'></div>
<div class='subtitle'><span macro='view modifier
link'></span>, <span macro='view modified
date'></span> (<span macro='message
views.wikified.createdPrompt'></span> <span macro='view
created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
/***
|''Name:''|WikiBar|
|''Version:''|2.0.0 beta3|
|''Source:''|[[AiddlyWiki|http://aiddlywiki.sourceforge.net]]|
|''Author:''|[[Arphen Lin|mailto:arphenlin@gmail.com]]|
|''Type:''|toolbar macro command extension|
|''Required:''|TiddlyWiki 2.0.0 beta6|
!Description
WikiBar is a toolbar that gives access to most of TiddlyWiki's formatting features with a few clicks. It's a handy tool for people who are not familiar with TiddlyWiki syntax.
Besides, with WikiBar-addons, users can extend the power of WikiBar.
!Support browser
*Firefox 1.5
!Revision history
*v2.0.0 beta3 (2005/12/30)
** remove macros (replaced by TWMacro addon)
** add wikibar command in toolbar automatically
** rename DOIT to HANDLER
** rename TIP to TOOLTIP
*v2.0.0 beta2 (2005/12/21)
** re-design Wikibar addon framework
*v2.0.0 beta1 (2005/12/14)
** Note:
*** WikiBarPlugin is renamed to WikiBar
** New Features:
*** support TiddlyWiki 2.0.0 template mechanism
*** new wikibar data structure
*** new wikibar-addon framework for developers
**** support dynamic popup menu generator
*** support most new macros added in TiddlyWiki 2.0.0
*** multi-level popup menu
*** fix wikibar tab stop
*** remove paletteSelector
** Known Bugs:
*** popup-menu and color-picker can't be closed correctly
*** some macros can't be displayed correctly in previewer
*** text in previewer will be displayed italic
*v1.2.0 (2005/11/21)
**New Features:
***User defined color palettes supported
####Get color palettes from [[ColorZilla Palettes|http://www.iosart.com/firefox/colorzilla/palettes.html]].
####Save the palette file(*.gpl) as a new tiddler and tag it with 'ColorPalettes', then you can use it in WikiBar.
***WikiBar style sheet supported
***Click on document to close current colorPicker, paletteSelector or aboutWikibar
*v1.1.1 (2005/11/03)
**Bugs fixed:
***'Not enough parameters!' message is displayed when the parameter includes '%+number', ex: 'hello%20world!'
*v1.1.0 (2005/11/01)
**Bugs fixed:
***WikiBar overruns (reported by by GeoffS <gslocock@yahoo.co.uk>)
**New features:
***Insert a color code at the cursor. (Thanks to RunningUtes <RunningUtes@gmail.com>)
***Enable gradient macro. (Thanks to RunningUtes <RunningUtes@gmail.com>)
***Insert tiddler comment tags {{{/% ... %/}}}. (new feature supported by TiddlyWiki 1.2.37)
***Insert DateFormatString for {{{<<today>>}}} macro. (new feature supported by TiddlyWiki 1.2.37)
**Enhanced:
***Allow optional parameters in syntax.
**Bugs:
***'Not enough parameters!' message is displayed when the parameter includes '%+number', ex: 'hello%20world!'
*v1.0.0 (2005/10/30)
**Initial release
!Code
***/
//{{{
config.macros.wikibar = {major: 2, minor: 0, revision: 0, beta: 3, date: new Date(2005,12,30)};
config.macros.wikibar.handler = function(place,macroName,params,wikifier,paramString,tiddler){
  if(!(tiddler instanceof Tiddler))  {return;}
	story.setDirty(tiddler.title,true);
  place.id = 'wikibar'+tiddler.title;
  place.className = 'toolbar wikibar';
};
function wikibar_install(){
  config.commands.wikibar = {
  	text: 'wikibar',
  	tooltip: 'wikibar on/off',
  	handler: function(e,src,title) {
      if(!e){ e = window.event; }
      var theButton = resolveTarget(e);
      theButton.id = 'wikibarButton'+title;
      wikibarPopup.remove();
      wikibar_installAddons(theButton, title);
      wikibar_createWikibar(title);
      return(false);
    }
  };
  config.shadowTiddlers['EditTemplate'] = wikibar_addWikibarCommand(config.shadowTiddlers['EditTemplate']);
  var tiddler = store.getTiddler('EditTemplate');
  if(tiddler){
    tiddler.text = wikibar_addWikibarCommand(tiddler.text);
  }
}
function wikibar_installAddons(theButton, title){
 	var tiddlers = store.getTaggedTiddlers('wikibarAddons');
	if(!tiddlers)	  { return; }
	theButton.addons=[];
  for(var i=0; i<tiddlers.length; i++){
    try{
      eval(tiddlers[i].text);
      try{
        wikibar_addonInstall(title);
        wikibar_addonInstall = null;
        theButton.addons.push({ok:true, name:tiddlers[i].title});
      }catch(ex){
        theButton.addons.push({ok:false, name:tiddlers[i].title, error:ex});
      }
    }catch(ex){
      theButton.addons.push({ok:false, name:tiddlers[i].title, error:ex});
    }
  }
}
function wikibar_addWikibarCommand(tiddlerText){
  var div = document.createElement('div');
  div.style.display = 'none';
  div.innerHTML = tiddlerText;
  for(var i=0; i<div.childNodes.length; i++){
    var o=div.childNodes[i];
    if(o.tagName==='DIV'){
      if(o.className=='toolbar'){
        var macroText = o.getAttribute('macro').trim();
        if(macroText.search('wikibar')<=0){
          macroText += ' wikibar';
          o.setAttribute('macro', macroText);
        }
        break;
      }
    }
  }
  return div.innerHTML.replace(/\"/g, "\'");
}
function wikibar_processSyntaxParams(theSyntax, params){
  try{
    var pcr = 'AplWikibarPcr';
    var rx=null;
    var allParams=null;
    if(params){
      if(typeof(params)=='object'){
        for(var i=0; i<params.length; i++){
          if(params[i]){
            params[i] = params[i].replace(new RegExp('%','g'), pcr).trim();
            rx = '(\\[%'+(i+1)+'\\])' + '|' + '(%'+(i+1)+')';
            theSyntax = theSyntax.replace(new RegExp(rx,'g'), params[i] );
          }
        }
        allParams = params.join(' ').trim();
      }else{
        allParams = params.replace(new RegExp('%','g'), pcr).trim();
        rx = /(\[%1{1}\])|(%1{1})/g;
        theSyntax = theSyntax.replace(rx, allParams);
      }
    }
    if(allParams){
      theSyntax = theSyntax.replace(new RegExp('%N{1}','g'), allParams);
    }
    rx=/\[%(([1-9]{1,}[0-9]{0,})|(N{1}))\]/g;
    theSyntax = theSyntax.replace(rx, '');
    rx=/%(([1-9]{1,}[0-9]{0,})|(N{1}))/g;
    if( theSyntax.match(rx) ){
      throw 'Not enough parameters! ' + theSyntax;
    }
    theSyntax=theSyntax.replace(new RegExp(pcr,'g'), '%');
    return theSyntax;
  } catch(ex){
    return null;
  }
}
function wikibar_resolveEditItem(tiddlerWrapper, itemName){
  if(tiddlerWrapper.hasChildNodes()){
    var c=tiddlerWrapper.childNodes;
    for(var i=0; i<c.length; i++){
      var txt=wikibar_resolveEditItem(c[i], itemName);
      if(!txt){
        continue;
      }else{
        return txt;
      }
    }
  }
  return ((tiddlerWrapper.getAttribute && tiddlerWrapper.getAttribute('edit')==itemName)? tiddlerWrapper : null);
}
function wikibar_resolveEditItemValue(tiddlerWrapper, itemName){
  var o = wikibar_resolveEditItem(tiddlerWrapper, itemName);
  return (o? o.value.replace(/\r/mg,'') : null);
}
function wikibar_resolveTiddlerEditorWrapper(obj){
  if(obj.id=='tiddlerDisplay'){return null;}
  if((obj.getAttribute && obj.getAttribute('macro')=='edit text')){return obj;}
  return wikibar_resolveTiddlerEditorWrapper(obj.parentNode);
}
function wikibar_resolveTiddlerEditor(obj){
  if(obj.hasChildNodes()){
    var c = obj.childNodes;
    for(var i=0; i<c.length; i++){
      var o=wikibar_resolveTiddlerEditor(c[i]);
      if(o){ return o;}
    }
  }
  return ((obj.getAttribute && obj.getAttribute('edit')=='text')? obj : null);
}
function wikibar_resolveTargetButton(obj){
  if(obj.id && obj.id.substring(0,7)=='wikibar'){ return null; }
  if(obj.tiddlerTitle){
    return obj;
  }else{
    return wikibar_resolveTargetButton(obj.parentNode);
  }
}
function wikibar_isValidMenuItem(tool){
  if(!tool){  return false; }
  if(tool.TYPE=='MENU' || tool.TYPE=='MAIN_MENU'){
    for(var key in tool){
      if(key.substring(0,8)=='DYNAITEM'){ return true; }
      if(wikibar_isValidMenuItem(tool[key])){ return true; }
    }
    return false;
  }else{
    return (tool.HANDLER? true : false);
  }
}
function wikibar_editFormat(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){ return; }
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var endText  = '';
	var fullText = editor.value;
	if(se>ss && ss>=0){
	  frontText  = fullText.substring(0, ss);
	  endText    = fullText.substring(se, fullText.length);
	}
	else if(ss===0 && (se===0 || se == fullText.length) ){
    endText    = fullText;
	}
	else if(se==ss && ss>0){
    frontText  = fullText.substring(0, ss);
    endText    = fullText.substring(se, fullText.length);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editFormatByWord(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){return;}
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var selText  = '';
	var endText  = '';
	var fullText = editor.value;
	if(se>ss && ss>=0){
	  frontText  = fullText.substring(0, ss);
	  selText	   = fullText.substring(ss,se);
	  endText    = fullText.substring(se, fullText.length);
	}
	else if(ss===0 && (se===0 || se == fullText.length) ){
    endText    = fullText;
	}
	else if(se==ss && ss>0){
    frontText  = fullText.substring(0, ss);
    endText    = fullText.substring(se, fullText.length);
	  if(!( fullText.charAt(ss-1).match(/\W/gi) || fullText.charAt(ss).match(/\W/gi) )){
      var m = frontText.match(/\W/gi);
      if(m){
        ss = frontText.lastIndexOf(m[m.length-1])+1;
      }
      else{
        ss = 0;
      }
      m = endText.match(/\W/gi);
      if(m){
        se += endText.indexOf(m[0]);
      }
      else{
        se = fullText.length;
      }
      frontText = fullText.substring(0, ss);
  	  endText   = fullText.substring(se, fullText.length);
  	  selText   = fullText.substring(ss,se);
	  }
	}
	if(selText.length>0){
		repText = repText.replace('user_text', selText);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editFormatByCursor(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){ return; }
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var endText  = '';
	var fullText = editor.value;
	if(se>ss && ss>=0){
	  frontText  = fullText.substring(0, ss);
	  endText    = fullText.substring(se, fullText.length);
	}
	else if(ss===0 && (se===0 || se == fullText.length) ){
    endText    = fullText;
	}
	else if(se==ss && ss>0){
    frontText  = fullText.substring(0, ss);
    endText    = fullText.substring(se, fullText.length);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editFormatByLine(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){ return; }
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var selText  = '';
	var endText  = '';
	var fullText = editor.value;
	if(se>ss && ss>=0){
		if(this.byBlock){
	    frontText  = fullText.substring(0, ss);
	    selText		 = fullText.substring(ss,se);
	    endText    = fullText.substring(se, fullText.length);
		}
		else{
	  	se = ss;
		}
	}
  if(ss===0 && (se===0 || se == fullText.length) ){
    var m=fullText.match(/(\n|\r)/g);
    if(m){
      se = fullText.indexOf(m[0]);
    }else{
      se = fullText.length;
    }
    selText    = fullText.substring(0, se);
    endText    = fullText.substring(se, fullText.length);
	}
	else if(se==ss && ss>0){
    frontText  = fullText.substring(0, ss);
    endText    = fullText.substring(se, fullText.length);
    m = frontText.match(/(\n|\r)/g);
    if(m){
      ss = frontText.lastIndexOf(m[m.length-1])+1;
    }
    else{
      ss = 0;
    }
    m = endText.match(/(\n|\r)/g);
    if(m){
      se += endText.indexOf(m[0]);
    }
    else{
      se = fullText.length;
    }
    frontText = fullText.substring(0, ss);
	  selText   = fullText.substring(ss,se);
	  endText   = fullText.substring(se, fullText.length);
	}
	if(selText.length>0){
		repText = repText.replace('user_text', selText);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	if(this.byBlock){
    if( (frontText.charAt(frontText.length-1)!='\n') && ss>0 ){
    	repText = '\n' + repText;
    }
    if( (endText.charAt(0)!='\n') || se==fullText.length){
    	repText += '\n';
    }
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editFormatByTableCell(param){
  var editor = param.button.editor;
  var params = param.params;
  clearMessage();
  if(!editor){ return; }
  var repText = wikibar_processSyntaxParams(this.syntax, params);
  if(repText===null){ return; }
	var st = editor.scrollTop;
	var ss = editor.selectionStart;
	var se = editor.selectionEnd;
	var frontText= '';
	var selText  = '';
	var endText  = '';
	var fullText = editor.value;
	if(ss===0 || ss==fullText.length){
		throw 'not valid cell!';
	}
	se=ss;
  frontText  = fullText.substring(0, ss);
  endText    = fullText.substring(se, fullText.length);
  i=frontText.lastIndexOf('\n');
  j=frontText.lastIndexOf('|');
  if(i>j || j<0){
  	throw 'not valid cell!';
  }
	ss = j+1;
  i=endText.indexOf('\n');
  j=endText.indexOf('|');
  if(i<j || j<0){
  	throw 'not valid cell!';
  }
  se += j;
  frontText = fullText.substring(0, ss-1);
  selText   = fullText.substring(ss,se);
  endText   = fullText.substring(se+1, fullText.length);
	if(this.key.substring(0,5)=='align'){
		selText = selText.trim();
		if(	selText=='>' || selText=='~' ||	selText.substring(0,8)=='bgcolor(')	{return; }
	}
	if(selText.length>0){
		repText = repText.replace('user_text', selText);
	}
	if(repText.indexOf('user_text')>=0 && this.hint){
		repText = repText.replace('user_text', this.hint);
	}
	editor.value = frontText + repText + endText;
	editor.selectionStart = ss;
	editor.selectionEnd   = ss + repText.length - 2;
	editor.scrollTop      = st;
	editor.focus();
}
function wikibar_editSelectAll(param){
  var editor = param.button.editor;
	editor.selectionStart = 0;
	editor.selectionEnd   = editor.value.length;
	editor.scrollTop      = 0;
	editor.focus();
}
function wikibar_doPreview(param){
  var theButton = param.button;
  var editor = param.button.editor;
  var wikibar = theButton.parentNode;
  if(!wikibar)  { return; }
  title = theButton.tiddlerTitle;
  var editorWrapper = wikibar_resolveTiddlerEditorWrapper(editor);
  var tiddlerWrapper = editorWrapper.parentNode;
  var previewer = document.getElementById('previewer'+title);
  if(previewer){
    previewer.parentNode.removeChild(previewer);
    editorWrapper.style.display = 'block';
    visible=true;
  }else{
    previewer = document.createElement('div');
    previewer.id = 'previewer'+title;
    previewer.className = 'viewer previewer';
    previewer.style.height = (editor.offsetHeight) + 'px';
    wikify(editor.value, previewer);
    tiddlerWrapper.insertBefore(previewer, editorWrapper);
    editorWrapper.style.display = 'none';
    visible=false;
  }
  var pv=null;
  for(var i=0; i<wikibar.childNodes.length; i++){
    try{
      var btn = wikibar.childNodes[i];
      if(btn.toolItem.key == 'preview'){ pv=btn; }
      if(btn.toolItem.key != 'preview'){
        btn.style.display = visible ? '': 'none';
      }
    }catch(ex){}
  }
  if(!pv) { return; }
  if(visible){
    pv.innerHTML = '<font face=\"verdana\">&infin;</font>';
    pv.title = 'preview current tiddler';
  }
  else{
    pv.innerHTML = '<font face=\"verdana\">&larr;</font>';
    pv.title = 'back to editor';
  }
}
function wikibar_doListAddons(param){
  clearMessage();
  var title = param.button.tiddlerTitle;
  var wikibarButton = document.getElementById('wikibarButton'+title);
  var ok=0, fail=0;
  for(var i=0; i<wikibarButton.addons.length; i++){
    var addon=wikibarButton.addons[i];
    if(addon.ok){
      displayMessage('[ o ] '+addon.name);
      ok++;
    }
    else{
      displayMessage('[ x ] '+addon.name + ': ' + addon.error);
      fail++;
    }
  }
  displayMessage('---------------------------------');
  displayMessage(ok + ' ok ; ' + fail + ' failed');
}
function wikibar_getColorCode(param){
  var cbOnPickColor = function(colorCode, param){
    param.params = colorCode;
    param.button.toolItem.doMore(param);
  };
  wikibarColorTool.openColorPicker(param.button, cbOnPickColor, param);
}
function wikibar_getLinkUrl(param){
  var url= prompt('Please enter the link target', (this.param? this.param : ''));
  if (url && url.trim().length>0){
    param.params = url;
    this.doMore(param);
  }
}
function wikibar_getTableRowCol(param){
  var rc= prompt('Please enter (rows x cols) of the table', '2 x 3');
  if (!rc || (rc.trim()).length<=0){ return; }
  var arr = rc.toUpperCase().split('X');
  if(arr.length != 2)   { return; }
  for(var i=0; i<arr.length; i++){
    if(isNaN(arr[i].trim()))  { return; }
  }
  var rows = parseInt(arr[0].trim(), 10);
  var cols = parseInt(arr[1].trim(), 10);
  var txtTable='';
  for(var r=0; r<rows; r++){
    for(var c=0; c<=cols; c++){
      if(c===0){
        txtTable += '|';
      }else{
        txtTable += ' |';
      }
    }
    txtTable += '\n';
  }
  if(txtTable.trim().length>0){
    param.params = txtTable.trim();
    this.doMore(param);
  }
}
function wikibar_getMacroParam(param){
  var p = prompt('Please enter the parameters of macro \"' + this.key + '\":' +
                 '\nSyntax: ' + this.syntax +
                 '\n\nNote: '+
                 '\n%1,%2,... - parameter needed'+
                 '\n[%1] - optional parameter'+
                 '\n%N   - more than one parameter(1~n)'+
                 '\n[%N] - any number of parameters(0~n)'+
                 '\n\nPS:'+
                 '\n1. Parameters should be seperated with space character'+
                 '\n2. Use \" to wrap the parameter that includes space character, ex: \"hello world\"'+
                 '\n3. Input the word(null) for the optional parameter ignored',
                 (this.param? this.param : '') );
  if(!p)  { return; }
  p=p.readMacroParams();
  for(var i=0; i<p.length; i++){
    var s=p[i].trim();
    if(s.indexOf(' ')>0){ p[i]="'"+s+"'"; }
    if(s.toLowerCase()=='null'){ p[i]=null; }
  }
  param.params = p;
  this.doMore(param);
}
function wikibar_getMorePalette(unused){
  clearMessage();
  displayMessage('Get more color palettes(*.gpl) from ColorZilla Palettes site', 'http:\/\/www.iosart.com/firefox/colorzilla/palettes.html');
  displayMessage('Save it as a new tiddler with \"ColorPalettes\" tag');
}
function wikibar_createWikibar(title){
  var theWikibar = document.getElementById('wikibar' + title);
  if(theWikibar){
    if(theWikibar.hasChildNodes()){
      theWikibar.style.display = (theWikibar.style.display=='block'? 'none':'block');
      return;
    }
  }
  var tiddlerWrapper = document.getElementById('tiddler'+title);
  var theTextarea = wikibar_resolveTiddlerEditor(tiddlerWrapper);
  if(!theTextarea){
    clearMessage();
    displayMessage('WikiBar only works in tiddler edit mode now');
    return;
  }else{
    if(!theTextarea.id){ theTextarea.id = 'editor'+title; }
    if(!theTextarea.parentNode.id){ theTextarea.parentNode.id='editorWrapper'+title;  }
  }
  if(theWikibar){
    theWikibar = document.getElementById('wikibar'+title);
  }else{
    var editorWrapper = wikibar_resolveTiddlerEditorWrapper(theTextarea);
    theWikibar = createTiddlyElement(tiddlerWrapper, 'div', 'wikibar'+title, 'toolbar');
    addClass(theWikibar, 'wikibar');
    var previewer = document.getElementById('previewer'+title);
    if(previewer){
      tiddlerWrapper.insertBefore(theWikibar, previewer);
    }else{
      tiddlerWrapper.insertBefore(theWikibar, editorWrapper);
    }
  }
  wikibar_createMenu(theWikibar,wikibarStore,title,theTextarea);
  if(config.options['chkWikibarSetEditorHeight'] && config.options['txtWikibarEditorRows']){
    theTextarea.rows = config.options['txtWikibarEditorRows'];
  }
  setStylesheet(
    '.wikibar{text-align:left;visibility:visible;margin:2px;padding:1px;}.previewer{overflow:auto;display:block;border:1px solid;}#colorPicker{position:absolute;display:none;z-index:10;margin:0px;padding:0px;}#colorPicker table{margin:0px;padding:0px;border:2px solid #000;border-spacing:0px;border-collapse:collapse;}#colorPicker td{margin:0px;padding:0px;border:1px solid;font-size:11px;text-align:center;cursor:auto;}#colorPicker .header{background-color:#fff;}#colorPicker .button{background-color:#fff;cursor:pointer;cursor:hand;}#colorPicker .button:hover{padding-top:3px;padding-bottom:3px;color:#fff;background-color:#136;}#colorPicker .cell{padding:4px;font-size:7px;cursor:crosshair;}#colorPicker .cell:hover{padding:10px;}.wikibarPopup{position:absolute;z-index:10;border:1px solid #014;color:#014;background-color:#cef;}.wikibarPopup table{margin:0;padding:0;border:0;border-spacing:0;border-collapse:collapse;}.wikibarPopup .button:hover{color:#eee;background-color:#014;}.wikibarPopup .disabled{color:#888;}.wikibarPopup .disabled:hover{color:#888;background-color:#cef;}.wikibarPopup tr .seperator hr{margin:0;padding:0;background-color:#cef;width:100%;border:0;border-top:1px dashed #014;}.wikibarPopup tr .icon{font-family:verdana;font-weight:bolder;}.wikibarPopup tr .marker{font-family:verdana;font-weight:bolder;}.wikibarPopup td{font-size:0.9em;padding:2px;}.wikibarPopup input{border:0;border-bottom:1px solid #014;margin:0;padding:0;font-family:arial;font-size:100%;background-color:#fff;}',
  	'WikiBarStyleSheet');
}
function wikibar_createMenu(place,toolset,title,editor){
  if(!wikibar_isValidMenuItem(toolset)){return;}
  if(!(toolset.TYPE=='MAIN_MENU' || toolset.TYPE=='MENU')){ return; }
    for(var key in toolset){
      if(key.substring(0,9)=='SEPERATOR'){
        wikibar_createMenuSeperator(place);
        continue;
      }
      if(key.substring(0,8)=='DYNAITEM'){
        var dynaTools = toolset[key](title,editor);
        if(dynaTools.TYPE && dynaTools.TYPE=='MENU'){
          wikibar_createMenuItem(place,dynaTools,null,editor,title);
        }else{
          dynaTools.TYPE = 'MENU';
          wikibar_createMenu(place, dynaTools, title, editor);
        }
        continue;
      }
      if((toolset[key].TYPE!='MENU' && toolset[key].TYPE!='MAIN_MENU') && !toolset[key].HANDLER){continue;}
      wikibar_createMenuItem(place,toolset,key,editor,title);
    }
}
function wikibar_createMenuItem(place,toolset,key,editor,title){
  if(!key){
    var tool = toolset;
  }else{
    tool = toolset[key];
    tool.key = key;
  }
  if(!wikibar_isValidMenuItem(tool)){return;}
  var toolIsOnMainMenu = (toolset.TYPE=='MAIN_MENU');
  var toolIsMenu = (tool.TYPE=='MENU');
  var theButton;
  if(toolIsOnMainMenu){
    theButton = createTiddlyButton(
                  place,
                  '',
                  (tool.TOOLTIP? tool.TOOLTIP : ''),
                  (toolIsMenu? wikibar_onClickMenuItem : wikibar_onClickItem),
                  'button');
    theButton.innerHTML = (tool.CAPTION? tool.CAPTION : key);
    theButton.isOnMainMenu = true;
    addClass(theButton, (toolIsMenu? 'menu' : 'item'));
  	place.appendChild( document.createTextNode('\n') );
    if(!toolIsMenu){
      if(config.options['chkWikibarPopmenuOnMouseOver']){
        theButton.onmouseover = function(e){ wikibarPopup.remove(); };
      }
    }
  }else{
    theButton=createTiddlyElement(place, 'tr',key,'button');
    theButton.title = (tool.TOOLTIP? tool.TOOLTIP : '');
    theButton.onclick = (toolIsMenu? wikibar_onClickMenuItem : wikibar_onClickItem);
    var tdL = createTiddlyElement(theButton, 'td','','marker');
    var td = createTiddlyElement(theButton, 'td');
    var tdR = createTiddlyElement(theButton, 'td','','marker');
    td.innerHTML = (tool.CAPTION? tool.CAPTION : key);
    if(toolIsMenu){
      tdR.innerHTML='&nbsp;&nbsp;&rsaquo;';
    }
    if(tool.SELECTED){
      tdL.innerHTML = '&radic; ';
      addClass(theButton, 'selected');
    }
    if(tool.DISABLED){
      addClass(theButton, 'disabled');
    }
  }
  theButton.tiddlerTitle = title;
  theButton.toolItem = tool;
  theButton.editor = editor;
  theButton.tabIndex = 999;
  if(toolIsMenu){
    if(config.options['chkWikibarPopmenuOnMouseOver']){
      theButton.onmouseover = wikibar_onClickMenuItem;
    }
  }
}
function wikibar_createMenuSeperator(place){
  if(place.id.substring(0,7)=='wikibar')  { return; }
  var onclickSeperator=function(e){
  	if(!e){ e = window.event; }
  	e.cancelBubble = true;
    if (e.stopPropagation){ e.stopPropagation();  }
  	return(false);
  };
  var theButton=createTiddlyElement(place,'tr','','seperator');
  var td = createTiddlyElement(theButton, 'td','','seperator');
  td.colSpan=3;
  theButton.onclick=onclickSeperator;
	td.innerHTML = '<hr>';
}
function wikibar_genWikibarAbout(){
  var toolset={};
  toolset.version = {
    CAPTION: '<center>WikiBar ' +
              config.macros.wikibar.major + '.' +
              config.macros.wikibar.minor + '.' +
              config.macros.wikibar.revision +
              (config.macros.wikibar.beta? ' beta '+config.macros.wikibar.beta : '') +
              '</center>',
    HANDLER: function(){}
  };
  toolset.SEPERATOR = {};
  toolset.author = {
    CAPTION: '<center>Arphen Lin<br>arphenlin@gmail.com</center>',
    TOOLTIP: 'send mail to the author',
    HANDLER: function(){ window.open('mailto:arphenlin@gmail.com'); }
  };
  toolset.website = {
    CAPTION: '<center>aiddlywiki.sourceforge.net</center>',
    TOOLTIP: 'go to the web site of WikiBar',
    HANDLER: function(){ window.open('http:\/\/aiddlywiki.sourceforge.net/'); }
  };
  return toolset;
}
function wikibar_genWikibarOptions(title, editor){
  var toolset={};
  toolset.popOnMouseOver = {
    CAPTION:'popup menu on mouse over',
    SELECTED: config.options['chkWikibarPopmenuOnMouseOver'],
    HANDLER: function(param){
      config.options['chkWikibarPopmenuOnMouseOver'] = !config.options['chkWikibarPopmenuOnMouseOver'];
      saveOptionCookie('chkWikibarPopmenuOnMouseOver');
      var title = param.button.tiddlerTitle;
      var wikibar = document.getElementById('wikibar'+title);
      if(wikibar){ wikibar.parentNode.removeChild(wikibar); }
      wikibar_createWikibar(title);
    }
  };
  toolset.setEditorSize = {
    CAPTION:'set editor height: <input id=\"txtWikibarEditorRows\" type=text size=1 MAXLENGTH=3 value=\"' +
            (config.options['txtWikibarEditorRows']? config.options['txtWikibarEditorRows']:editor.rows) + '\"> ok',
    HANDLER: function(param){
      var input = document.getElementById('txtWikibarEditorRows');
      if(input){
        var rows = parseInt(input.value, 10);
        if(!isNaN(rows)){
          var editor = param.button.editor;
          editor.rows = rows;
        }else{
          rows=config.maxEditRows;
        }
        config.options['txtWikibarEditorRows'] = rows;
        saveOptionCookie('txtWikibarEditorRows');
        config.maxEditRows = rows;
      }
    }
  };
  toolset.setEditorSizeOnLoadingWikibar = {
    CAPTION:'set editor height on loading wikibar',
    SELECTED: config.options['chkWikibarSetEditorHeight'],
    HANDLER: function(param){
      config.options['chkWikibarSetEditorHeight'] = !config.options['chkWikibarSetEditorHeight'];
      saveOptionCookie('chkWikibarSetEditorHeight');
      if(config.options['chkWikibarSetEditorHeight']){
        var rows = config.options['txtWikibarEditorRows'];
        if(!isNaN(rows)){ rows = 15; }
        var editor = param.button.editor;
        editor.rows = rows;
        config.options['txtWikibarEditorRows'] = rows;
        saveOptionCookie('txtWikibarEditorRows');
      }
    }
  };
  toolset.SEPERATOR = {};
  toolset.update = {
    CAPTION: 'check for updates',
    DISABLED: true,
    HANDLER: function(){}
  };
  return toolset;
}
function wikibar_genPaletteSelector(){
  try{
  	var cpTiddlers = store.getTaggedTiddlers('ColorPalettes');
  	if(!cpTiddlers) { return; }
  	var palettes=[];
  	palettes.push(wikibarColorTool.defaultPaletteName);
  	for(var i=0; i<cpTiddlers.length; i++){
  		palettes.push(cpTiddlers[i].title.trim());
  	}
    var toolset={};
    for(i=0; i<palettes.length; i++){
      toolset[palettes[i]] = {
        TOOLTIP: palettes[i],
        SELECTED: (palettes[i]==wikibarColorTool.paletteName),
        HANDLER: wikibar_doSelectPalette
      };
    }
    return toolset;
  }catch(ex){ return null; }
}
function wikibar_onClickItem(e){
	if(!e){ e = window.event; }
	var theTarget = resolveTarget(e);
	if(theTarget.tagName=='INPUT'){
    e.cancelBubble = true;
    if (e.stopPropagation){ e.stopPropagation(); }
    return;
	}
	var theButton = wikibar_resolveTargetButton(theTarget);
	if(!theButton){ return(false);  }
  	var o = theButton.toolItem;
    if(!o) { return; }
    var param = {
      event: e,
      button: theButton
    };
    if(o.HANDLER){ o.HANDLER(param);  }
  if(o.DISABLED){
    e.cancelBubble = true;
    if (e.stopPropagation){ e.stopPropagation(); }
  }
	return(false);
}
function wikibar_onClickMenuItem(e){
	if(!e){ e = window.event; }
	var theButton = wikibar_resolveTargetButton(resolveTarget(e));
	if(!theButton){ return(false);  }
	e.cancelBubble = true;
	if (e.stopPropagation){ e.stopPropagation(); }
    var title = theButton.tiddlerTitle;
    var editor = theButton.editor;
    var tool = theButton.toolItem;
    if(!tool) { return; }
    var popup = wikibarPopup.create(this);
  	if(popup){
      wikibar_createMenu(popup,tool,title,editor);
      if(!popup.hasChildNodes()){
        wikibarPopup.remove();
      }else{
        wikibarPopup.show(popup, false);
      }
    }
	return(false);
}
var wikibarColorTool = {
  defaultPaletteName : 'default',
  defaultColumns : 16,
  defaultPalette : [
    '#FFF','#DDD','#CCC','#BBB','#AAA','#999','#666','#333','#111','#000','#FC0','#F90','#F60','#F30','#C30','#C03',
    '#9C0','#9D0','#9E0','#E90','#D90','#C90','#FC3','#FC6','#F96','#F63','#600','#900','#C00','#F00','#F36','#F03',
    '#CF0','#CF3','#330','#660','#990','#CC0','#FF0','#C93','#C63','#300','#933','#C33','#F33','#C36','#F69','#F06',
    '#9F0','#CF6','#9C3','#663','#993','#CC3','#FF3','#960','#930','#633','#C66','#F66','#903','#C39','#F6C','#F09',
    '#6F0','#9F6','#6C3','#690','#996','#CC6','#FF6','#963','#630','#966','#F99','#F39','#C06','#906','#F3C','#F0C',
    '#3F0','#6F3','#390','#6C0','#9F3','#CC9','#FF9','#C96','#C60','#C99','#F9C','#C69','#936','#603','#C09','#303',
    '#0C0','#3C0','#360','#693','#9C6','#CF9','#FFC','#FC9','#F93','#FCC','#C9C','#969','#939','#909','#636','#606',
    '#060','#3C3','#6C6','#0F0','#3F3','#6F6','#9F9','#CFC','#9CF','#FCF','#F9F','#F6F','#F3F','#F0F','#C6C','#C3C',
    '#030','#363','#090','#393','#696','#9C9','#CFF','#39F','#69C','#CCF','#C9F','#96C','#639','#306','#90C','#C0C',
    '#0F3','#0C3','#063','#396','#6C9','#9FC','#9CC','#06C','#369','#99F','#99C','#93F','#60C','#609','#C3F','#C0F',
    '#0F6','#3F6','#093','#0C6','#3F9','#9FF','#699','#036','#039','#66F','#66C','#669','#309','#93C','#C6F','#90F',
    '#0F9','#6F9','#3C6','#096','#6FF','#6CC','#366','#069','#36C','#33F','#33C','#339','#336','#63C','#96F','#60F',
    '#0FC','#6FC','#3C9','#3FF','#3CC','#399','#033','#39C','#69F','#00F','#00C','#009','#006','#003','#63F','#30F',
    '#0C9','#3FC','#0FF','#0CC','#099','#066','#3CF','#6CF','#09C','#36F','#0CF','#09F','#06F','#03F','#03C','#30C'
  ],
	colorPicker : null,
  pickColorHandler: null,
  userData: null
};
wikibarColorTool.paletteName = wikibarColorTool.defaultPaletteName;
wikibarColorTool.columns = wikibarColorTool.defaultColumns;
wikibarColorTool.palette = wikibarColorTool.defaultPalette;
wikibarColorTool.onPickColor = function(e){
	if (!e){ e = window.event; }
	var theCell = resolveTarget(e);
	if(!theCell){ return(false); }
    color = theCell.bgColor.toLowerCase();
    if(!color)  { return; }
    wikibarColorTool.displayColorPicker(false);
    if(wikibarColorTool.pickColorHandler){
      wikibarColorTool.pickColorHandler(color, wikibarColorTool.userData);
    }
	return(false);
};
wikibarColorTool.onMouseOver = function(e){
	if (!e){ e = window.event; }
	var theButton = resolveTarget(e);
	if(!theButton){ return(false);  }
  	if(!wikibarColorTool)  { return; }
    color = theButton.bgColor.toUpperCase();
    if(!color)  { return; }
    td=document.getElementById('colorPickerInfo');
  	if(!td) { return; }
  	td.bgColor = color;
  	td.innerHTML = '<span style=\"color:#000;\">'+color+'</span>&nbsp;&nbsp;&nbsp;' +
  	               '<span style=\"color:#fff;\">'+color+'</span>';
	e.cancelBubble = true;
	if (e.stopPropagation){ e.stopPropagation(); }
	return(false);
};
wikibarColorTool.openColorPicker = function(theTarget, pickColorHandler, userData){
  wikibarColorTool.skipClickDocumentEvent = true;
  wikibarColorTool.pickColorHandler = pickColorHandler;
  wikibarColorTool.userData = userData;
  wikibarColorTool.moveColorPicker(theTarget);
};
wikibarColorTool.convert3to6HexColor = function(c){
  c=c.trim();
  var rx=/^\#(\d|[a-f])(\d|[a-f])(\d|[a-f])$/gi;
  return (rx.test(c)? c.replace(rx, '#$1$1$2$2$3$3') : c);
};
wikibarColorTool.numToHexColor = function (n){
  if(typeof(n)=='number' && (n>=0 && n<=255)) {
  		s = n.toString(16).toLowerCase();
  		return ((s.length==1)? '0'+s : s);
  }else{
	 return null;
	}
};
wikibarColorTool.renderColorPalette = function(){
	if(wikibarColorTool.paletteName==wikibarColorTool.defaultPaletteName){
		wikibarColorTool.palette=wikibarColorTool.defaultPalette;
		wikibarColorTool.columns=wikibarColorTool.defaultColumns;
		return;
	}
	tiddlerText = (store.getTiddlerText(wikibarColorTool.paletteName, '')).trim();
	if(tiddlerText.length<=0) { return; }
	var cpContents = tiddlerText.split('\n');
	var colors=[];
	columns = wikibarColorTool.defaultColumns;
	var tmpArray=null;
	errCount=0;
	for(var i=0; i<cpContents.length; i++){
		cpLine=cpContents[i].trim();
    if( (!cpLine) || (cpLine.length<=0) || (cpLine.charAt(0) == '#') ){ continue; }
		if(cpLine.substring(0,8).toLowerCase()=='columns:'){
			tmpArray = cpLine.split(':');
			try{
				columns = parseInt(tmpArray[1],10);
			}catch(ex){
				columns = wikibarColorTool.defaultColumns;
			}
		}else{
			tmpArray = cpLine.replace('\t', ' ').split(/[ ]{1,}/);
			try{
				color='';
				for(var j=0; j<3; j++){
          c=parseInt(tmpArray[j].trim(), 10);
          if(isNaN(c)){
						break;
          }else{
						c=wikibarColorTool.numToHexColor(c);
						if(!c) {break;}
            color+=c;
					}
				}
				if(color.length==6){
					colors.push('#'+color);
				}	else {
					throw 'error';
				}
			}catch(ex){
			}
		}
	}
	if(colors.length>0){
		wikibarColorTool.palette = colors;
		wikibarColorTool.columns = columns;
	}else{
		throw 'renderColorPalette(): No color defined in the palette.';
	}
};
wikibarColorTool.displayColorPicker = function(visible){
  if(wikibarColorTool.colorPicker){
    wikibarColorTool.colorPicker.style.display = (visible? 'block' : 'none');
  }
};
wikibarColorTool.moveColorPicker = function(theTarget){
  if(!wikibarColorTool.colorPicker){
  	wikibarColorTool.createColorPicker();
  }
	var cp = wikibarColorTool.colorPicker;
	var rootLeft = findPosX(theTarget);
  var rootTop = findPosY(theTarget);
  var popupLeft = rootLeft;
  var popupTop = rootTop;
  var popupWidth = cp.offsetWidth;
  var winWidth = findWindowWidth();
  if(popupLeft + popupWidth > winWidth){
	  popupLeft = winWidth - popupWidth;
	}
  cp.style.left = popupLeft + 'px';
  cp.style.top = popupTop + 'px';
  wikibarColorTool.displayColorPicker(true);
};
wikibarColorTool.createColorPicker = function(unused, palette){
  if(palette){	wikibarColorTool.paletteName=palette; }
	wikibarColorTool.renderColorPalette();
	wikibarColorTool.colorPicker = document.createElement('div');
	wikibarColorTool.colorPicker.id = 'colorPicker';
	document.body.appendChild(wikibarColorTool.colorPicker);
  var theTable = document.createElement('table');
  wikibarColorTool.colorPicker.appendChild(theTable);
  var theTR = document.createElement('tr');
	theTable.appendChild(theTR);
	var theTD = document.createElement('td');
	theTD.className = 'header';
	theTD.colSpan = wikibarColorTool.columns;
	theTD.innerHTML = wikibarColorTool.paletteName;
  theTR.appendChild(theTD);
  for(var i=0; i<wikibarColorTool.palette.length; i++){
    if((i%wikibarColorTool.columns)===0){
      theTR = document.createElement('tr');
      theTable.appendChild(theTR);
    }
    theTD = document.createElement('td');
    theTD.className = 'cell';
    theTD.bgColor = wikibarColorTool.convert3to6HexColor(wikibarColorTool.palette[i]);
    theTD.onclick = wikibarColorTool.onPickColor;
    theTD.onmouseover = wikibarColorTool.onMouseOver;
    theTR.appendChild(theTD);
  }
  rest = wikibarColorTool.palette.length % wikibarColorTool.columns;
  if(rest>0){
    theTD = document.createElement('td');
		theTD.colSpan = wikibarColorTool.columns-rest;
    theTD.bgColor = '#000000';
    theTR.appendChild(theTD);
  }
  theTR = document.createElement('tr');
	theTable.appendChild(theTR);
	theTD = document.createElement('td');
	theTD.colSpan = wikibarColorTool.columns;
	theTD.id = 'colorPickerInfo';
  theTR.appendChild(theTD);
};
wikibarColorTool.onDocumentClick = function(e){
	if (!e){ e = window.event; }
	if(wikibarColorTool.skipClickDocumentEvent) {
	  wikibarColorTool.skipClickDocumentEvent = false;
    return true;
	}
	if((!e.eventPhase) || e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET){
    wikibarColorTool.displayColorPicker(false);
  }
	return true;
};
function wikibar_doSelectPalette(param){
	clearMessage();
	var theButton = param.button;
	if(!theButton.toolItem.key)  { return; }
	var palette = theButton.toolItem.key;
	var oldPaletteName = wikibarColorTool.paletteName;
	if(oldPaletteName != palette){
		try{
			wikibarColorTool.createColorPicker(theButton, palette);
			displayMessage('Palette \"'+palette+'\" ('+ wikibarColorTool.palette.length +' colors) is selected');
		}catch(ex){
			errMsg = ex;
			if(errMsg.substring(0,18)=='renderColorPalette'){
				displayMessage('Invalid palette \"' + palette + '\", please check it out!');
				wikibarColorTool.createColorPicker(theButton, oldPaletteName);
			}
		}
	}
}
var wikibarPopup = {
  skipClickDocumentEvent: false,
	stack: []
};
wikibarPopup.resolveRootPopup = function(o){
  if(o.isOnMainMenu){  return null; }
  if(o.className.substring(0,12)=='wikibarPopup'){  return o;}
  return wikibarPopup.resolveRootPopup(o.parentNode);
};
wikibarPopup.create = function(root){
  for(var i=0; i<wikibarPopup.stack.length; i++){
    var p=wikibarPopup.stack[i];
    if(p.root==root){
      wikibarPopup.removeFrom(i+1);
      return null;
    }
  }
  var rootPopup = wikibarPopup.resolveRootPopup(root);
  if(!rootPopup){
    wikibarPopup.remove();
  }else{
    wikibarPopup.removeFromRootPopup(rootPopup);
  }
	var popup = createTiddlyElement(document.body,'div','wikibarPopup'+root.toolItem.key,'wikibarPopup');
	var pop = createTiddlyElement(popup,'table','','');
	wikibarPopup.stack.push({rootPopup: rootPopup, root: root, popup: popup});
	return pop;
};
wikibarPopup.show = function(unused,slowly){
	var curr = wikibarPopup.stack[wikibarPopup.stack.length-1];
	var overlayWidth = 1;
  var rootLeft, rootTop, rootWidth, rootHeight, popupLeft, popupTop, popupWidth;
  if(curr.rootPopup){
  	rootLeft = findPosX(curr.rootPopup);
  	rootTop = findPosY(curr.root);
  	rootWidth = curr.rootPopup.offsetWidth;
  	popupLeft = rootLeft + rootWidth - overlayWidth;
  	popupTop = rootTop;
  }else{
  	rootLeft = findPosX(curr.root);
  	rootTop = findPosY(curr.root);
  	rootHeight = curr.root.offsetHeight;
  	popupLeft = rootLeft;
  	popupTop = rootTop + rootHeight;
  }
	var winWidth = findWindowWidth();
	popupWidth = curr.popup.offsetWidth;
	if(popupLeft + popupWidth > winWidth){
		popupLeft = rootLeft - popupWidth + overlayWidth;
	}
	curr.popup.style.left = popupLeft + 'px';
	curr.popup.style.top = popupTop + 'px';
	curr.popup.style.display = 'block';
	addClass(curr.root, 'highlight');
	if(config.options.chkAnimate){
		anim.startAnimating(new Scroller(curr.popup,slowly));
	}else{
		window.scrollTo(0,ensureVisible(curr.popup));
	}
};
wikibarPopup.remove = function(){
	if(wikibarPopup.stack.length > 0){
		wikibarPopup.removeFrom(0);
  }
};
wikibarPopup.removeFrom = function(from){
	for(var t=wikibarPopup.stack.length-1; t>=from; t--){
		var p = wikibarPopup.stack[t];
		removeClass(p.root,'highlight');
		p.popup.parentNode.removeChild(p.popup);
  }
	wikibarPopup.stack = wikibarPopup.stack.slice(0,from);
};
wikibarPopup.removeFromRootPopup = function(from){
  for(var t=0; t<wikibarPopup.stack.length; t++){
    var p = wikibarPopup.stack[t];
    if(p.rootPopup==from){
      wikibarPopup.removeFrom(t);
      break;
    }
  }
};
wikibarPopup.onDocumentClick = function(e){
	if (!e){ e = window.event; }
	if(wikibarPopup.skipClickDocumentEvent){
	 wikibarPopup.skipClickDocumentEvent=false;
	 return true;
	}
	if((!e.eventPhase) || e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET){
		wikibarPopup.remove();
	}
	return true;
};
var wikibarStore = {
  TYPE: 'MAIN_MENU',
  help:{
    TYPE:'MENU',
    CAPTION: '<font face=\"verdana\">?</font>',
    TOOLTIP:     'about WikiBar',
    options:{
      TYPE:'MENU',
      DYNAITEM: wikibar_genWikibarOptions
    },
    about:{
      TYPE:'MENU',
      DYNAITEM: wikibar_genWikibarAbout
    }
  },
  preview:{
    TOOLTIP:     'preview this tiddler',
    CAPTION: '<font face=\"verdana\">&infin;</font>',
    HANDLER: wikibar_doPreview
  },
	line:{
		TOOLTIP:    'horizontal line',
		CAPTION: '<font face=\"verdana\">&mdash;</font>',
		syntax: '\n----\n',
		HANDLER: wikibar_editFormatByCursor
	},
	crlf:{
		TOOLTIP:    'new line',
		CAPTION: '<font face=\"verdana\">&para;</font>',
		syntax: '\n',
		HANDLER: wikibar_editFormatByCursor
	},
	selectAll:{
		TOOLTIP:    'select all',
		CAPTION: '<font face=\"verdana\">&sect;</font>',
		HANDLER: wikibar_editSelectAll
	},
	deleteSelected:{
		TOOLTIP:    'delete selected',
		CAPTION: '<font face=\"verdana\">&times;</font>',
		syntax: '',
		HANDLER: wikibar_editFormat
	},
  textFormat:{
    TYPE: 'MENU',
    CAPTION: 'text',
    TOOLTIP: 'text formatters',
    ignore:{
			TOOLTIP:     'ignore wiki word',
			CAPTION: 'ignore wikiWord',
			syntax:  '~user_text',
			hint:    'wiki_word',
			HANDLER:    wikibar_editFormatByWord
		},
		bolder:{
			TOOLTIP:     'bolder text',
			CAPTION: '<strong>bolder</strong>',
			syntax:  "''user_text''",
			hint:		 'bold_text',
			HANDLER:    wikibar_editFormatByWord
		},
		italic:{
			TOOLTIP:    'italic text',
			CAPTION: '<em>italic</em>',
			syntax: '\/\/user_text\/\/',
			hint:		'italic_text',
			HANDLER: wikibar_editFormatByWord
		},
		underline:{
			TOOLTIP:    'underline text',
			CAPTION: '<u>underline</u>',
			syntax: '__user_text__',
			hint:		'underline_text',
			HANDLER: wikibar_editFormatByWord
		},
		strikethrough:{
			TOOLTIP:    'strikethrough text',
			CAPTION: '<strike>strikethrough</strike>',
			syntax: '==user_text==',
			hint:		'strikethrough_text',
			HANDLER: wikibar_editFormatByWord
		},
		superscript:{
			TOOLTIP:    'superscript text',
			CAPTION: 'X<sup>superscript</sup>',
			syntax: '^^user_text^^',
			hint:		'superscript_text',
			HANDLER: wikibar_editFormatByWord
		},
		subscript:{
			TOOLTIP:    'subscript text',
			CAPTION: 'X<sub>subscript</sub>',
			syntax: '~~user_text~~',
			hint:		'subscript_text',
			HANDLER: wikibar_editFormatByWord
		},
		comment:{
			TOOLTIP:    'comment text',
			CAPTION: 'comment text',
			syntax: '/%user_text%/',
			hint:		'comment_text',
			HANDLER: wikibar_editFormatByWord
		},
		monospaced:{
			TOOLTIP:    'monospaced text',
			CAPTION: '<code>monospaced</code>',
			syntax: '{{{user_text}}}',
			hint:		'monospaced_text',
			HANDLER: wikibar_editFormatByWord
		}
  },
  paragraph:{
    TYPE: 'MENU',
    TOOLTIP: 'paragarph formatters',
    list:{
      TYPE: 'MENU',
      TOOLTIP: 'list tools',
      bullet:{
  			TOOLTIP:    'bullet point',
  			syntax: '*user_text',
  			hint:		'bullet_text',
  			HANDLER: wikibar_editFormatByLine
  		},
  		numbered:{
  			TOOLTIP:    'numbered list',
  			syntax: '#user_text',
  			hint:		'numbered_text',
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    heading:{
      TYPE: 'MENU',
      heading1:{
  		  CAPTION:'<h1>Heading 1</h1>',
  			TOOLTIP:    'Heading 1',
  			syntax: '!user_text',
  			hint:		'heading_1',
  			HANDLER: wikibar_editFormatByLine
  		},
  		heading2:{
  		  CAPTION:'<h2>Heading 2<h2>',
  			TOOLTIP:    'Heading 2',
  			syntax: '!!user_text',
  			hint:		'heading_2',
  			HANDLER: wikibar_editFormatByLine
  		},
  		heading3:{
  		  CAPTION:'<h3>Heading 3</h3>',
  			TOOLTIP:    'Heading 3',
  			syntax: '!!!user_text',
  			hint:		'heading_3',
  			HANDLER: wikibar_editFormatByLine
  		},
  		heading4:{
  		  CAPTION:'<h4>Heading 4</h4>',
  			TOOLTIP:    'Heading 4',
  			syntax: '!!!!user_text',
  			hint:		'heading_4',
  			HANDLER: wikibar_editFormatByLine
  		},
  		heading5:{
  		  CAPTION:'<h5>Heading 5</h5>',
  			TOOLTIP:    'Heading 5',
  			syntax: '!!!!!user_text',
  			hint:		'heading_5',
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    comment:{
      TYPE: 'MENU',
      commentByLine:{
  			CAPTION:'comment by line',
  			TOOLTIP:    'line comment',
  			syntax: '/%user_text%/',
  			hint:		'comment_text',
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByBlock:{
  			CAPTION:'comment by block',
  			TOOLTIP:    'block comment',
  			syntax: '/%\nuser_text\n%/',
  			hint:		'comment_text',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    monospaced:{
      TYPE: 'MENU',
  		monosByLine:{
  			CAPTION: 	'monospaced by line',
  			TOOLTIP:    'line monospaced',
  			syntax: '{{{\nuser_text\n}}}',
  			hint:		'monospaced_text',
  			HANDLER: wikibar_editFormatByLine
  		},
  		monosByBlock:{
  			CAPTION: 	'monospaced by block',
  			TOOLTIP:    'block monospaced',
  			syntax: '{{{\nuser_text\n}}}',
  			hint:		'monospaced_text',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    quote:{
      TYPE: 'MENU',
  		quoteByLine:{
  			CAPTION: 	'quote by line',
  			TOOLTIP:    'line quote',
  			syntax: '>user_text',
  			hint:		'quote_text',
  			HANDLER: wikibar_editFormatByLine
  		},
  		quoteByBlcok:{
  			CAPTION: 	'quote by block',
  			TOOLTIP:    'block quote',
  			syntax: '<<<\nuser_text\n<<<',
  			hint:		'quote_text',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    plugin:{
      TYPE: 'MENU',
      code:{
  			CAPTION: 	'code area',
  			TOOLTIP:    'block monospaced for plugin',
  			syntax: '\n\/\/{{{\nuser_text\n\/\/}}}\n',
  			hint:		'monospaced_plugin_code',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByLine:{
  			CAPTION: 	'comment by line',
  			TOOLTIP:    'line comment',
  			syntax: '\/\/user_text',
  			hint:		'plugin_comment',
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByBlock:{
  			CAPTION: 	'comment by block',
  			TOOLTIP:    'block comment',
  			syntax: '\/\***\nuser_text\n***\/',
  			hint:		'plugin_comment',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    },
    css:{
      TYPE: 'MENU',
      code:{
  			CAPTION: 	'code area',
  			TOOLTIP:    'block monospaced for css',
  			syntax: '\n\nuser_text\n\n',
  			hint:		'monospaced_css_code',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByLine:{
  			CAPTION: 	'comment by line',
  			TOOLTIP:    'line comment',
  			syntax: '',
  			hint:		'css_comment',
  			HANDLER: wikibar_editFormatByLine
  		},
  		commentByBlock:{
  			CAPTION: 	'comment by block',
  			TOOLTIP:    'block comment',
  			syntax: '',
  			hint:		'css_comment',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    }
  },
  color:{
    TYPE: 'MENU',
    TOOLTIP: 'color tools',
    highlight:{
		  CAPTION:'highlight text',
			TOOLTIP:    'highlight text',
			syntax: '@@user_text@@',
			hint:		'highlight_text',
			HANDLER: wikibar_editFormatByWord
		},
		color:{
		  CAPTION:'text color',
			TOOLTIP:    'text color',
			hint:		'your_text',
			syntax: '@@color(%1):user_text@@',
			HANDLER:   wikibar_getColorCode,
			doMore: wikibar_editFormatByWord
		},
		bgcolor:{
		  CAPTION:'background color',
			TOOLTIP:    'background color',
			hint:		'your_text',
			syntax: '@@bgcolor(%1):user_text@@',
			HANDLER: wikibar_getColorCode,
			doMore: wikibar_editFormatByWord
		},
		colorcode:{
      CAPTION:'color code',
      TOOLTIP:    'insert color code',
      syntax: '%1',
      HANDLER: wikibar_getColorCode,
      doMore: wikibar_editFormatByCursor
    },
    'color palette':{
      TYPE:'MENU',
      DYNAITEM: wikibar_genPaletteSelector,
  		SEPERATOR:{},
  		morePalette:{
  		  CAPTION:'more palettes',
  		  TOOLTIP:'get more palettes',
  		  HANDLER: wikibar_getMorePalette
  		}
    }
  },
  link:{
    TYPE: 'MENU',
    TOOLTIP: 'insert link',
    wiki:{
		  CAPTION:'wiki link',
			TOOLTIP:    'wiki link',
			syntax: '[[user_text]]',
			hint:		'wiki_word',
			HANDLER: wikibar_editFormatByWord
		},
		pretty:{
			CAPTION: 	'pretty link',
			TOOLTIP:    'pretty link',
			syntax: '[[user_text|%1]]',
			hint:		'pretty_word',
			param:	'PrettyLink Target',
			HANDLER:   wikibar_getLinkUrl,
			doMore: wikibar_editFormatByWord
		},
		url:{
			TOOLTIP:    'url link',
			syntax: '[[user_text|%1]]',
			hint:		'your_text',
			param:	'http:\/\/...',
			HANDLER:   wikibar_getLinkUrl,
			doMore: wikibar_editFormatByWord
		},
		image:{
			TOOLTIP:    'image link',
			syntax: '[img[user_text|%1]]',
			hint:		'alt_text',
			param:	'image/icon.jpg',
			HANDLER:   wikibar_getLinkUrl,
			doMore: wikibar_editFormatByWord
		}
  },
  macro:{},
  more:{
    TYPE: 'MENU',
    TOOLTIP: 'more tools',
    table:{
      TYPE: 'MENU',
      TOOLTIP: 'table',
      table:{
  		  CAPTION:'create table',
  			TOOLTIP:    'create a new table',
  			syntax: '\n%1\n',
  			HANDLER: wikibar_getTableRowCol,
  			doMore: wikibar_editFormatByWord
  		},
  		header:{
  			TOOLTIP:    'table header text',
  			syntax: '|user_text|c',
  			hint:		'table_header',
  			HANDLER: wikibar_editFormatByWord
  		},
  		cell:{
  			TOOLTIP:    'create a tabel cell',
  			syntax: '|user_text|',
  			hint:		'your_text',
  			HANDLER: wikibar_editFormatByWord
  		},
  		columnHeader:{
  		  CAPTION:'column header',
  			TOOLTIP:    'create a column header cell',
  			syntax: '|!user_text|',
  			hint:		'column_header',
  			HANDLER: wikibar_editFormatByWord
  		},
  	  cell:{
  	    TYPE: 'MENU',
        CAPTION: 'cell options',
    		bgcolor:{
    			CAPTION: 	'background color',
    			TOOLTIP:    'cell bgcolor',
    			syntax: '|bgcolor(%1):user_text|',
    			hint:		'your_text',
    			HANDLER: wikibar_getColorCode,
    			doMore: wikibar_editFormatByTableCell
    		},
    		alignLeft:{
    			CAPTION: 	'align left',
    			TOOLTIP:    'left align cell text',
    			syntax: '|user_text|',
    			hint:		'your_text',
    			HANDLER: wikibar_editFormatByTableCell
    		},
    		alignCenter:{
    			CAPTION: 	'align center',
    			TOOLTIP:    'center align cell text',
    			syntax: '| user_text |',
    			hint:		'your_text',
    			HANDLER: wikibar_editFormatByTableCell
    		},
    		alignRight:{
    			CAPTION: 	'align right',
    			TOOLTIP:    'right align cell text',
    			syntax: '| user_text|',
    			hint:		'your_text',
    			HANDLER: wikibar_editFormatByTableCell
    		}
    	}
    },
    html:{
      TYPE: 'MENU',
      html:{
  			CAPTION: 	'&lt;html&gt;',
  			TOOLTIP:    'html tag',
  			syntax: '<html>\nuser_text\n</html>',
  			hint:		'html_content',
  			byBlock: true,
  			HANDLER: wikibar_editFormatByLine
  		}
    }
  },
  addon:{
    TYPE: 'MENU',
    TOOLTIP:'3rd party tools',
    'about addons':{
      TOOLTIP: 'list loaded addons',
      HANDLER: wikibar_doListAddons
    },
    SEPERATOR:{}
  }
};
addEvent(document, 'click', wikibarColorTool.onDocumentClick);
addEvent(document, 'click', wikibarPopup.onDocumentClick);
wikibar_install();
//}}}
/***
!WikiBar CSS 說明
*井號開頭表示 id, ex: #colorPicker
*點號開頭表示 class, ex: .wikibar

!WikiBar Colors Used
*@@bgcolor(#014):color(#fff): #014 - 選單邊框@@
*@@bgcolor(#014):color(#fff): #014 - 選單字體色@@
*@@bgcolor(#cef): #cef - 選單底色@@
*@@bgcolor(#eee): #eee - 選單字體色:游標滑過時@@
*@@bgcolor(#014):color(#fff): #014 - 選單底色:游標滑過時@@
*@@bgcolor(#888): #888 - 無效選單字體色@@
*@@bgcolor(#cef): #cef - 無效選單底色:游標滑過時@@
*@@bgcolor(#014):color(#fff): #014 - 分隔線顏色@@

!wikibar: 工具列, 繼承 .toolbar /%==============================================%/
***/
/*{{{*/
.wikibar {
  text-align: left;
  visibility: visible;
  margin:2px; padding:1px;
}
/*}}}*/

/***
!previewer: 預覽區, 繼承 .viewer /%==============================================%/
***/
/*{{{*/
.previewer {overflow:auto; display:block; border:1px solid;}
/*}}}*/

/***
!colorPicker 調色盤 /%==============================================%/
***/
/*{{{*/
#colorPicker {position:absolute; display:none; z-index:10; margin:0px; padding:0px; }
#colorPicker table {
  margin:0px; padding:0px;
  border:2px solid #000;
  border-spacing: 0px;
  border-collapse: collapse;
}
#colorPicker td {margin:0px; padding:0px; border:1px solid; font-size:11px; text-align:center; cursor:auto;}
#colorPicker .header {background-color: #fff;}
#colorPicker .button {background-color: #fff; cursor:pointer; cursor:hand;}
#colorPicker .button:hover {padding-top:3px; padding-bottom:3px; color:#fff; background-color:#136;}
#colorPicker .cell {padding:4px; font-size:7px; cursor:crosshair;}
#colorPicker .cell:hover {padding:10px;}
/*}}}*/

/***
!wikibarPopup 功能表選單 /%==============================================%/
***/
/*{{{*/
.wikibarPopup{
  position:absolute; z-index:10;
  border: 1px solid #014;
  color: #014; background-color: #cef;
  /*
  max-height:150px;
  overflow-x:hidden; overflow-y:auto;
  */
}

/* 彈出選單 */
.wikibarPopup table{
  margin:0; padding:0;
  border:0;
  border-spacing:0;
  border-collapse:collapse;
}

/* 選單上之按鈕 */
.wikibarPopup .button:hover{color:#eee; background-color: #014;}

/*
.wikibarPopup .selected {background-color: #cf6;}
*/

/* 停用選項 */
.wikibarPopup .disabled {color: #888;}
.wikibarPopup .disabled:hover {color: #888; background-color: #cef;}

/* 分隔線 */
.wikibarPopup tr .seperator hr{
  margin:0; padding:0; background-color: #cef; width: 100%;
  border: 0;
  border-top: 1px dashed #014;
}

/* 選項左右兩邊符號區 */
.wikibarPopup tr .icon   {font-family:verdana; font-weight:bolder;}
.wikibarPopup tr .marker {font-family:verdana; font-weight:bolder;}

/* 選項 */
.wikibarPopup td {font-size:0.9em; padding:2px;}

.wikibarPopup input{
  border:0;
  border-bottom: 1px solid #014;
  margin:0; padding:0;
  font-family: arial;
  font-size:100%;
  background-color: #fff;
}

/*}}}*/
В зону dnsbl.rymsho.ru. заносятся хосты, с которых были попытки отправки спама на почтовый сервер rymsho.ru
Для того, чтобы проверить, занесен ли хост с IP-адресом, например, 1.2.3.4 в эту зону, нужно дать команду:
{{{
nslookup 4.3.2.1.dnsbl.rymsho.ru
}}}
(обратите внимание: октеты IP-адреса в запросе прописаны в обратном порядке)
Если в ANSWER секции содержатся адреса 127.0.0.2 или 127.0.0.4, то хост внесен в список спамерских (127.0.0.2) либо динамических IP-адресов (127.0.0.4)
Если ANSWER секция возвращает статус NXDOMAIN. значит этот хост в список спамерских не внесен.

Кроме того, в зону dnsbl.rymsho.ru вносятся (и письма с них на наши почтовые ящики, естественно, не доставляются) хосты, у которых либо не существует обратной DNS записи, либо эта запись поддельная, то есть указывает на совсем другой хост.
Если у меня (точнее, у моего антиспам-робота) есть основания считать, что никакого легитимного почтового сервера на стороне отправителя нет (другими словами, RDNS запрос возвращает невразумительное FQDN имя, с большим количеством групп цифр) -- то и в этом случае почта не принимается, а IP адрес отправителя заносится в dnsbl.rymsho.ru. Извините.

Обычно попавший в мой dnsbl-список адрес живёт в нём 6 недель, после чего, если с этого адреса не было повторных попыток отправить мне спам, автоматически из него удаляется. Иначе -- 6-недельный срок начинает отсчитываться с момента последней попытки отправить мне с этого адреса спам.

Если у меня есть основания считать Ваш адрес динамическим, то он из списка не удаляется никогда. По крайней мере, до тех пор, пока Вы не убедите меня в обратном (то есть в том, что адрес является статическим и на нем существует вполне легитимный почтовый сервер)

Если Вы считаете, что Ваш хост попал в этот "чёрный список" по ошибке: [[напишите мне|Контакты]], будем разбираться.
Настройка проверки Вашим сервером списка dnsbl.home.rymsho.ru -- такая же, как и проверки других "чёрных списков" основанных на dnsbl

Если Вы используете в качестве почтового сервера программу sendmail, просто добавьте в файл /etc/mail/sendmail.mc строчку:
{{{
FEATURE(`dnsbl', `dnsbl.rymsho.ru', `Spam blocked - see http://spam.rymsho.ru.')dnl
}}}
и перезапустите почтовый сервер. В случае, если Вы используете другой почтовый сервер - обратитесь к его документации.
В этот "чёрный список" я заношу IP-адреса, с которых спамеры пытаются отправить спам на мой почтовый сервер. Обычно у них ничего не получается, но информация об этих попытках остаётся в логах сервера. Время от времени просматривая логи, я решаю, обновлять ли мне этот список или нет.

Этот список никоим образом не является //заменой// других аналогичных списков, для этого он слишком мал. Скорее, его нужно рассматривать как //дополнение// к другим спискам. Я стараюсь не перегружать его дублированием информации из других используемых мной "чёрных списков".
В [[rhsbl.home.rymsho.ru]] я вношу домены, относительно которых я имею твёрдую убежденнность в том, что эти домены принадлежат спамерам. Вероятность того, что кто-либо когда-либо получал с этих доменов нормальную почту, равна нулю.
В силу очень особенной формы моих рук я так и не сумел прикрутить этот RHSBL к своему sendmail, поэтому для фильтрации по имени домена я также использую файл /etc/mail/access, чего и вам желаю.
К сожалению, у меня не получилось настроить sendmail для того, чтобы он мог использовать этот "чёрный список", и у меня этой цели служит файл /etc/mail/access. Однако, не пропадать же добру!
Поэтому те из вас, кто использует для фильтрации своей почты пакет milter-greylist, смогут без труда использовать этот список. Если, конечно, захотят.
Этот список исторически создавался для борьбы с одним спамером, который весной 2010 года смог "пробить" мою самую первую защиту от спама, состоящую из milter-greylist-а и пары "чёрных списков". Всё дело было в том, что этот спамер рассылал всякую ерунду с использованием не спамерского почтового софта, а вполне нормальных почтовых программ, с очередями отправки и всяким таким. Поэтому грейлистинг против него не работал, а дырявые почтовые серверы он умеет находить и использовать явно быстрее, чем адреса этих серверов попадали в "чёрные списки". Единственным способом защититься от этого спама было -- найти уязвимость в его подходе к рассылке спама.
Уязвимость оказалась достаточно очевидной -- поэтому таким же очевидным способом борьбы с ней оказался этот список.
Если Вы попали на этот сайт потому, что получили сообщение об ошибке приёма почты, в котором упоминался этот сайт, то это произошло по одной из двух причин:
*скорее всего, это произошло потому, что с Вашего IP-адреса когда-то приходил спам. Это не значит, что Вы - спамер, возможно, Ваш хост просто является частью спамерского ботнета, поскольку Вы не уделяли должного внимания компьютерной безопасности.
*это могло произойти и потому, что у меня есть основания полагать, что IP-адрес использованного Вами почтового сервера является динамическим. Я не хочу получать почту с серверов, расположенных на динамических IP-адресах и полагаю, что это нежелание разделяют очень многие. Если провайдер выдаёт Вам динамический адрес, Вы должны для отправки почты использовать почтовый сервер Вашего провайдера.

В любом случае, если Вы считаете, что Вашу почту заблокировали несправедливо, Вы всегда можете [[связаться со мной|Контакты]] и попытаться решить этот вопрос. Главное, что от Вас при этом требуется -- это использовать для отправки почты ко мне легитимные почтовые сервера. И при написании сообщения имейте в виду: я не блокирую Вашу исходящую почту. Её блокирует принимающий почтовый сервер, администратор которого считает, что [[dnsbl.rymsho.ru]], который я поддерживаю, является достойным для использования в качестве одного из почтовых фильтров.

Если же Вы просто так зашли сюда в гости -- добро пожаловать!
Хотя набора "чёрных списков" для защиты почтового сервера от спама обычно бывает достаточно, в некоторых случаях могут потребоваться дополнительные средства защиты. Здесь, прежде всего, я бы порекомендовал организацию "серых списков" (наиболее известен [[milter-greylist|http://hcpnet.free.fr/milter-greylist/]], но возможны и другие реализации этой технологии).
Комбинация "серых" и "чёрных" списков может быть гораздо более действенной, чем использование этих технологий по отдельности.

Связаться со мной можно по [[этому адресу|mailto:ivan@rymsho.ru]] электронной почты.
Если Ваше письмо не является спамом, то оно обязательно до меня дойдёт, и я с удовольствием его прочитаю и, возможно, даже отвечу.
Наряду с блокировкой спамерских [[доменов|файл access]] действенным средством против спама является блокировка спамеров по ip-адресу. Самый простой способ для этой блокировки - подключение "черных списков" этих адресов.
Главная сложность в использовании этих списков -- правильный подбор таких списков. 

Первая проблема заключается в том, что одного списка для эффективного противодействия спаму явно недостаточно. Если же этих списков будет слишком много, то это повлияет на производительность сервера.

Вторая проблема -- это выбор "правильных" чёрных списков, поскольку политика ведения этих списков должна быть достаточно адекватна во избежание ложных срабатываний (т.е. когда ожидаемое Вами письмо отвергается как спам).

Я использую достаточно ограниченный (и в то же время весьма эффективный) набор этих "чёрных списков". Чтобы подключить его, достаточно добавить в файл /etc/mail/sendmail.mc (напомню: в качестве почтового сервера я использую пакет //sendmail// ) следующие строки:
{{{
dnl # Anti-Spam Blacklists:
FEATURE(`dnsbl', `zen.spamhaus.org', `Spam blocked - see http://zen.spamhaus.org')dnl
FEATURE(`dnsbl', `b.barracudacentral.org', `Spam blocked - see:http://www.barracudacentral.org')dnl
FEATURE(`dnsbl', `korea.services.net', `Spam blocked - see http://korea.services.net')dnl
FEATURE(`dnsbl', `no-more-funn.moensted.dk',`"Spam blocked - see http://moensted.dk/spam/no-more-funn"')dnl
FEATURE(`dnsbl', `all.spamrats.com', `Spam blocked - see http://www.spamrats.com')dnl
FEATURE(`dnsbl', `bl.spamcop.net', `Spam blocked - see:http://spamcop.net')dnl
FEATURE(`dnsbl', `dnsbl.sorbs.net',`"554 Rejected " $&{client_addr} " found in dnsbl.sorbs.net"')dnl
FEATURE(`dnsbl', `dnsbl-1.uceprotect.net', `Spam blocked - see http://dnsbl-1.uceprotect.net')dnl
FEATURE(`dnsbl', `dnsbl-2.uceprotect.net', `Spam blocked - see http://dnsbl-2.uceprotect.net')dnl
}}}
и перезагрузить почтовый сервер.

Для "большей лучшести" туда же можно [[добавить|dnsbl-set]] ещё один "чёрный список", который веду я.
Как ни странно, этот список у меня тоже регулярно (в среднем 5-7 раз в день) срабатывает, хотя записей в нем совсем немного.
Мой опыт показывает, что для того, чтобы избавляться от 98% приходящего спама (и при этом не терять письма, спамом не являющиеся), достаточно использовать только "чёрные списки" спамерских IP-адресов, так называемых dnsbl  (здесь важен грамотный подбор таких списков). Если Вас напрягают остающиеся 2%, то от них можно избавляться настройкой черных списков спамерских доменов (так называемые rhsbl, Right Hand Side Black List)  и настройкой  грейлистинга. 

Впрочем, грейлистинг -- решение достаточно спорное, поскольку он увеличивает нагрузку на почтовый сервер отправителя и увеличивает время получения писем получателем. Тем не менее, комбинация грейлистинга и блеклистинга может приводить к совершенно замечательным результатам, когда практически ''ни одно'' письмо от спамеров не достигает даже Вашего почтового сервера. Да я и сам однажды решил, что эти задержки в получении почты мне не нужны -- и отказался от грейлистинга. Пока жалеть об этом отказе мне не приходится

Вышеперечисленных средств, повторюсь, бывает вполне достаточно для достижения поставленной цели. Такие средства борьбы со спамом, как ''spamassassin'' я не использую по одной весьма приятной для меня причине: спамассасин -- это эффективное и обучаемое средство борьбы со спамом, но обучать его мне совершенно не на чем: спам до моего сервера практически не доходит, два-три письма в месяц - объем явно недостаточный для натаскивания этого самого ассасина.

Таким образом, настройка почтового сервера состоит из двух этапов. Необходимо:
*Настроить почтовый сервер так, чтобы он не принимал почту от [[спамерских доменов|файл access]]
*Настроить [[dnsbl|Настройка dnsbl]]
Здесь мог бы быть осмысленный текст на тему 'Новая запись'
Здесь мог бы быть осмысленный текст на тему 'Новый текстt'
Я не люблю спам, как и большинство других интернет-пользователей.

Более того, я считаю рассылку спама занятием, вредным и для самих спамеров. Поскольку энергия, затраченная спамером на своё бесполезное занятие, будучи приложенной в более полезном направлении, могла бы принести гораздо больше пользы и ему, и окружающим.

Кроме того, именно спам затрудняет тем, кому интересно системное администрирование, настройку своих собственных почтовых серверов. Какой интерес настраивать этот самый сервер, если уже через очень короткое время 99% попадающей на него почты является спамом?
Цель этого небольшого сайтика - оказание посильной помощи в настройках почтового сервера, предназначенных именно для борьбы со спамом. В качестве такого сервера я использую sendmail, но каждый из Вас вправе выбрать такой, который больше всего нравится именно Вам. Предлагаемые здесь решения являются достаточно универсальными, и //возможность// их реализации не зависит от конкретного почтового агента,
Часть поступающего на Ваш почтовый сервер спама можно отсечь, используя явно спамерский адрес (точнее, домен) отправителя.

Если Вы используете в качестве почтового сервера //sendmail//, то самый простой способ это сделать - это редактировать файл /etc/mail/access
Я рекомендую добавить в этот файл такой фрагмент:
{{{
## Blacklist of domains
From:abapost.ru				REJECT
From:abcsem.ru				REJECT
From:abgmail.ru				REJECT
From:activeprodaza.ru			REJECT
From:agalist.ru				REJECT
From:antionempty.ru			REJECT
From:begunsales.ru			REJECT
From:bingogo.ru				REJECT
From:bitadir.ru				REJECT
From:center-vvc.ru			REJECT
From:cimapost.ru			REJECT
From:cssmail.ru				REJECT
From:ctcuser.ru				REJECT
From:dskmail.ru				REJECT
From:edubank.ru				REJECT
From:edufast.ru				REJECT
From:edupost.ru				REJECT
From:emtypost.ru			REJECT
From:fastclient.ru			REJECT
From:felixmail.ru			REJECT
From:fti-mail.ru                        REJECT
From:gfvideo.ru				REJECT
From:gogomail.ru			REJECT
From:holdinginform.ru			REJECT
From:holdingmail.ru			REJECT
From:inboxlist.ru			REJECT
From:inform-ttk.ru			REJECT
From:intelekting.ru			REJECT
From:jomail.ru				REJECT
From:kookmail.ru			REJECT
From:line-line.ru			REJECT
From:list-informer.ru			REJECT
From:listseminarov.ru			REJECT
From:ltdvag.ru				REJECT
From:mail495.ru				REJECT
From:maileducation.ru			REJECT
From:mgk-story.ru			REJECT
From:msgidmail.ru			REJECT
From:mskeducation.ru			REJECT
From:mtt-master.ru			REJECT
From:nbvcxz.ru				REJECT
From:nicepost.ru			REJECT
From:optimcons.ru			REJECT
From:orangepost.ru			REJECT
From:pacpic.ru				REJECT
From:peoplesem.ru			REJECT
From:repubexe.ru			REJECT
From:school-sale.ru			REJECT
From:season2010.ru			REJECT
From:secondmail.ru			REJECT
From:seminarok.ru			REJECT
From:semmail.ru				REJECT
From:solomessage.ru			REJECT
From:stkpost.ru				REJECT
From:tiguasi.ru				REJECT
From:udumail.ru				REJECT
From:uprmail.ru				REJECT
From:upshel.ru				REJECT
From:vaiomay.ru				REJECT
From:vedinformer.ru			REJECT
From:vedinfostat.ru			REJECT
From:vianliga.ru			REJECT
From:worldwidemail.ru			REJECT
From:worldedumail.ru			REJECT
From:wsewomail.ru			REJECT
From:zaomail.ru				REJECT
From:broklinpole.ru			REJECT
From:coperfilus.ru			REJECT
From:domoswery.ru			REJECT
From:gi-group.ru			REJECT
From:nicelist.ru			REJECT
}}}

Почему я считаю перечисленные выше домены спамерскими? Ответ прост:
*потому что с этих доменов валится спам, зачастую неотлавливаемый с помощью блеклистинга: этот спамер (или эти спамеры) слишком аккуратны, чтобы попадать в автоматические черные списки;
*потому что с этих доменов ничего, кроме спама, валиться и не может. Поизучайте эти домены командами dig TXT (на предмет SPF-настроек) и whois (на предмет совпадающих параметров), попробуйте открыть принадлежащие этим доменам сайты... понятно, что ни один из увиденных Вами признаков не является доказательством того, что домен принадлежит спамеру, но вот все эти признаки в совокупности -- очень даже являются;
*потому что жалобы администраторам этих доменов либо попросту не доходят до получателей, либо игнорируются ими. Достаточно?

Другой способ блокировки спамерских доменных адресов - блокировка с использованием rhsbl, если Вавш почтовый сервер позволяет это. Я веду файл [[rhsbl.home.rymsho.ru]], информация в котором дублирует вышеприведённую и оперативно пополняется.