tiddlywiki_cp 0.4.1 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +6 -0
- data/Manifest.txt +3 -2
- data/README.txt +4 -0
- data/Rakefile +1 -0
- data/lib/tiddlywiki_cp/r4tw.rb +68 -3
- data/lib/tiddlywiki_cp/version.rb +1 -1
- data/lib/tiddlywiki_cp.rb +15 -0
- data/test/content/tiddly_version_2_3.txt +1 -0
- data/test/test_tiddlywiki_cp.rb +68 -2
- data/website/files/ChangeLog.tiddler +86 -1
- data/website/files/DefaultTiddlers.tiddler +2 -2
- data/website/files/Introduction.tiddler +21 -3
- data/website/files/Usage.tiddler +14 -0
- data/website/files/WebDavPlugin.js +310 -0
- data/website/files/WebDavPlugin.js.div +1 -0
- data/website/index.html +1891 -1395
- metadata +6 -4
- data/website/files/WebDAVSavingPlugin.js +0 -234
- data/website/files/WebDAVSavingPlugin.js.div +0 -1
    
        data/website/index.html
    CHANGED
    
    | @@ -3,7 +3,7 @@ | |
| 3 3 | 
             
            <head>
         | 
| 4 4 | 
             
            <script type="text/javascript">
         | 
| 5 5 | 
             
            //<![CDATA[
         | 
| 6 | 
            -
            var version = {title: "TiddlyWiki", major: 2, minor:  | 
| 6 | 
            +
            var version = {title: "TiddlyWiki", major: 2, minor: 3, revision: 0, date: new Date("Dec 4, 2007"), extensions: {}};
         | 
| 7 7 | 
             
            //]]>
         | 
| 8 8 | 
             
            </script>
         | 
| 9 9 | 
             
            <!--
         | 
| @@ -36,13 +36,15 @@ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | |
| 36 36 | 
             
            ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
         | 
| 37 37 | 
             
            DAMAGE.
         | 
| 38 38 | 
             
            -->
         | 
| 39 | 
            -
            <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
         | 
| 39 | 
            +
            <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
         | 
| 40 40 | 
             
            <!--PRE-HEAD-START-->
         | 
| 41 41 | 
             
            <!--{{{-->
         | 
| 42 42 | 
             
            <link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'/>
         | 
| 43 43 | 
             
            <!--}}}-->
         | 
| 44 44 | 
             
            <!--PRE-HEAD-END-->
         | 
| 45 | 
            -
            <title> | 
| 45 | 
            +
            <title>
         | 
| 46 | 
            +
            TiddlyWiki - a reusable non-linear personal web notebook
         | 
| 47 | 
            +
            </title>
         | 
| 46 48 | 
             
            <style type="text/css">
         | 
| 47 49 | 
             
            #saveTest {display:none;}
         | 
| 48 50 | 
             
            #messageArea {display:none;}
         | 
| @@ -53,12 +55,10 @@ DAMAGE. | |
| 53 55 | 
             
            #javascriptWarning {width:100%; text-align:center; font-weight:bold; background-color:#dd1100; color:#fff; padding:1em 0em;}
         | 
| 54 56 | 
             
            </style>
         | 
| 55 57 | 
             
            <!--POST-HEAD-START-->
         | 
| 56 | 
            -
             | 
| 57 58 | 
             
            <!--POST-HEAD-END-->
         | 
| 58 59 | 
             
            </head>
         | 
| 59 60 | 
             
            <body onload="main();" onunload="if(window.checkUnsavedChanges) checkUnsavedChanges(); if(window.scrubNodes) scrubNodes(document.body);">
         | 
| 60 61 | 
             
            <!--PRE-BODY-START-->
         | 
| 61 | 
            -
             | 
| 62 62 | 
             
            <!--PRE-BODY-END-->
         | 
| 63 63 | 
             
            <div id="copyright">
         | 
| 64 64 | 
             
            Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
         | 
| @@ -76,6 +76,11 @@ Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa As | |
| 76 76 | 
             
            <div id="contentWrapper"></div>
         | 
| 77 77 | 
             
            <div id="contentStash"></div>
         | 
| 78 78 | 
             
            <div id="shadowArea">
         | 
| 79 | 
            +
            <div title="MarkupPreHead">
         | 
| 80 | 
            +
            <pre><!--{{{-->
         | 
| 81 | 
            +
            <link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'/>
         | 
| 82 | 
            +
            <!--}}}--></pre>
         | 
| 83 | 
            +
            </div>
         | 
| 79 84 | 
             
            <div title="ColorPalette">
         | 
| 80 85 | 
             
            <pre>Background: #fff
         | 
| 81 86 | 
             
            Foreground: #000
         | 
| @@ -137,7 +142,7 @@ h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];} | |
| 137 142 | 
             
            .wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
         | 
| 138 143 | 
             
            .wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
         | 
| 139 144 | 
             
            	border:1px solid [[ColorPalette::PrimaryMid]];}
         | 
| 140 | 
            -
            .wizardStep.wizardStepDone {background | 
| 145 | 
            +
            .wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
         | 
| 141 146 | 
             
            .wizardFooter {background:[[ColorPalette::PrimaryPale]];}
         | 
| 142 147 | 
             
            .wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
         | 
| 143 148 | 
             
            .wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
         | 
| @@ -400,27 +405,21 @@ table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px | |
| 400 405 | 
             
            <div title="StyleSheetLocale">
         | 
| 401 406 | 
             
            <pre>/***
         | 
| 402 407 | 
             
            StyleSheet for use when a translation requires any css style changes.
         | 
| 403 | 
            -
            This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which  | 
| 408 | 
            +
            This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
         | 
| 404 409 | 
             
            ***/
         | 
| 405 | 
            -
             | 
| 406 410 | 
             
            /*{{{*/
         | 
| 407 411 | 
             
            body {font-size:0.8em;}
         | 
| 408 | 
            -
             | 
| 409 412 | 
             
            #sidebarOptions {font-size:1.05em;}
         | 
| 410 413 | 
             
            #sidebarOptions a {font-style:normal;}
         | 
| 411 414 | 
             
            #sidebarOptions .sliderPanel {font-size:0.95em;}
         | 
| 412 | 
            -
             | 
| 413 415 | 
             
            .subtitle {font-size:0.8em;}
         | 
| 414 | 
            -
             | 
| 415 416 | 
             
            .viewer table.listView {font-size:0.95em;}
         | 
| 416 | 
            -
             | 
| 417 | 
            -
            .htmlarea .toolbarHA table {border:1px solid ButtonFace; margin:0em 0em;}
         | 
| 418 417 | 
             
            /*}}}*/</pre>
         | 
| 419 418 | 
             
            </div>
         | 
| 420 419 | 
             
            <div title="StyleSheetPrint">
         | 
| 421 420 | 
             
            <pre>/*{{{*/
         | 
| 422 421 | 
             
            @media print {
         | 
| 423 | 
            -
            #mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton {display: none ! important;}
         | 
| 422 | 
            +
            #mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
         | 
| 424 423 | 
             
            #displayArea {margin: 1em 1em 0em 1em;}
         | 
| 425 424 | 
             
            /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
         | 
| 426 425 | 
             
            noscript {display:none;}
         | 
| @@ -493,14 +492,107 @@ Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs) | |
| 493 492 | 
             
            ----
         | 
| 494 493 | 
             
            Also see AdvancedOptions</pre>
         | 
| 495 494 | 
             
            </div>
         | 
| 495 | 
            +
            <div title="ImportTiddlers">
         | 
| 496 | 
            +
            <pre><<importTiddlers>></pre>
         | 
| 497 | 
            +
            </div>
         | 
| 496 498 | 
             
            </div>
         | 
| 497 499 | 
             
            <!--POST-SHADOWAREA-->
         | 
| 498 500 | 
             
            <div id="storeArea">
         | 
| 499 | 
            -
            <div title="ChangeLog" modifier="loic" modified=" | 
| 501 | 
            +
            <div title="ChangeLog" modifier="loic" modified="200804062225" created="200707211630" changecount="1">
         | 
| 500 502 | 
             
            <pre>{{{
         | 
| 501 | 
            -
            changeset:    | 
| 503 | 
            +
            changeset:   77:5e92b7ebcd70
         | 
| 502 504 | 
             
            tag:         tip
         | 
| 503 505 | 
             
            user:        root@dachary.org
         | 
| 506 | 
            +
            date:        Fri Apr 04 14:17:09 2008 +0000
         | 
| 507 | 
            +
            summary:     update plugin name
         | 
| 508 | 
            +
             | 
| 509 | 
            +
            changeset:   76:b1a11d62dce4
         | 
| 510 | 
            +
            user:        root@dachary.org
         | 
| 511 | 
            +
            date:        Fri Apr 04 14:04:08 2008 +0000
         | 
| 512 | 
            +
            summary:     upgrade website to tw-2.3 and newer davplugin
         | 
| 513 | 
            +
             | 
| 514 | 
            +
            changeset:   75:fb74e9bc08d4
         | 
| 515 | 
            +
            user:        root@dachary.org
         | 
| 516 | 
            +
            date:        Fri Apr 04 13:42:01 2008 +0000
         | 
| 517 | 
            +
            summary:     update documentation
         | 
| 518 | 
            +
             | 
| 519 | 
            +
            changeset:   74:0dc051395239
         | 
| 520 | 
            +
            user:        root@dachary.org
         | 
| 521 | 
            +
            date:        Fri Apr 04 13:36:13 2008 +0000
         | 
| 522 | 
            +
            summary:     update documentation for 0.5.0
         | 
| 523 | 
            +
             | 
| 524 | 
            +
            changeset:   73:dddb2fc4bbca
         | 
| 525 | 
            +
            user:        root@dachary.org
         | 
| 526 | 
            +
            date:        Fri Apr 04 13:01:52 2008 +0000
         | 
| 527 | 
            +
            summary:     0.5.0 release ready
         | 
| 528 | 
            +
             | 
| 529 | 
            +
            changeset:   72:7290595266bb
         | 
| 530 | 
            +
            user:        root@dachary.org
         | 
| 531 | 
            +
            date:        Fri Apr 04 12:59:23 2008 +0000
         | 
| 532 | 
            +
            summary:     documentation for lang support
         | 
| 533 | 
            +
             | 
| 534 | 
            +
            changeset:   71:86e046e659af
         | 
| 535 | 
            +
            user:        root@dachary.org
         | 
| 536 | 
            +
            date:        Fri Apr 04 12:52:12 2008 +0000
         | 
| 537 | 
            +
            summary:     test file for tw 2.3
         | 
| 538 | 
            +
             | 
| 539 | 
            +
            changeset:   70:301346066b75
         | 
| 540 | 
            +
            user:        root@dachary.org
         | 
| 541 | 
            +
            date:        Fri Apr 04 10:36:24 2008 +0000
         | 
| 542 | 
            +
            summary:     update lang tags
         | 
| 543 | 
            +
             | 
| 544 | 
            +
            changeset:   69:7c7f3d279c28
         | 
| 545 | 
            +
            user:        root@dachary.org
         | 
| 546 | 
            +
            date:        Fri Apr 04 07:11:49 2008 +0000
         | 
| 547 | 
            +
            summary:     test tw-2.3 version detection
         | 
| 548 | 
            +
             | 
| 549 | 
            +
            changeset:   68:e635348a3352
         | 
| 550 | 
            +
            user:        root@dachary.org
         | 
| 551 | 
            +
            date:        Thu Apr 03 15:43:32 2008 +0000
         | 
| 552 | 
            +
            summary:     generate index.html with website_generate target
         | 
| 553 | 
            +
             | 
| 554 | 
            +
            changeset:   67:dd3534267e3c
         | 
| 555 | 
            +
            user:        root@dachary.org
         | 
| 556 | 
            +
            date:        Thu Apr 03 15:36:56 2008 +0000
         | 
| 557 | 
            +
            summary:     copy Markup* tiddlers to the corresponding zone in the tiddlywiki
         | 
| 558 | 
            +
             | 
| 559 | 
            +
            changeset:   66:740b082f235a
         | 
| 560 | 
            +
            user:        loic@dachary.org
         | 
| 561 | 
            +
            date:        Thu Apr 03 09:29:57 2008 +0000
         | 
| 562 | 
            +
            summary:     apt-get install ruby-elisp
         | 
| 563 | 
            +
             | 
| 564 | 
            +
            changeset:   65:47688556400d
         | 
| 565 | 
            +
            user:        root@dachary.org
         | 
| 566 | 
            +
            date:        Thu Apr 03 09:29:16 2008 +0000
         | 
| 567 | 
            +
            summary:     bump to version 0.5.0
         | 
| 568 | 
            +
             | 
| 569 | 
            +
            changeset:   64:3544bb17985c
         | 
| 570 | 
            +
            user:        root@dachary.org
         | 
| 571 | 
            +
            date:        Thu Apr 03 08:58:43 2008 +0000
         | 
| 572 | 
            +
            summary:     fix invalid regexp including {
         | 
| 573 | 
            +
             | 
| 574 | 
            +
            changeset:   63:13476d79f633
         | 
| 575 | 
            +
            user:        root@dachary.org
         | 
| 576 | 
            +
            date:        Thu Apr 03 08:44:20 2008 +0000
         | 
| 577 | 
            +
            summary:     update SimonBaird work local copy
         | 
| 578 | 
            +
             | 
| 579 | 
            +
            changeset:   62:dfdfb30ccb97
         | 
| 580 | 
            +
            user:        root@dachary.org
         | 
| 581 | 
            +
            date:        Mon Mar 31 21:08:17 2008 +0000
         | 
| 582 | 
            +
            summary:     sync with SimonBaird version : systemServer replaces contentPublisher
         | 
| 583 | 
            +
             | 
| 584 | 
            +
            changeset:   61:73d453e23b5d
         | 
| 585 | 
            +
            user:        root@dachary.org
         | 
| 586 | 
            +
            date:        Sun Mar 30 21:29:40 2008 +0000
         | 
| 587 | 
            +
            summary:     release information and web site
         | 
| 588 | 
            +
             | 
| 589 | 
            +
            changeset:   60:4177e4981005
         | 
| 590 | 
            +
            user:        root@dachary.org
         | 
| 591 | 
            +
            date:        Sun Mar 30 21:18:27 2008 +0000
         | 
| 592 | 
            +
            summary:     remove extra SimonBaird files
         | 
| 593 | 
            +
             | 
| 594 | 
            +
            changeset:   59:6751afe5b8e2
         | 
| 595 | 
            +
            user:        root@dachary.org
         | 
| 504 596 | 
             
            date:        Sun Mar 30 20:58:00 2008 +0000
         | 
| 505 597 | 
             
            summary:     tw 2.3 to 2.9 compatibility
         | 
| 506 598 |  | 
| @@ -805,331 +897,776 @@ summary:     initial | |
| 805 897 | 
             
            }}}
         | 
| 806 898 | 
             
            </pre>
         | 
| 807 899 | 
             
            </div>
         | 
| 808 | 
            -
            <div title=" | 
| 809 | 
            -
            <pre | 
| 810 | 
            -
             | 
| 811 | 
            -
             | 
| 812 | 
            -
             | 
| 813 | 
            -
             | 
| 900 | 
            +
            <div title="CryptoFunctionsPlugin" modifier="" created="200710115934" tags="systemConfig excludeLists excludeSearch">
         | 
| 901 | 
            +
            <pre>/***
         | 
| 902 | 
            +
            |''Name:''|CryptoFunctionsPlugin|
         | 
| 903 | 
            +
            |''Description:''|Support for cryptographic functions|
         | 
| 904 | 
            +
            ***/
         | 
| 905 | 
            +
            //{{{
         | 
| 906 | 
            +
            if(!version.extensions.CryptoFunctionsPlugin) {
         | 
| 907 | 
            +
            version.extensions.CryptoFunctionsPlugin = {installed:true};
         | 
| 814 908 |  | 
| 815 | 
            -
             | 
| 909 | 
            +
            //--
         | 
| 910 | 
            +
            //-- Crypto functions and associated conversion routines
         | 
| 911 | 
            +
            //--
         | 
| 816 912 |  | 
| 817 | 
            -
             | 
| 818 | 
            -
            { | 
| 819 | 
            -
            tiddlywiki_cp 'http://tiddlylab.bidix.info/#WebDAVSavingPlugin' website/index.html
         | 
| 820 | 
            -
            tiddlywiki_cp -a website/index.html website/files
         | 
| 821 | 
            -
            ( echo '{{''{' ; RUBYLIB=lib ruby bin/tiddlywiki_cp --help ; echo '}}''}' ) > website/files/Usage
         | 
| 822 | 
            -
            tiddlywiki_cp -a website/files website/index.html
         | 
| 823 | 
            -
            }}}
         | 
| 824 | 
            -
            Loic Dachary <mailto:loic@dachary.org>
         | 
| 825 | 
            -
            </pre>
         | 
| 826 | 
            -
            </div>
         | 
| 827 | 
            -
            <div title="MainMenu" modifier="loic" modified="200707231424" created="200707211619" changecount="2">
         | 
| 828 | 
            -
            <pre>[[Introduction]]
         | 
| 829 | 
            -
            [[Usage]]
         | 
| 830 | 
            -
            [[ChangeLog]]
         | 
| 831 | 
            -
            </pre>
         | 
| 832 | 
            -
            </div>
         | 
| 833 | 
            -
            <div title="SiteSubtitle" modifier="loic" modified="200707231424" created="200707211618" changecount="1">
         | 
| 834 | 
            -
            <pre>copy tiddlers to files and vice versa</pre>
         | 
| 835 | 
            -
            </div>
         | 
| 836 | 
            -
            <div title="SiteTitle" modifier="loic" modified="200707231424" created="200707211617" changecount="1">
         | 
| 837 | 
            -
            <pre>tiddlywiki_cp</pre>
         | 
| 838 | 
            -
            </div>
         | 
| 839 | 
            -
            <div title="Usage" modifier="loic" modified="200803302106" created="200707211620" changecount="1">
         | 
| 840 | 
            -
            <pre>{{{
         | 
| 841 | 
            -
            Usage: tiddlywiki_cp [options] FROM [FROM ...] TO|-
         | 
| 913 | 
            +
            // Crypto "namespace"
         | 
| 914 | 
            +
            function Crypto() {}
         | 
| 842 915 |  | 
| 843 | 
            -
             | 
| 844 | 
            -
             | 
| 845 | 
            -
             | 
| 846 | 
            -
             | 
| 847 | 
            -
             | 
| 848 | 
            -
             | 
| 849 | 
            -
             | 
| 850 | 
            -
             | 
| 851 | 
            -
             | 
| 852 | 
            -
             | 
| 853 | 
            -
             | 
| 854 | 
            -
             | 
| 855 | 
            -
             | 
| 856 | 
            -
             | 
| 857 | 
            -
             | 
| 916 | 
            +
            // Convert a string to an array of big-endian 32-bit words
         | 
| 917 | 
            +
            Crypto.strToBe32s = function(str)
         | 
| 918 | 
            +
            {
         | 
| 919 | 
            +
            	var be = Array();
         | 
| 920 | 
            +
            	var len = Math.floor(str.length/4);
         | 
| 921 | 
            +
            	var i, j;
         | 
| 922 | 
            +
            	for(i=0, j=0; i<len; i++, j+=4) {
         | 
| 923 | 
            +
            		be[i] = ((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff);
         | 
| 924 | 
            +
            	}
         | 
| 925 | 
            +
            	while (j<str.length) {
         | 
| 926 | 
            +
            		be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32);
         | 
| 927 | 
            +
            		j++;
         | 
| 928 | 
            +
            	}
         | 
| 929 | 
            +
            	return be;
         | 
| 930 | 
            +
            };
         | 
| 858 931 |  | 
| 859 | 
            -
             | 
| 932 | 
            +
            // Convert an array of big-endian 32-bit words to a string
         | 
| 933 | 
            +
            Crypto.be32sToStr = function(be)
         | 
| 934 | 
            +
            {
         | 
| 935 | 
            +
            	var str = "";
         | 
| 936 | 
            +
            	for(var i=0;i<be.length*32;i+=8)
         | 
| 937 | 
            +
            		str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff);
         | 
| 938 | 
            +
            	return str;
         | 
| 939 | 
            +
            };
         | 
| 860 940 |  | 
| 861 | 
            -
             | 
| 862 | 
            -
             | 
| 863 | 
            -
             | 
| 864 | 
            -
             | 
| 865 | 
            -
             | 
| 866 | 
            -
             | 
| 867 | 
            -
             | 
| 868 | 
            -
             | 
| 869 | 
            -
             | 
| 870 | 
            -
                   /tmp/a/OwnStyle.css.div
         | 
| 871 | 
            -
                   ...
         | 
| 941 | 
            +
            // Convert an array of big-endian 32-bit words to a hex string
         | 
| 942 | 
            +
            Crypto.be32sToHex = function(be)
         | 
| 943 | 
            +
            {
         | 
| 944 | 
            +
            	var hex = "0123456789ABCDEF";
         | 
| 945 | 
            +
            	var str = "";
         | 
| 946 | 
            +
            	for(var i=0;i<be.length*4;i++)
         | 
| 947 | 
            +
            		str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF);
         | 
| 948 | 
            +
            	return str;
         | 
| 949 | 
            +
            };
         | 
| 872 950 |  | 
| 873 | 
            -
             | 
| 874 | 
            -
             | 
| 951 | 
            +
            // Return, in hex, the SHA-1 hash of a string
         | 
| 952 | 
            +
            Crypto.hexSha1Str = function(str)
         | 
| 953 | 
            +
            {
         | 
| 954 | 
            +
            	return Crypto.be32sToHex(Crypto.sha1Str(str));
         | 
| 955 | 
            +
            };
         | 
| 875 956 |  | 
| 876 | 
            -
             | 
| 877 | 
            -
             | 
| 957 | 
            +
            // Return the SHA-1 hash of a string
         | 
| 958 | 
            +
            Crypto.sha1Str = function(str)
         | 
| 959 | 
            +
            {
         | 
| 960 | 
            +
            	return Crypto.sha1(Crypto.strToBe32s(str),str.length);
         | 
| 961 | 
            +
            };
         | 
| 878 962 |  | 
| 879 | 
            -
             | 
| 880 | 
            -
             | 
| 881 | 
            -
             | 
| 963 | 
            +
            // Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
         | 
| 964 | 
            +
            Crypto.sha1 = function(x,blen)
         | 
| 965 | 
            +
            {
         | 
| 966 | 
            +
            	// Add 32-bit integers, wrapping at 32 bits
         | 
| 967 | 
            +
            	add32 = function(a,b)
         | 
| 968 | 
            +
            	{
         | 
| 969 | 
            +
            		var lsw = (a&0xFFFF)+(b&0xFFFF);
         | 
| 970 | 
            +
            		var msw = (a>>16)+(b>>16)+(lsw>>16);
         | 
| 971 | 
            +
            		return (msw<<16)|(lsw&0xFFFF);
         | 
| 972 | 
            +
            	};
         | 
| 973 | 
            +
            	// Add five 32-bit integers, wrapping at 32 bits
         | 
| 974 | 
            +
            	add32x5 = function(a,b,c,d,e)
         | 
| 975 | 
            +
            	{
         | 
| 976 | 
            +
            		var lsw = (a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF);
         | 
| 977 | 
            +
            		var msw = (a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16);
         | 
| 978 | 
            +
            		return (msw<<16)|(lsw&0xFFFF);
         | 
| 979 | 
            +
            	};
         | 
| 980 | 
            +
            	// Bitwise rotate left a 32-bit integer by 1 bit
         | 
| 981 | 
            +
            	rol32 = function(n)
         | 
| 982 | 
            +
            	{
         | 
| 983 | 
            +
            		return (n>>>31)|(n<<1);
         | 
| 984 | 
            +
            	};
         | 
| 882 985 |  | 
| 883 | 
            -
             | 
| 884 | 
            -
             | 
| 986 | 
            +
            	var len = blen*8;
         | 
| 987 | 
            +
            	// Append padding so length in bits is 448 mod 512
         | 
| 988 | 
            +
            	x[len>>5] |= 0x80 << (24-len%32);
         | 
| 989 | 
            +
            	// Append length
         | 
| 990 | 
            +
            	x[((len+64>>9)<<4)+15] = len;
         | 
| 991 | 
            +
            	var w = Array(80);
         | 
| 885 992 |  | 
| 886 | 
            -
             | 
| 887 | 
            -
             | 
| 993 | 
            +
            	var k1 = 0x5A827999;
         | 
| 994 | 
            +
            	var k2 = 0x6ED9EBA1;
         | 
| 995 | 
            +
            	var k3 = 0x8F1BBCDC;
         | 
| 996 | 
            +
            	var k4 = 0xCA62C1D6;
         | 
| 888 997 |  | 
| 889 | 
            -
             | 
| 890 | 
            -
             | 
| 998 | 
            +
            	var h0 = 0x67452301;
         | 
| 999 | 
            +
            	var h1 = 0xEFCDAB89;
         | 
| 1000 | 
            +
            	var h2 = 0x98BADCFE;
         | 
| 1001 | 
            +
            	var h3 = 0x10325476;
         | 
| 1002 | 
            +
            	var h4 = 0xC3D2E1F0;
         | 
| 891 1003 |  | 
| 892 | 
            -
             | 
| 893 | 
            -
             | 
| 894 | 
            -
             | 
| 1004 | 
            +
            	for(var i=0;i<x.length;i+=16) {
         | 
| 1005 | 
            +
            		var j,t;
         | 
| 1006 | 
            +
            		var a = h0;
         | 
| 1007 | 
            +
            		var b = h1;
         | 
| 1008 | 
            +
            		var c = h2;
         | 
| 1009 | 
            +
            		var d = h3;
         | 
| 1010 | 
            +
            		var e = h4;
         | 
| 1011 | 
            +
            		for(j = 0;j<16;j++) {
         | 
| 1012 | 
            +
            			w[j] = x[i+j];
         | 
| 1013 | 
            +
            			t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
         | 
| 1014 | 
            +
            			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
         | 
| 1015 | 
            +
            		}
         | 
| 1016 | 
            +
            		for(j=16;j<20;j++) {
         | 
| 1017 | 
            +
            			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
         | 
| 1018 | 
            +
            			t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
         | 
| 1019 | 
            +
            			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
         | 
| 1020 | 
            +
            		}
         | 
| 1021 | 
            +
            		for(j=20;j<40;j++) {
         | 
| 1022 | 
            +
            			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
         | 
| 1023 | 
            +
            			t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k2);
         | 
| 1024 | 
            +
            			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
         | 
| 1025 | 
            +
            		}
         | 
| 1026 | 
            +
            		for(j=40;j<60;j++) {
         | 
| 1027 | 
            +
            			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
         | 
| 1028 | 
            +
            			t = add32x5(e,(a>>>27)|(a<<5),(b&c)|(d&(b|c)),w[j],k3);
         | 
| 1029 | 
            +
            			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
         | 
| 1030 | 
            +
            		}
         | 
| 1031 | 
            +
            		for(j=60;j<80;j++) {
         | 
| 1032 | 
            +
            			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
         | 
| 1033 | 
            +
            			t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k4);
         | 
| 1034 | 
            +
            			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
         | 
| 1035 | 
            +
            		}
         | 
| 1036 | 
            +
             | 
| 1037 | 
            +
            		h0 = add32(h0,a);
         | 
| 1038 | 
            +
            		h1 = add32(h1,b);
         | 
| 1039 | 
            +
            		h2 = add32(h2,c);
         | 
| 1040 | 
            +
            		h3 = add32(h3,d);
         | 
| 1041 | 
            +
            		h4 = add32(h4,e);
         | 
| 1042 | 
            +
            	}
         | 
| 1043 | 
            +
            	return Array(h0,h1,h2,h3,h4);
         | 
| 1044 | 
            +
            };
         | 
| 1045 | 
            +
             | 
| 1046 | 
            +
             | 
| 1047 | 
            +
            }
         | 
| 1048 | 
            +
            //}}}</pre>
         | 
| 1049 | 
            +
            </div>
         | 
| 1050 | 
            +
            <div title="DefaultTiddlers" modifier="loic" modified="200804041401" created="200707211620" changecount="2">
         | 
| 1051 | 
            +
            <pre>[[Introduction]]
         | 
| 1052 | 
            +
            [[Usage]]
         | 
| 895 1053 | 
             
            </pre>
         | 
| 896 1054 | 
             
            </div>
         | 
| 897 | 
            -
            <div title=" | 
| 1055 | 
            +
            <div title="DeprecatedFunctionsPlugin" modifier="" created="200710125059" tags="systemConfig excludeLists excludeSearch">
         | 
| 898 1056 | 
             
            <pre>/***
         | 
| 899 | 
            -
            |''Name:''| | 
| 900 | 
            -
            |''Description:''| | 
| 901 | 
            -
            |''Version:''|0.2.1|
         | 
| 902 | 
            -
            |''Date:''|Apr 21, 2007|
         | 
| 903 | 
            -
            |''Source:''|http://tiddlywiki.bidix.info/#WebDAVSavingPlugin|
         | 
| 904 | 
            -
            |''Author:''|BidiX (BidiX (at) bidix (dot) info)|
         | 
| 905 | 
            -
            |''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
         | 
| 906 | 
            -
            |''~CoreVersion:''|2.2.0 (Beta 5)|
         | 
| 1057 | 
            +
            |''Name:''|DeprecatedFunctionsPlugin|
         | 
| 1058 | 
            +
            |''Description:''|Support for deprecated functions removed from core|
         | 
| 907 1059 | 
             
            ***/
         | 
| 908 1060 | 
             
            //{{{
         | 
| 909 | 
            -
            version.extensions. | 
| 910 | 
            -
             | 
| 911 | 
            -
             | 
| 912 | 
            -
             | 
| 913 | 
            -
             | 
| 914 | 
            -
             | 
| 915 | 
            -
             | 
| 1061 | 
            +
            if(!version.extensions.DeprecatedFunctionsPlugin) {
         | 
| 1062 | 
            +
            version.extensions.DeprecatedFunctionsPlugin = {installed:true};
         | 
| 1063 | 
            +
             | 
| 1064 | 
            +
            //--
         | 
| 1065 | 
            +
            //-- Deprecated code
         | 
| 1066 | 
            +
            //--
         | 
| 1067 | 
            +
             | 
| 1068 | 
            +
            // @Deprecated: Use createElementAndWikify and this.termRegExp instead
         | 
| 1069 | 
            +
            config.formatterHelpers.charFormatHelper = function(w)
         | 
| 1070 | 
            +
            {
         | 
| 1071 | 
            +
            	w.subWikify(createTiddlyElement(w.output,this.element),this.terminator);
         | 
| 916 1072 | 
             
            };
         | 
| 917 1073 |  | 
| 918 | 
            -
             | 
| 919 | 
            -
             | 
| 920 | 
            -
             | 
| 921 | 
            -
            	 | 
| 922 | 
            -
            	 | 
| 923 | 
            -
             | 
| 924 | 
            -
             | 
| 925 | 
            -
            		 | 
| 926 | 
            -
            		 | 
| 927 | 
            -
             | 
| 928 | 
            -
            		 | 
| 1074 | 
            +
            // @Deprecated: Use enclosedTextHelper and this.lookaheadRegExp instead
         | 
| 1075 | 
            +
            config.formatterHelpers.monospacedByLineHelper = function(w)
         | 
| 1076 | 
            +
            {
         | 
| 1077 | 
            +
            	var lookaheadRegExp = new RegExp(this.lookahead,"mg");
         | 
| 1078 | 
            +
            	lookaheadRegExp.lastIndex = w.matchStart;
         | 
| 1079 | 
            +
            	var lookaheadMatch = lookaheadRegExp.exec(w.source);
         | 
| 1080 | 
            +
            	if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
         | 
| 1081 | 
            +
            		var text = lookaheadMatch[1];
         | 
| 1082 | 
            +
            		if(config.browser.isIE)
         | 
| 1083 | 
            +
            			text = text.replace(/\n/g,"\r");
         | 
| 1084 | 
            +
            		createTiddlyElement(w.output,"pre",null,null,text);
         | 
| 1085 | 
            +
            		w.nextMatch = lookaheadRegExp.lastIndex;
         | 
| 929 1086 | 
             
            	}
         | 
| 930 1087 | 
             
            };
         | 
| 931 1088 |  | 
| 932 | 
            -
            //  | 
| 933 | 
            -
             | 
| 1089 | 
            +
            // @Deprecated: Use <br> or <br /> instead of <<br>>
         | 
| 1090 | 
            +
            config.macros.br = {};
         | 
| 1091 | 
            +
            config.macros.br.handler = function(place)
         | 
| 934 1092 | 
             
            {
         | 
| 935 | 
            -
            	 | 
| 936 | 
            -
             | 
| 937 | 
            -
            		return bidix.WebDAVSaving.orig_saveChanges(onlyIfDirty,tiddlers);
         | 
| 938 | 
            -
            	else
         | 
| 939 | 
            -
            		return bidix.WebDAVSaving.saveChanges(onlyIfDirty,tiddlers);
         | 
| 940 | 
            -
            }
         | 
| 1093 | 
            +
            	createTiddlyElement(place,"br");
         | 
| 1094 | 
            +
            };
         | 
| 941 1095 |  | 
| 942 | 
            -
             | 
| 943 | 
            -
             | 
| 944 | 
            -
             | 
| 945 | 
            -
            			url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
         | 
| 946 | 
            -
            		if (!status)
         | 
| 947 | 
            -
            			displayMessage(bidix.WebDAVSaving.messages.optionsMethodError.format([url]));
         | 
| 948 | 
            -
            		else {
         | 
| 949 | 
            -
            			if (!xhr.getResponseHeader("DAV"))
         | 
| 950 | 
            -
            				alert(bidix.WebDAVSaving.messages.webDavNotEnabled.format([url]));
         | 
| 951 | 
            -
            			else
         | 
| 952 | 
            -
            				bidix.WebDAVSaving.doSaveChanges();
         | 
| 953 | 
            -
            		}
         | 
| 954 | 
            -
            	}	
         | 
| 955 | 
            -
            	if(onlyIfDirty && !store.isDirty())
         | 
| 956 | 
            -
            		return;
         | 
| 957 | 
            -
            	clearMessage();
         | 
| 958 | 
            -
            	var originalPath = document.location.toString();
         | 
| 959 | 
            -
            	// Check we were loaded from a HTTP or HTTPS URL
         | 
| 960 | 
            -
            	if(originalPath.substr(0,4) != "http") {
         | 
| 961 | 
            -
            		alert(bidix.WebDAVSaving.messages.notHTTPUrlError);
         | 
| 962 | 
            -
            		return;
         | 
| 963 | 
            -
            	}	
         | 
| 964 | 
            -
            	// is the server WebDAV enabled ?
         | 
| 965 | 
            -
            	var r = doHttp("OPTIONS",originalPath,null,null,null,null,callback,null,null);
         | 
| 966 | 
            -
            	if (typeof r == "string")
         | 
| 967 | 
            -
            		alert(r);
         | 
| 968 | 
            -
            }
         | 
| 969 | 
            -
            	
         | 
| 970 | 
            -
            bidix.WebDAVSaving.doSaveChanges = function()
         | 
| 1096 | 
            +
            // Find an entry in an array. Returns the array index or null
         | 
| 1097 | 
            +
            // @Deprecated: Use indexOf instead
         | 
| 1098 | 
            +
            Array.prototype.find = function(item)
         | 
| 971 1099 | 
             
            {
         | 
| 972 | 
            -
            	var  | 
| 973 | 
            -
             | 
| 974 | 
            -
            			alert(config.messages.loadOriginalHttpDavError);
         | 
| 975 | 
            -
            			return;
         | 
| 976 | 
            -
            		}
         | 
| 977 | 
            -
            		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
         | 
| 978 | 
            -
            		// Locate the storeArea div's 
         | 
| 979 | 
            -
            		var posDiv = locateStoreArea(original);
         | 
| 980 | 
            -
            		if((posDiv[0] == -1) || (posDiv[1] == -1)) {
         | 
| 981 | 
            -
            			alert(config.messages.invalidFileError.format([localPath]));
         | 
| 982 | 
            -
            			return;
         | 
| 983 | 
            -
            		}
         | 
| 984 | 
            -
            		bidix.WebDAVSaving.mkbackupfolder(null,null,params,original,posDiv);
         | 
| 985 | 
            -
            	};
         | 
| 986 | 
            -
            	// get original
         | 
| 987 | 
            -
            	var originalPath = document.location.toString();
         | 
| 988 | 
            -
            	if (originalPath.charAt(originalPath.length-1) == "/")
         | 
| 989 | 
            -
            		originalPath = originalPath + bidix.WebDAVSaving.defaultFilename;
         | 
| 990 | 
            -
            	displayMessage(bidix.WebDAVSaving.messages.aboutToSaveOnHttpDav.format([originalPath]));
         | 
| 991 | 
            -
            	doHttp("GET",originalPath,null,null,null,null,callback,originalPath,null);
         | 
| 1100 | 
            +
            	var i = this.indexOf(item);
         | 
| 1101 | 
            +
            	return i == -1 ? null : i;
         | 
| 992 1102 | 
             
            };
         | 
| 993 1103 |  | 
| 994 | 
            -
             | 
| 995 | 
            -
             | 
| 996 | 
            -
             | 
| 997 | 
            -
             | 
| 998 | 
            -
             | 
| 999 | 
            -
            		else
         | 
| 1000 | 
            -
            			dirs = config.options.txtBackupFolder.split('/');
         | 
| 1001 | 
            -
            	}
         | 
| 1002 | 
            -
            	if (config.options.chkSaveBackups && dirs && (dirs.length > 0)) 
         | 
| 1003 | 
            -
            		bidix.WebDAVSaving.mkdir(root,dirs.shift(),dirs,url,original,posDiv);
         | 
| 1004 | 
            -
            	else
         | 
| 1005 | 
            -
            		bidix.WebDAVSaving.saveBackup(url,original,posDiv);
         | 
| 1104 | 
            +
            // Load a tiddler from an HTML DIV. The caller should make sure to later call Tiddler.changed()
         | 
| 1105 | 
            +
            // @Deprecated: Use store.getLoader().internalizeTiddler instead
         | 
| 1106 | 
            +
            Tiddler.prototype.loadFromDiv = function(divRef,title)
         | 
| 1107 | 
            +
            {
         | 
| 1108 | 
            +
            	return store.getLoader().internalizeTiddler(store,this,title,divRef);
         | 
| 1006 1109 | 
             
            };
         | 
| 1007 1110 |  | 
| 1008 | 
            -
             | 
| 1111 | 
            +
            // Format the text for storage in an HTML DIV
         | 
| 1112 | 
            +
            // @Deprecated Use store.getSaver().externalizeTiddler instead.
         | 
| 1113 | 
            +
            Tiddler.prototype.saveToDiv = function()
         | 
| 1009 1114 | 
             
            {
         | 
| 1010 | 
            -
            	 | 
| 1011 | 
            -
             | 
| 1012 | 
            -
            			alert(config.messages.backupFailed);
         | 
| 1013 | 
            -
            			return;
         | 
| 1014 | 
            -
            		}
         | 
| 1015 | 
            -
            		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
         | 
| 1016 | 
            -
            		displayMessage(config.messages.backupSaved,url);
         | 
| 1017 | 
            -
            		bidix.WebDAVSaving.saveRss(params[0],params[1],params[2]);
         | 
| 1018 | 
            -
            	};
         | 
| 1019 | 
            -
            	if(config.options.chkSaveBackups) {
         | 
| 1020 | 
            -
            		var backupPath = getBackupPath(url);
         | 
| 1021 | 
            -
            		bidix.httpPut(backupPath,original,callback,Array(url,original,posDiv));
         | 
| 1022 | 
            -
            	} else {
         | 
| 1023 | 
            -
            		bidix.WebDAVSaving.saveRss(url,original,posDiv);
         | 
| 1024 | 
            -
            	}
         | 
| 1025 | 
            -
            }
         | 
| 1115 | 
            +
            	return store.getSaver().externalizeTiddler(store,this);
         | 
| 1116 | 
            +
            };
         | 
| 1026 1117 |  | 
| 1027 | 
            -
             | 
| 1118 | 
            +
            // @Deprecated: Use store.allTiddlersAsHtml() instead
         | 
| 1119 | 
            +
            function allTiddlersAsHtml()
         | 
| 1028 1120 | 
             
            {
         | 
| 1029 | 
            -
            	 | 
| 1030 | 
            -
            		if (!status) {
         | 
| 1031 | 
            -
            			alert(config.messages.rssFailed);
         | 
| 1032 | 
            -
            			return;
         | 
| 1033 | 
            -
            		}
         | 
| 1034 | 
            -
            		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
         | 
| 1035 | 
            -
            		displayMessage(config.messages.rssSaved,url);
         | 
| 1036 | 
            -
            		bidix.WebDAVSaving.saveEmpty(params[0],params[1],params[2]);
         | 
| 1037 | 
            -
            	};
         | 
| 1038 | 
            -
            	if(config.options.chkGenerateAnRssFeed) {
         | 
| 1039 | 
            -
            		var rssPath = url.substr(0,url.lastIndexOf(".")) + ".xml";
         | 
| 1040 | 
            -
            		bidix.httpPut(rssPath,convertUnicodeToUTF8(generateRss()),callback,Array(url,original,posDiv));
         | 
| 1041 | 
            -
            	} else {
         | 
| 1042 | 
            -
            		bidix.WebDAVSaving.saveEmpty(url,original,posDiv);
         | 
| 1043 | 
            -
            	}
         | 
| 1121 | 
            +
            	return store.allTiddlersAsHtml();
         | 
| 1044 1122 | 
             
            }
         | 
| 1045 1123 |  | 
| 1046 | 
            -
             | 
| 1124 | 
            +
            // @Deprecated: Use refreshPageTemplate instead
         | 
| 1125 | 
            +
            function applyPageTemplate(title)
         | 
| 1047 1126 | 
             
            {
         | 
| 1048 | 
            -
            	 | 
| 1049 | 
            -
            		if (!status) {
         | 
| 1050 | 
            -
            			alert(config.messages.emptyFailed);
         | 
| 1051 | 
            -
            			return;
         | 
| 1052 | 
            -
            		}
         | 
| 1053 | 
            -
            		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
         | 
| 1054 | 
            -
            		displayMessage(config.messages.emptySaved,url);
         | 
| 1055 | 
            -
            		bidix.WebDAVSaving.saveMain(params[0],params[1],params[2]);
         | 
| 1056 | 
            -
            	};
         | 
| 1057 | 
            -
            	if(config.options.chkSaveEmptyTemplate) {
         | 
| 1058 | 
            -
            		var emptyPath,p;
         | 
| 1059 | 
            -
            		if((p = url.lastIndexOf("/")) != -1)
         | 
| 1060 | 
            -
            			emptyPath = url.substr(0,p) + "/empty.html";
         | 
| 1061 | 
            -
            		else
         | 
| 1062 | 
            -
            			emptyPath = url + ".empty.html";
         | 
| 1063 | 
            -
            		var empty = original.substr(0,posDiv[0] + startSaveArea.length) + original.substr(posDiv[1]);
         | 
| 1064 | 
            -
            		bidix.httpPut(emptyPath,empty,callback,Array(url,original,posDiv));
         | 
| 1065 | 
            -
            	} else {
         | 
| 1066 | 
            -
            		bidix.WebDAVSaving.saveMain(url,original,posDiv);
         | 
| 1067 | 
            -
            	}
         | 
| 1127 | 
            +
            	refreshPageTemplate(title);
         | 
| 1068 1128 | 
             
            }
         | 
| 1069 1129 |  | 
| 1070 | 
            -
             | 
| 1130 | 
            +
            // @Deprecated: Use story.displayTiddlers instead
         | 
| 1131 | 
            +
            function displayTiddlers(srcElement,titles,template,unused1,unused2,animate,unused3)
         | 
| 1071 1132 | 
             
            {
         | 
| 1072 | 
            -
            	 | 
| 1073 | 
            -
            		if(status) {
         | 
| 1074 | 
            -
            			url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
         | 
| 1075 | 
            -
            			displayMessage(config.messages.mainSaved,url);
         | 
| 1076 | 
            -
            			store.setDirty(false);
         | 
| 1077 | 
            -
            		} else 
         | 
| 1078 | 
            -
            			alert(config.messages.mainFailed);
         | 
| 1079 | 
            -
            	};	
         | 
| 1080 | 
            -
            	// Save new file
         | 
| 1081 | 
            -
            	var revised = updateOriginal(original,posDiv);
         | 
| 1082 | 
            -
            	bidix.httpPut(url,revised,callback,null);
         | 
| 1083 | 
            -
            }
         | 
| 1084 | 
            -
             | 
| 1085 | 
            -
            // asynchronous mkdir
         | 
| 1086 | 
            -
            bidix.WebDAVSaving.mkdir = function(root,dir,dirs,url,original,posDiv) {
         | 
| 1087 | 
            -
            	var callback = function(status,params,responseText,url,xhr) {
         | 
| 1088 | 
            -
            		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
         | 
| 1089 | 
            -
            		if (status == null) {
         | 
| 1090 | 
            -
            			alert("Error in mkdir");
         | 
| 1091 | 
            -
            			return;
         | 
| 1092 | 
            -
            		}
         | 
| 1093 | 
            -
            		if (xhr.status == httpStatus.ContentCreated) {
         | 
| 1094 | 
            -
            			displayMessage(bidix.WebDAVSaving.messages.folderCreated.format([url]),url);
         | 
| 1095 | 
            -
            			bidix.WebDAVSaving.mkbackupfolder(url,params[1],params[2],params[3],params[4]);
         | 
| 1096 | 
            -
            		} else {
         | 
| 1097 | 
            -
            			if (xhr.status == httpStatus.NotFound)
         | 
| 1098 | 
            -
            				bidix.http('MKCOL',url,null,callback,params);
         | 
| 1099 | 
            -
            			else
         | 
| 1100 | 
            -
            				bidix.WebDAVSaving.mkbackupfolder(url,params[1],params[2],params[3],params[4]);
         | 
| 1101 | 
            -
            		}
         | 
| 1102 | 
            -
            	};
         | 
| 1103 | 
            -
            	if (root.charAt(root.length) != '/')
         | 
| 1104 | 
            -
            		root = root +'/';
         | 
| 1105 | 
            -
            	bidix.http('HEAD',root+dir,null,callback,Array(root,dirs,url,original,posDiv));
         | 
| 1133 | 
            +
            	story.displayTiddlers(srcElement,titles,template,animate);
         | 
| 1106 1134 | 
             
            }
         | 
| 1107 1135 |  | 
| 1108 | 
            -
             | 
| 1136 | 
            +
            // @Deprecated: Use story.displayTiddler instead
         | 
| 1137 | 
            +
            function displayTiddler(srcElement,title,template,unused1,unused2,animate,unused3)
         | 
| 1109 1138 | 
             
            {
         | 
| 1110 | 
            -
            	 | 
| 1139 | 
            +
            	story.displayTiddler(srcElement,title,template,animate);
         | 
| 1111 1140 | 
             
            }
         | 
| 1112 1141 |  | 
| 1113 | 
            -
             | 
| 1114 | 
            -
             | 
| 1115 | 
            -
             | 
| 1116 | 
            -
             | 
| 1117 | 
            -
             | 
| 1118 | 
            -
             | 
| 1142 | 
            +
            // @Deprecated: Use functions on right hand side directly instead
         | 
| 1143 | 
            +
            var createTiddlerPopup = Popup.create;
         | 
| 1144 | 
            +
            var scrollToTiddlerPopup = Popup.show;
         | 
| 1145 | 
            +
            var hideTiddlerPopup = Popup.remove;
         | 
| 1146 | 
            +
             | 
| 1147 | 
            +
            // @Deprecated: Use right hand side directly instead
         | 
| 1148 | 
            +
            var regexpBackSlashEn = new RegExp("\\\\n","mg");
         | 
| 1149 | 
            +
            var regexpBackSlash = new RegExp("\\\\","mg");
         | 
| 1150 | 
            +
            var regexpBackSlashEss = new RegExp("\\\\s","mg");
         | 
| 1151 | 
            +
            var regexpNewLine = new RegExp("\n","mg");
         | 
| 1152 | 
            +
            var regexpCarriageReturn = new RegExp("\r","mg");
         | 
| 1153 | 
            +
             | 
| 1119 1154 | 
             
            }
         | 
| 1155 | 
            +
            //}}}</pre>
         | 
| 1156 | 
            +
            </div>
         | 
| 1157 | 
            +
            <div title="Introduction" modifier="loic" modified="200804041355" created="200707211630" changecount="5">
         | 
| 1158 | 
            +
            <pre>a ruby gem (http://rubyforge.org/projects/tiddlywikicp/) providing a library and a command line interface to copy [[tiddlywiki|http://tiddlywiki.com/]] tiddlers to files and vice versa.
         | 
| 1159 | 
            +
             | 
| 1160 | 
            +
            Installation : gem install tiddlywiki_cp
         | 
| 1161 | 
            +
             | 
| 1162 | 
            +
            Development is discussed at irc.freenode.net#tiddlywiki 
         | 
| 1120 1163 |  | 
| 1121 | 
            -
             | 
| 1122 | 
            -
             | 
| 1164 | 
            +
            This tiddlywiki was created using the following commands:
         | 
| 1165 | 
            +
            * copy an empty tiddlywiki to a local file
         | 
| 1166 | 
            +
            {{{
         | 
| 1167 | 
            +
            tiddlywiki_cp http://tiddlywiki.com/empty.html  website/index.html
         | 
| 1168 | 
            +
            }}}
         | 
| 1169 | 
            +
            * copy and install a plugin 
         | 
| 1170 | 
            +
            {{{
         | 
| 1171 | 
            +
            tiddlywiki_cp 'http://garden.dachary.org/#WebDavPlugin' website/index.html
         | 
| 1172 | 
            +
            }}}
         | 
| 1173 | 
            +
            * copy all tiddlers to a directory
         | 
| 1174 | 
            +
            {{{
         | 
| 1175 | 
            +
            mkdir website/files
         | 
| 1176 | 
            +
            tiddlywiki_cp -a website/index.html website/files
         | 
| 1177 | 
            +
            }}}
         | 
| 1178 | 
            +
            * use regular shell commands to create or update files
         | 
| 1179 | 
            +
            {{{
         | 
| 1180 | 
            +
            ( echo '{{''{' ; RUBYLIB=lib ruby bin/tiddlywiki_cp --help ; echo '}}''}' ) > website/files/Usage.tiddler
         | 
| 1181 | 
            +
            ( echo '{{''{' ; hg log ; echo '}}''}' ) > website/files/ChangeLog.tiddler
         | 
| 1182 | 
            +
            }}}
         | 
| 1183 | 
            +
            * copy all tiddlers in a directory into a tiddlywiki, updating existing ones and adding new ones
         | 
| 1184 | 
            +
            {{{
         | 
| 1185 | 
            +
            cd website ; RUBYLIB=../lib ruby ../bin/tiddlywiki_cp -a files index.html 
         | 
| 1186 | 
            +
            }}}
         | 
| 1187 | 
            +
            Loic Dachary <mailto:loic@dachary.org>
         | 
| 1188 | 
            +
            </pre>
         | 
| 1189 | 
            +
            </div>
         | 
| 1190 | 
            +
            <div title="LegacyStrikeThroughPlugin" modifier="MartinBudden" created="200607210000" tags="systemConfig">
         | 
| 1191 | 
            +
            <pre>/***
         | 
| 1192 | 
            +
            |''Name:''|LegacyStrikeThroughPlugin|
         | 
| 1193 | 
            +
            |''Description:''|Support for legacy (pre 2.1) strike through formatting|
         | 
| 1194 | 
            +
            |''Version:''|1.0.2|
         | 
| 1195 | 
            +
            |''Date:''|Jul 21, 2006|
         | 
| 1196 | 
            +
            |''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|
         | 
| 1197 | 
            +
            |''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|
         | 
| 1198 | 
            +
            |''License:''|[[BSD open source license]]|
         | 
| 1199 | 
            +
            |''CoreVersion:''|2.1.0|
         | 
| 1200 | 
            +
            ***/
         | 
| 1201 | 
            +
             | 
| 1202 | 
            +
            //{{{
         | 
| 1203 | 
            +
            // Ensure that the LegacyStrikeThrough Plugin is only installed once.
         | 
| 1204 | 
            +
            if(!version.extensions.LegacyStrikeThroughPlugin) {
         | 
| 1205 | 
            +
            version.extensions.LegacyStrikeThroughPlugin = {installed:true};
         | 
| 1206 | 
            +
             | 
| 1207 | 
            +
            config.formatters.push(
         | 
| 1208 | 
            +
            {
         | 
| 1209 | 
            +
            	name: "legacyStrikeByChar",
         | 
| 1210 | 
            +
            	match: "==",
         | 
| 1211 | 
            +
            	termRegExp: /(==)/mg,
         | 
| 1212 | 
            +
            	element: "strike",
         | 
| 1213 | 
            +
            	handler: config.formatterHelpers.createElementAndWikify
         | 
| 1214 | 
            +
            });
         | 
| 1215 | 
            +
             | 
| 1216 | 
            +
            } //# end of "install only once"
         | 
| 1217 | 
            +
            //}}}</pre>
         | 
| 1218 | 
            +
            </div>
         | 
| 1219 | 
            +
            <div title="MainMenu" modifier="loic" modified="200707231424" created="200707211619" changecount="2">
         | 
| 1220 | 
            +
            <pre>[[Introduction]]
         | 
| 1221 | 
            +
            [[Usage]]
         | 
| 1222 | 
            +
            [[ChangeLog]]
         | 
| 1223 | 
            +
            </pre>
         | 
| 1224 | 
            +
            </div>
         | 
| 1225 | 
            +
            <div title="SiteSubtitle" modifier="loic" modified="200707231424" created="200707211618" changecount="1">
         | 
| 1226 | 
            +
            <pre>copy tiddlers to files and vice versa</pre>
         | 
| 1227 | 
            +
            </div>
         | 
| 1228 | 
            +
            <div title="SiteTitle" modifier="loic" modified="200707231424" created="200707211617" changecount="1">
         | 
| 1229 | 
            +
            <pre>tiddlywiki_cp</pre>
         | 
| 1230 | 
            +
            </div>
         | 
| 1231 | 
            +
            <div title="SparklinePlugin" modifier="" created="200710125059" tags="systemConfig excludeLists excludeSearch">
         | 
| 1232 | 
            +
            <pre>/***
         | 
| 1233 | 
            +
            |''Name:''|SparklinePlugin|
         | 
| 1234 | 
            +
            |''Description:''|Sparklines macro|
         | 
| 1235 | 
            +
            ***/
         | 
| 1236 | 
            +
            //{{{
         | 
| 1237 | 
            +
            if(!version.extensions.SparklinePlugin) {
         | 
| 1238 | 
            +
            version.extensions.SparklinePlugin = {installed:true};
         | 
| 1239 | 
            +
             | 
| 1240 | 
            +
            //--
         | 
| 1241 | 
            +
            //-- Sparklines
         | 
| 1242 | 
            +
            //--
         | 
| 1243 | 
            +
             | 
| 1244 | 
            +
            config.macros.sparkline = {};
         | 
| 1245 | 
            +
            config.macros.sparkline.handler = function(place,macroName,params)
         | 
| 1246 | 
            +
            {
         | 
| 1247 | 
            +
            	var data = [];
         | 
| 1248 | 
            +
            	var min = 0;
         | 
| 1249 | 
            +
            	var max = 0;
         | 
| 1250 | 
            +
            	var v;
         | 
| 1251 | 
            +
            	for(var t=0; t<params.length; t++) {
         | 
| 1252 | 
            +
            		v = parseInt(params[t]);
         | 
| 1253 | 
            +
            		if(v < min)
         | 
| 1254 | 
            +
            			min = v;
         | 
| 1255 | 
            +
            		if(v > max)
         | 
| 1256 | 
            +
            			max = v;
         | 
| 1257 | 
            +
            		data.push(v);
         | 
| 1258 | 
            +
            	}
         | 
| 1259 | 
            +
            	if(data.length < 1)
         | 
| 1123 1260 | 
             
            		return;
         | 
| 1124 | 
            -
            	var  | 
| 1125 | 
            -
            	 | 
| 1126 | 
            -
             | 
| 1127 | 
            -
            	 | 
| 1128 | 
            -
             | 
| 1261 | 
            +
            	var box = createTiddlyElement(place,"span",null,"sparkline",String.fromCharCode(160));
         | 
| 1262 | 
            +
            	box.title = data.join(",");
         | 
| 1263 | 
            +
            	var w = box.offsetWidth;
         | 
| 1264 | 
            +
            	var h = box.offsetHeight;
         | 
| 1265 | 
            +
            	box.style.paddingRight = (data.length * 2 - w) + "px";
         | 
| 1266 | 
            +
            	box.style.position = "relative";
         | 
| 1267 | 
            +
            	for(var d=0; d<data.length; d++) {
         | 
| 1268 | 
            +
            		var tick = document.createElement("img");
         | 
| 1269 | 
            +
            		tick.border = 0;
         | 
| 1270 | 
            +
            		tick.className = "sparktick";
         | 
| 1271 | 
            +
            		tick.style.position = "absolute";
         | 
| 1272 | 
            +
            		tick.src = "data:image/gif,GIF89a%01%00%01%00%91%FF%00%FF%FF%FF%00%00%00%C0%C0%C0%00%00%00!%F9%04%01%00%00%02%00%2C%00%00%00%00%01%00%01%00%40%02%02T%01%00%3B";
         | 
| 1273 | 
            +
            		tick.style.left = d*2 + "px";
         | 
| 1274 | 
            +
            		tick.style.width = "2px";
         | 
| 1275 | 
            +
            		v = Math.floor(((data[d] - min)/(max-min)) * h);
         | 
| 1276 | 
            +
            		tick.style.top = (h-v) + "px";
         | 
| 1277 | 
            +
            		tick.style.height = v + "px";
         | 
| 1278 | 
            +
            		box.appendChild(tick);
         | 
| 1129 1279 | 
             
            	}
         | 
| 1130 1280 | 
             
            };
         | 
| 1281 | 
            +
             | 
| 1282 | 
            +
             | 
| 1283 | 
            +
            }
         | 
| 1131 1284 | 
             
            //}}}</pre>
         | 
| 1132 1285 | 
             
            </div>
         | 
| 1286 | 
            +
            <div title="Usage" modifier="loic" modified="200804062225" created="200707211620" changecount="1">
         | 
| 1287 | 
            +
            <pre>{{{
         | 
| 1288 | 
            +
            Usage: tiddlywiki_cp [options] FROM [FROM ...] TO|-
         | 
| 1289 | 
            +
             | 
| 1290 | 
            +
                -r, --[no-]recursive             recurse into directories and tiddlywikies
         | 
| 1291 | 
            +
                -t, --[no-]times                 preserve modification time
         | 
| 1292 | 
            +
                -a, --all                        implies -rt
         | 
| 1293 | 
            +
                -i, --include REGEX              all files,directories or tiddlers must match regex.
         | 
| 1294 | 
            +
                                                     If specified multiple times, 
         | 
| 1295 | 
            +
                                                     must match at least one of the regex.
         | 
| 1296 | 
            +
                                                     Includes are tested after excludes.
         | 
| 1297 | 
            +
                    --exclude REGEX              all files,directories or tiddlers must NOT match regex.
         | 
| 1298 | 
            +
                                                     If specified multiple times, 
         | 
| 1299 | 
            +
                                                     exclude if matches at least one of the regex.
         | 
| 1300 | 
            +
                                                     Includes are tested after excludes.
         | 
| 1301 | 
            +
                -v, --[no-]verbose               run verbosely
         | 
| 1302 | 
            +
                -n, --[no-]dry-run               show what would have been transferred
         | 
| 1303 | 
            +
                    --version                    show version
         | 
| 1304 | 
            +
                    --help                       show command usage
         | 
| 1305 | 
            +
             | 
| 1306 | 
            +
            Examples:
         | 
| 1307 | 
            +
             | 
| 1308 | 
            +
              mkdir /tmp/a ; tiddlywiki_cp -a http://tiddlywiki.com/index.html /tmp/a
         | 
| 1309 | 
            +
                   copies index.html tiddlers in separate files and preserve times.
         | 
| 1310 | 
            +
                   For each tiddler, a .div file contains the meta information.
         | 
| 1311 | 
            +
                   The files are named after their content:
         | 
| 1312 | 
            +
                   /tmp/a/HelloThere.tiddler
         | 
| 1313 | 
            +
                   /tmp/a/HelloThere.tiddler.div
         | 
| 1314 | 
            +
                   /tmp/a/Plugin.js
         | 
| 1315 | 
            +
                   /tmp/a/Plugin.js.div
         | 
| 1316 | 
            +
                   /tmp/a/OwnStyle.css
         | 
| 1317 | 
            +
                   /tmp/a/OwnStyle.css.div
         | 
| 1318 | 
            +
                   ...
         | 
| 1319 | 
            +
             | 
| 1320 | 
            +
              tiddlywiki_cp 'http://tiddlylab.bidix.info/#WebDAVSavingPlugin' tiddlywiki.html
         | 
| 1321 | 
            +
                   copies the WebDAVSavingPlugin tiddler in the existing tiddlywiki.html
         | 
| 1322 | 
            +
             | 
| 1323 | 
            +
              tiddlywiki_cp http://tiddlywiki.com/index.html /tmp/i.html
         | 
| 1324 | 
            +
                   copies to a local file 
         | 
| 1325 | 
            +
             | 
| 1326 | 
            +
              tiddlywiki_cp -t myplugin.js tiddlywiki.html
         | 
| 1327 | 
            +
                   copies the tiddler in the existing tiddlywiki.html tiddlywiki
         | 
| 1328 | 
            +
                   and use file system modification time
         | 
| 1329 | 
            +
             | 
| 1330 | 
            +
              tiddlywiki_cp 'http://tiddlylab.bidix.info/#WebDAVSavingPlugin' WebDAVSavingPlugin.js
         | 
| 1331 | 
            +
                   get a local copy of the WebDAVSavingPlugin tiddler
         | 
| 1332 | 
            +
             | 
| 1333 | 
            +
              mkdir A ; tiddlywiki_cp -a --include 'WebDAV' --include 'RSS' 'http://tiddlylab.bidix.info/' A
         | 
| 1334 | 
            +
                   copy all tiddlers with WebDAV or RSS in the url
         | 
| 1335 | 
            +
             | 
| 1336 | 
            +
              mkdir A ; tiddlywiki_cp -a --exclude 'SEX' 'http://tiddlylab.bidix.info/' A
         | 
| 1337 | 
            +
                   copy all tiddlers except those with SEX in the url
         | 
| 1338 | 
            +
             | 
| 1339 | 
            +
              tiddlywiki_cp -a A B C tiddlywiki.html
         | 
| 1340 | 
            +
                   copy all tiddlers found in the A B and C directories to tiddlywiki.html
         | 
| 1341 | 
            +
             | 
| 1342 | 
            +
            MarkupPreHead, MarkupPostHead, MarkupPreBody, MarkupPostBody tiddlers:
         | 
| 1343 | 
            +
             | 
| 1344 | 
            +
              When copying to a tiddlywiki file, the content of these tiddlers 
         | 
| 1345 | 
            +
              are copied to the corresponding HTML zones.
         | 
| 1346 | 
            +
             | 
| 1347 | 
            +
            translations, i18n, l10n, linguo:
         | 
| 1348 | 
            +
             | 
| 1349 | 
            +
              If a translation plugin such as the one found at 
         | 
| 1350 | 
            +
              http://trac.tiddlywiki.org/wiki/Translations
         | 
| 1351 | 
            +
              is present, the tiddlywiki to which tiddlers are copied
         | 
| 1352 | 
            +
              will have its lang and xml:lang attributes updated.
         | 
| 1353 | 
            +
              Saving the tiddlywiki manually does the same.
         | 
| 1354 | 
            +
             | 
| 1355 | 
            +
            }}}
         | 
| 1356 | 
            +
            </pre>
         | 
| 1357 | 
            +
            </div>
         | 
| 1358 | 
            +
            <div title="WebDavPlugin" modifier="YourName" modified="200804041354" created="200711171415" tags="systemConfig" changecount="3">
         | 
| 1359 | 
            +
            <pre>/***
         | 
| 1360 | 
            +
            |''Name:''|WebDavPlugin|
         | 
| 1361 | 
            +
            |''Description:''|Allows a TiddlyWiki to be saved to a WebDav server|
         | 
| 1362 | 
            +
            |''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
         | 
| 1363 | 
            +
            |''Co-author:''|Loic Dachary|
         | 
| 1364 | 
            +
            |''Source:''|http://tw.lewcid.org/#WebDavPlugin|
         | 
| 1365 | 
            +
            |''Code Repository:''|http://tw.lewcid.org/svn/plugins|
         | 
| 1366 | 
            +
            |''Version:''|1.0|
         | 
| 1367 | 
            +
            |''Date:''|17/11/2007|
         | 
| 1368 | 
            +
            |''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
         | 
| 1369 | 
            +
            |''~CoreVersion:''|2.2.3|
         | 
| 1370 | 
            +
             | 
| 1371 | 
            +
            ***/
         | 
| 1372 | 
            +
            // /%
         | 
| 1373 | 
            +
            //!BEGIN-PLUGIN-CODE
         | 
| 1374 | 
            +
            DAV = {
         | 
| 1375 | 
            +
            	run : function(type,u,data,cb,params,headers){
         | 
| 1376 | 
            +
            		var callback = function(status,params,responseText,url,xhr) {
         | 
| 1377 | 
            +
            			url = url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1);
         | 
| 1378 | 
            +
            			if(params.length){
         | 
| 1379 | 
            +
            				params.shift().apply(this,[status,params,responseText,url,xhr]);
         | 
| 1380 | 
            +
            			}
         | 
| 1381 | 
            +
            		};	
         | 
| 1382 | 
            +
            		params = params||[];
         | 
| 1383 | 
            +
            		params.unshift(cb);		
         | 
| 1384 | 
            +
            		var r = doHttp.apply(this,[type,u,data,null,null,null,callback,params,headers]);
         | 
| 1385 | 
            +
            		if (typeof r == "string")
         | 
| 1386 | 
            +
            			alert(r);
         | 
| 1387 | 
            +
            		return r;
         | 
| 1388 | 
            +
            	},
         | 
| 1389 | 
            +
            	
         | 
| 1390 | 
            +
            	get : function(url,cb,params){
         | 
| 1391 | 
            +
            		return DAV.run("GET",url,null,cb,params,null);
         | 
| 1392 | 
            +
            	},
         | 
| 1393 | 
            +
             | 
| 1394 | 
            +
            	put : function(url,cb,params,data) {
         | 
| 1395 | 
            +
            		return DAV.run("PUT",url,data,cb,params,null);
         | 
| 1396 | 
            +
            	},
         | 
| 1397 | 
            +
             | 
| 1398 | 
            +
            	move : function(url,cb,params,destination) {
         | 
| 1399 | 
            +
            		return DAV.run("MOVE",url,null,cb,params,{"Destination":destination,"Overwrite":"T"});
         | 
| 1400 | 
            +
            	}, 
         | 
| 1401 | 
            +
             | 
| 1402 | 
            +
            	copy : function(url,cb,params,destination) {
         | 
| 1403 | 
            +
            		return DAV.run("COPY",url,null,cb,params,{"Destination":destination,"Overwrite":"T","Depth":0});
         | 
| 1404 | 
            +
            	},
         | 
| 1405 | 
            +
            	
         | 
| 1406 | 
            +
            	propfind : function(url,cb,params,prop,depth){	// !!!
         | 
| 1407 | 
            +
            		var xml = '<?xml version="1.0" encoding="UTF-8" ?>' +
         | 
| 1408 | 
            +
            			'<D:propfind xmlns:D="DAV:">' +
         | 
| 1409 | 
            +
            			'<D:prop>'+
         | 
| 1410 | 
            +
            			'<D:'+prop+'/>'+
         | 
| 1411 | 
            +
            			'</D:prop>'+
         | 
| 1412 | 
            +
            			'</D:propfind>';
         | 
| 1413 | 
            +
            		return DAV.run("PROPFIND",url,xml,cb,params,{"Content-type":"text/xml","Depth":depth?depth:0});
         | 
| 1414 | 
            +
            	},
         | 
| 1415 | 
            +
            	
         | 
| 1416 | 
            +
            	makeDir : function(url,cb,params){
         | 
| 1417 | 
            +
            		return DAV.run("MKCOL",url,null,cb,params,null);
         | 
| 1418 | 
            +
            	},
         | 
| 1419 | 
            +
             | 
| 1420 | 
            +
            	options : function(url,cb,params){
         | 
| 1421 | 
            +
            		return DAV.run("OPTIONS",url,null,cb,params,null);
         | 
| 1422 | 
            +
            	},
         | 
| 1423 | 
            +
            	
         | 
| 1424 | 
            +
            	safeput : function(url,cb,params,data){
         | 
| 1425 | 
            +
            		firstcb = function(status,p,responseText,u,xhr){
         | 
| 1426 | 
            +
            			if(status)
         | 
| 1427 | 
            +
            				DAV.move(u,cb,p,u.replace("-davsavingtemp",""));
         | 
| 1428 | 
            +
            			else
         | 
| 1429 | 
            +
            				cb.apply(firstcb,arguments);
         | 
| 1430 | 
            +
            		};
         | 
| 1431 | 
            +
            		return DAV.put(url+"-davsavingtemp",firstcb,params,data);
         | 
| 1432 | 
            +
            	}	
         | 
| 1433 | 
            +
            };
         | 
| 1434 | 
            +
             | 
| 1435 | 
            +
            config.DavSaver = {
         | 
| 1436 | 
            +
            	defaultFileName : 'index.html',
         | 
| 1437 | 
            +
            	messages : {
         | 
| 1438 | 
            +
            		startSaveMessage : 'saving to server...',
         | 
| 1439 | 
            +
            		endSaveMessage : 'TiddlyWiki successfuly saved to server',
         | 
| 1440 | 
            +
            		overwriteNewerPrompt : 'The remote file has changed since you last loaded or saved it.\nDo you wish to overwrite it?',
         | 
| 1441 | 
            +
            		getModDateError : "Could not get last modified date",
         | 
| 1442 | 
            +
            		raceError: "Save failed because the remote file is newer than the one you are trying to save"
         | 
| 1443 | 
            +
            	},
         | 
| 1444 | 
            +
            	errors:{
         | 
| 1445 | 
            +
            		raceconflict : 'The save failed because your file is out of date',
         | 
| 1446 | 
            +
            		getlastmodified : 'The save was aborted because the last modified date of the file could not be retrieved',
         | 
| 1447 | 
            +
            		davenabled : 'The server does not support WebDav',
         | 
| 1448 | 
            +
            		saverss : 'There was an error saving the rss file, the save was aborted',
         | 
| 1449 | 
            +
            		saveempty: 'There was an error saving the empty file, the save was aborted',
         | 
| 1450 | 
            +
            		savemain : 'Save failed! There was an error saving the main TW file',
         | 
| 1451 | 
            +
            		savebackup: 'Save failed! There was an error creating a backup file',
         | 
| 1452 | 
            +
            		makebackupdir: 'Save failed! The backup directory could not be created'		
         | 
| 1453 | 
            +
            	},
         | 
| 1454 | 
            +
            	timestamp: new Date().toGMTString(),
         | 
| 1455 | 
            +
            	orig_saveChanges: saveChanges,
         | 
| 1456 | 
            +
            	saver : null
         | 
| 1457 | 
            +
            };
         | 
| 1458 | 
            +
             | 
| 1459 | 
            +
            DavSaver = function(){
         | 
| 1460 | 
            +
            	
         | 
| 1461 | 
            +
            	this.Q = [];	
         | 
| 1462 | 
            +
             | 
| 1463 | 
            +
            	this.reset = function(){
         | 
| 1464 | 
            +
            		config.DavSaver.saver = null;
         | 
| 1465 | 
            +
            	};
         | 
| 1466 | 
            +
            	this.runQ = function(){
         | 
| 1467 | 
            +
            		if(this.Q.length){
         | 
| 1468 | 
            +
            			this.Q.shift().apply(this,arguments);
         | 
| 1469 | 
            +
            		}
         | 
| 1470 | 
            +
            		else
         | 
| 1471 | 
            +
            			this.reset();
         | 
| 1472 | 
            +
            	};
         | 
| 1473 | 
            +
            	this.posDiv = null;
         | 
| 1474 | 
            +
            	this.original = null;
         | 
| 1475 | 
            +
            	
         | 
| 1476 | 
            +
            	this.getOriginalPath = function(){
         | 
| 1477 | 
            +
            		var p = document.location.toString();
         | 
| 1478 | 
            +
            		p = convertUriToUTF8(p,config.options.txtFileSystemCharSet);
         | 
| 1479 | 
            +
            		var argPos = p.indexOf("?");
         | 
| 1480 | 
            +
            		if(argPos != -1)
         | 
| 1481 | 
            +
            			p = p.substr(0,argPos);
         | 
| 1482 | 
            +
            		var hashPos = p.indexOf("#");
         | 
| 1483 | 
            +
            		if(hashPos != -1)
         | 
| 1484 | 
            +
            			p = p.substr(0,hashPos);		
         | 
| 1485 | 
            +
            		if (p.charAt(p.length-1) == "/")
         | 
| 1486 | 
            +
            			p = p + config.DavSaver.defaultFileName;
         | 
| 1487 | 
            +
            		return p;
         | 
| 1488 | 
            +
            	};
         | 
| 1489 | 
            +
            	
         | 
| 1490 | 
            +
            	this.originalPath = this.getOriginalPath();
         | 
| 1491 | 
            +
            	this.backupPath = null;
         | 
| 1492 | 
            +
            	this.emptyPath = null;
         | 
| 1493 | 
            +
            	this.rssPath = null;
         | 
| 1494 | 
            +
            	this.throwError = function(er){
         | 
| 1495 | 
            +
            		clearMessage();
         | 
| 1496 | 
            +
            		this.reset();
         | 
| 1497 | 
            +
            		alert(config.DavSaver.errors[er]);   //clear message, reset and delete
         | 
| 1498 | 
            +
            	};
         | 
| 1499 | 
            +
            };
         | 
| 1500 | 
            +
             | 
| 1501 | 
            +
            DavSaver.prototype.getOriginal = function(){
         | 
| 1502 | 
            +
            	var	callback = function(status,params,original,url,xhr) {
         | 
| 1503 | 
            +
            		var that = params[0];
         | 
| 1504 | 
            +
            		if(status){
         | 
| 1505 | 
            +
            			var p = that.posDiv = locateStoreArea(original);
         | 
| 1506 | 
            +
            			if(!p || (p[0] == -1) || (p[1] == -1)) {
         | 
| 1507 | 
            +
            				alert(config.messages.invalidFileError.format([url]));
         | 
| 1508 | 
            +
            				return;
         | 
| 1509 | 
            +
            			}
         | 
| 1510 | 
            +
            			that.original = original;
         | 
| 1511 | 
            +
            			that.runQ();
         | 
| 1512 | 
            +
            		}
         | 
| 1513 | 
            +
            		else
         | 
| 1514 | 
            +
            			that.throwError('getOriginal');
         | 
| 1515 | 
            +
            	};
         | 
| 1516 | 
            +
            	
         | 
| 1517 | 
            +
            	DAV.get(this.originalPath,callback,[this]);	
         | 
| 1518 | 
            +
            };
         | 
| 1519 | 
            +
             | 
| 1520 | 
            +
            DavSaver.prototype.checkRace = function(){
         | 
| 1521 | 
            +
            	var callback = function(status,params,responseText,url,xhr){
         | 
| 1522 | 
            +
            		var that = params[0];
         | 
| 1523 | 
            +
            		if(status){
         | 
| 1524 | 
            +
            			var lastmod = responseText.match(/<(\w*?):getlastmodified>(.*?)<\/\1:getlastmodified>/)[2];
         | 
| 1525 | 
            +
            			if(Date.parse(lastmod) > Date.parse(config.DavSaver.timestamp)){
         | 
| 1526 | 
            +
            				if (confirm(config.DavSaver.messages.overwriteNewerPrompt))
         | 
| 1527 | 
            +
            					that.runQ();
         | 
| 1528 | 
            +
            				else
         | 
| 1529 | 
            +
            					that.throwError('raceconflict');
         | 
| 1530 | 
            +
            			}
         | 
| 1531 | 
            +
            			else	
         | 
| 1532 | 
            +
            				that.runQ();
         | 
| 1533 | 
            +
            		}
         | 
| 1534 | 
            +
            		else
         | 
| 1535 | 
            +
            			that.throwError('getlastmodified');
         | 
| 1536 | 
            +
            	};
         | 
| 1537 | 
            +
            	
         | 
| 1538 | 
            +
            	DAV.propfind(this.originalPath,callback,[this],"getlastmodified",0);	
         | 
| 1539 | 
            +
            };
         | 
| 1540 | 
            +
             | 
| 1541 | 
            +
            DavSaver.prototype.isDavEnabled = function(){
         | 
| 1542 | 
            +
            	var callback = function(status,params,responseText,url,xhr){
         | 
| 1543 | 
            +
            		that = params[0];
         | 
| 1544 | 
            +
            		if(status && !! xhr.getResponseHeader("DAV")){
         | 
| 1545 | 
            +
            			that.runQ();
         | 
| 1546 | 
            +
            			}
         | 
| 1547 | 
            +
            		else
         | 
| 1548 | 
            +
            			that.throwError('davenabled');
         | 
| 1549 | 
            +
            	};
         | 
| 1550 | 
            +
            	DAV.options(this.originalPath,callback,[this]);		
         | 
| 1551 | 
            +
            };
         | 
| 1552 | 
            +
             | 
| 1553 | 
            +
            DavSaver.prototype.saveRss = function(){
         | 
| 1554 | 
            +
            	var callback = function(status,params,responseText,url,xhr){
         | 
| 1555 | 
            +
            		var that = params[0];
         | 
| 1556 | 
            +
            		if(status){
         | 
| 1557 | 
            +
            			displayMessage(config.messages.rssSaved,that.rssPath);
         | 
| 1558 | 
            +
            			that.runQ();
         | 
| 1559 | 
            +
            		}
         | 
| 1560 | 
            +
            		else
         | 
| 1561 | 
            +
            			that.throwError('saverss');
         | 
| 1562 | 
            +
            	};
         | 
| 1563 | 
            +
            	var u = this.originalPath;
         | 
| 1564 | 
            +
            	var rssPath = this.rssPath = u.substr(0,u.lastIndexOf(".")) + ".xml";
         | 
| 1565 | 
            +
            	DAV.safeput(rssPath,callback,[this],convertUnicodeToUTF8(generateRss()));	
         | 
| 1566 | 
            +
            };
         | 
| 1567 | 
            +
             | 
| 1568 | 
            +
            DavSaver.prototype.saveEmpty = function(){
         | 
| 1569 | 
            +
            	var callback = function(status,params,responseText,url,xhr){
         | 
| 1570 | 
            +
            		var that = params[0];
         | 
| 1571 | 
            +
            		if(status){
         | 
| 1572 | 
            +
            			displayMessage(config.messages.emptySaved,that.emptyPath);
         | 
| 1573 | 
            +
            			that.runQ();
         | 
| 1574 | 
            +
            		}
         | 
| 1575 | 
            +
            		else
         | 
| 1576 | 
            +
            			that.throwError('saveempty');
         | 
| 1577 | 
            +
            	};
         | 
| 1578 | 
            +
            	var u = this.originalPath;
         | 
| 1579 | 
            +
            	var emptyPath,p;
         | 
| 1580 | 
            +
            	if((p = u.lastIndexOf("/")) != -1)
         | 
| 1581 | 
            +
            		emptyPath = u.substr(0,p) + "/empty.html";
         | 
| 1582 | 
            +
            	else
         | 
| 1583 | 
            +
            		emptyPath = u + ".empty.html";
         | 
| 1584 | 
            +
            	this.emptyPath = emptyPath;
         | 
| 1585 | 
            +
            	var empty = this.original.substr(0,this.posDiv[0] + startSaveArea.length) + this.original.substr(this.posDiv[1]);
         | 
| 1586 | 
            +
            	DAV.safeput(emptyPath,callback,[this],empty);		
         | 
| 1587 | 
            +
            };
         | 
| 1588 | 
            +
             | 
| 1589 | 
            +
            DavSaver.prototype.saveMain = function(){
         | 
| 1590 | 
            +
            	var callback = function(status,params,responseText,url,xhr){
         | 
| 1591 | 
            +
            		var that = params[0];
         | 
| 1592 | 
            +
            		if(status){
         | 
| 1593 | 
            +
            			config.DavSaver.timestamp = xhr.getResponseHeader('Date');
         | 
| 1594 | 
            +
            			displayMessage(config.messages.mainSaved,that.originalPath);
         | 
| 1595 | 
            +
            			store.setDirty(false);
         | 
| 1596 | 
            +
            			that.runQ();
         | 
| 1597 | 
            +
            		}
         | 
| 1598 | 
            +
            		else
         | 
| 1599 | 
            +
            			that.throwError('savemain');		
         | 
| 1600 | 
            +
            	};
         | 
| 1601 | 
            +
            	var revised = updateOriginal(this.original,this.posDiv);
         | 
| 1602 | 
            +
            	DAV.safeput(this.originalPath,callback,[this],revised);
         | 
| 1603 | 
            +
            };
         | 
| 1604 | 
            +
             | 
| 1605 | 
            +
            DavSaver.prototype.saveBackup = function(){	
         | 
| 1606 | 
            +
            	var callback = function(status,params,responseText,url,xhr){
         | 
| 1607 | 
            +
            		var that = params[0];
         | 
| 1608 | 
            +
            		if(status){
         | 
| 1609 | 
            +
            			clearMessage();
         | 
| 1610 | 
            +
            			displayMessage(config.messages.backupSaved,that.backupPath);
         | 
| 1611 | 
            +
            			that.runQ();
         | 
| 1612 | 
            +
            		}
         | 
| 1613 | 
            +
            		else
         | 
| 1614 | 
            +
            			that.throwError('savebackup');
         | 
| 1615 | 
            +
            	};
         | 
| 1616 | 
            +
            			
         | 
| 1617 | 
            +
            	var backupPath = this.backupPath = getBackupPath(this.originalPath);
         | 
| 1618 | 
            +
            	DAV.copy(this.originalPath,callback,[this],this.backupPath);		
         | 
| 1619 | 
            +
            };
         | 
| 1620 | 
            +
             | 
| 1621 | 
            +
            DavSaver.prototype.makeBackupDir = function(){
         | 
| 1622 | 
            +
            	var callback = function(status,params,responseText,url,xhr){
         | 
| 1623 | 
            +
            		var that = params[0];
         | 
| 1624 | 
            +
            		if(status)
         | 
| 1625 | 
            +
            			that.runQ();
         | 
| 1626 | 
            +
            		else
         | 
| 1627 | 
            +
            			that.throwError('makebackupdir');
         | 
| 1628 | 
            +
            	};
         | 
| 1629 | 
            +
            	var u = getBackupPath(this.originalPath);
         | 
| 1630 | 
            +
            	var backupDirPath = u.substr(0,u.lastIndexOf("/"));
         | 
| 1631 | 
            +
            	DAV.makeDir(backupDirPath,callback,[this]); 
         | 
| 1632 | 
            +
            };
         | 
| 1633 | 
            +
             | 
| 1634 | 
            +
            DavSaver.prototype.save = function(onlyIfDirty,tiddlers){
         | 
| 1635 | 
            +
            	if(onlyIfDirty && !store.isDirty())
         | 
| 1636 | 
            +
            		return;
         | 
| 1637 | 
            +
            	clearMessage();
         | 
| 1638 | 
            +
            	displayMessage(config.DavSaver.messages.startSaveMessage);
         | 
| 1639 | 
            +
            	var Q = this.Q =[];
         | 
| 1640 | 
            +
            	Q.push(this.isDavEnabled);
         | 
| 1641 | 
            +
            	Q.push(this.getOriginal);
         | 
| 1642 | 
            +
            	Q.push(this.checkRace);
         | 
| 1643 | 
            +
            	if (config.options.chkSaveBackups){
         | 
| 1644 | 
            +
            		if (config.options.txtBackupFolder!='')
         | 
| 1645 | 
            +
            			Q.push(this.makeBackupDir);
         | 
| 1646 | 
            +
            		Q.push(this.saveBackup);
         | 
| 1647 | 
            +
            	}
         | 
| 1648 | 
            +
            	Q.push(this.saveMain);
         | 
| 1649 | 
            +
            	if (config.options.chkGenerateAnRssFeed)
         | 
| 1650 | 
            +
            		Q.push(this.saveRss);
         | 
| 1651 | 
            +
            	if (config.options.chkSaveEmptyTemplate)
         | 
| 1652 | 
            +
            		Q.push(this.saveEmpty);
         | 
| 1653 | 
            +
            	//Q.push(this.reset);
         | 
| 1654 | 
            +
            	this.runQ();
         | 
| 1655 | 
            +
            };
         | 
| 1656 | 
            +
             | 
| 1657 | 
            +
            window.saveChanges = function(onlyIfDirty,tiddlers)
         | 
| 1658 | 
            +
            {	
         | 
| 1659 | 
            +
            	var c = config.DavSaver;
         | 
| 1660 | 
            +
            	if (document.location.protocol.toString() == "http:"){
         | 
| 1661 | 
            +
            		var saver = c.saver = new DavSaver();
         | 
| 1662 | 
            +
            		saver.save(onlyIfDirty,tiddlers);		
         | 
| 1663 | 
            +
            	}
         | 
| 1664 | 
            +
            	else
         | 
| 1665 | 
            +
            		return c.orig_saveChanges(onlyIfDirty,tiddlers);
         | 
| 1666 | 
            +
            };
         | 
| 1667 | 
            +
            //!END-PLUGIN-CODE
         | 
| 1668 | 
            +
            // %/</pre>
         | 
| 1669 | 
            +
            </div>
         | 
| 1133 1670 | 
             
            </div>
         | 
| 1134 1671 | 
             
            <!--POST-STOREAREA-->
         | 
| 1135 1672 | 
             
            <!--POST-BODY-START-->
         | 
| @@ -1199,10 +1736,11 @@ config.options = { | |
| 1199 1736 | 
             
            	txtMainTab: "tabTimeline",
         | 
| 1200 1737 | 
             
            	txtMoreTab: "moreTabAll",
         | 
| 1201 1738 | 
             
            	txtMaxEditRows: "30",
         | 
| 1202 | 
            -
            	txtFileSystemCharSet: "UTF-8"
         | 
| 1739 | 
            +
            	txtFileSystemCharSet: "UTF-8",
         | 
| 1740 | 
            +
            	txtTheme: ""
         | 
| 1203 1741 | 
             
            	};
         | 
| 1204 1742 | 
             
            config.optionsDesc = {};
         | 
| 1205 | 
            -
             | 
| 1743 | 
            +
             | 
| 1206 1744 | 
             
            // List of notification functions to be called when certain tiddlers are changed or deleted
         | 
| 1207 1745 | 
             
            config.notifyTiddlers = [
         | 
| 1208 1746 | 
             
            	{name: "StyleSheetLayout", notify: refreshStyles},
         | 
| @@ -1253,7 +1791,8 @@ config.macros = { | |
| 1253 1791 | 
             
            		missing: {},
         | 
| 1254 1792 | 
             
            		orphans: {},
         | 
| 1255 1793 | 
             
            		shadowed: {},
         | 
| 1256 | 
            -
            		touched: {}
         | 
| 1794 | 
            +
            		touched: {},
         | 
| 1795 | 
            +
            		filter: {}
         | 
| 1257 1796 | 
             
            	},
         | 
| 1258 1797 | 
             
            	closeAll: {},
         | 
| 1259 1798 | 
             
            	permaview: {},
         | 
| @@ -1263,7 +1802,6 @@ config.macros = { | |
| 1263 1802 | 
             
            	options: {},
         | 
| 1264 1803 | 
             
            	newTiddler: {},
         | 
| 1265 1804 | 
             
            	newJournal: {},
         | 
| 1266 | 
            -
            	sparkline: {},
         | 
| 1267 1805 | 
             
            	tabs: {},
         | 
| 1268 1806 | 
             
            	gradient: {},
         | 
| 1269 1807 | 
             
            	message: {},
         | 
| @@ -1271,7 +1809,6 @@ config.macros = { | |
| 1271 1809 | 
             
            	edit: {},
         | 
| 1272 1810 | 
             
            	tagChooser: {},
         | 
| 1273 1811 | 
             
            	toolbar: {},
         | 
| 1274 | 
            -
            	br: {},
         | 
| 1275 1812 | 
             
            	plugins: {},
         | 
| 1276 1813 | 
             
            	refreshDisplay: {},
         | 
| 1277 1814 | 
             
            	importTiddlers: {},
         | 
| @@ -1326,7 +1863,8 @@ if(config.browser.isBadSafari) { | |
| 1326 1863 | 
             
            	};
         | 
| 1327 1864 | 
             
            }
         | 
| 1328 1865 | 
             
            config.textPrimitives.sliceSeparator = "::";
         | 
| 1329 | 
            -
            config.textPrimitives. | 
| 1866 | 
            +
            config.textPrimitives.sectionSeparator = "##";
         | 
| 1867 | 
            +
            config.textPrimitives.urlPattern = "(?:file|http|https|mailto|ftp|irc|news|data):[^\\s'\"]+(?:/|\\b)";
         | 
| 1330 1868 | 
             
            config.textPrimitives.unWikiLink = "~";
         | 
| 1331 1869 | 
             
            config.textPrimitives.wikiLink = "(?:(?:" + config.textPrimitives.upperLetter + "+" +
         | 
| 1332 1870 | 
             
            	config.textPrimitives.lowerLetter + "+" +
         | 
| @@ -1341,7 +1879,7 @@ config.textPrimitives.cssLookaheadRegExp = new RegExp(config.textPrimitives.cssL | |
| 1341 1879 | 
             
            config.textPrimitives.brackettedLink = "\\[\\[([^\\]]+)\\]\\]";
         | 
| 1342 1880 | 
             
            config.textPrimitives.titledBrackettedLink = "\\[\\[([^\\[\\]\\|]+)\\|([^\\[\\]\\|]+)\\]\\]";
         | 
| 1343 1881 | 
             
            config.textPrimitives.tiddlerForcedLinkRegExp = new RegExp("(?:" + config.textPrimitives.titledBrackettedLink + ")|(?:" +
         | 
| 1344 | 
            -
            	config.textPrimitives.brackettedLink + ")|(?:" + | 
| 1882 | 
            +
            	config.textPrimitives.brackettedLink + ")|(?:" +
         | 
| 1345 1883 | 
             
            	config.textPrimitives.urlPattern + ")","mg");
         | 
| 1346 1884 | 
             
            config.textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ config.textPrimitives.wikiLink + ")|(?:" +
         | 
| 1347 1885 | 
             
            	config.textPrimitives.titledBrackettedLink + ")|(?:" +
         | 
| @@ -1351,7 +1889,7 @@ config.textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ config.textPrimitiv | |
| 1351 1889 | 
             
            config.glyphs = {
         | 
| 1352 1890 | 
             
            	browsers: [
         | 
| 1353 1891 | 
             
            		function() {return config.browser.isIE;},
         | 
| 1354 | 
            -
            		function() {return true}
         | 
| 1892 | 
            +
            		function() {return true;}
         | 
| 1355 1893 | 
             
            	],
         | 
| 1356 1894 | 
             
            	currBrowser: null,
         | 
| 1357 1895 | 
             
            	codes: {
         | 
| @@ -1368,7 +1906,7 @@ config.glyphs = { | |
| 1368 1906 |  | 
| 1369 1907 | 
             
            config.shadowTiddlers = {
         | 
| 1370 1908 | 
             
            	StyleSheet: "",
         | 
| 1371 | 
            -
            	MarkupPreHead: " | 
| 1909 | 
            +
            	MarkupPreHead: "",
         | 
| 1372 1910 | 
             
            	MarkupPostHead: "",
         | 
| 1373 1911 | 
             
            	MarkupPreBody: "",
         | 
| 1374 1912 | 
             
            	MarkupPostBody: "",
         | 
| @@ -1379,8 +1917,7 @@ config.shadowTiddlers = { | |
| 1379 1917 | 
             
            	TabMoreOrphans: '<<list orphans>>',
         | 
| 1380 1918 | 
             
            	TabMoreShadowed: '<<list shadowed>>',
         | 
| 1381 1919 | 
             
            	AdvancedOptions: '<<options>>',
         | 
| 1382 | 
            -
            	PluginManager: '<<plugins>>' | 
| 1383 | 
            -
            	ImportTiddlers: '<<importTiddlers>>'
         | 
| 1920 | 
            +
            	PluginManager: '<<plugins>>'
         | 
| 1384 1921 | 
             
            };
         | 
| 1385 1922 |  | 
| 1386 1923 | 
             
            //--
         | 
| @@ -1589,7 +2126,7 @@ merge(config.macros.options,{ | |
| 1589 2126 | 
             
            			{name: 'Name', field: 'name', title: "Name", type: 'String'}
         | 
| 1590 2127 | 
             
            			],
         | 
| 1591 2128 | 
             
            		rowClasses: [
         | 
| 1592 | 
            -
            			{className: 'lowlight', field: 'lowlight'} | 
| 2129 | 
            +
            			{className: 'lowlight', field: 'lowlight'}
         | 
| 1593 2130 | 
             
            			]}
         | 
| 1594 2131 | 
             
            	});
         | 
| 1595 2132 |  | 
| @@ -1699,7 +2236,7 @@ merge(config.macros.sync,{ | |
| 1699 2236 | 
             
            	hasChanged: "Changed while unplugged",
         | 
| 1700 2237 | 
             
            	hasNotChanged: "Unchanged while unplugged",
         | 
| 1701 2238 | 
             
            	syncStatusList: {
         | 
| 1702 | 
            -
            		none: {text: "...", color: " | 
| 2239 | 
            +
            		none: {text: "...", color: "transparent"},
         | 
| 1703 2240 | 
             
            		changedServer: {text: "Changed on server", color: '#80ff80'},
         | 
| 1704 2241 | 
             
            		changedLocally: {text: "Changed while unplugged", color: '#80ff80'},
         | 
| 1705 2242 | 
             
            		changedBoth: {text: "Changed while unplugged and on server", color: '#ff8080'},
         | 
| @@ -1785,7 +2322,7 @@ merge(config.shadowTiddlers,{ | |
| 1785 2322 | 
             
            	SiteTitle: "My TiddlyWiki",
         | 
| 1786 2323 | 
             
            	SiteSubtitle: "a reusable non-linear personal web notebook",
         | 
| 1787 2324 | 
             
            	SiteUrl: "http://www.tiddlywiki.com/",
         | 
| 1788 | 
            -
            	SideBarOptions: '<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>',
         | 
| 2325 | 
            +
            	SideBarOptions: '<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>',
         | 
| 1789 2326 | 
             
            	SideBarTabs: '<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>',
         | 
| 1790 2327 | 
             
            	TabMore: '<<tabs txtMoreTab "Missing" "Missing tiddlers" TabMoreMissing "Orphans" "Orphaned tiddlers" TabMoreOrphans "Shadowed" "Shadowed tiddlers" TabMoreShadowed>>'});
         | 
| 1791 2328 |  | 
| @@ -1809,9 +2346,9 @@ merge(config.annotations,{ | |
| 1809 2346 | 
             
            	SiteSubtitle: "This shadow tiddler is used as the second part of the page title",
         | 
| 1810 2347 | 
             
            	SiteTitle: "This shadow tiddler is used as the first part of the page title",
         | 
| 1811 2348 | 
             
            	SiteUrl: "This shadow tiddler should be set to the full target URL for publication",
         | 
| 1812 | 
            -
            	 | 
| 2349 | 
            +
            	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.",
         | 
| 1813 2350 | 
             
            	StyleSheet: "This tiddler can contain custom CSS definitions",
         | 
| 1814 | 
            -
            	StyleSheetLayout: "This shadow tiddler contains CSS definitions related to the layout of page elements",
         | 
| 2351 | 
            +
            	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.",
         | 
| 1815 2352 | 
             
            	StyleSheetLocale: "This shadow tiddler contains CSS definitions related to the translation locale",
         | 
| 1816 2353 | 
             
            	StyleSheetPrint: "This shadow tiddler contains CSS definitions for printing",
         | 
| 1817 2354 | 
             
            	TabAll: "This shadow tiddler contains the contents of the 'All' tab in the right-hand sidebar",
         | 
| @@ -1833,11 +2370,12 @@ var store = null; // TiddlyWiki storage | |
| 1833 2370 | 
             
            var story = null; // Main story
         | 
| 1834 2371 | 
             
            var formatter = null; // Default formatters for the wikifier
         | 
| 1835 2372 | 
             
            config.parsers = {}; // Hashmap of alternative parsers for the wikifier
         | 
| 1836 | 
            -
            var anim = new Animator(); // Animation engine
         | 
| 2373 | 
            +
            var anim = typeof Animator == "function" ? new Animator() : null; // Animation engine
         | 
| 1837 2374 | 
             
            var readOnly = false; // Whether we're in readonly mode
         | 
| 1838 2375 | 
             
            var highlightHack = null; // Embarrassing hack department...
         | 
| 1839 2376 | 
             
            var hadConfirmExit = false; // Don't warn more than once
         | 
| 1840 2377 | 
             
            var safeMode = false; // Disable all plugins and cookies
         | 
| 2378 | 
            +
            var showBackstage; // Whether to include the backstage area
         | 
| 1841 2379 | 
             
            var installedPlugins = []; // Information filled in when plugins are executed
         | 
| 1842 2380 | 
             
            var startingUp = false; // Whether we're in the process of starting up
         | 
| 1843 2381 | 
             
            var pluginInfo,tiddler; // Used to pass information to plugins in loadPlugins()
         | 
| @@ -1848,7 +2386,7 @@ var useJavaSaver = config.browser.isSafari || config.browser.isOpera; | |
| 1848 2386 | 
             
            // Starting up
         | 
| 1849 2387 | 
             
            function main()
         | 
| 1850 2388 | 
             
            {
         | 
| 1851 | 
            -
            	var t9,t8,t7,t6,t5,t4,t3,t2,t1,t0 = new Date();
         | 
| 2389 | 
            +
            	var t10,t9,t8,t7,t6,t5,t4,t3,t2,t1,t0 = new Date();
         | 
| 1852 2390 | 
             
            	startingUp = true;
         | 
| 1853 2391 | 
             
            	window.onbeforeunload = function(e) {if(window.confirmExit) return confirmExit();};
         | 
| 1854 2392 | 
             
            	params = getParameters();
         | 
| @@ -1870,9 +2408,11 @@ function main() | |
| 1870 2408 | 
             
            	invokeParamifier(params,"onload");
         | 
| 1871 2409 | 
             
            	t4 = new Date();
         | 
| 1872 2410 | 
             
            	readOnly = (window.location.protocol == "file:") ? false : config.options.chkHttpReadOnly;
         | 
| 2411 | 
            +
            	showBackstage = !readOnly;
         | 
| 1873 2412 | 
             
            	var pluginProblem = loadPlugins();
         | 
| 1874 2413 | 
             
            	t5 = new Date();
         | 
| 1875 2414 | 
             
            	formatter = new Formatter(config.formatters);
         | 
| 2415 | 
            +
            	story.switchTheme(config.options.txtTheme);
         | 
| 1876 2416 | 
             
            	invokeParamifier(params,"onconfig");
         | 
| 1877 2417 | 
             
            	t6 = new Date();
         | 
| 1878 2418 | 
             
            	store.notifyAll();
         | 
| @@ -1887,16 +2427,18 @@ function main() | |
| 1887 2427 | 
             
            		if(config.macros[m].init)
         | 
| 1888 2428 | 
             
            			config.macros[m].init();
         | 
| 1889 2429 | 
             
            	}
         | 
| 1890 | 
            -
            	if(!readOnly)
         | 
| 1891 | 
            -
            		backstage.init();
         | 
| 1892 2430 | 
             
            	t9 = new Date();
         | 
| 2431 | 
            +
            	if(showBackstage)
         | 
| 2432 | 
            +
            		backstage.init();
         | 
| 2433 | 
            +
            	t10 = new Date();
         | 
| 1893 2434 | 
             
            	if(config.options.chkDisplayStartupTime) {
         | 
| 1894 | 
            -
            		displayMessage(" | 
| 1895 | 
            -
            		displayMessage(" | 
| 1896 | 
            -
            		displayMessage(" | 
| 1897 | 
            -
            		displayMessage("Notify  | 
| 1898 | 
            -
            		displayMessage("Restart  | 
| 1899 | 
            -
            		displayMessage(" | 
| 2435 | 
            +
            		displayMessage("LoadFromDiv " + (t2-t1) + " ms");
         | 
| 2436 | 
            +
            		displayMessage("LoadShadows " + (t3-t2) + " ms");
         | 
| 2437 | 
            +
            		displayMessage("LoadPlugins " + (t5-t4) + " ms");
         | 
| 2438 | 
            +
            		displayMessage("Notify " + (t7-t6) + " ms");
         | 
| 2439 | 
            +
            		displayMessage("Restart " + (t8-t7) + " ms");
         | 
| 2440 | 
            +
            		displayMessage("Macro init " + (t9-t8) + " ms");
         | 
| 2441 | 
            +
            		displayMessage("Total: " + (t10-t0) + " ms");
         | 
| 1900 2442 | 
             
            	}
         | 
| 1901 2443 | 
             
            	startingUp = false;
         | 
| 1902 2444 | 
             
            }
         | 
| @@ -1906,8 +2448,8 @@ function restart() | |
| 1906 2448 | 
             
            {
         | 
| 1907 2449 | 
             
            	invokeParamifier(params,"onstart");
         | 
| 1908 2450 | 
             
            	if(story.isEmpty()) {
         | 
| 1909 | 
            -
            		var  | 
| 1910 | 
            -
            		 | 
| 2451 | 
            +
            		var tiddlers = store.filterTiddlers(store.getTiddlerText("DefaultTiddlers"));
         | 
| 2452 | 
            +
            		story.displayTiddlers(null,tiddlers);
         | 
| 1911 2453 | 
             
            	}
         | 
| 1912 2454 | 
             
            	window.scrollTo(0,0);
         | 
| 1913 2455 | 
             
            }
         | 
| @@ -1942,9 +2484,10 @@ function loadPlugins() | |
| 1942 2484 | 
             
            		var p = getPluginInfo(tiddlers[i]);
         | 
| 1943 2485 | 
             
            		installedPlugins[i] = p;
         | 
| 1944 2486 | 
             
            		var n = p.Name;
         | 
| 1945 | 
            -
            		if(n) | 
| 2487 | 
            +
            		if(n)
         | 
| 1946 2488 | 
             
            			map[n] = p;
         | 
| 1947 | 
            -
            		 | 
| 2489 | 
            +
            		n = p.Source;
         | 
| 2490 | 
            +
            		if(n)
         | 
| 1948 2491 | 
             
            			map[n] = p;
         | 
| 1949 2492 | 
             
            	}
         | 
| 1950 2493 | 
             
            	var visit = function(p) {
         | 
| @@ -1959,8 +2502,8 @@ function loadPlugins() | |
| 1959 2502 | 
             
            		}
         | 
| 1960 2503 | 
             
            		toLoad.push(p);
         | 
| 1961 2504 | 
             
            	};
         | 
| 1962 | 
            -
            	for(i=0; i<nPlugins; i++) | 
| 1963 | 
            -
            		visit(installedPlugins[i]); | 
| 2505 | 
            +
            	for(i=0; i<nPlugins; i++)
         | 
| 2506 | 
            +
            		visit(installedPlugins[i]);
         | 
| 1964 2507 | 
             
            	for(i=0; i<toLoad.length; i++) {
         | 
| 1965 2508 | 
             
            		p = toLoad[i];
         | 
| 1966 2509 | 
             
            		pluginInfo = p;
         | 
| @@ -1977,7 +2520,7 @@ function loadPlugins() | |
| 1977 2520 | 
             
            					p.log.push(config.messages.pluginError.format([exceptionText(ex)]));
         | 
| 1978 2521 | 
             
            					p.error = true;
         | 
| 1979 2522 | 
             
            				}
         | 
| 1980 | 
            -
            				pluginInfo.startupTime = String((new Date()) - startTime) + "ms"; | 
| 2523 | 
            +
            				pluginInfo.startupTime = String((new Date()) - startTime) + "ms";
         | 
| 1981 2524 | 
             
            			} else {
         | 
| 1982 2525 | 
             
            				nPlugins--;
         | 
| 1983 2526 | 
             
            			}
         | 
| @@ -2103,8 +2646,7 @@ config.paramifiers.searchRegExp = { | |
| 2103 2646 | 
             
            config.paramifiers.tag = {
         | 
| 2104 2647 | 
             
            	onstart: function(v) {
         | 
| 2105 2648 | 
             
            		var tagged = store.getTaggedTiddlers(v,"title");
         | 
| 2106 | 
            -
            		 | 
| 2107 | 
            -
            			story.displayTiddler("bottom",tagged[t].title,null,false,null);
         | 
| 2649 | 
            +
            		story.displayTiddlers(null,tagged,null,false,null);
         | 
| 2108 2650 | 
             
            	}
         | 
| 2109 2651 | 
             
            };
         | 
| 2110 2652 |  | 
| @@ -2135,6 +2677,13 @@ config.paramifiers.readOnly = { | |
| 2135 2677 | 
             
            	}
         | 
| 2136 2678 | 
             
            };
         | 
| 2137 2679 |  | 
| 2680 | 
            +
             | 
| 2681 | 
            +
            config.paramifiers.theme = {
         | 
| 2682 | 
            +
            	onconfig: function(v) {
         | 
| 2683 | 
            +
            		story.switchTheme(v);
         | 
| 2684 | 
            +
            	}
         | 
| 2685 | 
            +
            };
         | 
| 2686 | 
            +
             | 
| 2138 2687 | 
             
            //--
         | 
| 2139 2688 | 
             
            //-- Formatter helpers
         | 
| 2140 2689 | 
             
            //--
         | 
| @@ -2156,7 +2705,7 @@ config.formatterHelpers = { | |
| 2156 2705 | 
             
            	{
         | 
| 2157 2706 | 
             
            		w.subWikifyTerm(createTiddlyElement(w.output,this.element),this.termRegExp);
         | 
| 2158 2707 | 
             
            	},
         | 
| 2159 | 
            -
             | 
| 2708 | 
            +
             | 
| 2160 2709 | 
             
            	inlineCssHelper: function(w)
         | 
| 2161 2710 | 
             
            	{
         | 
| 2162 2711 | 
             
            		var styles = [];
         | 
| @@ -2213,7 +2762,7 @@ config.formatterHelpers = { | |
| 2213 2762 | 
             
            		if(urlRegExp.exec(link)) {
         | 
| 2214 2763 | 
             
            			return true;
         | 
| 2215 2764 | 
             
            		}
         | 
| 2216 | 
            -
            		if (link.indexOf(".")!=-1 || link.indexOf("\\")!=-1 || link.indexOf("/")!=-1){
         | 
| 2765 | 
            +
            		if (link.indexOf(".")!=-1 || link.indexOf("\\")!=-1 || link.indexOf("/")!=-1 || link.indexOf("#")!=-1) {
         | 
| 2217 2766 | 
             
            			return true;
         | 
| 2218 2767 | 
             
            		}
         | 
| 2219 2768 | 
             
            		return false;
         | 
| @@ -2234,7 +2783,6 @@ config.formatters = [ | |
| 2234 2783 | 
             
            	cellRegExp: /(?:\|([^\n\|]*)\|)|(\|[fhck]?$\n?)/mg,
         | 
| 2235 2784 | 
             
            	cellTermRegExp: /((?:\x20*)\|)/mg,
         | 
| 2236 2785 | 
             
            	rowTypes: {"c":"caption", "h":"thead", "":"tbody", "f":"tfoot"},
         | 
| 2237 | 
            -
             | 
| 2238 2786 | 
             
            	handler: function(w)
         | 
| 2239 2787 | 
             
            	{
         | 
| 2240 2788 | 
             
            		var table = createTiddlyElement(w.output,"table",null,"twtable");
         | 
| @@ -2263,7 +2811,10 @@ config.formatters = [ | |
| 2263 2811 | 
             
            					rowContainer.setAttribute("align",rowCount == 0?"top":"bottom");
         | 
| 2264 2812 | 
             
            					w.subWikifyTerm(rowContainer,this.rowTermRegExp);
         | 
| 2265 2813 | 
             
            				} else {
         | 
| 2266 | 
            -
            					 | 
| 2814 | 
            +
            					var theRow = createTiddlyElement(rowContainer,"tr",null,(rowCount&1)?"oddRow":"evenRow");
         | 
| 2815 | 
            +
            					theRow.onmouseover = function() {addClass(this,"hoverRow");};
         | 
| 2816 | 
            +
            					theRow.onmouseout = function() {removeClass(this,"hoverRow");};
         | 
| 2817 | 
            +
            					this.rowHandler(w,theRow,prevColumns);
         | 
| 2267 2818 | 
             
            					rowCount++;
         | 
| 2268 2819 | 
             
            				}
         | 
| 2269 2820 | 
             
            			}
         | 
| @@ -2360,7 +2911,7 @@ config.formatters = [ | |
| 2360 2911 | 
             
            	{
         | 
| 2361 2912 | 
             
            		var stack = [w.output];
         | 
| 2362 2913 | 
             
            		var currLevel = 0, currType = null;
         | 
| 2363 | 
            -
            		var listLevel, listType, itemType;
         | 
| 2914 | 
            +
            		var listLevel, listType, itemType, baseType;
         | 
| 2364 2915 | 
             
            		w.nextMatch = w.matchStart;
         | 
| 2365 2916 | 
             
            		this.lookaheadRegExp.lastIndex = w.nextMatch;
         | 
| 2366 2917 | 
             
            		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
         | 
| @@ -2378,6 +2929,8 @@ config.formatters = [ | |
| 2378 2929 | 
             
            				listType = "dl";
         | 
| 2379 2930 | 
             
            				itemType = "dd";
         | 
| 2380 2931 | 
             
            			}
         | 
| 2932 | 
            +
            			if(!baseType)
         | 
| 2933 | 
            +
            				baseType = listType;
         | 
| 2381 2934 | 
             
            			listLevel = lookaheadMatch[0].length;
         | 
| 2382 2935 | 
             
            			w.nextMatch += lookaheadMatch[0].length;
         | 
| 2383 2936 | 
             
            			var t;
         | 
| @@ -2386,6 +2939,9 @@ config.formatters = [ | |
| 2386 2939 | 
             
            					var target = (currLevel == 0) ? stack[stack.length-1] : stack[stack.length-1].lastChild;
         | 
| 2387 2940 | 
             
            					stack.push(createTiddlyElement(target,listType));
         | 
| 2388 2941 | 
             
            				}
         | 
| 2942 | 
            +
            			} else if(listType!=baseType && listLevel==1) {
         | 
| 2943 | 
            +
            				w.nextMatch -= lookaheadMatch[0].length;
         | 
| 2944 | 
            +
            				return;
         | 
| 2389 2945 | 
             
            			} else if(listLevel < currLevel) {
         | 
| 2390 2946 | 
             
            				for(t=currLevel; t>listLevel; t--)
         | 
| 2391 2947 | 
             
            					stack.pop();
         | 
| @@ -2456,53 +3012,37 @@ config.formatters = [ | |
| 2456 3012 |  | 
| 2457 3013 | 
             
            {
         | 
| 2458 3014 | 
             
            	name: "monospacedByLine",
         | 
| 2459 | 
            -
            	match: " | 
| 2460 | 
            -
            	lookaheadRegExp: /^\{\{\{\n((?:^[^\n]*\n)+?)(^\}\}\}$\n?)/mg,
         | 
| 2461 | 
            -
            	element: "pre",
         | 
| 2462 | 
            -
            	handler: config.formatterHelpers.enclosedTextHelper
         | 
| 2463 | 
            -
            },
         | 
| 2464 | 
            -
             | 
| 2465 | 
            -
            {
         | 
| 2466 | 
            -
            	name: "monospacedByLineForCSS",
         | 
| 2467 | 
            -
            	match: "^/\\*\\{\\{\\{\\*/\\n",
         | 
| 2468 | 
            -
            	lookaheadRegExp: /\/\*\{\{\{\*\/\n*((?:^[^\n]*\n)+?)(\n*^\/\*\}\}\}\*\/$\n?)/mg,
         | 
| 3015 | 
            +
            	match: "^(?:/\\*\\{\\{\\{\\*/|\\{\\{\\{|//\\{\\{\\{|<!--\\{\\{\\{-->)\\n",
         | 
| 2469 3016 | 
             
            	element: "pre",
         | 
| 2470 | 
            -
            	handler: config.formatterHelpers.enclosedTextHelper
         | 
| 2471 | 
            -
            },
         | 
| 2472 | 
            -
             | 
| 2473 | 
            -
            {
         | 
| 2474 | 
            -
            	name: "monospacedByLineForPlugin",
         | 
| 2475 | 
            -
            	match: "^//\\{\\{\\{\\n",
         | 
| 2476 | 
            -
            	lookaheadRegExp: /^\/\/\{\{\{\n\n*((?:^[^\n]*\n)+?)(\n*^\/\/\}\}\}$\n?)/mg,
         | 
| 2477 | 
            -
            	element: "pre",
         | 
| 2478 | 
            -
            	handler: config.formatterHelpers.enclosedTextHelper
         | 
| 2479 | 
            -
            },
         | 
| 2480 | 
            -
             | 
| 2481 | 
            -
            {
         | 
| 2482 | 
            -
            	name: "monospacedByLineForTemplate",
         | 
| 2483 | 
            -
            	match: "^<!--\\{\\{\\{-->\\n",
         | 
| 2484 | 
            -
            	lookaheadRegExp: /<!--\{\{\{-->\n*((?:^[^\n]*\n)+?)(\n*^<!--\}\}\}-->$\n?)/mg,
         | 
| 2485 | 
            -
            	element: "pre",
         | 
| 2486 | 
            -
            	handler: config.formatterHelpers.enclosedTextHelper
         | 
| 2487 | 
            -
            },
         | 
| 2488 | 
            -
             | 
| 2489 | 
            -
            {
         | 
| 2490 | 
            -
            	name: "wikifyCommentForPlugin",
         | 
| 2491 | 
            -
            	match: "^/\\*\\*\\*\\n",
         | 
| 2492 | 
            -
            	termRegExp: /(^\*\*\*\/\n)/mg,
         | 
| 2493 3017 | 
             
            	handler: function(w)
         | 
| 2494 3018 | 
             
            	{
         | 
| 2495 | 
            -
            		 | 
| 3019 | 
            +
            		switch(w.matchText) {
         | 
| 3020 | 
            +
            		case "/*{{{*/\n": // CSS
         | 
| 3021 | 
            +
            			this.lookaheadRegExp = /\/\*\{\{\{\*\/\n*((?:^[^\n]*\n)+?)(\n*^\/\*\}\}\}\*\/$\n?)/mg;
         | 
| 3022 | 
            +
            			break;
         | 
| 3023 | 
            +
            		case "{{{\n": // monospaced block
         | 
| 3024 | 
            +
            			this.lookaheadRegExp = /^\{\{\{\n((?:^[^\n]*\n)+?)(^\}\}\}$\n?)/mg;
         | 
| 3025 | 
            +
            			break;
         | 
| 3026 | 
            +
            		case "//{{{\n": // plugin
         | 
| 3027 | 
            +
            			this.lookaheadRegExp = /^\/\/\{\{\{\n\n*((?:^[^\n]*\n)+?)(\n*^\/\/\}\}\}$\n?)/mg;
         | 
| 3028 | 
            +
            			break;
         | 
| 3029 | 
            +
            		case "<!--{{{-->\n": //template
         | 
| 3030 | 
            +
            			this.lookaheadRegExp = /<!--\{\{\{-->\n*((?:^[^\n]*\n)+?)(\n*^<!--\}\}\}-->$\n?)/mg;
         | 
| 3031 | 
            +
            			break;
         | 
| 3032 | 
            +
            		default:
         | 
| 3033 | 
            +
            			break;
         | 
| 3034 | 
            +
            		}
         | 
| 3035 | 
            +
            		config.formatterHelpers.enclosedTextHelper.call(this,w);
         | 
| 2496 3036 | 
             
            	}
         | 
| 2497 3037 | 
             
            },
         | 
| 2498 3038 |  | 
| 2499 3039 | 
             
            {
         | 
| 2500 | 
            -
            	name: " | 
| 2501 | 
            -
            	match: " | 
| 2502 | 
            -
            	 | 
| 2503 | 
            -
            	handler: function(w) 
         | 
| 3040 | 
            +
            	name: "wikifyComment",
         | 
| 3041 | 
            +
            	match: "^(?:/\\*\\*\\*|<!---)\\n",
         | 
| 3042 | 
            +
            	handler: function(w)
         | 
| 2504 3043 | 
             
            	{
         | 
| 2505 | 
            -
            		 | 
| 3044 | 
            +
            		var termRegExp = (w.matchText == "/***\n") ? (/(^\*\*\*\/\n)/mg) : (/(^--->\n)/mg);
         | 
| 3045 | 
            +
            		w.subWikifyTerm(w.output,termRegExp);
         | 
| 2506 3046 | 
             
            	}
         | 
| 2507 3047 | 
             
            },
         | 
| 2508 3048 |  | 
| @@ -2547,20 +3087,15 @@ config.formatters = [ | |
| 2547 3087 | 
             
            	}
         | 
| 2548 3088 | 
             
            },
         | 
| 2549 3089 |  | 
| 2550 | 
            -
            {
         | 
| 2551 | 
            -
            	name: "unWikiLink",
         | 
| 2552 | 
            -
            	match: config.textPrimitives.unWikiLink+config.textPrimitives.wikiLink,
         | 
| 2553 | 
            -
            	handler: function(w)
         | 
| 2554 | 
            -
            	{
         | 
| 2555 | 
            -
            		w.outputText(w.output,w.matchStart+1,w.nextMatch);
         | 
| 2556 | 
            -
            	}
         | 
| 2557 | 
            -
            },
         | 
| 2558 | 
            -
             | 
| 2559 3090 | 
             
            {
         | 
| 2560 3091 | 
             
            	name: "wikiLink",
         | 
| 2561 | 
            -
            	match: config.textPrimitives.wikiLink,
         | 
| 3092 | 
            +
            	match: config.textPrimitives.unWikiLink+"?"+config.textPrimitives.wikiLink,
         | 
| 2562 3093 | 
             
            	handler: function(w)
         | 
| 2563 3094 | 
             
            	{
         | 
| 3095 | 
            +
            		if(w.matchText.substr(0,1) == config.textPrimitives.unWikiLink) {
         | 
| 3096 | 
            +
            			w.outputText(w.output,w.matchStart+1,w.nextMatch);
         | 
| 3097 | 
            +
            			return;
         | 
| 3098 | 
            +
            		}
         | 
| 2564 3099 | 
             
            		if(w.matchStart > 0) {
         | 
| 2565 3100 | 
             
            			var preRegExp = new RegExp(config.textPrimitives.anyLetterStrict,"mg");
         | 
| 2566 3101 | 
             
            			preRegExp.lastIndex = w.matchStart-1;
         | 
| @@ -2570,7 +3105,7 @@ config.formatters = [ | |
| 2570 3105 | 
             
            				return;
         | 
| 2571 3106 | 
             
            			}
         | 
| 2572 3107 | 
             
            		}
         | 
| 2573 | 
            -
            		if(w.autoLinkWikiWords  | 
| 3108 | 
            +
            		if(w.autoLinkWikiWords || store.isShadowTiddler(w.matchText)) {
         | 
| 2574 3109 | 
             
            			var link = createTiddlyLink(w.output,w.matchText,false,null,w.isStatic,w.tiddler);
         | 
| 2575 3110 | 
             
            			w.outputText(link,w.matchStart,w.nextMatch);
         | 
| 2576 3111 | 
             
            		} else {
         | 
| @@ -2645,81 +3180,77 @@ config.formatters = [ | |
| 2645 3180 | 
             
            },
         | 
| 2646 3181 |  | 
| 2647 3182 | 
             
            {
         | 
| 2648 | 
            -
            	name: " | 
| 2649 | 
            -
            	match: "''",
         | 
| 2650 | 
            -
            	 | 
| 2651 | 
            -
            	 | 
| 2652 | 
            -
             | 
| 2653 | 
            -
             | 
| 2654 | 
            -
             | 
| 2655 | 
            -
             | 
| 2656 | 
            -
             | 
| 2657 | 
            -
             | 
| 2658 | 
            -
             | 
| 2659 | 
            -
             | 
| 2660 | 
            -
             | 
| 2661 | 
            -
             | 
| 2662 | 
            -
             | 
| 2663 | 
            -
             | 
| 2664 | 
            -
             | 
| 2665 | 
            -
             | 
| 2666 | 
            -
             | 
| 2667 | 
            -
             | 
| 2668 | 
            -
             | 
| 2669 | 
            -
             | 
| 2670 | 
            -
             | 
| 2671 | 
            -
            {
         | 
| 2672 | 
            -
             | 
| 2673 | 
            -
             | 
| 2674 | 
            -
             | 
| 2675 | 
            -
             | 
| 2676 | 
            -
             | 
| 2677 | 
            -
             | 
| 2678 | 
            -
             | 
| 2679 | 
            -
             | 
| 2680 | 
            -
             | 
| 2681 | 
            -
            	 | 
| 2682 | 
            -
            	termRegExp: /(\^\^)/mg,
         | 
| 2683 | 
            -
            	element: "sup",
         | 
| 2684 | 
            -
            	handler: config.formatterHelpers.createElementAndWikify
         | 
| 2685 | 
            -
            },
         | 
| 2686 | 
            -
             | 
| 2687 | 
            -
            {
         | 
| 2688 | 
            -
            	name: "subscriptByChar",
         | 
| 2689 | 
            -
            	match: "~~",
         | 
| 2690 | 
            -
            	termRegExp: /(~~)/mg,
         | 
| 2691 | 
            -
            	element: "sub",
         | 
| 2692 | 
            -
            	handler: config.formatterHelpers.createElementAndWikify
         | 
| 3183 | 
            +
            	name: "characterFormat",
         | 
| 3184 | 
            +
            	match: "''|//|__|\\^\\^|~~|--(?!\\s|$)|\\{\\{\\{",
         | 
| 3185 | 
            +
            	handler: function(w)
         | 
| 3186 | 
            +
            	{
         | 
| 3187 | 
            +
            		switch(w.matchText) {
         | 
| 3188 | 
            +
            		case "''":
         | 
| 3189 | 
            +
            			w.subWikifyTerm(w.output.appendChild(document.createElement("strong")),/('')/mg);
         | 
| 3190 | 
            +
            			break;
         | 
| 3191 | 
            +
            		case "//":
         | 
| 3192 | 
            +
            			w.subWikifyTerm(createTiddlyElement(w.output,"em"),/(\/\/)/mg);
         | 
| 3193 | 
            +
            			break;
         | 
| 3194 | 
            +
            		case "__":
         | 
| 3195 | 
            +
            			w.subWikifyTerm(createTiddlyElement(w.output,"u"),/(__)/mg);
         | 
| 3196 | 
            +
            			break;
         | 
| 3197 | 
            +
            		case "^^":
         | 
| 3198 | 
            +
            			w.subWikifyTerm(createTiddlyElement(w.output,"sup"),/(\^\^)/mg);
         | 
| 3199 | 
            +
            			break;
         | 
| 3200 | 
            +
            		case "~~":
         | 
| 3201 | 
            +
            			w.subWikifyTerm(createTiddlyElement(w.output,"sub"),/(~~)/mg);
         | 
| 3202 | 
            +
            			break;
         | 
| 3203 | 
            +
            		case "--":
         | 
| 3204 | 
            +
            			w.subWikifyTerm(createTiddlyElement(w.output,"strike"),/(--)/mg);
         | 
| 3205 | 
            +
            			break;
         | 
| 3206 | 
            +
            		case "{{{":
         | 
| 3207 | 
            +
            			var lookaheadRegExp = /\{\{\{((?:.|\n)*?)\}\}\}/mg;
         | 
| 3208 | 
            +
            			lookaheadRegExp.lastIndex = w.matchStart;
         | 
| 3209 | 
            +
            			var lookaheadMatch = lookaheadRegExp.exec(w.source);
         | 
| 3210 | 
            +
            			if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
         | 
| 3211 | 
            +
            				createTiddlyElement(w.output,"code",null,null,lookaheadMatch[1]);
         | 
| 3212 | 
            +
            				w.nextMatch = lookaheadRegExp.lastIndex;
         | 
| 3213 | 
            +
            			}
         | 
| 3214 | 
            +
            			break;
         | 
| 3215 | 
            +
            		}
         | 
| 3216 | 
            +
            	}
         | 
| 2693 3217 | 
             
            },
         | 
| 2694 3218 |  | 
| 2695 3219 | 
             
            {
         | 
| 2696 | 
            -
            	name: " | 
| 2697 | 
            -
            	match: " | 
| 2698 | 
            -
            	lookaheadRegExp: /\{\{\{((?:.|\n)*?)\}\}\}/mg,
         | 
| 3220 | 
            +
            	name: "customFormat",
         | 
| 3221 | 
            +
            	match: "@@|\\{\\{",
         | 
| 2699 3222 | 
             
            	handler: function(w)
         | 
| 2700 3223 | 
             
            	{
         | 
| 2701 | 
            -
            		 | 
| 2702 | 
            -
            		 | 
| 2703 | 
            -
             | 
| 2704 | 
            -
            			 | 
| 2705 | 
            -
            			 | 
| 3224 | 
            +
            		switch(w.matchText) {
         | 
| 3225 | 
            +
            		case "@@":
         | 
| 3226 | 
            +
            			var e = createTiddlyElement(w.output,"span");
         | 
| 3227 | 
            +
            			var styles = config.formatterHelpers.inlineCssHelper(w);
         | 
| 3228 | 
            +
            			if(styles.length == 0)
         | 
| 3229 | 
            +
            				e.className = "marked";
         | 
| 3230 | 
            +
            			else
         | 
| 3231 | 
            +
            				config.formatterHelpers.applyCssHelper(e,styles);
         | 
| 3232 | 
            +
            			w.subWikifyTerm(e,/(@@)/mg);
         | 
| 3233 | 
            +
            			break;
         | 
| 3234 | 
            +
            		case "{{":
         | 
| 3235 | 
            +
            			lookaheadRegExp = /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg;
         | 
| 3236 | 
            +
            			lookaheadRegExp.lastIndex = w.matchStart;
         | 
| 3237 | 
            +
            			lookaheadMatch = lookaheadRegExp.exec(w.source);
         | 
| 3238 | 
            +
            			if(lookaheadMatch) {
         | 
| 3239 | 
            +
            				w.nextMatch = lookaheadRegExp.lastIndex;
         | 
| 3240 | 
            +
            				e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]);
         | 
| 3241 | 
            +
            				w.subWikifyTerm(e,/(\}\}\})/mg);
         | 
| 3242 | 
            +
            			}
         | 
| 3243 | 
            +
            			break;
         | 
| 2706 3244 | 
             
            		}
         | 
| 2707 3245 | 
             
            	}
         | 
| 2708 3246 | 
             
            },
         | 
| 2709 3247 |  | 
| 2710 3248 | 
             
            {
         | 
| 2711 | 
            -
            	name: " | 
| 2712 | 
            -
            	match: " | 
| 2713 | 
            -
            	termRegExp: /(@@)/mg,
         | 
| 3249 | 
            +
            	name: "mdash",
         | 
| 3250 | 
            +
            	match: "--",
         | 
| 2714 3251 | 
             
            	handler: function(w)
         | 
| 2715 3252 | 
             
            	{
         | 
| 2716 | 
            -
            		 | 
| 2717 | 
            -
            		var styles = config.formatterHelpers.inlineCssHelper(w);
         | 
| 2718 | 
            -
            		if(styles.length == 0)
         | 
| 2719 | 
            -
            			e.className = "marked";
         | 
| 2720 | 
            -
            		else
         | 
| 2721 | 
            -
            			config.formatterHelpers.applyCssHelper(e,styles);
         | 
| 2722 | 
            -
            		w.subWikifyTerm(e,this.termRegExp);
         | 
| 3253 | 
            +
            		createTiddlyElement(w.output,"span").innerHTML = "—";
         | 
| 2723 3254 | 
             
            	}
         | 
| 2724 3255 | 
             
            },
         | 
| 2725 3256 |  | 
| @@ -2747,38 +3278,12 @@ config.formatters = [ | |
| 2747 3278 | 
             
            	}
         | 
| 2748 3279 | 
             
            },
         | 
| 2749 3280 |  | 
| 2750 | 
            -
            {
         | 
| 2751 | 
            -
            	name: "mdash",
         | 
| 2752 | 
            -
            	match: "--",
         | 
| 2753 | 
            -
            	handler: function(w)
         | 
| 2754 | 
            -
            	{
         | 
| 2755 | 
            -
            		createTiddlyElement(w.output,"span").innerHTML = "—";
         | 
| 2756 | 
            -
            	}
         | 
| 2757 | 
            -
            },
         | 
| 2758 | 
            -
             | 
| 2759 3281 | 
             
            {
         | 
| 2760 3282 | 
             
            	name: "htmlEntitiesEncoding",
         | 
| 2761 | 
            -
            	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};)",
         | 
| 2762 | 
            -
            	handler: function(w)
         | 
| 2763 | 
            -
            	{
         | 
| 2764 | 
            -
            		createTiddlyElement(w.output,"span").innerHTML = w.matchText;
         | 
| 2765 | 
            -
            	}
         | 
| 2766 | 
            -
            },
         | 
| 2767 | 
            -
             | 
| 2768 | 
            -
            {
         | 
| 2769 | 
            -
            	name: "customClasses",
         | 
| 2770 | 
            -
            	match: "\\{\\{",
         | 
| 2771 | 
            -
            	termRegExp: /(\}\}\})/mg,
         | 
| 2772 | 
            -
            	lookaheadRegExp: /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg,
         | 
| 3283 | 
            +
            	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};)",
         | 
| 2773 3284 | 
             
            	handler: function(w)
         | 
| 2774 3285 | 
             
            	{
         | 
| 2775 | 
            -
            		 | 
| 2776 | 
            -
            		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
         | 
| 2777 | 
            -
            		if(lookaheadMatch) {
         | 
| 2778 | 
            -
            			var e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]);
         | 
| 2779 | 
            -
            			w.nextMatch = this.lookaheadRegExp.lastIndex;
         | 
| 2780 | 
            -
            			w.subWikifyTerm(e,this.termRegExp);
         | 
| 2781 | 
            -
            		}
         | 
| 3286 | 
            +
            		createTiddlyElement(w.output,"span").innerHTML = w.matchText;
         | 
| 2782 3287 | 
             
            	}
         | 
| 2783 3288 | 
             
            }
         | 
| 2784 3289 |  | 
| @@ -2793,13 +3298,14 @@ function getParser(tiddler,format) | |
| 2793 3298 | 
             
            	if(tiddler) {
         | 
| 2794 3299 | 
             
            		if(!format)
         | 
| 2795 3300 | 
             
            			format = tiddler.fields["wikiformat"];
         | 
| 3301 | 
            +
            		var i;
         | 
| 2796 3302 | 
             
            		if(format) {
         | 
| 2797 | 
            -
            			for( | 
| 3303 | 
            +
            			for(i in config.parsers) {
         | 
| 2798 3304 | 
             
            				if(format == config.parsers[i].format)
         | 
| 2799 3305 | 
             
            					return config.parsers[i];
         | 
| 2800 3306 | 
             
            			}
         | 
| 2801 3307 | 
             
            		} else {
         | 
| 2802 | 
            -
            			for( | 
| 3308 | 
            +
            			for(i in config.parsers) {
         | 
| 2803 3309 | 
             
            				if(tiddler.isTagged(config.parsers[i].formatTag))
         | 
| 2804 3310 | 
             
            					return config.parsers[i];
         | 
| 2805 3311 | 
             
            			}
         | 
| @@ -2894,7 +3400,6 @@ Wikifier.prototype.subWikify = function(output,terminator) | |
| 2894 3400 |  | 
| 2895 3401 | 
             
            Wikifier.prototype.subWikifyUnterm = function(output)
         | 
| 2896 3402 | 
             
            {
         | 
| 2897 | 
            -
            	// subWikify() can be indirectly recursive, so we need to save the old output pointer
         | 
| 2898 3403 | 
             
            	var oldOutput = this.output;
         | 
| 2899 3404 | 
             
            	this.output = output;
         | 
| 2900 3405 | 
             
            	this.formatter.formatterRegExp.lastIndex = this.nextMatch;
         | 
| @@ -2926,10 +3431,8 @@ Wikifier.prototype.subWikifyUnterm = function(output) | |
| 2926 3431 |  | 
| 2927 3432 | 
             
            Wikifier.prototype.subWikifyTerm = function(output,terminatorRegExp)
         | 
| 2928 3433 | 
             
            {
         | 
| 2929 | 
            -
            	// subWikify() can be indirectly recursive, so we need to save the old output pointer
         | 
| 2930 3434 | 
             
            	var oldOutput = this.output;
         | 
| 2931 3435 | 
             
            	this.output = output;
         | 
| 2932 | 
            -
            	// Get the first matches for the formatter and terminator RegExps
         | 
| 2933 3436 | 
             
            	terminatorRegExp.lastIndex = this.nextMatch;
         | 
| 2934 3437 | 
             
            	var terminatorMatch = terminatorRegExp.exec(this.source);
         | 
| 2935 3438 | 
             
            	this.formatter.formatterRegExp.lastIndex = this.nextMatch;
         | 
| @@ -2994,11 +3497,7 @@ Wikifier.prototype.outputText = function(place,startPos,endPos) | |
| 2994 3497 | 
             
            config.macros.today.handler = function(place,macroName,params)
         | 
| 2995 3498 | 
             
            {
         | 
| 2996 3499 | 
             
            	var now = new Date();
         | 
| 2997 | 
            -
            	var text;
         | 
| 2998 | 
            -
            	if(params[0])
         | 
| 2999 | 
            -
            		text = now.formatString(params[0].trim());
         | 
| 3000 | 
            -
            	else
         | 
| 3001 | 
            -
            		text = now.toLocaleString();
         | 
| 3500 | 
            +
            	var text = params[0] ? now.formatString(params[0].trim()) : text = now.toLocaleString();
         | 
| 3002 3501 | 
             
            	createTiddlyElement(place,"span",null,null,text);
         | 
| 3003 3502 | 
             
            };
         | 
| 3004 3503 |  | 
| @@ -3049,6 +3548,18 @@ config.macros.list.touched.handler = function(params) | |
| 3049 3548 | 
             
            	return store.getTouched();
         | 
| 3050 3549 | 
             
            };
         | 
| 3051 3550 |  | 
| 3551 | 
            +
            config.macros.list.filter.handler = function(params)
         | 
| 3552 | 
            +
            {
         | 
| 3553 | 
            +
            	var filter = params[1];
         | 
| 3554 | 
            +
            	var results = [];
         | 
| 3555 | 
            +
            	if(filter) {
         | 
| 3556 | 
            +
            		var tiddlers = store.filterTiddlers(filter);
         | 
| 3557 | 
            +
            		for(var t=0; t<tiddlers.length; t++)
         | 
| 3558 | 
            +
            			results.push(tiddlers[t].title);
         | 
| 3559 | 
            +
            	}
         | 
| 3560 | 
            +
            	return results;
         | 
| 3561 | 
            +
            };
         | 
| 3562 | 
            +
             | 
| 3052 3563 | 
             
            config.macros.allTags.handler = function(place,macroName,params)
         | 
| 3053 3564 | 
             
            {
         | 
| 3054 3565 | 
             
            	var tags = store.getTags(params[0]);
         | 
| @@ -3072,89 +3583,20 @@ config.macros.timeline.handler = function(place,macroName,params) | |
| 3072 3583 | 
             
            	var tiddlers = store.reverseLookup("tags","excludeLists",false,field);
         | 
| 3073 3584 | 
             
            	var lastDay = "";
         | 
| 3074 3585 | 
             
            	var last = params[1] ? tiddlers.length-Math.min(tiddlers.length,parseInt(params[1])) : 0;
         | 
| 3586 | 
            +
            	var dateFormat = params[2] ? params[2] : this.dateFormat;
         | 
| 3075 3587 | 
             
            	for(var t=tiddlers.length-1; t>=last; t--) {
         | 
| 3076 3588 | 
             
            		var tiddler = tiddlers[t];
         | 
| 3077 3589 | 
             
            		var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);
         | 
| 3078 3590 | 
             
            		if(theDay != lastDay) {
         | 
| 3079 | 
            -
            			var  | 
| 3080 | 
            -
            			place.appendChild( | 
| 3081 | 
            -
            			createTiddlyElement( | 
| 3591 | 
            +
            			var ul = document.createElement("ul");
         | 
| 3592 | 
            +
            			place.appendChild(ul);
         | 
| 3593 | 
            +
            			createTiddlyElement(ul,"li",null,"listTitle",tiddler[field].formatString(dateFormat));
         | 
| 3082 3594 | 
             
            			lastDay = theDay;
         | 
| 3083 3595 | 
             
            		}
         | 
| 3084 | 
            -
            		 | 
| 3085 | 
            -
            		theDateListItem.appendChild(createTiddlyLink(place,tiddler.title,true));
         | 
| 3086 | 
            -
            	}
         | 
| 3087 | 
            -
            };
         | 
| 3088 | 
            -
             | 
| 3089 | 
            -
            config.macros.search.handler = function(place,macroName,params)
         | 
| 3090 | 
            -
            {
         | 
| 3091 | 
            -
            	var searchTimeout = null;
         | 
| 3092 | 
            -
            	var btn = createTiddlyButton(place,this.label,this.prompt,this.onClick);
         | 
| 3093 | 
            -
            	var txt = createTiddlyElement(place,"input",null,"txtOptionInput");
         | 
| 3094 | 
            -
            	if(params[0])
         | 
| 3095 | 
            -
            		txt.value = params[0];
         | 
| 3096 | 
            -
            	txt.onkeyup = this.onKeyPress;
         | 
| 3097 | 
            -
            	txt.onfocus = this.onFocus;
         | 
| 3098 | 
            -
            	txt.setAttribute("size",this.sizeTextbox);
         | 
| 3099 | 
            -
            	txt.setAttribute("accessKey",this.accessKey);
         | 
| 3100 | 
            -
            	txt.setAttribute("autocomplete","off");
         | 
| 3101 | 
            -
            	txt.setAttribute("lastSearchText","");
         | 
| 3102 | 
            -
            	if(config.browser.isSafari) {
         | 
| 3103 | 
            -
            		txt.setAttribute("type","search");
         | 
| 3104 | 
            -
            		txt.setAttribute("results","5");
         | 
| 3105 | 
            -
            	} else {
         | 
| 3106 | 
            -
            		txt.setAttribute("type","text");
         | 
| 3107 | 
            -
            	}
         | 
| 3108 | 
            -
            };
         | 
| 3109 | 
            -
             | 
| 3110 | 
            -
            // Global because there's only ever one outstanding incremental search timer
         | 
| 3111 | 
            -
            config.macros.search.timeout = null;
         | 
| 3112 | 
            -
             | 
| 3113 | 
            -
            config.macros.search.doSearch = function(txt)
         | 
| 3114 | 
            -
            {
         | 
| 3115 | 
            -
            	if(txt.value.length > 0) {
         | 
| 3116 | 
            -
            		story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);
         | 
| 3117 | 
            -
            		txt.setAttribute("lastSearchText",txt.value);
         | 
| 3118 | 
            -
            	}
         | 
| 3119 | 
            -
            };
         | 
| 3120 | 
            -
             | 
| 3121 | 
            -
            config.macros.search.onClick = function(e)
         | 
| 3122 | 
            -
            {
         | 
| 3123 | 
            -
            	config.macros.search.doSearch(this.nextSibling);
         | 
| 3124 | 
            -
            	return false;
         | 
| 3125 | 
            -
            };
         | 
| 3126 | 
            -
             | 
| 3127 | 
            -
            config.macros.search.onKeyPress = function(e)
         | 
| 3128 | 
            -
            {
         | 
| 3129 | 
            -
            	if(!e) var e = window.event;
         | 
| 3130 | 
            -
            	switch(e.keyCode) {
         | 
| 3131 | 
            -
            		case 13: // Ctrl-Enter
         | 
| 3132 | 
            -
            		case 10: // Ctrl-Enter on IE PC
         | 
| 3133 | 
            -
            			config.macros.search.doSearch(this);
         | 
| 3134 | 
            -
            			break;
         | 
| 3135 | 
            -
            		case 27: // Escape
         | 
| 3136 | 
            -
            			this.value = "";
         | 
| 3137 | 
            -
            			clearMessage();
         | 
| 3138 | 
            -
            			break;
         | 
| 3139 | 
            -
            	}
         | 
| 3140 | 
            -
            	if(this.value.length > 2) {
         | 
| 3141 | 
            -
            		if(this.value != this.getAttribute("lastSearchText")) {
         | 
| 3142 | 
            -
            			if(config.macros.search.timeout)
         | 
| 3143 | 
            -
            				clearTimeout(config.macros.search.timeout);
         | 
| 3144 | 
            -
            			var txt = this;
         | 
| 3145 | 
            -
            			config.macros.search.timeout = setTimeout(function() {config.macros.search.doSearch(txt);},500);
         | 
| 3146 | 
            -
            		}
         | 
| 3147 | 
            -
            	} else {
         | 
| 3148 | 
            -
            		if(config.macros.search.timeout)
         | 
| 3149 | 
            -
            			clearTimeout(config.macros.search.timeout);
         | 
| 3596 | 
            +
            		createTiddlyElement(ul,"li",null,"listLink").appendChild(createTiddlyLink(place,tiddler.title,true));
         | 
| 3150 3597 | 
             
            	}
         | 
| 3151 3598 | 
             
            };
         | 
| 3152 3599 |  | 
| 3153 | 
            -
            config.macros.search.onFocus = function(e)
         | 
| 3154 | 
            -
            {
         | 
| 3155 | 
            -
            	this.select();
         | 
| 3156 | 
            -
            };
         | 
| 3157 | 
            -
             | 
| 3158 3600 | 
             
            config.macros.tiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler)
         | 
| 3159 3601 | 
             
            {
         | 
| 3160 3602 | 
             
            	params = paramString.parseParams("name",null,true,false,true);
         | 
| @@ -3186,7 +3628,7 @@ config.macros.tiddler.handler = function(place,macroName,params,wikifier,paramSt | |
| 3186 3628 | 
             
            	}
         | 
| 3187 3629 | 
             
            };
         | 
| 3188 3630 |  | 
| 3189 | 
            -
            config.macros.tiddler.renderText = function(place,text,tiddlerName,params) | 
| 3631 | 
            +
            config.macros.tiddler.renderText = function(place,text,tiddlerName,params)
         | 
| 3190 3632 | 
             
            {
         | 
| 3191 3633 | 
             
            	wikify(text,place,null,store.getTiddler(tiddlerName));
         | 
| 3192 3634 | 
             
            };
         | 
| @@ -3201,37 +3643,37 @@ config.macros.tag.handler = function(place,macroName,params) | |
| 3201 3643 | 
             
            config.macros.tags.handler = function(place,macroName,params,wikifier,paramString,tiddler)
         | 
| 3202 3644 | 
             
            {
         | 
| 3203 3645 | 
             
            	params = paramString.parseParams("anon",null,true,false,false);
         | 
| 3204 | 
            -
            	var  | 
| 3646 | 
            +
            	var ul = createTiddlyElement(place,"ul");
         | 
| 3205 3647 | 
             
            	var title = getParam(params,"anon","");
         | 
| 3206 3648 | 
             
            	if(title && store.tiddlerExists(title))
         | 
| 3207 3649 | 
             
            		tiddler = store.getTiddler(title);
         | 
| 3208 3650 | 
             
            	var sep = getParam(params,"sep"," ");
         | 
| 3209 3651 | 
             
            	var lingo = config.views.wikified.tag;
         | 
| 3210 3652 | 
             
            	var prompt = tiddler.tags.length == 0 ? lingo.labelNoTags : lingo.labelTags;
         | 
| 3211 | 
            -
            	createTiddlyElement( | 
| 3653 | 
            +
            	createTiddlyElement(ul,"li",null,"listTitle",prompt.format([tiddler.title]));
         | 
| 3212 3654 | 
             
            	for(var t=0; t<tiddler.tags.length; t++) {
         | 
| 3213 | 
            -
            		createTagButton(createTiddlyElement( | 
| 3655 | 
            +
            		createTagButton(createTiddlyElement(ul,"li"),tiddler.tags[t],tiddler.title);
         | 
| 3214 3656 | 
             
            		if(t<tiddler.tags.length-1)
         | 
| 3215 | 
            -
            			createTiddlyText( | 
| 3657 | 
            +
            			createTiddlyText(ul,sep);
         | 
| 3216 3658 | 
             
            	}
         | 
| 3217 3659 | 
             
            };
         | 
| 3218 3660 |  | 
| 3219 3661 | 
             
            config.macros.tagging.handler = function(place,macroName,params,wikifier,paramString,tiddler)
         | 
| 3220 3662 | 
             
            {
         | 
| 3221 3663 | 
             
            	params = paramString.parseParams("anon",null,true,false,false);
         | 
| 3222 | 
            -
            	var  | 
| 3664 | 
            +
            	var ul = createTiddlyElement(place,"ul");
         | 
| 3223 3665 | 
             
            	var title = getParam(params,"anon","");
         | 
| 3224 3666 | 
             
            	if(title == "" && tiddler instanceof Tiddler)
         | 
| 3225 3667 | 
             
            		title = tiddler.title;
         | 
| 3226 3668 | 
             
            	var sep = getParam(params,"sep"," ");
         | 
| 3227 | 
            -
            	 | 
| 3669 | 
            +
            	ul.setAttribute("title",this.tooltip.format([title]));
         | 
| 3228 3670 | 
             
            	var tagged = store.getTaggedTiddlers(title);
         | 
| 3229 3671 | 
             
            	var prompt = tagged.length == 0 ? this.labelNotTag : this.label;
         | 
| 3230 | 
            -
            	createTiddlyElement( | 
| 3672 | 
            +
            	createTiddlyElement(ul,"li",null,"listTitle",prompt.format([title,tagged.length]));
         | 
| 3231 3673 | 
             
            	for(var t=0; t<tagged.length; t++) {
         | 
| 3232 | 
            -
            		createTiddlyLink(createTiddlyElement( | 
| 3674 | 
            +
            		createTiddlyLink(createTiddlyElement(ul,"li"),tagged[t].title,true);
         | 
| 3233 3675 | 
             
            		if(t<tagged.length-1)
         | 
| 3234 | 
            -
            			createTiddlyText( | 
| 3676 | 
            +
            			createTiddlyText(ul,sep);
         | 
| 3235 3677 | 
             
            	}
         | 
| 3236 3678 | 
             
            };
         | 
| 3237 3679 |  | 
| @@ -3269,9 +3711,9 @@ config.macros.saveChanges.onClick = function(e) | |
| 3269 3711 | 
             
            	return false;
         | 
| 3270 3712 | 
             
            };
         | 
| 3271 3713 |  | 
| 3272 | 
            -
            config.macros.slider.onClickSlider = function( | 
| 3714 | 
            +
            config.macros.slider.onClickSlider = function(ev)
         | 
| 3273 3715 | 
             
            {
         | 
| 3274 | 
            -
            	 | 
| 3716 | 
            +
            	var e = ev ? ev : window.event;
         | 
| 3275 3717 | 
             
            	var n = this.nextSibling;
         | 
| 3276 3718 | 
             
            	var cookie = n.getAttribute("cookie");
         | 
| 3277 3719 | 
             
            	var isOpen = n.style.display != "none";
         | 
| @@ -3286,11 +3728,11 @@ config.macros.slider.onClickSlider = function(e) | |
| 3286 3728 |  | 
| 3287 3729 | 
             
            config.macros.slider.createSlider = function(place,cookie,title,tooltip)
         | 
| 3288 3730 | 
             
            {
         | 
| 3289 | 
            -
            	var  | 
| 3731 | 
            +
            	var c = cookie ? cookie : "";
         | 
| 3290 3732 | 
             
            	var btn = createTiddlyButton(place,title,tooltip,this.onClickSlider);
         | 
| 3291 3733 | 
             
            	var panel = createTiddlyElement(null,"div",null,"sliderPanel");
         | 
| 3292 | 
            -
            	panel.setAttribute("cookie", | 
| 3293 | 
            -
            	panel.style.display = config.options[ | 
| 3734 | 
            +
            	panel.setAttribute("cookie",c);
         | 
| 3735 | 
            +
            	panel.style.display = config.options[c] ? "block" : "none";
         | 
| 3294 3736 | 
             
            	place.appendChild(panel);
         | 
| 3295 3737 | 
             
            	return panel;
         | 
| 3296 3738 | 
             
            };
         | 
| @@ -3305,132 +3747,173 @@ config.macros.slider.handler = function(place,macroName,params) | |
| 3305 3747 | 
             
            		wikify(text,panel,null,store.getTiddler(params[1]));
         | 
| 3306 3748 | 
             
            };
         | 
| 3307 3749 |  | 
| 3308 | 
            -
             | 
| 3750 | 
            +
            // <<gradient [[tiddler name]] vert|horiz rgb rgb rgb rgb... >>
         | 
| 3751 | 
            +
            config.macros.gradient.handler = function(place,macroName,params,wikifier)
         | 
| 3309 3752 | 
             
            {
         | 
| 3310 | 
            -
            	var  | 
| 3311 | 
            -
            	 | 
| 3312 | 
            -
            	 | 
| 3313 | 
            -
             | 
| 3314 | 
            -
            	 | 
| 3315 | 
            -
             | 
| 3316 | 
            -
             | 
| 3317 | 
            -
             | 
| 3318 | 
            -
            	 | 
| 3319 | 
            -
             | 
| 3320 | 
            -
             | 
| 3321 | 
            -
            		c | 
| 3322 | 
            -
             | 
| 3323 | 
            -
            	 | 
| 3324 | 
            -
             | 
| 3325 | 
            -
            	 | 
| 3326 | 
            -
             | 
| 3753 | 
            +
            	var panel = wikifier ? createTiddlyElement(place,"div",null,"gradient") : place;
         | 
| 3754 | 
            +
            	panel.style.position = "relative";
         | 
| 3755 | 
            +
            	panel.style.overflow = "hidden";
         | 
| 3756 | 
            +
            	panel.style.zIndex = "0";
         | 
| 3757 | 
            +
            	if(wikifier) {
         | 
| 3758 | 
            +
            		var styles = config.formatterHelpers.inlineCssHelper(wikifier);
         | 
| 3759 | 
            +
            		config.formatterHelpers.applyCssHelper(panel,styles);
         | 
| 3760 | 
            +
            	}
         | 
| 3761 | 
            +
            	var colours = [];
         | 
| 3762 | 
            +
            	for(var t=1; t<params.length; t++) {
         | 
| 3763 | 
            +
            		var c = new RGB(params[t]);
         | 
| 3764 | 
            +
            		if(c)
         | 
| 3765 | 
            +
            			colours.push(c);
         | 
| 3766 | 
            +
            	}
         | 
| 3767 | 
            +
            	drawGradient(panel,params[0] != "vert",colours);
         | 
| 3768 | 
            +
            	if(wikifier)
         | 
| 3769 | 
            +
            		wikifier.subWikify(panel,">>");
         | 
| 3770 | 
            +
            	if(document.all) {
         | 
| 3771 | 
            +
            		panel.style.height = "100%";
         | 
| 3772 | 
            +
            		panel.style.width = "100%";
         | 
| 3773 | 
            +
            	}
         | 
| 3327 3774 | 
             
            };
         | 
| 3328 3775 |  | 
| 3329 | 
            -
            config.macros. | 
| 3776 | 
            +
            config.macros.message.handler = function(place,macroName,params)
         | 
| 3330 3777 | 
             
            {
         | 
| 3331 | 
            -
            	 | 
| 3332 | 
            -
             | 
| 3333 | 
            -
            		var  | 
| 3334 | 
            -
            		var  | 
| 3335 | 
            -
             | 
| 3336 | 
            -
             | 
| 3778 | 
            +
            	if(params[0]) {
         | 
| 3779 | 
            +
            		var m = config;
         | 
| 3780 | 
            +
            		var p = params[0].split(".");
         | 
| 3781 | 
            +
            		for(var t=0; t<p.length; t++) {
         | 
| 3782 | 
            +
            			if(p[t] in m)
         | 
| 3783 | 
            +
            				m = m[p[t]];
         | 
| 3784 | 
            +
            			else
         | 
| 3785 | 
            +
            				break;
         | 
| 3337 3786 | 
             
            		}
         | 
| 3338 | 
            -
             | 
| 3787 | 
            +
            		createTiddlyText(place,m.toString().format(params.splice(1)));
         | 
| 3788 | 
            +
            	}
         | 
| 3339 3789 | 
             
            };
         | 
| 3340 3790 |  | 
| 3341 | 
            -
            config.macros. | 
| 3342 | 
            -
             | 
| 3343 | 
            -
             | 
| 3344 | 
            -
            		 | 
| 3345 | 
            -
            		 | 
| 3346 | 
            -
             | 
| 3347 | 
            -
             | 
| 3348 | 
            -
             | 
| 3349 | 
            -
             | 
| 3350 | 
            -
             | 
| 3351 | 
            -
             | 
| 3352 | 
            -
             | 
| 3353 | 
            -
             | 
| 3354 | 
            -
             | 
| 3355 | 
            -
             | 
| 3356 | 
            -
             | 
| 3357 | 
            -
             | 
| 3791 | 
            +
            config.macros.view.handler = function(place,macroName,params,wikifier,paramString,tiddler)
         | 
| 3792 | 
            +
            {
         | 
| 3793 | 
            +
            	if((tiddler instanceof Tiddler) && params[0]) {
         | 
| 3794 | 
            +
            		var value = store.getValue(tiddler,params[0]);
         | 
| 3795 | 
            +
            		if(value != undefined) {
         | 
| 3796 | 
            +
            			switch(params[1]) {
         | 
| 3797 | 
            +
            				case undefined:
         | 
| 3798 | 
            +
            					highlightify(value,place,highlightHack,tiddler);
         | 
| 3799 | 
            +
            					break;
         | 
| 3800 | 
            +
            				case "link":
         | 
| 3801 | 
            +
            					createTiddlyLink(place,value,true);
         | 
| 3802 | 
            +
            					break;
         | 
| 3803 | 
            +
            				case "wikified":
         | 
| 3804 | 
            +
            					wikify(value,place,highlightHack,tiddler);
         | 
| 3805 | 
            +
            					break;
         | 
| 3806 | 
            +
            				case "date":
         | 
| 3807 | 
            +
            					value = Date.convertFromYYYYMMDDHHMM(value);
         | 
| 3808 | 
            +
            					createTiddlyText(place,value.formatString(params[2] ? params[2] : config.views.wikified.dateFormat));
         | 
| 3809 | 
            +
            					break;
         | 
| 3810 | 
            +
            			}
         | 
| 3811 | 
            +
            		}
         | 
| 3358 3812 | 
             
            	}
         | 
| 3359 3813 | 
             
            };
         | 
| 3360 3814 |  | 
| 3361 | 
            -
            config.macros. | 
| 3815 | 
            +
            config.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler)
         | 
| 3362 3816 | 
             
            {
         | 
| 3363 | 
            -
            	 | 
| 3364 | 
            -
            	 | 
| 3365 | 
            -
            	var  | 
| 3366 | 
            -
            	 | 
| 3367 | 
            -
            		 | 
| 3368 | 
            -
            		 | 
| 3369 | 
            -
             | 
| 3817 | 
            +
            	var field = params[0];
         | 
| 3818 | 
            +
            	var rows = params[1] || 0;
         | 
| 3819 | 
            +
            	var defVal = params[2] || '';
         | 
| 3820 | 
            +
            	if((tiddler instanceof Tiddler) && field) {
         | 
| 3821 | 
            +
            		story.setDirty(tiddler.title,true);
         | 
| 3822 | 
            +
            		var e,v;
         | 
| 3823 | 
            +
            		if(field != "text" && !rows) {
         | 
| 3824 | 
            +
            			e = createTiddlyElement(null,"input");
         | 
| 3825 | 
            +
            			if(tiddler.isReadOnly())
         | 
| 3826 | 
            +
            				e.setAttribute("readOnly","readOnly");
         | 
| 3827 | 
            +
            			e.setAttribute("edit",field);
         | 
| 3828 | 
            +
            			e.setAttribute("type","text");
         | 
| 3829 | 
            +
            			e.value = store.getValue(tiddler,field) || defVal;
         | 
| 3830 | 
            +
            			e.setAttribute("size","40");
         | 
| 3831 | 
            +
            			e.setAttribute("autocomplete","off");
         | 
| 3832 | 
            +
            			place.appendChild(e);
         | 
| 3833 | 
            +
            		} else {
         | 
| 3834 | 
            +
            			var wrapper1 = createTiddlyElement(null,"fieldset",null,"fieldsetFix");
         | 
| 3835 | 
            +
            			var wrapper2 = createTiddlyElement(wrapper1,"div");
         | 
| 3836 | 
            +
            			e = createTiddlyElement(wrapper2,"textarea");
         | 
| 3837 | 
            +
            			if(tiddler.isReadOnly())
         | 
| 3838 | 
            +
            				e.setAttribute("readOnly","readOnly");
         | 
| 3839 | 
            +
            			e.value = v = store.getValue(tiddler,field) || defVal;
         | 
| 3840 | 
            +
            			rows = rows ? rows : 10;
         | 
| 3841 | 
            +
            			var lines = v.match(/\n/mg);
         | 
| 3842 | 
            +
            			var maxLines = Math.max(parseInt(config.options.txtMaxEditRows),5);
         | 
| 3843 | 
            +
            			if(lines != null && lines.length > rows)
         | 
| 3844 | 
            +
            				rows = lines.length + 5;
         | 
| 3845 | 
            +
            			rows = Math.min(rows,maxLines);
         | 
| 3846 | 
            +
            			e.setAttribute("rows",rows);
         | 
| 3847 | 
            +
            			e.setAttribute("edit",field);
         | 
| 3848 | 
            +
            			place.appendChild(wrapper1);
         | 
| 3370 3849 | 
             
            		}
         | 
| 3850 | 
            +
            		return e;
         | 
| 3851 | 
            +
            	}
         | 
| 3371 3852 | 
             
            };
         | 
| 3372 3853 |  | 
| 3373 | 
            -
            config.macros. | 
| 3854 | 
            +
            config.macros.tagChooser.onClick = function(ev)
         | 
| 3374 3855 | 
             
            {
         | 
| 3375 | 
            -
            	 | 
| 3376 | 
            -
            	var  | 
| 3377 | 
            -
            	var  | 
| 3378 | 
            -
            	var  | 
| 3379 | 
            -
            	 | 
| 3380 | 
            -
             | 
| 3381 | 
            -
            	 | 
| 3382 | 
            -
            		 | 
| 3856 | 
            +
            	var e = ev ? ev : window.event;
         | 
| 3857 | 
            +
            	var lingo = config.views.editor.tagChooser;
         | 
| 3858 | 
            +
            	var popup = Popup.create(this);
         | 
| 3859 | 
            +
            	var tags = store.getTags();
         | 
| 3860 | 
            +
            	if(tags.length == 0)
         | 
| 3861 | 
            +
            		createTiddlyText(createTiddlyElement(popup,"li"),lingo.popupNone);
         | 
| 3862 | 
            +
            	for(var t=0; t<tags.length; t++) {
         | 
| 3863 | 
            +
            		var tag = createTiddlyButton(createTiddlyElement(popup,"li"),tags[t][0],lingo.tagTooltip.format([tags[t][0]]),config.macros.tagChooser.onTagClick);
         | 
| 3864 | 
            +
            		tag.setAttribute("tag",tags[t][0]);
         | 
| 3865 | 
            +
            		tag.setAttribute("tiddler",this.getAttribute("tiddler"));
         | 
| 3866 | 
            +
            	}
         | 
| 3867 | 
            +
            	Popup.show();
         | 
| 3868 | 
            +
            	e.cancelBubble = true;
         | 
| 3869 | 
            +
            	if(e.stopPropagation) e.stopPropagation();
         | 
| 3870 | 
            +
            	return false;
         | 
| 3383 3871 | 
             
            };
         | 
| 3384 3872 |  | 
| 3385 | 
            -
            config.macros. | 
| 3873 | 
            +
            config.macros.tagChooser.onTagClick = function(ev)
         | 
| 3386 3874 | 
             
            {
         | 
| 3387 | 
            -
            	 | 
| 3388 | 
            -
            	var  | 
| 3389 | 
            -
            	var  | 
| 3390 | 
            -
            	 | 
| 3391 | 
            -
             | 
| 3392 | 
            -
            	 | 
| 3393 | 
            -
             | 
| 3394 | 
            -
             | 
| 3395 | 
            -
             | 
| 3396 | 
            -
             | 
| 3397 | 
            -
            	 | 
| 3398 | 
            -
             | 
| 3399 | 
            -
             | 
| 3875 | 
            +
            	var e = ev ? ev : window.event;
         | 
| 3876 | 
            +
            	var tag = this.getAttribute("tag");
         | 
| 3877 | 
            +
            	var title = this.getAttribute("tiddler");
         | 
| 3878 | 
            +
            	if(!readOnly)
         | 
| 3879 | 
            +
            		story.setTiddlerTag(title,tag,0);
         | 
| 3880 | 
            +
            	return false;
         | 
| 3881 | 
            +
            };
         | 
| 3882 | 
            +
             | 
| 3883 | 
            +
            config.macros.tagChooser.handler = function(place,macroName,params,wikifier,paramString,tiddler)
         | 
| 3884 | 
            +
            {
         | 
| 3885 | 
            +
            	if(tiddler instanceof Tiddler) {
         | 
| 3886 | 
            +
            		var lingo = config.views.editor.tagChooser;
         | 
| 3887 | 
            +
            		var btn = createTiddlyButton(place,lingo.text,lingo.tooltip,this.onClick);
         | 
| 3888 | 
            +
            		btn.setAttribute("tiddler",tiddler.title);
         | 
| 3889 | 
            +
            	}
         | 
| 3400 3890 | 
             
            };
         | 
| 3401 3891 |  | 
| 3402 | 
            -
            config.macros. | 
| 3403 | 
            -
            { | 
| 3404 | 
            -
            	 | 
| 3405 | 
            -
            	for(var n in config.options) {
         | 
| 3406 | 
            -
            		var opt = {};
         | 
| 3407 | 
            -
            		opt.option = "";
         | 
| 3408 | 
            -
            		opt.name = n;
         | 
| 3409 | 
            -
            		opt.lowlight = !config.optionsDesc[n];
         | 
| 3410 | 
            -
            		opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
         | 
| 3411 | 
            -
            		if(!opt.lowlight || showUnknown)
         | 
| 3412 | 
            -
            			opts.push(opt);
         | 
| 3413 | 
            -
            	}
         | 
| 3414 | 
            -
            	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);});
         | 
| 3415 | 
            -
            	var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
         | 
| 3416 | 
            -
            	for(n=0; n<opts.length; n++) {
         | 
| 3417 | 
            -
            		var type = opts[n].name.substr(0,3);
         | 
| 3418 | 
            -
            		var h = config.macros.option.types[type];
         | 
| 3419 | 
            -
            		if (h && h.create) {
         | 
| 3420 | 
            -
            			h.create(opts[n].colElements['option'],type,opts[n].name,null,"no");
         | 
| 3421 | 
            -
            		}
         | 
| 3422 | 
            -
            	}
         | 
| 3892 | 
            +
            config.macros.refreshDisplay.handler = function(place)
         | 
| 3893 | 
            +
            {
         | 
| 3894 | 
            +
            	createTiddlyButton(place,this.label,this.prompt,this.onClick);
         | 
| 3423 3895 | 
             
            };
         | 
| 3424 3896 |  | 
| 3425 | 
            -
            config.macros. | 
| 3897 | 
            +
            config.macros.refreshDisplay.onClick = function(e)
         | 
| 3426 3898 | 
             
            {
         | 
| 3427 | 
            -
            	 | 
| 3428 | 
            -
            	var listWrapper = wizard.getValue("listWrapper");
         | 
| 3429 | 
            -
            	removeChildren(listWrapper);
         | 
| 3430 | 
            -
            	config.macros.options.refreshOptions(listWrapper,this.checked);
         | 
| 3899 | 
            +
            	refreshAll();
         | 
| 3431 3900 | 
             
            	return false;
         | 
| 3432 3901 | 
             
            };
         | 
| 3433 3902 |  | 
| 3903 | 
            +
            config.macros.annotations.handler = function(place,macroName,params,wikifier,paramString,tiddler)
         | 
| 3904 | 
            +
            {
         | 
| 3905 | 
            +
            	var title = tiddler ? tiddler.title : null;
         | 
| 3906 | 
            +
            	var a = title ? config.annotations[title] : null;
         | 
| 3907 | 
            +
            	if(!tiddler || !title || !a)
         | 
| 3908 | 
            +
            		return;
         | 
| 3909 | 
            +
            	var text = a.format([title]);
         | 
| 3910 | 
            +
            	wikify(text,createTiddlyElement(place,"div",null,"annotation"),null,tiddler);
         | 
| 3911 | 
            +
            };
         | 
| 3912 | 
            +
             | 
| 3913 | 
            +
            //--
         | 
| 3914 | 
            +
            //-- NewTiddler and NewJournal macros
         | 
| 3915 | 
            +
            //--
         | 
| 3916 | 
            +
             | 
| 3434 3917 | 
             
            config.macros.newTiddler.createNewTiddlerButton = function(place,title,params,label,prompt,accessKey,newFocus,isJournal)
         | 
| 3435 3918 | 
             
            {
         | 
| 3436 3919 | 
             
            	var tags = [];
         | 
| @@ -3455,7 +3938,7 @@ config.macros.newTiddler.createNewTiddlerButton = function(place,title,params,la | |
| 3455 3938 | 
             
            	if(customFields !== "")
         | 
| 3456 3939 | 
             
            		btn.setAttribute("customFields",customFields);
         | 
| 3457 3940 | 
             
            	var text = getParam(params,"text");
         | 
| 3458 | 
            -
            	if(text !== undefined) | 
| 3941 | 
            +
            	if(text !== undefined)
         | 
| 3459 3942 | 
             
            		btn.setAttribute("newText",text);
         | 
| 3460 3943 | 
             
            	return btn;
         | 
| 3461 3944 | 
             
            };
         | 
| @@ -3499,48 +3982,89 @@ config.macros.newJournal.handler = function(place,macroName,params,wikifier,para | |
| 3499 3982 | 
             
            {
         | 
| 3500 3983 | 
             
            	if(!readOnly) {
         | 
| 3501 3984 | 
             
            		params = paramString.parseParams("anon",null,true,false,false);
         | 
| 3502 | 
            -
            		var title = params[1] && params[1].name == "anon" ? params[1].value :  | 
| 3985 | 
            +
            		var title = params[1] && params[1].name == "anon" ? params[1].value : config.macros.timeline.dateFormat;
         | 
| 3503 3986 | 
             
            		title = getParam(params,"title",title);
         | 
| 3504 3987 | 
             
            		config.macros.newTiddler.createNewTiddlerButton(place,title,params,this.label,this.prompt,this.accessKey,"text",true);
         | 
| 3505 3988 | 
             
            	}
         | 
| 3506 3989 | 
             
            };
         | 
| 3507 3990 |  | 
| 3508 | 
            -
             | 
| 3991 | 
            +
            //--
         | 
| 3992 | 
            +
            //-- Search macro
         | 
| 3993 | 
            +
            //--
         | 
| 3994 | 
            +
             | 
| 3995 | 
            +
            config.macros.search.handler = function(place,macroName,params)
         | 
| 3509 3996 | 
             
            {
         | 
| 3510 | 
            -
            	var  | 
| 3511 | 
            -
            	var  | 
| 3512 | 
            -
            	var  | 
| 3513 | 
            -
            	 | 
| 3514 | 
            -
            		 | 
| 3515 | 
            -
             | 
| 3516 | 
            -
             | 
| 3517 | 
            -
             | 
| 3518 | 
            -
             | 
| 3519 | 
            -
             | 
| 3997 | 
            +
            	var searchTimeout = null;
         | 
| 3998 | 
            +
            	var btn = createTiddlyButton(place,this.label,this.prompt,this.onClick);
         | 
| 3999 | 
            +
            	var txt = createTiddlyElement(place,"input",null,"txtOptionInput");
         | 
| 4000 | 
            +
            	if(params[0])
         | 
| 4001 | 
            +
            		txt.value = params[0];
         | 
| 4002 | 
            +
            	txt.onkeyup = this.onKeyPress;
         | 
| 4003 | 
            +
            	txt.onfocus = this.onFocus;
         | 
| 4004 | 
            +
            	txt.setAttribute("size",this.sizeTextbox);
         | 
| 4005 | 
            +
            	txt.setAttribute("accessKey",this.accessKey);
         | 
| 4006 | 
            +
            	txt.setAttribute("autocomplete","off");
         | 
| 4007 | 
            +
            	txt.setAttribute("lastSearchText","");
         | 
| 4008 | 
            +
            	if(config.browser.isSafari) {
         | 
| 4009 | 
            +
            		txt.setAttribute("type","search");
         | 
| 4010 | 
            +
            		txt.setAttribute("results","5");
         | 
| 4011 | 
            +
            	} else {
         | 
| 4012 | 
            +
            		txt.setAttribute("type","text");
         | 
| 3520 4013 | 
             
            	}
         | 
| 3521 | 
            -
             | 
| 3522 | 
            -
             | 
| 3523 | 
            -
             | 
| 3524 | 
            -
             | 
| 3525 | 
            -
             | 
| 3526 | 
            -
             | 
| 3527 | 
            -
             | 
| 3528 | 
            -
            	 | 
| 3529 | 
            -
             | 
| 3530 | 
            -
            		 | 
| 3531 | 
            -
             | 
| 3532 | 
            -
             | 
| 3533 | 
            -
             | 
| 3534 | 
            -
             | 
| 3535 | 
            -
             | 
| 3536 | 
            -
             | 
| 3537 | 
            -
             | 
| 3538 | 
            -
             | 
| 3539 | 
            -
             | 
| 3540 | 
            -
             | 
| 4014 | 
            +
            };
         | 
| 4015 | 
            +
             | 
| 4016 | 
            +
            // Global because there's only ever one outstanding incremental search timer
         | 
| 4017 | 
            +
            config.macros.search.timeout = null;
         | 
| 4018 | 
            +
             | 
| 4019 | 
            +
            config.macros.search.doSearch = function(txt)
         | 
| 4020 | 
            +
            {
         | 
| 4021 | 
            +
            	if(txt.value.length > 0) {
         | 
| 4022 | 
            +
            		story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);
         | 
| 4023 | 
            +
            		txt.setAttribute("lastSearchText",txt.value);
         | 
| 4024 | 
            +
            	}
         | 
| 4025 | 
            +
            };
         | 
| 4026 | 
            +
             | 
| 4027 | 
            +
            config.macros.search.onClick = function(e)
         | 
| 4028 | 
            +
            {
         | 
| 4029 | 
            +
            	config.macros.search.doSearch(this.nextSibling);
         | 
| 4030 | 
            +
            	return false;
         | 
| 4031 | 
            +
            };
         | 
| 4032 | 
            +
             | 
| 4033 | 
            +
            config.macros.search.onKeyPress = function(ev)
         | 
| 4034 | 
            +
            {
         | 
| 4035 | 
            +
            	var e = ev ? ev : window.event;
         | 
| 4036 | 
            +
            	switch(e.keyCode) {
         | 
| 4037 | 
            +
            		case 13: // Ctrl-Enter
         | 
| 4038 | 
            +
            		case 10: // Ctrl-Enter on IE PC
         | 
| 4039 | 
            +
            			config.macros.search.doSearch(this);
         | 
| 4040 | 
            +
            			break;
         | 
| 4041 | 
            +
            		case 27: // Escape
         | 
| 4042 | 
            +
            			this.value = "";
         | 
| 4043 | 
            +
            			clearMessage();
         | 
| 4044 | 
            +
            			break;
         | 
| 4045 | 
            +
            	}
         | 
| 4046 | 
            +
            	if(this.value.length > 2) {
         | 
| 4047 | 
            +
            		if(this.value != this.getAttribute("lastSearchText")) {
         | 
| 4048 | 
            +
            			if(config.macros.search.timeout)
         | 
| 4049 | 
            +
            				clearTimeout(config.macros.search.timeout);
         | 
| 4050 | 
            +
            			var txt = this;
         | 
| 4051 | 
            +
            			config.macros.search.timeout = setTimeout(function() {config.macros.search.doSearch(txt);},500);
         | 
| 4052 | 
            +
            		}
         | 
| 4053 | 
            +
            	} else {
         | 
| 4054 | 
            +
            		if(config.macros.search.timeout)
         | 
| 4055 | 
            +
            			clearTimeout(config.macros.search.timeout);
         | 
| 3541 4056 | 
             
            	}
         | 
| 3542 4057 | 
             
            };
         | 
| 3543 4058 |  | 
| 4059 | 
            +
            config.macros.search.onFocus = function(e)
         | 
| 4060 | 
            +
            {
         | 
| 4061 | 
            +
            	this.select();
         | 
| 4062 | 
            +
            };
         | 
| 4063 | 
            +
             | 
| 4064 | 
            +
            //--
         | 
| 4065 | 
            +
            //-- Tabs macro
         | 
| 4066 | 
            +
            //--
         | 
| 4067 | 
            +
             | 
| 3544 4068 | 
             
            config.macros.tabs.handler = function(place,macroName,params)
         | 
| 3545 4069 | 
             
            {
         | 
| 3546 4070 | 
             
            	var cookie = params[0];
         | 
| @@ -3599,157 +4123,9 @@ config.macros.tabs.switchTab = function(tabset,tab) | |
| 3599 4123 | 
             
            	}
         | 
| 3600 4124 | 
             
            };
         | 
| 3601 4125 |  | 
| 3602 | 
            -
             | 
| 3603 | 
            -
             | 
| 3604 | 
            -
             | 
| 3605 | 
            -
            	var terminator = ">>";
         | 
| 3606 | 
            -
            	var panel;
         | 
| 3607 | 
            -
            	if(wikifier)
         | 
| 3608 | 
            -
            		panel = createTiddlyElement(place,"div",null,"gradient");
         | 
| 3609 | 
            -
            	else
         | 
| 3610 | 
            -
            		panel = place;
         | 
| 3611 | 
            -
            	panel.style.position = "relative";
         | 
| 3612 | 
            -
            	panel.style.overflow = "hidden";
         | 
| 3613 | 
            -
            	panel.style.zIndex = "0";
         | 
| 3614 | 
            -
            	var t;
         | 
| 3615 | 
            -
            	if(wikifier) {
         | 
| 3616 | 
            -
            		var styles = config.formatterHelpers.inlineCssHelper(wikifier);
         | 
| 3617 | 
            -
            		config.formatterHelpers.applyCssHelper(panel,styles);
         | 
| 3618 | 
            -
            	}
         | 
| 3619 | 
            -
            	var colours = [];
         | 
| 3620 | 
            -
            	for(t=1; t<params.length; t++) {
         | 
| 3621 | 
            -
            		var c = new RGB(params[t]);
         | 
| 3622 | 
            -
            		if(c)
         | 
| 3623 | 
            -
            			colours.push(c);
         | 
| 3624 | 
            -
            	}
         | 
| 3625 | 
            -
            	drawGradient(panel,params[0] != "vert",colours);
         | 
| 3626 | 
            -
            	if(wikifier)
         | 
| 3627 | 
            -
            		wikifier.subWikify(panel,terminator);
         | 
| 3628 | 
            -
            	if(document.all) {
         | 
| 3629 | 
            -
            		panel.style.height = "100%";
         | 
| 3630 | 
            -
            		panel.style.width = "100%";
         | 
| 3631 | 
            -
            	}
         | 
| 3632 | 
            -
            };
         | 
| 3633 | 
            -
             | 
| 3634 | 
            -
            config.macros.message.handler = function(place,macroName,params)
         | 
| 3635 | 
            -
            {
         | 
| 3636 | 
            -
            	if(params[0]) {
         | 
| 3637 | 
            -
            		var m = config;
         | 
| 3638 | 
            -
            		var p = params[0].split(".");
         | 
| 3639 | 
            -
            		for(var t=0; t<p.length; t++) {
         | 
| 3640 | 
            -
            			if(p[t] in m)
         | 
| 3641 | 
            -
            				m = m[p[t]];
         | 
| 3642 | 
            -
            			else
         | 
| 3643 | 
            -
            				break;
         | 
| 3644 | 
            -
            		}
         | 
| 3645 | 
            -
            		createTiddlyText(place,m.toString().format(params.splice(1)));
         | 
| 3646 | 
            -
            	}
         | 
| 3647 | 
            -
            };
         | 
| 3648 | 
            -
             | 
| 3649 | 
            -
            config.macros.view.handler = function(place,macroName,params,wikifier,paramString,tiddler)
         | 
| 3650 | 
            -
            {
         | 
| 3651 | 
            -
            	if((tiddler instanceof Tiddler) && params[0]) {
         | 
| 3652 | 
            -
            		var value = store.getValue(tiddler,params[0]);
         | 
| 3653 | 
            -
            		if(value != undefined) {
         | 
| 3654 | 
            -
            			switch(params[1]) {
         | 
| 3655 | 
            -
            				case undefined:
         | 
| 3656 | 
            -
            					highlightify(value,place,highlightHack,tiddler);
         | 
| 3657 | 
            -
            					break;
         | 
| 3658 | 
            -
            				case "link":
         | 
| 3659 | 
            -
            					createTiddlyLink(place,value,true);
         | 
| 3660 | 
            -
            					break;
         | 
| 3661 | 
            -
            				case "wikified":
         | 
| 3662 | 
            -
            					wikify(value,place,highlightHack,tiddler);
         | 
| 3663 | 
            -
            					break;
         | 
| 3664 | 
            -
            				case "date":
         | 
| 3665 | 
            -
            					value = Date.convertFromYYYYMMDDHHMM(value);
         | 
| 3666 | 
            -
            					createTiddlyText(place,value.formatString(params[2] ? params[2] : config.views.wikified.dateFormat));
         | 
| 3667 | 
            -
            					break;
         | 
| 3668 | 
            -
            			}
         | 
| 3669 | 
            -
            		}
         | 
| 3670 | 
            -
            	}
         | 
| 3671 | 
            -
            };
         | 
| 3672 | 
            -
             | 
| 3673 | 
            -
            config.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler)
         | 
| 3674 | 
            -
            {
         | 
| 3675 | 
            -
            	var field = params[0];
         | 
| 3676 | 
            -
            	var rows = params[1];
         | 
| 3677 | 
            -
            	if((tiddler instanceof Tiddler) && field) {
         | 
| 3678 | 
            -
            		story.setDirty(tiddler.title,true);
         | 
| 3679 | 
            -
            		if(field != "text" && !rows) {
         | 
| 3680 | 
            -
            			var e = createTiddlyElement(null,"input");
         | 
| 3681 | 
            -
            			if(tiddler.isReadOnly())
         | 
| 3682 | 
            -
            				e.setAttribute("readOnly","readOnly");
         | 
| 3683 | 
            -
            			e.setAttribute("edit",field);
         | 
| 3684 | 
            -
            			e.setAttribute("type","text");
         | 
| 3685 | 
            -
            			var v = store.getValue(tiddler,field);
         | 
| 3686 | 
            -
            			if(!v) 
         | 
| 3687 | 
            -
            				v = "";
         | 
| 3688 | 
            -
            			e.value = v;
         | 
| 3689 | 
            -
            			e.setAttribute("size","40");
         | 
| 3690 | 
            -
            			e.setAttribute("autocomplete","off");
         | 
| 3691 | 
            -
            			place.appendChild(e);
         | 
| 3692 | 
            -
            		} else {
         | 
| 3693 | 
            -
            			var wrapper1 = createTiddlyElement(null,"fieldset",null,"fieldsetFix");
         | 
| 3694 | 
            -
            			var wrapper2 = createTiddlyElement(wrapper1,"div");
         | 
| 3695 | 
            -
            			var e = createTiddlyElement(wrapper2,"textarea");
         | 
| 3696 | 
            -
            			if(tiddler.isReadOnly())
         | 
| 3697 | 
            -
            				e.setAttribute("readOnly","readOnly");
         | 
| 3698 | 
            -
            			var v = store.getValue(tiddler,field);
         | 
| 3699 | 
            -
            			if(!v) 
         | 
| 3700 | 
            -
            				v = "";
         | 
| 3701 | 
            -
            			e.value = v;
         | 
| 3702 | 
            -
            			var rows = rows ? rows : 10;
         | 
| 3703 | 
            -
            			var lines = v.match(/\n/mg);
         | 
| 3704 | 
            -
            			var maxLines = Math.max(parseInt(config.options.txtMaxEditRows),5);
         | 
| 3705 | 
            -
            			if(lines != null && lines.length > rows)
         | 
| 3706 | 
            -
            				rows = lines.length + 5;
         | 
| 3707 | 
            -
            			rows = Math.min(rows,maxLines);
         | 
| 3708 | 
            -
            			e.setAttribute("rows",rows);
         | 
| 3709 | 
            -
            			e.setAttribute("edit",field);
         | 
| 3710 | 
            -
            			place.appendChild(wrapper1);
         | 
| 3711 | 
            -
            		}
         | 
| 3712 | 
            -
            	}
         | 
| 3713 | 
            -
            };
         | 
| 3714 | 
            -
             | 
| 3715 | 
            -
            config.macros.tagChooser.onClick = function(e)
         | 
| 3716 | 
            -
            {
         | 
| 3717 | 
            -
            	if(!e) var e = window.event;
         | 
| 3718 | 
            -
            	var lingo = config.views.editor.tagChooser;
         | 
| 3719 | 
            -
            	var popup = Popup.create(this);
         | 
| 3720 | 
            -
            	var tags = store.getTags();
         | 
| 3721 | 
            -
            	if(tags.length == 0)
         | 
| 3722 | 
            -
            		createTiddlyText(createTiddlyElement(popup,"li"),lingo.popupNone);
         | 
| 3723 | 
            -
            	for(var t=0; t<tags.length; t++) {
         | 
| 3724 | 
            -
            		var theTag = createTiddlyButton(createTiddlyElement(popup,"li"),tags[t][0],lingo.tagTooltip.format([tags[t][0]]),config.macros.tagChooser.onTagClick);
         | 
| 3725 | 
            -
            		theTag.setAttribute("tag",tags[t][0]);
         | 
| 3726 | 
            -
            		theTag.setAttribute("tiddler",this.getAttribute("tiddler"));
         | 
| 3727 | 
            -
            	}
         | 
| 3728 | 
            -
            	Popup.show();
         | 
| 3729 | 
            -
            	e.cancelBubble = true;
         | 
| 3730 | 
            -
            	if(e.stopPropagation) e.stopPropagation();
         | 
| 3731 | 
            -
            	return false;
         | 
| 3732 | 
            -
            };
         | 
| 3733 | 
            -
             | 
| 3734 | 
            -
            config.macros.tagChooser.onTagClick = function(e)
         | 
| 3735 | 
            -
            {
         | 
| 3736 | 
            -
            	if(!e) var e = window.event;
         | 
| 3737 | 
            -
            	var tag = this.getAttribute("tag");
         | 
| 3738 | 
            -
            	var title = this.getAttribute("tiddler");
         | 
| 3739 | 
            -
            	if(!readOnly)
         | 
| 3740 | 
            -
            		story.setTiddlerTag(title,tag,0);
         | 
| 3741 | 
            -
            	return false;
         | 
| 3742 | 
            -
            };
         | 
| 3743 | 
            -
             | 
| 3744 | 
            -
            config.macros.tagChooser.handler = function(place,macroName,params,wikifier,paramString,tiddler)
         | 
| 3745 | 
            -
            {
         | 
| 3746 | 
            -
            	if(tiddler instanceof Tiddler) {
         | 
| 3747 | 
            -
            		var title = tiddler.title;
         | 
| 3748 | 
            -
            		var lingo = config.views.editor.tagChooser;
         | 
| 3749 | 
            -
            		var btn = createTiddlyButton(place,lingo.text,lingo.tooltip,this.onClick);
         | 
| 3750 | 
            -
            		btn.setAttribute("tiddler",title);
         | 
| 3751 | 
            -
            	}
         | 
| 3752 | 
            -
            };
         | 
| 4126 | 
            +
            //--
         | 
| 4127 | 
            +
            //-- Tiddler toolbar
         | 
| 4128 | 
            +
            //--
         | 
| 3753 4129 |  | 
| 3754 4130 | 
             
            // Create a toolbar command button
         | 
| 3755 4131 | 
             
            config.macros.toolbar.createCommand = function(place,commandName,tiddler,theClass)
         | 
| @@ -3805,18 +4181,18 @@ config.macros.toolbar.getCommandTooltip = function(command,tiddler) | |
| 3805 4181 | 
             
            	return tiddler.isReadOnly() && command.readOnlyTooltip ? command.readOnlyTooltip : command.tooltip;
         | 
| 3806 4182 | 
             
            };
         | 
| 3807 4183 |  | 
| 3808 | 
            -
            config.macros.toolbar.onClickCommand = function( | 
| 4184 | 
            +
            config.macros.toolbar.onClickCommand = function(ev)
         | 
| 3809 4185 | 
             
            {
         | 
| 3810 | 
            -
            	 | 
| 4186 | 
            +
            	var e = ev ? ev : window.event;
         | 
| 3811 4187 | 
             
            	e.cancelBubble = true;
         | 
| 3812 4188 | 
             
            	if (e.stopPropagation) e.stopPropagation();
         | 
| 3813 4189 | 
             
            	var command = config.commands[this.getAttribute("commandName")];
         | 
| 3814 4190 | 
             
            	return command.handler(e,this,this.getAttribute("tiddler"));
         | 
| 3815 4191 | 
             
            };
         | 
| 3816 4192 |  | 
| 3817 | 
            -
            config.macros.toolbar.onClickPopup = function( | 
| 4193 | 
            +
            config.macros.toolbar.onClickPopup = function(ev)
         | 
| 3818 4194 | 
             
            {
         | 
| 3819 | 
            -
            	 | 
| 4195 | 
            +
            	var e = ev ? ev : window.event;
         | 
| 3820 4196 | 
             
            	e.cancelBubble = true;
         | 
| 3821 4197 | 
             
            	if (e.stopPropagation) e.stopPropagation();
         | 
| 3822 4198 | 
             
            	var popup = Popup.create(this);
         | 
| @@ -3843,7 +4219,7 @@ config.macros.toolbar.invokeCommand = function(place,theClass,event) | |
| 3843 4219 | 
             
            	}
         | 
| 3844 4220 | 
             
            };
         | 
| 3845 4221 |  | 
| 3846 | 
            -
            config.macros.toolbar.onClickMore = function( | 
| 4222 | 
            +
            config.macros.toolbar.onClickMore = function(ev)
         | 
| 3847 4223 | 
             
            {
         | 
| 3848 4224 | 
             
            	var e = this.nextSibling;
         | 
| 3849 4225 | 
             
            	e.style.display = "inline";
         | 
| @@ -3882,27 +4258,6 @@ config.macros.toolbar.handler = function(place,macroName,params,wikifier,paramSt | |
| 3882 4258 | 
             
            	}
         | 
| 3883 4259 | 
             
            };
         | 
| 3884 4260 |  | 
| 3885 | 
            -
            config.macros.refreshDisplay.handler = function(place)
         | 
| 3886 | 
            -
            {
         | 
| 3887 | 
            -
            	createTiddlyButton(place,this.label,this.prompt,this.onClick);
         | 
| 3888 | 
            -
            };
         | 
| 3889 | 
            -
             | 
| 3890 | 
            -
            config.macros.refreshDisplay.onClick = function(e)
         | 
| 3891 | 
            -
            {
         | 
| 3892 | 
            -
            	refreshAll();
         | 
| 3893 | 
            -
            	return false;
         | 
| 3894 | 
            -
            };
         | 
| 3895 | 
            -
             | 
| 3896 | 
            -
            config.macros.annotations.handler = function(place,macroName,params,wikifier,paramString,tiddler)
         | 
| 3897 | 
            -
            {
         | 
| 3898 | 
            -
            	var title = tiddler ? tiddler.title : null;
         | 
| 3899 | 
            -
            	var a = title ? config.annotations[title] : null;
         | 
| 3900 | 
            -
            	if(!tiddler || !title || !a)
         | 
| 3901 | 
            -
            		return;
         | 
| 3902 | 
            -
            	var text = a.format([title]);
         | 
| 3903 | 
            -
            	wikify(text,createTiddlyElement(place,"div",null,"annotation"),null,tiddler);
         | 
| 3904 | 
            -
            };
         | 
| 3905 | 
            -
             | 
| 3906 4261 | 
             
            //--
         | 
| 3907 4262 | 
             
            //-- Menu and toolbar commands
         | 
| 3908 4263 | 
             
            //--
         | 
| @@ -4136,21 +4491,25 @@ Tiddler.prototype.isTouched = function() | |
| 4136 4491 | 
             
            	return changeCount > 0;
         | 
| 4137 4492 | 
             
            };
         | 
| 4138 4493 |  | 
| 4139 | 
            -
            //  | 
| 4140 | 
            -
            Tiddler.prototype. | 
| 4494 | 
            +
            // Return the tiddler as an RSS item
         | 
| 4495 | 
            +
            Tiddler.prototype.toRssItem = function(uri)
         | 
| 4141 4496 | 
             
            {
         | 
| 4142 4497 | 
             
            	var s = [];
         | 
| 4143 | 
            -
            	s.push("<item>");
         | 
| 4144 4498 | 
             
            	s.push("<title" + ">" + this.title.htmlEncode() + "</title" + ">");
         | 
| 4145 4499 | 
             
            	s.push("<description>" + wikifyStatic(this.text,null,this).htmlEncode() + "</description>");
         | 
| 4146 4500 | 
             
            	for(var t=0; t<this.tags.length; t++)
         | 
| 4147 4501 | 
             
            		s.push("<category>" + this.tags[t] + "</category>");
         | 
| 4148 | 
            -
            	s.push("<link>" +  | 
| 4502 | 
            +
            	s.push("<link>" + uri + "#" + encodeURIComponent(String.encodeTiddlyLink(this.title)) + "</link>");
         | 
| 4149 4503 | 
             
            	s.push("<pubDate>" + this.modified.toGMTString() + "</pubDate>");
         | 
| 4150 | 
            -
            	s.push("</item>");
         | 
| 4151 4504 | 
             
            	return s.join("\n");
         | 
| 4152 4505 | 
             
            };
         | 
| 4153 4506 |  | 
| 4507 | 
            +
            // Format the text for storage in an RSS item
         | 
| 4508 | 
            +
            Tiddler.prototype.saveToRss = function(uri)
         | 
| 4509 | 
            +
            {
         | 
| 4510 | 
            +
            	return "<item>\n" + this.toRssItem(uri) + "\n</item>";
         | 
| 4511 | 
            +
            };
         | 
| 4512 | 
            +
             | 
| 4154 4513 | 
             
            // Change the text and other attributes of a tiddler
         | 
| 4155 4514 | 
             
            Tiddler.prototype.set = function(title,text,modifier,modified,tags,created,fields)
         | 
| 4156 4515 | 
             
            {
         | 
| @@ -4239,15 +4598,15 @@ Tiddler.prototype.changed = function() | |
| 4239 4598 |  | 
| 4240 4599 | 
             
            Tiddler.prototype.getSubtitle = function()
         | 
| 4241 4600 | 
             
            {
         | 
| 4242 | 
            -
            	var  | 
| 4243 | 
            -
            	if(! | 
| 4244 | 
            -
            		 | 
| 4245 | 
            -
            	var  | 
| 4246 | 
            -
            	if( | 
| 4247 | 
            -
            		 | 
| 4601 | 
            +
            	var modifier = this.modifier;
         | 
| 4602 | 
            +
            	if(!modifier)
         | 
| 4603 | 
            +
            		modifier = config.messages.subtitleUnknown;
         | 
| 4604 | 
            +
            	var modified = this.modified;
         | 
| 4605 | 
            +
            	if(modified)
         | 
| 4606 | 
            +
            		modified = modified.toLocaleString();
         | 
| 4248 4607 | 
             
            	else
         | 
| 4249 | 
            -
            		 | 
| 4250 | 
            -
            	return config.messages.tiddlerLinkTooltip.format([this.title, | 
| 4608 | 
            +
            		modified = config.messages.subtitleUnknown;
         | 
| 4609 | 
            +
            	return config.messages.tiddlerLinkTooltip.format([this.title,modifier,modified]);
         | 
| 4251 4610 | 
             
            };
         | 
| 4252 4611 |  | 
| 4253 4612 | 
             
            Tiddler.prototype.isReadOnly = function()
         | 
| @@ -4280,10 +4639,7 @@ Tiddler.prototype.getServerType = function() | |
| 4280 4639 | 
             
            Tiddler.prototype.getAdaptor = function()
         | 
| 4281 4640 | 
             
            {
         | 
| 4282 4641 | 
             
            	var serverType = this.getServerType();
         | 
| 4283 | 
            -
            	 | 
| 4284 | 
            -
            		return new config.adaptors[serverType];
         | 
| 4285 | 
            -
            	else
         | 
| 4286 | 
            -
            		return null;
         | 
| 4642 | 
            +
            	return serverType ? new config.adaptors[serverType] : null;
         | 
| 4287 4643 | 
             
            };
         | 
| 4288 4644 |  | 
| 4289 4645 | 
             
            //--
         | 
| @@ -4302,7 +4658,8 @@ function TiddlyWiki() | |
| 4302 4658 | 
             
            		this.setDirty(false);
         | 
| 4303 4659 | 
             
            	};
         | 
| 4304 4660 | 
             
            	this.fetchTiddler = function(title) {
         | 
| 4305 | 
            -
            		 | 
| 4661 | 
            +
            		var t = tiddlers[title];
         | 
| 4662 | 
            +
            		return t instanceof Tiddler ? t : null;
         | 
| 4306 4663 | 
             
            	};
         | 
| 4307 4664 | 
             
            	this.deleteTiddler = function(title) {
         | 
| 4308 4665 | 
             
            		delete this.slices[title];
         | 
| @@ -4408,17 +4765,38 @@ TiddlyWiki.prototype.getTiddler = function(title) | |
| 4408 4765 |  | 
| 4409 4766 | 
             
            TiddlyWiki.prototype.getTiddlerText = function(title,defaultText)
         | 
| 4410 4767 | 
             
            {
         | 
| 4411 | 
            -
             | 
| 4412 | 
            -
            	if(tiddler)
         | 
| 4413 | 
            -
            		return tiddler.text;
         | 
| 4414 | 
            -
            	if(!title)
         | 
| 4768 | 
            +
              	if(!title)
         | 
| 4415 4769 | 
             
            		return defaultText;
         | 
| 4416 | 
            -
            	var pos = title.indexOf(config.textPrimitives. | 
| 4770 | 
            +
            	var pos = title.indexOf(config.textPrimitives.sectionSeparator);
         | 
| 4771 | 
            +
            	var section = null;
         | 
| 4772 | 
            +
            	if(pos != -1) {
         | 
| 4773 | 
            +
            		section = title.substr(pos + config.textPrimitives.sectionSeparator.length);
         | 
| 4774 | 
            +
            		title = title.substr(0,pos);
         | 
| 4775 | 
            +
            	}
         | 
| 4776 | 
            +
            	pos = title.indexOf(config.textPrimitives.sliceSeparator);
         | 
| 4417 4777 | 
             
            	if(pos != -1) {
         | 
| 4418 4778 | 
             
            		var slice = this.getTiddlerSlice(title.substr(0,pos),title.substr(pos + config.textPrimitives.sliceSeparator.length));
         | 
| 4419 4779 | 
             
            		if(slice)
         | 
| 4420 4780 | 
             
            			return slice;
         | 
| 4421 4781 | 
             
            	}
         | 
| 4782 | 
            +
            	var tiddler = this.fetchTiddler(title);
         | 
| 4783 | 
            +
            	if(tiddler) {
         | 
| 4784 | 
            +
            		if(!section)
         | 
| 4785 | 
            +
            			return tiddler.text;
         | 
| 4786 | 
            +
            		var re = new RegExp("(^!{1,6}" + section.escapeRegExp() + ")","mg");
         | 
| 4787 | 
            +
            		re.lastIndex = 0;
         | 
| 4788 | 
            +
            		var match =  re.exec(tiddler.text);
         | 
| 4789 | 
            +
            		if(match) {
         | 
| 4790 | 
            +
            			var t = tiddler.text.substr(match.index+match[1].length);
         | 
| 4791 | 
            +
            			var re2 = /^!/mg;
         | 
| 4792 | 
            +
            			re2.lastIndex = 0;
         | 
| 4793 | 
            +
            			match = re2.exec(t); //# search for the next heading
         | 
| 4794 | 
            +
            			if(match)
         | 
| 4795 | 
            +
            				t = t.substr(0,match.index);
         | 
| 4796 | 
            +
            			return t;
         | 
| 4797 | 
            +
            		}
         | 
| 4798 | 
            +
            		return defaultText;
         | 
| 4799 | 
            +
            	}
         | 
| 4422 4800 | 
             
            	if(this.isShadowTiddler(title))
         | 
| 4423 4801 | 
             
            		return config.shadowTiddlers[title];
         | 
| 4424 4802 | 
             
            	if(defaultText != undefined)
         | 
| @@ -4635,9 +5013,9 @@ TiddlyWiki.prototype.allTiddlersAsHtml = function() | |
| 4635 5013 | 
             
            };
         | 
| 4636 5014 |  | 
| 4637 5015 | 
             
            // Return an array of tiddlers matching a search regular expression
         | 
| 4638 | 
            -
            TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)
         | 
| 5016 | 
            +
            TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag,match)
         | 
| 4639 5017 | 
             
            {
         | 
| 4640 | 
            -
            	var candidates = this.reverseLookup("tags",excludeTag | 
| 5018 | 
            +
            	var candidates = this.reverseLookup("tags",excludeTag,!!match);
         | 
| 4641 5019 | 
             
            	var results = [];
         | 
| 4642 5020 | 
             
            	for(var t=0; t<candidates.length; t++) {
         | 
| 4643 5021 | 
             
            		if((candidates[t].title.search(searchRegExp) != -1) || (candidates[t].text.search(searchRegExp) != -1))
         | 
| @@ -4649,26 +5027,28 @@ TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag) | |
| 4649 5027 | 
             
            	return results;
         | 
| 4650 5028 | 
             
            };
         | 
| 4651 5029 |  | 
| 4652 | 
            -
            //  | 
| 5030 | 
            +
            // Returns a list of all tags in use
         | 
| 5031 | 
            +
            //   excludeTag - if present, excludes tags that are themselves tagged with excludeTag
         | 
| 5032 | 
            +
            // Returns an array of arrays where [tag][0] is the name of the tag and [tag][1] is the number of occurances
         | 
| 4653 5033 | 
             
            TiddlyWiki.prototype.getTags = function(excludeTag)
         | 
| 4654 5034 | 
             
            {
         | 
| 4655 5035 | 
             
            	var results = [];
         | 
| 4656 5036 | 
             
            	this.forEachTiddler(function(title,tiddler) {
         | 
| 4657 5037 | 
             
            		for(var g=0; g<tiddler.tags.length; g++) {
         | 
| 4658 5038 | 
             
            			var tag = tiddler.tags[g];
         | 
| 4659 | 
            -
            			 | 
| 4660 | 
            -
            				var t = store.fetchTiddler(tag);
         | 
| 4661 | 
            -
            				if(t && t.isTagged(excludeTag))
         | 
| 4662 | 
            -
            					return false;
         | 
| 4663 | 
            -
            			}
         | 
| 4664 | 
            -
            			var f = false;
         | 
| 5039 | 
            +
            			var n = true;
         | 
| 4665 5040 | 
             
            			for(var c=0; c<results.length; c++) {
         | 
| 4666 5041 | 
             
            				if(results[c][0] == tag) {
         | 
| 4667 | 
            -
            					 | 
| 5042 | 
            +
            					n = false;
         | 
| 4668 5043 | 
             
            					results[c][1]++;
         | 
| 4669 5044 | 
             
            				}
         | 
| 4670 5045 | 
             
            			}
         | 
| 4671 | 
            -
            			if( | 
| 5046 | 
            +
            			if(n && excludeTag) {
         | 
| 5047 | 
            +
            				var t = store.fetchTiddler(tag);
         | 
| 5048 | 
            +
            				if(t && t.isTagged(excludeTag))
         | 
| 5049 | 
            +
            					n = false;
         | 
| 5050 | 
            +
            			}
         | 
| 5051 | 
            +
            			if(n)
         | 
| 4672 5052 | 
             
            				results.push([tag,1]);
         | 
| 4673 5053 | 
             
            		}
         | 
| 4674 5054 | 
             
            	});
         | 
| @@ -4799,6 +5179,62 @@ TiddlyWiki.prototype.getSaver = function() | |
| 4799 5179 | 
             
            	return this.saver;
         | 
| 4800 5180 | 
             
            };
         | 
| 4801 5181 |  | 
| 5182 | 
            +
            // Filter a list of tiddlers
         | 
| 5183 | 
            +
            TiddlyWiki.prototype.filterTiddlers = function(filter)
         | 
| 5184 | 
            +
            {
         | 
| 5185 | 
            +
            	var results = [];
         | 
| 5186 | 
            +
            	if(filter) {
         | 
| 5187 | 
            +
            		var tiddler;
         | 
| 5188 | 
            +
            		var re = /([^ \[\]]+)|(?:\[([ \w]+)\[([^\]]+)\]\])|(?:\[\[([^\]]+)\]\])/mg;
         | 
| 5189 | 
            +
            		var match = re.exec(filter);
         | 
| 5190 | 
            +
            		while(match) {
         | 
| 5191 | 
            +
            			if(match[1] || match[4]) {
         | 
| 5192 | 
            +
            				var title = match[1] ? match[1] : match[4];
         | 
| 5193 | 
            +
            				tiddler = this.fetchTiddler(title);
         | 
| 5194 | 
            +
            				if(tiddler) {
         | 
| 5195 | 
            +
            					results.pushUnique(tiddler);
         | 
| 5196 | 
            +
            				} else if(store.isShadowTiddler(title)) {
         | 
| 5197 | 
            +
            					tiddler = new Tiddler();
         | 
| 5198 | 
            +
            					tiddler.set(title,store.getTiddlerText(title));
         | 
| 5199 | 
            +
            					results.pushUnique(tiddler);
         | 
| 5200 | 
            +
            				}
         | 
| 5201 | 
            +
            			} else if(match[2]) {
         | 
| 5202 | 
            +
            				switch(match[2]) {
         | 
| 5203 | 
            +
            					case "tag":
         | 
| 5204 | 
            +
            						this.forEachTiddler(function(title,tiddler) {
         | 
| 5205 | 
            +
            							if(tiddler.isTagged(match[3]))
         | 
| 5206 | 
            +
            								results.pushUnique(tiddler);
         | 
| 5207 | 
            +
            						});
         | 
| 5208 | 
            +
            						break;
         | 
| 5209 | 
            +
            					case "sort":
         | 
| 5210 | 
            +
            						results = this.sortTiddlers(results,match[3]);
         | 
| 5211 | 
            +
            						break; 
         | 
| 5212 | 
            +
            				}
         | 
| 5213 | 
            +
            			}
         | 
| 5214 | 
            +
            			match = re.exec(filter);
         | 
| 5215 | 
            +
            		}
         | 
| 5216 | 
            +
            	}
         | 
| 5217 | 
            +
            	return results;
         | 
| 5218 | 
            +
            };
         | 
| 5219 | 
            +
             | 
| 5220 | 
            +
            // Sort a list of tiddlers
         | 
| 5221 | 
            +
            TiddlyWiki.prototype.sortTiddlers = function(tiddlers,field)
         | 
| 5222 | 
            +
            {
         | 
| 5223 | 
            +
            	var asc = +1;
         | 
| 5224 | 
            +
            	switch(field.substr(0,1)) {
         | 
| 5225 | 
            +
            		case "-":
         | 
| 5226 | 
            +
            			asc = -1;
         | 
| 5227 | 
            +
            			// Note: this fall-through is intentional
         | 
| 5228 | 
            +
            		case "+":
         | 
| 5229 | 
            +
            			field = field.substr(1);
         | 
| 5230 | 
            +
            			break;
         | 
| 5231 | 
            +
            	}
         | 
| 5232 | 
            +
            	if(TiddlyWiki.standardFieldAccess[field])
         | 
| 5233 | 
            +
            		tiddlers.sort(function(a,b) {return a[field] < b[field] ? -asc : (a[field] == b[field] ? 0 : asc);});
         | 
| 5234 | 
            +
            	else
         | 
| 5235 | 
            +
            		tiddlers.sort(function(a,b) {return a.fields[field] < b.fields[field] ? -asc : (a.fields[field] == b.fields[field] ? 0 : +asc);});
         | 
| 5236 | 
            +
            	return tiddlers;
         | 
| 5237 | 
            +
            };
         | 
| 4802 5238 | 
             
            // Returns true if path is a valid field name (path),
         | 
| 4803 5239 | 
             
            // i.e. a sequence of identifiers, separated by '.'
         | 
| 4804 5240 | 
             
            TiddlyWiki.isValidFieldName = function(name)
         | 
| @@ -4944,19 +5380,20 @@ TiddlyWiki.prototype.forEachField = function(tiddler,callback,onlyExtendedFields | |
| 4944 5380 | 
             
            	var t = this.resolveTiddler(tiddler);
         | 
| 4945 5381 | 
             
            	if(!t)
         | 
| 4946 5382 | 
             
            		return undefined;
         | 
| 4947 | 
            -
            	 | 
| 4948 | 
            -
             | 
| 5383 | 
            +
            	var n,result;
         | 
| 5384 | 
            +
            	for(n in t.fields) {
         | 
| 5385 | 
            +
            		result = callback(t,n,t.fields[n]);
         | 
| 4949 5386 | 
             
            		if(result)
         | 
| 4950 5387 | 
             
            			return result;
         | 
| 4951 5388 | 
             
            		}
         | 
| 4952 5389 | 
             
            	if(onlyExtendedFields)
         | 
| 4953 5390 | 
             
            		return undefined;
         | 
| 4954 | 
            -
            	for( | 
| 5391 | 
            +
            	for(n in TiddlyWiki.standardFieldAccess) {
         | 
| 4955 5392 | 
             
            		if(n == "tiddler")
         | 
| 4956 5393 | 
             
            			// even though the "title" field can also be referenced through the name "tiddler"
         | 
| 4957 5394 | 
             
            			// we only visit this field once.
         | 
| 4958 5395 | 
             
            			continue;
         | 
| 4959 | 
            -
            		 | 
| 5396 | 
            +
            		result = callback(t,n,TiddlyWiki.standardFieldAccess[n].get(t));
         | 
| 4960 5397 | 
             
            		if(result)
         | 
| 4961 5398 | 
             
            			return result;
         | 
| 4962 5399 | 
             
            	}
         | 
| @@ -4994,8 +5431,9 @@ Story.prototype.displayTiddlers = function(srcElement,titles,template,animate,un | |
| 4994 5431 | 
             
            		this.displayTiddler(srcElement,titles[t],template,animate,unused,customFields);
         | 
| 4995 5432 | 
             
            };
         | 
| 4996 5433 |  | 
| 4997 | 
            -
            Story.prototype.displayTiddler = function(srcElement, | 
| 5434 | 
            +
            Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle)
         | 
| 4998 5435 | 
             
            {
         | 
| 5436 | 
            +
            	var title = (tiddler instanceof Tiddler)? tiddler.title : tiddler;  
         | 
| 4999 5437 | 
             
            	var place = document.getElementById(this.container);
         | 
| 5000 5438 | 
             
            	var tiddlerElem = document.getElementById(this.idPrefix + title);
         | 
| 5001 5439 | 
             
            	if(tiddlerElem) {
         | 
| @@ -5062,7 +5500,7 @@ Story.prototype.loadMissingTiddler = function(title,fields,tiddlerElem) | |
| 5062 5500 | 
             
            	var serverType = tiddler.getServerType();
         | 
| 5063 5501 | 
             
            	var host = tiddler.fields['server.host'];
         | 
| 5064 5502 | 
             
            	var workspace = tiddler.fields['server.workspace'];
         | 
| 5065 | 
            -
            	if(!serverType  | 
| 5503 | 
            +
            	if(!serverType || !host)
         | 
| 5066 5504 | 
             
            		return null;
         | 
| 5067 5505 | 
             
            	var sm = new SyncMachine(serverType,{
         | 
| 5068 5506 | 
             
            			start: function() {
         | 
| @@ -5072,9 +5510,10 @@ Story.prototype.loadMissingTiddler = function(title,fields,tiddlerElem) | |
| 5072 5510 | 
             
            				return this.openWorkspace(workspace,"getTiddler");
         | 
| 5073 5511 | 
             
            			},
         | 
| 5074 5512 | 
             
            			getTiddler: function() {
         | 
| 5075 | 
            -
            				return this.getTiddler(title," | 
| 5513 | 
            +
            				return this.getTiddler(title,"onGetTiddler");
         | 
| 5076 5514 | 
             
            			},
         | 
| 5077 | 
            -
            			 | 
| 5515 | 
            +
            			onGetTiddler: function(context) {
         | 
| 5516 | 
            +
            				var tiddler = context.tiddler;
         | 
| 5078 5517 | 
             
            				if(tiddler && tiddler.text) {
         | 
| 5079 5518 | 
             
            					var downloaded = new Date();
         | 
| 5080 5519 | 
             
            					if(!tiddler.created)
         | 
| @@ -5179,15 +5618,15 @@ Story.prototype.addCustomFields = function(place,customFields) | |
| 5179 5618 | 
             
            	}
         | 
| 5180 5619 | 
             
            };
         | 
| 5181 5620 |  | 
| 5182 | 
            -
            Story.prototype.refreshAllTiddlers = function() | 
| 5621 | 
            +
            Story.prototype.refreshAllTiddlers = function(force)
         | 
| 5183 5622 | 
             
            {
         | 
| 5184 5623 | 
             
            	var place = document.getElementById(this.container);
         | 
| 5185 5624 | 
             
            	var e = place.firstChild;
         | 
| 5186 5625 | 
             
            	if(!e)
         | 
| 5187 5626 | 
             
            		return;
         | 
| 5188 | 
            -
            	this.refreshTiddler(e.getAttribute("tiddler"),e.getAttribute("template"),true);
         | 
| 5189 | 
            -
            	while((e = e.nextSibling) != null) | 
| 5190 | 
            -
            		this.refreshTiddler(e.getAttribute("tiddler"),e.getAttribute("template"),true);
         | 
| 5627 | 
            +
            	this.refreshTiddler(e.getAttribute("tiddler"),force ? null : e.getAttribute("template"),true);
         | 
| 5628 | 
            +
            	while((e = e.nextSibling) != null)
         | 
| 5629 | 
            +
            		this.refreshTiddler(e.getAttribute("tiddler"),force ? null : e.getAttribute("template"),true);
         | 
| 5191 5630 | 
             
            };
         | 
| 5192 5631 |  | 
| 5193 5632 | 
             
            Story.prototype.onTiddlerMouseOver = function(e)
         | 
| @@ -5202,9 +5641,9 @@ Story.prototype.onTiddlerMouseOut = function(e) | |
| 5202 5641 | 
             
            		removeClass(this,"selected");
         | 
| 5203 5642 | 
             
            };
         | 
| 5204 5643 |  | 
| 5205 | 
            -
            Story.prototype.onTiddlerDblClick = function( | 
| 5644 | 
            +
            Story.prototype.onTiddlerDblClick = function(ev)
         | 
| 5206 5645 | 
             
            {
         | 
| 5207 | 
            -
            	 | 
| 5646 | 
            +
            	var e = ev ? ev : window.event;
         | 
| 5208 5647 | 
             
            	var theTarget = resolveTarget(e);
         | 
| 5209 5648 | 
             
            	if(theTarget && theTarget.nodeName.toLowerCase() != "input" && theTarget.nodeName.toLowerCase() != "textarea") {
         | 
| 5210 5649 | 
             
            		if(document.selection && document.selection.empty)
         | 
| @@ -5218,18 +5657,18 @@ Story.prototype.onTiddlerDblClick = function(e) | |
| 5218 5657 | 
             
            	}
         | 
| 5219 5658 | 
             
            };
         | 
| 5220 5659 |  | 
| 5221 | 
            -
            Story.prototype.onTiddlerKeyPress = function( | 
| 5660 | 
            +
            Story.prototype.onTiddlerKeyPress = function(ev)
         | 
| 5222 5661 | 
             
            {
         | 
| 5223 | 
            -
            	 | 
| 5662 | 
            +
            	var e = ev ? ev : window.event;
         | 
| 5224 5663 | 
             
            	clearMessage();
         | 
| 5225 | 
            -
            	var consume = false; | 
| 5664 | 
            +
            	var consume = false;
         | 
| 5226 5665 | 
             
            	var title = this.getAttribute("tiddler");
         | 
| 5227 5666 | 
             
            	var target = resolveTarget(e);
         | 
| 5228 5667 | 
             
            	switch(e.keyCode) {
         | 
| 5229 5668 | 
             
            		case 9: // Tab
         | 
| 5230 5669 | 
             
            			if(config.options.chkInsertTabs && target.tagName.toLowerCase() == "textarea") {
         | 
| 5231 5670 | 
             
            				replaceSelection(target,String.fromCharCode(9));
         | 
| 5232 | 
            -
            				consume = true; | 
| 5671 | 
            +
            				consume = true;
         | 
| 5233 5672 | 
             
            			}
         | 
| 5234 5673 | 
             
            			if(config.isOpera) {
         | 
| 5235 5674 | 
             
            				target.onblur = function() {
         | 
| @@ -5246,7 +5685,7 @@ Story.prototype.onTiddlerKeyPress = function(e) | |
| 5246 5685 | 
             
            				config.macros.toolbar.invokeCommand(this,"defaultCommand",e);
         | 
| 5247 5686 | 
             
            				consume = true;
         | 
| 5248 5687 | 
             
            			}
         | 
| 5249 | 
            -
            			break; | 
| 5688 | 
            +
            			break;
         | 
| 5250 5689 | 
             
            		case 27: // Escape
         | 
| 5251 5690 | 
             
            			blurElement(this);
         | 
| 5252 5691 | 
             
            			config.macros.toolbar.invokeCommand(this,"cancelCommand",e);
         | 
| @@ -5379,14 +5818,11 @@ Story.prototype.search = function(text,useCaseSensitive,useRegExp) | |
| 5379 5818 | 
             
            	this.closeAllTiddlers();
         | 
| 5380 5819 | 
             
            	highlightHack = new RegExp(useRegExp ?	 text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
         | 
| 5381 5820 | 
             
            	var matches = store.search(highlightHack,"title","excludeSearch");
         | 
| 5382 | 
            -
            	 | 
| 5383 | 
            -
            	for(var t=0;t<matches.length;t++)
         | 
| 5384 | 
            -
            		titles.push(matches[t].title);
         | 
| 5385 | 
            -
            	this.displayTiddlers(null,titles);
         | 
| 5821 | 
            +
            	this.displayTiddlers(null,matches);
         | 
| 5386 5822 | 
             
            	highlightHack = null;
         | 
| 5387 5823 | 
             
            	var q = useRegExp ? "/" : "'";
         | 
| 5388 5824 | 
             
            	if(matches.length > 0)
         | 
| 5389 | 
            -
            		displayMessage(config.macros.search.successMsg.format([ | 
| 5825 | 
            +
            		displayMessage(config.macros.search.successMsg.format([matches.length.toString(),q + text + q]));
         | 
| 5390 5826 | 
             
            	else
         | 
| 5391 5827 | 
             
            		displayMessage(config.macros.search.failureMsg.format([q + text + q]));
         | 
| 5392 5828 | 
             
            };
         | 
| @@ -5436,6 +5872,8 @@ Story.prototype.saveTiddler = function(title,minorUpdate) | |
| 5436 5872 | 
             
            		var fields = {};
         | 
| 5437 5873 | 
             
            		this.gatherSaveFields(tiddlerElem,fields);
         | 
| 5438 5874 | 
             
            		var newTitle = fields.title ? fields.title : title;
         | 
| 5875 | 
            +
            		if(!store.tiddlerExists(newTitle))
         | 
| 5876 | 
            +
            			newTitle = newTitle.trim();
         | 
| 5439 5877 | 
             
            		if(store.tiddlerExists(newTitle) && newTitle != title) {
         | 
| 5440 5878 | 
             
            			if(!confirm(config.messages.overwriteWarning.format([newTitle.toString()])))
         | 
| 5441 5879 | 
             
            				return null;
         | 
| @@ -5451,11 +5889,11 @@ Story.prototype.saveTiddler = function(title,minorUpdate) | |
| 5451 5889 | 
             
            		if(!store.tiddlerExists(newTitle))
         | 
| 5452 5890 | 
             
            			minorUpdate = false;
         | 
| 5453 5891 | 
             
            		var newDate = new Date();
         | 
| 5454 | 
            -
            		var extendedFields = store.tiddlerExists(newTitle) ? store.fetchTiddler(newTitle).fields : {};
         | 
| 5892 | 
            +
            		var extendedFields = store.tiddlerExists(newTitle) ? store.fetchTiddler(newTitle).fields : (newTitle!=title && store.tiddlerExists(title) ? store.fetchTiddler(title).fields : {});
         | 
| 5455 5893 | 
             
            		for(var n in fields) {
         | 
| 5456 5894 | 
             
            			if(!TiddlyWiki.isStandardField(n))
         | 
| 5457 5895 | 
             
            				extendedFields[n] = fields[n];
         | 
| 5458 | 
            -
             | 
| 5896 | 
            +
            		}
         | 
| 5459 5897 | 
             
            		var tiddler = store.saveTiddler(title,newTitle,fields.text,minorUpdate ? undefined : config.options.txtUserName,minorUpdate ? undefined : newDate,fields.tags,extendedFields);
         | 
| 5460 5898 | 
             
            		autoSaveChanges(null,[tiddler]);
         | 
| 5461 5899 | 
             
            		return newTitle;
         | 
| @@ -5476,6 +5914,63 @@ Story.prototype.permaView = function() | |
| 5476 5914 | 
             
            		window.location.hash = t;
         | 
| 5477 5915 | 
             
            };
         | 
| 5478 5916 |  | 
| 5917 | 
            +
             | 
| 5918 | 
            +
            Story.prototype.switchTheme = function(theme)
         | 
| 5919 | 
            +
            {
         | 
| 5920 | 
            +
            	if(safeMode) 
         | 
| 5921 | 
            +
            		return;
         | 
| 5922 | 
            +
            		
         | 
| 5923 | 
            +
            	isAvailable = function(title) { 
         | 
| 5924 | 
            +
            		var s = title ? title.indexOf(config.textPrimitives.sectionSeparator) : -1; 
         | 
| 5925 | 
            +
            		if(s!=-1) 
         | 
| 5926 | 
            +
            			title = title.substr(0,s); 
         | 
| 5927 | 
            +
            		return store.tiddlerExists(title) || store.isShadowTiddler(title); 
         | 
| 5928 | 
            +
             	};
         | 
| 5929 | 
            +
             | 
| 5930 | 
            +
            	getSlice = function(theme,slice) {
         | 
| 5931 | 
            +
            		var r = store.getTiddlerSlice(theme,slice);
         | 
| 5932 | 
            +
            		if(r && r.indexOf(config.textPrimitives.sectionSeparator)==0)
         | 
| 5933 | 
            +
            			r = theme + r;
         | 
| 5934 | 
            +
            		return isAvailable(r) ? r : slice;
         | 
| 5935 | 
            +
            	};
         | 
| 5936 | 
            +
             | 
| 5937 | 
            +
            	replaceNotification = function(i,name,newName) {
         | 
| 5938 | 
            +
            		if(name==newName)
         | 
| 5939 | 
            +
            			return name;
         | 
| 5940 | 
            +
            		if(store.namedNotifications[i].name == name) {
         | 
| 5941 | 
            +
            			store.namedNotifications[i].name = newName;
         | 
| 5942 | 
            +
            			return newName;
         | 
| 5943 | 
            +
            		}
         | 
| 5944 | 
            +
            		return name;
         | 
| 5945 | 
            +
            	};
         | 
| 5946 | 
            +
             | 
| 5947 | 
            +
            	for(var i=0; i<config.notifyTiddlers.length; i++) {
         | 
| 5948 | 
            +
            		var name = config.notifyTiddlers[i].name;
         | 
| 5949 | 
            +
            		switch(name) {
         | 
| 5950 | 
            +
            		case "PageTemplate":
         | 
| 5951 | 
            +
            			config.refreshers.pageTemplate = replaceNotification(i,config.refreshers.pageTemplate,getSlice(theme,name));
         | 
| 5952 | 
            +
            			break;
         | 
| 5953 | 
            +
            		case "StyleSheet":
         | 
| 5954 | 
            +
            			removeStyleSheet(config.refreshers.styleSheet);
         | 
| 5955 | 
            +
            			config.refreshers.styleSheet = replaceNotification(i,config.refreshers.styleSheet,getSlice(theme,name));
         | 
| 5956 | 
            +
            			break;
         | 
| 5957 | 
            +
            		case "ColorPalette":
         | 
| 5958 | 
            +
            			config.refreshers.colorPalette = replaceNotification(i,config.refreshers.colorPalette,getSlice(theme,name));
         | 
| 5959 | 
            +
            			break;
         | 
| 5960 | 
            +
            		default:
         | 
| 5961 | 
            +
            			break;
         | 
| 5962 | 
            +
            		}
         | 
| 5963 | 
            +
            	}
         | 
| 5964 | 
            +
            	config.tiddlerTemplates[DEFAULT_VIEW_TEMPLATE] = getSlice(theme,"ViewTemplate");
         | 
| 5965 | 
            +
            	config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE] = getSlice(theme,"EditTemplate");
         | 
| 5966 | 
            +
            	if(!startingUp) {
         | 
| 5967 | 
            +
            		refreshAll();
         | 
| 5968 | 
            +
            		story.refreshAllTiddlers(true);
         | 
| 5969 | 
            +
            		config.options.txtTheme = theme;
         | 
| 5970 | 
            +
            		saveOptionCookie("txtTheme");
         | 
| 5971 | 
            +
            	}
         | 
| 5972 | 
            +
            };
         | 
| 5973 | 
            +
             | 
| 5479 5974 | 
             
            //--
         | 
| 5480 5975 | 
             
            //-- Backstage
         | 
| 5481 5976 | 
             
            //--
         | 
| @@ -5529,11 +6024,11 @@ var backstage = { | |
| 5529 6024 | 
             
            		else
         | 
| 5530 6025 | 
             
            			this.hide();
         | 
| 5531 6026 | 
             
            	},
         | 
| 5532 | 
            -
             | 
| 5533 | 
            -
            	isVisible: function | 
| 6027 | 
            +
             | 
| 6028 | 
            +
            	isVisible: function() {
         | 
| 5534 6029 | 
             
            		return this.area ? this.area.style.display == "block" : false;
         | 
| 5535 6030 | 
             
            	},
         | 
| 5536 | 
            -
             | 
| 6031 | 
            +
             | 
| 5537 6032 | 
             
            	show: function() {
         | 
| 5538 6033 | 
             
            		this.area.style.display = "block";
         | 
| 5539 6034 | 
             
            		if(anim && config.options.chkAnimate) {
         | 
| @@ -5627,7 +6122,7 @@ var backstage = { | |
| 5627 6122 | 
             
            		removeChildren(backstage.panelBody);
         | 
| 5628 6123 | 
             
            		return backstage.panelBody;
         | 
| 5629 6124 | 
             
            	},
         | 
| 5630 | 
            -
             | 
| 6125 | 
            +
             | 
| 5631 6126 | 
             
            	showPanel: function() {
         | 
| 5632 6127 | 
             
            		backstage.panel.style.display = "block";
         | 
| 5633 6128 | 
             
            		if(anim && config.options.chkAnimate) {
         | 
| @@ -5641,7 +6136,7 @@ var backstage = { | |
| 5641 6136 | 
             
            		}
         | 
| 5642 6137 | 
             
            		return backstage.panelBody;
         | 
| 5643 6138 | 
             
            	},
         | 
| 5644 | 
            -
             | 
| 6139 | 
            +
             | 
| 5645 6140 | 
             
            	hidePanel: function() {
         | 
| 5646 6141 | 
             
            		backstage.currTabName = null;
         | 
| 5647 6142 | 
             
            		backstage.currTabElem = null;
         | 
| @@ -5773,8 +6268,7 @@ config.macros.importTiddlers.onOpen = function(e) | |
| 5773 6268 | 
             
            	wizard.setValue("adaptor",adaptor);
         | 
| 5774 6269 | 
             
            	wizard.setValue("serverType",serverType);
         | 
| 5775 6270 | 
             
            	wizard.setValue("host",url);
         | 
| 5776 | 
            -
            	var  | 
| 5777 | 
            -
            	var ret = adaptor.openHost(url,context,wizard,config.macros.importTiddlers.onOpenHost);
         | 
| 6271 | 
            +
            	var ret = adaptor.openHost(url,null,wizard,config.macros.importTiddlers.onOpenHost);
         | 
| 5778 6272 | 
             
            	if(ret !== true)
         | 
| 5779 6273 | 
             
            		displayMessage(ret);
         | 
| 5780 6274 | 
             
            	wizard.setButtons([{caption: config.macros.importTiddlers.cancelLabel, tooltip: config.macros.importTiddlers.cancelPrompt, onClick: config.macros.importTiddlers.onCancel}],config.macros.importTiddlers.statusOpenHost);
         | 
| @@ -5796,6 +6290,18 @@ config.macros.importTiddlers.onGetWorkspaceList = function(context,wizard) | |
| 5796 6290 | 
             
            {
         | 
| 5797 6291 | 
             
            	if(context.status !== true)
         | 
| 5798 6292 | 
             
            		displayMessage("Error in importTiddlers.onGetWorkspaceList: " + context.statusText);
         | 
| 6293 | 
            +
            	wizard.setValue("context",context);
         | 
| 6294 | 
            +
            	var workspace = wizard.getValue("feedWorkspace");
         | 
| 6295 | 
            +
            	if(!workspace && context.workspaces.length==1)
         | 
| 6296 | 
            +
            		workspace = context.workspaces[0].title;
         | 
| 6297 | 
            +
            	if(workspace) {
         | 
| 6298 | 
            +
            		var ret = context.adaptor.openWorkspace(workspace,context,wizard,config.macros.importTiddlers.onOpenWorkspace);
         | 
| 6299 | 
            +
            		if(ret !== true)
         | 
| 6300 | 
            +
            			displayMessage(ret);
         | 
| 6301 | 
            +
            		wizard.setValue("workspace",workspace);
         | 
| 6302 | 
            +
            		wizard.setButtons([{caption: config.macros.importTiddlers.cancelLabel, tooltip: config.macros.importTiddlers.cancelPrompt, onClick: config.macros.importTiddlers.onCancel}],config.macros.importTiddlers.statusOpenWorkspace);
         | 
| 6303 | 
            +
            		return;
         | 
| 6304 | 
            +
            	}
         | 
| 5799 6305 | 
             
            	wizard.addStep(config.macros.importTiddlers.step2Title,config.macros.importTiddlers.step2Html);
         | 
| 5800 6306 | 
             
            	var s = wizard.getElement("selWorkspace");
         | 
| 5801 6307 | 
             
            	s.onchange = config.macros.importTiddlers.onWorkspaceChange;
         | 
| @@ -5813,7 +6319,6 @@ config.macros.importTiddlers.onGetWorkspaceList = function(context,wizard) | |
| 5813 6319 | 
             
            			}
         | 
| 5814 6320 | 
             
            		}
         | 
| 5815 6321 | 
             
            	}
         | 
| 5816 | 
            -
            	var workspace = wizard.getValue("feedWorkspace");
         | 
| 5817 6322 | 
             
            	if(workspace) {
         | 
| 5818 6323 | 
             
            		t = wizard.getElement("txtWorkspace");
         | 
| 5819 6324 | 
             
            		t.value = workspace;
         | 
| @@ -5836,7 +6341,7 @@ config.macros.importTiddlers.onChooseWorkspace = function(e) | |
| 5836 6341 | 
             
            	var adaptor = wizard.getValue("adaptor");
         | 
| 5837 6342 | 
             
            	var workspace = wizard.getElement("txtWorkspace").value;
         | 
| 5838 6343 | 
             
            	wizard.setValue("workspace",workspace);
         | 
| 5839 | 
            -
            	var context =  | 
| 6344 | 
            +
            	var context = wizard.getValue("context");
         | 
| 5840 6345 | 
             
            	var ret = adaptor.openWorkspace(workspace,context,wizard,config.macros.importTiddlers.onOpenWorkspace);
         | 
| 5841 6346 | 
             
            	if(ret !== true)
         | 
| 5842 6347 | 
             
            		displayMessage(ret);
         | 
| @@ -5967,7 +6472,7 @@ config.macros.importTiddlers.onGetTiddler = function(context,wizard) | |
| 5967 6472 | 
             
            		store.setValue(tiddler.title,'server',null);
         | 
| 5968 6473 | 
             
            	}
         | 
| 5969 6474 | 
             
            	store.resumeNotifications();
         | 
| 5970 | 
            -
            	if(!context.isSynchronous) | 
| 6475 | 
            +
            	if(!context.isSynchronous)
         | 
| 5971 6476 | 
             
            		store.notify(tiddler.title,true);
         | 
| 5972 6477 | 
             
            	var remainingImports = wizard.getValue("remainingImports")-1;
         | 
| 5973 6478 | 
             
            	wizard.setValue("remainingImports",remainingImports);
         | 
| @@ -6022,7 +6527,7 @@ config.macros.sync.startSync = function(place) | |
| 6022 6527 | 
             
            		]);
         | 
| 6023 6528 | 
             
            };
         | 
| 6024 6529 |  | 
| 6025 | 
            -
            config.macros.sync.getSyncableTiddlers = function | 
| 6530 | 
            +
            config.macros.sync.getSyncableTiddlers = function()
         | 
| 6026 6531 | 
             
            {
         | 
| 6027 6532 | 
             
            	var list = [];
         | 
| 6028 6533 | 
             
            	store.forEachTiddler(function(title,tiddler) {
         | 
| @@ -6096,9 +6601,10 @@ config.macros.sync.createSyncTask = function(syncItem) | |
| 6096 6601 | 
             
            			return this.openWorkspace(st.serverWorkspace,"getTiddlerList");
         | 
| 6097 6602 | 
             
            		},
         | 
| 6098 6603 | 
             
            		getTiddlerList: function() {
         | 
| 6099 | 
            -
            			return this.getTiddlerList(" | 
| 6604 | 
            +
            			return this.getTiddlerList("onGetTiddlerList");
         | 
| 6100 6605 | 
             
            		},
         | 
| 6101 | 
            -
            		 | 
| 6606 | 
            +
            		onGetTiddlerList: function(context) {
         | 
| 6607 | 
            +
            			var tiddlers = context.tiddlers;
         | 
| 6102 6608 | 
             
            			for(var t=0; t<st.syncItems.length; t++) {
         | 
| 6103 6609 | 
             
            				var si = st.syncItems[t];
         | 
| 6104 6610 | 
             
            				var f = tiddlers.findByField("title",si.title);
         | 
| @@ -6115,7 +6621,8 @@ config.macros.sync.createSyncTask = function(syncItem) | |
| 6115 6621 | 
             
            		getTiddler: function(title) {
         | 
| 6116 6622 | 
             
            			return this.getTiddler(title,"onGetTiddler");
         | 
| 6117 6623 | 
             
            		},
         | 
| 6118 | 
            -
            		onGetTiddler: function( | 
| 6624 | 
            +
            		onGetTiddler: function(context) {
         | 
| 6625 | 
            +
            			var tiddler = context.tiddler;
         | 
| 6119 6626 | 
             
            			var syncItem = st.syncItems.findByField("title",tiddler.title);
         | 
| 6120 6627 | 
             
            			if(syncItem !== null) {
         | 
| 6121 6628 | 
             
            				syncItem = st.syncItems[syncItem];
         | 
| @@ -6127,11 +6634,12 @@ config.macros.sync.createSyncTask = function(syncItem) | |
| 6127 6634 | 
             
            		putTiddler: function(tiddler) {
         | 
| 6128 6635 | 
             
            			return this.putTiddler(tiddler,"onPutTiddler");
         | 
| 6129 6636 | 
             
            		},
         | 
| 6130 | 
            -
            		onPutTiddler: function( | 
| 6131 | 
            -
            			var  | 
| 6637 | 
            +
            		onPutTiddler: function(context) {
         | 
| 6638 | 
            +
            			var title = context.title;
         | 
| 6639 | 
            +
            			var syncItem = st.syncItems.findByField("title",title);
         | 
| 6132 6640 | 
             
            			if(syncItem !== null) {
         | 
| 6133 6641 | 
             
            				syncItem = st.syncItems[syncItem];
         | 
| 6134 | 
            -
            				store.resetTiddler( | 
| 6642 | 
            +
            				store.resetTiddler(title);
         | 
| 6135 6643 | 
             
            				syncItem.syncStatus = config.macros.sync.syncStatusList.putToServer;
         | 
| 6136 6644 | 
             
            				config.macros.sync.updateSyncStatus(syncItem);
         | 
| 6137 6645 | 
             
            			}
         | 
| @@ -6193,17 +6701,17 @@ function SyncMachine(serverType,steps) | |
| 6193 6701 | 
             
            	this.steps = steps;
         | 
| 6194 6702 | 
             
            }
         | 
| 6195 6703 |  | 
| 6196 | 
            -
            SyncMachine.prototype.go = function(step, | 
| 6704 | 
            +
            SyncMachine.prototype.go = function(step,context)
         | 
| 6197 6705 | 
             
            {
         | 
| 6198 | 
            -
            	 | 
| 6199 | 
            -
             | 
| 6200 | 
            -
             | 
| 6706 | 
            +
            	var r = context ? context.status : null;
         | 
| 6707 | 
            +
            	if(typeof r == "string") {
         | 
| 6708 | 
            +
            		this.invokeError(r);
         | 
| 6709 | 
            +
            		return r;
         | 
| 6710 | 
            +
            	}
         | 
| 6711 | 
            +
            	var h = this.steps[step ? step : "start"];
         | 
| 6201 6712 | 
             
            	if(!h)
         | 
| 6202 6713 | 
             
            		return null;
         | 
| 6203 | 
            -
            	 | 
| 6204 | 
            -
            	for(var t=1; t<arguments.length; t++)
         | 
| 6205 | 
            -
            		a.push(arguments[t]);
         | 
| 6206 | 
            -
            	var r = h.apply(this,a);
         | 
| 6714 | 
            +
            	r = h.call(this,context);
         | 
| 6207 6715 | 
             
            	if(typeof r == "string")
         | 
| 6208 6716 | 
             
            		this.invokeError(r);
         | 
| 6209 6717 | 
             
            	return r;
         | 
| @@ -6218,45 +6726,25 @@ SyncMachine.prototype.invokeError = function(message) | |
| 6218 6726 | 
             
            SyncMachine.prototype.openHost = function(host,nextStep)
         | 
| 6219 6727 | 
             
            {
         | 
| 6220 6728 | 
             
            	var me = this;
         | 
| 6221 | 
            -
            	return me.adaptor.openHost(host,null,null,function(context) {
         | 
| 6222 | 
            -
            		if(typeof context.status == "string")
         | 
| 6223 | 
            -
            			me.invokeError(context.status);
         | 
| 6224 | 
            -
            		else
         | 
| 6225 | 
            -
            			me.go(nextStep);
         | 
| 6226 | 
            -
            	});
         | 
| 6729 | 
            +
            	return me.adaptor.openHost(host,null,null,function(context) {me.go(nextStep,context);});
         | 
| 6227 6730 | 
             
            };
         | 
| 6228 6731 |  | 
| 6229 6732 | 
             
            SyncMachine.prototype.getWorkspaceList = function(nextStep)
         | 
| 6230 6733 | 
             
            {
         | 
| 6231 6734 | 
             
            	var me = this;
         | 
| 6232 | 
            -
            	return me.adaptor.getWorkspaceList(null,null,function(context) {
         | 
| 6233 | 
            -
            		if(typeof context.status == "string")
         | 
| 6234 | 
            -
            			me.invokeError(context.status);
         | 
| 6235 | 
            -
            		else
         | 
| 6236 | 
            -
            			me.go(nextStep,context.workspaces);
         | 
| 6237 | 
            -
            	});
         | 
| 6735 | 
            +
            	return me.adaptor.getWorkspaceList(null,null,function(context) {me.go(nextStep,context);});
         | 
| 6238 6736 | 
             
            };
         | 
| 6239 6737 |  | 
| 6240 6738 | 
             
            SyncMachine.prototype.openWorkspace = function(workspace,nextStep)
         | 
| 6241 6739 | 
             
            {
         | 
| 6242 6740 | 
             
            	var me = this;
         | 
| 6243 | 
            -
            	return me.adaptor.openWorkspace(workspace,null,null,function(context) {
         | 
| 6244 | 
            -
            		if(typeof context.status == "string")
         | 
| 6245 | 
            -
            			me.invokeError(context.status);
         | 
| 6246 | 
            -
            		else
         | 
| 6247 | 
            -
            			me.go(nextStep);
         | 
| 6248 | 
            -
            	});
         | 
| 6741 | 
            +
            	return me.adaptor.openWorkspace(workspace,null,null,function(context) {me.go(nextStep,context);});
         | 
| 6249 6742 | 
             
            };
         | 
| 6250 6743 |  | 
| 6251 6744 | 
             
            SyncMachine.prototype.getTiddlerList = function(nextStep)
         | 
| 6252 6745 | 
             
            {
         | 
| 6253 6746 | 
             
            	var me = this;
         | 
| 6254 | 
            -
            	return me.adaptor.getTiddlerList(null,null,function(context) {
         | 
| 6255 | 
            -
            		if(typeof context.status == "string")
         | 
| 6256 | 
            -
            			me.invokeError(context.status);
         | 
| 6257 | 
            -
            		else
         | 
| 6258 | 
            -
            			me.go(nextStep,context.tiddlers);
         | 
| 6259 | 
            -
            	});
         | 
| 6747 | 
            +
            	return me.adaptor.getTiddlerList(null,null,function(context) {me.go(nextStep,context);});
         | 
| 6260 6748 | 
             
            };
         | 
| 6261 6749 |  | 
| 6262 6750 | 
             
            SyncMachine.prototype.generateTiddlerInfo = function(tiddler)
         | 
| @@ -6267,23 +6755,13 @@ SyncMachine.prototype.generateTiddlerInfo = function(tiddler) | |
| 6267 6755 | 
             
            SyncMachine.prototype.getTiddler = function(title,nextStep)
         | 
| 6268 6756 | 
             
            {
         | 
| 6269 6757 | 
             
            	var me = this;
         | 
| 6270 | 
            -
            	return me.adaptor.getTiddler(title,null,null,function(context) {
         | 
| 6271 | 
            -
            		if(typeof context.status == "string")
         | 
| 6272 | 
            -
            			me.invokeError(context.status);
         | 
| 6273 | 
            -
            		else
         | 
| 6274 | 
            -
            			me.go(nextStep,context.tiddler);
         | 
| 6275 | 
            -
            	});
         | 
| 6758 | 
            +
            	return me.adaptor.getTiddler(title,null,null,function(context) {me.go(nextStep,context);});
         | 
| 6276 6759 | 
             
            };
         | 
| 6277 6760 |  | 
| 6278 6761 | 
             
            SyncMachine.prototype.putTiddler = function(tiddler,nextStep)
         | 
| 6279 6762 | 
             
            {
         | 
| 6280 6763 | 
             
            	var me = this;
         | 
| 6281 | 
            -
            	return me.adaptor.putTiddler(tiddler,null,null,function(context) {
         | 
| 6282 | 
            -
            		if(typeof context.status == "string")
         | 
| 6283 | 
            -
            			me.invokeError(context.status);
         | 
| 6284 | 
            -
            		else
         | 
| 6285 | 
            -
            			me.go(nextStep,tiddler);
         | 
| 6286 | 
            -
            	});
         | 
| 6764 | 
            +
            	return me.adaptor.putTiddler(tiddler,null,null,function(context) {me.go(nextStep,context);});
         | 
| 6287 6765 | 
             
            };
         | 
| 6288 6766 |  | 
| 6289 6767 | 
             
            //--
         | 
| @@ -6431,7 +6909,7 @@ config.refreshers = { | |
| 6431 6909 | 
             
            		refreshTiddlyLink(e,title);
         | 
| 6432 6910 | 
             
            		return true;
         | 
| 6433 6911 | 
             
            		},
         | 
| 6434 | 
            -
             | 
| 6912 | 
            +
             | 
| 6435 6913 | 
             
            	tiddler: function(e,changeList)
         | 
| 6436 6914 | 
             
            		{
         | 
| 6437 6915 | 
             
            		var title = e.getAttribute("tiddler");
         | 
| @@ -6464,7 +6942,13 @@ config.refreshers = { | |
| 6464 6942 | 
             
            		if(macro && macro.refresh)
         | 
| 6465 6943 | 
             
            			macro.refresh(e,params);
         | 
| 6466 6944 | 
             
            		return true;
         | 
| 6467 | 
            -
            		}
         | 
| 6945 | 
            +
            		},
         | 
| 6946 | 
            +
            	styleSheet: "StyleSheet", 
         | 
| 6947 | 
            +
            	defaultStyleSheet: "StyleSheet", 
         | 
| 6948 | 
            +
            	pageTemplate: "PageTemplate", 
         | 
| 6949 | 
            +
            	defaultPageTemplate: "PageTemplate", 
         | 
| 6950 | 
            +
            	colorPalette: "ColorPalette", 
         | 
| 6951 | 
            +
            	defaultColorPalette: "ColorPalette" 
         | 
| 6468 6952 | 
             
            };
         | 
| 6469 6953 |  | 
| 6470 6954 | 
             
            function refreshElements(root,changeList)
         | 
| @@ -6518,9 +7002,18 @@ function refreshPageTemplate(title) | |
| 6518 7002 | 
             
            			stash.appendChild(nodes[t]);
         | 
| 6519 7003 | 
             
            	}
         | 
| 6520 7004 | 
             
            	var wrapper = document.getElementById("contentWrapper");
         | 
| 6521 | 
            -
             | 
| 6522 | 
            -
             | 
| 6523 | 
            -
             | 
| 7005 | 
            +
             | 
| 7006 | 
            +
            	isAvailable = function(title) { 
         | 
| 7007 | 
            +
            		var s = title ? title.indexOf(config.textPrimitives.sectionSeparator) : -1; 
         | 
| 7008 | 
            +
            		if(s!=-1) 
         | 
| 7009 | 
            +
            			title = title.substr(0,s); 
         | 
| 7010 | 
            +
            		return store.tiddlerExists(title) || store.isShadowTiddler(title); 
         | 
| 7011 | 
            +
             	};
         | 
| 7012 | 
            +
            	if(!title || !isAvailable(title))
         | 
| 7013 | 
            +
            		title = config.refreshers.pageTemplate;
         | 
| 7014 | 
            +
            	if(!isAvailable(title))
         | 
| 7015 | 
            +
            		title = config.refreshers.defaultPageTemplate; //# this one is always avaialable
         | 
| 7016 | 
            +
            	html = store.getRecursiveTiddlerText(title,null,10);
         | 
| 6524 7017 | 
             
            	wrapper.innerHTML = html;
         | 
| 6525 7018 | 
             
            	applyHtmlMacros(wrapper);
         | 
| 6526 7019 | 
             
            	refreshElements(wrapper);
         | 
| @@ -6560,9 +7053,7 @@ function getPageTitle() | |
| 6560 7053 |  | 
| 6561 7054 | 
             
            function refreshStyles(title,doc)
         | 
| 6562 7055 | 
             
            {
         | 
| 6563 | 
            -
            	 | 
| 6564 | 
            -
            		doc = document;
         | 
| 6565 | 
            -
            	setStylesheet(title == null ? "" : store.getRecursiveTiddlerText(title,"",10),title,doc);
         | 
| 7056 | 
            +
            	setStylesheet(title == null ? "" : store.getRecursiveTiddlerText(title,"",10),title,doc ? doc : document);
         | 
| 6566 7057 | 
             
            }
         | 
| 6567 7058 |  | 
| 6568 7059 | 
             
            function refreshColorPalette(title)
         | 
| @@ -6577,12 +7068,12 @@ function refreshAll() | |
| 6577 7068 | 
             
            	refreshDisplay();
         | 
| 6578 7069 | 
             
            	refreshStyles("StyleSheetLayout");
         | 
| 6579 7070 | 
             
            	refreshStyles("StyleSheetColors");
         | 
| 6580 | 
            -
            	refreshStyles( | 
| 7071 | 
            +
            	refreshStyles(config.refreshers.styleSheet);
         | 
| 6581 7072 | 
             
            	refreshStyles("StyleSheetPrint");
         | 
| 6582 7073 | 
             
            }
         | 
| 6583 7074 |  | 
| 6584 7075 | 
             
            //--
         | 
| 6585 | 
            -
            //-- Options  | 
| 7076 | 
            +
            //-- Options stuff
         | 
| 6586 7077 | 
             
            //--
         | 
| 6587 7078 |  | 
| 6588 7079 | 
             
            config.optionHandlers = {
         | 
| @@ -6637,6 +7128,133 @@ function decodeCookie(s) | |
| 6637 7128 | 
             
            	return s.replace(re,function($0) {return String.fromCharCode(eval($0.replace(/[&#;]/g,"")));});
         | 
| 6638 7129 | 
             
            }
         | 
| 6639 7130 |  | 
| 7131 | 
            +
             | 
| 7132 | 
            +
            config.macros.option.genericCreate = function(place,type,opt,className,desc)
         | 
| 7133 | 
            +
            {
         | 
| 7134 | 
            +
            	var typeInfo = config.macros.option.types[type];
         | 
| 7135 | 
            +
            	var c = document.createElement(typeInfo.elementType);
         | 
| 7136 | 
            +
            	if(typeInfo.typeValue)
         | 
| 7137 | 
            +
            		c.setAttribute("type",typeInfo.typeValue);
         | 
| 7138 | 
            +
            	c[typeInfo.eventName] = typeInfo.onChange;
         | 
| 7139 | 
            +
            	c.setAttribute("option",opt);
         | 
| 7140 | 
            +
            	if(className)
         | 
| 7141 | 
            +
            		c.className = className;
         | 
| 7142 | 
            +
            	else
         | 
| 7143 | 
            +
            		c.className = typeInfo.className;
         | 
| 7144 | 
            +
            	if(config.optionsDesc[opt])
         | 
| 7145 | 
            +
            		c.setAttribute("title",config.optionsDesc[opt]);
         | 
| 7146 | 
            +
            	place.appendChild(c);
         | 
| 7147 | 
            +
            	if(desc != "no")
         | 
| 7148 | 
            +
            		createTiddlyText(place,config.optionsDesc[opt] ? config.optionsDesc[opt] : opt);
         | 
| 7149 | 
            +
            	c[typeInfo.valueField] = config.options[opt];
         | 
| 7150 | 
            +
            	return c;
         | 
| 7151 | 
            +
            };
         | 
| 7152 | 
            +
             | 
| 7153 | 
            +
            config.macros.option.genericOnChange = function(e)
         | 
| 7154 | 
            +
            {
         | 
| 7155 | 
            +
            	var opt = this.getAttribute("option");
         | 
| 7156 | 
            +
            	if(opt) {
         | 
| 7157 | 
            +
            		var optType = opt.substr(0,3);
         | 
| 7158 | 
            +
            		var handler = config.macros.option.types[optType];
         | 
| 7159 | 
            +
            		if (handler.elementType && handler.valueField)
         | 
| 7160 | 
            +
            			config.macros.option.propagateOption(opt,handler.valueField,this[handler.valueField],handler.elementType);
         | 
| 7161 | 
            +
            		}
         | 
| 7162 | 
            +
            	return true;
         | 
| 7163 | 
            +
            };
         | 
| 7164 | 
            +
             | 
| 7165 | 
            +
            config.macros.option.types = {
         | 
| 7166 | 
            +
            	'txt': {
         | 
| 7167 | 
            +
            		elementType: "input",
         | 
| 7168 | 
            +
            		valueField: "value",
         | 
| 7169 | 
            +
            		eventName: "onkeyup",
         | 
| 7170 | 
            +
            		className: "txtOptionInput",
         | 
| 7171 | 
            +
            		create: config.macros.option.genericCreate,
         | 
| 7172 | 
            +
            		onChange: config.macros.option.genericOnChange
         | 
| 7173 | 
            +
            	},
         | 
| 7174 | 
            +
            	'chk': {
         | 
| 7175 | 
            +
            		elementType: "input",
         | 
| 7176 | 
            +
            		valueField: "checked",
         | 
| 7177 | 
            +
            		eventName: "onclick",
         | 
| 7178 | 
            +
            		className: "chkOptionInput",
         | 
| 7179 | 
            +
            		typeValue: "checkbox",
         | 
| 7180 | 
            +
            		create: config.macros.option.genericCreate,
         | 
| 7181 | 
            +
            		onChange: config.macros.option.genericOnChange
         | 
| 7182 | 
            +
            	}
         | 
| 7183 | 
            +
            };
         | 
| 7184 | 
            +
             | 
| 7185 | 
            +
            config.macros.option.propagateOption = function(opt,valueField,value,elementType)
         | 
| 7186 | 
            +
            {
         | 
| 7187 | 
            +
            	config.options[opt] = value;
         | 
| 7188 | 
            +
            	saveOptionCookie(opt);
         | 
| 7189 | 
            +
            	var nodes = document.getElementsByTagName(elementType);
         | 
| 7190 | 
            +
            	for(var t=0; t<nodes.length; t++) {
         | 
| 7191 | 
            +
            		var optNode = nodes[t].getAttribute("option");
         | 
| 7192 | 
            +
            		if(opt == optNode)
         | 
| 7193 | 
            +
            			nodes[t][valueField] = value;
         | 
| 7194 | 
            +
            		}
         | 
| 7195 | 
            +
            };
         | 
| 7196 | 
            +
             | 
| 7197 | 
            +
            config.macros.option.handler = function(place,macroName,params,wikifier,paramString,tiddler)
         | 
| 7198 | 
            +
            {
         | 
| 7199 | 
            +
            	params = paramString.parseParams("anon",null,true,false,false);
         | 
| 7200 | 
            +
            	var opt = (params[1] && params[1].name == "anon") ? params[1].value : getParam(params,"name",null);
         | 
| 7201 | 
            +
            	var className = (params[2] && params[2].name == "anon") ? params[2].value : getParam(params,"class",null);
         | 
| 7202 | 
            +
            	var desc = getParam(params,"desc","no");
         | 
| 7203 | 
            +
            	var type = opt.substr(0,3);
         | 
| 7204 | 
            +
            	var h = config.macros.option.types[type];
         | 
| 7205 | 
            +
            	if (h && h.create)
         | 
| 7206 | 
            +
            		h.create(place,type,opt,className,desc);
         | 
| 7207 | 
            +
            };
         | 
| 7208 | 
            +
             | 
| 7209 | 
            +
            config.macros.options.handler = function(place,macroName,params,wikifier,paramString,tiddler)
         | 
| 7210 | 
            +
            {
         | 
| 7211 | 
            +
            	params = paramString.parseParams("anon",null,true,false,false);
         | 
| 7212 | 
            +
            	var showUnknown = getParam(params,"showUnknown","no");
         | 
| 7213 | 
            +
            	var wizard = new Wizard();
         | 
| 7214 | 
            +
            	wizard.createWizard(place,this.wizardTitle);
         | 
| 7215 | 
            +
            	wizard.addStep(this.step1Title,this.step1Html);
         | 
| 7216 | 
            +
            	var markList = wizard.getElement("markList");
         | 
| 7217 | 
            +
            	var chkUnknown = wizard.getElement("chkUnknown");
         | 
| 7218 | 
            +
            	chkUnknown.checked = showUnknown == "yes";
         | 
| 7219 | 
            +
            	chkUnknown.onchange = this.onChangeUnknown;
         | 
| 7220 | 
            +
            	var listWrapper = document.createElement("div");
         | 
| 7221 | 
            +
            	markList.parentNode.insertBefore(listWrapper,markList);
         | 
| 7222 | 
            +
            	wizard.setValue("listWrapper",listWrapper);
         | 
| 7223 | 
            +
            	this.refreshOptions(listWrapper,showUnknown == "yes");
         | 
| 7224 | 
            +
            };
         | 
| 7225 | 
            +
             | 
| 7226 | 
            +
            config.macros.options.refreshOptions = function(listWrapper,showUnknown)
         | 
| 7227 | 
            +
            {
         | 
| 7228 | 
            +
            	var opts = [];
         | 
| 7229 | 
            +
            	for(var n in config.options) {
         | 
| 7230 | 
            +
            		var opt = {};
         | 
| 7231 | 
            +
            		opt.option = "";
         | 
| 7232 | 
            +
            		opt.name = n;
         | 
| 7233 | 
            +
            		opt.lowlight = !config.optionsDesc[n];
         | 
| 7234 | 
            +
            		opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
         | 
| 7235 | 
            +
            		if(!opt.lowlight || showUnknown)
         | 
| 7236 | 
            +
            			opts.push(opt);
         | 
| 7237 | 
            +
            	}
         | 
| 7238 | 
            +
            	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);});
         | 
| 7239 | 
            +
            	var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
         | 
| 7240 | 
            +
            	for(n=0; n<opts.length; n++) {
         | 
| 7241 | 
            +
            		var type = opts[n].name.substr(0,3);
         | 
| 7242 | 
            +
            		var h = config.macros.option.types[type];
         | 
| 7243 | 
            +
            		if (h && h.create) {
         | 
| 7244 | 
            +
            			h.create(opts[n].colElements['option'],type,opts[n].name,null,"no");
         | 
| 7245 | 
            +
            		}
         | 
| 7246 | 
            +
            	}
         | 
| 7247 | 
            +
            };
         | 
| 7248 | 
            +
             | 
| 7249 | 
            +
            config.macros.options.onChangeUnknown = function(e)
         | 
| 7250 | 
            +
            {
         | 
| 7251 | 
            +
            	var wizard = new Wizard(this);
         | 
| 7252 | 
            +
            	var listWrapper = wizard.getValue("listWrapper");
         | 
| 7253 | 
            +
            	removeChildren(listWrapper);
         | 
| 7254 | 
            +
            	config.macros.options.refreshOptions(listWrapper,this.checked);
         | 
| 7255 | 
            +
            	return false;
         | 
| 7256 | 
            +
            };
         | 
| 7257 | 
            +
             | 
| 6640 7258 | 
             
            //--
         | 
| 6641 7259 | 
             
            //-- Saving
         | 
| 6642 7260 | 
             
            //--
         | 
| @@ -6765,7 +7383,6 @@ function saveChanges(onlyIfDirty,tiddlers) | |
| 6765 7383 |  | 
| 6766 7384 | 
             
            function saveBackup(localPath,original)
         | 
| 6767 7385 | 
             
            {
         | 
| 6768 | 
            -
            	// Save the backup
         | 
| 6769 7386 | 
             
            	if(config.options.chkSaveBackups) {
         | 
| 6770 7387 | 
             
            		var backupPath = getBackupPath(localPath);
         | 
| 6771 7388 | 
             
            		var backup = config.browser.isIE ? ieCopyFile(backupPath,localPath) : saveFile(backupPath,original);
         | 
| @@ -6852,19 +7469,22 @@ function getLocalPath(origPath) | |
| 6852 7469 | 
             
            	return localPath;
         | 
| 6853 7470 | 
             
            }
         | 
| 6854 7471 |  | 
| 6855 | 
            -
            function getBackupPath(localPath)
         | 
| 7472 | 
            +
            function getBackupPath(localPath,title,extension)
         | 
| 6856 7473 | 
             
            {
         | 
| 6857 | 
            -
            	var  | 
| 7474 | 
            +
            	var slash = "\\";
         | 
| 6858 7475 | 
             
            	var dirPathPos = localPath.lastIndexOf("\\");
         | 
| 6859 7476 | 
             
            	if(dirPathPos == -1) {
         | 
| 6860 7477 | 
             
            		dirPathPos = localPath.lastIndexOf("/");
         | 
| 6861 | 
            -
            		 | 
| 7478 | 
            +
            		slash = "/";
         | 
| 6862 7479 | 
             
            	}
         | 
| 6863 7480 | 
             
            	var backupFolder = config.options.txtBackupFolder;
         | 
| 6864 7481 | 
             
            	if(!backupFolder || backupFolder == "")
         | 
| 6865 7482 | 
             
            		backupFolder = ".";
         | 
| 6866 | 
            -
            	var backupPath = localPath.substr(0,dirPathPos) +  | 
| 6867 | 
            -
            	backupPath = backupPath.substr(0,backupPath.lastIndexOf(".")) + "." | 
| 7483 | 
            +
            	var backupPath = localPath.substr(0,dirPathPos) + slash + backupFolder + localPath.substr(dirPathPos);
         | 
| 7484 | 
            +
            	backupPath = backupPath.substr(0,backupPath.lastIndexOf(".")) + ".";
         | 
| 7485 | 
            +
            	if(title)
         | 
| 7486 | 
            +
            		backupPath += title.replace(/[\\\/\*\?\":<> ]/g,"_") + ".";
         | 
| 7487 | 
            +
            	backupPath += (new Date()).convertToYYYYMMDDHHMMSSMMM() + "." + (extension ? extension : "html");
         | 
| 6868 7488 | 
             
            	return backupPath;
         | 
| 6869 7489 | 
             
            }
         | 
| 6870 7490 |  | 
| @@ -6890,8 +7510,9 @@ function generateRss() | |
| 6890 7510 | 
             
            	// The body
         | 
| 6891 7511 | 
             
            	var tiddlers = store.getTiddlers("modified","excludeLists");
         | 
| 6892 7512 | 
             
            	var n = config.numRssItems > tiddlers.length ? 0 : tiddlers.length-config.numRssItems;
         | 
| 6893 | 
            -
            	for (var t=tiddlers.length-1; t>=n; t--)
         | 
| 6894 | 
            -
            		s.push(tiddlers[t]. | 
| 7513 | 
            +
            	for (var t=tiddlers.length-1; t>=n; t--) {
         | 
| 7514 | 
            +
            		s.push("<item>\n" + tiddlers[t].toRssItem(u) + "\n</item>");
         | 
| 7515 | 
            +
            	}
         | 
| 6895 7516 | 
             
            	// And footer
         | 
| 6896 7517 | 
             
            	s.push("</channel>");
         | 
| 6897 7518 | 
             
            	s.push("</rss>");
         | 
| @@ -6905,10 +7526,7 @@ function generateRss() | |
| 6905 7526 |  | 
| 6906 7527 | 
             
            function convertUTF8ToUnicode(u)
         | 
| 6907 7528 | 
             
            {
         | 
| 6908 | 
            -
            	 | 
| 6909 | 
            -
            		return manualConvertUTF8ToUnicode(u);
         | 
| 6910 | 
            -
            	else
         | 
| 6911 | 
            -
            		return mozConvertUTF8ToUnicode(u);
         | 
| 7529 | 
            +
            	return window.netscape == undefined ? manualConvertUTF8ToUnicode(u) : mozConvertUTF8ToUnicode(u);
         | 
| 6912 7530 | 
             
            }
         | 
| 6913 7531 |  | 
| 6914 7532 | 
             
            function manualConvertUTF8ToUnicode(utf)
         | 
| @@ -6975,10 +7593,7 @@ function mozConvertUnicodeToUTF8(s) | |
| 6975 7593 | 
             
            	} // fallback
         | 
| 6976 7594 | 
             
            	var u = converter.ConvertFromUnicode(s);
         | 
| 6977 7595 | 
             
            	var fin = converter.Finish();
         | 
| 6978 | 
            -
            	 | 
| 6979 | 
            -
            		return u + fin;
         | 
| 6980 | 
            -
            	else
         | 
| 6981 | 
            -
            		return u;
         | 
| 7596 | 
            +
            	return fin.length > 0 ? u + fin : u;
         | 
| 6982 7597 | 
             
            }
         | 
| 6983 7598 |  | 
| 6984 7599 | 
             
            function convertUriToUTF8(uri,charSet)
         | 
| @@ -6996,9 +7611,7 @@ function convertUriToUTF8(uri,charSet) | |
| 6996 7611 |  | 
| 6997 7612 | 
             
            function saveFile(fileUrl,content)
         | 
| 6998 7613 | 
             
            {
         | 
| 6999 | 
            -
            	var r =  | 
| 7000 | 
            -
            	if(!r)
         | 
| 7001 | 
            -
            		r = mozillaSaveFile(fileUrl,content);
         | 
| 7614 | 
            +
            	var r = mozillaSaveFile(fileUrl,content);
         | 
| 7002 7615 | 
             
            	if(!r)
         | 
| 7003 7616 | 
             
            		r = ieSaveFile(fileUrl,content);
         | 
| 7004 7617 | 
             
            	if(!r)
         | 
| @@ -7008,9 +7621,7 @@ function saveFile(fileUrl,content) | |
| 7008 7621 |  | 
| 7009 7622 | 
             
            function loadFile(fileUrl)
         | 
| 7010 7623 | 
             
            {
         | 
| 7011 | 
            -
            	var r =  | 
| 7012 | 
            -
            	if((r == null) || (r == false))
         | 
| 7013 | 
            -
            		r = mozillaLoadFile(fileUrl);
         | 
| 7624 | 
            +
            	var r = mozillaLoadFile(fileUrl);
         | 
| 7014 7625 | 
             
            	if((r == null) || (r == false))
         | 
| 7015 7626 | 
             
            		r = ieLoadFile(fileUrl);
         | 
| 7016 7627 | 
             
            	if((r == null) || (r == false))
         | 
| @@ -7018,9 +7629,39 @@ function loadFile(fileUrl) | |
| 7018 7629 | 
             
            	return r;
         | 
| 7019 7630 | 
             
            }
         | 
| 7020 7631 |  | 
| 7632 | 
            +
            function ieCreatePath(path)
         | 
| 7633 | 
            +
            {
         | 
| 7634 | 
            +
            	try {
         | 
| 7635 | 
            +
            		var fso = new ActiveXObject("Scripting.FileSystemObject");
         | 
| 7636 | 
            +
            	} catch(ex) {
         | 
| 7637 | 
            +
            		return null;
         | 
| 7638 | 
            +
            	}
         | 
| 7639 | 
            +
             | 
| 7640 | 
            +
            	var pos = path.lastIndexOf("\\");
         | 
| 7641 | 
            +
            	if(pos!=-1)
         | 
| 7642 | 
            +
            		path = path.substring(0, pos+1);
         | 
| 7643 | 
            +
             | 
| 7644 | 
            +
            	var scan = [];
         | 
| 7645 | 
            +
            	scan.push(path);
         | 
| 7646 | 
            +
            	var i = 0;
         | 
| 7647 | 
            +
            	do {
         | 
| 7648 | 
            +
            		var parent = fso.GetParentFolderName(scan[i++]);
         | 
| 7649 | 
            +
            		if (fso.FolderExists(parent))
         | 
| 7650 | 
            +
            			break;
         | 
| 7651 | 
            +
            		scan.push(parent);
         | 
| 7652 | 
            +
            	} while(true);
         | 
| 7653 | 
            +
             | 
| 7654 | 
            +
            	for(i=scan.length-1;i>=0;i--) {
         | 
| 7655 | 
            +
            		if (!fso.FolderExists(scan[i]))
         | 
| 7656 | 
            +
            			fso.CreateFolder(scan[i]);
         | 
| 7657 | 
            +
            	}
         | 
| 7658 | 
            +
            	return true;
         | 
| 7659 | 
            +
            }
         | 
| 7660 | 
            +
             | 
| 7021 7661 | 
             
            // Returns null if it can't do it, false if there's an error, true if it saved OK
         | 
| 7022 7662 | 
             
            function ieSaveFile(filePath,content)
         | 
| 7023 7663 | 
             
            {
         | 
| 7664 | 
            +
            	ieCreatePath(filePath);
         | 
| 7024 7665 | 
             
            	try {
         | 
| 7025 7666 | 
             
            		var fso = new ActiveXObject("Scripting.FileSystemObject");
         | 
| 7026 7667 | 
             
            	} catch(ex) {
         | 
| @@ -7048,6 +7689,7 @@ function ieLoadFile(filePath) | |
| 7048 7689 |  | 
| 7049 7690 | 
             
            function ieCopyFile(dest,source)
         | 
| 7050 7691 | 
             
            {
         | 
| 7692 | 
            +
            	ieCreatePath(dest);
         | 
| 7051 7693 | 
             
            	try {
         | 
| 7052 7694 | 
             
            		var fso = new ActiveXObject("Scripting.FileSystemObject");
         | 
| 7053 7695 | 
             
            		fso.GetFile(source).Copy(dest);
         | 
| @@ -7151,7 +7793,7 @@ function javaLoadFile(filePath) | |
| 7151 7793 | 
             
            }
         | 
| 7152 7794 |  | 
| 7153 7795 | 
             
            //--
         | 
| 7154 | 
            -
            //-- Server adaptor for talking to static files
         | 
| 7796 | 
            +
            //-- Server adaptor for talking to static TiddlyWiki files
         | 
| 7155 7797 | 
             
            //--
         | 
| 7156 7798 |  | 
| 7157 7799 | 
             
            function FileAdaptor()
         | 
| @@ -7161,78 +7803,116 @@ function FileAdaptor() | |
| 7161 7803 | 
             
            	return this;
         | 
| 7162 7804 | 
             
            }
         | 
| 7163 7805 |  | 
| 7164 | 
            -
            FileAdaptor.NotLoadedError = "TiddlyWiki file has not been loaded";
         | 
| 7165 7806 | 
             
            FileAdaptor.serverType = 'file';
         | 
| 7166 7807 |  | 
| 7167 | 
            -
             | 
| 7808 | 
            +
            FileAdaptor.prototype.setContext = function(context,userParams,callback)
         | 
| 7809 | 
            +
            {
         | 
| 7810 | 
            +
            	if(!context) context = {};
         | 
| 7811 | 
            +
            	context.userParams = userParams;
         | 
| 7812 | 
            +
            	if(callback) context.callback = callback;
         | 
| 7813 | 
            +
            	context.adaptor = this;
         | 
| 7814 | 
            +
            	if(!context.host)
         | 
| 7815 | 
            +
            		context.host = this.host;
         | 
| 7816 | 
            +
            	context.host = FileAdaptor.fullHostName(context.host);
         | 
| 7817 | 
            +
            	if(!context.workspace)
         | 
| 7818 | 
            +
            		context.workspace = this.workspace;
         | 
| 7819 | 
            +
            	return context;
         | 
| 7820 | 
            +
            };
         | 
| 7821 | 
            +
             | 
| 7822 | 
            +
            FileAdaptor.fullHostName = function(host)
         | 
| 7823 | 
            +
            {
         | 
| 7824 | 
            +
            	if(!host)
         | 
| 7825 | 
            +
            		return '';
         | 
| 7826 | 
            +
            	if(!host.match(/:\/\//))
         | 
| 7827 | 
            +
            		host = 'http://' + host;
         | 
| 7828 | 
            +
            	return host;
         | 
| 7829 | 
            +
            };
         | 
| 7830 | 
            +
             | 
| 7831 | 
            +
            FileAdaptor.minHostName = function(host)
         | 
| 7832 | 
            +
            {
         | 
| 7833 | 
            +
            	return host ? host.replace(/^http:\/\//,'').replace(/\/$/,'') : '';
         | 
| 7834 | 
            +
            };
         | 
| 7835 | 
            +
             | 
| 7836 | 
            +
            // Open the specified host
         | 
| 7168 7837 | 
             
            FileAdaptor.prototype.openHost = function(host,context,userParams,callback)
         | 
| 7169 7838 | 
             
            {
         | 
| 7170 7839 | 
             
            	this.host = host;
         | 
| 7171 | 
            -
            	 | 
| 7172 | 
            -
             | 
| 7173 | 
            -
            	 | 
| 7174 | 
            -
             | 
| 7175 | 
            -
            	 | 
| 7176 | 
            -
            	var ret = loadRemoteFile(host,FileAdaptor.openHostCallback,context);
         | 
| 7177 | 
            -
            	return typeof(ret) == "string" ? ret : true;
         | 
| 7840 | 
            +
            	context = this.setContext(context,userParams,callback);
         | 
| 7841 | 
            +
            	context.status = true;
         | 
| 7842 | 
            +
            	if(callback)
         | 
| 7843 | 
            +
            		window.setTimeout(function() {callback(context,userParams);},10);
         | 
| 7844 | 
            +
            	return true;
         | 
| 7178 7845 | 
             
            };
         | 
| 7179 7846 |  | 
| 7180 | 
            -
            FileAdaptor. | 
| 7847 | 
            +
            FileAdaptor.loadTiddlyWikiCallback = function(status,context,responseText,url,xhr)
         | 
| 7181 7848 | 
             
            {
         | 
| 7182 | 
            -
            	var adaptor = context.adaptor;
         | 
| 7183 7849 | 
             
            	context.status = status;
         | 
| 7184 7850 | 
             
            	if(!status) {
         | 
| 7185 7851 | 
             
            		context.statusText = "Error reading file: " + xhr.statusText;
         | 
| 7186 7852 | 
             
            	} else {
         | 
| 7187 | 
            -
            		 | 
| 7188 | 
            -
            		adaptor.store | 
| 7189 | 
            -
            		if(!adaptor.store.importTiddlyWiki(responseText))
         | 
| 7853 | 
            +
            		context.adaptor.store = new TiddlyWiki();
         | 
| 7854 | 
            +
            		if(!context.adaptor.store.importTiddlyWiki(responseText))
         | 
| 7190 7855 | 
             
            			context.statusText = config.messages.invalidFileError.format([url]);
         | 
| 7191 7856 | 
             
            	}
         | 
| 7192 | 
            -
            	context. | 
| 7857 | 
            +
            	context.complete(context,context.userParams);
         | 
| 7193 7858 | 
             
            };
         | 
| 7194 7859 |  | 
| 7195 | 
            -
            //  | 
| 7860 | 
            +
            // Get the list of workspaces on a given server
         | 
| 7196 7861 | 
             
            FileAdaptor.prototype.getWorkspaceList = function(context,userParams,callback)
         | 
| 7197 7862 | 
             
            {
         | 
| 7198 | 
            -
            	 | 
| 7199 | 
            -
            		context = {};
         | 
| 7863 | 
            +
            	context = this.setContext(context,userParams,callback);
         | 
| 7200 7864 | 
             
            	context.workspaces = [{title:"(default)"}];
         | 
| 7201 7865 | 
             
            	context.status = true;
         | 
| 7202 | 
            -
            	 | 
| 7866 | 
            +
            	if(callback)
         | 
| 7867 | 
            +
            		window.setTimeout(function() {callback(context,userParams);},10);
         | 
| 7203 7868 | 
             
            	return true;
         | 
| 7204 7869 | 
             
            };
         | 
| 7205 7870 |  | 
| 7206 7871 | 
             
            // Open the specified workspace
         | 
| 7207 7872 | 
             
            FileAdaptor.prototype.openWorkspace = function(workspace,context,userParams,callback)
         | 
| 7208 7873 | 
             
            {
         | 
| 7209 | 
            -
            	 | 
| 7210 | 
            -
             | 
| 7874 | 
            +
            	this.workspace = workspace;
         | 
| 7875 | 
            +
            	context = this.setContext(context,userParams,callback);
         | 
| 7211 7876 | 
             
            	context.status = true;
         | 
| 7212 | 
            -
            	 | 
| 7877 | 
            +
            	if(callback)
         | 
| 7878 | 
            +
            		window.setTimeout(function() {callback(context,userParams);},10);
         | 
| 7213 7879 | 
             
            	return true;
         | 
| 7214 7880 | 
             
            };
         | 
| 7215 7881 |  | 
| 7216 7882 | 
             
            // Gets the list of tiddlers within a given workspace
         | 
| 7217 | 
            -
            FileAdaptor.prototype.getTiddlerList = function(context,userParams,callback)
         | 
| 7218 | 
            -
            {
         | 
| 7219 | 
            -
            	 | 
| 7220 | 
            -
             | 
| 7221 | 
            -
             | 
| 7222 | 
            -
             | 
| 7223 | 
            -
            	 | 
| 7224 | 
            -
             | 
| 7225 | 
            -
             | 
| 7226 | 
            -
            		 | 
| 7227 | 
            -
            		 | 
| 7228 | 
            -
             | 
| 7229 | 
            -
             | 
| 7230 | 
            -
             | 
| 7231 | 
            -
             | 
| 7232 | 
            -
             | 
| 7233 | 
            -
             | 
| 7883 | 
            +
            FileAdaptor.prototype.getTiddlerList = function(context,userParams,callback,filter)
         | 
| 7884 | 
            +
            {
         | 
| 7885 | 
            +
            	context = this.setContext(context,userParams,callback);
         | 
| 7886 | 
            +
            	if(!context.filter)
         | 
| 7887 | 
            +
            		context.filter = filter;
         | 
| 7888 | 
            +
            	context.complete = FileAdaptor.getTiddlerListComplete;
         | 
| 7889 | 
            +
            	if(this.store) {
         | 
| 7890 | 
            +
            		var ret = context.complete(context,context.userParams);
         | 
| 7891 | 
            +
            	} else {
         | 
| 7892 | 
            +
            		ret = loadRemoteFile(context.host,FileAdaptor.loadTiddlyWikiCallback,context);
         | 
| 7893 | 
            +
            		if(typeof ret != "string")
         | 
| 7894 | 
            +
            			ret = true;
         | 
| 7895 | 
            +
            	}
         | 
| 7896 | 
            +
            	return ret;
         | 
| 7897 | 
            +
            };
         | 
| 7898 | 
            +
             | 
| 7899 | 
            +
            FileAdaptor.getTiddlerListComplete = function(context,userParams)
         | 
| 7900 | 
            +
            {
         | 
| 7901 | 
            +
            	if(context.filter) {
         | 
| 7902 | 
            +
            		context.tiddlers = context.adaptor.store.filterTiddlers(context.filter);
         | 
| 7903 | 
            +
            	} else {
         | 
| 7904 | 
            +
            		context.tiddlers = [];
         | 
| 7905 | 
            +
            		context.adaptor.store.forEachTiddler(function(title,tiddler) {context.tiddlers.push(tiddler);});
         | 
| 7906 | 
            +
            	}
         | 
| 7907 | 
            +
            	for(var i=0; i<context.tiddlers.length; i++) {
         | 
| 7908 | 
            +
            		context.tiddlers[i].fields['server.type'] = FileAdaptor.serverType;
         | 
| 7909 | 
            +
            		context.tiddlers[i].fields['server.host'] = FileAdaptor.minHostName(context.host);
         | 
| 7910 | 
            +
            		context.tiddlers[i].fields['server.page.revision'] = context.tiddlers[i].modified.convertToYYYYMMDDHHMM();
         | 
| 7911 | 
            +
            	}
         | 
| 7234 7912 | 
             
            	context.status = true;
         | 
| 7235 | 
            -
            	 | 
| 7913 | 
            +
            	if(context.callback) {
         | 
| 7914 | 
            +
            		window.setTimeout(function() {context.callback(context,userParams);},10);
         | 
| 7915 | 
            +
            	}
         | 
| 7236 7916 | 
             
            	return true;
         | 
| 7237 7917 | 
             
            };
         | 
| 7238 7918 |  | 
| @@ -7243,23 +7923,28 @@ FileAdaptor.prototype.generateTiddlerInfo = function(tiddler) | |
| 7243 7923 | 
             
            	return info;
         | 
| 7244 7924 | 
             
            };
         | 
| 7245 7925 |  | 
| 7246 | 
            -
            //  | 
| 7926 | 
            +
            // Retrieve a tiddler from a given workspace on a given server
         | 
| 7247 7927 | 
             
            FileAdaptor.prototype.getTiddler = function(title,context,userParams,callback)
         | 
| 7248 7928 | 
             
            {
         | 
| 7249 | 
            -
            	 | 
| 7250 | 
            -
             | 
| 7251 | 
            -
            	 | 
| 7252 | 
            -
             | 
| 7253 | 
            -
             | 
| 7254 | 
            -
             | 
| 7255 | 
            -
             | 
| 7256 | 
            -
             | 
| 7257 | 
            -
             | 
| 7258 | 
            -
             | 
| 7929 | 
            +
            	context = this.setContext(context,userParams,callback);
         | 
| 7930 | 
            +
            	context.title = title;
         | 
| 7931 | 
            +
            	context.complete = FileAdaptor.getTiddlerComplete;
         | 
| 7932 | 
            +
            	return context.adaptor.store ? 
         | 
| 7933 | 
            +
            		context.complete(context,context.userParams) :
         | 
| 7934 | 
            +
            		loadRemoteFile(context.host,FileAdaptor.loadTiddlyWikiCallback,context);
         | 
| 7935 | 
            +
            };
         | 
| 7936 | 
            +
             | 
| 7937 | 
            +
            FileAdaptor.getTiddlerComplete = function(context,userParams)
         | 
| 7938 | 
            +
            {
         | 
| 7939 | 
            +
            	var t = context.adaptor.store.fetchTiddler(context.title);
         | 
| 7940 | 
            +
            	t.fields['server.type'] = FileAdaptor.serverType;
         | 
| 7941 | 
            +
            	t.fields['server.host'] = FileAdaptor.minHostName(context.host);
         | 
| 7942 | 
            +
            	t.fields['server.page.revision'] = t.modified.convertToYYYYMMDDHHMM();
         | 
| 7943 | 
            +
            	context.tiddler = t;
         | 
| 7259 7944 | 
             
            	context.status = true;
         | 
| 7260 7945 | 
             
            	if(context.allowSynchronous) {
         | 
| 7261 7946 | 
             
            		context.isSynchronous = true;
         | 
| 7262 | 
            -
            		callback(context,userParams);
         | 
| 7947 | 
            +
            		context.callback(context,userParams);
         | 
| 7263 7948 | 
             
            	} else {
         | 
| 7264 7949 | 
             
            		window.setTimeout(function() {callback(context,userParams);},10);
         | 
| 7265 7950 | 
             
            	}
         | 
| @@ -7288,6 +7973,7 @@ var httpStatus = { | |
| 7288 7973 | 
             
            	OK: 200,
         | 
| 7289 7974 | 
             
            	ContentCreated: 201,
         | 
| 7290 7975 | 
             
            	NoContent: 204,
         | 
| 7976 | 
            +
            	MultiStatus: 207,
         | 
| 7291 7977 | 
             
            	Unauthorized: 401,
         | 
| 7292 7978 | 
             
            	Forbidden: 403,
         | 
| 7293 7979 | 
             
            	NotFound: 404,
         | 
| @@ -7296,14 +7982,17 @@ var httpStatus = { | |
| 7296 7982 |  | 
| 7297 7983 | 
             
            function doHttp(type,url,data,contentType,username,password,callback,params,headers)
         | 
| 7298 7984 | 
             
            {
         | 
| 7299 | 
            -
            	// Get an xhr object
         | 
| 7300 7985 | 
             
            	var x = getXMLHttpRequest();
         | 
| 7301 7986 | 
             
            	if(!x)
         | 
| 7302 7987 | 
             
            		return "Can't create XMLHttpRequest object";
         | 
| 7303 | 
            -
            	// Install callback
         | 
| 7304 7988 | 
             
            	x.onreadystatechange = function() {
         | 
| 7305 | 
            -
            		 | 
| 7306 | 
            -
            			 | 
| 7989 | 
            +
            		try {
         | 
| 7990 | 
            +
            			var status = x.status;
         | 
| 7991 | 
            +
            		} catch(ex) {
         | 
| 7992 | 
            +
            			status = false;
         | 
| 7993 | 
            +
            		}
         | 
| 7994 | 
            +
            		if (x.readyState == 4 && callback && (status !== undefined)) {
         | 
| 7995 | 
            +
            			if([0, httpStatus.OK, httpStatus.ContentCreated, httpStatus.NoContent, httpStatus.MultiStatus].contains(status))
         | 
| 7307 7996 | 
             
            				callback(true,params,x.responseText,url,x);
         | 
| 7308 7997 | 
             
            			else
         | 
| 7309 7998 | 
             
            				callback(false,params,null,url,x);
         | 
| @@ -7311,23 +8000,22 @@ function doHttp(type,url,data,contentType,username,password,callback,params,head | |
| 7311 8000 | 
             
            			x = null;
         | 
| 7312 8001 | 
             
            		}
         | 
| 7313 8002 | 
             
            	};
         | 
| 7314 | 
            -
            	// Send request
         | 
| 7315 8003 | 
             
            	if(window.Components && window.netscape && window.netscape.security && document.location.protocol.indexOf("http") == -1)
         | 
| 7316 8004 | 
             
            		window.netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
         | 
| 7317 8005 | 
             
            	try {
         | 
| 7318 8006 | 
             
            		url = url + (url.indexOf("?") < 0 ? "?" : "&") + "nocache=" + Math.random();
         | 
| 7319 8007 | 
             
            		x.open(type,url,true,username,password);
         | 
| 7320 | 
            -
            		if | 
| 8008 | 
            +
            		if(data)
         | 
| 7321 8009 | 
             
            			x.setRequestHeader("Content-Type", contentType ? contentType : "application/x-www-form-urlencoded");
         | 
| 7322 | 
            -
            		if | 
| 8010 | 
            +
            		if(x.overrideMimeType)
         | 
| 7323 8011 | 
             
            			x.setRequestHeader("Connection", "close");
         | 
| 7324 8012 | 
             
            		if(headers) {
         | 
| 7325 | 
            -
            			for(n in headers)
         | 
| 8013 | 
            +
            			for(var n in headers)
         | 
| 7326 8014 | 
             
            				x.setRequestHeader(n,headers[n]);
         | 
| 7327 8015 | 
             
            		}
         | 
| 7328 8016 | 
             
            		x.setRequestHeader("X-Requested-With", "TiddlyWiki " + version.major + "." + version.minor + "." + version.revision + (version.beta ? " (beta " + version.beta + ")" : ""));
         | 
| 7329 8017 | 
             
            		x.send(data);
         | 
| 7330 | 
            -
            	} catch | 
| 8018 | 
            +
            	} catch(ex) {
         | 
| 7331 8019 | 
             
            		return exceptionText(ex);
         | 
| 7332 8020 | 
             
            	}
         | 
| 7333 8021 | 
             
            	return x;
         | 
| @@ -7351,34 +8039,36 @@ function getXMLHttpRequest() | |
| 7351 8039 | 
             
            //-- TiddlyWiki-specific utility functions
         | 
| 7352 8040 | 
             
            //--
         | 
| 7353 8041 |  | 
| 7354 | 
            -
            function createTiddlyButton( | 
| 8042 | 
            +
            function createTiddlyButton(parent,text,tooltip,action,className,id,accessKey,attribs)
         | 
| 7355 8043 | 
             
            {
         | 
| 7356 | 
            -
            	var  | 
| 7357 | 
            -
            	if( | 
| 7358 | 
            -
            		 | 
| 7359 | 
            -
            		 | 
| 8044 | 
            +
            	var btn = document.createElement("a");
         | 
| 8045 | 
            +
            	if(action) {
         | 
| 8046 | 
            +
            		btn.onclick = action;
         | 
| 8047 | 
            +
            		btn.setAttribute("href","javascript:;");
         | 
| 7360 8048 | 
             
            	}
         | 
| 7361 | 
            -
            	if( | 
| 7362 | 
            -
            		 | 
| 7363 | 
            -
            	if( | 
| 7364 | 
            -
            		 | 
| 7365 | 
            -
            	 | 
| 7366 | 
            -
             | 
| 7367 | 
            -
             | 
| 7368 | 
            -
             | 
| 7369 | 
            -
             | 
| 7370 | 
            -
             | 
| 7371 | 
            -
             | 
| 7372 | 
            -
             | 
| 7373 | 
            -
            	if( | 
| 7374 | 
            -
            		 | 
| 7375 | 
            -
            	 | 
| 8049 | 
            +
            	if(tooltip)
         | 
| 8050 | 
            +
            		btn.setAttribute("title",tooltip);
         | 
| 8051 | 
            +
            	if(text)
         | 
| 8052 | 
            +
            		btn.appendChild(document.createTextNode(text));
         | 
| 8053 | 
            +
            	btn.className = className ? className : "button";
         | 
| 8054 | 
            +
            	if(id)
         | 
| 8055 | 
            +
            		btn.id = id;
         | 
| 8056 | 
            +
            	if(attribs) {
         | 
| 8057 | 
            +
            		for(var n in attribs) {
         | 
| 8058 | 
            +
            			btn.setAttribute(n,attribs[n]);
         | 
| 8059 | 
            +
            		}
         | 
| 8060 | 
            +
            	}
         | 
| 8061 | 
            +
            	if(parent)
         | 
| 8062 | 
            +
            		parent.appendChild(btn);
         | 
| 8063 | 
            +
            	if(accessKey)
         | 
| 8064 | 
            +
            		btn.setAttribute("accessKey",accessKey);
         | 
| 8065 | 
            +
            	return btn;
         | 
| 7376 8066 | 
             
            }
         | 
| 7377 8067 |  | 
| 7378 | 
            -
            function createTiddlyLink(place,title,includeText, | 
| 8068 | 
            +
            function createTiddlyLink(place,title,includeText,className,isStatic,linkedFromTiddler,noToggle)
         | 
| 7379 8069 | 
             
            {
         | 
| 7380 8070 | 
             
            	var text = includeText ? title : null;
         | 
| 7381 | 
            -
            	var i = getTiddlyLinkInfo(title, | 
| 8071 | 
            +
            	var i = getTiddlyLinkInfo(title,className);
         | 
| 7382 8072 | 
             
            	var btn = isStatic ? createExternalLink(place,store.getTiddlerText("SiteUrl",null) + "#" + title) : createTiddlyButton(place,text,i.subTitle,onClickTiddlerLink,i.classes);
         | 
| 7383 8073 | 
             
            	btn.setAttribute("refresh","link");
         | 
| 7384 8074 | 
             
            	btn.setAttribute("tiddlyLink",title);
         | 
| @@ -7421,47 +8111,51 @@ function getTiddlyLinkInfo(title,currClasses) | |
| 7421 8111 | 
             
            			classes.remove("shadow");
         | 
| 7422 8112 | 
             
            		}
         | 
| 7423 8113 | 
             
            	}
         | 
| 7424 | 
            -
            	if(config.annotations[title])
         | 
| 8114 | 
            +
            	if(typeof config.annotations[title]=="string")
         | 
| 7425 8115 | 
             
            		subTitle = config.annotations[title];
         | 
| 7426 8116 | 
             
            	return {classes: classes.join(" "),subTitle: subTitle};
         | 
| 7427 8117 | 
             
            }
         | 
| 7428 8118 |  | 
| 7429 8119 | 
             
            function createExternalLink(place,url)
         | 
| 7430 8120 | 
             
            {
         | 
| 7431 | 
            -
            	var  | 
| 7432 | 
            -
            	 | 
| 7433 | 
            -
            	 | 
| 7434 | 
            -
            	 | 
| 8121 | 
            +
            	var link = document.createElement("a");
         | 
| 8122 | 
            +
            	link.className = "externalLink";
         | 
| 8123 | 
            +
            	link.href = url;
         | 
| 8124 | 
            +
            	link.title = config.messages.externalLinkTooltip.format([url]);
         | 
| 7435 8125 | 
             
            	if(config.options.chkOpenInNewWindow)
         | 
| 7436 | 
            -
            		 | 
| 7437 | 
            -
            	place.appendChild( | 
| 7438 | 
            -
            	return  | 
| 8126 | 
            +
            		link.target = "_blank";
         | 
| 8127 | 
            +
            	place.appendChild(link);
         | 
| 8128 | 
            +
            	return link;
         | 
| 7439 8129 | 
             
            }
         | 
| 7440 8130 |  | 
| 7441 8131 | 
             
            // Event handler for clicking on a tiddly link
         | 
| 7442 | 
            -
            function onClickTiddlerLink( | 
| 8132 | 
            +
            function onClickTiddlerLink(ev)
         | 
| 7443 8133 | 
             
            {
         | 
| 7444 | 
            -
            	 | 
| 7445 | 
            -
            	var  | 
| 7446 | 
            -
            	var  | 
| 8134 | 
            +
            	var e = ev ? ev : window.event;
         | 
| 8135 | 
            +
            	var target = resolveTarget(e);
         | 
| 8136 | 
            +
            	var link = target;
         | 
| 7447 8137 | 
             
            	var title = null;
         | 
| 7448 8138 | 
             
            	var fields = null;
         | 
| 7449 8139 | 
             
            	var noToggle = null;
         | 
| 7450 8140 | 
             
            	do {
         | 
| 7451 | 
            -
            		title =  | 
| 7452 | 
            -
            		fields =  | 
| 7453 | 
            -
            		noToggle =  | 
| 7454 | 
            -
            		 | 
| 7455 | 
            -
            	} while(title == null &&  | 
| 7456 | 
            -
            	if(! | 
| 7457 | 
            -
            		 | 
| 8141 | 
            +
            		title = link.getAttribute("tiddlyLink");
         | 
| 8142 | 
            +
            		fields = link.getAttribute("tiddlyFields");
         | 
| 8143 | 
            +
            		noToggle = link.getAttribute("noToggle");
         | 
| 8144 | 
            +
            		link = link.parentNode;
         | 
| 8145 | 
            +
            	} while(title == null && link != null);
         | 
| 8146 | 
            +
            	if(!store.isShadowTiddler(title)) {
         | 
| 8147 | 
            +
            		var f = fields ? fields.decodeHashMap() : {};
         | 
| 8148 | 
            +
            		fields = String.encodeHashMap(merge(f,config.defaultCustomFields,true));
         | 
| 8149 | 
            +
            	}
         | 
| 7458 8150 | 
             
            	if(title) {
         | 
| 7459 8151 | 
             
            		var toggling = e.metaKey || e.ctrlKey;
         | 
| 7460 8152 | 
             
            		if(config.options.chkToggleLinks)
         | 
| 7461 8153 | 
             
            			toggling = !toggling;
         | 
| 7462 8154 | 
             
            		if(noToggle)
         | 
| 7463 8155 | 
             
            			toggling = false;
         | 
| 7464 | 
            -
            		 | 
| 8156 | 
            +
            		if(store.getTiddler(title))
         | 
| 8157 | 
            +
            			fields = null;
         | 
| 8158 | 
            +
            		story.displayTiddler(target,title,null,true,null,fields,toggling);
         | 
| 7465 8159 | 
             
            	}
         | 
| 7466 8160 | 
             
            	clearMessage();
         | 
| 7467 8161 | 
             
            	return false;
         | 
| @@ -7470,18 +8164,17 @@ function onClickTiddlerLink(e) | |
| 7470 8164 | 
             
            // Create a button for a tag with a popup listing all the tiddlers that it tags
         | 
| 7471 8165 | 
             
            function createTagButton(place,tag,excludeTiddler)
         | 
| 7472 8166 | 
             
            {
         | 
| 7473 | 
            -
            	var  | 
| 7474 | 
            -
            	 | 
| 8167 | 
            +
            	var btn = createTiddlyButton(place,tag,config.views.wikified.tag.tooltip.format([tag]),onClickTag);
         | 
| 8168 | 
            +
            	btn.setAttribute("tag",tag);
         | 
| 7475 8169 | 
             
            	if(excludeTiddler)
         | 
| 7476 | 
            -
            		 | 
| 7477 | 
            -
            	return  | 
| 8170 | 
            +
            		btn.setAttribute("tiddler",excludeTiddler);
         | 
| 8171 | 
            +
            	return btn;
         | 
| 7478 8172 | 
             
            }
         | 
| 7479 8173 |  | 
| 7480 8174 | 
             
            // Event handler for clicking on a tiddler tag
         | 
| 7481 | 
            -
            function onClickTag( | 
| 8175 | 
            +
            function onClickTag(ev)
         | 
| 7482 8176 | 
             
            {
         | 
| 7483 | 
            -
            	 | 
| 7484 | 
            -
            	var theTarget = resolveTarget(e);
         | 
| 8177 | 
            +
            	var e = ev ? ev : window.event;
         | 
| 7485 8178 | 
             
            	var popup = Popup.create(this);
         | 
| 7486 8179 | 
             
            	var tag = this.getAttribute("tag");
         | 
| 7487 8180 | 
             
            	var title = this.getAttribute("tiddler");
         | 
| @@ -7515,21 +8208,18 @@ function onClickTag(e) | |
| 7515 8208 | 
             
            }
         | 
| 7516 8209 |  | 
| 7517 8210 | 
             
            // Event handler for 'open all' on a tiddler popup
         | 
| 7518 | 
            -
            function onClickTagOpenAll( | 
| 8211 | 
            +
            function onClickTagOpenAll(ev)
         | 
| 7519 8212 | 
             
            {
         | 
| 7520 | 
            -
            	 | 
| 8213 | 
            +
            	var e = ev ? ev : window.event;
         | 
| 7521 8214 | 
             
            	var tag = this.getAttribute("tag");
         | 
| 7522 8215 | 
             
            	var tagged = store.getTaggedTiddlers(tag);
         | 
| 7523 | 
            -
            	 | 
| 7524 | 
            -
            	for(var t=0; t<tagged.length; t++)
         | 
| 7525 | 
            -
            		titles.push(tagged[t].title);
         | 
| 7526 | 
            -
            	story.displayTiddlers(this,titles);
         | 
| 8216 | 
            +
            	story.displayTiddlers(this,tagged);
         | 
| 7527 8217 | 
             
            	return false;
         | 
| 7528 8218 | 
             
            }
         | 
| 7529 8219 |  | 
| 7530 | 
            -
            function onClickError( | 
| 8220 | 
            +
            function onClickError(ev)
         | 
| 7531 8221 | 
             
            {
         | 
| 7532 | 
            -
            	 | 
| 8222 | 
            +
            	var e = ev ? ev : window.event;
         | 
| 7533 8223 | 
             
            	var popup = Popup.create(this);
         | 
| 7534 8224 | 
             
            	var lines = this.getAttribute("errorText").split("\n");
         | 
| 7535 8225 | 
             
            	for(var t=0; t<lines.length; t++)
         | 
| @@ -7564,9 +8254,9 @@ function createTiddlyPopup(place,caption,tooltip,tiddler) | |
| 7564 8254 | 
             
            	}
         | 
| 7565 8255 | 
             
            }
         | 
| 7566 8256 |  | 
| 7567 | 
            -
            function onClickTiddlyPopup( | 
| 8257 | 
            +
            function onClickTiddlyPopup(ev)
         | 
| 7568 8258 | 
             
            {
         | 
| 7569 | 
            -
            	 | 
| 8259 | 
            +
            	var e = ev ? ev : window.event;
         | 
| 7570 8260 | 
             
            	var tiddler = this.tiddler;
         | 
| 7571 8261 | 
             
            	if(tiddler.text) {
         | 
| 7572 8262 | 
             
            		var popup = Popup.create(this,"div","popupTiddler");
         | 
| @@ -7626,6 +8316,8 @@ function glyph(name) | |
| 7626 8316 | 
             
            		return "";
         | 
| 7627 8317 | 
             
            	return g.codes[name][b];
         | 
| 7628 8318 | 
             
            }
         | 
| 8319 | 
            +
             | 
| 8320 | 
            +
             | 
| 7629 8321 | 
             
            //-
         | 
| 7630 8322 | 
             
            //- Animation engine
         | 
| 7631 8323 | 
             
            //-
         | 
| @@ -7639,7 +8331,7 @@ function Animator() | |
| 7639 8331 | 
             
            }
         | 
| 7640 8332 |  | 
| 7641 8333 | 
             
            // Start animation engine
         | 
| 7642 | 
            -
            Animator.prototype.startAnimating = function()  | 
| 8334 | 
            +
            Animator.prototype.startAnimating = function() //# Variable number of arguments
         | 
| 7643 8335 | 
             
            {
         | 
| 7644 8336 | 
             
            	for(var t=0; t<arguments.length; t++)
         | 
| 7645 8337 | 
             
            		this.animations.push(arguments[t]);
         | 
| @@ -7666,7 +8358,6 @@ Animator.prototype.doAnimate = function(me) | |
| 7666 8358 | 
             
            	}
         | 
| 7667 8359 | 
             
            };
         | 
| 7668 8360 |  | 
| 7669 | 
            -
            // Map a 0..1 value to 0..1, but slow down at the start and end
         | 
| 7670 8361 | 
             
            Animator.slowInSlowOut = function(progress)
         | 
| 7671 8362 | 
             
            {
         | 
| 7672 8363 | 
             
            	return(1-((Math.cos(progress * Math.PI)+1)/2));
         | 
| @@ -7829,10 +8520,9 @@ Popup.create = function(root,elem,theClass) | |
| 7829 8520 | 
             
            	return popup;
         | 
| 7830 8521 | 
             
            };
         | 
| 7831 8522 |  | 
| 7832 | 
            -
            Popup.onDocumentClick = function( | 
| 8523 | 
            +
            Popup.onDocumentClick = function(ev)
         | 
| 7833 8524 | 
             
            {
         | 
| 7834 | 
            -
            	 | 
| 7835 | 
            -
            	var target = resolveTarget(e);
         | 
| 8525 | 
            +
            	var e = ev ? ev : window.event;
         | 
| 7836 8526 | 
             
            	if(e.eventPhase == undefined)
         | 
| 7837 8527 | 
             
            		Popup.remove();
         | 
| 7838 8528 | 
             
            	else if(e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET)
         | 
| @@ -7868,7 +8558,7 @@ Popup.place = function(root,popup,offset) | |
| 7868 8558 | 
             
            	popup.style.left = popupLeft + "px";
         | 
| 7869 8559 | 
             
            	popup.style.top = popupTop + "px";
         | 
| 7870 8560 | 
             
            	popup.style.display = "block";
         | 
| 7871 | 
            -
            }
         | 
| 8561 | 
            +
            };
         | 
| 7872 8562 |  | 
| 7873 8563 | 
             
            Popup.remove = function()
         | 
| 7874 8564 | 
             
            {
         | 
| @@ -8309,7 +8999,15 @@ Array.prototype.remove = function(item) | |
| 8309 8999 | 
             
            		this.splice(p,1);
         | 
| 8310 9000 | 
             
            };
         | 
| 8311 9001 |  | 
| 8312 | 
            -
             | 
| 9002 | 
            +
            if(!Array.prototype.map){
         | 
| 9003 | 
            +
            Array.prototype.map = function(fn, thisObj) {
         | 
| 9004 | 
            +
                var scope = thisObj || window;
         | 
| 9005 | 
            +
                var a = [];
         | 
| 9006 | 
            +
                for ( var i=0, j=this.length; i < j; ++i ) {
         | 
| 9007 | 
            +
                    a.push(fn.call(scope, this[i], i, this));
         | 
| 9008 | 
            +
                }
         | 
| 9009 | 
            +
                return a;
         | 
| 9010 | 
            +
            };}// Get characters from the right end of a string
         | 
| 8313 9011 | 
             
            String.prototype.right = function(n)
         | 
| 8314 9012 | 
             
            {
         | 
| 8315 9013 | 
             
            	return n < this.length ? this.slice(this.length-n) : this;
         | 
| @@ -8498,13 +9196,15 @@ String.prototype.readBracketedList = function(unique) | |
| 8498 9196 | 
             
            {
         | 
| 8499 9197 | 
             
            	var p = this.parseParams("list",null,false,true);
         | 
| 8500 9198 | 
             
            	var n = [];
         | 
| 8501 | 
            -
            	for(var t=1; t<p.length; t++)
         | 
| 8502 | 
            -
            		 | 
| 9199 | 
            +
            	for(var t=1; t<p.length; t++) {
         | 
| 9200 | 
            +
            		if(p[t].value)
         | 
| 9201 | 
            +
            			n.pushUnique(p[t].value,unique);
         | 
| 9202 | 
            +
            	}
         | 
| 8503 9203 | 
             
            	return n;
         | 
| 8504 9204 | 
             
            };
         | 
| 8505 9205 |  | 
| 8506 9206 | 
             
            // Returns array with start and end index of chunk between given start and end marker, or undefined.
         | 
| 8507 | 
            -
            String.prototype.getChunkRange = function(start,end) | 
| 9207 | 
            +
            String.prototype.getChunkRange = function(start,end)
         | 
| 8508 9208 | 
             
            {
         | 
| 8509 9209 | 
             
            	var s = this.indexOf(start);
         | 
| 8510 9210 | 
             
            	if(s != -1) {
         | 
| @@ -8578,7 +9278,7 @@ String.zeroPad = function(n,d) | |
| 8578 9278 | 
             
            	return s;
         | 
| 8579 9279 | 
             
            };
         | 
| 8580 9280 |  | 
| 8581 | 
            -
            String.prototype.startsWith = function(prefix) | 
| 9281 | 
            +
            String.prototype.startsWith = function(prefix)
         | 
| 8582 9282 | 
             
            {
         | 
| 8583 9283 | 
             
            	return !prefix || this.substring(0,prefix.length) == prefix;
         | 
| 8584 9284 | 
             
            };
         | 
| @@ -8635,7 +9335,7 @@ Date.prototype.getWeek = function() | |
| 8635 9335 | 
             
            	var d = dt.getDay();
         | 
| 8636 9336 | 
             
            	if (d==0) d=7;// JavaScript Sun=0, ISO Sun=7
         | 
| 8637 9337 | 
             
            	dt.setTime(dt.getTime()+(4-d)*86400000);// shift day to Thurs of same week to calculate weekNo
         | 
| 8638 | 
            -
            	var n = Math.floor((dt.getTime()-new Date(dt.getFullYear(),0,1)+3600000)/86400000); | 
| 9338 | 
            +
            	var n = Math.floor((dt.getTime()-new Date(dt.getFullYear(),0,1)+3600000)/86400000);
         | 
| 8639 9339 | 
             
            	return Math.floor(n/7)+1;
         | 
| 8640 9340 | 
             
            };
         | 
| 8641 9341 |  | 
| @@ -8692,143 +9392,6 @@ Date.convertFromYYYYMMDDHHMM = function(d) | |
| 8692 9392 | 
             
            			parseInt(d.substr(10,2),10),0,0));
         | 
| 8693 9393 | 
             
            };
         | 
| 8694 9394 |  | 
| 8695 | 
            -
            //--
         | 
| 8696 | 
            -
            //-- Crypto functions and associated conversion routines
         | 
| 8697 | 
            -
            //--
         | 
| 8698 | 
            -
             | 
| 8699 | 
            -
            // Crypto "namespace"
         | 
| 8700 | 
            -
            function Crypto() {}
         | 
| 8701 | 
            -
             | 
| 8702 | 
            -
            // Convert a string to an array of big-endian 32-bit words
         | 
| 8703 | 
            -
            Crypto.strToBe32s = function(str)
         | 
| 8704 | 
            -
            {
         | 
| 8705 | 
            -
            	var be = Array();
         | 
| 8706 | 
            -
            	var len = Math.floor(str.length/4);
         | 
| 8707 | 
            -
            	var i, j;
         | 
| 8708 | 
            -
            	for(i=0, j=0; i<len; i++, j+=4) {
         | 
| 8709 | 
            -
            		be[i] = ((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff);
         | 
| 8710 | 
            -
            	}
         | 
| 8711 | 
            -
            	while (j<str.length) {
         | 
| 8712 | 
            -
            		be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32);
         | 
| 8713 | 
            -
            		j++;
         | 
| 8714 | 
            -
            	}
         | 
| 8715 | 
            -
            	return be;
         | 
| 8716 | 
            -
            };
         | 
| 8717 | 
            -
             | 
| 8718 | 
            -
            // Convert an array of big-endian 32-bit words to a string
         | 
| 8719 | 
            -
            Crypto.be32sToStr = function(be)
         | 
| 8720 | 
            -
            {
         | 
| 8721 | 
            -
            	var str = "";
         | 
| 8722 | 
            -
            	for(var i=0;i<be.length*32;i+=8)
         | 
| 8723 | 
            -
            		str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff);
         | 
| 8724 | 
            -
            	return str;
         | 
| 8725 | 
            -
            };
         | 
| 8726 | 
            -
             | 
| 8727 | 
            -
            // Convert an array of big-endian 32-bit words to a hex string
         | 
| 8728 | 
            -
            Crypto.be32sToHex = function(be)
         | 
| 8729 | 
            -
            {
         | 
| 8730 | 
            -
            	var hex = "0123456789ABCDEF";
         | 
| 8731 | 
            -
            	var str = "";
         | 
| 8732 | 
            -
            	for(var i=0;i<be.length*4;i++)
         | 
| 8733 | 
            -
            		str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF);
         | 
| 8734 | 
            -
            	return str;
         | 
| 8735 | 
            -
            };
         | 
| 8736 | 
            -
             | 
| 8737 | 
            -
            // Return, in hex, the SHA-1 hash of a string
         | 
| 8738 | 
            -
            Crypto.hexSha1Str = function(str)
         | 
| 8739 | 
            -
            {
         | 
| 8740 | 
            -
            	return Crypto.be32sToHex(Crypto.sha1Str(str));
         | 
| 8741 | 
            -
            };
         | 
| 8742 | 
            -
             | 
| 8743 | 
            -
            // Return the SHA-1 hash of a string
         | 
| 8744 | 
            -
            Crypto.sha1Str = function(str)
         | 
| 8745 | 
            -
            {
         | 
| 8746 | 
            -
            	return Crypto.sha1(Crypto.strToBe32s(str),str.length);
         | 
| 8747 | 
            -
            };
         | 
| 8748 | 
            -
             | 
| 8749 | 
            -
            // Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
         | 
| 8750 | 
            -
            Crypto.sha1 = function(x,blen)
         | 
| 8751 | 
            -
            {
         | 
| 8752 | 
            -
            	// Add 32-bit integers, wrapping at 32 bits
         | 
| 8753 | 
            -
            	add32 = function(a,b)
         | 
| 8754 | 
            -
            	{
         | 
| 8755 | 
            -
            		var lsw = (a&0xFFFF)+(b&0xFFFF);
         | 
| 8756 | 
            -
            		var msw = (a>>16)+(b>>16)+(lsw>>16);
         | 
| 8757 | 
            -
            		return (msw<<16)|(lsw&0xFFFF);
         | 
| 8758 | 
            -
            	};
         | 
| 8759 | 
            -
            	// Add five 32-bit integers, wrapping at 32 bits
         | 
| 8760 | 
            -
            	add32x5 = function(a,b,c,d,e)
         | 
| 8761 | 
            -
            	{
         | 
| 8762 | 
            -
            		var lsw = (a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF);
         | 
| 8763 | 
            -
            		var msw = (a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16);
         | 
| 8764 | 
            -
            		return (msw<<16)|(lsw&0xFFFF);
         | 
| 8765 | 
            -
            	};
         | 
| 8766 | 
            -
            	// Bitwise rotate left a 32-bit integer by 1 bit
         | 
| 8767 | 
            -
            	rol32 = function(n)
         | 
| 8768 | 
            -
            	{
         | 
| 8769 | 
            -
            		return (n>>>31)|(n<<1);
         | 
| 8770 | 
            -
            	};
         | 
| 8771 | 
            -
             | 
| 8772 | 
            -
            	var len = blen*8;
         | 
| 8773 | 
            -
            	// Append padding so length in bits is 448 mod 512
         | 
| 8774 | 
            -
            	x[len>>5] |= 0x80 << (24-len%32);
         | 
| 8775 | 
            -
            	// Append length
         | 
| 8776 | 
            -
            	x[((len+64>>9)<<4)+15] = len;
         | 
| 8777 | 
            -
            	var w = Array(80);
         | 
| 8778 | 
            -
             | 
| 8779 | 
            -
            	var k1 = 0x5A827999;
         | 
| 8780 | 
            -
            	var k2 = 0x6ED9EBA1;
         | 
| 8781 | 
            -
            	var k3 = 0x8F1BBCDC;
         | 
| 8782 | 
            -
            	var k4 = 0xCA62C1D6;
         | 
| 8783 | 
            -
             | 
| 8784 | 
            -
            	var h0 = 0x67452301;
         | 
| 8785 | 
            -
            	var h1 = 0xEFCDAB89;
         | 
| 8786 | 
            -
            	var h2 = 0x98BADCFE;
         | 
| 8787 | 
            -
            	var h3 = 0x10325476;
         | 
| 8788 | 
            -
            	var h4 = 0xC3D2E1F0;
         | 
| 8789 | 
            -
             | 
| 8790 | 
            -
            	for(var i=0;i<x.length;i+=16) {
         | 
| 8791 | 
            -
            		var j,t;
         | 
| 8792 | 
            -
            		var a = h0;
         | 
| 8793 | 
            -
            		var b = h1;
         | 
| 8794 | 
            -
            		var c = h2;
         | 
| 8795 | 
            -
            		var d = h3;
         | 
| 8796 | 
            -
            		var e = h4;
         | 
| 8797 | 
            -
            		for(j = 0;j<16;j++) {
         | 
| 8798 | 
            -
            			w[j] = x[i+j];
         | 
| 8799 | 
            -
            			t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
         | 
| 8800 | 
            -
            			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
         | 
| 8801 | 
            -
            		}
         | 
| 8802 | 
            -
            		for(j=16;j<20;j++) {
         | 
| 8803 | 
            -
            			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
         | 
| 8804 | 
            -
            			t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
         | 
| 8805 | 
            -
            			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
         | 
| 8806 | 
            -
            		}
         | 
| 8807 | 
            -
            		for(j=20;j<40;j++) {
         | 
| 8808 | 
            -
            			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
         | 
| 8809 | 
            -
            			t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k2);
         | 
| 8810 | 
            -
            			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
         | 
| 8811 | 
            -
            		}
         | 
| 8812 | 
            -
            		for(j=40;j<60;j++) {
         | 
| 8813 | 
            -
            			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
         | 
| 8814 | 
            -
            			t = add32x5(e,(a>>>27)|(a<<5),(b&c)|(d&(b|c)),w[j],k3);
         | 
| 8815 | 
            -
            			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
         | 
| 8816 | 
            -
            		}
         | 
| 8817 | 
            -
            		for(j=60;j<80;j++) {
         | 
| 8818 | 
            -
            			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
         | 
| 8819 | 
            -
            			t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k4);
         | 
| 8820 | 
            -
            			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
         | 
| 8821 | 
            -
            		}
         | 
| 8822 | 
            -
             | 
| 8823 | 
            -
            		h0 = add32(h0,a);
         | 
| 8824 | 
            -
            		h1 = add32(h1,b);
         | 
| 8825 | 
            -
            		h2 = add32(h2,c);
         | 
| 8826 | 
            -
            		h3 = add32(h3,d);
         | 
| 8827 | 
            -
            		h4 = add32(h4,e);
         | 
| 8828 | 
            -
            	}
         | 
| 8829 | 
            -
            	return Array(h0,h1,h2,h3,h4);
         | 
| 8830 | 
            -
            };
         | 
| 8831 | 
            -
             | 
| 8832 9395 | 
             
            //--
         | 
| 8833 9396 | 
             
            //-- RGB colour object
         | 
| 8834 9397 | 
             
            //--
         | 
| @@ -8923,7 +9486,7 @@ function createTiddlyCheckbox(theParent,caption,checked,onChange) | |
| 8923 9486 | 
             
            	return cb;
         | 
| 8924 9487 | 
             
            }
         | 
| 8925 9488 |  | 
| 8926 | 
            -
            function createTiddlyElement(theParent,theElement,theID,theClass,theText)
         | 
| 9489 | 
            +
            function createTiddlyElement(theParent,theElement,theID,theClass,theText,attribs)
         | 
| 8927 9490 | 
             
            {
         | 
| 8928 9491 | 
             
            	var e = document.createElement(theElement);
         | 
| 8929 9492 | 
             
            	if(theClass != null)
         | 
| @@ -8932,6 +9495,11 @@ function createTiddlyElement(theParent,theElement,theID,theClass,theText) | |
| 8932 9495 | 
             
            		e.setAttribute("id",theID);
         | 
| 8933 9496 | 
             
            	if(theText != null)
         | 
| 8934 9497 | 
             
            		e.appendChild(document.createTextNode(theText));
         | 
| 9498 | 
            +
            	if(attribs){
         | 
| 9499 | 
            +
            		for(var n in attribs){
         | 
| 9500 | 
            +
            			e.setAttribute(n,attribs[n]);
         | 
| 9501 | 
            +
            		}
         | 
| 9502 | 
            +
            	}
         | 
| 8935 9503 | 
             
            	if(theParent != null)
         | 
| 8936 9504 | 
             
            		theParent.appendChild(e);
         | 
| 8937 9505 | 
             
            	return e;
         | 
| @@ -9015,6 +9583,14 @@ function resolveTarget(e) | |
| 9015 9583 | 
             
            	return obj;
         | 
| 9016 9584 | 
             
            }
         | 
| 9017 9585 |  | 
| 9586 | 
            +
            // Prevent an event from bubbling
         | 
| 9587 | 
            +
            function stopEvent(e){
         | 
| 9588 | 
            +
            	var ev = e? e : window.event;
         | 
| 9589 | 
            +
            	ev.cancelBubble = true;
         | 
| 9590 | 
            +
            	if (ev.stopPropagation) ev.stopPropagation();
         | 
| 9591 | 
            +
            	return false;	
         | 
| 9592 | 
            +
            }
         | 
| 9593 | 
            +
             | 
| 9018 9594 | 
             
            // Return the content of an element as plain text with no formatting
         | 
| 9019 9595 | 
             
            function getPlainText(e)
         | 
| 9020 9596 | 
             
            {
         | 
| @@ -9125,6 +9701,8 @@ function removeNode(e) | |
| 9125 9701 | 
             
            // Remove any event handlers or non-primitve custom attributes
         | 
| 9126 9702 | 
             
            function scrubNode(e)
         | 
| 9127 9703 | 
             
            {
         | 
| 9704 | 
            +
            	if(!config.browser.isIE)
         | 
| 9705 | 
            +
            		return;
         | 
| 9128 9706 | 
             
            	var att = e.attributes;
         | 
| 9129 9707 | 
             
            	if(att) {
         | 
| 9130 9708 | 
             
            		for(var t=0; t<att.length; t++) {
         | 
| @@ -9171,6 +9749,13 @@ function setStylesheet(s,id,doc) | |
| 9171 9749 | 
             
            	}
         | 
| 9172 9750 | 
             
            }
         | 
| 9173 9751 |  | 
| 9752 | 
            +
            function removeStyleSheet(id)
         | 
| 9753 | 
            +
            {
         | 
| 9754 | 
            +
            	var e = document.getElementById(id);
         | 
| 9755 | 
            +
            	if(e)
         | 
| 9756 | 
            +
            		e.parentNode.removeChild(e);
         | 
| 9757 | 
            +
            }
         | 
| 9758 | 
            +
             | 
| 9174 9759 | 
             
            // Force the browser to do a document reflow when needed to workaround browser bugs
         | 
| 9175 9760 | 
             
            function forceReflow()
         | 
| 9176 9761 | 
             
            {
         | 
| @@ -9207,7 +9792,7 @@ function replaceSelection(e,text) | |
| 9207 9792 | 
             
            // Returns the text of the given (text) node, possibly merging subsequent text nodes
         | 
| 9208 9793 | 
             
            function getNodeText(e)
         | 
| 9209 9794 | 
             
            {
         | 
| 9210 | 
            -
            	var t = ""; | 
| 9795 | 
            +
            	var t = "";
         | 
| 9211 9796 | 
             
            	while(e && e.nodeName == "#text") {
         | 
| 9212 9797 | 
             
            		t += e.nodeValue;
         | 
| 9213 9798 | 
             
            		e = e.nextSibling;
         | 
| @@ -9351,94 +9936,6 @@ TW21Saver.prototype.externalizeTiddler = function(store,tiddler) | |
| 9351 9936 | 
             
            	}
         | 
| 9352 9937 | 
             
            };
         | 
| 9353 9938 |  | 
| 9354 | 
            -
            //--
         | 
| 9355 | 
            -
            //-- Deprecated code
         | 
| 9356 | 
            -
            //--
         | 
| 9357 | 
            -
             | 
| 9358 | 
            -
            // @Deprecated: Use createElementAndWikify and this.termRegExp instead
         | 
| 9359 | 
            -
            config.formatterHelpers.charFormatHelper = function(w)
         | 
| 9360 | 
            -
            {
         | 
| 9361 | 
            -
            	w.subWikify(createTiddlyElement(w.output,this.element),this.terminator);
         | 
| 9362 | 
            -
            };
         | 
| 9363 | 
            -
             | 
| 9364 | 
            -
            // @Deprecated: Use enclosedTextHelper and this.lookaheadRegExp instead
         | 
| 9365 | 
            -
            config.formatterHelpers.monospacedByLineHelper = function(w)
         | 
| 9366 | 
            -
            {
         | 
| 9367 | 
            -
            	var lookaheadRegExp = new RegExp(this.lookahead,"mg");
         | 
| 9368 | 
            -
            	lookaheadRegExp.lastIndex = w.matchStart;
         | 
| 9369 | 
            -
            	var lookaheadMatch = lookaheadRegExp.exec(w.source);
         | 
| 9370 | 
            -
            	if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
         | 
| 9371 | 
            -
            		var text = lookaheadMatch[1];
         | 
| 9372 | 
            -
            		if(config.browser.isIE)
         | 
| 9373 | 
            -
            			text = text.replace(/\n/g,"\r");
         | 
| 9374 | 
            -
            		createTiddlyElement(w.output,"pre",null,null,text);
         | 
| 9375 | 
            -
            		w.nextMatch = lookaheadRegExp.lastIndex;
         | 
| 9376 | 
            -
            	}
         | 
| 9377 | 
            -
            };
         | 
| 9378 | 
            -
             | 
| 9379 | 
            -
            // @Deprecated: Use <br> or <br /> instead of <<br>>
         | 
| 9380 | 
            -
            config.macros.br.handler = function(place)
         | 
| 9381 | 
            -
            {
         | 
| 9382 | 
            -
            	createTiddlyElement(place,"br");
         | 
| 9383 | 
            -
            };
         | 
| 9384 | 
            -
             | 
| 9385 | 
            -
            // Find an entry in an array. Returns the array index or null
         | 
| 9386 | 
            -
            // @Deprecated: Use indexOf instead
         | 
| 9387 | 
            -
            Array.prototype.find = function(item)
         | 
| 9388 | 
            -
            {
         | 
| 9389 | 
            -
            	var i = this.indexOf(item);
         | 
| 9390 | 
            -
            	return i == -1 ? null : i;
         | 
| 9391 | 
            -
            };
         | 
| 9392 | 
            -
             | 
| 9393 | 
            -
            // Load a tiddler from an HTML DIV. The caller should make sure to later call Tiddler.changed()
         | 
| 9394 | 
            -
            // @Deprecated: Use store.getLoader().internalizeTiddler instead
         | 
| 9395 | 
            -
            Tiddler.prototype.loadFromDiv = function(divRef,title)
         | 
| 9396 | 
            -
            {
         | 
| 9397 | 
            -
            	return store.getLoader().internalizeTiddler(store,this,title,divRef);
         | 
| 9398 | 
            -
            };
         | 
| 9399 | 
            -
             | 
| 9400 | 
            -
            // Format the text for storage in an HTML DIV
         | 
| 9401 | 
            -
            // @Deprecated Use store.getSaver().externalizeTiddler instead.
         | 
| 9402 | 
            -
            Tiddler.prototype.saveToDiv = function()
         | 
| 9403 | 
            -
            {
         | 
| 9404 | 
            -
            	return store.getSaver().externalizeTiddler(store,this);
         | 
| 9405 | 
            -
            };
         | 
| 9406 | 
            -
             | 
| 9407 | 
            -
            // @Deprecated: Use store.allTiddlersAsHtml() instead
         | 
| 9408 | 
            -
            function allTiddlersAsHtml()
         | 
| 9409 | 
            -
            {
         | 
| 9410 | 
            -
            	return store.allTiddlersAsHtml();
         | 
| 9411 | 
            -
            }
         | 
| 9412 | 
            -
             | 
| 9413 | 
            -
            // @Deprecated: Use refreshPageTemplate instead
         | 
| 9414 | 
            -
            function applyPageTemplate(title)
         | 
| 9415 | 
            -
            {
         | 
| 9416 | 
            -
            	refreshPageTemplate(title);
         | 
| 9417 | 
            -
            }
         | 
| 9418 | 
            -
             | 
| 9419 | 
            -
            // @Deprecated: Use story.displayTiddlers instead
         | 
| 9420 | 
            -
            function displayTiddlers(srcElement,titles,template,unused1,unused2,animate,unused3)
         | 
| 9421 | 
            -
            {
         | 
| 9422 | 
            -
            	story.displayTiddlers(srcElement,titles,template,animate);
         | 
| 9423 | 
            -
            }
         | 
| 9424 | 
            -
             | 
| 9425 | 
            -
            // @Deprecated: Use story.displayTiddler instead
         | 
| 9426 | 
            -
            function displayTiddler(srcElement,title,template,unused1,unused2,animate,unused3)
         | 
| 9427 | 
            -
            {
         | 
| 9428 | 
            -
            	story.displayTiddler(srcElement,title,template,animate);
         | 
| 9429 | 
            -
            }
         | 
| 9430 | 
            -
             | 
| 9431 | 
            -
            // @Deprecated: Use functions on right hand side directly instead
         | 
| 9432 | 
            -
            var createTiddlerPopup = Popup.create;
         | 
| 9433 | 
            -
            var scrollToTiddlerPopup = Popup.show;
         | 
| 9434 | 
            -
            var hideTiddlerPopup = Popup.remove;
         | 
| 9435 | 
            -
             | 
| 9436 | 
            -
            // @Deprecated: Use right hand side directly instead
         | 
| 9437 | 
            -
            var regexpBackSlashEn = new RegExp("\\\\n","mg");
         | 
| 9438 | 
            -
            var regexpBackSlash = new RegExp("\\\\","mg");
         | 
| 9439 | 
            -
            var regexpBackSlashEss = new RegExp("\\\\s","mg");
         | 
| 9440 | 
            -
            var regexpNewLine = new RegExp("\n","mg");
         | 
| 9441 | 
            -
            var regexpCarriageReturn = new RegExp("\r","mg");
         | 
| 9442 9939 | 
             
            //--
         | 
| 9443 9940 | 
             
            //-- End of scripts
         | 
| 9444 9941 | 
             
            //--
         | 
| @@ -9451,7 +9948,6 @@ if(useJavaSaver) | |
| 9451 9948 | 
             
            //]]>
         | 
| 9452 9949 | 
             
            </script>
         | 
| 9453 9950 | 
             
            <!--POST-SCRIPT-START-->
         | 
| 9454 | 
            -
             | 
| 9455 9951 | 
             
            <!--POST-SCRIPT-END-->
         | 
| 9456 9952 | 
             
            </body>
         | 
| 9457 9953 | 
             
            </html>
         |