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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
VLBI懇談会の皆様

いつもお世話になります。NICTの関戸です。
情報通信研究機構では、『第12回IVS技術開発センターシンポジウム』を鹿
島宇宙技術センターにおいて開催致します。詳細は下記の通りですので、多数の
皆様にご参加頂き、活発な議論をお願い致したく存じます。

             記

『第12回IVS技術開発センターシンポジウム』開催のご案内

情報通信研究機構は、国際VLBI事業(IVS: International VLBI Service
for Geodesy and Astronomy)を構成する技術開発センター、解析センター、観
測局、相関処理局、及びデータセンターの各コンポーネントとして指名を受け、
VLBI観測技術に関連するさまざまな技術開発を推進することでIVSの活動
に大きく寄与しています。国内においては、2001年から毎年IVS技術開発セン
ターシンポジウムを主催し、研究成果を英文のTDCニュースとして発行すること
で、VLBIに関する技術開発の最新の研究成果を国内外に発信してきました。

現在各国では、IVSによって制定された次世代測地VLBIシステムの標準仕様
「VLBI2010」に基づくアンテナ建設(米国、ドイツ、スペイン、日本、等)や広
帯域受信システム、デジタルBBCなどの観測システムの開発が進められており、
NICTにおいても「VLBI2010」に準拠した広帯域VLBIシステムを応用した周波数比
較技術としてGala-Vシステムの開発を進めています。また、国土地理院や国立天
文台などでもそれぞれの目的に応じた技術開発が活発に進められています。シン
ポジウムでは、こうした新しい観測システムの互換性・相互運用性をテーマとす
るほか、新しい技術開発構想、測地・天文観測、あるいはGNSS技術との連携等、
VLBI及び関連する宇宙測地技術全般も議論の対象としておりますので、広く関連
分野の皆さんの御参加をよろしくお願いします。

■日時:平成25年6月6日(木) 午前10時~午後5時(予定)
※シンポジウム開催後に懇親会を開催する予定です。
■場所:情報通信研究機構鹿島宇宙技術センター 研究本館小会議室
■講演発表申し込み締め切り:平成25年5月24日(金)
※ポスター発表も受け付けます。
■参加費:無料
■講演発表申込み方法:以下の申込書に必要事項をご記入の上世話人の関戸
、武江までメールでお申し込みくだ
さい。その際、件名に「TDCシンポジウム申し込み」と記載頂けると大変助か
ります。
※なお、後日このアナウンスをWEBにも掲載します。

世話人:情報通信研究機構 関戸 衛、武江美和
    〒314-8501 茨城県鹿嶋市平井 893-1
------------------------------------------------------------

第12回IVS技術開発センターシンポジウム 講演発表申込書

講演発表申し込み締め切り : 平成25年5月24日(金)
申し込み先 :関戸 衛 , 武江 美和
         E-mail:Conf-Sewanin(AT)kakusan.nict.go.jp

氏名 :
所属 :
電話 :
e-mail :
講演題目:
発表者 :
要旨(200字程度):

---------
懇親会参加:  可 : 不可 (参加費未定:2000円程度)
昼食の注文(350円): 定食:麺類:カレー 
ゲストハウス宿泊が必要の場合: 宿泊日 
VLBI懇談会の皆様へ


第12回IVS-技術開発センターシンポジウムを
下記の日程・プログラムで開催しますのでお知らせします。

日程:2013年6月6日(木) 10:00- 17:30
場所:情報通信研究機構 鹿島宇宙技術ンセンター小会議室


****プログラム****
アンテナシステム・観測的研究セッション I (10:00-11:12) 座長:小山 泰弘
(NICT)
----------------------------------------------------------
1 徂徠 和夫(北大)  北海道大学苫小牧11m電波望遠鏡の全自動観測システム
と観測計画
2 米倉 覚則(茨城大) 茨城局(日立・高萩アンテナ)の現状
3 若杉貴浩(国土地理院)つくばVLBI観測局の現況報告~過負荷によるアンテナ
基礎部の損傷~
4 関戸 衛(NICT)   34mアンテナの復旧、GALA-Vシステム開発概要
----------------------------------------------------------
		休憩(8分)

アンテナシステム・観測的研究セッション II (11:20-12:14)座長:市川 隆一
----------------------------------------------------------
5 三好 真(天文台)	きゃらばんサブミリ計画の状況
6 朝木 義晴(JAXA)	Sgr A* VLBIモニタ:定常相関処理
7 竹川 俊也(慶応大)	NICT鹿島-小金井基線VLBIを用いたS/X帯でのSgr A*強
度モニター観測
		ポスター紹介 (12:14?12:24)
P1 木村 公洋(大阪府大)VLBI2010用光学系の計算および広帯域クワッドリッ
ジアンテナの近傍界測定
P2 水野 いづみ(鹿児島大)偏波分光計PolariSの開発
E1 福崎 順洋(国土地理院) 展示品(VGOS観測用 受信機・記録装置)の紹介
----------------------------------------------------------
	集合写真撮影(12:25-12:30 研究本館前にて)
	ポスターセッション(お昼休み:12:30-13:30)

技術開発(相関処理・データ処理技術)セッション(13:30-15:00) 座長:氏原
秀樹
----------------------------------------------------------
8  鈴木駿策(天文台)	『VDIF Software Library の開発』
9  川口則幸(天文台)	VLBI観測技術における基礎的な問題
10 鬼頭 友祐(横浜国大)VPN環境におけるPTP時刻同期精度の検証
11 住田 真一(横浜国大)地上デジタルTV電波受信によるUSRP活用FX型(逆)VLBI
相関処理技術の開発
12 竹内 央 (JAXA)  JAXAにおけるVLBIによる軌道決定技術の開発の状況
----------------------------------------------------------
		休憩(5分)

技術開発(VLBI2010-GALAV)セッション (15:05-16:17) 座長:岳藤 一宏
----------------------------------------------------------
13	岳藤 一宏(NICT)	VLBIによる高精度周波数比較へむけて
14	氏原 秀樹(NICT)	広帯域フィードの開発
15	高島 和宏(国土地理院) VLBI2010時代における国内VLBI観測のシミュレー
ション評価
16	Hobiger Thomas(NICT) c5++を用いた観測レベルの宇宙測地統合解析について
----------------------------------------------------------
		休憩(5分)

技術開発(VLBI2010(VGOS),K5およびK6)セッション (16:22-17:30) 座長:近藤
哲朗
----------------------------------------------------------
17	福崎 順洋(国土地理院) VLBI2010アンテナの建設
18	栗原  忍(国土地理院)	VLBI2010データ取得システムの開発
19	小山 泰弘(NICT)	K3システムからK5システムまでの開発について
		議論(10分)    
----------------------------------------------------------
閉会挨拶
		懇親会(18:00 --)






[[お知らせ]]
----

[[ご案内]]
[[お知らせ]]

[[1st Circular]]
[[2st Circular]]
[[講演受付]]
[[プログラム]]
[[要旨]]
[[発表資料]]
[[写真]]
[[アクセス| https://ksrc.nict.go.jp/access.html]]

[[IVS| https://ivs.nict.go.jp/mirror/ ]]

[[情報通信研究機構 | https://www.nict.go.jp/ ]]
[[鹿島宇宙技術センター | https://ksrc.nict.go.jp/]]
[[時空標準研究室 | ../../../lab/ ]]
[[次世代時空計測G | ../../ ]]

<html><img src="./logo_ksrc2.gif" width="100%"></html>



[[GettingStarted]]

第12回 IVS技術開発センターシンポジウム
<html><center><table border="0" cellpadding="10px"><tr style="font-size:small;" bgcolor="Honeydew"><td><br><h1>シンポジウムは盛況の中終了致しました.<br>ご参加ありがとうございました.</h1><br><br><center><a href="./image/TDC2013.jpg"><img src="./image/s-TDC2013.jpg"></a></center><br><br></td></tr></table></center>

<h1>研究会集録 No.33を発行しました</h1>
<p> ご提出いただいた集録原稿は、IVS NICT-TDC News として論文集を発行し、国内外のVLBI/測地・天文 関連研究機関及び個人に送付しています。<br>
みなさまのご理解とご協力に、厚く感謝申し上げます。<br>
<br>
 <a class="moz-txt-link-freetext" href="https://www2.nict.go.jp/aeri/sts/stmg/ivstdc/news_33/pdf/pctdc_news33.pdf">研究会集録 No.33 (TDC-News No.33) </a>
<br>
<br>
 <a class="moz-txt-link-freetext" href="https://www2.nict.go.jp/aeri/sts/stmg/ivstdc/news-index-j.html">過去のバックナンバーはこちらです。 </a>
<br>
<hr>
</html>
<html><table border="0" cellpadding="10px"><tr style="font-size:small;" bgcolor="Honeydew"><td bordercolor="red"><br><h1>シンポジウム開催趣旨</h1><br>

&nbsp; &nbsp; 情報通信研究機構は,<a href="https://ivs.nict.go.jp/mirror/" target="_top">国際VLBI事業</a>(International VLBI Service for Geodesy and Astrometry)を構成する技術開発センター、解析センター、観測局、相関処理局、及びデータセンターの各コンポーネントとして指名を受け、VLBI観測技術に関連するさまざまな技術開発を推進することでIVSの活動に大きく寄与しています。国内においては、2001年から毎年IVS技術開発センターシンポジウムを主催し、研究成果を英文のTDCニュースとして発行することで、VLBIに関する技術開発の最新の研究成果を国内外に発信してきました。<br>

<br><br><center><a href="./31.JPG"><img src="./s31.jpg"></a></center><br><br>

&nbsp; &nbsp; 現在各国では、IVSによって制定された次世代測地VLBIシステムの標準仕様「VLBI2010」に基づくアンテナ建設(米国、ドイツ、スペイン、日本、等)や広帯域受信システム、デジタルBBCなどの観測システムの開発が進められており、NICTにおいても「VLBI2010」に準拠した広帯域VLBIシステムを応用した周波数比較技術としてGala-Vシステムの開発を進めています。また、国土地理院や国立天文台などでもそれぞれの目的に応じた技術開発が活発に進められています。シンポジウムでは、こうした新しい観測システムの互換性・相互運用性をテーマとするほか、新しい技術開発構想、測地・天文観測、あるいはGNSS技術との連携等、VLBI及び関連する宇宙測地技術全般も議論の対象としておりますので、広く関連分野の皆さんの御参加をよろしくお願いします。<br>
<hr>
<br>
<h2>昼食・宿泊について</h2>
<br>
▼前日、あるいは当日に鹿島に宿泊を希望される方は鹿島宇宙技術センターのゲストハウスに若干の空きがあります。利用条件ありますので世話人までご相談ください。<br>
※特に旅費支給に制限のある学生さんを優先とします。<br>
<br>
▼当日の昼食は鹿島宇宙技術センターの厚生棟で取ることが出来ます。<br>
    <font color="Red"><b>一食350円</b></font> 事前予約(5/24までに世話人まで)<br>
    定食、カレー、麺類 の 3種から選択<br>
<hr>
<br><h2>日時:平成25年6月6日(木) 午前10時~午後5時(予定)</h2>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <strong>シンポジウム開催後に懇親会を開催する予定です.</strong><br><br>
&nbsp; &nbsp; &nbsp;  ■場所:<a href="https://www2.nict.go.jp/wireless/spacelab/ksrc/index-j.html">情報通信研究機構鹿島宇宙技術センター</a> 研究本館小会議室<br><br>
&nbsp; &nbsp; &nbsp;  ■講演発表申し込み締め切り:<b><span style="color:Red; font^size:medium;">平成25年5月24日(金)</span></b><br>
&nbsp; &nbsp; &nbsp; &nbsp;  ※ポスター発表も受け付けます。<br><br>
&nbsp; &nbsp; &nbsp;  ■参加費:無料<br><br>
&nbsp; &nbsp; &nbsp;  ■講演発表申込み方法:<br>
&nbsp; &nbsp; &nbsp;  &nbsp; &nbsp; &nbsp;  必要事項をご記入の上,世話人までメールでお申し込みください.<br>
&nbsp; &nbsp; &nbsp;  &nbsp; &nbsp; &nbsp;  (お申込み方法の詳細は左側メニュー<u>講演受付</u>をお読み下さい)<br><br><br><br>
<center>
&nbsp; &nbsp; &nbsp;  <b>世話人: &nbsp;&nbsp;情報通信研究機構 関戸 衛&nbsp;,&nbsp; 武江美和<br>
&nbsp; &nbsp; &nbsp;  E-mail: &nbsp;&nbsp;Conf-Sewanin(AT)kakusan.nict.go.jp</b><br>
</center>
<br>
<hr>
             〒314-8501 茨城県鹿嶋市平井 893-1<br>
             情報通信研究機構 鹿島宇宙技術センター<br>
             TEL:0299-82-1211(代表) <br>
              &nbsp;アクセス:<a href="https://www2.nict.go.jp/wireless/spacelab/ksrc/wayandaccomo.html">交通・宿泊</a><br>
<br>
</td>
</tr>
</table>
</html>
!第12回IVS技術開発センターシンポジウム プログラム
2013年5月30日版
[[ PDF版 | ./PDFs/12th_TDC-Sympo_program20130530.pdf]]

平成25年6月6日(木)
情報通信研究機構 鹿島宇宙技術センター 研究本館

開催挨拶
★  発表時間は各 18 分(講演 15 分,質疑応答 3 分)ポスター紹介は 講演3分のみです。


アンテナシステム・観測的研究セッション I (10:00~11:12) 座長:小山 泰弘(NICT)
1	徂徠 和夫(北大)	北海道大学苫小牧11m電波望遠鏡の全自動観測システムと観測計画
2	米倉 覚則(茨城大)	茨城局(日立・高萩アンテナ)の現状
3	若杉貴浩(国土地理院)つくばVLBI観測局の現況報告~過負荷によるアンテナ基礎部の損傷~
4	関戸 衛(NICT)	34mアンテナの復旧、GALA-Vシステム開発概要
		休憩(約10分)

アンテナシステム・観測的研究セッション II (11:20〜12:14)座長:市川 隆一
5	三好 真(天文台)	きゃらばんサブミリ計画の状況
6	朝木 義晴(JAXA)	Sgr A* VLBIモニタ:定常相関処理
7	竹川 俊也(慶応大)	NICT鹿島−小金井基線VLBIを用いたS/X帯でのSgr A*強度モニター観測    
		ポスター紹介 (12:14-12:24)
P1	木村 公洋(大阪府大)VLBI2010用光学系の計算および広帯域クワッドリッジアンテナの近傍界測定 
P2	水野 いづみ(鹿児島大)偏波分光計PolariSの開発
E1   福崎 順洋(国土地理院) 展示品(VGOS観測用 受信機・記録装置)の紹介

		集合写真撮影(12:25-30 研究本館前にて)
		ポスターセッション(お昼休み:12:30-13:30)

技術開発(相関処理・データ処理技術)セッション(13:30〜15:00) 座長 氏原 秀樹
8	鈴木駿策(天文台)	『VDIF Software Library の開発』
9	川口則幸(天文台)	VLBI観測技術における基礎的な問題
10	鬼頭 友祐(横浜国大)	VPN環境におけるPTP時刻同期精度の検証
11	住田 真一(横浜国大)地上デジタルTV電波受信によるUSRP活用FX型(逆)VLBI相関処理技術の開発
12  竹内 央 (JAXA)  JAXAにおけるVLBIによる軌道決定技術の開発の状況
		休憩(5分)

技術開発(VLBI2010-GALAV)セッション (15:05 〜16:17) 座長:岳藤 一宏
13	岳藤 一宏(NICT)	VLBIによる高精度周波数比較へむけて
14	氏原 秀樹(NICT)	広帯域フィードの開発
15	高島 和宏(国土地理院) VLBI2010時代における国内VLBI観測のシミュレーション評価
16	Hobiger Thomas(NICT) c5++を用いた観測レベルの宇宙測地統合解析について
		休憩(5分)

技術開発(VLBI2010(VGOS),K5およびK6)セッション (16:22〜17:30) 座長:近藤 哲朗
17	福崎 順洋(国土地理院) VLBI2010アンテナの建設
18	栗原  忍(国土地理院)	VLBI2010データ取得システムの開発
19	小山 泰弘(NICT)	K3システムからK5システムまでの開発について
		議論(10分)    
閉会挨拶
		懇親会(18:00〜)

ポスター発表
P1. 木村 公洋(大阪府立大学)	VLBI2010用光学系の計算および広帯域クワッドリッジアンテナの近傍界測定 
P2. 水野 いづみ(鹿児島大学)	偏波分光計PolariSの開発

展示品
	VGOS観測用 広帯域受信機・フィード (国土地理院)
	VGOS観測用 広帯域信号処理装置(K6/iDAS Sampler)(国土地理院)

お知らせ
シンポジウムへの参加費は無料です.本シンポジウムの集録として,IVS技術開発センターにおいて定期的に発行しております NICT IVS TDC Newsを発行する予定です.以下の要領で集録論文の投稿をお願いします。

 
<html><img src="./image/teishutsu.png"><br><br></html>
 
!第12回IVS技術開発センターシンポジウム プログラム
2013年5月29日版
[[ PDF版 | ./PDFs/12th_TDC-Sympo_ProgAbst20130529.pdf]]

平成25年6月6日(木)
情報通信研究機構 鹿島宇宙技術センター 研究本館

開催挨拶
★  発表時間は各 18 分(講演 15 分,質疑応答 3 分)ポスター紹介は 講演3分です。

!アンテナシステム・観測的研究セッション I (10:00~11:12) 座長:小山 泰弘(NICT)

 1.北海道大学苫小牧11m電波望遠鏡の全自動観測システムと観測計画
  北海道大学大学院理学研究院物理学部門 徂徠 和夫	

北海道大学苫小牧11m電波望遠鏡では,観測の効率化をはかるために全自動観測システムを整備し,今春より試験的な運用を開始した.このシステムは,予め準備しておいた観測情報を記述したファイルをもとに自動的に装置の設定と観測が行われ,降雪や強風,大気の条件が悪いなどの気象状況から観測の中断・続行を判定する.システムの紹介とともに,観測の負担軽減から発生したマンパワーをシフトさせることで目処がたったVLBI観測計画についても紹介する.


 2.茨城局(日立・高萩アンテナ)の現状
  茨城大学 宇宙科学教育研究センター 米倉 覚則

日立および高萩32メートルアンテナには、6-9 GHz 帯冷却受信機(Tsys~25K)2台、22 GHz 帯冷却受信機(Tsys~50K)1台が整備された。日立アンテナのポインティング精度は0.3分角程度、高萩アンテナについては現在調整中である。両アンテナとも、開口能率は6G帯において55-75%,22GHz帯において30%程度である。バックエンドは、DIR-1000テープ記録(VLBI)、K5/VSSP32(IP-VLBI,単一鏡分光観測)、K5/VSI(VLBI)、ADS1000+OCTADISK(VLBI)が整備された。光結合については整備中である。2素子干渉計用の相関器については、今年度整備予定である。


 3.つくばVLBI観測局の現況報告~過負荷によるアンテナ基礎部の損傷~
  国土地理院  若杉貴浩

国土地理院つくばVLBI観測局は、1998年の完成以降、数多くのVLBI観測を行い、IVSに貢献してきた。昨年2012年は1年間に87回の24時間観測と131回の1時間観測を実施している。一方で、高頻度な稼動によりAZレール下部に大きな負荷がかかり、磨耗して粉状となったグラウト(セメント)が噴出する現象が数年前から確認されていたが、今回その状態がかなり深刻であることが判明した。本発表では、つくばVLBI観測局の現況を報告し、ホイール&トラック形式のアンテナで起こりうるレール下部の問題について情報共有を図る。


 4.34mアンテナの復旧、GALA-Vシステム開発概要
  情報通信研究機構 時空標準研究室 関戸 衛

3月に完了した34mアンテナ震災復旧工事と、復旧後のポインティング性能等を紹介する。また、NICTのVLBIグループでは本中期計画のミッションとして遠隔地の原子時計間の周波数比較のために小型広帯域VLBI塩ステム(GALA-V)を開発中であり、その受信系・記録系のシステム概要、及び小型アンテナが設置されている鹿島ー小金井の現在の開発状況について報告する。


休憩(約10分)

!アンテナシステム・観測的研究セッション II (11:20〜12:14)座長:市川 隆一

 5.きゃらばんサブミリ計画の状況
  国立天文台 三好 真

きゃらばん・サブはサブミリ波帯の大型固定局2、移動VLBI 局1の3 局を南米アンデスに展開、1~2 千kmのVLBI 短基線を実現、visibility 解析から銀河系中心ブラックホールの周囲のホライズンの世界初検出を目指すものである。さらにALMA など世界のサブミリ波望遠鏡とブラックホール近傍撮像(降着円盤、ジェット生成現場やホライズンの形状の観測)を行うことも目的とする。まずは移動VLBI 局の開発を行っている。移動局の実現にはコストダウンと軽量化が重要である。2012 年度はアンテナ製作法や移動局架台の調査を行った。へら絞り法で口径2m、rms60 ミクロン程度の鏡面を安価に製作できるめどがたった。実際のアンテナに使用できるように複合望遠鏡方式を含め、検討を進めている。移動局架台では名大佐藤研開発の栗田架台での検討をすすめている。サイトサーベイは大型固定局の設置場所と移動局の観測地点の設定に重要である。ボリビア・チャカルタヤ、ペルー・ワンカヨの大気水蒸気変動を調べ、サイト環境の評価を行った。


 6.Sgr A* VLBIモニタ:定常相関処理
  JAXA/宇宙科学研究所  朝木 義晴

昨年、天の川銀河の中心(Sgr A*)に地球質量の3倍程度のガス雲(G2)が近付いており、数ヶ月後に最接近するという報告がNatureに掲載された。当研究グループは、大学連携VLBIネットワークによるSgr A*のモニタ観測をこの2月から開始した。主要な参加機関は茨城大学(国立天文台32m望遠鏡/K帯)、岐阜大学(国立天文台11m望遠鏡/K帯)、筑波大学(国土地理院32m望遠鏡/K帯)、国立天文台水沢(10m望遠鏡/K帯)、情報通信研究機構(11m望遠鏡/SX帯)、そして宇宙研である。JAXA相模原キャンパスには情報通信研究機構のS/W相関処理プログラムを利用した全自動相関処理システムを構築し、K帯VLBIの定常相関処理を行っている。各望遠鏡からインターネット経由で転送される1時間弱の128Mbpsデータを準実時間解析し、結果は半日以内共同研究者に配信できる。ここでは、相互相関処理を中心とするモニタシステムについて詳しく報告したい。


 7.NICT鹿島−小金井基線VLBIを用いたS/X帯でのSgr A*強度モニター観測
  慶應義塾大学 	竹川 俊也

銀河系中心に位置する電波源Sgr A*は400万太陽質量の巨大ブラックホールであると考えられており、近年ドイツの研究グループによってこのブラックホールに向かって落下しつつあるガス雲G2が発見された。最新の予測ではSgr A*にG2が最接近するのは来年3月とされている。G2の落下に伴いSgr A*の電波増光が期待されており、私はこの増光を捉えるために今年2月からNICT鹿島−小金井基線VLBIを用いてS/X帯での強度モニター観測を行っている。今のところ大きな光度変動は確認されていない。今後とも何かが起きることを楽しみに観測を継続していく予定である。


!ポスター紹介 (12:14-12:24)

 P1. VLBI2010用光学系の計算および広帯域クワッドリッジアンテナの近傍界測定
        大阪府立大学 木村 公洋

測地観測用次世代VLBIシステムの標準仕様である「VLBI2010」では、2-14GHzの広帯域 受信を採用することを規定している。これを実現するために、クワッドリッジアンテナを一次放射器として用いることが計 画されており、例えば、国土地理院では、VLBI2010用に、クワッドリッジアンテナを用いることを検討している。更に、それに 対応する反射鏡アンテナとして、口径13.2mのリングフォーカスタイプの光学系の開発を進めている。そこで私たちは、一次放射器であるクワッドリッジアンテナの放射パターンを近傍界 測定装置を用いて測定し、また加えて、一次放射器を組み込んだ、リングフォーカスアンテナの放射パターンについても計算した。


 P2.  偏波分光計PolariSの開発
        鹿児島大学 水野 いずみ

偏波分光計PolariSを、星形成領域の磁場強度を計測する目的で開発した。CCS分子輝線のZeeman効果で100μGの磁場を計測するためには、 (1)両偏波の受信信号を入力してFull Stokes (I, Q, U, V)を出力する、 (2)61 Hzの周波数分解能を得るという仕様が要求される。VLBI用に開発されたA/D変換器K5/VSSP32で量子したデジタル化した信号をUSBでLinux計算機に取り込み、GPUでFFT演算するシステムを設計し、約60万円の費用で実現した。本ポスターではPolariSのシステム概要と得られた検証結果を報告する。


集合写真撮影(12:25-30 研究本館前にて)
ポスターセッション(お昼休み:12:30-13:30)

!技術開発(相関処理・データ処理技術)セッション(13:30〜14:45) 座長 氏原 秀樹

 8.『VDIF Software Library の開発』
    国立天文台 水沢VLBI観測所 開発部門 鈴木駿策

VDIF Software Library の中の一つである、VSRECの開発に成功した。VSREC(VDIF Software ECorder)により、8Gbpsのデータを45700秒間連続記録し、パケットロス0で記録を終了した。十数回記録試験を行ったがパケットロス0記録を日々更新し、安定に動作している状況である。この開発に成功した状況および今後の展開内容を報告する。



 9.VLBI観測技術における基礎的な問題
  国立天文台 川口則幸

VLBI観測にまつわる基礎的な技術問題についての議論を行う。トピックスは
   (1)基線ベクトルの定義
   (2)フェーズアップについて
   (3)スピルオーバーについて
   (4)偏波分離器について
の4課題を取り上げ、問題点を指摘する。


 10.VPN環境におけるPTP時刻同期精度の検証
  横浜国立大学大学院 工学府 物理情報工学専攻 高橋研究室 鬼頭 友祐

現代には数多の機器・システムが時刻情報を利用している.中でも,電子商取引や、LTEなどの高速無線通信では、μsec以上の精度での時刻同期が求められている。現在の主要な時刻同期法であるNTPの同期精度がmsecである一方、新たな時刻同期プロトコルであるPTPではnsecに達すると言われている.本研究は、VPN環境下でのPTPによる時刻同期においてクロックの差異や通信遅延時間が時刻同期精度にどのような影響を齎すかを検証したものである。


 11.地上デジタルTV電波受信によるUSRP活用FX型(逆)VLBI相関処理技術の開発
   横浜国立大学大学院 工学府 物理情報工学専攻 高橋研究室 住田 真一

21世紀現在時空情報の正当性が求められるケースが増えてきている。しかし現行の測位システムでは、屋内外の全ての空間を単独でカバーすることはできず、組み合わせた利用が必要になっている。地上波デジタル放送電波を用いることで測位システムをカバーするというのが本研究の提案である。結果としてUSRPとcudaGPU技術を用いて相関が取れたことかつ安定した遅延時間が求められたことから地上デジタル放送電波が時空情報正当性検証技術の一つとして有効であることが確認できた。また、地デジ信号の東京タワー・スカイツリーの切替時の相関データの取得にも成功した。

		休憩(約10分)

!技術開発(VLBI2010-GALAV)セッション (15:55 〜16:10) 座長:岳藤 一宏

 12.VLBIによる高精度周波数比較へむけて
    情報通信研究機構 時空標準研究室 岳藤 一宏

VLBIをもちいて遠隔地の基準信号の周波数比較をおこなうには、自局の基準信号系がそもそも安定でなければならない。または信号がふらふらと変動しても、その変動が把握できれば良い。そこで、現在開発中のDelay-calとPhase-calシステムについて報告する。


 13.広帯域フィードの開発
   情報通信研究機構 時空標準研究室 氏原 秀樹

製作中の鹿島34m用広帯域フィード、およびアンテナ光学系にまつわる話題


 14.VLBI2010時代における国内VLBI観測のシミュレーション評価
   国土地理院 高島 和宏

国際VLBI事業(IVS)において取り組みが始まっている新しいVLBI観測仕様「VLBI2010」に関して、国土地理院においてもVLBI2010対応の観測局を茨城県石岡市に設置することが決定され、現在、建設工事が行われている。そこで、国土地理院が実施している国内VLBI観測の将来運用計画を現在検討しており、その基礎資料として、多様な観測条件設定における測地VLBI観測シミュレーションを実施した。


 15.c5++を用いた観測レベルの宇宙測地統合解析について
    情報通信研究機構 時空標準研究室 Hobiger Thomas

c5++ というマルチ宇宙測地解析ソフトウェアが開発されてきた。ひとつのソフトウェアパッケージとしての機能だけでなく,個々の地球物理・数値計算などのモジュールには最新モデルを取り込んでおり,それらを組み合わせて多様な用途に応えることができる。Global Geodetic Observing System (GGOS) のコンセプトでは、VLBI、 SLR、 GNSS などの宇宙測地技術の全ての観測技術を、観測データレベルで統合解析することを目指している。多くの現用解析ソフトウェアは観測データレベルで統合解析をサポートしていないのが現状である。しかし、c5++を用いれば、観測レベルでの宇宙測地技術の統合解析が可能になる。 さらに、local tie を観測データとして取り込みつつ、同じ地球物理モデルでマルチ技術解析を可能にする。GNSS と VLBI の場合は大気遅延とクロックのパラメータも統合解析が可能になる。しかし、VLBI と GNSS の間のオフセットも考えなければならないので、統合パラメータの推定方法を詳しく発表する。

		休憩(約10分)

!技術開発(VLBI2010(VGOS),K5およびK6)セッション (16:15〜17:20) 座長:近藤 哲朗


 16.VLBI2010アンテナの建設
   国土地理院 福崎 順洋

国土地理院では、平成23年より、VLBI2010に対応する新しいアンテナを建設する計画を開始した。アンテナ装置に関しては、現在、各部品の製造が進められており、平成25年度中には完成予定である。一方、アンテナ装置以外の機器に関してはほぼ完成している。本発表では、アンテナ装置の建設の進捗を報告するとともに、完成した機器の単体性能について、主にアナログ系機器の報告を行う。


 17.VLBI2010データ取得システムの開発
   国土地理院 栗原  忍

IVSによるVLBI2010観測システムでは、2~14GHzの信号から帯域幅1GHz、4ch、両直線偏波をデジタルデータとして取得する。アナログ周波数変換器(ビデオコンバータ)を用いる従来型データ取得システムと異なり、中間周波数(IF)のままサンプリングし、FPGAを使ったDBBCによって記録する周波数帯を取り出す。
国土地理院では、VLBI2010に対応した新たなデータ取得システムの開発を行った。本発表では、システムの概要、初期的なデータ取得の結果等について報告する。


 18.K3システムからK5システムまでの開発について
   情報通信研究機構 小山 泰弘

NICTの前々身の電波研究所では、プレート運動の実測を目指して1980年代にK3 VLBIシステムの開発が開始され、この開発を成功することによって国際的な測地VLBI実験への参加が可能になった。その後、西太平洋電波干渉計画とともにK4 VLBIシステムを開発し、2000年代からはK5 VLBIシステムの開発に取り組んできた。今後のシステム開発を検討する上での参考として、これらのシステム開発についてレビューする。

		議論(10分)    

閉会挨拶

		懇親会(18:00〜)


!お知らせ
シンポジウムへの参加費は無料です.本シンポジウムの集録として,IVS技術開発センターにおいて定期的に発行しております NICT IVS TDC Newsを発行する予定です.以下の要領で集録論文の投稿をお願いします。
 
 


1 徂徠 和夫(北大) 北海道大学苫小牧11m電波望遠鏡の全自動観測システムと観測計画([[ PDF | ./PDFs/TDC2013-Sorai.pdf ]])
2 米倉 覚則(茨城大) 茨城局(日立・高萩アンテナ)の現状([[ PDF | ./PDFs/TDC2013-Yonekura.pdf ]])
3 若杉貴浩(国土地理院)つくばVLBI観測局の現況報告~過負荷によるアンテナ基礎部の損傷~([[ PDF | ./PDFs/TDC2013-Wakasugi.pdf ]])
4 関戸 衛(NICT) 34mアンテナの復旧、GALA-Vシステム開発概要([[ PDF | ./PDFs/TDC2013-Sekido.pdf ]])

5 三好 真(天文台) きゃらばんサブミリ計画の状況([[ PDF | ./PDFs/TDC2013-Miyoshi.pdf ]])
6 朝木 義晴(JAXA) Sgr A* VLBIモニタ:定常相関処理([[ PDF | ./PDFs/TDC2013-Asaki.pdf ]])
7 竹川 俊也(慶応大) NICT鹿島?小金井基線VLBIを用いたS/X帯でのSgr A*強度モニター観測([[ PDF | ./PDFs/TDC2013-Takekawa.pdf ]])

8 鈴木駿策(天文台) 『VDIF Software Library の開発』([[ PDF | ./PDFs/TDC2013-Suzuki.pdf ]])
9 川口則幸(天文台) VLBI観測技術における基礎的な問題([[ PDF | ./PDFs/TDC2013-Kawaguchi.pdf ]])
10 鬼頭 友祐(横浜国大) VPN環境におけるPTP時刻同期精度の検証([[ PDF | ./PDFs/TDC2013-Kitou.pdf ]])
11 住田 真一(横浜国大)地上デジタルTV電波受信によるUSRP活用FX型(逆)VLBI相関処理技術の開発([[ PDF | ./PDFs/TDC2013-Sumida.pdf ]])
12 竹内 央 (JAXA)  JAXAにおけるVLBIによる軌道決定技術の開発の状況([[ PDF | ./PDFs/TDC2013-Takeuchi.pdf ]])

13 岳藤 一宏(NICT) VLBIによる高精度周波数比較へむけて([[ PDF | ./PDFs/TDC2013-Takefuji.pdf ]])
14 氏原 秀樹(NICT) 広帯域フィードの開発
15 高島 和宏(国土地理院) VLBI2010時代における国内VLBI観測のシミュレーション評価([[ PDF | ./PDFs/TDC2013-Takashima.pdf ]])
16 Hobiger Thomas(NICT) c5++を用いた観測レベルの宇宙測地統合解析について([[ PDF | ./PDFs/TDC2013-Hobiger.pdf ]])

17 福崎 順洋(国土地理院) VLBI2010アンテナの建設
18 栗原  忍(国土地理院) VLBI2010データ取得システムの開発
19 小山 泰弘(NICT) K3システムからK5システムまでの開発について([[ PDF | ./PDFs/TDC2013-Koyama.pdf ]])
    
P1 木村 公洋(大阪府大)VLBI2010用光学系の計算および広帯域クワッドリッジアンテナの近傍界測定([[ PDF | ./PDFs/TDC2013-Kimura.pdf ]])
P2 水野 いづみ(鹿児島大)偏波分光計PolariSの開発([[ PDF | ./PDFs/TDC2013-Mizuno.pdf ]])
!第12回IVS技術開発センターシンポジウム プログラム & 要旨
2013年5月30日版
[[ PDF版 | ./PDFs/12th_TDC-Sympo_ProgAbst20130530.pdf]]

平成25年6月6日(木)
情報通信研究機構 鹿島宇宙技術センター 研究本館

開催挨拶
★  発表時間は各 18 分(講演 15 分,質疑応答 3 分)ポスター紹介は 講演3分です。

アンテナシステム・観測的研究セッション I (10:00~11:12) 座長:小山 泰弘(NICT)

1.	北海道大学苫小牧11m電波望遠鏡の全自動観測システムと観測計画
 	北海道大学大学院理学研究院物理学部門 徂徠 和夫	
北海道大学苫小牧11m電波望遠鏡では,観測の効率化をはかるために全自動観測システムを整備し,今春より試験的な運用を開始した.このシステムは,予め準備しておいた観測情報を記述したファイルをもとに自動的に装置の設定と観測が行われ,降雪や強風,大気の条件が悪いなどの気象状況から観測の中断・続行を判定する.システムの紹介とともに,観測の負担軽減から発生したマンパワーをシフトさせることで目処がたったVLBI観測計画についても紹介する.

2.	茨城局(日立・高萩アンテナ)の現状
 	   茨城大学 宇宙科学教育研究センター 米倉 覚則
日立および高萩32メートルアンテナには、6-9 GHz 帯冷却受信機(Tsys~25K)2台、22 GHz 帯冷却受信機(Tsys~50K)1台が整備された。日立アンテナのポインティング精度は0.3分角程度、高萩アンテナについては現在調整中である。両アンテナとも、開口能率は6G帯において55-75%,22GHz帯において30%程度である。バックエンドは、DIR-1000テープ記録(VLBI)、K5/VSSP32(IP-VLBI,単一鏡分光観測)、K5/VSI(VLBI)、ADS1000+OCTADISK(VLBI)が整備された。光結合については整備中である。2素子干渉計用の相関器については、今年度整備予定である。

3.	つくばVLBI観測局の現況報告~過負荷によるアンテナ基礎部の損傷~
 国土地理院  若杉貴浩
国土地理院つくばVLBI観測局は、1998年の完成以降、数多くのVLBI観測を行い、IVSに貢献してきた。昨年2012年は1年間に87回の24時間観測と131回の1時間観測を実施している。一方で、高頻度な稼動によりAZレール下部に大きな負荷がかかり、磨耗して粉状となったグラウト(セメント)が噴出する現象が数年前から確認されていたが、今回その状態がかなり深刻であることが判明した。本発表では、つくばVLBI観測局の現況を報告し、ホイール&トラック形式のアンテナで起こりうるレール下部の問題について情報共有を図る。

4.	34mアンテナの復旧、GALA-Vシステム開発概要
情報通信研究機構 時空標準研究室 関戸 衛	
3月に完了した34mアンテナ震災復旧工事と、復旧後のポインティング性能等について紹介する。また、NICTのVLBIグループでは本中期計画のミッションとして遠隔地の原子時計間の周波数比較のために小型広帯域VLBI塩ステム(GALA-V)を開発中であり、その受信系・記録系のシステム概要、及び鹿島と小金井に設置されている小型アンテナの開発状況について報告する。

		休憩(約10分)

アンテナシステム・観測的研究セッション II (11:20〜12:14)座長:市川 隆一

5.	きゃらばんサブミリ計画の状況
国立天文台 三好 真
きゃらばん・サブはサブミリ波帯の大型固定局2、移動VLBI 局1の3 局を南米アンデスに展開、1~2 千kmのVLBI 短基線を実現、visibility 解析から銀河系中心ブラックホールの周囲のホライズンの世界初検出を目指すものである。さらにALMA など世界のサブミリ波望遠鏡とブラックホール近傍撮像(降着円盤、ジェット生成現場やホライズンの形状の観測)を行うことも目的とする。まずは移動VLBI 局の開発を行っている。移動局の実現にはコストダウンと軽量化が重要である。2012 年度はアンテナ製作法や移動局架台の調査を行った。へら絞り法で口径2m、rms60 ミクロン程度の鏡面を安価に製作できるめどがたった。実際のアンテナに使用できるように複合望遠鏡方式を含め、検討を進めている。移動局架台では名大佐藤研開発の栗田架台での検討をすすめている。サイトサーベイは大型固定局の設置場所と移動局の観測地点の設定に重要である。ボリビア・チャカルタヤ、ペルー・ワンカヨの大気水蒸気変動を調べ、サイト環境の評価を行った。

6.	 Sgr A* VLBIモニタ:定常相関処理
JAXA/宇宙科学研究所  朝木 義晴
昨年、天の川銀河の中心(Sgr A*)に地球質量の3倍程度のガス雲(G2)が近付いており、数ヶ月後に最接近するという報告がNatureに掲載された。当研究グループは、大学連携VLBIネットワークによるSgr A*のモニタ観測をこの2月から開始した。主要な参加機関は茨城大学(国立天文台32m望遠鏡/K帯)、岐阜大学(国立天文台11m望遠鏡/K帯)、筑波大学(国土地理院32m望遠鏡/K帯)、国立天文台水沢(10m望遠鏡/K帯)、情報通信研究機構(11m望遠鏡/SX帯)、そして宇宙研である。JAXA相模原キャンパスには情報通信研究機構のS/W相関処理プログラムを利用した全自動相関処理システムを構築し、K帯VLBIの定常相関処理を行っている。各望遠鏡からインターネット経由で転送される1時間弱の128Mbpsデータを準実時間解析し、結果は半日以内共同研究者に配信できる。ここでは、相互相関処理を中心とするモニタシステムについて詳しく報告したい。

7.	 NICT鹿島−小金井基線VLBIを用いたS/X帯でのSgr A*強度モニター観測
慶應義塾大学 	竹川 俊也
銀河系中心に位置する電波源Sgr A*は400万太陽質量の巨大ブラックホールであると考えられており、近年ドイツの研究グループによってこのブラックホールに向かって落下しつつあるガス雲G2が発見された。最新の予測ではSgr A*にG2が最接近するのは来年3月とされている。G2の落下に伴いSgr A*の電波増光が期待されており、私はこの増光を捉えるために今年2月からNICT鹿島−小金井基線VLBIを用いてS/X帯での強度モニター観測を行っている。今のところ大きな光度変動は確認されていない。今後とも何かが起きることを楽しみに観測を継続していく予定である。

	ポスター紹介 (12:14-12:24)

P1. VLBI2010用光学系の計算および広帯域クワッドリッジアンテナの近傍界測定
        大阪府立大学 木村 公洋
測地観測用次世代VLBIシステムの標準仕様である「VLBI2010」では、2-14GHzの広帯域 受信を採用することを規定している。これを実現するために、クワッドリッジアンテナを一次放射器として用いることが計 画されており、例えば、国土地理院では、VLBI2010用に、クワッドリッジアンテナを用いることを検討している。更に、それに 対応する反射鏡アンテナとして、口径13.2mのリングフォーカスタイプの光学系の開発を進めている。そこで私たちは、一次放射器であるクワッドリッジアンテナの放射パターンを近傍界 測定装置を用いて測定し、また加えて、一次放射器を組み込んだ、リングフォーカスアンテナの放射パターンについても計算した。

P2.  偏波分光計PolariSの開発
        鹿児島大学 水野 いずみ
偏波分光計PolariSを、星形成領域の磁場強度を計測する目的で開発した。CCS分子輝線のZeeman効果で100μGの磁場を計測するためには、 (1)両偏波の受信信号を入力してFull Stokes (I, Q, U, V)を出力する、 (2)61 Hzの周波数分解能を得るという仕様が要求される。VLBI用に開発されたA/D変換器K5/VSSP32で量子したデジタル化した信号をUSBでLinux計算機に取り込み、GPUでFFT演算するシステムを設計し、約60万円の費用で実現した。本ポスターではPolariSのシステム概要と得られた検証結果を報告する。

E1.  展示品(VGOS観測用 受信機・記録装置)の紹介
        国土地理院   福崎 順洋

		集合写真撮影(12:25-30 研究本館前にて)
		ポスターセッション(お昼休み:12:30-13:30)

技術開発(相関処理・データ処理技術)セッション(13:30〜15:00) 座長 氏原 秀樹

8.	 『VDIF Software Library の開発』
    国立天文台 水沢VLBI観測所 開発部門 鈴木駿策
VDIF Software Library の中の一つである、VSRECの開発に成功した。VSREC(VDIF Software ECorder)により、8Gbpsのデータを45700秒間連続記録し、パケットロス0で記録を終了した。十数回記録試験を行ったがパケットロス0記録を日々更新し、安定に動作している状況である。この開発に成功した状況および今後の展開内容を報告する。

9.	 VLBI観測技術における基礎的な問題
国立天文台 川口則幸
VLBI観測にまつわる基礎的な技術問題についての議論を行う。トピックスは
   (1)基線ベクトルの定義
   (2)フェーズアップについて
   (3)スピルオーバーについて
   (4)偏波分離器について
の4課題を取り上げ、問題点を指摘する。

10.	 VPN環境におけるPTP時刻同期精度の検証
横浜国立大学大学院 工学府 物理情報工学専攻 高橋研究室 鬼頭 友祐
現代には数多の機器・システムが時刻情報を利用している.中でも,電子商取引や、LTEなどの高速無線通信では、μsec以上の精度での時刻同期が求められている。現在の主要な時刻同期法であるNTPの同期精度がmsecである一方、新たな時刻同期プロトコルであるPTPではnsecに達すると言われている.本研究は、VPN環境下でのPTPによる時刻同期においてクロックの差異や通信遅延時間が時刻同期精度にどのような影響を齎すかを検証したものである。

11.	 地上デジタルTV電波受信によるUSRP活用FX型(逆)VLBI相関処理技術の開発
横浜国立大学大学院 工学府 物理情報工学専攻 高橋研究室 住田 真一
21世紀現在時空情報の正当性が求められるケースが増えてきている。しかし現行の測位システムでは、屋内外の全ての空間を単独でカバーすることはできず、組み合わせた利用が必要になっている。地上波デジタル放送電波を用いることで測位システムをカバーするというのが本研究の提案である。結果としてUSRPとcudaGPU技術を用いて相関が取れたことかつ安定した遅延時間が求められたことから地上デジタル放送電波が時空情報正当性検証技術の一つとして有効であることが確認できた。また、地デジ信号の東京タワー・スカイツリーの切替時の相関データの取得にも成功した。

12.	 JAXAにおけるVLBIによる軌道決定技術の開発の状況
JAXA/宇宙科学研究所 竹内 央
JAXAではVLBI技術を用いた深宇宙軌道決定(Delta-DOR)技術の開発を進めている。はやぶさ2やベピコロンボ等のJAXAのミッションのみならず、海外の深宇宙ミッションに対する日本局の貢献も期待されおり、JPL,ESAとの間で国際的な共同観測のための標準規格の策定が進められている。本公演ではこれらの活動における開発の進捗状況について報告する。
		休憩(約5分)

技術開発(VLBI2010-GALAV)セッション (15:05 〜16:17) 座長:岳藤 一宏

13.	VLBIによる高精度周波数比較へむけて
     情報通信研究機構 時空標準研究室 岳藤 一宏
VLBIをもちいて遠隔地の基準信号の周波数比較をおこなうには、自局の基準信号系がそもそも安定でなければならない。または信号がふらふらと変動しても、その変動が把握できれば良い。そこで、現在開発中のDelay-calとPhase-calシステムについて報告する。

14.	 広帯域フィードの開発
情報通信研究機構 時空標準研究室 氏原 秀樹
製作中の鹿島34m用広帯域フィード、およびアンテナ光学系にまつわる話題

15.	 VLBI2010時代における国内VLBI観測のシミュレーション評価
国土地理院 高島 和宏
国際VLBI事業(IVS)において取り組みが始まっている新しいVLBI観測仕様「VLBI2010」に関して、国土地理院においてもVLBI2010対応の観測局を茨城県石岡市に設置することが決定され、現在、建設工事が行われている。そこで、国土地理院が実施している国内VLBI観測の将来運用計画を現在検討しており、その基礎資料として、多様な観測条件設定における測地VLBI観測シミュレーションを実施した。

16.	 c5++を用いた観測レベルの宇宙測地統合解析について
      情報通信研究機構 時空標準研究室 Hobiger Thomas
c5++ というマルチ宇宙測地解析ソフトウェアが開発されてきた。ひとつのソフトウェアパッケージとしての機能だけでなく,個々の地球物理・数値計算などのモジュールには最新モデルを取り込んでおり,それらを組み合わせて多様な用途に応えることができる。Global Geodetic Observing System (GGOS) のコンセプトでは、VLBI、 SLR、 GNSS などの宇宙測地技術の全ての観測技術を、観測データレベルで統合解析することを目指している。多くの現用解析ソフトウェアは観測データレベルで統合解析をサポートしていないのが現状である。しかし、c5++を用いれば、観測レベルでの宇宙測地技術の統合解析が可能になる。 さらに、local tie を観測データとして取り込みつつ、同じ地球物理モデルでマルチ技術解析を可能にする。GNSS と VLBI の場合は大気遅延とクロックのパラメータも統合解析が可能になる。しかし、VLBI と GNSS の間のオフセットも考えなければならないので、統合パラメータの推定方法を詳しく発表する。
		休憩(約5分)

技術開発(VLBI2010(VGOS),K5およびK6)セッション (16:15〜17:20) 座長:近藤 哲朗

17.	 VLBI2010アンテナの建設
国土地理院 福崎 順洋
国土地理院では、平成23年より、VLBI2010に対応する新しいアンテナを建設する計画を開始した。アンテナ装置に関しては、現在、各部品の製造が進められており、平成25年度中には完成予定である。一方、アンテナ装置以外の機器に関してはほぼ完成している。本発表では、アンテナ装置の建設の進捗を報告するとともに、完成した機器の単体性能について、主にアナログ系機器の報告を行う。

18.	 VLBI2010データ取得システムの開発
国土地理院 栗原  忍
IVSによるVLBI2010観測システムでは、2~14GHzの信号から帯域幅1GHz、4ch、両直線偏波をデジタルデータとして取得する。アナログ周波数変換器(ビデオコンバータ)を用いる従来型データ取得システムと異なり、中間周波数(IF)のままサンプリングし、FPGAを使ったDBBCによって記録する周波数帯を取り出す。
国土地理院では、VLBI2010に対応した新たなデータ取得システムの開発を行った。本発表では、システムの概要、初期的なデータ取得の結果等について報告する。

19.	 K3システムからK5システムまでの開発について
情報通信研究機構 小山 泰弘
NICTの前々身の電波研究所では、プレート運動の実測を目指して1980年代にK3 VLBIシステムの開発が開始され、この開発を成功することによって国際的な測地VLBI実験への参加が可能になった。その後、西太平洋電波干渉計画とともにK4 VLBIシステムを開発し、2000年代からはK5 VLBIシステムの開発に取り組んできた。今後のシステム開発を検討する上での参考として、これらのシステム開発についてレビューする。

		議論(10分)    
閉会挨拶

		懇親会(18:00〜)


お知らせ
シンポジウムへの参加費は無料です.本シンポジウムの集録として,IVS技術開発センターにおいて定期的に発行しております NICT IVS TDC Newsを発行する予定です.以下の要領で集録論文の投稿をお願いします。
 
 


<html><img src="./image/teishutsu.png"><br><br></html>
 
!@@講演発表申込み方法@@
以下の申込書に必要事項をご記入の上世話人の関戸 , 武江までメールでお申し込みください。
その際、件名に「TDCシンポジウム申し込み」と記載頂けると大変助かります。


世話人:情報通信研究機構鹿島宇宙技術センター
    〒314-8501 茨城県鹿嶋市平井 893-1
    関戸 衛 , 武江 美和
    E-mail:Conf-Sewanin(AT)kakusan.nict.go.jp

!講演発表申し込み締め切り: @@color(Red):平成25年5月24日(金)@@
----
第12回IVS技術開発センターシンポジウム 講演発表申込書

・氏名 :
・所属 :
・宿泊電話 :
・e-mail :
・講演題目:
・発表者 :
・要旨(200字程度):



・懇親会参加:  可 : 不可 (参加費未定:2000円程度)
・昼食の注文(350円): 定食:麺類:カレー 
・ゲストハウス宿泊が必要の場合: 宿泊日 

----
本日時点で既に12件ほどの申し込みを頂いておりますが、まだ少し余裕ありますので、@@color(Red):締め切りを2月20日まで延長致します。@@
MarkupPostHead: "This tiddler is inserted at the bottom of the section of the TiddlyWiki HTML file", MarkupPreBody: "This tiddler is inserted at the top of the section of the TiddlyWiki HTML file", MarkupPostBody: "This tiddler is inserted at the end of the section of the TiddlyWiki HTML file immediately after the script block", OptionsPanel: "This shadow tiddler is used as the contents of the options panel slider in the right-hand sidebar", PageTemplate: "The HTML template in this shadow tiddler determines the overall ~TiddlyWiki layout", PluginManager: "This shadow tiddler provides access to the plugin manager", SideBarOptions: "This shadow tiddler is used as the contents of the option panel in the right-hand sidebar", SideBarTabs: "This shadow tiddler is used as the contents of the tabs panel in the right-hand sidebar", SiteSubtitle: "This shadow tiddler is used as the second part of the page title", SiteTitle: "This shadow tiddler is used as the first part of the page title", SiteUrl: "This shadow tiddler should be set to the full target URL for publication", StyleSheetColors: "This shadow tiddler contains CSS definitions related to the color of page elements. ''DO NOT EDIT THIS TIDDLER'', instead make your changes in the StyleSheet shadow tiddler", StyleSheet: "This tiddler can contain custom CSS definitions", StyleSheetLayout: "This shadow tiddler contains CSS definitions related to the layout of page elements. ''DO NOT EDIT THIS TIDDLER'', instead make your changes in the StyleSheet shadow tiddler", StyleSheetLocale: "This shadow tiddler contains CSS definitions related to the translation locale", StyleSheetPrint: "This shadow tiddler contains CSS definitions for printing", TabAll: "This shadow tiddler contains the contents of the 'All' tab in the right-hand sidebar", TabMore: "This shadow tiddler contains the contents of the 'More' tab in the right-hand sidebar", TabMoreMissing: "This shadow tiddler contains the contents of the 'Missing' tab in the right-hand sidebar", TabMoreOrphans: "This shadow tiddler contains the contents of the 'Orphans' tab in the right-hand sidebar", TabMoreShadowed: "This shadow tiddler contains the contents of the 'Shadowed' tab in the right-hand sidebar", TabTags: "This shadow tiddler contains the contents of the 'Tags' tab in the right-hand sidebar", TabTimeline: "This shadow tiddler contains the contents of the 'Timeline' tab in the right-hand sidebar", ToolbarCommands: "This shadow tiddler determines which commands are shown in tiddler toolbars", ViewTemplate: "The HTML template in this shadow tiddler determines how tiddlers look" }); //-- //-- Main //-- var params = null; // Command line parameters var store = null; // TiddlyWiki storage var story = null; // Main story var formatter = null; // Default formatters for the wikifier var anim = typeof Animator == "function" ? new Animator() : null; // Animation engine var readOnly = false; // Whether we're in readonly mode var highlightHack = null; // Embarrassing hack department... var hadConfirmExit = false; // Don't warn more than once var safeMode = false; // Disable all plugins and cookies var showBackstage; // Whether to include the backstage area var installedPlugins = []; // Information filled in when plugins are executed var startingUp = false; // Whether we're in the process of starting up var pluginInfo,tiddler; // Used to pass information to plugins in loadPlugins() // Whether to use the JavaSaver applet var useJavaSaver = (config.browser.isSafari || config.browser.isOpera) && (document.location.toString().substr(0,4) != "http"); // Starting up function main() { var t10,t9,t8,t7,t6,t5,t4,t3,t2,t1,t0 = new Date(); startingUp = true; jQuery.noConflict(); window.onbeforeunload = function(e) {if(window.confirmExit) return confirmExit();}; params = getParameters(); if(params) params = params.parseParams("open",null,false); store = new TiddlyWiki(); invokeParamifier(params,"oninit"); story = new Story("tiddlerDisplay","tiddler"); addEvent(document,"click",Popup.onDocumentClick); saveTest(); loadOptionsCookie(); for(var s=0; s 0) { plugin.log.push(config.messages.pluginVersionError); return false; } } return true; } function isPluginEnabled(plugin) { if(plugin.tiddler.isTagged("systemConfigDisable")) { plugin.log.push(config.messages.pluginDisabled); return false; } return true; } function invokeMacro(place,macro,params,wikifier,tiddler) { try { var m = config.macros[macro]; if(m && m.handler) { var tiddlerElem = story.findContainingTiddler(place); window.tiddler = tiddlerElem ? store.getTiddler(tiddlerElem.getAttribute("tiddler")) : null; window.place = place; m.handler(place,macro,params.readMacroParams(),wikifier,params,tiddler); } else { createTiddlyError(place,config.messages.macroError.format([macro]),config.messages.macroErrorDetails.format([macro,config.messages.missingMacro])); } } catch(ex) { createTiddlyError(place,config.messages.macroError.format([macro]),config.messages.macroErrorDetails.format([macro,ex.toString()])); } } //-- //-- Paramifiers //-- function getParameters() { var p = null; if(window.location.hash) { p = decodeURIComponent(window.location.hash.substr(1)); if(config.browser.firefoxDate != null && config.browser.firefoxDate[1] < "20051111") p = convertUTF8ToUnicode(p); } return p; } function invokeParamifier(params,handler) { if(!params || params.length == undefined || params.length <= 1) return; for(var i=1; i") { // Colspan colSpanCount++; w.nextMatch = this.cellRegExp.lastIndex-1; } else if(cellMatch[2]) { // End of row if(prevCell && colSpanCount > 1) { prevCell.setAttribute("colspan",colSpanCount); prevCell.setAttribute("colSpan",colSpanCount); // Needed for IE } w.nextMatch = this.cellRegExp.lastIndex; break; } else { // Cell w.nextMatch++; var styles = config.formatterHelpers.inlineCssHelper(w); var spaceLeft = false; var chr = w.source.substr(w.nextMatch,1); while(chr == " ") { spaceLeft = true; w.nextMatch++; chr = w.source.substr(w.nextMatch,1); } var cell; if(chr == "!") { cell = createTiddlyElement(e,"th"); w.nextMatch++; } else { cell = createTiddlyElement(e,"td"); } prevCell = cell; prevColumns[col] = {rowSpanCount:1,element:cell}; if(colSpanCount > 1) { cell.setAttribute("colspan",colSpanCount); cell.setAttribute("colSpan",colSpanCount); // Needed for IE colSpanCount = 1; } config.formatterHelpers.applyCssHelper(cell,styles); w.subWikifyTerm(cell,this.cellTermRegExp); if(w.matchText.substr(w.matchText.length-2,1) == " ") // spaceRight cell.align = spaceLeft ? "center" : "left"; else if(spaceLeft) cell.align = "right"; w.nextMatch--; } col++; this.cellRegExp.lastIndex = w.nextMatch; cellMatch = this.cellRegExp.exec(w.source); } } }, { name: "heading", match: "^!{1,6}", termRegExp: /(\n)/mg, handler: function(w) { w.subWikifyTerm(createTiddlyElement(w.output,"h" + w.matchLength),this.termRegExp); } }, { name: "list", match: "^(?:[\\*#;:]+)", lookaheadRegExp: /^(?:(?:(\*)|(#)|(;)|(:))+)/mg, termRegExp: /(\n)/mg, handler: function(w) { var stack = [w.output]; var currLevel = 0, currType = null; var listLevel, listType, itemType, baseType; w.nextMatch = w.matchStart; this.lookaheadRegExp.lastIndex = w.nextMatch; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) { if(lookaheadMatch[1]) { listType = "ul"; itemType = "li"; } else if(lookaheadMatch[2]) { listType = "ol"; itemType = "li"; } else if(lookaheadMatch[3]) { listType = "dl"; itemType = "dt"; } else if(lookaheadMatch[4]) { listType = "dl"; itemType = "dd"; } if(!baseType) baseType = listType; listLevel = lookaheadMatch[0].length; w.nextMatch += lookaheadMatch[0].length; var t; if(listLevel > currLevel) { for(t=currLevel; tlistLevel; t--) stack.pop(); } else if(listLevel == currLevel && listType != currType) { stack.pop(); stack.push(createTiddlyElement(stack[stack.length-1].lastChild,listType)); } currLevel = listLevel; currType = listType; var e = createTiddlyElement(stack[stack.length-1],itemType); w.subWikifyTerm(e,this.termRegExp); this.lookaheadRegExp.lastIndex = w.nextMatch; lookaheadMatch = this.lookaheadRegExp.exec(w.source); } } }, { name: "quoteByBlock", match: "^<<<\\n", termRegExp: /(^<<<(\n|$))/mg, element: "blockquote", handler: config.formatterHelpers.createElementAndWikify }, { name: "quoteByLine", match: "^>+", lookaheadRegExp: /^>+/mg, termRegExp: /(\n)/mg, element: "blockquote", handler: function(w) { var stack = [w.output]; var currLevel = 0; var newLevel = w.matchLength; var t; do { if(newLevel > currLevel) { for(t=currLevel; tnewLevel; t--) stack.pop(); } currLevel = newLevel; w.subWikifyTerm(stack[stack.length-1],this.termRegExp); createTiddlyElement(stack[stack.length-1],"br"); this.lookaheadRegExp.lastIndex = w.nextMatch; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); var matched = lookaheadMatch && lookaheadMatch.index == w.nextMatch; if(matched) { newLevel = lookaheadMatch[0].length; w.nextMatch += lookaheadMatch[0].length; } } while(matched); } }, { name: "rule", match: "^----+$\\n?|
\\n?", handler: function(w) { createTiddlyElement(w.output,"hr"); } }, { name: "monospacedByLine", match: "^(?:/\\*\\{\\{\\{\\*/|\\{\\{\\{|//\\{\\{\\{|)\\n", element: "pre", handler: function(w) { switch(w.matchText) { case "/*{{{*/\n": // CSS this.lookaheadRegExp = /\/\*\{\{\{\*\/\n*((?:^[^\n]*\n)+?)(\n*^\/\*\}\}\}\*\/$\n?)/mg; break; case "{{{\n": // monospaced block this.lookaheadRegExp = /^\{\{\{\n((?:^[^\n]*\n)+?)(^\}\}\}$\n?)/mg; break; case "//{{{\n": // plugin this.lookaheadRegExp = /^\/\/\{\{\{\n\n*((?:^[^\n]*\n)+?)(\n*^\/\/\}\}\}$\n?)/mg; break; case "\n": //template this.lookaheadRegExp = /\n*((?:^[^\n]*\n)+?)(\n*^$\n?)/mg; break; default: break; } config.formatterHelpers.enclosedTextHelper.call(this,w); } }, { name: "wikifyComment", match: "^(?:/\\*\\*\\*|\n)/mg); w.subWikifyTerm(w.output,termRegExp); } }, { name: "macro", match: "<<", lookaheadRegExp: /<<([^>\s]+)(?:\s*)((?:[^>]|(?:>(?!>)))*)>>/mg, handler: function(w) { this.lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[1]) { w.nextMatch = this.lookaheadRegExp.lastIndex; invokeMacro(w.output,lookaheadMatch[1],lookaheadMatch[2],w,w.tiddler); } } }, { name: "prettyLink", match: "\\[\\[", lookaheadRegExp: /\[\[(.*?)(?:\|(~)?(.*?))?\]\]/mg, handler: function(w) { this.lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart) { var e; var text = lookaheadMatch[1]; if(lookaheadMatch[3]) { // Pretty bracketted link var link = lookaheadMatch[3]; e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link)) ? createExternalLink(w.output,link) : createTiddlyLink(w.output,decodeURIComponent(link),false,null,w.isStatic,w.tiddler); } else { // Simple bracketted link e = createTiddlyLink(w.output,decodeURIComponent(text),false,null,w.isStatic,w.tiddler); } createTiddlyText(e,text); w.nextMatch = this.lookaheadRegExp.lastIndex; } } }, { name: "wikiLink", match: config.textPrimitives.unWikiLink+"?"+config.textPrimitives.wikiLink, handler: function(w) { if(w.matchText.substr(0,1) == config.textPrimitives.unWikiLink) { w.outputText(w.output,w.matchStart+1,w.nextMatch); return; } if(w.matchStart > 0) { var preRegExp = new RegExp(config.textPrimitives.anyLetterStrict,"mg"); preRegExp.lastIndex = w.matchStart-1; var preMatch = preRegExp.exec(w.source); if(preMatch.index == w.matchStart-1) { w.outputText(w.output,w.matchStart,w.nextMatch); return; } } if(w.autoLinkWikiWords || store.isShadowTiddler(w.matchText)) { var link = createTiddlyLink(w.output,w.matchText,false,null,w.isStatic,w.tiddler); w.outputText(link,w.matchStart,w.nextMatch); } else { w.outputText(w.output,w.matchStart,w.nextMatch); } } }, { name: "urlLink", match: config.textPrimitives.urlPattern, handler: function(w) { w.outputText(createExternalLink(w.output,w.matchText),w.matchStart,w.nextMatch); } }, { name: "image", match: "\\[[<>]?[Ii][Mm][Gg]\\[", lookaheadRegExp: /\[([<]?)(>?)[Ii][Mm][Gg]\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg, handler: function(w) { this.lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart) { var e = w.output; if(lookaheadMatch[5]) { var link = lookaheadMatch[5]; e = config.formatterHelpers.isExternalLink(link) ? createExternalLink(w.output,link) : createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler); addClass(e,"imageLink"); } var img = createTiddlyElement(e,"img"); if(lookaheadMatch[1]) img.align = "left"; else if(lookaheadMatch[2]) img.align = "right"; if(lookaheadMatch[3]) { img.title = lookaheadMatch[3]; img.setAttribute("alt",lookaheadMatch[3]); } img.src = lookaheadMatch[4]; w.nextMatch = this.lookaheadRegExp.lastIndex; } } }, { name: "html", match: "<[Hh][Tt][Mm][Ll]>", lookaheadRegExp: /<[Hh][Tt][Mm][Ll]>((?:.|\n)*?)<\/[Hh][Tt][Mm][Ll]>/mg, handler: function(w) { this.lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart) { createTiddlyElement(w.output,"span").innerHTML = lookaheadMatch[1]; w.nextMatch = this.lookaheadRegExp.lastIndex; } } }, { name: "commentByBlock", match: "/%", lookaheadRegExp: /\/%((?:.|\n)*?)%\//mg, handler: function(w) { this.lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart) w.nextMatch = this.lookaheadRegExp.lastIndex; } }, { name: "characterFormat", match: "''|//|__|\\^\\^|~~|--(?!\\s|$)|\\{\\{\\{", handler: function(w) { switch(w.matchText) { case "''": w.subWikifyTerm(w.output.appendChild(document.createElement("strong")),/('')/mg); break; case "//": w.subWikifyTerm(createTiddlyElement(w.output,"em"),/(\/\/)/mg); break; case "__": w.subWikifyTerm(createTiddlyElement(w.output,"u"),/(__)/mg); break; case "^^": w.subWikifyTerm(createTiddlyElement(w.output,"sup"),/(\^\^)/mg); break; case "~~": w.subWikifyTerm(createTiddlyElement(w.output,"sub"),/(~~)/mg); break; case "--": w.subWikifyTerm(createTiddlyElement(w.output,"strike"),/(--)/mg); break; case "{{{": var lookaheadRegExp = /\{\{\{((?:.|\n)*?)\}\}\}/mg; lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart) { createTiddlyElement(w.output,"code",null,null,lookaheadMatch[1]); w.nextMatch = lookaheadRegExp.lastIndex; } break; } } }, { name: "customFormat", match: "@@|\\{\\{", handler: function(w) { switch(w.matchText) { case "@@": var e = createTiddlyElement(w.output,"span"); var styles = config.formatterHelpers.inlineCssHelper(w); if(styles.length == 0) e.className = "marked"; else config.formatterHelpers.applyCssHelper(e,styles); w.subWikifyTerm(e,/(@@)/mg); break; case "{{": var lookaheadRegExp = /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg; lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = lookaheadRegExp.exec(w.source); if(lookaheadMatch) { w.nextMatch = lookaheadRegExp.lastIndex; e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]); w.subWikifyTerm(e,/(\}\}\})/mg); } break; } } }, { name: "mdash", match: "--", handler: function(w) { createTiddlyElement(w.output,"span").innerHTML = "—"; } }, { name: "lineBreak", match: "\\n|
", handler: function(w) { createTiddlyElement(w.output,"br"); } }, { name: "rawText", match: "\"{3}|", lookaheadRegExp: /(?:\"{3}|)((?:.|\n)*?)(?:\"{3}|<\/nowiki>)/mg, handler: function(w) { this.lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = this.lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart) { createTiddlyElement(w.output,"span",null,null,lookaheadMatch[1]); w.nextMatch = this.lookaheadRegExp.lastIndex; } } }, { name: "htmlEntitiesEncoding", match: "(?:(?:&#?[a-zA-Z0-9]{2,8};|.)(?:&#?(?:x0*(?:3[0-6][0-9a-fA-F]|1D[c-fC-F][0-9a-fA-F]|20[d-fD-F][0-9a-fA-F]|FE2[0-9a-fA-F])|0*(?:76[89]|7[7-9][0-9]|8[0-7][0-9]|761[6-9]|76[2-7][0-9]|84[0-3][0-9]|844[0-7]|6505[6-9]|6506[0-9]|6507[0-1]));)+|&#?[a-zA-Z0-9]{2,8};)", handler: function(w) { createTiddlyElement(w.output,"span").innerHTML = w.matchText; } } ]; //-- //-- Wikifier //-- function getParser(tiddler,format) { if(tiddler) { if(!format) format = tiddler.fields["wikiformat"]; var i; if(format) { for(i in config.parsers) { if(format == config.parsers[i].format) return config.parsers[i]; } } else { for(i in config.parsers) { if(tiddler.isTagged(config.parsers[i].formatTag)) return config.parsers[i]; } } } return formatter; } function wikify(source,output,highlightRegExp,tiddler) { if(source) { var wikifier = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler); var t0 = new Date(); wikifier.subWikify(output); if(tiddler && config.options.chkDisplayInstrumentation) displayMessage("wikify:" +tiddler.title+ " in " + (new Date()-t0) + " ms"); } } function wikifyStatic(source,highlightRegExp,tiddler,format) { var e = createTiddlyElement(document.body,"pre"); e.style.display = "none"; var html = ""; if(source && source != "") { if(!tiddler) tiddler = new Tiddler("temp"); var wikifier = new Wikifier(source,getParser(tiddler,format),highlightRegExp,tiddler); wikifier.isStatic = true; wikifier.subWikify(e); html = e.innerHTML; removeNode(e); } return html; } function wikifyPlain(title,theStore,limit) { if(!theStore) theStore = store; if(theStore.tiddlerExists(title) || theStore.isShadowTiddler(title)) { return wikifyPlainText(theStore.getTiddlerText(title),limit,tiddler); } else { return ""; } } function wikifyPlainText(text,limit,tiddler) { if(limit > 0) text = text.substr(0,limit); var wikifier = new Wikifier(text,formatter,null,tiddler); return wikifier.wikifyPlain(); } function highlightify(source,output,highlightRegExp,tiddler) { if(source) { var wikifier = new Wikifier(source,formatter,highlightRegExp,tiddler); wikifier.outputText(output,0,source.length); } } function Wikifier(source,formatter,highlightRegExp,tiddler) { this.source = source; this.output = null; this.formatter = formatter; this.nextMatch = 0; this.autoLinkWikiWords = tiddler && tiddler.autoLinkWikiWords() == false ? false : true; this.highlightRegExp = highlightRegExp; this.highlightMatch = null; this.isStatic = false; if(highlightRegExp) { highlightRegExp.lastIndex = 0; this.highlightMatch = highlightRegExp.exec(source); } this.tiddler = tiddler; } Wikifier.prototype.wikifyPlain = function() { var e = createTiddlyElement(document.body,"div"); e.style.display = "none"; this.subWikify(e); var text = getPlainText(e); removeNode(e); return text; }; Wikifier.prototype.subWikify = function(output,terminator) { try { if(terminator) this.subWikifyTerm(output,new RegExp("(" + terminator + ")","mg")); else this.subWikifyUnterm(output); } catch(ex) { showException(ex); } }; Wikifier.prototype.subWikifyUnterm = function(output) { var oldOutput = this.output; this.output = output; this.formatter.formatterRegExp.lastIndex = this.nextMatch; var formatterMatch = this.formatter.formatterRegExp.exec(this.source); while(formatterMatch) { // Output any text before the match if(formatterMatch.index > this.nextMatch) this.outputText(this.output,this.nextMatch,formatterMatch.index); // Set the match parameters for the handler this.matchStart = formatterMatch.index; this.matchLength = formatterMatch[0].length; this.matchText = formatterMatch[0]; this.nextMatch = this.formatter.formatterRegExp.lastIndex; for(var t=1; t this.nextMatch) this.outputText(this.output,this.nextMatch,terminatorMatch.index); this.matchText = terminatorMatch[1]; this.matchLength = terminatorMatch[1].length; this.matchStart = terminatorMatch.index; this.nextMatch = this.matchStart + this.matchLength; this.output = oldOutput; return; } if(formatterMatch.index > this.nextMatch) this.outputText(this.output,this.nextMatch,formatterMatch.index); this.matchStart = formatterMatch.index; this.matchLength = formatterMatch[0].length; this.matchText = formatterMatch[0]; this.nextMatch = this.formatter.formatterRegExp.lastIndex; for(var t=1; t startPos) && (this.highlightMatch.index < endPos) && (startPos < endPos)) { if(this.highlightMatch.index > startPos) { createTiddlyText(place,this.source.substring(startPos,this.highlightMatch.index)); startPos = this.highlightMatch.index; } var highlightEnd = Math.min(this.highlightRegExp.lastIndex,endPos); var theHighlight = createTiddlyElement(place,"span",null,"highlight",this.source.substring(startPos,highlightEnd)); startPos = highlightEnd; if(startPos >= this.highlightRegExp.lastIndex) this.highlightMatch = this.highlightRegExp.exec(this.source); } if(startPos < endPos) { createTiddlyText(place,this.source.substring(startPos,endPos)); } }; //-- //-- Macro definitions //-- config.macros.today.handler = function(place,macroName,params) { var now = new Date(); var text = params[0] ? now.formatString(params[0].trim()) : now.toLocaleString(); jQuery("").text(text).appendTo(place); }; config.macros.version.handler = function(place) { jQuery("").text(formatVersion()).appendTo(place); }; config.macros.list.handler = function(place,macroName,params) { var type = params[0] || "all"; var list = document.createElement("ul"); place.appendChild(list); if(this[type].prompt) createTiddlyElement(list,"li",null,"listTitle",this[type].prompt); var results; if(this[type].handler) results = this[type].handler(params); for(var t = 0; t < results.length; t++) { var li = document.createElement("li"); list.appendChild(li); createTiddlyLink(li,typeof results[t] == "string" ? results[t] : results[t].title,true); } }; config.macros.list.all.handler = function(params) { return store.reverseLookup("tags","excludeLists",false,"title"); }; config.macros.list.missing.handler = function(params) { return store.getMissingLinks(); }; config.macros.list.orphans.handler = function(params) { return store.getOrphans(); }; config.macros.list.shadowed.handler = function(params) { return store.getShadowed(); }; config.macros.list.touched.handler = function(params) { return store.getTouched(); }; config.macros.list.filter.handler = function(params) { var filter = params[1]; var results = []; if(filter) { var tiddlers = store.filterTiddlers(filter); for(var t=0; t=last; t--) { var tiddler = tiddlers[t]; var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8); if(theDay != lastDay) { var ul = document.createElement("ul"); place.appendChild(ul); createTiddlyElement(ul,"li",null,"listTitle",tiddler[field].formatString(dateFormat)); lastDay = theDay; } createTiddlyElement(ul,"li",null,"listLink").appendChild(createTiddlyLink(place,tiddler.title,true)); } }; config.macros.tiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) { params = paramString.parseParams("name",null,true,false,true); var names = params[0]["name"]; var tiddlerName = names[0]; var className = names[1] || null; var args = params[0]["with"]; var wrapper = createTiddlyElement(place,"span",null,className); if(!args) { wrapper.setAttribute("refresh","content"); wrapper.setAttribute("tiddler",tiddlerName); } var text = store.getTiddlerText(tiddlerName); if(text) { var stack = config.macros.tiddler.tiddlerStack; if(stack.indexOf(tiddlerName) !== -1) return; stack.push(tiddlerName); try { var n = args ? Math.min(args.length,9) : 0; for(var i=0; i> config.macros.gradient.handler = function(place,macroName,params,wikifier,paramString,tiddler) { var panel = wikifier ? createTiddlyElement(place,"div",null,"gradient") : place; panel.style.position = "relative"; panel.style.overflow = "hidden"; panel.style.zIndex = "0"; if(wikifier) { var styles = config.formatterHelpers.inlineCssHelper(wikifier); config.formatterHelpers.applyCssHelper(panel,styles); } params = paramString.parseParams("color"); var locolors = [], hicolors = []; for(var t=2; t>"); if(document.all) { panel.style.height = "100%"; panel.style.width = "100%"; } }; config.macros.message.handler = function(place,macroName,params) { if(params[0]) { var names = params[0].split("."); var lookupMessage = function(root,nameIndex) { if(names[nameIndex] in root) { if(nameIndex < names.length-1) return (lookupMessage(root[names[nameIndex]],nameIndex+1)); else return root[names[nameIndex]]; } else return null; }; var m = lookupMessage(config,0); if(m == null) m = lookupMessage(window,0); createTiddlyText(place,m.toString().format(params.splice(1))); } }; config.macros.view.views = { text: function(value,place,params,wikifier,paramString,tiddler) { highlightify(value,place,highlightHack,tiddler); }, link: function(value,place,params,wikifier,paramString,tiddler) { createTiddlyLink(place,value,true); }, wikified: function(value,place,params,wikifier,paramString,tiddler) { if(params[2]) value=params[2].unescapeLineBreaks().format([value]); wikify(value,place,highlightHack,tiddler); }, date: function(value,place,params,wikifier,paramString,tiddler) { value = Date.convertFromYYYYMMDDHHMM(value); createTiddlyText(place,value.formatString(params[2] ? params[2] : config.views.wikified.dateFormat)); } }; config.macros.view.handler = function(place,macroName,params,wikifier,paramString,tiddler) { if((tiddler instanceof Tiddler) && params[0]) { var value = store.getValue(tiddler,params[0]); if(value) { var type = params[1] || config.macros.view.defaultView; var handler = config.macros.view.views[type]; if(handler) handler(value,place,params,wikifier,paramString,tiddler); } } }; config.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler) { var field = params[0]; var rows = params[1] || 0; var defVal = params[2] || ''; if((tiddler instanceof Tiddler) && field) { story.setDirty(tiddler.title,true); var e,v; if(field != "text" && !rows) { e = createTiddlyElement(null,"input"); if(tiddler.isReadOnly()) e.setAttribute("readOnly","readOnly"); e.setAttribute("edit",field); e.setAttribute("type","text"); e.value = store.getValue(tiddler,field) || defVal; e.setAttribute("size","40"); e.setAttribute("autocomplete","off"); place.appendChild(e); } else { var wrapper1 = createTiddlyElement(null,"fieldset",null,"fieldsetFix"); var wrapper2 = createTiddlyElement(wrapper1,"div"); e = createTiddlyElement(wrapper2,"textarea"); if(tiddler.isReadOnly()) e.setAttribute("readOnly","readOnly"); e.value = v = store.getValue(tiddler,field) || defVal; rows = rows || 10; var lines = v.match(/\n/mg); var maxLines = Math.max(parseInt(config.options.txtMaxEditRows),5); if(lines != null && lines.length > rows) rows = lines.length + 5; rows = Math.min(rows,maxLines); e.setAttribute("rows",rows); e.setAttribute("edit",field); place.appendChild(wrapper1); } return e; } }; config.macros.tagChooser.onClick = function(ev) { var e = ev || window.event; var lingo = config.views.editor.tagChooser; var popup = Popup.create(this); var tags = store.getTags(this.getAttribute("tags")); if(tags.length == 0) jQuery("
  • ").text(lingo.popupNone).appendTo(jQuery(popup)); for(var t=0; t 0) btn.setAttribute("params",tags.join("|")); btn.setAttribute("newFocus",newFocus); btn.setAttribute("newTemplate",getParam(params,"template",DEFAULT_EDIT_TEMPLATE)); if(customFields !== "") btn.setAttribute("customFields",customFields); var text = getParam(params,"text"); if(text !== undefined) btn.setAttribute("newText",text); return btn; }; config.macros.newTiddler.onClickNewTiddler = function() { var title = this.getAttribute("newTitle"); if(this.getAttribute("isJournal") == "true") { title = new Date().formatString(title.trim()); } var params = this.getAttribute("params"); var tags = params ? params.split("|") : []; var focus = this.getAttribute("newFocus"); var template = this.getAttribute("newTemplate"); var customFields = this.getAttribute("customFields"); if(!customFields && !store.isShadowTiddler(title)) customFields = String.encodeHashMap(config.defaultCustomFields); story.displayTiddler(null,title,template,false,null,null); var tiddlerElem = story.getTiddler(title); if(customFields) story.addCustomFields(tiddlerElem,customFields); var text = this.getAttribute("newText"); if(typeof text == "string" && story.getTiddlerField(title,"text")) story.getTiddlerField(title,"text").value = text.format([title]); for(var t=0;t 0) { story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch); txt.setAttribute("lastSearchText",txt.value); } }; config.macros.search.onClick = function(e) { config.macros.search.doSearch(this.nextSibling); return false; }; config.macros.search.onKeyPress = function(ev) { var e = ev || window.event; switch(e.keyCode) { case 13: // Ctrl-Enter case 10: // Ctrl-Enter on IE PC config.macros.search.doSearch(this); break; case 27: // Escape this.value = ""; clearMessage(); break; } if(config.options.chkIncrementalSearch) { if(this.value.length > 2) { if(this.value != this.getAttribute("lastSearchText")) { if(config.macros.search.timeout) clearTimeout(config.macros.search.timeout); var txt = this; config.macros.search.timeout = setTimeout(function() {config.macros.search.doSearch(txt);},500); } } else { if(config.macros.search.timeout) clearTimeout(config.macros.search.timeout); } } }; config.macros.search.onFocus = function(e) { this.select(); }; //-- //-- Tabs macro //-- config.macros.tabs.handler = function(place,macroName,params) { var cookie = params[0]; var numTabs = (params.length-1)/3; var wrapper = createTiddlyElement(null,"div",null,"tabsetWrapper " + cookie); var tabset = createTiddlyElement(wrapper,"div",null,"tabset"); tabset.setAttribute("cookie",cookie); var validTab = false; for(var t=0; t": var btn = createTiddlyButton(place,this.moreLabel,this.morePrompt,config.macros.toolbar.onClickMore); addClass(btn,"moreCommand"); var e = createTiddlyElement(place,"span",null,"moreCommand"); e.style.display = "none"; place = e; break; default: var className = ""; switch(c.substr(0,1)) { case "+": className = "defaultCommand"; c = c.substr(1); break; case "-": className = "cancelCommand"; c = c.substr(1); break; } if(c in config.commands) this.createCommand(place,c,tiddler,className); break; } } }; //-- //-- Menu and toolbar commands //-- config.commands.closeTiddler.handler = function(event,src,title) { if(story.isDirty(title) && !readOnly) { if(!confirm(config.commands.cancelTiddler.warning.format([title]))) return false; } story.setDirty(title,false); story.closeTiddler(title,true); return false; }; config.commands.closeOthers.handler = function(event,src,title) { story.closeAllTiddlers(title); return false; }; config.commands.editTiddler.handler = function(event,src,title) { clearMessage(); var tiddlerElem = story.getTiddler(title); var fields = tiddlerElem.getAttribute("tiddlyFields"); story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE,false,null,fields); story.focusTiddler(title,config.options.txtEditorFocus||"text"); return false; }; config.commands.saveTiddler.handler = function(event,src,title) { var newTitle = story.saveTiddler(title,event.shiftKey); if(newTitle) story.displayTiddler(null,newTitle); return false; }; config.commands.cancelTiddler.handler = function(event,src,title) { if(story.hasChanges(title) && !readOnly) { if(!confirm(this.warning.format([title]))) return false; } story.setDirty(title,false); story.displayTiddler(null,title); return false; }; config.commands.deleteTiddler.handler = function(event,src,title) { var deleteIt = true; if(config.options.chkConfirmDelete) deleteIt = confirm(this.warning.format([title])); if(deleteIt) { store.removeTiddler(title); story.closeTiddler(title,true); autoSaveChanges(); } return false; }; config.commands.permalink.handler = function(event,src,title) { var t = encodeURIComponent(String.encodeTiddlyLink(title)); if(window.location.hash != t) window.location.hash = t; return false; }; config.commands.references.handlePopup = function(popup,title) { var references = store.getReferringTiddlers(title); var c = false; for(var r=0; r 0) ListView.create(popup,items,this.listViewTemplate); else createTiddlyElement(popup,"div",null,null,this.emptyText); }; //-- //-- Tiddler() object //-- function Tiddler(title) { this.title = title; this.text = ""; this.modifier = null; this.created = new Date(); this.modified = this.created; this.links = []; this.linksUpdated = false; this.tags = []; this.fields = {}; return this; } Tiddler.prototype.getLinks = function() { if(this.linksUpdated==false) this.changed(); return this.links; }; // Returns the fields that are inherited in string field:"value" field2:"value2" format Tiddler.prototype.getInheritedFields = function() { var f = {}; for(var i in this.fields) { if(i=="server.host" || i=="server.workspace" || i=="wikiformat"|| i=="server.type") { f[i] = this.fields[i]; } } return String.encodeHashMap(f); }; // Increment the changeCount of a tiddler Tiddler.prototype.incChangeCount = function() { var c = this.fields['changecount']; c = c ? parseInt(c,10) : 0; this.fields['changecount'] = String(c+1); }; // Clear the changeCount of a tiddler Tiddler.prototype.clearChangeCount = function() { if(this.fields['changecount']) { delete this.fields['changecount']; } }; Tiddler.prototype.doNotSave = function() { return this.fields['doNotSave']; }; // Returns true if the tiddler has been updated since the tiddler was created or downloaded Tiddler.prototype.isTouched = function() { var changeCount = this.fields['changecount']; if(changeCount === undefined) changeCount = 0; return changeCount > 0; }; // Change the text and other attributes of a tiddler Tiddler.prototype.set = function(title,text,modifier,modified,tags,created,fields) { this.assign(title,text,modifier,modified,tags,created,fields); this.changed(); return this; }; // Change the text and other attributes of a tiddler without triggered a tiddler.changed() call Tiddler.prototype.assign = function(title,text,modifier,modified,tags,created,fields) { if(title != undefined) this.title = title; if(text != undefined) this.text = text; if(modifier != undefined) this.modifier = modifier; if(modified != undefined) this.modified = modified; if(created != undefined) this.created = created; if(fields != undefined) this.fields = fields; if(tags != undefined) this.tags = (typeof tags == "string") ? tags.readBracketedList() : tags; else if(this.tags == undefined) this.tags = []; return this; }; // Get the tags for a tiddler as a string (space delimited, using [[brackets]] for tags containing spaces) Tiddler.prototype.getTags = function() { return String.encodeTiddlyLinkList(this.tags); }; // Test if a tiddler carries a tag Tiddler.prototype.isTagged = function(tag) { return this.tags.indexOf(tag) != -1; }; // Static method to convert "\n" to newlines, "\s" to "\" Tiddler.unescapeLineBreaks = function(text) { return text ? text.unescapeLineBreaks() : ""; }; // Convert newlines to "\n", "\" to "\s" Tiddler.prototype.escapeLineBreaks = function() { return this.text.escapeLineBreaks(); }; // Updates the secondary information (like links[] array) after a change to a tiddler Tiddler.prototype.changed = function() { this.links = []; var text = this.text; // remove 'quoted' text before scanning tiddler source text = text.replace(/\/%((?:.|\n)*?)%\//g,""). replace(/\{{3}((?:.|\n)*?)\}{3}/g,""). replace(/"""((?:.|\n)*?)"""/g,""). replace(/\((?:.|\n)*?)\<\/nowiki\>/g,""). replace(/\((?:.|\n)*?)\<\/html\>/g,""). replace(/\/g,""); var t = this.autoLinkWikiWords() ? 0 : 1; var tiddlerLinkRegExp = t==0 ? config.textPrimitives.tiddlerAnyLinkRegExp : config.textPrimitives.tiddlerForcedLinkRegExp; tiddlerLinkRegExp.lastIndex = 0; var formatMatch = tiddlerLinkRegExp.exec(text); while(formatMatch) { var lastIndex = tiddlerLinkRegExp.lastIndex; if(t==0 && formatMatch[1] && formatMatch[1] != this.title) { // wikiWordLink if(formatMatch.index > 0) { var preRegExp = new RegExp(config.textPrimitives.unWikiLink+"|"+config.textPrimitives.anyLetter,"mg"); preRegExp.lastIndex = formatMatch.index-1; var preMatch = preRegExp.exec(text); if(preMatch.index != formatMatch.index-1) this.links.pushUnique(formatMatch[1]); } else { this.links.pushUnique(formatMatch[1]); } } else if(formatMatch[2-t] && !config.formatterHelpers.isExternalLink(formatMatch[3-t])) // titledBrackettedLink this.links.pushUnique(formatMatch[3-t]); else if(formatMatch[4-t] && formatMatch[4-t] != this.title) // brackettedLink this.links.pushUnique(formatMatch[4-t]); tiddlerLinkRegExp.lastIndex = lastIndex; formatMatch = tiddlerLinkRegExp.exec(text); } this.linksUpdated = true; }; Tiddler.prototype.getSubtitle = function() { var modifier = this.modifier; if(!modifier) modifier = config.messages.subtitleUnknown; var modified = this.modified; if(modified) modified = modified.toLocaleString(); else modified = config.messages.subtitleUnknown; return config.messages.tiddlerLinkTooltip.format([this.title,modifier,modified]); }; Tiddler.prototype.isReadOnly = function() { return readOnly; }; Tiddler.prototype.autoLinkWikiWords = function() { return !(this.isTagged("systemConfig") || this.isTagged("excludeMissing")); }; Tiddler.prototype.getServerType = function() { var serverType = null; if(this.fields['server.type']) serverType = this.fields['server.type']; if(!serverType) serverType = this.fields['wikiformat']; if(serverType && !config.adaptors[serverType]) serverType = null; return serverType; }; Tiddler.prototype.getAdaptor = function() { var serverType = this.getServerType(); return serverType ? new config.adaptors[serverType]() : null; }; //-- //-- TiddlyWiki() object contains Tiddler()s //-- function TiddlyWiki() { var tiddlers = {}; // Hashmap by name of tiddlers this.tiddlersUpdated = false; this.namedNotifications = []; // Array of {name:,notify:} of notification functions this.notificationLevel = 0; this.slices = {}; // map tiddlerName->(map sliceName->sliceValue). Lazy. this.clear = function() { tiddlers = {}; this.setDirty(false); }; this.fetchTiddler = function(title) { var t = tiddlers[title]; return t instanceof Tiddler ? t : null; }; this.deleteTiddler = function(title) { delete this.slices[title]; delete tiddlers[title]; }; this.addTiddler = function(tiddler) { delete this.slices[tiddler.title]; tiddlers[tiddler.title] = tiddler; }; this.forEachTiddler = function(callback) { for(var t in tiddlers) { var tiddler = tiddlers[t]; if(tiddler instanceof Tiddler) callback.call(this,t,tiddler); } }; } TiddlyWiki.prototype.setDirty = function(dirty) { this.dirty = dirty; }; TiddlyWiki.prototype.isDirty = function() { return this.dirty; }; TiddlyWiki.prototype.tiddlerExists = function(title) { var t = this.fetchTiddler(title); return t != undefined; }; TiddlyWiki.prototype.isShadowTiddler = function(title) { return config.shadowTiddlers[title] === undefined ? false : true; }; TiddlyWiki.prototype.createTiddler = function(title) { var tiddler = this.fetchTiddler(title); if(!tiddler) { tiddler = new Tiddler(title); this.addTiddler(tiddler); this.setDirty(true); } return tiddler; }; TiddlyWiki.prototype.getTiddler = function(title) { var t = this.fetchTiddler(title); if(t != undefined) return t; else return null; }; TiddlyWiki.prototype.getShadowTiddlerText = function(title) { if(typeof config.shadowTiddlers[title] == "string") return config.shadowTiddlers[title]; else return ""; }; // Retrieve tiddler contents TiddlyWiki.prototype.getTiddlerText = function(title,defaultText) { if(!title) return defaultText; var pos = title.indexOf(config.textPrimitives.sectionSeparator); var section = null; if(pos != -1) { section = title.substr(pos + config.textPrimitives.sectionSeparator.length); title = title.substr(0,pos); } pos = title.indexOf(config.textPrimitives.sliceSeparator); if(pos != -1) { var slice = this.getTiddlerSlice(title.substr(0,pos),title.substr(pos + config.textPrimitives.sliceSeparator.length)); if(slice) return slice; } var tiddler = this.fetchTiddler(title); if(tiddler) { if(!section) return tiddler.text; var re = new RegExp("(^!{1,6}" + section.escapeRegExp() + "[ \t]*\n)","mg"); re.lastIndex = 0; var match = re.exec(tiddler.text); if(match) { var t = tiddler.text.substr(match.index+match[1].length); var re2 = /^!/mg; re2.lastIndex = 0; match = re2.exec(t); //# search for the next heading if(match) t = t.substr(0,match.index-1);//# don't include final \n return t; } return defaultText; } if(this.isShadowTiddler(title)) return this.getShadowTiddlerText(title); if(defaultText != undefined) return defaultText; return null; }; TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth) { var bracketRegExp = new RegExp("(?:\\[\\[([^\\]]+)\\]\\])","mg"); var text = this.getTiddlerText(title,null); if(text == null) return defaultText; var textOut = []; var lastPos = 0; do { var match = bracketRegExp.exec(text); if(match) { textOut.push(text.substr(lastPos,match.index-lastPos)); if(match[1]) { if(depth <= 0) textOut.push(match[1]); else textOut.push(this.getRecursiveTiddlerText(match[1],"[[" + match[1] + "]]",depth-1)); } lastPos = match.index + match[0].length; } else { textOut.push(text.substr(lastPos)); } } while(match); return textOut.join(""); }; TiddlyWiki.prototype.slicesRE = /(?:^([\'\/]{0,2})~?([\.\w]+)\:\1[\t\x20]*([^\n]+)[\t\x20]*$)|(?:^\|([\'\/]{0,2})~?([\.\w]+)\:?\4\|[\t\x20]*([^\n]+)[\t\x20]*\|$)/gm; // @internal TiddlyWiki.prototype.calcAllSlices = function(title) { var slices = {}; var text = this.getTiddlerText(title,""); this.slicesRE.lastIndex = 0; var m = this.slicesRE.exec(text); while(m) { if(m[2]) slices[m[2]] = m[3]; else slices[m[5]] = m[6]; m = this.slicesRE.exec(text); } return slices; }; // Returns the slice of text of the given name TiddlyWiki.prototype.getTiddlerSlice = function(title,sliceName) { var slices = this.slices[title]; if(!slices) { slices = this.calcAllSlices(title); this.slices[title] = slices; } return slices[sliceName]; }; // Build an hashmap of the specified named slices of a tiddler TiddlyWiki.prototype.getTiddlerSlices = function(title,sliceNames) { var r = {}; for(var t=0; t<" + "body>" + text.substring(posDiv[0],posDiv[1] + endSaveArea.length) + "<" + "/body><" + "/html>"; // Create the iframe var iframe = document.createElement("iframe"); iframe.style.display = "none"; document.body.appendChild(iframe); var doc = iframe.document; if(iframe.contentDocument) doc = iframe.contentDocument; // For NS6 else if(iframe.contentWindow) doc = iframe.contentWindow.document; // For IE5.5 and IE6 // Put the content in the iframe doc.open(); doc.writeln(content); doc.close(); // Load the content into a TiddlyWiki() object var storeArea = doc.getElementById("storeArea"); this.loadFromDiv(storeArea,"store"); // Get rid of the iframe iframe.parentNode.removeChild(iframe); return this; }; TiddlyWiki.prototype.updateTiddlers = function() { this.tiddlersUpdated = true; this.forEachTiddler(function(title,tiddler) { tiddler.changed(); }); }; // Return an array of tiddlers matching a search regular expression TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag,match) { var candidates = this.reverseLookup("tags",excludeTag,!!match); var results = []; for(var t=0; tString value = value instanceof Date ? value.convertToYYYYMMDDHHMMSSMMM() : String(value); if(oldValue == value) return; t.fields[fieldName] = value; } } // When we are here the tiddler/store really was changed. this.notify(t.title,true); if(!fieldName.match(/^temp\./)) this.setDirty(true); }; // Returns the value of the given field of the tiddler. // The fieldName is case-insensitive. // Will only return String values (or undefined). TiddlyWiki.prototype.getValue = function(tiddler,fieldName) { var t = this.resolveTiddler(tiddler); if(!t) return undefined; fieldName = fieldName.toLowerCase(); var accessor = TiddlyWiki.standardFieldAccess[fieldName]; if(accessor) { return accessor.get(t); } return t.fields[fieldName]; }; // Calls the callback function for every field in the tiddler. // When callback function returns a non-false value the iteration stops // and that value is returned. // The order of the fields is not defined. // @param callback a function(tiddler,fieldName,value). TiddlyWiki.prototype.forEachField = function(tiddler,callback,onlyExtendedFields) { var t = this.resolveTiddler(tiddler); if(!t) return undefined; var n,result; for(n in t.fields) { result = callback(t,n,t.fields[n]); if(result) return result; } if(onlyExtendedFields) return undefined; for(n in TiddlyWiki.standardFieldAccess) { if(n == "tiddler") // even though the "title" field can also be referenced through the name "tiddler" // we only visit this field once. continue; result = callback(t,n,TiddlyWiki.standardFieldAccess[n].get(t)); if(result) return result; } return undefined; }; //-- //-- Story functions //-- function Story(containerId,idPrefix) { this.container = containerId; this.idPrefix = idPrefix; this.highlightRegExp = null; this.tiddlerId = function(title) { var id = this.idPrefix + title; return id==this.container ? this.idPrefix + "_" + title : id; }; this.containerId = function() { return this.container; }; } Story.prototype.getTiddler = function(title) { return document.getElementById(this.tiddlerId(title)); }; Story.prototype.getContainer = function() { return document.getElementById(this.containerId()); }; Story.prototype.forEachTiddler = function(fn) { var place = this.getContainer(); if(!place) return; var e = place.firstChild; while(e) { var n = e.nextSibling; var title = e.getAttribute("tiddler"); fn.call(this,title,e); e = n; } }; Story.prototype.displayDefaultTiddlers = function() { this.displayTiddlers(null,store.filterTiddlers(store.getTiddlerText("DefaultTiddlers"))); }; Story.prototype.displayTiddlers = function(srcElement,titles,template,animate,unused,customFields,toggle) { for(var t = titles.length-1;t>=0;t--) this.displayTiddler(srcElement,titles[t],template,animate,unused,customFields); }; Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle,animationSrc) { var title = (tiddler instanceof Tiddler) ? tiddler.title : tiddler; var tiddlerElem = this.getTiddler(title); if(tiddlerElem) { if(toggle) this.closeTiddler(title,true); else this.refreshTiddler(title,template,false,customFields); } else { var place = this.getContainer(); var before = this.positionTiddler(srcElement); tiddlerElem = this.createTiddler(place,before,title,template,customFields); } if(animationSrc && typeof animationSrc !== "string") { srcElement = animationSrc; } if(srcElement && typeof srcElement !== "string") { if(config.options.chkAnimate && (animate == undefined || animate == true) && anim && typeof Zoomer == "function" && typeof Scroller == "function") anim.startAnimating(new Zoomer(title,srcElement,tiddlerElem),new Scroller(tiddlerElem)); else window.scrollTo(0,ensureVisible(tiddlerElem)); } }; Story.prototype.positionTiddler = function(srcElement) { var place = this.getContainer(); var before = null; if(typeof srcElement == "string") { switch(srcElement) { case "top": before = place.firstChild; break; case "bottom": before = null; break; } } else { var after = this.findContainingTiddler(srcElement); if(after == null) { before = place.firstChild; } else if(after.nextSibling) { before = after.nextSibling; if(before.nodeType != 1) before = null; } } return before; }; Story.prototype.createTiddler = function(place,before,title,template,customFields) { var tiddlerElem = createTiddlyElement(null,"div",this.tiddlerId(title),"tiddler"); tiddlerElem.setAttribute("refresh","tiddler"); if(customFields) tiddlerElem.setAttribute("tiddlyFields",customFields); place.insertBefore(tiddlerElem,before); var defaultText = null; if(!store.tiddlerExists(title) && !store.isShadowTiddler(title)) defaultText = this.loadMissingTiddler(title,customFields,tiddlerElem); this.refreshTiddler(title,template,false,customFields,defaultText); return tiddlerElem; }; Story.prototype.loadMissingTiddler = function(title,fields,tiddlerElem) { var getTiddlerCallback = function(context) { if(context.status) { var t = context.tiddler; if(!t.created) t.created = new Date(); if(!t.modified) t.modified = t.created; store.saveTiddler(t.title,t.title,t.text,t.modifier,t.modified,t.tags,t.fields,true,t.created); autoSaveChanges(); } else { story.refreshTiddler(context.title,null,true); } context.adaptor.close(); delete context.adaptor; }; var tiddler = new Tiddler(title); tiddler.fields = typeof fields == "string" ? fields.decodeHashMap() : fields||{}; var context = {serverType:tiddler.getServerType()}; if(!context.serverType) return; context.host = tiddler.fields['server.host']; context.workspace = tiddler.fields['server.workspace']; var adaptor = new config.adaptors[context.serverType]; adaptor.getTiddler(title,context,null,getTiddlerCallback); return config.messages.loadingMissingTiddler.format([title,context.serverType,context.host,context.workspace]); }; Story.prototype.chooseTemplateForTiddler = function(title,template) { if(!template) template = DEFAULT_VIEW_TEMPLATE; if(template == DEFAULT_VIEW_TEMPLATE || template == DEFAULT_EDIT_TEMPLATE) template = config.tiddlerTemplates[template]; return template; }; Story.prototype.getTemplateForTiddler = function(title,template,tiddler) { return store.getRecursiveTiddlerText(template,null,10); }; Story.prototype.refreshTiddler = function(title,template,force,customFields,defaultText) { var tiddlerElem = this.getTiddler(title); if(tiddlerElem) { if(tiddlerElem.getAttribute("dirty") == "true" && !force) return tiddlerElem; template = this.chooseTemplateForTiddler(title,template); var currTemplate = tiddlerElem.getAttribute("template"); if((template != currTemplate) || force) { var tiddler = store.getTiddler(title); if(!tiddler) { tiddler = new Tiddler(); if(store.isShadowTiddler(title)) { var tags = []; tiddler.set(title,store.getTiddlerText(title),config.views.wikified.shadowModifier,version.date,tags,version.date); } else { var text = template=="EditTemplate" ? config.views.editor.defaultText.format([title]) : config.views.wikified.defaultText.format([title]); text = defaultText || text; var fields = customFields ? customFields.decodeHashMap() : null; tiddler.set(title,text,config.views.wikified.defaultModifier,version.date,[],version.date,fields); } } tiddlerElem.setAttribute("tags",tiddler.tags.join(" ")); tiddlerElem.setAttribute("tiddler",title); tiddlerElem.setAttribute("template",template); tiddlerElem.onmouseover = this.onTiddlerMouseOver; tiddlerElem.onmouseout = this.onTiddlerMouseOut; tiddlerElem.ondblclick = this.onTiddlerDblClick; tiddlerElem[window.event?"onkeydown":"onkeypress"] = this.onTiddlerKeyPress; tiddlerElem.innerHTML = this.getTemplateForTiddler(title,template,tiddler); applyHtmlMacros(tiddlerElem,tiddler); if(store.getTaggedTiddlers(title).length > 0) addClass(tiddlerElem,"isTag"); else removeClass(tiddlerElem,"isTag"); if(store.tiddlerExists(title)) { removeClass(tiddlerElem,"shadow"); removeClass(tiddlerElem,"missing"); } else { addClass(tiddlerElem, store.isShadowTiddler(title) ? "shadow" : "missing"); } if(customFields) this.addCustomFields(tiddlerElem,customFields); forceReflow(); } } return tiddlerElem; }; Story.prototype.addCustomFields = function(place,customFields) { var fields = customFields.decodeHashMap(); var w = createTiddlyElement(place,"div",null,"customFields"); w.style.display = "none"; for(var t in fields) { var e = document.createElement("input"); e.setAttribute("type","text"); e.setAttribute("value",fields[t]); w.appendChild(e); e.setAttribute("edit",t); } }; Story.prototype.refreshAllTiddlers = function(force) { var e = this.getContainer().firstChild; while(e) { var template = e.getAttribute("template"); if(template && e.getAttribute("dirty") != "true") { this.refreshTiddler(e.getAttribute("tiddler"),force ? null : template,true); } e = e.nextSibling; } }; Story.prototype.onTiddlerMouseOver = function(e) { addClass(this, "selected"); }; Story.prototype.onTiddlerMouseOut = function(e) { removeClass(this,"selected"); }; Story.prototype.onTiddlerDblClick = function(ev) { var e = ev || window.event; var target = resolveTarget(e); if(target && target.nodeName.toLowerCase() != "input" && target.nodeName.toLowerCase() != "textarea") { if(document.selection && document.selection.empty) document.selection.empty(); config.macros.toolbar.invokeCommand(this,"defaultCommand",e); e.cancelBubble = true; if(e.stopPropagation) e.stopPropagation(); return true; } return false; }; Story.prototype.onTiddlerKeyPress = function(ev) { var e = ev || window.event; clearMessage(); var consume = false; var title = this.getAttribute("tiddler"); var target = resolveTarget(e); switch(e.keyCode) { case 9: // Tab if(config.options.chkInsertTabs && target.tagName.toLowerCase() == "textarea") { replaceSelection(target,String.fromCharCode(9)); consume = true; } if(config.isOpera) { target.onblur = function() { this.focus(); this.onblur = null; }; } break; case 13: // Ctrl-Enter case 10: // Ctrl-Enter on IE PC case 77: // Ctrl-Enter is "M" on some platforms if(e.ctrlKey) { blurElement(this); config.macros.toolbar.invokeCommand(this,"defaultCommand",e); consume = true; } break; case 27: // Escape blurElement(this); config.macros.toolbar.invokeCommand(this,"cancelCommand",e); consume = true; break; } e.cancelBubble = consume; if(consume) { if(e.stopPropagation) e.stopPropagation(); // Stop Propagation e.returnValue = true; // Cancel The Event in IE if(e.preventDefault ) e.preventDefault(); // Cancel The Event in Moz } return !consume; }; Story.prototype.getTiddlerField = function(title,field) { var tiddlerElem = this.getTiddler(title); var e = null; if(tiddlerElem ) { var children = tiddlerElem.getElementsByTagName("*"); for(var t=0; t 0) displayMessage(config.macros.search.successMsg.format([matches.length.toString(),q + text + q])); else displayMessage(config.macros.search.failureMsg.format([q + text + q])); }; Story.prototype.findContainingTiddler = function(e) { while(e && !hasClass(e,"tiddler")) e = e.parentNode; return e; }; Story.prototype.gatherSaveFields = function(e,fields) { if(e && e.getAttribute) { var f = e.getAttribute("edit"); if(f) fields[f] = e.value.replace(/\r/mg,""); if(e.hasChildNodes()) { var c = e.childNodes; for(var t=0; t 0) { if(!confirm(config.macros.importTiddlers.confirmOverwriteText.format([overwrite.join(", ")]))) return false; } wizard.addStep(config.macros.importTiddlers.step4Title.format([rowNames.length]),config.macros.importTiddlers.step4Html); for(t=0; t si.tiddler.fields['server.page.revision']) { si.syncStatus = config.macros.sync.syncStatusList[si.isTouched ? 'changedBoth' : 'changedServer']; } } else { si.syncStatus = config.macros.sync.syncStatusList.notFound; } config.macros.sync.updateSyncStatus(si); } return true; }; var context = {host:st.serverHost,workspace:st.serverWorkspace}; syncItem.adaptor.openHost(st.serverHost); syncItem.adaptor.openWorkspace(st.serverWorkspace,context,st.syncItems,openWorkspaceCallback); return st; }; config.macros.sync.updateSyncStatus = function(syncItem) { var e = syncItem.colElements["status"]; removeChildren(e); createTiddlyText(e,syncItem.syncStatus.text); if(syncItem.syncStatus.display) syncItem.rowElement.style.display = syncItem.syncStatus.display; if(syncItem.syncStatus.className) syncItem.rowElement.className = syncItem.syncStatus.className; }; config.macros.sync.doSync = function(e) { var getTiddlerCallback = function(context,syncItem) { if(syncItem) { var tiddler = context.tiddler; store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags,tiddler.fields,true,tiddler.created); syncItem.syncStatus = config.macros.sync.syncStatusList.gotFromServer; config.macros.sync.updateSyncStatus(syncItem); } }; var putTiddlerCallback = function(context,syncItem) { if(syncItem) { store.resetTiddler(context.title); syncItem.syncStatus = config.macros.sync.syncStatusList.putToServer; config.macros.sync.updateSyncStatus(syncItem); } }; var rowNames = ListView.getSelectedRows(currSync.listView); var sl = config.macros.sync.syncStatusList; for(var i=0; i").appendTo("body").hide()[0]; var display = story.getContainer(); var nodes,t; if(display) { nodes = display.childNodes; for(t=nodes.length-1; t>=0; t--) stash.appendChild(nodes[t]); } var wrapper = document.getElementById("contentWrapper"); var isAvailable = function(title) { var s = title ? title.indexOf(config.textPrimitives.sectionSeparator) : -1; if(s!=-1) title = title.substr(0,s); return store.tiddlerExists(title) || store.isShadowTiddler(title); }; if(!title || !isAvailable(title)) title = config.refresherData.pageTemplate; if(!isAvailable(title)) title = config.refresherData.defaultPageTemplate; //# this one is always avaialable wrapper.innerHTML = store.getRecursiveTiddlerText(title,null,10); applyHtmlMacros(wrapper); refreshElements(wrapper); display = story.getContainer(); removeChildren(display); if(!display) display = createTiddlyElement(wrapper,"div",story.containerId()); nodes = stash.childNodes; for(t=nodes.length-1; t>=0; t--) display.appendChild(nodes[t]); removeNode(stash); } function refreshDisplay(hint) { if(typeof hint == "string") hint = [hint]; var e = document.getElementById("contentWrapper"); refreshElements(e,hint); if(backstage.isPanelVisible()) { e = document.getElementById("backstage"); refreshElements(e,hint); } } function refreshPageTitle() { document.title = getPageTitle(); } function getPageTitle() { var st = wikifyPlain("SiteTitle"); var ss = wikifyPlain("SiteSubtitle"); return st + ((st == "" || ss == "") ? "" : " - ") + ss; } function refreshStyles(title,doc) { setStylesheet(title == null ? "" : store.getRecursiveTiddlerText(title,"",10),title,doc || document); } function refreshColorPalette(title) { if(!startingUp) refreshAll(); } function refreshAll() { refreshPageTemplate(); refreshDisplay(); refreshStyles("StyleSheetLayout"); refreshStyles("StyleSheetColors"); refreshStyles(config.refresherData.styleSheet); refreshStyles("StyleSheetPrint"); } //-- //-- Options stuff //-- config.optionHandlers = { 'txt': { get: function(name) {return encodeCookie(config.options[name].toString());}, set: function(name,value) {config.options[name] = decodeCookie(value);} }, 'chk': { get: function(name) {return config.options[name] ? "true" : "false";}, set: function(name,value) {config.options[name] = value == "true";} } }; function loadOptionsCookie() { if(safeMode) return; var cookies = document.cookie.split(";"); for(var c=0; c'; // Split up into two so that indexOf() of this source doesn't find it var endSaveArea = ''; // If there are unsaved changes, force the user to confirm before exitting function confirmExit() { hadConfirmExit = true; if((store && store.isDirty && store.isDirty()) || (story && story.areAnyDirty && story.areAnyDirty())) return config.messages.confirmExit; } // Give the user a chance to save changes before exitting function checkUnsavedChanges() { if(store && store.isDirty && store.isDirty() && window.hadConfirmExit === false) { if(confirm(config.messages.unsavedChangesWarning)) saveChanges(); } } function updateLanguageAttribute(s) { if(config.locale) { var mRE = /(/; var m = mRE.exec(s); if(m) { var t = m[1]; if(m[2]) t += ' xml:lang="' + config.locale + '"'; if(m[3]) t += ' lang="' + config.locale + '"'; t += ">"; s = s.substr(0,m.index) + t + s.substr(m.index+m[0].length); } } return s; } function updateMarkupBlock(s,blockName,tiddlerName) { return s.replaceChunk( "".format([blockName]), "".format([blockName]), "\n" + convertUnicodeToFileFormat(store.getRecursiveTiddlerText(tiddlerName,"")) + "\n"); } function updateOriginal(original,posDiv,localPath) { if(!posDiv) posDiv = locateStoreArea(original); if(!posDiv) { alert(config.messages.invalidFileError.format([localPath])); return null; } var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" + convertUnicodeToFileFormat(store.allTiddlersAsHtml()) + "\n" + original.substr(posDiv[1]); var newSiteTitle = convertUnicodeToFileFormat(getPageTitle()).htmlEncode(); revised = revised.replaceChunk("",""," " + newSiteTitle + " "); revised = updateLanguageAttribute(revised); revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead"); revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead"); revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody"); revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody"); return revised; } function locateStoreArea(original) { // Locate the storeArea div's var posOpeningDiv = original.indexOf(startSaveArea); var limitClosingDiv = original.indexOf("<"+"!--POST-STOREAREA--"+">"); if(limitClosingDiv == -1) limitClosingDiv = original.indexOf("<"+"!--POST-BODY-START--"+">"); var posClosingDiv = original.lastIndexOf(endSaveArea,limitClosingDiv == -1 ? original.length : limitClosingDiv); return (posOpeningDiv != -1 && posClosingDiv != -1) ? [posOpeningDiv,posClosingDiv] : null; } function autoSaveChanges(onlyIfDirty,tiddlers) { if(config.options.chkAutoSave) saveChanges(onlyIfDirty,tiddlers); } function loadOriginal(localPath) { return loadFile(localPath); } // Save this tiddlywiki with the pending changes function saveChanges(onlyIfDirty,tiddlers) { if(onlyIfDirty && !store.isDirty()) return; clearMessage(); var t0 = new Date(); var originalPath = document.location.toString(); if(originalPath.substr(0,5) != "file:") { alert(config.messages.notFileUrlError); if(store.tiddlerExists(config.messages.saveInstructions)) story.displayTiddler(null,config.messages.saveInstructions); return; } var localPath = getLocalPath(originalPath); var original = loadOriginal(localPath); if(original == null) { alert(config.messages.cantSaveError); if(store.tiddlerExists(config.messages.saveInstructions)) story.displayTiddler(null,config.messages.saveInstructions); return; } var posDiv = locateStoreArea(original); if(!posDiv) { alert(config.messages.invalidFileError.format([localPath])); return; } saveMain(localPath,original,posDiv); if(config.options.chkSaveBackups) saveBackup(localPath,original); if(config.options.chkSaveEmptyTemplate) saveEmpty(localPath,original,posDiv); if(config.options.chkGenerateAnRssFeed && saveRss instanceof Function) saveRss(localPath); if(config.options.chkDisplayInstrumentation) displayMessage("saveChanges " + (new Date()-t0) + " ms"); } function saveMain(localPath,original,posDiv) { var save; try { var revised = updateOriginal(original,posDiv,localPath); save = saveFile(localPath,revised); } catch (ex) { showException(ex); } if(save) { displayMessage(config.messages.mainSaved,"file://" + localPath); store.setDirty(false); } else { alert(config.messages.mainFailed); } } function saveBackup(localPath,original) { var backupPath = getBackupPath(localPath); var backup = copyFile(backupPath,localPath); if(!backup) backup = saveFile(backupPath,original); if(backup) displayMessage(config.messages.backupSaved,"file://" + backupPath); else alert(config.messages.backupFailed); } function saveEmpty(localPath,original,posDiv) { var emptyPath,p; if((p = localPath.lastIndexOf("/")) != -1) emptyPath = localPath.substr(0,p) + "/"; else if((p = localPath.lastIndexOf("\\")) != -1) emptyPath = localPath.substr(0,p) + "\\"; else emptyPath = localPath + "."; emptyPath += "empty.html"; var empty = original.substr(0,posDiv[0] + startSaveArea.length) + original.substr(posDiv[1]); var emptySave = saveFile(emptyPath,empty); if(emptySave) displayMessage(config.messages.emptySaved,"file://" + emptyPath); else alert(config.messages.emptyFailed); } function getLocalPath(origPath) { var originalPath = convertUriToUTF8(origPath,config.options.txtFileSystemCharSet); // Remove any location or query part of the URL var argPos = originalPath.indexOf("?"); if(argPos != -1) originalPath = originalPath.substr(0,argPos); var hashPos = originalPath.indexOf("#"); if(hashPos != -1) originalPath = originalPath.substr(0,hashPos); // Convert file://localhost/ to file:/// if(originalPath.indexOf("file://localhost/") == 0) originalPath = "file://" + originalPath.substr(16); // Convert to a native file format var localPath; if(originalPath.charAt(9) == ":") // pc local file localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\"); else if(originalPath.indexOf("file://///") == 0) // FireFox pc network file localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\"); else if(originalPath.indexOf("file:///") == 0) // mac/unix local file localPath = unescape(originalPath.substr(7)); else if(originalPath.indexOf("file:/") == 0) // mac/unix local file localPath = unescape(originalPath.substr(5)); else // pc network file localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\"); return localPath; } function getBackupPath(localPath,title,extension) { var slash = "\\"; var dirPathPos = localPath.lastIndexOf("\\"); if(dirPathPos == -1) { dirPathPos = localPath.lastIndexOf("/"); slash = "/"; } var backupFolder = config.options.txtBackupFolder; if(!backupFolder || backupFolder == "") backupFolder = "."; var backupPath = localPath.substr(0,dirPathPos) + slash + backupFolder + localPath.substr(dirPathPos); backupPath = backupPath.substr(0,backupPath.lastIndexOf(".")) + "."; if(title) backupPath += title.replace(/[\\\/\*\?\":<> ]/g,"_") + "."; backupPath += (new Date()).convertToYYYYMMDDHHMMSSMMM() + "." + (extension || "html"); return backupPath; } //-- //-- RSS Saving //-- function saveRss(localPath) { var rssPath = localPath.substr(0,localPath.lastIndexOf(".")) + ".xml"; if(saveFile(rssPath,convertUnicodeToFileFormat(generateRss()))) displayMessage(config.messages.rssSaved,"file://" + rssPath); else alert(config.messages.rssFailed); } tiddlerToRssItem = function(tiddler,uri) { var s = "" + tiddler.title.htmlEncode() + "\n"; s += "" + wikifyStatic(tiddler.text,null,tiddler).htmlEncode() + "\n"; for(var i=0; i\n"; s += "" + uri + "#" + encodeURIComponent(String.encodeTiddlyLink(tiddler.title)) + "\n"; s +="" + tiddler.modified.toGMTString() + "\n"; return s; }; function generateRss() { var s = []; var d = new Date(); var u = store.getTiddlerText("SiteUrl"); // Assemble the header s.push("<" + "?xml version=\"1.0\"?" + ">"); s.push(""); s.push(""); s.push("" + wikifyPlain("SiteTitle").htmlEncode() + ""); if(u) s.push("" + u.htmlEncode() + ""); s.push("" + wikifyPlain("SiteSubtitle").htmlEncode() + ""); s.push("" + config.locale + ""); s.push("Copyright " + d.getFullYear() + " " + config.options.txtUserName.htmlEncode() + ""); s.push("" + d.toGMTString() + ""); s.push("" + d.toGMTString() + ""); s.push("https://blogs.law.harvard.edu/tech/rss"); s.push("TiddlyWiki " + formatVersion() + ""); // The body var tiddlers = store.getTiddlers("modified","excludeLists"); var n = config.numRssItems > tiddlers.length ? 0 : tiddlers.length-config.numRssItems; for(var i=tiddlers.length-1; i>=n; i--) { s.push("\n" + tiddlerToRssItem(tiddlers[i],u) + "\n"); } // And footer s.push(""); s.push(""); // Save it all return s.join("\n"); } //-- //-- Filesystem code //-- function convertUTF8ToUnicode(u) { return config.browser.isOpera || !window.netscape ? manualConvertUTF8ToUnicode(u) : mozConvertUTF8ToUnicode(u); } function manualConvertUTF8ToUnicode(utf) { var uni = utf; var src = 0; var dst = 0; var b1, b2, b3; var c; while(src < utf.length) { b1 = utf.charCodeAt(src++); if(b1 < 0x80) { dst++; } else if(b1 < 0xE0) { b2 = utf.charCodeAt(src++); c = String.fromCharCode(((b1 & 0x1F) << 6) | (b2 & 0x3F)); uni = uni.substring(0,dst++).concat(c,utf.substr(src)); } else { b2 = utf.charCodeAt(src++); b3 = utf.charCodeAt(src++); c = String.fromCharCode(((b1 & 0xF) << 12) | ((b2 & 0x3F) << 6) | (b3 & 0x3F)); uni = uni.substring(0,dst++).concat(c,utf.substr(src)); } } return uni; } function mozConvertUTF8ToUnicode(u) { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; } catch(ex) { return manualConvertUTF8ToUnicode(u); } // fallback var s = converter.ConvertToUnicode(u); var fin = converter.Finish(); return fin.length > 0 ? s+fin : s; } function convertUnicodeToFileFormat(s) { return config.browser.isOpera || !window.netscape ? convertUnicodeToHtmlEntities(s) : mozConvertUnicodeToUTF8(s); } function convertUnicodeToHtmlEntities(s) { var re = /[^\u0000-\u007F]/g; return s.replace(re,function($0) {return "&#" + $0.charCodeAt(0).toString() + ";";}); } function convertUnicodeToUTF8(s) { // return convertUnicodeToFileFormat to allow plugin migration return convertUnicodeToFileFormat(s); } function manualConvertUnicodeToUTF8(s) { return unescape(encodeURIComponent(s)); } function mozConvertUnicodeToUTF8(s) { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; } catch(ex) { return manualConvertUnicodeToUTF8(s); } // fallback var u = converter.ConvertFromUnicode(s); var fin = converter.Finish(); return fin.length > 0 ? u + fin : u; } function convertUriToUTF8(uri,charSet) { if(window.netscape == undefined || charSet == undefined || charSet == "") return uri; try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); var converter = Components.classes["@mozilla.org/intl/utf8converterservice;1"].getService(Components.interfaces.nsIUTF8ConverterService); } catch(ex) { return uri; } return converter.convertURISpecToUTF8(uri,charSet); } function copyFile(dest,source) { return config.browser.isIE ? ieCopyFile(dest,source) : false; } function saveFile(fileUrl,content) { var r = mozillaSaveFile(fileUrl,content); if(!r) r = ieSaveFile(fileUrl,content); if(!r) r = javaSaveFile(fileUrl,content); return r; } function loadFile(fileUrl) { var r = mozillaLoadFile(fileUrl); if((r == null) || (r == false)) r = ieLoadFile(fileUrl); if((r == null) || (r == false)) r = javaLoadFile(fileUrl); return r; } function ieCreatePath(path) { try { var fso = new ActiveXObject("Scripting.FileSystemObject"); } catch(ex) { return null; } var pos = path.lastIndexOf("\\"); if(pos==-1) pos = path.lastIndexOf("/"); if(pos!=-1) path = path.substring(0,pos+1); var scan = [path]; var parent = fso.GetParentFolderName(path); while(parent && !fso.FolderExists(parent)) { scan.push(parent); parent = fso.GetParentFolderName(parent); } for(i=scan.length-1;i>=0;i--) { if(!fso.FolderExists(scan[i])) { fso.CreateFolder(scan[i]); } } return true; } // Returns null if it can't do it, false if there's an error, true if it saved OK function ieSaveFile(filePath,content) { ieCreatePath(filePath); try { var fso = new ActiveXObject("Scripting.FileSystemObject"); } catch(ex) { return null; } var file = fso.OpenTextFile(filePath,2,-1,0); file.Write(content); file.Close(); return true; } // Returns null if it can't do it, false if there's an error, or a string of the content if successful function ieLoadFile(filePath) { try { var fso = new ActiveXObject("Scripting.FileSystemObject"); var file = fso.OpenTextFile(filePath,1); var content = file.ReadAll(); file.Close(); } catch(ex) { return null; } return content; } function ieCopyFile(dest,source) { ieCreatePath(dest); try { var fso = new ActiveXObject("Scripting.FileSystemObject"); fso.GetFile(source).Copy(dest); } catch(ex) { return false; } return true; } // Returns null if it can't do it, false if there's an error, true if it saved OK function mozillaSaveFile(filePath,content) { if(window.Components) { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); file.initWithPath(filePath); if(!file.exists()) file.create(0,0664); var out = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); out.init(file,0x20|0x02,00004,null); out.write(content,content.length); out.flush(); out.close(); return true; } catch(ex) { return false; } } return null; } // Returns null if it can't do it, false if there's an error, or a string of the content if successful function mozillaLoadFile(filePath) { if(window.Components) { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); file.initWithPath(filePath); if(!file.exists()) return null; var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream); inputStream.init(file,0x01,00004,null); var sInputStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); sInputStream.init(inputStream); var contents = sInputStream.read(sInputStream.available()); sInputStream.close(); inputStream.close(); return contents; } catch(ex) { return false; } } return null; } function javaUrlToFilename(url) { var f = "//localhost"; if(url.indexOf(f) == 0) return url.substring(f.length); var i = url.indexOf(":"); return i > 0 ? url.substring(i-1) : url; } function javaSaveFile(filePath,content) { try { if(document.applets["TiddlySaver"]) return document.applets["TiddlySaver"].saveFile(javaUrlToFilename(filePath),"UTF-8",content); } catch(ex) { } try { var s = new java.io.PrintStream(new java.io.FileOutputStream(javaUrlToFilename(filePath))); s.print(content); s.close(); } catch(ex) { return null; } return true; } function javaLoadFile(filePath) { try { if(document.applets["TiddlySaver"]) return String(document.applets["TiddlySaver"].loadFile(javaUrlToFilename(filePath),"UTF-8")); } catch(ex) { } var content = []; try { var r = new java.io.BufferedReader(new java.io.FileReader(javaUrlToFilename(filePath))); var line; while((line = r.readLine()) != null) content.push(new String(line)); r.close(); } catch(ex) { return null; } return content.join("\n"); } //-- //-- Server adaptor base class //-- function AdaptorBase() { this.host = null; this.store = null; return this; } AdaptorBase.prototype.close = function() { return true; }; AdaptorBase.prototype.fullHostName = function(host) { if(!host) return ''; host = host.trim(); if(!host.match(/:\/\//)) host = 'https://' + host; if(host.substr(host.length-1) == '/') host = host.substr(0,host.length-1); return host; }; AdaptorBase.minHostName = function(host) { return host ? host.replace(/^https:\/\//,'').replace(/\/$/,'') : ''; }; AdaptorBase.prototype.setContext = function(context,userParams,callback) { if(!context) context = {}; context.userParams = userParams; if(callback) context.callback = callback; context.adaptor = this; if(!context.host) context.host = this.host; context.host = this.fullHostName(context.host); if(!context.workspace) context.workspace = this.workspace; return context; }; // Open the specified host AdaptorBase.prototype.openHost = function(host,context,userParams,callback) { this.host = host; context = this.setContext(context,userParams,callback); context.status = true; if(callback) window.setTimeout(function() {context.callback(context,userParams);},10); return true; }; // Open the specified workspace AdaptorBase.prototype.openWorkspace = function(workspace,context,userParams,callback) { this.workspace = workspace; context = this.setContext(context,userParams,callback); context.status = true; if(callback) window.setTimeout(function() {callback(context,userParams);},10); return true; }; //-- //-- Server adaptor for talking to static TiddlyWiki files //-- function FileAdaptor() { } FileAdaptor.prototype = new AdaptorBase(); FileAdaptor.serverType = 'file'; FileAdaptor.serverLabel = 'TiddlyWiki'; FileAdaptor.loadTiddlyWikiCallback = function(status,context,responseText,url,xhr) { context.status = status; if(!status) { context.statusText = "Error reading file"; } else { context.adaptor.store = new TiddlyWiki(); if(!context.adaptor.store.importTiddlyWiki(responseText)) { context.statusText = config.messages.invalidFileError.format([url]); context.status = false; } } context.complete(context,context.userParams); }; // Get the list of workspaces on a given server FileAdaptor.prototype.getWorkspaceList = function(context,userParams,callback) { context = this.setContext(context,userParams,callback); context.workspaces = [{title:"(default)"}]; context.status = true; if(callback) window.setTimeout(function() {callback(context,userParams);},10); return true; }; // Gets the list of tiddlers within a given workspace FileAdaptor.prototype.getTiddlerList = function(context,userParams,callback,filter) { context = this.setContext(context,userParams,callback); if(!context.filter) context.filter = filter; context.complete = FileAdaptor.getTiddlerListComplete; if(this.store) { var ret = context.complete(context,context.userParams); } else { ret = loadRemoteFile(context.host,FileAdaptor.loadTiddlyWikiCallback,context); if(typeof ret != "string") ret = true; } return ret; }; FileAdaptor.getTiddlerListComplete = function(context,userParams) { if(context.status) { if(context.filter) { context.tiddlers = context.adaptor.store.filterTiddlers(context.filter); } else { context.tiddlers = []; context.adaptor.store.forEachTiddler(function(title,tiddler) {context.tiddlers.push(tiddler);}); } for(var i=0; ix2) return -1; } x1 = v1.beta || 9999; x2 = v2.beta || 9999; if(x1 x2 ? -1 : 0; } function createTiddlyButton(parent,text,tooltip,action,className,id,accessKey,attribs) { var btn = document.createElement("a"); if(action) { btn.onclick = action; btn.setAttribute("href","javascript:;"); } if(tooltip) btn.setAttribute("title",tooltip); if(text) btn.appendChild(document.createTextNode(text)); btn.className = className || "button"; if(id) btn.id = id; if(attribs) { for(var i in attribs) { btn.setAttribute(i,attribs[i]); } } if(parent) parent.appendChild(btn); if(accessKey) btn.setAttribute("accessKey",accessKey); return btn; } function createTiddlyLink(place,title,includeText,className,isStatic,linkedFromTiddler,noToggle) { var text = includeText ? title : null; var i = getTiddlyLinkInfo(title,className); var btn = isStatic ? createExternalLink(place,store.getTiddlerText("SiteUrl",null) + "#" + title) : createTiddlyButton(place,text,i.subTitle,onClickTiddlerLink,i.classes); if(isStatic) btn.className += ' ' + className; btn.setAttribute("refresh","link"); btn.setAttribute("tiddlyLink",title); if(noToggle) btn.setAttribute("noToggle","true"); if(linkedFromTiddler) { var fields = linkedFromTiddler.getInheritedFields(); if(fields) btn.setAttribute("tiddlyFields",fields); } return btn; } function refreshTiddlyLink(e,title) { var i = getTiddlyLinkInfo(title,e.className); e.className = i.classes; e.title = i.subTitle; } function getTiddlyLinkInfo(title,currClasses) { var classes = currClasses ? currClasses.split(" ") : []; classes.pushUnique("tiddlyLink"); var tiddler = store.fetchTiddler(title); var subTitle; if(tiddler) { subTitle = tiddler.getSubtitle(); classes.pushUnique("tiddlyLinkExisting"); classes.remove("tiddlyLinkNonExisting"); classes.remove("shadow"); } else { classes.remove("tiddlyLinkExisting"); classes.pushUnique("tiddlyLinkNonExisting"); if(store.isShadowTiddler(title)) { subTitle = config.messages.shadowedTiddlerToolTip.format([title]); classes.pushUnique("shadow"); } else { subTitle = config.messages.undefinedTiddlerToolTip.format([title]); classes.remove("shadow"); } } if(typeof config.annotations[title]=="string") subTitle = config.annotations[title]; return {classes: classes.join(" "),subTitle: subTitle}; } function createExternalLink(place,url,label) { var link = document.createElement("a"); link.className = "externalLink"; link.href = url; link.title = config.messages.externalLinkTooltip.format([url]); if(config.options.chkOpenInNewWindow) link.target = "_blank"; place.appendChild(link); if(label) createTiddlyText(link, label); return link; } // Event handler for clicking on a tiddly link function onClickTiddlerLink(ev) { var e = ev || window.event; var target = resolveTarget(e); var link = target; var title = null; var fields = null; var noToggle = null; do { title = link.getAttribute("tiddlyLink"); fields = link.getAttribute("tiddlyFields"); noToggle = link.getAttribute("noToggle"); link = link.parentNode; } while(title == null && link != null); if(!store.isShadowTiddler(title)) { var f = fields ? fields.decodeHashMap() : {}; fields = String.encodeHashMap(merge(f,config.defaultCustomFields,true)); } if(title) { var toggling = e.metaKey || e.ctrlKey; if(config.options.chkToggleLinks) toggling = !toggling; if(noToggle) toggling = false; if(store.getTiddler(title)) fields = null; story.displayTiddler(target,title,null,true,null,fields,toggling); } clearMessage(); return false; } // Create a button for a tag with a popup listing all the tiddlers that it tags function createTagButton(place,tag,excludeTiddler,title,tooltip) { var btn = createTiddlyButton(place,title||tag,(tooltip||config.views.wikified.tag.tooltip).format([tag]),onClickTag); btn.setAttribute("tag",tag); if(excludeTiddler) btn.setAttribute("tiddler",excludeTiddler); return btn; } // Event handler for clicking on a tiddler tag function onClickTag(ev) { var e = ev || window.event; var popup = Popup.create(this); addClass(popup,"taggedTiddlerList"); var tag = this.getAttribute("tag"); var title = this.getAttribute("tiddler"); if(popup && tag) { var tagged = store.getTaggedTiddlers(tag); var titles = []; var li,r; for(r=0;r 0) { var openAll = createTiddlyButton(createTiddlyElement(popup,"li"),lingo.openAllText.format([tag]),lingo.openAllTooltip,onClickTagOpenAll); openAll.setAttribute("tag",tag); createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div"); for(r=0; r= this.endTime) { this.stop(); return false; } return true; }; //-- //-- Zoomer animation //-- function Zoomer(text,startElement,targetElement,unused) { var e = createTiddlyElement(document.body,"div",null,"zoomer"); createTiddlyElement(e,"div",null,null,text); var winWidth = findWindowWidth(); var winHeight = findWindowHeight(); var p = [ {style: 'left', start: findPosX(startElement), end: findPosX(targetElement), template: '%0px'}, {style: 'top', start: findPosY(startElement), end: findPosY(targetElement), template: '%0px'}, {style: 'width', start: Math.min(startElement.scrollWidth,winWidth), end: Math.min(targetElement.scrollWidth,winWidth), template: '%0px', atEnd: 'auto'}, {style: 'height', start: Math.min(startElement.scrollHeight,winHeight), end: Math.min(targetElement.scrollHeight,winHeight), template: '%0px', atEnd: 'auto'}, {style: 'fontSize', start: 8, end: 24, template: '%0pt'} ]; var c = function(element,properties) {removeNode(element);}; return new Morpher(e,config.animDuration,p,c); } //-- //-- Scroller animation //-- function Scroller(targetElement) { var p = [{style: '-tw-vertScroll', start: findScrollY(), end: ensureVisible(targetElement)}]; return new Morpher(targetElement,config.animDuration,p); } //-- //-- Slider animation //-- // deleteMode - "none", "all" [delete target element and it's children], [only] "children" [but not the target element] function Slider(element,opening,unused,deleteMode) { element.style.overflow = 'hidden'; if(opening) element.style.height = '0px'; // Resolves a Firefox flashing bug element.style.display = 'block'; var left = findPosX(element); var width = element.scrollWidth; var height = element.scrollHeight; var winWidth = findWindowWidth(); var p = []; var c = null; if(opening) { p.push({style: 'height', start: 0, end: height, template: '%0px', atEnd: 'auto'}); p.push({style: 'opacity', start: 0, end: 1, template: '%0'}); p.push({style: 'filter', start: 0, end: 100, template: 'alpha(opacity:%0)'}); } else { p.push({style: 'height', start: height, end: 0, template: '%0px'}); p.push({style: 'display', atEnd: 'none'}); p.push({style: 'opacity', start: 1, end: 0, template: '%0'}); p.push({style: 'filter', start: 100, end: 0, template: 'alpha(opacity:%0)'}); switch(deleteMode) { case "all": c = function(element,properties) {removeNode(element);}; break; case "children": c = function(element,properties) {removeChildren(element);}; break; } } return new Morpher(element,config.animDuration,p,c); } //-- //-- Popup menu //-- var Popup = { stack: [] // Array of objects with members root: and popup: }; Popup.create = function(root,elem,className) { var stackPosition = this.find(root,"popup"); Popup.remove(stackPosition+1); var popup = createTiddlyElement(document.body,elem || "ol","popup",className || "popup"); popup.stackPosition = stackPosition; Popup.stack.push({root: root, popup: popup}); return popup; }; Popup.onDocumentClick = function(ev) { var e = ev || window.event; if(e.eventPhase == undefined) Popup.remove(); else if(e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET) Popup.remove(); return true; }; Popup.show = function(valign,halign,offset) { var curr = Popup.stack[Popup.stack.length-1]; this.place(curr.root,curr.popup,valign,halign,offset); addClass(curr.root,"highlight"); if(config.options.chkAnimate && anim && typeof Scroller == "function") anim.startAnimating(new Scroller(curr.popup)); else window.scrollTo(0,ensureVisible(curr.popup)); }; Popup.place = function(root,popup,valign,halign,offset) { if(!offset) var offset = {x:0,y:0}; if(popup.stackPosition >= 0 && !valign && !halign) { offset.x = offset.x + root.offsetWidth; } else { offset.x = (halign == "right") ? offset.x + root.offsetWidth : offset.x; offset.y = (valign == "top") ? offset.y : offset.y + root.offsetHeight; } var rootLeft = findPosX(root); var rootTop = findPosY(root); var popupLeft = rootLeft + offset.x; var popupTop = rootTop + offset.y; var winWidth = findWindowWidth(); if(popup.offsetWidth > winWidth*0.75) popup.style.width = winWidth*0.75 + "px"; var popupWidth = popup.offsetWidth; var scrollWidth = winWidth - document.body.offsetWidth; if(popupLeft + popupWidth > winWidth - scrollWidth - 1) { if(halign == "right") popupLeft = popupLeft - root.offsetWidth - popupWidth; else popupLeft = winWidth - popupWidth - scrollWidth - 1; } popup.style.left = popupLeft + "px"; popup.style.top = popupTop + "px"; popup.style.display = "block"; }; Popup.find = function(e) { var pos = -1; for (var t=this.stack.length-1; t>=0; t--) { if(isDescendant(e,this.stack[t].popup)) pos = t; } return pos; }; Popup.remove = function(pos) { if(!pos) var pos = 0; if(Popup.stack.length > pos) { Popup.removeFrom(pos); } }; Popup.removeFrom = function(from) { for(var t=Popup.stack.length-1; t>=from; t--) { var p = Popup.stack[t]; removeClass(p.root,"highlight"); removeNode(p.popup); } Popup.stack = Popup.stack.slice(0,from); }; //-- //-- Wizard support //-- function Wizard(elem) { if(elem) { this.formElem = findRelated(elem,"wizard","className"); this.bodyElem = findRelated(this.formElem.firstChild,"wizardBody","className","nextSibling"); this.footElem = findRelated(this.formElem.firstChild,"wizardFooter","className","nextSibling"); } else { this.formElem = null; this.bodyElem = null; this.footElem = null; } } Wizard.prototype.setValue = function(name,value) { if(this.formElem) this.formElem[name] = value; }; Wizard.prototype.getValue = function(name) { return this.formElem ? this.formElem[name] : null; }; Wizard.prototype.createWizard = function(place,title) { this.formElem = createTiddlyElement(place,"form",null,"wizard"); createTiddlyElement(this.formElem,"h1",null,null,title); this.bodyElem = createTiddlyElement(this.formElem,"div",null,"wizardBody"); this.footElem = createTiddlyElement(this.formElem,"div",null,"wizardFooter"); }; Wizard.prototype.clear = function() { removeChildren(this.bodyElem); }; Wizard.prototype.setButtons = function(buttonInfo,status) { removeChildren(this.footElem); for(var t=0; t max) c = max; return Number(c); }; // Add indexOf function if browser does not support it if(!Array.indexOf) { Array.prototype.indexOf = function(item,from) { if(!from) from = 0; for(var i=from; i "backgroundColor") String.prototype.unDash = function() { var s = this.split("-"); if(s.length > 1) { for(var t=1; t currPos) r.push(this.substring(currPos,match.index)); r.push(substrings[parseInt(match[1])]); currPos = subRegExp.lastIndex; } } while(match); if(currPos < this.length) r.push(this.substring(currPos,this.length)); return r.join(""); }; // Escape any special RegExp characters with that character preceded by a backslash String.prototype.escapeRegExp = function() { var s = "\\^$*+?()=!|,{}[]."; var c = this; for(var t=0; t to ">" and " to """ String.prototype.htmlEncode = function() { return this.replace(/&/mg,"&").replace(//mg,">").replace(/\"/mg,"""); }; // Convert "&" to &, "<" to <, ">" to > and """ to " String.prototype.htmlDecode = function() { return this.replace(/</mg,"<").replace(/>/mg,">").replace(/"/mg,"\"").replace(/&/mg,"&"); }; // Parse a space-separated string of name:value parameters // The result is an array of objects: // result[0] = object with a member for each parameter name, value of that member being an array of values // result[1..n] = one object for each parameter, with 'name' and 'value' members String.prototype.parseParams = function(defaultName,defaultValue,allowEval,noNames,cascadeDefaults) { var parseToken = function(match,p) { var n; if(match[p]) // Double quoted n = match[p]; else if(match[p+1]) // Single quoted n = match[p+1]; else if(match[p+2]) // Double-square-bracket quoted n = match[p+2]; else if(match[p+3]) // Double-brace quoted try { n = match[p+3]; if(allowEval) n = window.eval(n); } catch(ex) { throw "Unable to evaluate {{" + match[p+3] + "}}: " + exceptionText(ex); } else if(match[p+4]) // Unquoted n = match[p+4]; else if(match[p+5]) // empty quote n = ""; return n; }; var r = [{}]; var dblQuote = "(?:\"((?:(?:\\\\\")|[^\"])+)\")"; var sngQuote = "(?:'((?:(?:\\\\\')|[^'])+)')"; var dblSquare = "(?:\\[\\[((?:\\s|\\S)*?)\\]\\])"; var dblBrace = "(?:\\{\\{((?:\\s|\\S)*?)\\}\\})"; var unQuoted = noNames ? "([^\"'\\s]\\S*)" : "([^\"':\\s][^\\s:]*)"; var emptyQuote = "((?:\"\")|(?:''))"; var skipSpace = "(?:\\s*)"; var token = "(?:" + dblQuote + "|" + sngQuote + "|" + dblSquare + "|" + dblBrace + "|" + unQuoted + "|" + emptyQuote + ")"; var re = noNames ? new RegExp(token,"mg") : new RegExp(skipSpace + token + skipSpace + "(?:(\\:)" + skipSpace + token + ")?","mg"); var params = []; do { var match = re.exec(this); if(match) { var n = parseToken(match,1); if(noNames) { r.push({name:"",value:n}); } else { var v = parseToken(match,8); if(v == null && defaultName) { v = n; n = defaultName; } else if(v == null && defaultValue) { v = defaultValue; } r.push({name:n,value:v}); if(cascadeDefaults) { defaultName = n; defaultValue = v; } } } } while(match); // Summarise parameters into first element for(var t=1; t 12 ? h-12 : ( h > 0 ? h : 12 ); }; Date.prototype.getAmPm = function() { return this.getHours() >= 12 ? config.messages.dates.pm : config.messages.dates.am; }; Date.prototype.daySuffix = function() { return config.messages.dates.daySuffixes[this.getDate()-1]; }; // Convert a date to local YYYYMMDDHHMM string format Date.prototype.convertToLocalYYYYMMDDHHMM = function() { return this.getFullYear() + String.zeroPad(this.getMonth()+1,2) + String.zeroPad(this.getDate(),2) + String.zeroPad(this.getHours(),2) + String.zeroPad(this.getMinutes(),2); }; // Convert a date to UTC YYYYMMDDHHMM string format Date.prototype.convertToYYYYMMDDHHMM = function() { return this.getUTCFullYear() + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2); }; // Convert a date to UTC YYYYMMDD.HHMMSSMMM string format Date.prototype.convertToYYYYMMDDHHMMSSMMM = function() { return this.getUTCFullYear() + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + "." + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2) + String.zeroPad(this.getUTCSeconds(),2) + String.zeroPad(this.getUTCMilliseconds(),4); }; // Static method to create a date from a UTC YYYYMMDDHHMM format string Date.convertFromYYYYMMDDHHMM = function(d) { var hh = d.substr(8,2) || "00"; var mm = d.substr(10,2) || "00"; return new Date(Date.UTC(parseInt(d.substr(0,4),10), parseInt(d.substr(4,2),10)-1, parseInt(d.substr(6,2),10), parseInt(hh,10), parseInt(mm,10),0,0)); }; //-- //-- RGB colour object //-- // Construct an RGB colour object from a '#rrggbb', '#rgb' or 'rgb(n,n,n)' string or from separate r,g,b values function RGB(r,g,b) { this.r = 0; this.g = 0; this.b = 0; if(typeof r == "string") { if(r.substr(0,1) == "#") { if(r.length == 7) { this.r = parseInt(r.substr(1,2),16)/255; this.g = parseInt(r.substr(3,2),16)/255; this.b = parseInt(r.substr(5,2),16)/255; } else { this.r = parseInt(r.substr(1,1),16)/15; this.g = parseInt(r.substr(2,1),16)/15; this.b = parseInt(r.substr(3,1),16)/15; } } else { var rgbPattern = /rgb\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/; var c = r.match(rgbPattern); if(c) { this.r = parseInt(c[1],10)/255; this.g = parseInt(c[2],10)/255; this.b = parseInt(c[3],10)/255; } } } else { this.r = r; this.g = g; this.b = b; } return this; } // Mixes this colour with another in a specified proportion // c = other colour to mix // f = 0..1 where 0 is this colour and 1 is the new colour // Returns an RGB object RGB.prototype.mix = function(c,f) { return new RGB(this.r + (c.r-this.r) * f,this.g + (c.g-this.g) * f,this.b + (c.b-this.b) * f); }; // Return an rgb colour as a #rrggbb format hex string RGB.prototype.toString = function() { return "#" + ("0" + Math.floor(this.r.clamp(0,1) * 255).toString(16)).right(2) + ("0" + Math.floor(this.g.clamp(0,1) * 255).toString(16)).right(2) + ("0" + Math.floor(this.b.clamp(0,1) * 255).toString(16)).right(2); }; //-- //-- DOM utilities - many derived from www.quirksmode.org //-- // Resolve the target object of an event function resolveTarget(e) { var obj; if(e.target) obj = e.target; else if(e.srcElement) obj = e.srcElement; if(obj.nodeType == 3) // defeat Safari bug obj = obj.parentNode; return obj; } function drawGradient(place,horiz,locolors,hicolors) { if(!hicolors) hicolors = locolors; for(var t=0; t<= 100; t+=2) { var bar = document.createElement("div"); place.appendChild(bar); bar.style.position = "absolute"; bar.style.left = horiz ? t + "%" : 0; bar.style.top = horiz ? 0 : t + "%"; bar.style.width = horiz ? (101-t) + "%" : "100%"; bar.style.height = horiz ? "100%" : (101-t) + "%"; bar.style.zIndex = -1; var p = t/100*(locolors.length-1); var hc = hicolors[Math.floor(p)]; if(typeof hc == "string") hc = new RGB(hc); var lc = locolors[Math.ceil(p)]; if(typeof lc == "string") lc = new RGB(lc); bar.style.backgroundColor = hc.mix(lc,p-Math.floor(p)).toString(); } } function createTiddlyText(parent,text) { return parent.appendChild(document.createTextNode(text)); } function createTiddlyCheckbox(parent,caption,checked,onChange) { var cb = document.createElement("input"); cb.setAttribute("type","checkbox"); cb.onclick = onChange; parent.appendChild(cb); cb.checked = checked; cb.className = "chkOptionInput"; if(caption) wikify(caption,parent); return cb; } function createTiddlyElement(parent,element,id,className,text,attribs) { var e = document.createElement(element); if(className != null) e.className = className; if(id != null) e.setAttribute("id",id); if(text != null) e.appendChild(document.createTextNode(text)); if(attribs) { for(var n in attribs) { e.setAttribute(n,attribs[n]); } } if(parent != null) parent.appendChild(e); return e; } function addEvent(obj,type,fn) { if(obj.attachEvent) { obj["e"+type+fn] = fn; obj[type+fn] = function(){obj["e"+type+fn](window.event);}; obj.attachEvent("on"+type,obj[type+fn]); } else { obj.addEventListener(type,fn,false); } } function removeEvent(obj,type,fn) { if(obj.detachEvent) { obj.detachEvent("on"+type,obj[type+fn]); obj[type+fn] = null; } else { obj.removeEventListener(type,fn,false); } } // Find the closest relative with a given property value (property defaults to tagName, relative defaults to parentNode) function findRelated(e,value,name,relative) { name = name || "tagName"; relative = relative || "parentNode"; if(name == "className") { while(e && !hasClass(e,value)) { e = e[relative]; } } else { while(e && e[name] != value) { e = e[relative]; } } return e; } // Get the scroll position for window.scrollTo necessary to scroll a given element into view function ensureVisible(e) { var posTop = findPosY(e); var posBot = posTop + e.offsetHeight; var winTop = findScrollY(); var winHeight = findWindowHeight(); var winBot = winTop + winHeight; if(posTop < winTop) { return posTop; } else if(posBot > winBot) { if(e.offsetHeight < winHeight) return posTop - (winHeight - e.offsetHeight); else return posTop; } else { return winTop; } } // Get the current width of the display window function findWindowWidth() { return window.innerWidth || document.documentElement.clientWidth; } // Get the current height of the display window function findWindowHeight() { return window.innerHeight || document.documentElement.clientHeight; } // Get the current horizontal page scroll position function findScrollX() { return window.scrollX || document.documentElement.scrollLeft; } // Get the current vertical page scroll position function findScrollY() { return window.scrollY || document.documentElement.scrollTop; } function findPosX(obj) { var curleft = 0; while(obj.offsetParent) { curleft += obj.offsetLeft; obj = obj.offsetParent; } return curleft; } function findPosY(obj) { var curtop = 0; while(obj.offsetParent) { curtop += obj.offsetTop; obj = obj.offsetParent; } return curtop; } // Blur a particular element function blurElement(e) { if(e && e.focus && e.blur) { e.focus(); e.blur(); } } // Create a non-breaking space function insertSpacer(place) { var e = document.createTextNode(String.fromCharCode(160)); if(place) place.appendChild(e); return e; } // Force the browser to do a document reflow when needed to workaround browser bugs function forceReflow() { if(config.browser.isGecko) { setStylesheet("body {top:0px;margin-top:0px;}","forceReflow"); setTimeout(function() {setStylesheet("","forceReflow");},1); } } // Replace the current selection of a textarea or text input and scroll it into view function replaceSelection(e,text) { if(e.setSelectionRange) { var oldpos = e.selectionStart; var isRange = e.selectionEnd > e.selectionStart; e.value = e.value.substr(0,e.selectionStart) + text + e.value.substr(e.selectionEnd); e.setSelectionRange(isRange ? oldpos : oldpos + text.length,oldpos + text.length); var linecount = e.value.split("\n").length; var thisline = e.value.substr(0,e.selectionStart).split("\n").length-1; e.scrollTop = Math.floor((thisline - e.rows / 2) * e.scrollHeight / linecount); } else if(document.selection) { var range = document.selection.createRange(); if(range.parentElement() == e) { var isCollapsed = range.text == ""; range.text = text; if(!isCollapsed) { range.moveStart("character", -text.length); range.select(); } } } } // Returns the text of the given (text) node, possibly merging subsequent text nodes function getNodeText(e) { var t = ""; while(e && e.nodeName == "#text") { t += e.nodeValue; e = e.nextSibling; } return t; } // Returns true if the element e has a given ancestor element function isDescendant(e,ancestor) { while(e) { if(e === ancestor) return true; e = e.parentNode; } return false; } // deprecate the following... // Prevent an event from bubbling function stopEvent(e) { var ev = e || window.event; ev.cancelBubble = true; if(ev.stopPropagation) ev.stopPropagation(); return false; } // Remove any event handlers or non-primitve custom attributes function scrubNode(e) { if(!config.browser.isIE) return; var att = e.attributes; if(att) { for(var t=0; t= 0; i--) { var name = attrs[i].name; if(attrs[i].specified && !TiddlyWiki.isStandardField(name)) { fields[name] = attrs[i].value.unescapeLineBreaks(); } } tiddler.assign(title,text,modifier,modified,tags,created,fields); return tiddler; }; //-- //-- TW21Saver (inherits from SaverBase) //-- function TW21Saver() {} TW21Saver.prototype = new SaverBase(); TW21Saver.prototype.externalizeTiddler = function(store,tiddler) { try { var extendedAttributes = ""; var usePre = config.options.chkUsePreForStorage; store.forEachField(tiddler, function(tiddler,fieldName,value) { // don't store stuff from the temp namespace if(typeof value != "string") value = ""; if(!fieldName.match(/^temp\./)) extendedAttributes += ' %0="%1"'.format([fieldName,value.escapeLineBreaks().htmlEncode()]); },true); var created = tiddler.created; var modified = tiddler.modified; var attributes = tiddler.modifier ? ' modifier="' + tiddler.modifier.htmlEncode() + '"' : ""; attributes += (usePre && created == version.date) ? "" :' created="' + created.convertToYYYYMMDDHHMM() + '"'; attributes += (usePre && modified == created) ? "" : ' modified="' + modified.convertToYYYYMMDDHHMM() +'"'; var tags = tiddler.getTags(); if(!usePre || tags) attributes += ' tags="' + tags.htmlEncode() + '"'; return ('
    %4').format([ usePre ? "title" : "tiddler", tiddler.title.htmlEncode(), attributes, extendedAttributes, usePre ? "\n
    " + tiddler.text.htmlEncode() + "
    \n" : tiddler.text.escapeLineBreaks().htmlEncode() ]); } catch (ex) { throw exceptionText(ex,config.messages.tiddlerSaveError.format([tiddler.title])); } }; //]]>