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
<!--{{{-->
<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>>
<<importTiddlers>>
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
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]]
<!--{{{-->
<div class='header' role='banner' 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' role='navigation' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' role='navigation' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' role='complementary' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea' role='main'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
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='toolbar' role='navigation' 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>
<!--}}}-->
/***
|''Name''|RefreshTiddlerCommand|
|''Version''|0.3.0|
***/
//{{{
(function($) {

var cmd = config.commands.refreshTiddler = {
	text: "refresh",
	locale: {
		refreshing: "Refreshing tiddler..."
	},
	tooltip: "refresh this tiddler to be the one on the server",
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(!tiddler) {
			tiddler = new Tiddler(title);
			merge(tiddler.fields, config.defaultCustomFields);
		}
		$(story.getTiddler(title)).find(".viewer").
			empty().text(cmd.locale.refreshing);
		var dirtyStatus = store.isDirty();
		story.loadMissingTiddler(title, {
			"server.workspace": tiddler.fields["server.recipe"]  ? "recipes/" + tiddler.fields["server.recipe"] :
				tiddler.fields["server.workspace"] || "bags/"+tiddler.fields["server.bag"],
			"server.host": tiddler.fields["server.host"],
			"server.type": tiddler.fields["server.type"]
		}, function() {
			store.setDirty(dirtyStatus);
		});
	}
};

})(jQuery);
//}}}
|Month|1|2|3|4|5|
|Jon's Money|100|200|700|800|300|
|Colm's Money|50|500|300|900|700|
|Matt's Money|250|550|330|400|2700|
A [[SiteIcon|SiteIcon tiddler]]@glossary helps provide some identity to your space.  Ideally it'd be a square and a minimum of 48*48 pixels size.  You can upload your site icon using the uploader below.

<<binaryUploadPublic title:SiteIcon>>
|status |<<ValueSwitcher type:"dropdown" valuesSource:"StatusDefinitions">> |owner |<<ValueSwitcher type:"dropdown" valuesSource:"UserDefinitions">> |
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
/***
|''Name''|TiddlyFileImporter|
|''Version''|0.3.8|
|''Author''|Ben Gillies|
|''Type''|plugin|
|''Description''|Upload a TiddlyWiki file to TiddlyWeb, and import the tiddlers.|
!Usage
Upload a TiddlyWiki file to TiddlyWeb, and import the tiddlers.
!Requires
tiddlyweb
tiddlywebplugins.reflector
!Code
***/
//{{{
(function($){
if(!version.extensions.TiddlyFileImporter)
{ //# ensure that the plugin is only installed once
	version.extensions.TiddlyFileImporter = { installed: true };
}

config.macros.fileImport = {
	reflectorURI: '/reflector?csrf_token=%0',
	incorrectTypeError: 'Incorrect File Type. You must upload a TiddlyWiki',
	uploadLabel: 'Upload',
	uploadLabelPrompt: 'Import tiddlers from this TiddlyWiki',
	step1FileText: 'File:',
	step1PostText: 'In the next screen you will select the tiddlers to import.',
	step1Title: 'Step 1: Pick a TiddlyWiki to import',
	step1TypeChooser: 'Import From:',
	step3Html: ['<input type="hidden" name="markList" />',
		'<input type="hidden" checked="true" name="chkSync" />',
		'<input type="hidden" name="chkSave" />',
		'<input type="hidden" name="txtSaveTiddler" />'].join(),

	handler: function(place, macroName, params, wikifier, paramString) {
		var wizard = new Wizard();
		wizard.createWizard(place, 'Import a TiddlyWiki');
		this.restart(wizard);
	},

	restart: function(wizard) {
		var me = config.macros.fileImport;
		wizard.addStep(me.step1Title, ['<input type="hidden" ',
			'name="markList" />'].join(""));
		var markList = wizard.getElement('markList');
		var uploadWrapper = document.createElement('div');
		markList.parentNode.insertBefore(uploadWrapper, markList);
		uploadWrapper.setAttribute('refresh', 'macro');
		uploadWrapper.getAttribute('macroName', 'fileImport');
		var iframeName = 'reflectorImporter' + Math.random().toString();
		me.createForm(uploadWrapper, wizard, iframeName);
		$(uploadWrapper).append('<p>' + me.step1PostText + '</p>');
		wizard.setValue('serverType', 'tiddlyweb');
		wizard.setValue('adaptor', new config.adaptors.file());
		wizard.setValue('host', config.defaultCustomFields['server.host']);
		wizard.setValue('context', {});
		var iframe = $(['<iframe name="' + iframeName + '" ',
			'style="display: none" />'].join("")).appendTo(uploadWrapper);
		var onSubmit = function(ev) {
			var uploadType = $('select[name=uploadtype]', wizard.formElem).val();
			if (uploadType == "file") {
				// set an onload ready to hijack the form
				me.setOnLoad(uploadWrapper, wizard, iframe[0]);
				wizard.importType = 'file';
				wizard.formElem.submit();
			} else {
				var csrf_token = config.extensions.tiddlyspace.getCSRFToken();
				$.ajax({
					url: "%0/reflector?csrf_token=%1".format(
						config.defaultCustomFields["server.host"], csrf_token),
					type: "POST",
					dataType: "text",
					data: {
						uri: $("input", ".importFrom", wizard.formElem).val()
					},
					success: function(data, txtStatus, xhr) {
						wizard.POSTResponse = data;
						me.importTiddlers(uploadWrapper, wizard);
					},
					error: function(xhr, txtStatus, error) {
						displayMessage(["There was an error fetching the ",
							'url: ', txtStatus].join(""));
						me.restart(wizard);
					}
				});
				return false;
			}
		};
		wizard.setButtons([{
			caption: me.uploadLabel,
			tooltip: me.uploadLabelPrompt,
			onClick: onSubmit
		}]);
		$(wizard.formElem).submit(function(ev) {
			onSubmit(ev);
			ev.preventDefault();
		});
	},

	createForm: function(place, wizard, iframeName) {
		var form = wizard.formElem;
		var me = config.macros.fileImport;
		form.action = me.reflectorURI.format(
			config.extensions.tiddlyspace.getCSRFToken());
		form.enctype = 'multipart/form-data';
		form.encoding = 'multipart/form-data';
		form.method = 'POST';
		form.target = iframeName;
		onSelectChange = function(e) {
			var changeTo = $(this).val();
			if (changeTo == "file") {
				$(".importFrom").html('%0 <input type="file" name="file" />'.
					format(me.step1FileText));
			} else {
				$(".importFrom").html('URL: <input type="text" name="uri" />'
					+ ' Do you want <a target="_blank" href="http://faq.tiddlyspace.com/How%20do%20I%20include%2Fexclude%20spaces%3F">inclusion</a> instead?');
			}
		};
		$(place).append('<span>%0</span>'.format(me.step1TypeChooser)).
			append($(['<select name="uploadtype"><option value="file" selected="selected">file',
				'<option value="uri">url</select>'].join("")).change(onSelectChange)).
			append('<div class="importFrom">%0<input type="file" name="file" /></div>'.
					format(me.step1FileText));
	},

	setOnLoad: function(place, wizard, iframe) {
		var me = config.macros.fileImport;
		var loadHandler = function() {
			me.importTiddlers.apply(this, [place, wizard, iframe]);
		};
		iframe.onload = loadHandler;
		completeReadyStateChanges = 0;
		iframe.onreadystatechange = function() {
			if (++(completeReadyStateChanges) == 5) {
				loadHandler();
			}
		};
	},

	importTiddlers: function(place, wizard, iframe) {
		var tmpStore = new TiddlyWiki();
		var POSTedWiki = "";
		if (wizard.importType == "file") {
			try {
				POSTedWiki= iframe.contentWindow
					.document.documentElement.innerHTML;
			} catch(e) {
				displayMessage(config.macros.fileImport.incorrectTypeError);
				config.macros.fileImport.restart(wizard);
				return;
			}
			// now we are done, so remove the iframe
			$(iframe).remove();
		} else {
			POSTedWiki = wizard.POSTResponse;
		}

		tmpStore.importTiddlyWiki(POSTedWiki);
		var newTiddlers = tmpStore.getTiddlers();
		var workspace = config.defaultCustomFields['server.workspace'];
		var context = {
			status: true,
			statusText: 'OK',
			httpStatus: 200,
			adaptor: wizard.getValue('adaptor'),
			tiddlers: newTiddlers
		};
		context.adaptor.store = tmpStore;
		wizard.setValue('context', context);
		wizard.setValue('workspace', workspace);
		wizard.setValue('inFileImport', true);
		config.macros.importTiddlers.onGetTiddlerList(context, wizard);
	}
};

var _onGetTiddler = config.macros.importTiddlers.onGetTiddler;
config.macros.importTiddlers.onGetTiddler = function(context, wizard) {
	if (wizard.getValue('inFileImport')) {
		var me = config.macros.importTiddlers;
		if(!context.status)
			displayMessage("Error in importTiddlers.onGetTiddler: " + context.statusText);
		var tiddler = context.tiddler;
		var fields = tiddler.fields;
		merge(fields, config.defaultCustomFields);
		fields["server.workspace"] = wizard.getValue('workspace');
		delete fields['server.permissions'];
		delete fields['server.bag'];
		fields['server.page.revision'] = 'false';
		delete fields['server.recipe'];
		fields.changecount = 1;
		store.suspendNotifications();
		store.saveTiddler(tiddler.title, tiddler.title, tiddler.text,
			tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields,
			false, tiddler.created);
		store.resumeNotifications();
		var remainingImports = wizard.getValue("remainingImports")-1;
		wizard.setValue("remainingImports",remainingImports);
		if(remainingImports === 0) {
			if(context.isSynchronous) {
				store.notifyAll();
				refreshDisplay();
			}
			wizard.setButtons([
					{caption: me.doneLabel, tooltip: me.donePrompt, onClick: me.onClose}
				],me.statusDoneImport);
			autoSaveChanges();
		}
	} else {
		_onGetTiddler.apply(this, arguments);
	}
};

var _onCancel = config.macros.importTiddlers.onCancel;
config.macros.importTiddlers.onCancel = function(e)
{
	var wizard = new Wizard(this);
	if (!wizard.getValue('inFileImport')) {
		return _onCancel.apply(this, arguments);
	}
	var place = wizard.clear();
	config.macros.fileImport.restart(wizard);
	return false;
};

var _step3Html = config.macros.importTiddlers.step3Html;
var _onGetTiddlerList = config.macros.importTiddlers.onGetTiddlerList;
config.macros.importTiddlers.onGetTiddlerList = function(context, wizard) {
	var fileImport = config.macros.fileImport;
	var importTiddlers = config.macros.importTiddlers;
	if (wizard.getValue('inFileImport')) {
		importTiddlers.step3Html = fileImport.step3Html;
	} else {
		importTiddlers.step3Html = _step3Html;
	}
	_onGetTiddlerList.apply(this, arguments);
};
})(jQuery);
//}}}
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<title>Reply</title>
	<link rel="stylesheet" href="//tiddlyspace.com/bags/benspa_public/tiddlers/bootvelcro.css">
	<style>
		html,
		body {
			overflow: hidden;
			background-color: transparent;
		}

		#container {
			/* prevent a fouc if no images present */
			display: none;
		}

		.modal-header {
			border-bottom: none;
			padding: 5px 0 0;
			position: absolute;
			width: 100%;
			background-color: #e0e0e0;
			-webkit-border-radius: 6px 6px 0 0;
			-moz-border-radius: 6px 6px 0 0;
			border-radius: 6px 6px 0 0;
			cursor: move;
		}

		.form-actions {
			position: absolute;
			bottom: 0;
			box-sizing: border-box;
			-moz-box-sizing: border-box;
			width: 100%;
			margin: 0;
			border-radius: 0 0 6px 6px;
			background-color: #e0e0e0;
			border-top: 1px solid gray;
		}

		.form-actions input.btn {
			width: auto;
			float: right;
			margin: 0 0.2em;
		}

		.closeBtn {
			background-color: #DCE7F1 !important;
		}

		.primary {
			background-color: #09F !important;
		}

		h1 {
			margin-bottom: 9px;
			margin-top: 9px;
		}

		body {
			width: 100%;
			height: 100%;
			position: absolute;
		}

		.modal {
			margin: 10px;
			top: 0;
			left: 0;
			bottom: 0;
			width: 510px;
			position: absolute;
			box-shadow: #444 0px 0px 10px 2px;
			border-radius: 6px;
			background-color: white;
			border: 1px solid gray;
			background-color: #F0F4F8;
		}

		label em {
			cursor: pointer;
		}

		.modal-body {
			overflow: auto;
			position: absolute;
			top: 0;
			bottom: 0;
			left: 0;
			right: 0;
			margin: 65px 20px 67px;
			background-color: transparent;
		}

		.nav-tabs {
			padding-left: 1%;
			margin: 0;
			width: 99%;
			border-color: gray;
		}

		.nav-tabs > li {
			cursor: pointer;
		}

		.nav-tabs > li > a {
			line-height: 2.4em;
			font-weight: bold;
			font-size: 100%;
		}

		.nav-tabs > li.active > a{
			background-color: #F0F4F8;
			border-color: gray;
			border-bottom-color: #F0F4F8;
		}

		.active {
			display: block;
		}

		input,
		textarea,
		select,
		.uneditable-input {
			color: #606060;
		}

		.imagePicker {
			-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			border: 1px solid #CCC;
			height: 110px;
			overflow: auto;
			-webkit-border-radius: 3px;
			-moz-border-radius: 3px;
			border-radius: 3px;
			margin-left: 0;
		}

		.imagePicker img {
			margin: 5px;
			border: 2px solid transparent;
		}

		.imagePicker .current {
			border: 2px dotted #555;
		}

		label {
			font-weight: bold;
		}

		.form-actions label {
			float: left;
			margin-top: 0.75em;
		}

		fieldset input,
		fieldset textarea {
			width: 90%;
			border-color: gray;
		}

		@media all and (max-width: 550px) {
			.modal {
				width: 95%;
			}
		}

		#help {
			position: absolute;
			border: 0;
			right: 4px;
			top: 5px;
			text-indent: -9999px;
			color: transparent;
			height: 16px;
			width: 16px;
			background: none;
			background-image: url(/bags/common/tiddlers/help.png);
			background-repeat: no-repeat;
			background-color: white;
			z-index: 2;
			border-radius: 10px;
		}

		#help-info {
			padding: 0;
			border: 1px solid gray;
			width: 60%;
			height: 50px;
			color: #404040;
			background-color: white;
			position: absolute;
			top: 5px;
			right: 5px;
			z-index: 1;
			cursor: auto;
			border-radius: 5px;

		}

		#help-info p {
			padding: 10px 25px;
			margin-bottom: 0;
		}
	</style>
</head>
<body>
	<div id="container">
		<form action="#" class="modal">
			<div class="modal-header">
				<button id="help">help</button>
				<div id="help-info" style="display:none;"><p>
				Found something interesting? Write about it in your own space. <a href="//docs.tiddlyspace.com/Reply to this Tiddler" target="_blank">Find out more</a>
				</p></div>
				<ul class="nav nav-tabs" data-tabs="tabs">
					<li class="active" data-tab-name="post"><a href="#postForm">Reply</a></li>
				</ul>
			</div>


			<fieldset id="postForm" class="modal-body">
				<label>Title
					<input type="text" name="title">
				</label>
				<input type="hidden" name="url">
				<label>Post
					<textarea name="text" rows="8"></textarea>
				</label>
				<label>Tags
					<input type="text" name="tags" value="">
				</label>
			</fieldset>


			<div class="form-actions">
				<label class="checkbox">
					<input type="checkbox" name="private" val="private">
					keep private
				</label>
				<input type="submit" class="btn primary btn-large" value="Done">
				<input type="button" class="btn btn-large closeBtn" value="Cancel">
			</div>
		</form>
	</div>

	<script type="text/javascript"
            src="/bags/common/tiddlers/jquery.js"></script>
	<script type="text/javascript" src="/bags/tiddlyspace/tiddlers/chrjs"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/_reply.js"></script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
	<title>Account</title>
	<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/admin.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/jquery-ui.custom.css" type='text/css' rel='stylesheet' >
</head>
<body>

<div id="container">
	<div class="main section">
		<a class="app" href="/">home</a>
		<div class="left">
		<div id="siteiconArea">
		<h2>User Icon</h2>
		<div>
			<img id="siteicon" class="siteicon">
			<form id="upload" method="POST" enctype="multipart/form-data">
				<input type="hidden" name="title" value="SiteIcon" />
				<input type="hidden" name="tags" value="excludeLists">
				<input type="hidden" name="csrf_token" class="csrf" />
				<input type="file" name="file" accept="image/*" />
				<input type="submit" value="upload" />
			</form>
			<div id="dropzone">Drop file here
				<img class="notloading" src="/bags/common/tiddlers/ajax-loader.gif" alt="submitting SiteIcon" />
			</div>
		</div>
		</div>
		<h2>Find Space</h2>
		<form class="spaceSearch">
			<input class="inputBox" type="text" placeholder="find space" />
			<a href="http://docs.tiddlyspace.com/What%20is%20a%20Space%3F" class="help"
				title="What is a space?">What is a space?</a>
			<button>view all</button>
		</form>
		<div class='list-container'>
			You are a member of the following spaces:
			<ul class='ts-space-search'>
			</ul>
		</div>
		<h2>Create New Space</h2>
		<form class="ts-spaces">
			<input class="inputBox" type="text" name="spacename" placeholder="space name"><span class="hostSuffix">.tiddlyspace.com</span>
			<input type="submit" value="Create Space" />
		</form>
		</div>
		<div class="right">
		<h2>Change Password</h2>
		<form class="ts-password">
			<input class="inputBox" placeholder="existing password" type="password" name="password">
			<input class="inputBox" placeholder="new password" type="password" name="new_password">
			<input class="inputBox" placeholder="new password"	type="password" name="new_password_confirm">
			<input type="submit" value="Change password">
		</form>
		<h2>OpenID</h2>
		<h3>Why OpenID?</h3>
		<a href="http://openid.net/"><img src="/bags/common/tiddlers/openid.png" alt="openid" ></a><br />
		Use just one username and password across hundreds of OpenID-enabled sites.<br />
		It's an open standard.<br />
		<a href="http://openid.net/what/">learn more</a>
		<ul class="ts-identities"></ul>
		<form class="ts-openid" target="_top">
			<div>
				Add an openid:
			</div>
			<input class="inputBox" type="text" name="openid" placeholder="your openid" />
			<input type="submit" value="Register" />
			<a href="http://openid.net/get-an-openid/" class="help"
			title="What is an open id?">What is an open id?</a>
		</form>
		</div>
		<div class="clear"></div>
	</div>
</div>
<script src="/bags/common/tiddlers/backstage.js"></script>
<script src='/bags/common/tiddlers/jquery.js'></script>
<script src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script src='/bags/common/tiddlers/chrjs.space'></script>
<script src='/bags/common/tiddlers/chrjs.users'></script>
<script src='/bags/common/tiddlers/chrjs.identities'></script>
<script src="/bags/common/tiddlers/jquery-ui.custom.js"></script>
<script src='/bags/common/tiddlers/jquery-form.js'></script>
<script src="/bags/common/tiddlers/siteiconupload.js"></script>
<script src='/bags/common/tiddlers/ts.js'></script>
<script src="/status.js"></script>
<script type="text/javascript">
/*
 * jQuery UI Autocomplete HTML Extension
 *
 * Copyright 2010, Scott González (http://scottgonzalez.com)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 *
 * http://github.com/scottgonzalez/jquery-ui-extensions
 */
(function( $ ) {

var proto = $.ui.autocomplete.prototype,
	initSource = proto._initSource;

function filter( array, term ) {
	var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
	return $.grep( array, function(value) {
		return matcher.test( $( "<div>" ).html( value.label || value.value || value ).text() );
	});
}

$.extend( proto, {
	_initSource: function() {
		if ( this.options.html && $.isArray(this.options.source) ) {
			this.source = function( request, response ) {
				response( filter( this.options.source, request.term ) );
			};
		} else {
			initSource.call( this );
		}
	},

	_renderItem: function( ul, item) {
		return $( "<li></li>" )
			.data( "item.autocomplete", item )
			.append( $( "<a></a>" )[ this.options.html ? "html" : "text" ]( item.label ) )
			.appendTo( ul );
	}
});

})( jQuery );

/***
_accounts application specific javascript
***/
var link;
ts.init(function(ts) {
	if(ts.user.anon) { // redirect to homepage when user not logged in
		window.location = ts.getHost();
	} else if(ts.user.name === ts.currentSpace){
		initSiteIconUpload(ts.user.name);
	} else {
		link = $("<a />").attr("href", ts.getHost(ts.user.name) + "/_account").text("Change User Icon");
		$("#siteiconArea div").empty().append(link);
	}
	$(".hostSuffix").text("." + ts.getHost("").split("//")[1]);
	ts.getSpaces(function(spaces) {
		$("<div class='info' />").text("You have " + spaces.length + " spaces.").insertBefore($(".spaceSearch")[0]);
		$("form.spaceSearch input").autocomplete({
			html: true,
			source: function(req, response) {
				ts.getSpaces(function(spaces) {
					var selected = [];
					for(var i = 0; i < spaces.length; i++) {
						var space = spaces[i];
						if(space.name.indexOf(req.term) > -1) {
							var host = ts.getHost(space.name) ;
							var img = host + "/SiteIcon";
							selected.push({
								value: space.name,
								label: '<a href="' + host + '" target="_parent" class="autocompleteLink"><img src="' + img + '" style="height:24px;width:auto;max-height:24px;max-width:24px;"/>' + space.name + '</a>'
							});
						}
					}
					response(selected);
				});
			},
			select: function(event, ui) {
				window.top.location = ts.getHost(ui.item.value);
			}
		});

		var $ul = $('.ts-space-search');
		$.each(spaces, function(i, space) {
			$ul.append($('<li/>').html($('<a/>').attr('href', space.uri)
				.text(space.name)));
		});

		$('form.spaceSearch button').click(function(ev) {
			$('.list-container').slideToggle('fast');
			ev.preventDefault();
			return false;
		});
	});
});

if(window != window.top) {
	$("html").addClass("iframeMode");
	$("a").live("click",function(ev) {
		$(ev.target).attr("target", "_parent");
	});
}
</script>
<!--[if lt IE 8]>
<script type="text/javascript" src="/bags/common/tiddlers/json2.js"></script>
<![endif]-->
</body>
</html>
!Upload an icon
<<tiddler spaceIcon>>
!Describe your space
If you haven't already done so, you should provide a brief decscription of yourself and what you're using this space for. To do this, just edit the [[SiteInfo]] tiddler (keeping the title the same of course).

!Change the title
<<tiddler spaceTitle>>
!Change the theme
<<tiddler colorScheme>>
!Change the menu
If you'd like to change the menu items along the top, you can edit the [[MainMenu]] tiddler.

!Change the default tiddlers
<<tiddler setDefaultTiddlers>>
!More Advanced customisations
If you know HTML and CSS, you can edit some or all of the following tiddlers to customise your space further:
* PageTemplate
* EditTemplate
* ViewTemplate
* StyleSheet
/***
|''Name''|smmNestedSortable|
|''Description''|Pulls in a list from a store tiddler using the specified adaptor (incorrectly named serializer atm) and generate a nestedSortable list from it. |
|''Authors''|Simon McManus, Jon Robson|
|''Version''|0.2.0|
|''Status''|stable|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Requires''|jQueryUI|
!Notes
Now TiddlySpace aware. In TiddlySpace will make sure activeDocument tiddler local.
!Code
***/

//{{{
(function($) {
window.activeDocument = 'activeDocument';
// make tiddlyspace aware
var tiddlyspace = config.extensions.tiddlyspace;
if(tiddlyspace) {
	var currentSpace = tiddlyspace.currentSpace.name;
	var publicBag = "%0_public".format([currentSpace]);
	var privateBag = "%0_private".format([currentSpace]);
	var publicWorkspace = "bags/%0".format([privateBag]);
	var title = window.activeDocument;
	var currentDocument = store.getTiddler(title);
	if(currentDocument) {
		var bag = currentDocument.fields["server.bag"];
		var workspace = currentDocument.fields["server.workspace"];
		if(bag != publicBag && bag != privateBag) {
			currentDocument.fields["server.bag"] = publicBag;
			$(".ul.nestedSortable").empty();
			var spec = jQuery.fn.smmNestedSortable.jsonSerializer.buildSpec();
			store.saveTiddler(title, title, spec,
						null, new Date(), ["excludeLists", "document"], config.defaultCustomFields,
						false, new Date());
		}
	}
}
})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceConfig|
|''Version''|0.7.7|
|''Description''|TiddlySpace configuration|
|''Status''|stable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceConfig.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlyWebConfig ServerSideSavingPlugin TiddlyFileImporter|
!Code
***/
//{{{
(function($) {

var tweb = config.extensions.tiddlyweb;

var recipe = config.defaultCustomFields["server.workspace"].split("recipes/")[1];
var currentSpace; // assigned later

var disabledTabs = [];

var coreBags = ["system", "tiddlyspace"];
var systemSpaces = ["plugins", "info", "images", "theme"];
systemSpaces = $.map(systemSpaces, function(item, i) {
	return "system-%0_public".format(item);
});

// hijack search macro to add custom attributes for mobile devices
var _search = config.macros.search.handler;
config.macros.search.handler = function(place, macroName, params) {
	_search.apply(this, arguments);
	$(".searchField:input", place).
		attr({ autocapitalize: "off", autocorrect: "off" });
};

// arg is either a container name or a tiddler object
// if fuzzy is truthy, space may be inferred from workspace (for new tiddlers)
// returns space object or false
var determineSpace = function(arg, fuzzy) {
	if(typeof arg == "string") { // container name
		var space = split(arg, "_", "r");
		return ["public", "private"].contains(space.type) ? space : false;
	} else if(arg) { // tiddler
		var container = determineContainer(arg, fuzzy);
		return container ? determineSpace(container.name, fuzzy) : false;
	} else {
		return false;
	}
};

// if fuzzy is truthy, container may be inferred from workspace for new tiddlers
// returns container object or false
var determineContainer = function(tiddler, fuzzy) { // TODO: expose?
	var bag = tiddler.fields["server.bag"];
	var recipe = tiddler.fields["server.recipe"]; // XXX: unused/irrelevant/redundant!?
	if(bag) {
		return { type: "bag", name: bag };
	} else if(recipe) {
		return { type: "recipe", name: recipe };
	} else if(fuzzy) { // new tiddler
		var workspace = tiddler.fields["server.workspace"];
		if(workspace) {
			var container = split(workspace, "/", "l");
			return ["bags", "recipes"].contains(container.type) ? container : false;
		} else {
			return false;
		}
	} else {
		return false;
	}
};

// hijack removeTiddlerCallback to restore tiddler from recipe cascade -- TODO: move into TiddlyWebWiki?
var sssp = config.extensions.ServerSideSavingPlugin;
var _removeTiddlerCallback = sssp.removeTiddlerCallback;
sssp.removeTiddlerCallback = function(context, userParams) {
	var title = context.tiddler.title;
	var recipe = context.tiddler.fields["server.recipe"];
	_removeTiddlerCallback.apply(this, arguments);
	if(recipe) {
		context.workspace = "recipes/" + recipe;
		var callback = function(context, userParams) {
			if(context.status) {
				var dirty = store.isDirty();
				store.saveTiddler(context.tiddler).clearChangeCount();
				store.setDirty(dirty);
			} else {
				store.notify(title, true);
			}
		};
		context.adaptor.getTiddler(title, context, null, callback);
	}
};

// splits a string once using delimiter
// mode "l" splits at the first, "r" at the last occurrence
// returns an object with members type and name
var split = function(str, sep, mode) {
	mode = mode == "r" ? "pop" : "shift"; // TODO: use +/-1 instead of "l"/"r"?
	var arr = str.split(sep);
	var type = arr.length > 1 ? arr[mode]() : null;
	return { type: type, name: arr.join(sep) };
};

var plugin = config.extensions.tiddlyspace = {
	currentSpace: determineSpace(recipe),
	coreBags: coreBags.concat(systemSpaces),

	determineSpace: determineSpace,
	isValidSpaceName: function(name) {
		return name.match(/^[a-z][0-9a-z\-]*[0-9a-z]$/) ? true : false;
	},
	getCurrentBag: function(type) {
		return "%0_%1".format(currentSpace, type);
	},
	getCurrentWorkspace: function(type) {
		return "bags/" + this.getCurrentBag(type);
	},
	// returns the URL for a space's avatar (SiteIcon) based on a server_host
	// object and an optional space name
	// optional nocors argument prevents cross-domain URLs from being generated
	getAvatar: function(host, space, nocors) {
		if(space && typeof space != "string") { // backwards compatibility -- XXX: deprecated
			space = space.name;
		}
		var subdomain = nocors ? currentSpace : space;
		host = host ? this.getHost(host, subdomain) : "";
		var bag = space ? "%0_public".format(space) : "tiddlyspace";
		return "%0/bags/%1/tiddlers/SiteIcon".format(host, bag);
	},
	// returns the URL based on a server_host object (scheme, host, port) and an
	// optional subdomain
	getHost: function(host, subdomain) {
		if(host === undefined) { // offline
			tweb.status.server_host = {}; // prevents exceptions further down the stack -- XXX: hacky workaround, breaks encapsulation
			return null;
		}
		subdomain = subdomain ? subdomain + "." : "";
		var url = "%0://%1%2".format(host.scheme, subdomain, host.host);
		var port = host.port;
		if(port && !["80", "443"].contains(port)) {
			url += ":" + port;
		}
		return url;
	},
	disableTab: function(tabTiddler) {
		if(typeof(tabTiddler) == "string") {
			disabledTabs.push(tabTiddler);
		} else {
			for(var i = 0; i < tabTiddler.length; i++) {
				plugin.disableTab(tabTiddler[i]);
			}
		}
	},
    checkSyncStatus: function(tiddler) {
		if(tiddler) {
			var title = typeof(tiddler) === "string" ? tiddler : tiddler.title;
			var el = story.getTiddler(title) || false;
			if(el) {
				refreshElements(el);
			}
		}
	},
	isDisabledTab: function(tabTitle) {
		var match = new RegExp("(?:\\[\\[([^\\]]+)\\]\\])", "mg").exec(tabTitle);
		var tabIdentifier = match ? match[1] : tabTitle;
		return disabledTabs.contains(tabIdentifier);
	},
	getCSRFToken: window.getCSRFToken || null // this may not have been processed yet
};

currentSpace = plugin.currentSpace.name;

tweb.serverPrefix = tweb.host.split("/")[3] || ""; // XXX: assumes root handler
tweb.getStatus(function(status) {
	var url = plugin.getHost(status.server_host);
	tweb.status.server_host.url = url;
	config.messages.tsVersion = status.version;
});

if(window.location.protocol == "file:") {
	// enable AutoSave by default
	config.options.chkAutoSave = config.options.chkAutoSave === undefined ?
		true : config.options.chkAutoSave;
} else {
	// set global read-only mode based on membership heuristics
	var indicator = store.getTiddler("SiteTitle") || tiddler;
	readOnly = !(recipe.split("_").pop() == "private" ||
		tweb.hasPermission("write", indicator));
	// replace TiddlyWiki's ImportTiddlers due to cross-domain restrictions
	if(config.macros.fileImport) {
		$.extend(config.macros.importTiddlers, config.macros.fileImport);
	}
}

// hijack saveChanges to ensure SystemSettings is private by default
var _saveChanges = saveChanges;
saveChanges = function(onlyIfDirty, tiddlers) {
	if(tiddlers && tiddlers.length == 1 &&
			tiddlers[0] && tiddlers[0].title == "SystemSettings") {
		var fields = tiddlers[0].fields;
		delete fields["server.recipe"];
		fields["server.bag"] = plugin.getCurrentBag("private");
		fields["server.workspace"] = plugin.getCurrentWorkspace("private");
	}
	return _saveChanges.apply(this, arguments);
};

// ensure backstage is always initialized
// required to circumvent TiddlyWiki's read-only based handling
config.macros.backstageInit = {
	init: function() {
		showBackstage = true;
	}
};

// disable evaluated macro parameters for security reasons
config.evaluateMacroParameters = "none";
var _parseParams = String.prototype.parseParams;
String.prototype.parseParams = function(defaultName, defaultValue, allowEval,
		noNames, cascadeDefaults) {
	if(config.evaluateMacroParameters == "none") {
		arguments[2] = false;
	}
	return _parseParams.apply(this, arguments);
};

var _tabsMacro = config.macros.tabs.handler;
config.macros.tabs.handler = function(place, macroName, params) {
	var newParams = [params[0]]; // keep cookie name
	for(var i = 1; i < params.length; i += 3) {
		var tabTitle = params[i + 2];
		if(!plugin.isDisabledTab(tabTitle)){
			newParams = newParams.concat(params[i], params[i + 1], tabTitle);
		}
	}
	_tabsMacro.apply(this, [place, macroName, newParams]);
};

// disable ControlView for XHRs by default
$.ajaxSetup({
	beforeSend: function(xhr) {
		xhr.setRequestHeader("X-ControlView", "false");
	}
});
// TiddlyWeb adaptor currently still uses httpReq, which needs extra magic -- XXX: obsolete this!
var _httpReq = httpReq;
httpReq = function(type, url, callback, params, headers, data, contentType,
		username, password, allowCache) {
	headers = headers || {};
	headers["X-ControlView"] = "false";
	_httpReq.apply(this, arguments);
};

// register style sheet for backstage separately (important)
store.addNotification("StyleSheetBackstage", refreshStyles);

// option for default privacy setting
config.optionsDesc.chkPrivateMode = "Set your default privacy mode to private";
config.optionsSource.chkPrivateMode = "setting";
config.options.chkPrivateMode = config.options.chkPrivateMode || false;
saveSystemSetting("chkPrivateMode", true);
config.defaultCustomFields["server.workspace"] = plugin.
	getCurrentWorkspace(config.options.chkPrivateMode ? "private" : "public");

config.paramifiers.follow = {
	onstart: function(v) {
		if(!readOnly) {
			var bag = "%0_public".format(currentSpace);
			story.displayTiddler(null, v, DEFAULT_EDIT_TEMPLATE, null, null,
				"server.bag:%0 server.workspace:bags/%0".format(bag));
			story.setTiddlerTag(v, "follow", 1);
			story.focusTiddler(v, "text");
		}
	}
};

var fImport = config.macros.fileImport;
if(fImport) {
	fImport.uploadTo = "Upload to: ";
	var _createForm = config.macros.fileImport.createForm;
	config.macros.fileImport.createForm = function(place, wizard, iframeName) {
		var container = $("<div />").text(fImport.uploadTo).appendTo(place);
		var select = $('<select name="mode" />').appendTo(container)[0];
		$('<option value="private" selected>private</a>').appendTo(select);
		$('<option value="public">public</a>').appendTo(select);
		wizard.setValue("importmode", select);
		_createForm.apply(this, [place, wizard, iframeName]);
	};

	var _onGet = config.macros.importTiddlers.onGetTiddler;
	config.macros.importTiddlers.onGetTiddler = function(context, wizard) {
		var type = $(wizard.getValue("importmode")).val();
		var ws =  plugin.getCurrentWorkspace(type);
		wizard.setValue("workspace", ws);
		_onGet.apply(this, [context, wizard]);
	};
}

config.extensions.ServerSideSavingPlugin.reportSuccess = function(msg, tiddler) {
	plugin.checkSyncStatus(tiddler);
	msg = config.extensions.ServerSideSavingPlugin.locale[msg];
	var link = "/" + encodeURIComponent(tiddler.title);
	displayMessage(msg.format([tiddler.title]), link);
};


})(jQuery);
//}}}
/***
|''Name''|TiddlyWebAdaptor|
|''Description''|adaptor for interacting with TiddlyWeb|
|''Author:''|FND|
|''Contributors''|Chris Dent, Martin Budden|
|''Version''|1.4.10|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/adaptors/TiddlyWebAdaptor.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5|
|''Keywords''|serverSide TiddlyWeb|
!Notes
This plugin includes [[jQuery JSON|http://code.google.com/p/jquery-json/]].
!To Do
* createWorkspace
* document custom/optional context attributes (e.g. filters, query, revision) and tiddler fields (e.g. server.title, origin)
!Code
***/
//{{{
(function($) {

var adaptor = config.adaptors.tiddlyweb = function() {};

adaptor.prototype = new AdaptorBase();
adaptor.serverType = "tiddlyweb";
adaptor.serverLabel = "TiddlyWeb";
adaptor.mimeType = "application/json";

adaptor.parsingErrorMessage = "Error parsing result from server";
adaptor.noBagErrorMessage = "no bag specified for tiddler";
adaptor.locationIDErrorMessage = "no bag or recipe specified for tiddler"; // TODO: rename

// retrieve current status (requires TiddlyWeb status plugin)
adaptor.prototype.getStatus = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/status";
	var uri = uriTemplate.format([context.host]);
	var req = httpReq("GET", uri, adaptor.getStatusCallback, context,
		null, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getStatusCallback = function(status, context, responseText, uri, xhr) {
	context.status = responseText ? status : false;
	try {
		context.statusText = xhr.statusText;
	} catch(exc) { // offline (Firefox)
		context.status = false;
		context.statusText = null;
	}
	context.httpStatus = xhr.status;
	if(context.status) {
		context.serverStatus = $.evalJSON(responseText); // XXX: error handling!?
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve a list of workspaces
adaptor.prototype.getWorkspaceList = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.workspaces = [];
	var uriTemplate = "%0/recipes"; // XXX: bags?
	var uri = uriTemplate.format([context.host]);
	var req = httpReq("GET", uri, adaptor.getWorkspaceListCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getWorkspaceListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		try {
			var workspaces = $.evalJSON(responseText);
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		context.workspaces = workspaces.map(function(itm) { return { title: itm }; });
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve a list of tiddlers
adaptor.prototype.getTiddlerList = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers%3";
	var params = context.filters ? "?" + context.filters : "";
	if(context.format) {
		params = context.format + params;
	}
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), params]);
	var req = httpReq("GET", uri, adaptor.getTiddlerListCallback,
		context, merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.tiddlers = [];
		try {
			var tiddlers = $.evalJSON(responseText); //# NB: not actual tiddler instances
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = adaptor.toTiddler(tiddlers[i], context.host);
			context.tiddlers.push(tiddler);
		}
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// perform global search
adaptor.prototype.getSearchResults = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/search?q=%1%2";
	var filterString = context.filters ? ";" + context.filters : "";
	var uri = uriTemplate.format([context.host, context.query, filterString]); // XXX: parameters need escaping?
	var req = httpReq("GET", uri, adaptor.getSearchResultsCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getSearchResultsCallback = function(status, context, responseText, uri, xhr) {
	adaptor.getTiddlerListCallback(status, context, responseText, uri, xhr); // XXX: use apply?
};

// retrieve a particular tiddler's revisions
adaptor.prototype.getTiddlerRevisionList = function(title, limit, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
	var req = httpReq("GET", uri, adaptor.getTiddlerRevisionListCallback,
		context, merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerRevisionListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.revisions = [];
		try {
			var tiddlers = $.evalJSON(responseText); //# NB: not actual tiddler instances
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = adaptor.toTiddler(tiddlers[i], context.host);
			context.revisions.push(tiddler);
		}
		var sortField = "server.page.revision";
		context.revisions.sort(function(a, b) {
			return a.fields[sortField] < b.fields[sortField] ? 1 :
				(a.fields[sortField] == b.fields[sortField] ? 0 : -1);
		});
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve an individual tiddler revision -- XXX: breaks with standard arguments list -- XXX: convenience function; simply use getTiddler?
adaptor.prototype.getTiddlerRevision = function(title, revision, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.revision = revision;
	return this.getTiddler(title, context, userParams, callback);
};

// retrieve an individual tiddler
//# context is an object with members host and workspace
//# callback is passed the new context and userParams
adaptor.prototype.getTiddler = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;
	if(context.revision) {
		var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions/%4";
	} else {
		uriTemplate = "%0/%1/%2/tiddlers/%3";
	}
	if(!context.tiddler) {
		context.tiddler = new Tiddler(title);
	}
	context.tiddler.fields["server.type"] = adaptor.serverType;
	context.tiddler.fields["server.host"] = AdaptorBase.minHostName(context.host);
	context.tiddler.fields["server.workspace"] = context.workspace;
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title),
		context.revision]);
	var req = httpReq("GET", uri, adaptor.getTiddlerCallback, context,
		merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		try {
			var tid = $.evalJSON(responseText);
		} catch(ex) {
			context.status = false;
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		var tiddler = adaptor.toTiddler(tid, context.host);
		tiddler.title = context.tiddler.title;
		tiddler.fields["server.etag"] = xhr.getResponseHeader("Etag");
		// normally we'd assign context.tiddler = tiddler here - but we can't do
		// that because of IE, which triggers getTiddler in putTiddlerCallback,
		// and since ServerSideSavingPlugin foolishly relies on persistent
		// object references, we need to merge the data into the existing object
		$.extend(context.tiddler, tiddler);
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve tiddler chronicle (all revisions)
adaptor.prototype.getTiddlerChronicle = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions?fat=1";
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
	var req = httpReq("GET", uri, adaptor.getTiddlerChronicleCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.responseText = responseText;
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store an individual tiddler
adaptor.prototype.putTiddler = function(tiddler, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = tiddler.title;
	context.tiddler = tiddler;
	context.host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var uriTemplate = "%0/%1/%2/tiddlers/%3";
	try {
		context.workspace = context.workspace || tiddler.fields["server.workspace"];
		var workspace = adaptor.resolveWorkspace(context.workspace);
	} catch(ex) {
		return adaptor.locationIDErrorMessage;
	}
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(tiddler.title)]);
	var etag = adaptor.generateETag(workspace, tiddler);
	var headers = etag ? { "If-Match": etag } : null;
	var payload = {
		type: tiddler.fields["server.content-type"] || null,
		text: tiddler.text,
		tags: tiddler.tags,
		fields: $.extend({}, tiddler.fields)
	};
	delete payload.fields.changecount;
	$.each(payload.fields, function(key, value) {
		if(key.indexOf("server.") == 0) {
			delete payload.fields[key];
		}
	});
	payload = $.toJSON(payload);
	var req = httpReq("PUT", uri, adaptor.putTiddlerCallback,
		context, headers, payload, adaptor.mimeType, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.status) {
		var loc = xhr.getResponseHeader("Location");
		var etag = xhr.getResponseHeader("Etag");
		if(loc && etag) {
			var bag = loc.split("/bags/").pop().split("/")[0];
			context.tiddler.fields["server.bag"] = bag;
			context.tiddler.fields["server.workspace"] = "bags/" + bag;
			var rev = etag.split("/").pop().split(/;|:/)[0];
			context.tiddler.fields["server.page.revision"] = rev;
			context.tiddler.fields["server.etag"] = etag;
			if(context.callback) {
				context.callback(context, context.userParams);
			}
		} else { // IE
			context.adaptor.getTiddler(context.tiddler.title, context,
				context.userParams, context.callback);
		}
	} else if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store a tiddler chronicle
adaptor.prototype.putTiddlerChronicle = function(revisions, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = revisions[0].title;
	var headers = null;
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(context.title)]);
	if(workspace.type == "bag") { // generate ETag
		var etag = [adaptor.normalizeTitle(workspace.name),
			adaptor.normalizeTitle(context.title), 0].join("/"); //# zero-revision prevents overwriting existing contents
		headers = { "If-Match": '"' + etag + '"' };
	}
	var payload = $.toJSON(revisions);
	var req = httpReq("POST", uri, adaptor.putTiddlerChronicleCallback,
		context, headers, payload, adaptor.mimeType, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store a collection of tiddlers (import TiddlyWiki HTML store)
adaptor.prototype.putTiddlerStore = function(store, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers";
	var host = context.host;
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name)]);
	var req = httpReq("POST", uri, adaptor.putTiddlerStoreCallback,
		context, null, store, "text/x-tiddlywiki", null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerStoreCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// rename an individual tiddler or move it to a different workspace -- TODO: make {from|to}.title optional
//# from and to are objects with members title and workspace (bag; optional),
//# representing source and target tiddler, respectively
adaptor.prototype.moveTiddler = function(from, to, context, userParams, callback) { // XXX: rename parameters (old/new)?
	var self = this;
	var newTiddler = store.getTiddler(from.title) || store.getTiddler(to.title); //# local rename might already have occurred
	var oldTiddler = $.extend(true, {}, newTiddler); //# required for eventual deletion
	oldTiddler.title = from.title; //# required for original tiddler's ETag
	var _getTiddlerChronicle = function(title, context, userParams, callback) {
		return self.getTiddlerChronicle(title, context, userParams, callback);
	};
	var _putTiddlerChronicle = function(context, userParams) {
		if(!context.status) {
			return callback(context, userParams);
		}
		var revisions = $.evalJSON(context.responseText); // XXX: error handling?
		// change current title while retaining previous location
		for(var i = 0; i < revisions.length; i++) {
			delete revisions[i].revision;
			if(!revisions[i].fields.origin) { // NB: origin = "<workspace>/<title>"
				revisions[i].fields.origin = ["bags", revisions[i].bag, revisions[i].title].join("/");
			}
			revisions[i].title = to.title;
		}
		// add new revision
		var rev = $.extend({}, revisions[0]);
		$.each(newTiddler, function(i, item) {
			if(!$.isFunction(item)) {
				rev[i] = item;
			}
		});
		rev.title = to.title;
		rev.created = rev.created.convertToYYYYMMDDHHMM();
		rev.modified = new Date().convertToYYYYMMDDHHMM();
		delete rev.fields.changecount;
		revisions.unshift(rev);
		if(to.workspace) {
			context.workspace = to.workspace;
		} else if(context.workspace.substring(0, 4) != "bags") { // NB: target workspace must be a bag
			context.workspace = "bags/" + rev.bag;
		}
		var subCallback = function(context, userParams) {
			if(!context.status) {
				return callback(context, userParams);
			}
			context.adaptor.getTiddler(newTiddler.title, context, userParams, _deleteTiddler);
		};
		return self.putTiddlerChronicle(revisions, context, context.userParams, subCallback);
	};
	var _deleteTiddler = function(context, userParams) {
		if(!context.status) {
			return callback(context, userParams);
		}
		$.extend(true, newTiddler, context.tiddler);
		context.callback = null;
		return self.deleteTiddler(oldTiddler, context, context.userParams, callback);
	};
	callback = callback || function() {};
	context = this.setContext(context, userParams);
	context.host = context.host || oldTiddler.fields["server.host"];
	context.workspace = from.workspace || oldTiddler.fields["server.workspace"];
	return _getTiddlerChronicle(from.title, context, userParams, _putTiddlerChronicle);
};

// delete an individual tiddler
adaptor.prototype.deleteTiddler = function(tiddler, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = tiddler.title; // XXX: not required!?
	var uriTemplate = "%0/bags/%1/tiddlers/%2";
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var bag = tiddler.fields["server.bag"];
	if(!bag) {
		return adaptor.noBagErrorMessage;
	}
	var uri = uriTemplate.format([host, adaptor.normalizeTitle(bag),
		adaptor.normalizeTitle(tiddler.title)]);
	var etag = adaptor.generateETag({ type: "bag", name: bag }, tiddler);
	var headers = etag ? { "If-Match": etag } : null;
	var req = httpReq("DELETE", uri, adaptor.deleteTiddlerCallback, context, headers,
		null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.deleteTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// compare two revisions of a tiddler (requires TiddlyWeb differ plugin)
//# if context.rev1 is not specified, the latest revision will be used for comparison
//# if context.rev2 is not specified, the local revision will be sent for comparison
//# context.format is a string as determined by the TiddlyWeb differ plugin
adaptor.prototype.getTiddlerDiff = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;

	var tiddler = store.getTiddler(title);
	try {
		var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
	} catch(ex) {
		return adaptor.locationIDErrorMessage;
	}
	var tiddlerRef = [workspace.type + "s", workspace.name, tiddler.title].join("/");

	var rev1 = context.rev1 ? [tiddlerRef, context.rev1].join("/") : tiddlerRef;
	var rev2 = context.rev2 ? [tiddlerRef, context.rev2].join("/") : null;

	var uriTemplate = "%0/diff?rev1=%1";
	if(rev2) {
		uriTemplate += "&rev2=%2";
	}
	if(context.format) {
		uriTemplate += "&format=%3";
	}
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var uri = uriTemplate.format([host, adaptor.normalizeTitle(rev1),
		adaptor.normalizeTitle(rev2), context.format]);

	if(rev2) {
		var req = httpReq("GET", uri, adaptor.getTiddlerDiffCallback, context, null,
			null, null, null, null, true);
	} else {
		var payload = {
			title: tiddler.title,
			text: tiddler.text,
			modifier: tiddler.modifier,
			tags: tiddler.tags,
			fields: $.extend({}, tiddler.fields)
		}; // XXX: missing attributes!?
		payload = $.toJSON(payload);
		req = httpReq("POST", uri, adaptor.getTiddlerDiffCallback, context,
			null, payload, adaptor.mimeType, null, null, true);
	}
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerDiffCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	context.uri = uri;
	if(status) {
		context.diff = responseText;
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// generate tiddler information
adaptor.prototype.generateTiddlerInfo = function(tiddler) {
	var info = {};
	var uriTemplate = "%0/%1/%2/tiddlers/%3";
	var host = this.host || tiddler.fields["server.host"]; // XXX: this.host obsolete?
	host = this.fullHostName(host);
	var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
	info.uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(tiddler.title)]);
	return info;
};

// create Tiddler instance from TiddlyWeb tiddler JSON
adaptor.toTiddler = function(json, host) {
	var created = Date.convertFromYYYYMMDDHHMM(json.created);
	var modified = Date.convertFromYYYYMMDDHHMM(json.modified);
	var fields = json.fields;
	fields["server.type"] = adaptor.serverType;
	fields["server.host"] = AdaptorBase.minHostName(host);
	fields["server.bag"] = json.bag;
	fields["server.title"] = json.title;
	if(json.recipe) {
		fields["server.recipe"] = json.recipe;
	}
	if(json.type && json.type != "None") {
		fields["server.content-type"] = json.type;
	}
	fields["server.permissions"] = json.permissions.join(", ");
	fields["server.page.revision"] = json.revision;
	fields["server.workspace"] = "bags/" + json.bag;
	var tiddler = new Tiddler(json.title);
	tiddler.assign(tiddler.title, json.text, json.modifier, modified, json.tags,
		created, json.fields, json.creator);
	return tiddler;
};

adaptor.resolveWorkspace = function(workspace) {
	var components = workspace.split("/");
	return {
		type: components[0] == "bags" ? "bag" : "recipe",
		name: components[1] || components[0]
	};
};

adaptor.generateETag = function(workspace, tiddler) {
	var revision = tiddler.fields["server.page.revision"];
	var etag = revision == "false" ? null : tiddler.fields["server.etag"];
	if(!etag && workspace.type == "bag") {
		if(typeof revision == "undefined") {
			revision = "0";
		} else if(revision == "false") {
			return null;
		}
		etag = [adaptor.normalizeTitle(workspace.name),
			adaptor.normalizeTitle(tiddler.title), revision].join("/");
		etag = '"' + etag + '"';
	}
	return etag;
};

adaptor.normalizeTitle = function(title) {
	return encodeURIComponent(title);
};

})(jQuery);


/*
 * jQuery JSON Plugin
 * version: 1.3
 * source: http://code.google.com/p/jquery-json/
 * license: MIT (http://www.opensource.org/licenses/mit-license.php)
 */
(function($){function toIntegersAtLease(n)
{return n<10?'0'+n:n;}
Date.prototype.toJSON=function(date)
{return this.getUTCFullYear()+'-'+
toIntegersAtLease(this.getUTCMonth())+'-'+
toIntegersAtLease(this.getUTCDate());};var escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};$.quoteString=function(string)
{if(escapeable.test(string))
{return'"'+string.replace(escapeable,function(a)
{var c=meta[a];if(typeof c==='string'){return c;}
c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
return'"'+string+'"';};$.toJSON=function(o,compact)
{var type=typeof(o);if(type=="undefined")
return"undefined";else if(type=="number"||type=="boolean")
return o+"";else if(o===null)
return"null";if(type=="string")
{return $.quoteString(o);}
if(type=="object"&&typeof o.toJSON=="function")
return o.toJSON(compact);if(type!="function"&&typeof(o.length)=="number")
{var ret=[];for(var i=0;i<o.length;i++){ret.push($.toJSON(o[i],compact));}
if(compact)
return"["+ret.join(",")+"]";else
return"["+ret.join(", ")+"]";}
if(type=="function"){throw new TypeError("Unable to convert object of type 'function' to json.");}
var ret=[];for(var k in o){var name;type=typeof(k);if(type=="number")
name='"'+k+'"';else if(type=="string")
name=$.quoteString(k);else
continue;var val=$.toJSON(o[k],compact);if(typeof(val)!="string"){continue;}
if(compact)
ret.push(name+":"+val);else
ret.push(name+": "+val);}
return"{"+ret.join(", ")+"}";};$.compactJSON=function(o)
{return $.toJSON(o,true);};$.evalJSON=function(src)
{return eval("("+src+")");};$.secureEvalJSON=function(src)
{var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered))
return eval("("+src+")");else
throw new SyntaxError("Error parsing JSON, source is not valid.");};})(jQuery);
//}}}
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
TiddlyDocs is composed of several TiddlySpace spaces.
Currently these are:
* @wikitextbuttons
* @valueswitcherplugin
* @tiddlydocshtmlout
* @smmnestedsortable
* @charts
/***
|''Name''|g.pie|
|''Requires''|raphaeljs g.raphael|
!Usage
!Code
***/
Raphael.fn.g.piechart=function(e,d,o,b,l){l=l||{};var k=this,m=[],g=this.set(),n=this.set(),j=this.set(),u=[],w=b.length,x=0,A=0,z=0,c=9,y=true;n.covers=g;if(w==1){j.push(this.circle(e,d,o).attr({fill:this.g.colors[0],stroke:l.stroke||"#fff","stroke-width":l.strokewidth==null?1:l.strokewidth}));g.push(this.circle(e,d,o).attr(this.g.shim));A=b[0];b[0]={value:b[0],order:0,valueOf:function(){return this.value;}};j[0].middle={x:e,y:d};j[0].mangle=180;}else{function t(F,E,i,H,D,M){var J=Math.PI/180,B=F+i*Math.cos(-H*J),p=F+i*Math.cos(-D*J),G=F+i/2*Math.cos(-(H+(D-H)/2)*J),L=E+i*Math.sin(-H*J),K=E+i*Math.sin(-D*J),C=E+i/2*Math.sin(-(H+(D-H)/2)*J),I=["M",F,E,"L",B,L,"A",i,i,0,+(Math.abs(D-H)>180),1,p,K,"z"];I.middle={x:G,y:C};return I;}for(var v=0;v<w;v++){A+=b[v];b[v]={value:b[v],order:v,valueOf:function(){return this.value;}};}b.sort(function(p,i){return i.value-p.value;});for(v=0;v<w;v++){if(y&&b[v]*360/A<=1.5){c=v;y=false;}if(v>c){y=false;b[c].value+=b[v];b[c].others=true;z=b[c].value;}}w=Math.min(c+1,b.length);z&&b.splice(w)&&(b[c].others=true);for(v=0;v<w;v++){var f=x-360*b[v]/A/2;if(!v){x=90-f;f=x-360*b[v]/A/2;}if(l.init){var h=t(e,d,1,x,x-360*b[v]/A).join(",");}var s=t(e,d,o,x,x-=360*b[v]/A);var q=this.path(l.init?h:s).attr({fill:l.colors&&l.colors[v]||this.g.colors[v]||"#666",stroke:l.stroke||"#fff","stroke-width":(l.strokewidth==null?1:l.strokewidth),"stroke-linejoin":"round"});q.value=b[v];q.middle=s.middle;q.mangle=f;m.push(q);j.push(q);l.init&&q.animate({path:s.join(",")},(+l.init-1)||1000,">");}for(v=0;v<w;v++){q=k.path(m[v].attr("path")).attr(this.g.shim);l.href&&l.href[v]&&q.attr({href:l.href[v]});q.attr=function(){};g.push(q);j.push(q);}}n.hover=function(C,r){r=r||function(){};var B=this;for(var p=0;p<w;p++){(function(D,E,i){var F={sector:D,cover:E,cx:e,cy:d,mx:D.middle.x,my:D.middle.y,mangle:D.mangle,r:o,value:b[i],total:A,label:B.labels&&B.labels[i]};E.mouseover(function(){C.call(F);}).mouseout(function(){r.call(F);});})(j[p],g[p],p);}return this;};n.each=function(B){var r=this;for(var p=0;p<w;p++){(function(C,D,i){var E={sector:C,cover:D,cx:e,cy:d,x:C.middle.x,y:C.middle.y,mangle:C.mangle,r:o,value:b[i],total:A,label:r.labels&&r.labels[i]};B.call(E);})(j[p],g[p],p);}return this;};n.click=function(B){var r=this;for(var p=0;p<w;p++){(function(C,D,i){var E={sector:C,cover:D,cx:e,cy:d,mx:C.middle.x,my:C.middle.y,mangle:C.mangle,r:o,value:b[i],total:A,label:r.labels&&r.labels[i]};D.click(function(){B.call(E);});})(j[p],g[p],p);}return this;};n.inject=function(i){i.insertBefore(g[0]);};var a=function(G,B,r,p){var K=e+o+o/5,J=d,F=J+10;G=G||[];p=(p&&p.toLowerCase&&p.toLowerCase())||"east";r=k.g.markers[r&&r.toLowerCase()]||"disc";n.labels=k.set();for(var E=0;E<w;E++){var L=j[E].attr("fill"),C=b[E].order,D;b[E].others&&(G[C]=B||"Others");G[C]=k.g.labelise(G[C],b[E],A);n.labels.push(k.set());n.labels[E].push(k.g[r](K+5,F,5).attr({fill:L,stroke:"none"}));n.labels[E].push(D=k.text(K+20,F,G[C]||b[C]).attr(k.g.txtattr).attr({fill:l.legendcolor||"#000","text-anchor":"start"}));g[E].label=n.labels[E];F+=D.getBBox().height*1.2;}var H=n.labels.getBBox(),I={east:[0,-H.height/2],west:[-H.width-2*o-20,-H.height/2],north:[-o-H.width/2,-o-H.height-10],south:[-o-H.width/2,o+10]}[p];n.labels.translate.apply(n.labels,I);n.push(n.labels);};if(l.legend){a(l.legend,l.legendothers,l.legendmark,l.legendpos);}n.push(j,g);n.series=j;n.covers=g;return n;};
ColorPalette
StyleSheet
SiteSubtitle
GettingStarted
SiteTitle
MainMenu
SiteIcon
DefaultTiddlers
ViewTemplate
PageTemplate
SideBarOptions
EditTemplate
SiteInfo
SideBarTabs
ToolbarCommands
{{notLoggedInOnly{
To start using TiddlyDocs, you first need to register/login to [[tiddlyspace|http://tiddlyspace.com]]:

<<TiddlySpaceLogin>>

<<TiddlySpaceRegister>> 
}}}
{{loggedInOnly{
To start using TiddlyDocs create a new space including this space. Make sure you check the box.
<<TiddlySpaceSpaces add>>
}}}
Welcome to TiddlyDocs. TiddlyDocs lets you break large documents down into small sections to make it easier to collaborate on them. 

On the left you can see the TiddlySpace spaces that together make up TiddlyDocs. Please visit those spaces for extra information.

If you would like to try TiddlyDocs please  create a space and include this space into it. 

The title and subtitle of your space are visible to visitors and are also displayed in your browser's tabs. Click on the SiteTitle and SiteSubtitle tiddler links below to make changes.
* [[SiteTitle]]
* [[SiteSubtitle]]
Providing tools to visualize tables as charts in your TiddlySpace/TiddlyWiki.
Provides tiddlers [[g.bar]], [[g.dot]], [[g.line]], [[g.pie]], [[g.raphael]], [[raphaeljs]] and [[TiddlyChartsPlugin]]
/***
|''Name:''|ValueSwitcherPlugin|
|''Description:''|Gather values from a definition tiddler, and present the user with a UI for setting a value from those available options as an extende field |
|''Version:''|0.2|
|''Date:''|25 Sept, 2007|
|''Source:''|http://www.hawksworx.com/playground/TeamTasks/#ValueTogglerPlugin|
|''Author:''|PhilHawksworth (phawksworth (at) gmail (dot) com)|
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.3|
***/

//{{{
// Ensure that this Plugin is only installed once.
if(!version.extensions.ValueSwitcher) 
{
	version.extensions.ValueSwitcher = {installed:true};
	config.macros.ValueSwitcher = {

		handler: function(place,macroName,params,wikifier,paramString,tiddler) {

			var fieldPrefix = "tt_";
			var taskTiddler = story.findContainingTiddler(place);
			if(!(taskTiddler && taskTiddler != 'undefined')) {
				return;
			}
			var params = paramString.parseParams("anon",null,true,false,false);
			var ctrlType = getParam(params,"type",null);
			var id = taskTiddler.id;
			var title = id.substr(7);
			var tiddler = store.getTiddler(title);

			// build a drop down control
			if(ctrlType == 'dropdown') {
				var valueSrc = getParam(params,"valuesSource", null);
				if(!valueSrc) {
					displayMessage("No definition tiddler defined for a TeamTasks dropdown.");
					return;
				}
				var fieldName = fieldPrefix + valueSrc.toLowerCase().substr(0,valueSrc.length-11);
				var selected = fieldName + '::' + store.getValue(tiddler,fieldName);
				var values = this.getDefValues(valueSrc);
				var options = [];
				options.push({'caption': 'Please select', 'name': null});
				for (var i=0; i < values.length; i++) {
					options.push({'caption': values[i], 'name': fieldName + '::' + values[i]});				
				}
				createTiddlyDropDown(place,this.setDropDownMetaData,options,selected);
			}
			// Build a free text box.
			else if(ctrlType == 'freetext') {
				var metaDataName = getParam(params,"metaDataName", null);
				if(!metaDataName) {
					displayMessage("No metaDataName defined for a TeamTasks free text box.");
					return;
				}	
				var ttField = fieldPrefix + metaDataName;
				// var ttname = fieldPrefix + tiddler
				var text = store.getValue(tiddler,ttField);
				if(text == undefined) text = "";	
				var i = createTiddlyElement(place,"input",null,null,null,{"value":text, "type":"input", "ttname":ttField});
				i.onblur = config.macros.ValueSwitcher.changeFreetext;
			}

			/*
				TODO: Build in deadline support
			*/
		},


		//Get definition values for populating UI from definition tiddlers.
		getDefValues: function(src) {
			var text = store.getTiddlerText(src).split('\n');
			var output = [];
			for(var t=0; t<text.length; t++) {
				//support calling the old TaskViewBuilder macro to list the tasks here too.
				var blob = wikifyStatic(text[t],null,tiddler,null);				
				var linktitle = /tiddlylink="[^"]*"/mg;
				var titles = blob.match(linktitle);
				if(titles) {
					for(var n=0; n<titles.length; n++) {
						output.push(titles[n].replace(/tiddlylink="([^"]*)"/,'$1'));
					}
				}
				else {
					output.push(text[t]);
				}
			}
			return (output);	
		},


		// Ensure that changes to a dropdown field are stored as an extended field.
		setDropDownMetaData: function(ev) {
			var e = ev ? ev : window.event;
			var taskTiddler = story.findContainingTiddler(this);
			if(taskTiddler && taskTiddler != undefined) {
				var title = taskTiddler.getAttribute('tiddler');
				var tiddler =  store.getTiddler(title);
				var option = this[this.selectedIndex].value.split('::');
				var extField = option[0];
				var extFieldVal = option[1];
				store.setValue(tiddler,extField,extFieldVal);
				story.saveTiddler(title);
			}
		},


		// Ensure that changes to a free text field are stored as an extended field.
		changeFreetext: function(ev) {
			var e = ev ? ev : window.event;
			var ttField = this.getAttribute('ttname');
			var value = this.value;
			if(ttField) {
				var t = story.findContainingTiddler(this);
				var title = t.getAttribute('tiddler');
				var tiddler =  store.getTiddler(title);
				store.setValue(tiddler,ttField,value);
				story.saveTiddler(title);
			}
			return false;
		}
	};
}
//}}}
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
[[Introduction to TiddlyDocs]]
To install you will need [[g.bar]], [[g.dot]], [[g.line]], [[g.pie]], [[g.raphael]], [[raphaeljs]] and [[TiddlyChartsPlugin]]. Or just include this space into an existing TiddlySpace.

<<PieChart ExamplePieChartData>>
This uses data in the tiddler [[ExamplePieChartData]]
Use the same data for a bar chart..
<<BarChart ExamplePieChartData  width:300 height:300>>

<<LineChart SharePriceData width:300 height:300>>
Using data from [[SharePriceData]]

Data can also be organised in columns, ie. your table could be laid out like [[LineData]]:
<<LineChart LineData dataView:col  symbol:"">>

!TiddlyWiki tricks
Obviously graphs come in useful in a TiddlyWiki.

For visualising tag usage.. (using [[TagUsage]])
<<PieChart TagUsage width:300>>
.. or for seeing activity in a given space by looking at tiddlers modified on different dates:

<<BarChart SpaceActivityData width:300 height:200>>
using [[SpaceActivityData]]

This uses the wonderful [[g.raphael|http://github.com/DmitryBaranovskiy/g.raphael]] made by Dmitry Baranovskiy.
I first blogged about this in the blog post [[TiddlyCharts|http://jonrobson.me.uk/posts/TiddlyCharts]]
/***
|''Name''|TiddlySpacePublishingCommands|
|''Version''|0.8.5|
|''Status''|@@beta@@|
|''Description''|toolbar commands for drafting and publishing|
|''Author''|Jon Robson|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpacePublishingCommands.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig TiddlySpaceFilters|
!Usage
Provides changeToPrivate, changeToPublic and saveDraft commands
Provides TiddlySpacePublisher macro.
{{{<<TiddlySpacePublisher type:private>>}}} make lots of private tiddlers public.
{{{<<TiddlySpacePublisher type:public>>}}} make lots of public tiddlers public.
!TODO
* add public argument?
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var originMacro = config.macros.tiddlerOrigin;

tiddlyspace.getTiddlerStatusType = function(tiddler) {
	var isShadow = store.isShadowTiddler(tiddler.title);
	var exists = store.tiddlerExists(tiddler.title);
	if(isShadow && !exists) {
		return "shadow";
	} else if(!exists) {
		return "missing";
	} else {
		var types = ["private", "public"];
		var type = "external";
		for(var i = 0; i < types.length; i++) {
			var t = types[i];
			type = config.filterHelpers.is[t](tiddler) ? t : type;
		}
		if(config.filterHelpers.is.unsynced(tiddler)) {
			type = type == "private" ? "unsyncedPrivate" : "unsyncedPublic";
		}
		return type;
	}
};

var cmd = config.commands.publishTiddler = {
	text: "make public",
	tooltip: "Change this private tiddler into a public tiddler",
	errorMsg: "Error publishing %0: %1",

	isEnabled: function(tiddler) {
		return !readOnly && config.filterHelpers.is["private"](tiddler);
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(tiddler) {
			var newBag = cmd.toggleBag(tiddler.fields["server.bag"]);
			this.moveTiddler(tiddler, {
				title: tiddler.fields["publish.name"] || tiddler.title,
				fields: { "server.bag": newBag }
			});
		}
	},
	toggleBag: function(bag, to) {
		var newBag;
		if(typeof bag != typeof "") {
			var tiddler = bag;
			bag = tiddler.fields["server.bag"];
		}
		if(bag.indexOf("_private") > -1) { // should make use of endsWith
			to = to ? to : "public";
			newBag = bag.replace("_private", "_" + to);
		} else {
			to = to ? to : "private";
			newBag = bag.replace("_public", "_" + to);
		}
		return newBag;
	},
	copyTiddler: function(title, newTitle, newBag, callback) {
		var original = store.getTiddler(title);
		newTitle = newTitle ? newTitle : title;
		var adaptor = original.getAdaptor();
		var publish = function(original, callback) {
			var tiddler = $.extend(new Tiddler(newTitle), original);
			tiddler.fields = $.extend({}, original.fields, {
				"server.bag": newBag,
				"server.workspace": "bags/%0".format(newBag),
				"server.page.revision": "false"
			});
			delete tiddler.fields["server.title"];
			tiddler.title = newTitle;
			adaptor.putTiddler(tiddler, null, null, callback);
		};
		publish(original, callback);
	},
	moveTiddler: function(tiddler, newTiddler, callback) {
			var info = {
			copyContext: {},
			deleteContext: {}
		};
		var _dirty = store.isDirty();
		var adaptor = tiddler.getAdaptor();
		var newTitle = newTiddler.title;
		var oldTitle = tiddler.title;
		delete tiddler.fields["server.workspace"];
		var oldBag = tiddler.fields["server.bag"];
		var newBag = newTiddler.fields["server.bag"];
		var newWorkspace = "bags/%0".format(newBag);
		cmd.copyTiddler(oldTitle, newTitle, newBag, function(ctx) {
				info.copyContext = ctx;
				var context = {
					tiddler: tiddler,
					workspace: newWorkspace
				};
				store.addTiddler(ctx.tiddler);
				tiddler.title = oldTitle; // for cases where a rename occurs
				if(ctx.status) { // only do if a success
					if(oldBag != newBag) {
						adaptor.deleteTiddler(tiddler, context, {}, function(ctx) {
							info.deleteContext = ctx;
							var el;
							if(tiddler) {
								tiddler.fields["server.workspace"] = newWorkspace;
								tiddler.fields["server.bag"] = newBag;
							}
							el = el ? el : story.refreshTiddler(oldTitle, null, true);
							if(oldTitle != newTitle) {
								store.deleteTiddler(oldTitle);
								store.notify(oldTitle, true);
							}
							if(el) {
								story.displayTiddler(el, newTitle);
							}
							if(oldTitle != newTitle) {
								story.closeTiddler(oldTitle);
							}
							if(callback) {
								callback(info);
							}
							store.setDirty(_dirty);
						});
					} else {
						if(callback) {
							callback(info);
						}
					}
					refreshDisplay();
				}
		});
	}
};

var changeToPrivate = config.commands.changeToPrivate = {
	text: "make private",
	tooltip: "turn this public tiddler into a private tiddler",
	isEnabled: function(tiddler) {
		return !readOnly && config.filterHelpers.is["public"](tiddler);
	},
	handler: function(event, src, title) {
		var tiddler = store.getTiddler(title);
		var newBag = cmd.toggleBag(tiddler, "private");
		var newTiddler = { title: title, fields: { "server.bag": newBag }};
		cmd.moveTiddler(tiddler, newTiddler);
	}
};
config.commands.changeToPublic = cmd;

/* Save as draft command */
var saveDraftCmd = config.commands.saveDraft = {
	text: "save draft",
	tooltip: "Save as a private draft",
	isEnabled: function(tiddler) {
		return changeToPrivate.isEnabled(tiddler);
	},
	getDraftTitle: function(title) {
		var draftTitle;
		var draftNum = "";
		while(!draftTitle) {
			var suggestedTitle = "%0 [draft%1]".format(title, draftNum);
			if(store.getTiddler(suggestedTitle)) {
				draftNum = !draftNum ? 2 : draftNum + 1;
			} else {
				draftTitle = suggestedTitle;
			}
		}
		return draftTitle;
	},
	createDraftTiddler: function(title, gatheredFields) {
		var tiddler = store.getTiddler(title);
		var draftTitle = saveDraftCmd.getDraftTitle(title);
		var draftTiddler = new Tiddler(draftTitle);
		if(tiddler) {
			$.extend(true, draftTiddler, tiddler);
		} else {
			$.extend(draftTiddler.fields, config.defaultCustomFields);
		}
		for(var fieldName in gatheredFields) {
			if(TiddlyWiki.isStandardField(fieldName)) {
				draftTiddler[fieldName] = gatheredFields[fieldName];
			} else {
				draftTiddler.fields[fieldName] = gatheredFields[fieldName];
			}
		}
		var privateBag = tiddlyspace.getCurrentBag("private");
		var privateWorkspace = tiddlyspace.getCurrentWorkspace("private");
		draftTiddler.title = draftTitle;
		draftTiddler.fields["publish.name"] = title;
		draftTiddler.fields["server.workspace"] = privateWorkspace;
		draftTiddler.fields["server.bag"] = privateBag;
		draftTiddler.fields["server.title"] = draftTitle;
		draftTiddler.fields["server.page.revision"] = "false";
		delete draftTiddler.fields["server.etag"];
		return draftTiddler;
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title); // original tiddler
		var tidEl = story.getTiddler(title);
		var uiFields = {};
		story.gatherSaveFields(tidEl, uiFields);
		var tid = saveDraftCmd.createDraftTiddler(title, uiFields);
		tid = store.saveTiddler(tid.title, tid.title, tid.text, tid.modifier,
			new Date(), tid.tags, tid.fields);
		autoSaveChanges(null, [tid]);
		story.closeTiddler(title);
		story.displayTiddler(src, title);
		story.displayTiddler(src, tid.title);
	}
};

var macro = config.macros.TiddlySpacePublisher = {
	locale: {
		title: "Batch Publisher",
		changeStatusLabel: "Make %0",
		noTiddlersText: "No tiddlers to publish",
		changeStatusPrompt: "Make all the selected tiddlers %0.",
		description: "Change tiddlers from %0 to %1 in this space"
	},

	listViewTemplate: {
		columns: [
			{ name: "Selected", field: "Selected", rowName: "title", type: "Selector" },
			{ name: "Tiddler", field: "tiddler", title: "Tiddler", type: "Tiddler" },
			{ name: "Status", field: "status", title: "Status", type: "WikiText" }
		],
		rowClasses: []
	},

	changeStatus: function(tiddlers, status, callback) { // this is what is called when you click the publish button
		var publicBag;
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var newTiddler = {
				title: tiddler.title,
				fields: { "server.bag": cmd.toggleBag(tiddler, status) }
			};
			cmd.moveTiddler(tiddler, newTiddler, callback);
		}
	},
	getMode: function(paramString) {
		var params = paramString.parseParams("anon")[0];
		var status = params.type ?
			(["public", "private"].contains(params.type[0]) ? params.type[0] : "private") :
			"private";
		var newStatus = status == "public" ? "private" : "public";
		return [status, newStatus];
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var wizard = new Wizard();
		var locale = macro.locale;
		var status = macro.getMode(paramString);
		wizard.createWizard(place, locale.title);
		wizard.addStep(macro.locale.description.format(status[0], status[1]),
			'<input type="hidden" name="markList" />');
		var markList = wizard.getElement("markList");
		var listWrapper = $("<div />").addClass("batchPublisher").
			attr("refresh", "macro").attr("macroName", macroName).
			attr("params", paramString)[0];
		markList.parentNode.insertBefore(listWrapper, markList);
		$.data(listWrapper, "wizard", wizard);
		macro.refresh(listWrapper);
	},
	getCheckedTiddlers: function(listWrapper, titlesOnly) {
		var tiddlers = [];
		$(".chkOptionInput[rowName]:checked", listWrapper).each(function(i, el) {
			var title = $(el).attr("rowName");
			if(titlesOnly) {
				tiddlers.push(title);
			} else {
				tiddlers.push(store.getTiddler(title));
			}
		});
		return tiddlers;
	},
	refresh: function(listWrapper) {
		var checked = macro.getCheckedTiddlers(listWrapper, true);
		var paramString = $(listWrapper).empty().attr("params");
		var wizard = $.data(listWrapper, "wizard");
		var locale = macro.locale;
		var params = paramString.parseParams("anon")[0];
		var publishCandidates = [];
		var status = macro.getMode(paramString);
		var pubType = status[0];
		var newPubType = status[1];
		var tiddlers = params.filter ? store.filterTiddlers(params.filter[0]) :
			store.filterTiddlers("[is[%0]]".format(pubType));
		var enabled = [];
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var title = tiddler.title;
			if(!tiddler.tags.contains("excludePublisher") && title !== "SystemSettings") {
				publishCandidates.push({ title: title, tiddler: tiddler, status: pubType});
			}
			if(checked.contains(title)) {
				enabled.push("[rowname=%0]".format(title));
			}
		}

		if(publishCandidates.length === 0) {
			createTiddlyElement(listWrapper, "em", null, null, locale.noTiddlersText);
		} else {
			var listView = ListView.create(listWrapper, publishCandidates, macro.listViewTemplate);
			wizard.setValue("listView", listView);
			var btnHandler = function(ev) {
				var tiddlers = macro.getCheckedTiddlers(listWrapper);
				var callback = function(status) {
					$(".batchPublisher").each(function(i, el) {
						macro.refresh(el);
					});
				};
				macro.changeStatus(tiddlers, newPubType, callback);
			};
			wizard.setButtons([{
				caption: locale.changeStatusLabel.format(newPubType),
				tooltip: locale.changeStatusPrompt.format(newPubType),
				onClick: btnHandler
			}]);
			$(enabled.join(",")).attr("checked", true); // retain what was checked before
		}
	}
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceBackstage|
|''Version''|0.8.0|
|''Description''|Provides a TiddlySpace version of the backstage and a homeLink macro|
|''Status''|@@beta@@|
|''Contributors''|Jon Lister, Jon Robson, Colm Britton|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceBackstage.js|
|''Requires''|TiddlySpaceConfig ImageMacroPlugin TiddlySpaceViewTypes|
!StyleSheet
.tiddler .error.annotation .button{
	display: inline-block;
}

#backstageArea {
	z-index: 49;
	color: white;
	background-color: black;
	background: -webkit-gradient(linear,left bottom,left top,color-stop(0, #222),color-stop(0.5, #333),color-stop(1, #555));
	background: -moz-linear-gradient(center bottom,#222 0%, #333 50%, #555 100%);
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222);
	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222)";
	height: 25px;
	padding: 0;
}

#backstageButton {
	overflow: hidden;
}

#backstageButton #backstageShow,
#backstageButton #backstageHide {
	margin: 0px;
	padding: 0px;
}

#backstageButton #backstageShow:hover,
#backstageButton #backstageHide:hover {
	background: none;
	color: none;
}

#backstageButton img,
#backstageButton svg {
	width: 24px;
	height: 24px;
}

#messageArea {
	top: 50px;
}

#backstageToolbar {
	position: relative;
}

#backstageArea a {
	padding: 0px;
	margin-left: 0px;
	color: white;
	background: none;
}

#backstageArea a:hover {
	background-color: white;
}

#backstage ol,
#backstage ul {
	padding: auto;
}

#backstageButton a {
	margin: 0;
}

.backstagePanelBody ul {
	padding: 5px;
	margin: 5px;
}

#backstage #backstagePanel {
	margin-left: 5%;
	padding: 0em;
	margin-right: 5%;
}

#backstageToolbar a {
	position: relative;
}

#backstageArea a.backstageSelTab,
#backstageToolbar .backstageTask {
	line-height: 25px;
	color: #767676;
}

.backstageTask .externalImage,
.backstageTask .image {
	display: inline;
}

#backstageToolbar a span {
	z-index: 2;
}

a.backstageTask {
	display: inline;
        margin-left: 1em !important;
}

.backstagePanelBody .button {
	display: inline-block;
	margin-right: 10px;
}

.backstagePanelBody {
	margin: 0 0 0 0.6em;
	padding: 0.4em 0.5em 1px 0.5em;
}

#backstage table {
	margin: auto;
}

#backstage .wizard table {
	border: 0px;
	margin: 0;
}

#backstage div  li.listLink {
	border: 0px;
	width: 78%;
	font-size: 0.7em;
}

#backstage div li.listTitle {
	font-weight: bold;
	text-decoration: underline;
	font-size: 1em;
	background: #ccc;
	width: 100%;
}

#backstage fieldset {
	border: solid 1px [[ColorPalette::Background]];
}

#backstage .viewer table,#backstage table.twtable {
	border: 0px;
}

#backstageToolbar img {
	padding: 0;
}

#backstage .wizard,
#backstage .wizardFooter {
	background: none;
}

.viewer td, .viewer tr, .twtable td, .twtable tr {
	border: 1px solid #eee;
}

#backstage .inlineList ul li {
	background-color: [[ColorPalette::Background]];
	border: solid 1px [[ColorPalette::TertiaryMid]];
	display: block;
	float: left;
	list-style: none;
	margin-right: 1em;
	padding: 0.5em;
}

.backstageClear, .inlineList form {
	clear: both;
	display: block;
	margin-top: 3em;
}

.tiddlyspaceMenu {
	text-align: center;
}

span.chunkyButton {
	display: inline-block;
	padding: 0;
	margin: 0;
	border: solid 2px #000;
	background-color: #04b;
}

span.chunkyButton a.button, span.chunkyButton a:active.button {
	white-space: nowrap;
	font-weight: bold;
	font-size: 1.8em;
	color: #fff;
	text-align: center;
	padding: 0.5em 0.5em;
	margin: 0;
	border-style: none;
	display: block;
}

span.chunkyButton:hover {
	background-color: #014;
}

span.chunkyButton a.button:hover {
	border-style: none;
	background: none;
	color: #fff;
}

#backstage .unpluggedSpaceTab .wizard,
.unpluggedSpaceTab .wizard {
	background: white;
	border: 2px solid #CCC;
	padding: 5px;
}

.syncKey .keyItem {
	border: 1px solid black;
	display: inline-block;
	margin: 0.2em;
	padding: 0.1em 0.1em 0.1em 0.1em;
}

.keyHeading {
	font-size: 2em;
	font-weight: bold;
	margin: 0.4em 0em -0.2em;
}

.unpluggedSpaceTab .putToServer,
.unpluggedSpaceTab .notChanged {
	display: none;
}

.tiddlyspaceMenu ul {
	margin: 0;
	padding: 0;
}

.tiddlyspaceMenu ul li {
	list-style: none;
}

.unsyncedChanges .unsyncedList {
	display: block;
}

.unsyncedList {
	display: none;
}
!Code
***/
//{{{
(function ($) {
    var name = "StyleSheet" + tiddler.title;
    config.shadowTiddlers[name] = "/*{{{*/\n%0\n/*}}}*/".
        format(store.getTiddlerText(tiddler.title + "##StyleSheet")); // this accesses the StyleSheet section of the current tiddler (the plugin that contains it)
    store.addNotification(name, refreshStyles);

    if (!config.extensions.tiddlyweb.status.tiddlyspace_version) { // unplugged
        config.extensions.tiddlyweb.status.tiddlyspace_version = "<unknown>";
        config.extensions.tiddlyweb.status.server_host = {
            url:config.extensions.tiddlyweb.host }; // TiddlySpaceLinkPlugin expects this
    }
    var disabled_tasks_for_nonmembers = ["tiddlers", "plugins", "batch", "sync"];

    var tweb = config.extensions.tiddlyweb;
    var tiddlyspace = config.extensions.tiddlyspace;
    var currentSpace = tiddlyspace.currentSpace.name;
    var imageMacro = config.macros.image;

    if (config.options.chkBackstage === undefined) {
        config.options.chkBackstage = false;
    }

// Set up Backstage
    config.tasks = {};
    config.tasks.status = {
        text:"status",
        tooltip:"TiddlySpace Info",
        content:"<<tiddler Backstage##Menu>>"
    };
    config.tasks.tiddlers = {
        text:"tiddlers",
        tooltip:"tiddlers control panel",
        content:"<<tiddler Backstage##BackstageTiddlers>>"
    };
    config.tasks.plugins = {
        text:"plugins",
        tooltip:"Manage installed plugins",
        content:"<<tiddler Backstage##Plugins>>"
    };
    config.tasks.batch = {
        text:"batch",
        tooltip:"Batch manage public/private tiddlers",
        content:"<<tiddler Backstage##BatchOps>>"
    };
    config.tasks.tweaks = {
        text:"tweaks",
        tooltip:"Tweak TiddlyWiki behaviors",
        content:"<<tiddler Backstage##Tweaks>>"
    };
    config.tasks.exportTiddlers = {
        text:"import/export",
        tooltip:"Import/export tiddlers from/to a TiddlyWiki",
        content:"<<tiddler Backstage##ImportExport>>"
    };
    config.tasks.sync = {
        text:"sync",
        tooltip:"Check Sync status",
        content:"<<tiddler Backstage##SpaceUnplugged>>"
    };

    if (window.location.protocol === "file:") {
        config.unplugged = true;
    }

    config.backstageTasks = ["status", "tiddlers", "plugins",
        "batch", "tweaks", "exportTiddlers", "sync"];

    config.messages.backstage.prompt = "";
// initialize state
    var _show = backstage.show;
    backstage.show = function () {
        // selectively hide backstage tasks and tabs based on user status
        var tasks = $("#backstageToolbar .backstageTask").show();
        var bs = backstage.tiddlyspace;
        if (!config.unplugged) {
            tweb.getUserInfo(function (user) {
                if (user.anon) {
                    jQuery.each(disabled_tasks_for_nonmembers, function (i, task) {
                        var taskIndex = config.backstageTasks.indexOf(task);
                        if (taskIndex !== -1) {
                            config.backstageTasks.splice(taskIndex, 1);
                        }
                    });
                    config.messages.memberStatus = bs.locale.loggedout;
                } else {
                    config.messages.memberStatus = readOnly ?
                        bs.locale.nonmember : bs.locale.member;
                }
            });
        } else {
            config.messages.memberStatus = bs.locale.unplugged;
        }

        // display backstage
        return _show.apply(this, arguments);
    };
    if (readOnly) {
        jQuery.each(disabled_tasks_for_nonmembers, function (i, task) {
            var taskIndex = config.backstageTasks.indexOf(task);
            if (taskIndex !== -1) {
                config.backstageTasks.splice(taskIndex, 1);
            }
        });
    }

    var tasks = config.tasks;
    var commonUrl = "/bags/common/tiddlers/%0";

    backstage.tiddlyspace = {
        locale:{
            member:"You are a member of this space.",
            nonmember:"You are not a member of this space.",
            loggedout:"You are currently logged out of TiddlySpace.",
            unplugged:"You are unplugged."
        },
        showButton:function () {
            var showBtn = $("#backstageShow")[0];
            var altText = $(showBtn).text();
            $(showBtn).empty();
            imageMacro.renderImage(showBtn, "backstage.svg",
                { altImage:commonUrl.format("backstage.png"), alt:altText});
        },
        hideButton:function () {
            var hideBtn = $("#backstageHide")[0];
            var altText = $(hideBtn).text();
            $(hideBtn).empty();
            imageMacro.renderImage(hideBtn, "close.svg",
                { altImage:commonUrl.format("close.png"), alt:altText, width:24, height:24 });
        }
    };

    var _init = backstage.init;
    backstage.init = function () {
        _init.apply(this, arguments);
        var init = function (user) {
            var bs = backstage.tiddlyspace;
            bs.showButton();
            bs.hideButton();
        };
        tweb.getUserInfo(init);
    };

    var home = config.macros.homeLink = {
        locale:{
            linkText:"your home space"
        },
        handler:function (place) {
            var container = $("<span />").appendTo(place)[0];
            tweb.getUserInfo(function (user) {
                if (!user.anon && user.name !== currentSpace) {
                    createSpaceLink(container, user.name, null, home.locale.linkText);
                }
            });
        }
    };

    config.macros.exportSpace = {
        handler:function (place, macroName, params) {
            var filename = params[0] ||
                "/tiddlers.wiki?download=%0.html".format(currentSpace);
            $('<a class="button">download</a>').// XXX: i18n
                attr("href", filename).appendTo(place);
        }
    };

}(jQuery));
//}}}
/***
|''Name''|RevisionsCommandPlugin|
|''Description''|provides access to tiddler revisions|
|''Author''|FND|
|''Contributors''|Martin Budden|
|''Version''|0.3.3|
|''Status''|@@beta@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/RevisionsCommandPlugin.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/plugins/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Keywords''|serverSide|
!Usage
Extend [[ToolbarCommands]] with {{{revisions}}}.
!Revision History
!!v0.1 (2009-07-23)
* initial release (renamed from experimental ServerCommandsPlugin)
!!v0.2 (2010-03-04)
* suppressed wikification in diff view
!!v0.3 (2010-04-07)
* restored wikification in diff view
* added link to side-by-side diff view
!To Do
* strip server.* fields from revision tiddlers
* resolve naming conflicts
* i18n, l10n
* code sanitizing
* documentation
!Code
***/
//{{{
(function($) {

jQuery.twStylesheet(".diff { white-space: pre, font-family: monospace }",
	{ id: "diff" });

var cmd = config.commands.revisions = {
	type: "popup",
	hideShadow: true,
	text: "revisions",
	tooltip: "display tiddler revisions",
	revTooltip: "", // TODO: populate dynamically?
	loadLabel: "loading...",
	loadTooltip: "loading revision list",
	selectLabel: "select",
	selectTooltip: "select revision for comparison",
	selectedLabel: "selected",
	compareLabel: "compare",
	linkLabel: "side-by-side view",
	revSuffix: " [rev. #%0]",
	diffSuffix: " [diff: #%0 #%1]",
	dateFormat: "YYYY-0MM-0DD 0hh:0mm",
	listError: "revisions could not be retrieved",

	handlePopup: function(popup, title) {
		title = this.stripSuffix("rev", title);
		title = this.stripSuffix("diff", title);
		var tiddler = store.getTiddler(title);
		var type = _getField("server.type", tiddler);
		var adaptor = new config.adaptors[type]();
		var limit = null; // TODO: customizable
		var context = {
			host: _getField("server.host", tiddler),
			workspace: _getField("server.workspace", tiddler)
		};
		var loading = createTiddlyButton(popup, cmd.loadLabel, cmd.loadTooltip);
		var params = { popup: popup, loading: loading, origin: title };
		adaptor.getTiddlerRevisionList(title, limit, context, params, this.displayRevisions);
	},

	displayRevisions: function(context, userParams) {
		removeNode(userParams.loading);
		if(context.status) {
			var callback = function(ev) {
				var e = ev || window.event;
				var revision = resolveTarget(e).getAttribute("revision");
				context.adaptor.getTiddlerRevision(tiddler.title, revision, context,
					userParams, cmd.displayTiddlerRevision);
			};
			var table = createTiddlyElement(userParams.popup, "table");
			for(var i = 0; i < context.revisions.length; i++) {
				var tiddler = context.revisions[i];
				var row = createTiddlyElement(table, "tr");
				var timestamp = tiddler.modified.formatString(cmd.dateFormat);
				var revision = tiddler.fields["server.page.revision"];
				var cell = createTiddlyElement(row, "td");
				createTiddlyButton(cell, timestamp, cmd.revTooltip, callback, null,
					null, null, { revision: revision });
				cell = createTiddlyElement(row, "td", null, null, tiddler.modifier);
				cell = createTiddlyElement(row, "td");
				createTiddlyButton(cell, cmd.selectLabel, cmd.selectTooltip,
					cmd.revisionSelected, null, null, null,
					{ index:i, revision: revision, col: 2 });
				cmd.context = context; // XXX: unsafe (singleton)!?
			}
		} else {
			$("<li />").text(cmd.listError).appendTo(userParams.popup);
		}
	},

	revisionSelected: function(ev) {
		var e = ev || window.event;
		e.cancelBubble = true;
		if(e.stopPropagation) {
			e.stopPropagation();
		}
		var n = resolveTarget(e);
		var index = n.getAttribute("index");
		var col = n.getAttribute("col");
		while(!index || !col) {
			n = n.parentNode;
			index = n.getAttribute("index");
			col = n.getAttribute("col");
		}
		cmd.revision = n.getAttribute("revision");
		var table = n.parentNode.parentNode.parentNode;
		var rows = table.childNodes;
		for(var i = 0; i < rows.length; i++) {
			var c = rows[i].childNodes[col].firstChild;
			if(i == index) {
				if(c.textContent) {
					c.textContent = cmd.selectedLabel;
				} else {
					c.text = cmd.selectedLabel;
				}
			} else {
				if(c.textContent) {
					c.textContent = cmd.compareLabel;
				} else {
					c.text = cmd.compareLabel;
				}
				c.onclick = cmd.compareSelected;
			}
		}
	},

	compareSelected: function(ev) {
		var e = ev || window.event;
		var n = resolveTarget(e);
		var context = cmd.context;
		context.rev1 = n.getAttribute("revision");
		context.rev2 = cmd.revision;
		context.tiddler = context.revisions[n.getAttribute("index")];
		context.format = "unified";
		context.adaptor.getTiddlerDiff(context.tiddler.title, context,
			context.userParams, cmd.displayTiddlerDiffs);
	},

	displayTiddlerDiffs: function(context, userParams) {
		var tiddler = context.tiddler;
		tiddler.title += cmd.diffSuffix.format([context.rev1, context.rev2]);
		tiddler.text = "{{diff{\n" + context.diff + "\n}}}";
		tiddler.tags = ["diff"];
		tiddler.fields.doNotSave = "true"; // XXX: correct?
		if(!store.getTiddler(tiddler.title)) {
			store.addTiddler(tiddler);
		}
		var src = story.getTiddler(userParams.origin);
		var tiddlerEl = story.displayTiddler(src, tiddler);
		var uri = context.uri.replace("format=unified", "format=horizontal");
		var link = $('<a target="_blank" />').attr("href", uri).text(cmd.linkLabel);
		$(".viewer", tiddlerEl).prepend(link);
	},

	displayTiddlerRevision: function(context, userParams) {
		var tiddler = context.tiddler;
		tiddler.title += cmd.revSuffix.format([tiddler.fields["server.page.revision"]]);
		tiddler.fields.doNotSave = "true"; // XXX: correct?
		if(!store.getTiddler(tiddler.title)) {
			store.addTiddler(tiddler);
		}
		var src = story.getTiddler(userParams.origin);
		story.displayTiddler(src, tiddler);
	},

	stripSuffix: function(type, title) {
		var str = cmd[type + "Suffix"];
		var i = str.indexOf("%0");
		i = title.indexOf(str.substr(0, i));
		if(i != -1) {
			title = title.substr(0, i);
		}
		return title;
	}
};

var _getField = function(name, tiddler) {
	return tiddler.fields[name] || config.defaultCustomFields[name];
};

})(jQuery);
//}}}
/***
|''Description''|Sanitisation for dynamically pulling tiddlers into your space and displaying them|
!Notes
Works both inside and outside TiddlyWiki. Uses the HTML Sanitizer provided by the Google Caja project
(see http://code.google.com/p/google-caja/wiki/JsHtmlSanitizer for more on this), which is licensed under
an Apache License (see http://www.apache.org/licenses/LICENSE-2.0).
!Code
***/
//{{{
(function($) {

var cleanURL = function(url) {
	var regexp = /^(?:http|https|mailto|ftp|irc|news):\/\//;
	return (regexp.test(url)) ? url : null;
};

$.sanitize = function(html) {
	return html_sanitize(html, cleanURL);
};

/*
 * HTML Sanitizer, provided by Google Caja
 */

/* Copyright Google Inc.
 * Licensed under the Apache Licence Version 2.0
 * Autogenerated at Tue May 17 17:39:24 BST 2011
 * @provides html4
 */var html4={};html4.atype={NONE:0,URI:1,URI_FRAGMENT:11,SCRIPT:2,STYLE:3,ID:4,IDREF:5,IDREFS:6,GLOBAL_NAME:7,LOCAL_NAME:8,CLASSES:9,FRAME_TARGET:10},html4.ATTRIBS={"*::class":9,"*::dir":0,"*::id":4,"*::lang":0,"*::onclick":2,"*::ondblclick":2,"*::onkeydown":2,"*::onkeypress":2,"*::onkeyup":2,"*::onload":2,"*::onmousedown":2,"*::onmousemove":2,"*::onmouseout":2,"*::onmouseover":2,"*::onmouseup":2,"*::style":3,"*::title":0,"a::accesskey":0,"a::coords":0,"a::href":1,"a::hreflang":0,"a::name":7,"a::onblur":2,"a::onfocus":2,"a::rel":0,"a::rev":0,"a::shape":0,"a::tabindex":0,"a::target":10,"a::type":0,"area::accesskey":0,"area::alt":0,"area::coords":0,"area::href":1,"area::nohref":0,"area::onblur":2,"area::onfocus":2,"area::shape":0,"area::tabindex":0,"area::target":10,"bdo::dir":0,"blockquote::cite":1,"br::clear":0,"button::accesskey":0,"button::disabled":0,"button::name":8,"button::onblur":2,"button::onfocus":2,"button::tabindex":0,"button::type":0,"button::value":0,"canvas::height":0,"canvas::width":0,"caption::align":0,"col::align":0,"col::char":0,"col::charoff":0,"col::span":0,"col::valign":0,"col::width":0,"colgroup::align":0,"colgroup::char":0,"colgroup::charoff":0,"colgroup::span":0,"colgroup::valign":0,"colgroup::width":0,"del::cite":1,"del::datetime":0,"dir::compact":0,"div::align":0,"dl::compact":0,"font::color":0,"font::face":0,"font::size":0,"form::accept":0,"form::action":1,"form::autocomplete":0,"form::enctype":0,"form::method":0,"form::name":7,"form::onreset":2,"form::onsubmit":2,"form::target":10,"h1::align":0,"h2::align":0,"h3::align":0,"h4::align":0,"h5::align":0,"h6::align":0,"hr::align":0,"hr::noshade":0,"hr::size":0,"hr::width":0,"iframe::align":0,"iframe::frameborder":0,"iframe::height":0,"iframe::marginheight":0,"iframe::marginwidth":0,"iframe::width":0,"img::align":0,"img::alt":0,"img::border":0,"img::height":0,"img::hspace":0,"img::ismap":0,"img::name":7,"img::src":1,"img::usemap":11,"img::vspace":0,"img::width":0,"input::accept":0,"input::accesskey":0,"input::align":0,"input::alt":0,"input::autocomplete":0,"input::checked":0,"input::disabled":0,"input::ismap":0,"input::maxlength":0,"input::name":8,"input::onblur":2,"input::onchange":2,"input::onfocus":2,"input::onselect":2,"input::readonly":0,"input::size":0,"input::src":1,"input::tabindex":0,"input::type":0,"input::usemap":11,"input::value":0,"ins::cite":1,"ins::datetime":0,"label::accesskey":0,"label::for":5,"label::onblur":2,"label::onfocus":2,"legend::accesskey":0,"legend::align":0,"li::type":0,"li::value":0,"map::name":7,"menu::compact":0,"ol::compact":0,"ol::start":0,"ol::type":0,"optgroup::disabled":0,"optgroup::label":0,"option::disabled":0,"option::label":0,"option::selected":0,"option::value":0,"p::align":0,"pre::width":0,"q::cite":1,"select::disabled":0,"select::multiple":0,"select::name":8,"select::onblur":2,"select::onchange":2,"select::onfocus":2,"select::size":0,"select::tabindex":0,"table::align":0,"table::bgcolor":0,"table::border":0,"table::cellpadding":0,"table::cellspacing":0,"table::frame":0,"table::rules":0,"table::summary":0,"table::width":0,"tbody::align":0,"tbody::char":0,"tbody::charoff":0,"tbody::valign":0,"td::abbr":0,"td::align":0,"td::axis":0,"td::bgcolor":0,"td::char":0,"td::charoff":0,"td::colspan":0,"td::headers":6,"td::height":0,"td::nowrap":0,"td::rowspan":0,"td::scope":0,"td::valign":0,"td::width":0,"textarea::accesskey":0,"textarea::cols":0,"textarea::disabled":0,"textarea::name":8,"textarea::onblur":2,"textarea::onchange":2,"textarea::onfocus":2,"textarea::onselect":2,"textarea::readonly":0,"textarea::rows":0,"textarea::tabindex":0,"tfoot::align":0,"tfoot::char":0,"tfoot::charoff":0,"tfoot::valign":0,"th::abbr":0,"th::align":0,"th::axis":0,"th::bgcolor":0,"th::char":0,"th::charoff":0,"th::colspan":0,"th::headers":6,"th::height":0,"th::nowrap":0,"th::rowspan":0,"th::scope":0,"th::valign":0,"th::width":0,"thead::align":0,"thead::char":0,"thead::charoff":0,"thead::valign":0,"tr::align":0,"tr::bgcolor":0,"tr::char":0,"tr::charoff":0,"tr::valign":0,"ul::compact":0,"ul::type":0},html4.eflags={OPTIONAL_ENDTAG:1,EMPTY:2,CDATA:4,RCDATA:8,UNSAFE:16,FOLDABLE:32,SCRIPT:64,STYLE:128},html4.ELEMENTS={a:0,abbr:0,acronym:0,address:0,applet:16,area:2,b:0,base:18,basefont:18,bdo:0,big:0,blockquote:0,body:49,br:2,button:0,canvas:0,caption:0,center:0,cite:0,code:0,col:2,colgroup:1,dd:1,del:0,dfn:0,dir:0,div:0,dl:0,dt:1,em:0,fieldset:0,font:0,form:0,frame:18,frameset:16,h1:0,h2:0,h3:0,h4:0,h5:0,h6:0,head:49,hr:2,html:49,i:0,iframe:4,img:2,input:2,ins:0,isindex:18,kbd:0,label:0,legend:0,li:1,link:18,map:0,menu:0,meta:18,nobr:0,noframes:20,noscript:20,object:16,ol:0,optgroup:0,option:1,p:1,param:18,pre:0,q:0,s:0,samp:0,script:84,select:0,small:0,span:0,strike:0,strong:0,style:148,sub:0,sup:0,table:0,tbody:1,td:1,textarea:8,tfoot:1,th:1,thead:1,title:24,tr:1,tt:0,u:0,ul:0,"var":0},html4.ueffects={NOT_LOADED:0,SAME_DOCUMENT:1,NEW_DOCUMENT:2},html4.URIEFFECTS={"a::href":2,"area::href":2,"blockquote::cite":0,"body::background":1,"del::cite":0,"form::action":2,"img::src":1,"input::src":1,"ins::cite":0,"q::cite":0},html4.ltypes={UNSANDBOXED:2,SANDBOXED:1,DATA:0},html4.LOADERTYPES={"a::href":2,"area::href":2,"blockquote::cite":2,"body::background":1,"del::cite":2,"form::action":2,"img::src":1,"input::src":1,"ins::cite":2,"q::cite":2};var html=function(a){function x(b,c,d){var e=[];w(function(b,e){for(var f=0;f<e.length;f+=2){var g=e[f],h=e[f+1],i=null,j;if((j=b+"::"+g,a.ATTRIBS.hasOwnProperty(j))||(j="*::"+g,a.ATTRIBS.hasOwnProperty(j)))i=a.ATTRIBS[j];if(i!==null)switch(i){case a.atype.NONE:break;case a.atype.SCRIPT:case a.atype.STYLE:h=null;break;case a.atype.ID:case a.atype.IDREF:case a.atype.IDREFS:case a.atype.GLOBAL_NAME:case a.atype.LOCAL_NAME:case a.atype.CLASSES:h=d?d(h):h;break;case a.atype.URI:h=c&&c(h);break;case a.atype.URI_FRAGMENT:h&&"#"===h.charAt(0)?(h=d?d(h):h,h&&(h="#"+h)):h=null;break;default:h=null}else h=null;e[f+1]=h}return e})(b,e);return e.join("")}function w(b){var c,d;return v({startDoc:function(a){c=[],d=!1},startTag:function(e,f,g){if(!d){if(!a.ELEMENTS.hasOwnProperty(e))return;var h=a.ELEMENTS[e];if(h&a.eflags.FOLDABLE)return;if(h&a.eflags.UNSAFE){d=!(h&a.eflags.EMPTY);return}f=b(e,f);if(f){h&a.eflags.EMPTY||c.push(e),g.push("<",e);for(var i=0,j=f.length;i<j;i+=2){var k=f[i],l=f[i+1];l!==null&&l!==void 0&&g.push(" ",k,'="',r(l),'"')}g.push(">")}}},endTag:function(b,e){if(d)d=!1;else{if(!a.ELEMENTS.hasOwnProperty(b))return;var f=a.ELEMENTS[b];if(!(f&(a.eflags.UNSAFE|a.eflags.EMPTY|a.eflags.FOLDABLE))){var g;if(f&a.eflags.OPTIONAL_ENDTAG)for(g=c.length;--g>=0;){var h=c[g];if(h===b)break;if(!(a.ELEMENTS[h]&a.eflags.OPTIONAL_ENDTAG))return}else for(g=c.length;--g>=0;)if(c[g]===b)break;if(g<0)return;for(var i=c.length;--i>g;){var h=c[i];a.ELEMENTS[h]&a.eflags.OPTIONAL_ENDTAG||e.push("</",h,">")}c.length=g,e.push("</",b,">")}}},pcdata:function(a,b){d||b.push(a)},rcdata:function(a,b){d||b.push(a)},cdata:function(a,b){d||b.push(a)},endDoc:function(a){for(var b=c.length;--b>=0;)a.push("</",c[b],">");c.length=0}})}function v(c){return function(d,e){d=String(d);var f=null,g=!1,h=[],j=void 0,l=void 0,m=void 0;c.startDoc&&c.startDoc(e);while(d){var n=d.match(g?t:u);d=d.substring(n[0].length);if(g){if(n[1]){var o=b(n[1]),p;if(n[2]){var q=n[3];switch(q.charCodeAt(0)){case 34:case 39:q=q.substring(1,q.length-1)}p=k(i(q))}else p=o;h.push(o,p)}else if(n[4]){l!==void 0&&(m?c.startTag&&c.startTag(j,h,e):c.endTag&&c.endTag(j,e));if(m&&l&(a.eflags.CDATA|a.eflags.RCDATA)){f===null?f=b(d):f=f.substring(f.length-d.length);var r=f.indexOf("</"+j);r<0&&(r=d.length),l&a.eflags.CDATA?c.cdata&&c.cdata(d.substring(0,r),e):c.rcdata&&c.rcdata(s(d.substring(0,r)),e),d=d.substring(r)}j=l=m=void 0,h.length=0,g=!1}}else if(n[1])c.pcdata&&c.pcdata(n[0],e);else if(n[3])m=!n[2],g=!0,j=b(n[3]),l=a.ELEMENTS.hasOwnProperty(j)?a.ELEMENTS[j]:void 0;else if(n[4])c.pcdata&&c.pcdata(n[4],e);else if(n[5]&&c.pcdata)switch(n[5]){case"<":c.pcdata("&lt;",e);break;case">":c.pcdata("&gt;",e);break;default:c.pcdata("&amp;",e)}}c.endDoc&&c.endDoc(e)}}function s(a){return a.replace(m,"&amp;$1").replace(n,"&lt;").replace(o,"&gt;")}function r(a){return a.replace(l,"&amp;").replace(n,"&lt;").replace(o,"&gt;").replace(p,"&#34;").replace(q,"&#61;")}function k(a){return a.replace(j,g)}function i(a){return a.replace(h,"")}function g(a,b){return f(b)}function f(a){a=b(a);if(c.hasOwnProperty(a))return c[a];var f=a.match(d);if(f)return String.fromCharCode(parseInt(f[1],10));if(!!(f=a.match(e)))return String.fromCharCode(parseInt(f[1],16));return""}var b;"script"==="SCRIPT".toLowerCase()?b=function(a){return a.toLowerCase()}:b=function(a){return a.replace(/[A-Z]/g,function(a){return String.fromCharCode(a.charCodeAt(0)|32)})};var c={lt:"<",gt:">",amp:"&",nbsp:"240",quot:'"',apos:"'"},d=/^#(\d+)$/,e=/^#x([0-9A-Fa-f]+)$/,h=/\0/g,j=/&(#\d+|#x[0-9A-Fa-f]+|\w+);/g,l=/&/g,m=/&([^a-z#]|#(?:[^0-9x]|x(?:[^0-9a-f]|$)|$)|$)/gi,n=/</g,o=/>/g,p=/\"/g,q=/\=/g,t=new RegExp("^\\s*(?:(?:([a-z][a-z-]*)(\\s*=\\s*(\"[^\"]*\"|'[^']*'|(?=[a-z][a-z-]*\\s*=)|[^>\"'\\s]*))?)|(/?>)|[\\s\\S][^a-z\\s>]*)","i"),u=new RegExp("^(?:&(\\#[0-9]+|\\#[x][0-9a-f]+|\\w+);|<!--[\\s\\S]*?-->|<!\\w[^>]*>|<\\?[^>*]*>|<(/)?([a-z][a-z0-9]*)|([^<&>]+)|([<&>]))","i");return{escapeAttrib:r,makeHtmlSanitizer:w,makeSaxParser:v,normalizeRCData:s,sanitize:x,unescapeEntities:k}}(html4),html_sanitize=html.sanitize

// stop here if we're not in TiddlyWiki
// XXX: is this the correct way of checking for TiddlyWiki?
if (!window.TiddlyWiki || !window.store || !store instanceof TiddlyWiki) {
	return;
}

var tiddlyspace = config.extensions.tiddlyspace;

var _subWikify = Wikifier.prototype.subWikify;

var cleanedTitle = 'This section has been cleaned of any potentially harmful code';

var replaceFunctions = {
	html: function(w) {
		var sanitizedHTML, spanEl;
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			sanitizedHTML = $.sanitize(lookaheadMatch[1]);
			spanEl = createTiddlyElement(w.output, 'span', null, 'sanitized');
			spanEl.innerHTML = sanitizedHTML;
			spanEl.setAttribute('title', cleanedTitle);
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	},
	customFormat: 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';
				}
				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;
		}
	}
};

Wikifier.prototype.subWikify = function(output, terminator) {
	var tid = this.tiddler,
		spaceName = tiddlyspace.currentSpace.name,
		tidSpace, recipeName, stripped;
	try {
		recipeName = tid.fields['server.recipe'] ||
			tid.fields['server.workspace'];
		tidSpace = tiddlyspace.resolveSpaceName(recipeName);
		if (tidSpace !== spaceName) {
			// external tiddler, so replace dangerous formatters
			stripped = stripHTML(tid, this.formatter);
		}
	} catch(e) {
		// do nothing. There's no tiddler, so assume it's safe (?!?!?)
	}

	_subWikify.apply(this, arguments);

	if (stripped) {
		// change back to the original function
		unstripHTML(stripped, this.formatter);
	}
};

// replace potentially unsafe formatters with versions that strip bad HTML/CSS
var stripHTML = function(tid, formatter) {
	var popped = {}, _handler;
	for (var i = 0; i < formatter.formatters.length; i++) {
		var f = formatter.formatters[i];
		if (replaceFunctions[f.name]) {
			_handler = f.handler;
			popped[f.name] = _handler;
			f.handler = replaceFunctions[f.name];
		}
	};

	return popped;
};

// put the original formatters back where they belong
var unstripHTML = function(stripped, formatter) {
	for (var i = 0; i < formatter.formatters.length; i++) {
		var f = formatter.formatters[i];
		if (stripped[f.name]) {
			f.handler = stripped[f.name];
		}
	};
};

})(jQuery);
//}}}
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
/***
|''Name''|smmTableOfContentPlugin|
|''Description''|extends smmNestedSortablePlugin to provide some custom behaviours in the form of a new plugin, smmTableOfContent plugin.|
|''Authors''|Simon McManus and Jon Robson|
|''Version''|0.2.0dev|
|''Requires''|smmNestedSortable|
|''Status''|stable|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|

!Usage 

To use this plugin add the following to a tiddler {{{<<smmTableOfContent>>}}}

***/

//{{{
(function($) {
var macro = config.macros.smmTableOfContent = merge(config.macros.smmNestedSortable, {
	'editTemplate': DEFAULT_EDIT_TEMPLATE, 
	'viewTemplate': DEFAULT_VIEW_TEMPLATE,
	'dragToolTip': 'Drag and drop to re-arrange sections in the table of content.',
	'deleteText': 'remove',
	'noDocSelectedText': 'Document is empty.',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		setStylesheet(store.getRecursiveTiddlerText("smmTableOfContentPlugin##StyleSheet"), "smmTableOfContentPlugin");
		this.refresh(place,macroName,params,wikifier,paramString,tiddler);
	},
	renderItem: function(item, ul, label) {
		var li = createTiddlyElement(ul, "li", item.title, "toc-item");
		var tiddler = store.getTiddler(item.title);
		if(tiddler){
			if(tiddler.fields.tt_status == "Complete")
				var sectionClass = "completed"; 
		} else {
			var sectionClass = "";
		}
		var exists = (store.tiddlerExists(item.title)) ? "" : "sectionNotExist";

		var classes = "sectionHeading toc-sort-handle " + sectionClass + " " + macro.strip(item.title) + "_div " + exists;
		var sectionDiv = createTiddlyElement(li, "div", item.title+"_div", classes);
		sectionDiv.title = macro.dragToolTip;
		var isClick;
		// clicking displays the tiddler - make sure we distinguish between drag and drop and a click
		$(sectionDiv).mousedown(function(ev) {
			isClick = false;
			var el = ev.target;
			var id = $(el).attr("id");
			var title = id.replace("_div", "")
			window.setTimeout(function() {
				if(isClick && id) {
					if(config.options.chkOpenEditView == true) {
						story.displayTiddler(el, title, macro.editTemplate);
					} else {
						story.displayTiddler(el, title, macro.viewTemplate);
					}
				}
			}, 300);
		}).mouseup(function(ev) {
			isClick = true;
		}).hover( 
			function() { 
				$(this).children('a').css('opacity', '1');
			},  
			function() {                  
				$(this).children().css('opacity', '0');
			} 
		);
		createTiddlyText(sectionDiv, label.join(".") +"  :  " + item.title);
		var a = createTiddlyElement(sectionDiv, "a", null, 'button deleteButton', macro.deleteText);    
		$(a).css('opacity', '0');
		$(a).click(function() {
			$(this).parent().parent().fadeOut('fast', function() {
				// here we should check for child element and put them in place of the item being removed.
				$(this).remove();
				macro.specChanged();
			});
			return false;
		});
		return li;
	}	
});
})(jQuery);


/***
!StyleSheet

.sectionHeading { width:100%;}
.sort-handle-edit { border:1px solid #C7C7C7; background:white; padding:1em; margin-bottom:1em;}
.sort-handle-edit .button { border:1px solid #C7C7C7;  background:white !important; color:black !important;}
ul { margin:0em; }
html body a.deleteButton { cursor:pointer; float:right; position:absolute; right:1em; border:0em; color:[[ColorPalette::Foreground]];}
.sectionNotExist { font-style:italic;}
#mainMenu .ui-sortable li { border: 2px solid [[ColorPalette::Background]];}
.ui-sortable li{
	border:2px solid [[ColorPalette::TertiaryLight]];
	list-style:none;
	margin-left: 2px;
	margin-top: 2px;	
}

.toc-item {
	cursor: move;
}

.ui-sortable li:hover, #mainMenu .ui-sortable li:hover  {border:2px dashed #fff; cursor:move;}
ul.sortable-title li:hover {-moz-border-radius-topleft:0.9em;-webkit-border-top-left-radius : 0.9em;-moz-border-radius-topright:0.9em;-webkit-border-top-right-radius : 0.9em;}
html .placeholder { cursor:move; border-color:2px dashed [[ColorPalette::PrimaryMid]]; color:#eee; background: [[ColorPalette::TertiaryLight]] }

!(end of StyleSheet)

***/

//}}}
TiddlyDocs is designed to help you and your team collaborate on large documents.

A document can take several people to write, so TiddlyDocs lets you break it into sections and spread the bits out across your team.

TiddlyDocs is being built by [[Osmosoft|http://osmosoft.com]].
<!--{{{-->
<link rel="shortcut icon" href="/recipes/tiddlydocs_public/tiddlers/favicon.ico" />
<link href="/bags/tiddlydocs_public/tiddlers.atom" rel="alternate"
	type="application/atom+xml" title="tiddlydocs's public feed" />
<!--}}}-->
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
/***
|''Name''|BinaryTiddlersPlugin|
|''Description''|renders base64-encoded binary tiddlers as images or links|
|''Author''|FND|
|''Version''|0.3.2|
|''Status''|@@beta@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/BinaryTiddlersPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5|
!Code
***/
//{{{
(function($) {

"use strict";

var ctfield = "server.content-type";

var plugin = config.extensions.BinaryTiddlersPlugin = {
	isWikiText: function(tiddler) {
		var ctype = tiddler.fields[ctfield];
		if(ctype) {
			if (ctype === 'text/x-tiddlywiki') {
				return true;
			}
			return !this.isBinary(tiddler) && !this.isTextual(ctype);
		} else {
			return true;
		}
	},
	// NB: pseudo-binaries are considered non-binary here
	isBinary: function(tiddler) {
		var ctype = tiddler.fields[ctfield];
		return ctype ? !this.isTextual(ctype) : false;
	},
	isTextual: function(ctype) {
		return ctype.indexOf("text/") === 0
			|| this.endsWith(ctype, "+xml")
			|| ctype === 'application/json'
			|| ctype === 'application/javascript';
	},
	endsWith: function(str, suffix) {
		return str.length >= suffix.length &&
			str.substr(str.length - suffix.length) === suffix;
	},
	isLink: function(tiddler) {
		return this.isBinary(tiddler) && tiddler.text.indexOf("<html>") !== -1;
	}
};

// Disable edit for linked tiddlers (for now)
// This will be changed to a GET then PUT
config.commands.editTiddler.isEnabled = function(tiddler) {
    var existingTest = config.commands.editTiddler.isEnabled;
    if (existingTest) {
        return existingTest && !plugin.isLink(tiddler);
    } else {
        return !plugin.isLink(tiddler);
    }
};

// hijack text viewer to add special handling for binary tiddlers
var _view = config.macros.view.views.wikified;
config.macros.view.views.wikified = function(value, place, params, wikifier,
		paramString, tiddler) {
	var ctype = tiddler.fields["server.content-type"];
	if(params[0] === "text" && ctype && ctype !== 'text/x-tiddlywiki' &&
			!tiddler.tags.contains("systemConfig") && !plugin.isLink(tiddler)) {
		var el;
		if(plugin.isBinary(tiddler)) {
			var uri = "data:%0;base64,%1".format([ctype, tiddler.text]); // TODO: fallback for legacy browsers
			if(ctype.indexOf("image/") === 0) {
				el = $("<img />").attr("alt", tiddler.title).attr("src", uri);
			} else {
				el = $("<a />").attr("href", uri).text(tiddler.title);
			}
		} else {
			el = $("<pre />").text(tiddler.text);
		}
		el.appendTo(place);
	} else {
		_view.apply(this, arguments);
	}
};

// hijack edit macro to disable editing of binary tiddlers' body
var _editHandler = config.macros.edit.handler;
config.macros.edit.handler = function(place, macroName, params, wikifier,
		paramString, tiddler) {
	if(params[0] === "text" && plugin.isBinary(tiddler)) {
		return false;
	} else {
		_editHandler.apply(this, arguments);
	}
};

// hijack autoLinkWikiWords to ignore binary tiddlers
var _autoLink = Tiddler.prototype.autoLinkWikiWords;
Tiddler.prototype.autoLinkWikiWords = function() {
	return plugin.isWikiText(this) ? _autoLink.apply(this, arguments) : false;
};

}(jQuery));
//}}}
/***
|''Name''|ImageMacroPlugin|
|''Version''|0.9.4|
|''Description''|Allows the rendering of svg images in a TiddlyWiki|
|''Author''|Osmosoft|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Notes''|Currently only works in modern browsers (not IE)|
|''Requires''|BinaryTiddlersPlugin|
!Usage
{{{<<image SVG>>}}} will render the text of the tiddler with title SVG as an SVG image (but not in ie where it will fail silently)
!!Parameters
width/height: specify width/height parameters
link: make the image link to a given location
tiddlyLink: link to a tiddler

!Notes
Binary tiddlers in TiddlyWeb when passed through the wikifier will be shown as images.
eg. {{{<<view text wikified>>}}} on a binary tiddler will show the image.
{{{<<view fieldname image>>}}}
will render the value of the tiddler field 'fieldname' as an image. This field can contain a tid
{{{<<image SiteIcon>>}}}
will create an image tag where the tiddler has content type beginning image and not ending +xml
will attempt to create svg object in other scenarios
{{{<<image /photos/x.jpg>>}}}
will create an image tag with src /photos/x.jpg as long as there is not a tiddler called /photos/x.jpg in 
which case it will render that tiddler as an image. Note for the case of svg files it will attempt to render as an svg if possible via the image
tag. It doesn't embed the svg in the dom for security reasons as svg code can contain javascript.
!Code
***/
//{{{
(function($) {

var macro = config.macros.image = {
	shim: "/bags/common/tiddlers/shim",
	ieVersion: config.browser.isIE ? parseInt(config.browser.ieVersion[1], 10) : false,
	svgns: "http://www.w3.org/2000/svg",
	xlinkns: "http://www.w3.org/1999/xlink", 
	svgAvailable: document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"),
	_fixPrefix: 1,
	_external_cache: {},
	_image_tag_cache: {},
	_image_dimensions: {},
	locale: {
		badImage: "This image cannot be displayed."
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler){
		var imageSource = params[0];
		// collect named arguments
		var args = macro.getArguments(paramString, params);
		this.renderImage(place, imageSource, args);
	},
	init: function() {
		var startupImages = store.getTaggedTiddlers("systemImage");
		var place = $("<div />").attr("id", "systemImageArea").appendTo("body").hide()[0];
		for(var i = 0; i < startupImages.length; i++) {
			var image = startupImages[i];
			macro.renderImage(place, image.title, { idPrefix: "" });
		}
		var data = new Image();
		data.onload = function() {
			// note ie 8 only supports data uris up to 32k so cannot be relied on
			macro.supportsDataUris = this.width != 1 || this.height != 1 ? false : true;
			macro.supportsDataUris = macro.ieVersion && macro.ieVersion < 9 ? false : macro.supportsDataUris;
		};
		data.onerror = data.onload;
		data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
	},
	refreshImage: function(src) {
		var elements = macro._image_tag_cache[src] ? macro._image_tag_cache[src] : [];
		if(macro._image_dimensions[src]) {
			macro._image_dimensions[src] = false;
		}
		for(var i = 0; i < elements.length; i++) {
			var el = $(elements[i]);
			var newSrc = "%0?nocache=%1".format(src, Math.random());
			el.attr("src", newSrc); // force reload
		}
	},
	isBinaryImageType: function(contentType) {
		return (contentType && contentType.indexOf("image") === 0 &&
			contentType.indexOf("+xml") != contentType.length - 4) ? true : false;
	},
	isImageTiddler: function(tiddler) {
		return macro.isSVGTiddler(tiddler) || macro.isBinaryImageTiddler(tiddler);
	},
	isSVGTiddler: function(tiddler) {
		var type = tiddler ? tiddler.fields['server.content-type'] : false;
		return type == "image/svg+xml";
	},
	isBinaryImageTiddler: function(tiddler) {
		return macro.isBinaryImageType(tiddler.fields['server.content-type']);
	},
	renderImage: function(place, imageSource, options) {
		var imageTiddler = store.getTiddler(imageSource);
		var container;
		var classes = ["image"];
		if(options.link) {
			classes = classes.concat(["imageLink", "externalLink"]);
			container = $("<a />").attr("href", options.link).appendTo(place)[0];
		} else if(options.tiddlyLink) {
			classes.push("imageLink");
			container = createTiddlyLink(place, options.tiddlyLink, false);
		} else {
			container = $("<span />").appendTo(place)[0];
		}
		$(container).addClass(classes.join(" "));

		options = options ? options : {};
		if(imageTiddler && macro.isBinaryImageTiddler(imageTiddler)) { // handle the case where we have an image url
			return macro._renderBinaryImageTiddler(container, imageTiddler, options);
		} else if(imageTiddler){ // handle the case where we have a tiddler
			return macro._renderSVGTiddler(container, imageTiddler, options);
		} else { // we have a string representing a url
			return macro._renderBinaryImageUrl(container, imageSource, options);
		}
	},
	_renderAlternateText: function(container, options) {
		var img;
		var src = options.src || "";
		if(options.width && options.height) {
			img = $("<img />").attr("src", src).addClass("svgImageText").attr("width", options.width).
				attr("height", options.height).appendTo(container);
		}
		var alt = options.alt;
		if(img && alt) {
			img.attr("alt", alt).attr("title", alt);
		} else if(alt) {
			$(container).addClass("svgImageText").text(alt);
		}
		macro._image_tag_cache[src] = img;
	},
	_renderSVGTiddler: function(place, tiddler, options) {
		if(!options) {
			options = {};
		}
		merge(options, { tiddler: tiddler, fix: true});

		if(macro.svgAvailable) {
			this._importSVG(place, options); // display the svg
		} else if(options.altImage) {
			var image = options.altImage;
			delete options.altImage;
			this._renderBinaryImageUrl(place, image, options);
		} else {
			this._renderAlternateText(place, options); // instead of showing the image show the alternate text.
		}
	},
	_renderBinaryImageTiddler: function(place, tiddler, options) {
		var resourceURI;
		var fields = tiddler.fields;
		if(fields["server.type"] == "tiddlyweb") { // construct an accurate url for the resource
			resourceURI = "%0/%1/tiddlers/%2".format(config.defaultCustomFields["server.host"],
				fields["server.workspace"], encodeURI(fields["server.title"]));
		} else { // guess the url for the resource
			resourceURI = tiddler.title;
		}
		var ctype = fields["server.content-type"] || tiddler.type;
		var text = tiddler.text;
		if(macro.supportsDataUris && ctype && text.indexOf("<html") == -1) {
			var uri = "data:%0;base64,%1".format(ctype, text);
			options.src = resourceURI;
			return macro._renderBinaryImageUrl(place, uri, options);
		} else if(options.src) {
			return macro._renderBinaryImageUrl(place, options.src, options);
		} else {
			return macro._renderBinaryImageUrl(place, resourceURI, options);
		}
	},
	_renderImageTag: function(container, src, width, height, options) {
		var img;
		img = $("<img />").appendTo(container);
		if(height) {
			img.attr("height", height);
		}
		if(width) {
			img.attr("width", width);
		}
		if(macro.ieVersion && macro.ieVersion < 7 && macro.shim && options.ie6png) {
			$(img).css({width: userW, height: userH,
					filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%0', sizingMethod='scale')".format(src)
				}).attr("src", macro.shim);
		} else {
			img.attr("src", src);
		}
		if(!macro._image_tag_cache[options.srcUrl]) {
			macro._image_tag_cache[options.srcUrl] = [];
		}
		img = $(img).addClass(options.imageClass)[0];
		macro._image_tag_cache[options.srcUrl].push(img);
		return img;
	},
	_getDimensions: function(realDimensions, reqDimensions, preserve) {
		var w = realDimensions.width;
		var h = realDimensions.height;
		var reqh = reqDimensions.height;
		var reqw = reqDimensions.width;
		var finalw = w, finalh = h;
		var ratiow = reqw / w, ratioh = reqh / h;
		var scaledw = ratioh * w;
		var scaledh = ratiow * h;
		if(!reqw && reqh) {
			finalw = scaledw;
			finalh = reqh;
		} else if(reqw && !reqh) {
			finalw = reqw;
			finalh = scaledh;
		} else if(reqh && reqw) {
			var preserveWidth = w > h ? true : false;
			if(preserve) {
				if(preserveWidth && scaledh < reqh) {
					finalh = scaledh;
					finalw = reqw;
				} else {
					finalh = reqh;
					finalw = scaledw;
				}
			} else {
				finalw = reqw;
				finalh = reqh;
			}
		}
		return { width: parseInt(finalw, 10), height: parseInt(finalh, 10) };
	},
	_renderBinaryImageUrl: function(container, src, options) {
		var srcUrl = options.src ? options.src : src;
		srcUrl = srcUrl.indexOf("/") === -1 ? "/%0".format(srcUrl) : srcUrl; // for IE. 
		var image_dimensions = macro._image_dimensions[srcUrl];
		var image = new Image(); // due to weird scaling issues where you use just a width or just a height
		var createImageTag = function(dimensions, error) {
			if(error) {
				var altImage = options.altImage;
				if(altImage) {
					delete options.altImage;
					macro._renderBinaryImageUrl(container, altImage, options);
				} else {
					options.src = src;
					macro._renderAlternateText(container, options);
				}
			} else {
				var dim = macro._getDimensions(dimensions, { 
					width: options.width, height: options.height }, options.preserveAspectRatio);
				options.srcUrl = srcUrl;
				macro._renderImageTag(container, src, dim.width, dim.height, options);
			}
		};

		if(!image_dimensions) {
			image.onload = function() {
				var dimensions = { width: image.width, height: image.height};
				macro._image_dimensions[srcUrl] = dimensions;
				createImageTag(dimensions);
			};
			image.onerror = function() {
				createImageTag(null, true);
			};
			image.src = src;
		} else {
			createImageTag(image_dimensions);
		}
	},
	_generateIdPrefix: function(){
		return "twsvgfix_" + (this._fixPrefix++).toString() + "_";
	},
	_fixSVG: function(childNodes, idPrefix) {
		var urlPattern = /url\(\#([^\)]*)\)*/ig;
		var fixes = [
		{ attr: "id", pattern: /^(.*)$/ig },
		{ attr: "href", namespace: macro.xlinkns, pattern: /^#(.*)$/ig }
		];
		var url_fixes = ["filter", "fill", "mask", "stroke", "style"];
		for(var i = 0; i < url_fixes.length; i++) {
			fixes.push({ attr: url_fixes[i], pattern: urlPattern });
		}
		for(var t = 0; t < childNodes.length; t++) {
			var node = childNodes[t];
			for(var a = 0; a < fixes.length; a++) {
				var fix = fixes[a];
				var attr = fix.attr;
				var ns = fix.namespace || "";
				if(node.hasAttributeNS && node.hasAttributeNS(ns, attr)) {
					var v = node.getAttributeNS(ns, attr);
					fix.pattern.lastIndex = 0;
					var match = fix.pattern.exec(v);
					if(match) {
						// Make sure replacement string doesn't contain any single dollar signs
						var toReplace = match[1];
						if(toReplace.indexOf(idPrefix) !== 0 && toReplace.indexOf("twglobal_") !== 0) {
							var replacement = (idPrefix + toReplace).replace("$", "$$$$"); 
							v = v.replace(match[1], replacement);
						}
						node.setAttributeNS(ns, attr,v);
					}
				}
			}
			var children = node.childNodes;
			if(children.length > 0) {
				this._fixSVG(children, idPrefix);
			}
		}
	},
	_importSVG: function(place, options){
		options = options ? options : {};
		var svgDoc, tiddlerText = options.tiddler.text;
		if (window.DOMParser) {
			svgDoc = new DOMParser().parseFromString(tiddlerText, "application/xml").documentElement;
			var idPrefix = options.idPrefix || this._generateIdPrefix();
			this._fixSVG([svgDoc], idPrefix);
			var el = document.importNode(svgDoc, true);
			var svgHolder = document.createElementNS(macro.svgns,"svg");
			var width = options.width;
			var height = options.height;
			if(width || height) {
				if(width && height) { // set view box of containing svg element based on the svg viewbox and width and height.
					var viewBox = el.getAttribute("viewBox");
					var topLeft = "0 0";
					if(viewBox) {
						topLeft = viewBox.replace(/([0-9]*) +([0-9]*) +([0-9]*) +([0-9]*) */gi,"$1 $2");
					}
					svgHolder.setAttributeNS(macro.svgns, "viewBox", "0 0 %0 %1".format(width, height));
				} else {
					if(!width) {
						width = el.getAttribute("width");
					}
					if(!height) {
						height = el.getAttribute("height");
					}
				}
				svgHolder.setAttribute("width", width);
				svgHolder.setAttribute("height", height);

				el.setAttribute("width", "100%");
				el.setAttribute("height", "100%");
				svgHolder.setAttribute("class", "svgImage svgIcon %0".format(options.imageClass || ""));
				svgHolder.appendChild(el);
				place.appendChild(svgHolder);
			}
			else {
				var existing = el.className ? el.className.baseVal : "";
				el.setAttribute("class","svgImage %0".format(existing));
				place.appendChild(el);
			}
			// if a tiddler attribute is set this is read as a link
			$("[tiddler], [tiddlyLink]", place).attr("refresh", "link").click(function(ev) {
				var tiddler = $(ev.target).attr("tiddlyLink");
				if(tiddler) {
					story.displayTiddler(ev.target, tiddler);
				}
			});
		}
	},
	getArguments: function(paramString, params) {
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var options = {};
		for(var id in args) {
			if(true) {
				var p = args[id];
				if(id == "def") {
					options[id] = p;
				} else {
					options[id] = p[0];
				}
			}
		}
		var width = isNaN(params[1]) ? false : parseInt(params[1], 10);
		var height = isNaN(params[2]) ? false : parseInt(params[2], 10);

		options.width = macro.lookupArgument(options, "width", width);
		options.height = macro.lookupArgument(options, "height", height);
		options.preserveAspectRatio = args.preserveAspectRatio && 
			args.preserveAspectRatio[0] == "yes" ? true : false;
		options.tiddlyLink = macro.lookupArgument(options, "tiddlyLink", false);
		options.link = macro.lookupArgument(options, "link", false);
		return options;
	},
	lookupArgument: function(args, id, ifEmpty) {
		return args[id] ? args[id] : ifEmpty;
	}
};

// update views
var _oldwikifiedview = config.macros.view.views.wikified;
// update wikifier to check tiddler type before rendering
merge(config.macros.view.views, {
	wikified: function(value, place, params, wikifier, paramString, tiddler) {
		if(macro.isImageTiddler(tiddler) && params[0] == "text") {
			var newplace = $("<div />").addClass("wikifiedImage").appendTo(place)[0];
			macro.renderImage(newplace, tiddler.title, { alt: macro.locale.badImage });
		} else {
			_oldwikifiedview.apply(this, arguments);
		}
	},
	image: function(value, place, params, wikifier, paramString, tiddler) {
		// a field can point to another tiddler whereas text is the current tiddler.
		var title = params[0] == "text" ? tiddler.title : value;
		var args = macro.getArguments(paramString, params);
		macro.renderImage(place, title, args);
	}
});
config.shadowTiddlers.StyleSheetImageMacro = [".wikifiedImage svg, .wikifiedImage .image { width: 80%; }",
	".svgImageText { background-color:[[ColorPalette::Error]]; color:#ddd; display: inline-block; }",
	"span.svgImageText { display: inline-block; overflow: hidden; }"
].join("");
store.addNotification("StyleSheetImageMacro", refreshStyles);

})(jQuery);
//}}}
/*{{{*/
Background: #f6e6df
Foreground: #1f1008
PrimaryPale: #e0aa91
PrimaryLight: #cc7249
PrimaryMid: #914928
PrimaryDark: #000000
SecondaryPale: #b291e0
SecondaryLight: #7f49cc
SecondaryMid: #532891
SecondaryDark: #000000
TertiaryPale: #91e0a2
TertiaryLight: #49cc65
TertiaryMid: #28913e
TertiaryDark: #000000
/*}}}*/
Unless you're delighted with the default theme you can make some quick changes by generating a new random color palette, hit this button to cycle through some alternatives.

<<RandomColorPaletteButton saturation_pale:0.67 saturation_light:0.53
saturation_mid:0.43 saturation_dark:0.06 pale:0.99 light:0.85 mid:0.5 dark:0.31>>

You can also change the look and feel completely by installing a new theme. To do this, find one you like in the @themes space, note down the name, and include it in this space by going to the space menu. You can reach the space menu by clicking on the blue and pink circle at the top-right of the page and chooshing "THIS SPACE". Here are a few to check out:
* @pip
* @caspian-ii
* @basalt
* @simplicity
* @cheesecake
* @jelly-doughnut

(//Note that if you are using a custom TiddlySpace install, these themes may not be present.//)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   version="1.1"
   width="14pt"
   height="14pt"
   viewBox="918 510 14 14"
   id="svg3070">
  <metadata
     id="metadata3089">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <defs
     id="defs3072">
    <radialGradient
       cx="0"
       cy="0"
       r="1"
       id="Gradient"
       gradientUnits="userSpaceOnUse">
      <stop
         id="stop3075"
         style="stop-color:#ffffff;stop-opacity:1"
         offset="0" />
      <stop
         id="stop3077"
         style="stop-color:#2b2b2b;stop-opacity:1"
         offset="1" />
    </radialGradient>
    <radialGradient
       id="Obj_Gradient"
       xlink:href="#Gradient"
       gradientTransform="matrix(11.473944,0,0,11.473944,922.3752,513.7837)" />
  </defs>
  <g
     id="g3080"
     style="fill:none;stroke:none">
    <g
       id="g3082">
      <path
         d="m 929.6952,512.9018 c -2.5384,-2.53843 -6.654,-2.53843 -9.1924,0 -2.5384,2.5384 -2.5384,6.654 0,9.19238 2.5384,2.53839 6.654,2.53839 9.1924,0 2.5384,-2.53838 2.5384,-6.65398 0,-9.19238 m -4.5962,2.8407 2.07733,-2.07734 1.75547,1.75549 -2.0773,2.07735 2.0773,2.07732 -1.75547,1.75548 -2.07733,-2.07732 -2.07733,2.07732 -1.75547,-1.75548 2.0773,-2.07732 -2.0773,-2.07735 1.75547,-1.75549 z"
         id="path3084"
         style="fill:url(#Obj_Gradient)" />
      <path
         d="m 927.61447,515.38354 a 4.51205,4.2590378 0 1 1 -9.0241,0 4.51205,4.2590378 0 1 1 9.0241,0 z"
         transform="matrix(1.0218069,0,0,1.0462046,-18.063694,-21.648443)"
         id="path2394"
         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
    </g>
  </g>
</svg>
iVBORw0KGgoAAAANSUhEUgAAAC0AAAAtCAYAAAA6GuKaAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAEZ0FNQQAAsY58+1GTAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwAACBpJREFUeNrtWXtMW+cVP9+1r40dwHZ4+RkegULI0hI1qzqVrHFa7a+mSxq1atU8iNRK09ZN3XtJK41oTRtN+yPVpHWTOmUeaH901bKu/+yPdiYNWjo1bR48mgLhEcAYA8EYQ/CD++18n7nXBoyvHQj/bEe63HvN9/h95zvn951zLsD/ZXOErHeA1/7s3UOJ9BQ+1gIlDThiBT7npTSZxGuEAmkHkIZoXHj/7An34KaDbj7vNUe00ksEyHF8rcNLm+MQ7bjAP+pc0NrsdsfvK+jm97z5sSj8nFL6Kr7mLx+JUHNhARjy9ESn04NW1EA0GgNJWoTZ8DzMzc3D4uLiysn9QOlp0SW8mwv4rEG/3uLdJxF6Hijffi5arVaylhYLDpsVCgryQaPRrNkfFwrBYAhGfD4YG5/g7ykg/hkj5OVfH3GPbBjok60f/4JQ8ivZDBjY6qpyweWwgyAIOZtXJBKF4VEf9A/eVsAzrROJHH3juPujdYM+1ep9B0f+jvzudNilupoqIZNWs5XZcBg6ur7id2VHCHn2rSPu9zP102QLmAgCfXDnDlJV4SL3ot10otfpUAk2tHsJgjMhWYvPNB5uutr+N09PzqBPtXzcjLefyObw9YZdQknx1o3nXEKgaKsFRFELk1PT7CcBgT+991DTh5cueAJZg2bci0v2sAE0gkbag4DNZtN9PTDMpkJ+nw7OsJsOr/1PvNDkafurJ7qyrZCO1ijQFtnpdtbX3nfAslRXVYCtrET2trpIBN5K124V6EhUeoV1YM8upz05yCbJjtoa0Ot1S7jpK3zXV4h2pZajEfo9bjeiltZWV2XN44voTKNjk+AP3MEtDkMsFud0aDHlQ1mpBbY5StE31BlHFEWoe6AGrnd0Lf0i/RL/HFjTph/79rHv4vqeS2xVOSmyWLIC3Dfgg08u34Ch4XFkgTAsIA8z0OxEnJmdA59/irdhp2SRpVB1vPwtRpiaDsLCQoR56vbHnmn6S/sFz5205kEpeZH/qNHQcqdDdXAqUbj8WTd8fr2Hg5TFoNdCUUEev8vC/v/F9V7492ddfFfUpKZSOXg1SCc/Tqvpn7V6nbiCswyzw1ZGykrVbfnTK1/C7dEEKwk4cmO9A47ur4dDj1bD/oe2wbd2l8MjD1hBqxFgMBACdviFZud5LOK0lXC6W0sMhjwYn5jku4VSiUzyO5lJFE2LVDoo27jdas3KJFIB/+BAAzz/zVqwb93C32UpMRng0Deq4UcHHwa9mNDR8OgE9A35VOewJhVXhBa3b5V5SFTYzlWPx7PJVKDqdDe6+xXArz69G2rsme2/sqwQvn9gN4iaxJQd3QPLTCqd2K1lSZqj8Pgq0BhZNrK70WBQDYKYpuQJ96JJbLeZs3JYBvzxXU7Fxod9ExnbMxPB0zihVKB70jkit/yCfKPq5IHJaeW5cacjJx5mdi/LeGBatX1BwRY5JnGmA13Mgxi9XnUgxsMyS1jNxpxAMxuXWWV6Jqza3mhQMjfXmieioFGP4GTTMOq0y5wuW2H9+JZnQX06UacEhWuClhbVB2IRGZP5aBwnpjmDZv0STqyuoHRKTP1lIZFVRFQHspgT6eHdSBz8wfmcAE/M3OX9+DimfNX26ZSYBE2Bp/VzdxdUByotTtJbe9dobml4d7I9i0nUJBpTItNgGspLgJ6dDavamstRopjIJQRxayyYFeCB8RBc7BhRTMxlVz912em5JIOrNU3IFdk55uYzb7kGbfHB+qolZ6Jw7h9XVYEzwL/98CrElrZ7V32lsvBMGTwrPSQMgRV7Vmp6ES4m+XNSPWCvtPNwMxX4e5d6YHyFjU/NLsCFy33w9gdfQCS2qOxUdblddY5QaDalViINrYqntRK0xwTwIxdYx/wBnkWoyaMP70ANUH5CMuAXO0f4xXiY0RpjCdnpUk3rkd11mCirU+WwLxmfYDb90aoor+0DT3zv4WNfw383xOJxzNlMYDQaVJNSF2pbrxdh8k5I8YU4msBdBBxP8XxmCg27tsNDO6owvlGnujhi6LrZK4957c0j+0+nzVxwOW+jITUlorhBKC7KLgmoqXRAVbmNa3wcM5dgaG5Z5lJSbIZyZ6mqDafK6JifA1+Kizxrpltvvui+drLlX224cftmZkK8fJVtjsics8JVxq/1CgN7a+C2QnViTPhTxsRWoOSnrB97/vKrXl7C2mzpvTWIOxVLaJmS3zefcAczgj5zzH2FADmXiDFicLOnd1MBBybv8DqfnGuIeXBGtYTAncYJJ/HWyZ79SH99/YObApjV9G50dieLkpScaH7OHc6qwtTm8Uh7DzVdwiCWZeZGVvVhGY3lPhZtgjjH59c6U5yPvHHmqNuTVbFGccpj7k5BIi/gI19pT18/v1LryhslzOGvXOtQ7BjPv1bRAafvqWr6yd89/Y2Hm3pZJZMtkFU2AxNTYDYX8orneoWddp3dN5EphlKUQd/VOYWXM30ZyCqCf93jfVIS6HlYSnnYoVKxzQmsqG4w5OUMlgEcHRtHXxlYxk7Ixz88c+SJcxvyJUCui4iS9A4l5KnUWWylxcRus8FWi0k1qA+H52DE50fnDiwHy7+9kGeRudqzKg/nqqVTLd6X0K1fS/32IlelthgMhCXGLM9kGQcL4Fk8PDe/wIOfNCFvHBniN4zW0rHEhoHmhUqvVxsdhecxWDpOKDyZcyGdaRZIK8Zvfzh71N13D/3XJ9xsqHSQFXuWaicVcmavpHGYFbEkAxf5HwGENm0cPsVTbgH+l+S/c0hKbtisAOEAAAAASUVORK5CYII=
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100%" width="100%" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40"><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata><defs><linearGradient id="lG3826" x1="7.0996" gradientUnits="userSpaceOnUse" y1="18.829" gradientTransform="matrix(1.5858347,0,0,1.8078238,1098.1851,351.13716)" x2="1.5461" y2="-0.95166"><stop stop-color="#000" offset="0"/><stop stop-color="#9c9b99" offset="1"/></linearGradient><linearGradient id="lG3828" y2="372.44" gradientUnits="userSpaceOnUse" y1="375.7" x2="1111.7" x1="1097.7"><stop style="stop-color:#ac9393;" offset="0"/><stop style="stop-color:#c8b7b7;" offset="1"/></linearGradient></defs><g transform="translate(-1080.9375,-357.3329)"><path style="stroke-width:0;stroke-miterlimit:4;fill:url(#lG3826);" d="m1080.9,357.32,39.996-0.0426-0.01,40.008c-15.507-25.519-15.36-25.95-39.988-39.965z"/><path style="stroke-dashoffset:0;stroke:#7aa3be;stroke-linecap:round;stroke-miterlimit:4;stroke-width:1.49999988;fill:#c1e6fd;" d="m1091.9,363.55c6.5716-6.4925,16.576-7.3925,23.147-0.90003,6.5717,6.4925,6.5717,17.019,0,23.511-4.4424-8.6113-12.288-15.713-23.147-22.611z"/><path style="stroke-dashoffset:0;stroke:#ce81b0;stroke-linecap:round;stroke-miterlimit:4;stroke-width:1.5;fill:#f4c4e2;" d="m1110.2,367.62c3.217,3.2168,3.217,8.4323,0,11.649-3.8194-4.2357-8.3307-8.1824-11.649-11.649,3.217-3.2168,8.4325-3.2168,11.649-0.00002z"/><path style="stroke-linejoin:bevel;stroke:#000000;stroke-linecap:round;stroke-dasharray:none;stroke-miterlimit:4;stroke-width:0.80000001;fill:url(#lG3828);" d="m1081,357.34c18.79,6.4752,32.53,16.56,39.894,39.892-11.19-17.028-14.878-19.19-27.352-14.96,6.2984-12.098,3.9371-13.19-12.542-24.932z"/></g></svg>
{"format": {"name": "smmNestedSortablesJSONSpec", "majorVersion": "0", "minorVersion": "1"}, "content": [{"title": "Introduction to TiddlyDocs", "children": []}, {"title": "Using TiddlyDocs outside TiddlySpace", "children": []}, {"title": "Use TiddlyDocs on TiddlySpace", "children": []}, {"title": "Getting started with TiddlyDocs", "children": []}]}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="506 234 68 36" width="30" height="30"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2010-09-16 14:51Z</dc:date><!-- Produced by OmniGraffle Professional 5.2.3 --></metadata><defs></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><rect width="1118" height="783"/><g><path d="M 538.68195 244.31807 C 540.43927 246.07547 540.43927 248.9247 538.68195 250.68204 C 536.92456 252.4394 534.07532 252.4394 532.318 250.68204 C 530.5606 248.9247 530.5606 246.07547 532.318 244.31807 C 534.07532 242.56075 536.92456 242.56075 538.68195 244.31807 M 511.12607 257.99356 C 511.26108 258.13019 511.39728 258.26608 511.53473 258.40121 C 527.2556 273.86606 552.74414 273.86606 568.46515 258.40121 C 568.60248 258.26617 568.73853 258.13037 568.87354 257.9938 C 568.8736 257.99374 568.8736 257.99371 568.8736 257.99362 C 568.87366 257.99371 568.87366 257.9938 568.87372 257.9939 C 570.72504 256.12051 572.35046 254.11153 573.74994 252 C 573.74994 251.99997 573.74994 251.99994 573.74994 251.99992 C 572.35046 249.8884 570.72504 247.87938 568.87372 246.00606 C 568.87366 246.00613 568.87366 246.00621 568.8736 246.00627 C 568.73865 245.86966 568.60254 245.73383 568.46515 245.5987 C 552.74414 230.13387 527.2556 230.13387 511.53473 245.5987 C 511.39728 245.73383 511.26108 245.86974 511.12613 246.00635 C 511.126 246.00624 511.126 246.00616 511.12595 246.00606 C 509.2748 247.87938 507.64954 249.88837 506.24994 251.9998 L 506.24994 251.99983 C 506.24994 251.9999 506.25 251.99992 506.25 251.99997 C 506.25 252 506.24994 252.00005 506.24994 252.00009 L 506.24994 252.00012 C 507.64954 254.11157 509.2748 256.12051 511.12595 257.9939 C 511.126 257.99377 511.126 257.99365 511.12607 257.99359 Z M 515.44916 252 C 515.8548 251.55469 516.27502 251.11778 516.71014 250.68985 C 522.16632 245.32257 529.06055 242.23206 536.17273 241.41824 C 534.6662 241.96199 533.2525 242.83762 532.04498 244.04512 C 527.65155 248.43852 527.65155 255.56163 532.04498 259.95502 C 533.2522 261.16226 534.6656 262.03778 536.17175 262.58154 C 529.05988 261.76761 522.16608 258.6771 516.71014 253.31009 C 516.2751 252.88219 515.85486 252.44528 515.44922 252 Z M 564.55054 251.99995 C 564.14502 252.44525 563.7248 252.88217 563.28973 253.31009 C 557.83368 258.67712 550.93988 261.76764 543.828 262.58157 C 545.33423 262.03781 546.74756 261.1623 547.9549 259.95502 C 552.34833 255.56163 552.34833 248.43852 547.9549 244.04512 C 546.74744 242.83765 545.33374 241.96202 543.82715 241.41824 C 550.9394 242.23206 557.83356 245.3226 563.28973 250.68985 C 563.7248 251.11775 564.14502 251.55467 564.55054 251.99995 Z M 568.8736 257.99362 C 570.7249 256.12033 572.35028 254.11139 573.74988 252.00002" fill="black" class="glyph"/></g></g></svg>
|Month|SharePrice|
|1|143|
|2|270|
|3|250|
|4|251|
|5|253|
|6|250|
|7|249|
|8|243|
|9|270|
|10|290|
|11|320|
|12|300|
<<newTiddler>>
 <<docPreview>>
<<smmTableOfContent>>
There are a lot of interesting people using ~TiddlySpace that you might like to keep track of and interact with. There are a number of ways of doing this.

If you see a number in the speech bubble in one of your tiddlers, it means that someone is writing about the same thing as you. You can find out what they're saying by clicking on it. Likewise, if you see something interesting in someone else's space, you can respond to it and write up your own thoughts on the subject by clicking "Reply to this tiddler".

Additionally, if you find anyone interesting, or you find an interesting looking space and you'd like to know when it's changed, you can "follow" that space. To do this, simply create a tiddler with the title: {{{@space-name}}} and tag it {{{follow}}}. If you want, you can store some notes about that space in the body of the tiddler.

If you then want to know what happening, simply [[include|How do I include/exclude spaces?]]@docs the @tivity space and then visit your activity stream at [[/activity|/activity]], or just visit the @tapas space directly.

!Not sure who to follow?
Here's a few suggestions:
* @fnd
* @cdent
* @pmario
* @bengillies
* @dickon
/***
|''Name''|TiddlySpaceFollowingPlugin|
|''Version''|0.7.1|
|''Description''|Provides a following macro|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceConfig TiddlySpaceTiddlerIconsPlugin ErrorHandler|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
Tag a tiddler with "follow" to express a list of followers.
Using the {{{<<followTiddlers X>>}}}
will reveal the number of tiddlers with name X in the set of spaces the *current* user viewing your space follows.
{{{<<following jon>>}}} will list all the users following Jon.
{{{<<followers jon>>}}} will list all the followers of jon.
{{{<linkedTiddlers>>}}} will list all tiddlers across TiddlySpace linked to the current tiddler
{{{<linkedTiddlers follow:yes>>}}} will list all tiddlers across TiddlySpace that come from your list of followers
adds spaceLink view type {{{<<view server.bag spaceLink>>}}} creates a link to the space described in server.bag
{{{<<view server.bag spaceLink title>>}}} makes a link to the tiddler with title expressed in the field title in space server.bag
If no name is given eg. {{{<<following>>}}} or {{{<<follow>>}}} it will default the current user.
!StyleSheet
.followTiddlersList li {
	list-style:none;
}

.followButton {
	width: 2em;
}

.followTiddlersList li .siteIcon {
	height:48px;
	width: 48px;
}

#sidebarTabs .followers li a,
.followers .siteIcon,
.followers .siteIcon div {
	display: inline;
}

.followTiddlersList li .externalImage, .followTiddlersList li .image {
	display: inline;
}

.scanResults li {
	list-style: none;
}
!Code
***/
//{{{
(function($) {
var LIMIT_FOLLOWING = 100;

var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace.name;

var shadows = config.shadowTiddlers;
config.annotations.ScanTemplate = "This tiddler is the default template used in the display of tiddlers founding using the tsScan macro. To access attributes use the view macro e.g. {{{<<view title text>>}}}";
shadows.ScanTemplate = "<<view modifier SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view title link>>";
shadows.FollowersTemplate = "<<view server.bag SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view server.bag spaceLink>>";
shadows.FollowingTemplate = "<<view title SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view title spaceLink>>";
shadows.FollowTiddlersBlackList = "";
shadows.FollowTiddlersHeading = "There are tiddlers in spaces you follow using the follow tag which use the title <<view title text>>";
shadows.FollowTiddlersTemplate = ["* <<view server.space SiteIcon width:24 height:24 spaceLink:yes label:no>> ",
	"<<view server.space spaceLink title external:no>> modified by <<view modifier spaceLink>> ",
	"in the <<view server.space spaceLink>> space (<<view modified date>> @ <<view modified date 0hh:0mm>>).\n"].join("");

var name = "StyleSheetFollowing";
shadows[name] = "/*{{{*/\n%0\n/*}}}*/".
	format(store.getTiddlerText(tiddler.title + "##StyleSheet"));
store.addNotification(name, refreshStyles);

// provide support for sucking in tiddlers from the server
tiddlyspace.displayServerTiddler = function(src, title, workspace, callback) {
	var adaptor = store.getTiddlers()[0].getAdaptor();
	var localTitle = tiddlyspace.getLocalTitle(title, workspace);
	var tiddler = new Tiddler(localTitle);
	tiddler.text = "Please wait while this tiddler is retrieved...";
	tiddler.fields.doNotSave = "true";
	store.addTiddler(tiddler);
	src = story.displayTiddler(src || null, tiddler.title);
	tweb.getStatus(function(status) {
		var context = {
			host: tweb.host, // TODO: inherit from source tiddler?
			workspace: workspace,
			headers: { "X-ControlView": "false" }
		};
		var getCallback = function(context, userParams) {
			var tiddler = context.tiddler;
			tiddler.title = localTitle;
			store.addTiddler(tiddler);
			story.refreshTiddler(localTitle, null, true); // overriding existing allows updating
			if(callback) {
				callback(src, tiddler);
			}
		};
		adaptor.getTiddler(title, context, null, getCallback);
	});
};

tiddlyspace.scroller = {
	runHandler: function(title, top, bottom, height) {
		var i;
		var handlers = tiddlyspace.scroller.handlers;
		var tidEl = story.getTiddler(title);
		if(tidEl) {
			var topEl = $(tidEl).offset().top + 20;
			if(top === false || (topEl > top && topEl < bottom)) {
				var h = handlers[title];
				for(i = 0; i < h.length; i++) {
					h[i]();
				}
				tiddlyspace.scroller.clearHandlers(title);
			}
		} else {
			tiddlyspace.scroller.clearHandlers(title);
		}
	},
	clearHandlers: function(title) {
		tiddlyspace.scroller.handlers[title] = [];
	},
	registerIsVisibleEvent: function(title, handler) {
		tiddlyspace.scroller.handlers[title] = tiddlyspace.scroller.handlers[title] || [];
		tiddlyspace.scroller.handlers[title].push(handler);
	},
	init: function() {
		this.handlers = {};
		this.interval = window.setInterval(function() {
			var top = $(window).scrollTop();
			var height = $(window).height();
			var bottom = top + height;
			var title;
			for(title in tiddlyspace.scroller.handlers) {
				if(title) {
					tiddlyspace.scroller.runHandler(title, top, bottom, height);
				}
			}
		}, 2000); // every 2 seconds check scroll position
	}
};
tiddlyspace.scroller.init();

var followMacro = config.macros.followTiddlers = {
	locale: {
		followListHeader: "Here are tiddlers from spaces you follow using the follow tag which use this title.",
		noTiddlersFromFollowers: "None of the spaces you follow contain a tiddler with this name.",
		errorMessage: "There was a problem retrieving tiddlers from the server. Please try again later."
	},
	init: function() {
		followMacro.lookup = {};
	},
	followTag: "follow",
	getHosts: function(callback) {
		tweb.getStatus(function(status) {
			callback(tweb.host, tiddlyspace.getHost(status.server_host, "%0"));
		});
	},
	getBlacklist: function() {
		return store.getTiddlerText("FollowTiddlersBlackList").split("\n");
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var args = paramString.parseParams("anon")[0];
		var containingTiddler = story.findContainingTiddler(place).getAttribute('tiddler');
		var title = (args.anon && args.anon[0]) || tiddler.fields["server.title"] || tiddler.title;
		var tid = store.getTiddler(title);
		var user = params[1] || false;
		if(tid) {
			followMacro.makeButton(place, {
				url: "/search?q=title:%22" + encodeURIComponent(title) + "%22",
				containingTiddler: containingTiddler,
				blacklisted: followMacro.getBlacklist(), title: title, user: user,
				consultFollowRelationship: (args.follow &&
					args.follow[0] === 'false') ? false : true });
		}
	},
	makeButton: function(place, options) { // this is essentially the same code in TiddlySpaceFollowingPlugin
		var title = options.title;
		var blacklisted = options.blacklisted;
		var tiddler = store.getTiddler(title);
		var btn = $('<div class="followButton" />').addClass("notLoaded").appendTo(place)[0];
		if(blacklisted.contains(title)) {
			$(btn).remove();
			return;
		} else {
			var user = options.user;
			window.setTimeout(function() { // prevent multiple calls due to refresh
				tiddlyspace.scroller.registerIsVisibleEvent(options.containingTiddler, function() {
					var mkButton = function(followers, ignore) {
						if(!followers && !ignore) {
							$(btn).remove();
						} else {
							$("<a />").appendTo(btn);
							var scanOptions = { url: options.url,
								spaceField: options.spaceField || "bag", template: null, sort: "-modified",
								callback: function(tiddlers) {
									$(btn).removeClass("notLoaded");
									followMacro.constructInterface(btn, tiddlers);
								}
							};
							if(!ignore) {
								scanOptions.showBags = followMacro._getFollowerBags(followers);
							}
							scanOptions.hideBags = [tiddler.fields["server.bag"]];
							scanMacro.scan(null, scanOptions, user);
						}
					};
					if(options.consultFollowRelationship) {
						followMacro.getFollowers(mkButton);
					} else {
						mkButton([], true);
					}
				});
			}, 1000);
		}
	},
	constructInterface: function(container, tiddlers) {
		var txt = tiddlers.length;
		var className = txt > 0 ? "hasReplies" : "noReplies";
		var el = $(story.findContainingTiddler(container));
		$(container).empty().addClass(className);
		var btn = $("<a />").addClass("followedTiddlers").text(txt).
			click(function(ev) {
				followMacro.followingOnClick(ev);
			}).appendTo('<div class="followedTiddlers" />').appendTo(container)[0];
		$.data(btn, "tiddlers", tiddlers);
	},
	followingOnClick: function(ev) {
		var target = ev.target;
		var locale = followMacro.locale;
		var el = $('<div class="followTiddlersList" />')[0];
		var popup = Popup.create(target,"div");
		$(popup).addClass("taggedTiddlerList followList").click(function(ev) { // make it so only clicking on the document outside the popup removes the popup
			if(ev.target.parentNode != document) {
				ev.stopPropagation();
			}
		}).append(el);
		var tiddlers = $.data(target, "tiddlers") || [];
		scanMacro.template(el, tiddlers.slice(0,1), "FollowTiddlersHeading");
		scanMacro.template(el, tiddlers, "FollowTiddlersTemplate");
		if(tiddlers.length === 0) {
			$("<li />").text(locale.noTiddlersFromFollowers).appendTo(el);
		}
		Popup.show();
		ev.stopPropagation();
		return popup;
	},
	_getFollowerBags: function(followers) { // XXX: private or not?
		return $.map(followers, function(name, i) {
			return name != currentSpace ? "%0_public".format(name) : null;
		});
	},
	getFollowers: function(callback, username) {
		// returns a list of spaces being followed by the existing space
		var followersCallback = function(user) {
			if(!user.anon) {
				scanMacro.scan(null, { 
					url: "/search?q=bag:%0_public tag:%1 _limit:%2".format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "title", template: null, cache: true,
					callback: function(tiddlers) {
						var followers = [];
						for(var i = 0; i < tiddlers.length; i++) {
							followers.push(tiddlyspace.resolveSpaceName(tiddlers[i].title));
						}
						callback(followers);
					}
				});
			} else {
				callback(false);
			}
		};
		return !username ? tweb.getUserInfo(followersCallback) : followersCallback({ name: username });
	}
};

var scanMacro = config.macros.tsScan = {
	init: function () {
		this.scanned = {};
	},
	_tiddlerfy: function(jsontiddlers, options) {
		var tiddlers = [];
		var spaceField = options.spaceField || "bag"; // TODO: phase out use view types instead
		$.each(jsontiddlers, function(i, t) {
			var use = false;
			if(!options.showBags || (options.showBags && options.showBags.contains(t.bag))) {
				use = true;
			}
			if(options.hideBags && options.hideBags.contains(t.bag)) {
				use = false;
			}
			if(use) {
				var spaceName = t[spaceField];
				var tiddler = config.adaptors.tiddlyweb.toTiddler(t, tweb.host);
				tiddler.fields["server.space"] = tiddlyspace.resolveSpaceName(spaceName);
				tiddlers.push(tiddler);
			}
		});
		return tiddlers;
	},
	_scanCallback: function(place, jsontiddlers, options) {
		var locale = followersMacro.locale;
		var tiddlers = scanMacro._tiddlerfy(jsontiddlers, options);
		
		if(options.sort) {
			tiddlers = store.sortTiddlers(tiddlers, options.sort);
		}
		if(options.filter) {
			var _store = new TiddlyWiki();
			config.lastStore = _store;
			for(var i = 0; i < tiddlers.length; i++) {
				var clone = tiddlers[i];
				clone.title = tiddlyspace.getLocalTitle(clone.title, clone.fields['server.workspace']);
				_store.addTiddler(clone);
			}
			tiddlers = _store.filterTiddlers(options.filter);
		}
		if(place) {
			$(place).empty();
			var list = $("<ul />").appendTo(place)[0];
			scanMacro.template(list, tiddlers, options.template);
			if(tiddlers.length === 0) {
				$("<li />").text(options.emptyMessage || locale.noone).appendTo(list);
				$(list).addClass("emptyList");
			}
		}
		if(options.callback) {
			options.callback(tiddlers);
		}
	},
	constructSearchUrl: function(host, options) {
		if(options.url) {
			return options.url;
		}
		var inputs = options.searchValues;
		var tag = options.tag;
		var searchField = options.searchField || "title";
		var searchQuery = [];
		for(var i = 0; i < inputs.length; i++) {
			searchQuery.push('%0:"%1"'.format(searchField, inputs[i]));
		}
		var query = searchQuery.join(" OR ");
		query = tag ? "(%0) AND tag:%1".format(query, tag) : query;
		query = options.query ? "%0;%1;".format(query, options.query) : query;
		query = options.fat ? "%0&fat=1".format(query) : query;
		return '%0/search?q=%1'.format(host, query);
	},
	scan: function(place, options) { // TODO: make use of list macro with url filter
		var locale = followersMacro.locale;
		options.template = options.template ? options.template : "ScanTemplate";
		followMacro.getHosts(function(host, tsHost) {
			$(place).text(followersMacro.locale.pleaseWait);
			options = options ? options: {};
			var url = scanMacro.constructSearchUrl(host, options);
			if(options.cache && scanMacro.scanned[url]) {
				var tiddlers = scanMacro.scanned[url].tiddlers;
				var run = function(tiddlers) {
					scanMacro._scanCallback(place, tiddlers, options);
				};
				if(tiddlers) {
					run(tiddlers);
				} else {
					scanMacro.scanned[url].callbacks.push(run);
				}
			} else {
				var callback = function(tiddlers) {
					scanMacro._scanCallback(place, tiddlers, options);
				};
				if(scanMacro.scanned[url] && scanMacro.scanned[url].callbacks) {
					scanMacro.scanned[url].callbacks.push(callback);
				} else {
					scanMacro.scanned[url] = {
						callbacks: [callback]
					};
				}
				ajaxReq({
					url: url,
					dataType: "json",
					success: function(tiddlers) {
						scanMacro.scanned[url].tiddlers = tiddlers;
						var callbacks = scanMacro.scanned[url].callbacks;
						while(callbacks.length > 0) {
							callbacks.pop()(tiddlers);
						}
					},
					error: function(xhr) {
						$(place).empty();
						$("<span />").addClass("annotation error").text(locale.error.format(xhr.status)).appendTo(place);
					}
				});
			}
		});
	},
	template: function(place, tiddlers, template) { // TODO: make use of list macro.
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var item = $('<li class="spaceName" />').appendTo(place)[0];
			var spaceName = tiddler.fields["server.space"] || "";
			var templateText = store.getTiddlerText(template).replace(/\$1/mg, spaceName);
			wikify(templateText, item, null, tiddler);
		}
	},
	getOptions: function(paramString, tiddler) {
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var options = { query: false, sort: false, tag: false, template: false, showBags: args.show || false,
			hideBags: args.hide || false, filter: false, spaceField: "bag", searchField: "title", fat: false,
			emptyMessage: false };
		for(var name in args) {
			if(name != "name") {
				if(name == "fat") {
					options[name] = true;
				} else {
					options[name] = args[name][0];
				}
			}
		}
		// if user has set searchField to modifier, then use the modifiers value if available otherwise use searchValues.
		var searchField = options.searchField;
		var searchValues = args[searchField] ? args[searchField] : args.searchValues;
		// if neither of those were used use the first parameter
		var defaultValues = tiddler ? [ tiddler.title ] : [];
		options.searchValues = searchValues ? searchValues : ( args.name ? [args.name[0]] : defaultValues);
		return options;
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var container = $("<div />").addClass("scanResults resultsArea").appendTo(place)[0];
		var options = scanMacro.getOptions(paramString, tiddler);
		scanMacro.scan(container, options);
	}
};

var followersMacro = config.macros.followers = {
	locale: {
		loggedOut: "Please login to see the list of followers",
		noSupport: "We were unable to retrieve followers as your browser does not support following.",
		pleaseWait: "Please wait while we look this up...",
		error: "Error %0 occurred whilst retrieving data from server",
		noone: "None."
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var locale = followersMacro.locale;
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var username = args.name ? args.name[0] : false;
		var container = $('<div class="followers" />').text(locale.pleaseWait).
			appendTo(place)[0];
		var followersCallback = function(user) {
			if(user.anon) {
				$("<span />").text(locale.loggedOut).appendTo(container);
			} else {
				var options = scanMacro.getOptions(paramString);
				$.extend(options, {
					url: "/search?q=title:@%0 OR title:%0 tag:%1 _limit:%2".
						format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "bag",
					template: options.template ? options.template : "FollowersTemplate"
				});
				scanMacro.scan(container, options);
			}
		};
		return !username ? followersCallback({ name: currentSpace }) : followersCallback({ name: username });
	}
};

var followingMacro = config.macros.following = {
	locale: {
		pleaseWait: followersMacro.locale.pleaseWait,
		loggedOut: "Please login to see who you are following",
		noSupport: followersMacro.locale.noSupport,
		error: followersMacro.locale.error,
		noone: followersMacro.locale.noone
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var locale = followingMacro.locale;
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var fat = args.fat ? true : false;
		var username = args.name ? args.name[0] : false;
		var container = $('<div class="following" />').text(locale.pleaseWait).
			appendTo(place)[0];
		var followingCallback = function(user) {
			if(user.anon) {
				$("<span />").text(locale.loggedOut).appendTo(container);
			} else {
				var options = scanMacro.getOptions(paramString);
				$.extend(options, {
					url: "/search?q=bag:%0_public tag:%1 _limit:%2".format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "title",
					template: options.template ? options.template : "FollowingTemplate"
				});
				scanMacro.scan(container, options);
			}
		};
		return !username ? followingCallback({ name: currentSpace }) : followingCallback({ name: username });
	}
};

var linkedMacro = config.macros.linkedTiddlers = {
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var args = paramString.parseParams("anon")[0];
		var title = params[0] || tiddler.fields["server.title"] || tiddler.title;
		var tid = store.getTiddler(title);
		var containingTiddler = story.findContainingTiddler(place).getAttribute('tiddler');
		if(tid) {
			followMacro.makeButton(place, {
				spaceField: "recipe",
				url: "/bags/%0/tiddlers/%1/backlinks".format(tid.fields['server.bag'],
					encodeURIComponent(tid.title)),
				blacklisted: followMacro.getBlacklist(),
				title: title,
				containingTiddler: containingTiddler,
				user: params[1] || false,
				consultFollowRelationship: args.follow ? true : false });
		}
	}
};

if(config.options.chkFollowTiddlersIsLinkedTiddlers) {
	merge(config.macros.followTiddlers, config.macros.linkedTiddlers);
	config.shadowTiddlers.FollowTiddlersHeading = "These are the other tiddlers that link to this tiddler.";
}

})(jQuery);
//}}}
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
/***
|''Name''|jquery.a-tools|
|''Version''|1.5.1|
***/
//{{{
/*! 
 * a-tools 1.5.1
 * 
 * Copyright (c) 2009 Andrey Kramarev(andrey.kramarev[at]ampparit.com), Ampparit Inc. (www.ampparit.com)
 * Licensed under the MIT license.
 * http://www.ampparit.fi/a-tools/license.txt
 *
 * Basic usage:
 
    <textarea></textarea>
    <input type="text" />

    // Get current selection
    var sel = $("textarea").getSelection()
    
    // Replace current selection
    $("input").replaceSelection("foo");

    // Count characters
    alert($("textarea").countCharacters());

    // Set max length without callback function
    $("textarea").setMaxLength(7);

    // Set max length with callback function which will be called when limit is exceeded
    $("textarea").setMaxLength(10, function() {
        alert("hello")
    });

    // Removing limit:
    $("textarea").setMaxLength(-1);
    
    // Insert text at current caret position
    $("#textarea").insertAtCaretPos("hello");
    
    // Set caret position (1 = beginning, -1 = end)
    $("#textArea").setCaretPos(10);
    
    // Set Selection
    $("#textArea").setSelection(10,15);

 */
 var caretPositionAmp=[]; function init(){if(navigator.appName=="Microsoft Internet Explorer"){obj=document.getElementsByTagName("TEXTAREA");var b,a=0;for(a=0;a<obj.length;a++){b=obj[a];caretPositionAmp[a]=b.value.length;b.onmouseup=function(){b=document.activeElement;for(var c=0;c<obj.length;c++)if(obj[c]==b)break;b.focus();var e=document.selection.createRange(),h=b.createTextRange(),d=h.duplicate();h.moveToBookmark(e.getBookmark());d.setEndPoint("EndToStart",h);caretPositionAmp[c]=d.text.length};b.onkeyup=function(){b=document.activeElement; for(var c=0;c<obj.length;c++)if(obj[c]==b)break;b.focus();var e=document.selection.createRange(),h=b.createTextRange(),d=h.duplicate();h.moveToBookmark(e.getBookmark());d.setEndPoint("EndToStart",h);caretPositionAmp[c]=d.text.length}}}}window.onload=init; jQuery.fn.extend({getSelection:function(){var b=this.jquery?this[0]:this,a,c,e,h=0;b.onmousedown=function(){document.selection&&typeof b.selectionStart!="number"?document.selection.empty():window.getSelection().removeAllRanges()};if(document.selection){var d=document.selection.createRange(),f=0,g=0,i=0;a=document.getElementsByTagName("TEXTAREA");for(c=0;c<a.length;c++)if(a[c]==b)break;if(b.value.match(/\n/g)!=null)h=b.value.match(/\n/g).length;if(d.text){e=d.text;if(typeof b.selectionStart=="number"){a= b.selectionStart;c=b.selectionEnd;if(a==c)return{start:a,end:c,text:d.text,length:c-a}}else{a=b.createTextRange();e=a.duplicate();firstRe=a.text;a.moveToBookmark(d.getBookmark());secondRe=a.text;e.setEndPoint("EndToStart",a);if(firstRe==secondRe&&firstRe!=d.text||e.text.length>firstRe.length)return{start:caretPositionAmp[c],end:caretPositionAmp[c],text:"",length:0};a=e.text.length;c=e.text.length+d.text.length}if(h>0)for(e=0;e<=h;e++){var k=b.value.indexOf("\n",g);if(k!=-1&&k<a){g=k+1;f++;i=f}else if(k!= -1&&k>=a&&k<=c)if(k==a+1){f--;i--;g=k+1}else{g=k+1;i++}else e=h}if(d.text.indexOf("\n",0)==1)i+=2;a-=f;c-=i;return{start:a,end:c,text:d.text,length:c-a}}b.focus();if(typeof b.selectionStart=="number")a=b.selectionStart;else{d=document.selection.createRange();a=b.createTextRange();e=a.duplicate();a.moveToBookmark(d.getBookmark());e.setEndPoint("EndToStart",a);a=e.text.length}if(h>0)for(e=0;e<=h;e++){k=b.value.indexOf("\n",g);if(k!=-1&&k<a){g=k+1;f++}else e=h}a-=f;if(a==0&&typeof b.selectionStart!= "number"){a=caretPositionAmp[c];c=caretPositionAmp[c]}return{start:a,end:a,text:d.text,length:0}}else if(typeof b.selectionStart=="number"){a=b.selectionStart;c=b.selectionEnd;e=b.value.substring(b.selectionStart,b.selectionEnd);return{start:a,end:c,text:e,length:c-a}}else return{start:undefined,end:undefined,text:undefined,length:undefined}},replaceSelection:function(b){var a=this.jquery?this[0]:this,c,e;e=0;var h,d,f=0,g=0,i=a.scrollTop==undefined?0:a.scrollTop;c=document.getElementsByTagName("TEXTAREA"); for(var k=0;k<c.length;k++)if(c[k]==a)break;if(document.selection&&typeof a.selectionStart!="number"){i=document.selection.createRange();if(typeof a.selectionStart!="number"){var j;d=a.createTextRange();h=d.duplicate();c=d.text;d.moveToBookmark(i.getBookmark());j=d.text;try{h.setEndPoint("EndToStart",d)}catch(m){return this}if(c==j&&c!=i.text||h.text.length>c.length)return this}if(i.text){part=i.text;if(a.value.match(/\n/g)!=null)f=a.value.match(/\n/g).length;c=h.text.length;if(f>0)for(j=0;j<=f;j++){var l= a.value.indexOf("\n",e);if(l!=-1&&l<c){e=l+1;g++}else j=f}i.text=b;caretPositionAmp[k]=h.text.length+b.length;d.move("character",caretPositionAmp[k]);document.selection.empty();a.blur()}return this}else if(typeof a.selectionStart=="number"&&a.selectionStart!=a.selectionEnd){c=a.selectionStart;e=a.selectionEnd;a.value=a.value.substr(0,c)+b+a.value.substr(e);e=c+b.length;a.setSelectionRange(e,e);a.scrollTop=i;return this}return this},setSelection:function(b,a){b=parseInt(b);a=parseInt(a);var c=this.jquery? this[0]:this;c.focus();if(typeof c.selectionStart!="number"){re=c.createTextRange();if(re.text.length<a)a=re.text.length+1}if(a<b)return this;if(document.selection){var e=0,h=0,d=0,f=0;if(typeof c.selectionStart!="number"){re.collapse(true);re.moveEnd("character",a);re.moveStart("character",b);re.select()}else{if(typeof c.selectionStart=="number"){if(c.value.match(/\n/g)!=null)e=c.value.match(/\n/g).length;if(e>0)for(var g=0;g<=e;g++){var i=c.value.indexOf("\n",d);if(i!=-1&&i<b){d=i+1;h++;f=h}else if(i!= -1&&i>=b&&i<=a)if(i==b+1){h--;f--;d=i+1}else{d=i+1;f++}else g=e}b+=h;a+=f;c.selectionStart=b;c.selectionEnd=a}c.focus()}return this}else if(c.selectionStart||c.selectionStart==0){c.focus();window.getSelection().removeAllRanges();c.selectionStart=b;c.selectionEnd=a;c.focus();return this}},insertAtCaretPos:function(b){var a=this.jquery?this[0]:this,c,e,h,d,f,g,i;c=e=0;var k=a.scrollTop==undefined?0:a.scrollTop;i=document.getElementsByTagName("TEXTAREA");for(var j=0;j<i.length;j++)if(i[j]==a)break;a.focus(); if(document.selection&&typeof a.selectionStart!="number"){if(a.value.match(/\n/g)!=null)c=a.value.match(/\n/g).length;i=parseInt(caretPositionAmp[j]);if(c>0)for(var m=0;m<=c;m++){var l=a.value.indexOf("\n",h);if(l!=-1&&l<=i){h=l+1;i-=1;e++}}}caretPositionAmp[j]=parseInt(caretPositionAmp[j]);a.onkeyup=function(){if(document.selection&&typeof a.selectionStart!="number"){a.focus();d=document.selection.createRange();f=a.createTextRange();g=f.duplicate();f.moveToBookmark(d.getBookmark());g.setEndPoint("EndToStart", f);caretPositionAmp[j]=g.text.length}};a.onmouseup=function(){if(document.selection&&typeof a.selectionStart!="number"){a.focus();d=document.selection.createRange();f=a.createTextRange();g=f.duplicate();f.moveToBookmark(d.getBookmark());g.setEndPoint("EndToStart",f);caretPositionAmp[j]=g.text.length}};if(document.selection&&typeof a.selectionStart!="number"){d=document.selection.createRange();if(d.text.length!=0)return this;f=a.createTextRange();textLength=f.text.length;g=f.duplicate();f.moveToBookmark(d.getBookmark()); g.setEndPoint("EndToStart",f);c=g.text.length;if(caretPositionAmp[j]>0&&c==0){e=caretPositionAmp[j]-e;f.move("character",e);f.select();d=document.selection.createRange();caretPositionAmp[j]+=b.length}else if(!(caretPositionAmp[j]>=0)&&textLength==0){d=document.selection.createRange();caretPositionAmp[j]=b.length+textLength}else if(!(caretPositionAmp[j]>=0)&&c==0){f.move("character",textLength);f.select();d=document.selection.createRange();caretPositionAmp[j]=b.length+textLength}else if(!(caretPositionAmp[j]>= 0)&&c>0){f.move("character",0);document.selection.empty();f.select();d=document.selection.createRange();caretPositionAmp[j]=c+b.length}else if(caretPositionAmp[j]>=0&&caretPositionAmp[j]==textLength){if(textLength!=0){f.move("character",textLength);f.select()}else f.move("character",0);d=document.selection.createRange();caretPositionAmp[j]=b.length+textLength}else{if(caretPositionAmp[j]>=0&&c!=0&&caretPositionAmp[j]>=c){e=caretPositionAmp[j]-c;f.move("character",e)}else caretPositionAmp[j]>=0&&c!= 0&&caretPositionAmp[j]<c&&f.move("character",0);document.selection.empty();f.select();d=document.selection.createRange();caretPositionAmp[j]+=b.length}d.text=b;a.focus();return this}else if(typeof a.selectionStart=="number"&&a.selectionStart==a.selectionEnd){h=a.selectionStart+b.length;c=a.selectionStart;e=a.selectionEnd;a.value=a.value.substr(0,c)+b+a.value.substr(e);a.setSelectionRange(h,h);a.scrollTop=k;return this}return this},setCaretPos:function(b){var a=this.jquery?this[0]:this,c,e=0,h=0,d; d=document.getElementsByTagName("TEXTAREA");for(var f=0;f<d.length;f++)if(d[f]==a)break;a.focus();if(parseInt(b)==0)return this;if(parseInt(b)>0){b=parseInt(b)-1;if(document.selection&&typeof a.selectionStart=="number"&&a.selectionStart==a.selectionEnd){if(a.value.match(/\n/g)!=null)e=a.value.match(/\n/g).length;if(e>0)for(var g=0;g<=e;g++){d=a.value.indexOf("\n",c);if(d!=-1&&d<=b){c=d+1;b=parseInt(b)+1}}}}else if(parseInt(b)<0){b=parseInt(b)+1;if(document.selection&&typeof a.selectionStart!="number"){b= a.value.length+parseInt(b);if(a.value.match(/\n/g)!=null)e=a.value.match(/\n/g).length;if(e>0){for(g=0;g<=e;g++){d=a.value.indexOf("\n",c);if(d!=-1&&d<=b){c=d+1;b=parseInt(b)-1;h+=1}}b=b+h-e}}else if(document.selection&&typeof a.selectionStart=="number"){b=a.value.length+parseInt(b);if(a.value.match(/\n/g)!=null)e=a.value.match(/\n/g).length;if(e>0){b=parseInt(b)-e;for(g=0;g<=e;g++){d=a.value.indexOf("\n",c);if(d!=-1&&d<=b){c=d+1;b=parseInt(b)+1;h+=1}}}}else b=a.value.length+parseInt(b)}else return this; if(document.selection&&typeof a.selectionStart!="number"){c=document.selection.createRange();if(c.text!=0)return this;a=a.createTextRange();a.collapse(true);a.moveEnd("character",b);a.moveStart("character",b);a.select();caretPositionAmp[f]=b;return this}else if(typeof a.selectionStart=="number"&&a.selectionStart==a.selectionEnd){a.setSelectionRange(b,b);return this}return this},countCharacters:function(){var b=this.jquery?this[0]:this;if(b.value.match(/\r/g)!=null)return b.value.length-b.value.match(/\r/g).length; return b.value.length},setMaxLength:function(b,a){this.each(function(){var c=this.jquery?this[0]:this,e=c.type,h,d;if(parseInt(b)<0)b=1E8;if(e=="text")c.maxLength=b;if(e=="textarea"||e=="text"){c.onkeypress=function(f){var g=c.value.match(/\r/g);d=b;if(g!=null)d=parseInt(d)+g.length;f=f||event;g=f.keyCode;h=document.selection?document.selection.createRange().text.length>0:c.selectionStart!=c.selectionEnd;if(c.value.length>=d&&(g>47||g==32||g==0||g==13)&&!f.ctrlKey&&!f.altKey&&!h){c.value=c.value.substring(0, d);typeof a=="function"&&a();return false}};c.onkeyup=function(){var f=c.value.match(/\r/g),g=0,i=0;d=b;if(f!=null){for(var k=0;k<=f.length;k++)if(c.value.indexOf("\n",i)<=parseInt(b)){g++;i=c.value.indexOf("\n",i)+1}d=parseInt(b)+g}if(c.value.length>d){c.value=c.value.substring(0,d);typeof a=="function"&&a();return this}}}else return this});return this}});
//}}}
/***
https://raw.github.com/tiddlyweb/chrjs/master/main.js
***/
//{{{
// TiddlyWeb adaptor
// v0.14.3

/*jslint vars: true, unparam: true, nomen: true, white: true */
/*global jQuery */

var tiddlyweb = (function($) {

"use strict";

var tw = {
	routes: {
		// host is the TiddlyWeb instance's URI (including server_prefix)
		// placeholders "_type" & "name" refer to the respective bag/recipe
		root     : "{host}/",
		bags     : "{host}/bags",
		bag      : "{host}/bags/{name}",
		recipes  : "{host}/recipes",
		recipe   : "{host}/recipes/{name}",
		tiddlers : "{host}/{_type}s/{name}/tiddlers",
		tiddler  : "{host}/{_type}s/{name}/tiddlers/{title}",
		revisions: "{host}/{_type}s/{name}/tiddlers/{title}/revisions",
		revision : "{host}/{_type}s/{name}/tiddlers/{title}/revisions/{revision}",
		search   : "{host}/search?q={query}"
	}
};

var convertTimestamp, supplant;

// host (optional) is the URI of the originating TiddlyWeb instance
tw.Resource = function(type, host) {
	if(arguments.length) { // initialization
		this._type = type;
		if(host !== false) {
			this.host = host !== undefined ? host.replace(/\/$/, "") : null;
		}
	}
};
$.extend(tw.Resource.prototype, {
	// retrieves resource from server
	// callback is passed resource, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	// filters is an optional filter string (e.g. "select=tag:foo;limit=5")
	get: function(callback, errback, filters) {
		var uri = this.route();
		if(filters) {
			var separator = uri.indexOf("?") === -1 ? "?" : ";";
			uri += separator + filters;
		}
		var self = this;
		return $.ajax({
			url: uri,
			type: "GET",
			dataType: "json",
			success: function(data, status, xhr) {
				var resource = self.parse(data);
				resource.etag = xhr.getResponseHeader("Etag");
				callback(resource, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		});
	},
	// sends resource to server
	// callback is passed data, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	put: function(callback, errback) {
		var self = this;
		var options = {
			url: this.route(),
			type: "PUT",
			contentType: "application/json",
			data: JSON.stringify(this.baseData()),
			success: function(data, status, xhr) {
				callback(self, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		};
		if(this.ajaxSetup) {
			this.ajaxSetup(options);
		}
		return $.ajax(options);
	},
	// deletes resource on server
	// callback is passed data, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	"delete": function(callback, errback) {
		var self = this;
		var options = {
			url: this.route(),
			type: "DELETE",
			success: function(data, status, xhr) {
				callback(self, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		};
		if(this.ajaxSetup) {
			this.ajaxSetup(options);
		}
		return $.ajax(options);
	},
	// returns an object carrying only the essential information of the resource
	baseData: function() {
		var data = {},
			self = this;
		$.each(this.data, function(i, item) {
			var value = self[item];
			if(value !== undefined) {
				data[item] = value;
			}
		});
		return data;
	},
	// returns corresponding instance from a raw object (if applicable)
	parse: function(data) {
		return data;
	},
	// list of accepted keys in serialization
	data: [],
	// returns resource's URI
	route: function() {
		return supplant(tw.routes[this._type], this);
	}
});

var Container = function(type, name, host) {
	if(arguments.length) { // initialization
		tw.Resource.apply(this, [type, host]);
		this.name = name;
		this.desc = "";
		this.policy = new tw.Policy({});
	}
};
Container.prototype = new tw.Resource();
$.extend(Container.prototype, {
	tiddlers: function() {
		return new tw.TiddlerCollection(this);
	},
	parse: function(data) {
		var type = tw._capitalize(this._type),
			container = new tw[type](this.name, this.host);
		data.policy = new tw.Policy(data.policy);
		return $.extend(container, data);
	},
	data: ["desc", "policy"]
});

// attribs is an object whose members are merged into the instance (e.g. query)
tw.Collection = function(type, host, attribs) {
	if(arguments.length) { // initialization
		tw.Resource.apply(this, [type, host]);
		$.extend(this, attribs);
	}
};
tw.Collection.prototype = new tw.Resource();

tw.TiddlerCollection = function(container, tiddler) {
	if(arguments.length) { // initialization
		tw.Collection.apply(this, [tiddler ? "revisions" : "tiddlers"]);
		this.container = container || null;
		this.tiddler = tiddler || null;
	}
};
tw.TiddlerCollection.prototype = new tw.Collection();
$.extend(tw.TiddlerCollection.prototype, {
	parse: function(data) {
		var container = this.container;
		return $.map(data, function(item, i) {
			var tiddler = new tw.Tiddler(item.title, container),
				bag = item.bag;
			tiddler = tw.Tiddler.prototype.parse.apply(tiddler, [item]);
			if(!tiddler.bag && bag) { // XXX: bag always present!?
				tiddler.bag = new tw.Bag(bag, container.host);
			}
			if(!tiddler.recipe && item.recipe) {
				tiddler.recipe = new tw.Recipe(item.recipe, container.host);
			}
			delete item.recipe;
			return $.extend(tiddler, item);
		});
	},
	route: function() {
		var params = this.container;
		if(this.tiddler) {
			var container = this.tiddler.bag || this.tiddler.recipe;
			params = {
				_type: container._type,
				host: container.host,
				name: container.name,
				title: this.tiddler.title
			};
		}
		return supplant(tw.routes[this._type], params);
	}
});

tw.Search = function(query, host) {
	tw.Collection.apply(this, ["search", host]);
	this.query = query;
};
tw.Search.prototype = new tw.Collection();
$.extend(tw.Search.prototype, {
	parse: function(data) {
		this.container = { // XXX: hacky
			_type: "bag",
			host: this.host
		};
		var tiddlers = tw.TiddlerCollection.prototype.parse.apply(this, arguments);
		delete this.container;
		return tiddlers;
	}
});

// title is the name of the tiddler
// container (optional) is an instance of either Bag or Recipe
// optionally accepts a single object representing tiddler attributes
tw.Tiddler = function(title, container) {
	tw.Resource.apply(this, ["tiddler", false]);
	this.title = title;
	this.bag = container && container._type === "bag" ? container : null;
	this.recipe = container && container._type === "recipe" ? container : null;
	var self = this;
	$.each(this.data, function(i, item) {
		self[item] = undefined; // exposes list of standard attributes for inspectability
	});
	if(title && title.title) { // title is an object of tiddler attributes
		$.extend(this, title);
	}
};
tw.Tiddler.prototype = new tw.Resource();
$.extend(tw.Tiddler.prototype, {
	revisions: function() {
		return new tw.TiddlerCollection(this.bag || this.recipe, this);
	},
	route: function() {
		var container = this.bag || this.recipe;
		var params = $.extend({}, this, {
			host: container ? container.host : null,
			_type: this.bag ? "bag" : (this.recipe ? "recipe" : null),
			name: container ? container.name : null
		});
		return supplant(tw.routes[this._type], params);
	},
	parse: function(data) {
		var tiddler = new tw.Tiddler(this.title),
			container = this.bag || this.recipe;
		if(data.bag) {
			tiddler.bag = new tw.Bag(data.bag, container.host);
			delete data.bag;
		}
		delete data.recipe;
		tiddler.created = data.created ? convertTimestamp(data.created) : new Date();
		delete data.created;
		tiddler.modified = data.modified ? convertTimestamp(data.modified) : new Date();
		delete data.modified;
		if(this.recipe) {
			tiddler.recipe = this.recipe;
		}
		return $.extend(tiddler, data);
	},
	data: ["created", "creator", "modifier", "modified", "tags", "type", "text",
			"fields"],
	ajaxSetup: function(options) {
		var self = this;
		if(this.etag && (options.type === "PUT" || options.type === "DELETE")) {
			options.beforeSend = function(xhr) {
				xhr.setRequestHeader("If-Match", self.etag);
			};
		}
		if(options.type === "PUT") {
			var callback = options.success;
			options.success = function(data, status, xhr) {
				var loc = xhr.getResponseHeader("Location"),
					etag = xhr.getResponseHeader("Etag");
				if(loc && etag) {
					self.etag = etag;
					if(!self.bag) {
						var bag = loc.split("/bags/").pop().split("/")[0];
						self.bag = new tw.Bag(bag, self.recipe.host);
					}
					callback(self, status, xhr);
				} else { // IE
					self.get(callback, options.error);
				}
			};
		}
	}
});

tw.Revision = function(id, tiddler) {
	var container = tiddler.bag || tiddler.recipe;
	tw.Tiddler.apply(this, [tiddler.title, container]);
	this._type = "revision";
	this.revision = id;
};
tw.Revision.prototype = new tw.Tiddler();
$.extend(tw.Revision.prototype, {
	revisions: false,
	data: false,
	put: false,
	"delete": false
});

tw.Bag = function(name, host) {
	Container.apply(this, ["bag", name, host]);
};
tw.Bag.prototype = new Container();

tw.Recipe = function(name, host) {
	Container.apply(this, ["recipe", name, host]);
	this.recipe = [];
};
tw.Recipe.prototype = new Container();
$.extend(tw.Recipe.prototype, {
	data: ["recipe"].concat(Container.prototype.data)
});

tw.Policy = function(constraints) { // TODO: validation?
	var self = this;
	$.each(this.constraints, function(i, item) {
		self[item] = constraints[item];
	});
};
tw.Policy.prototype.constraints = ["read", "write", "create", "delete",
	"manage", "accept", "owner"];

/*
 * utilities
 */

tw._capitalize = function(str) {
	return str.charAt(0).toUpperCase() + str.slice(1);
};

// convert YYYYMMDDhhmmss timestamp to Date instance
convertTimestamp = function(t) {
	if (t.match(/^\d{12,17}$/)) {
		return new Date(Date.UTC(
			parseInt(t.substr(0, 4), 10),
			parseInt(t.substr(4, 2), 10) - 1,
			parseInt(t.substr(6, 2), 10),
			parseInt(t.substr(8, 2), 10),
			parseInt(t.substr(10, 2), 10),
			parseInt(t.substr(12, 2) || "0", 10),
			parseInt(t.substr(14, 3) || "0", 10)
		));
	} else {
		return new Date(Date.parse(t));
	}
};

// adapted from Crockford (http://javascript.crockford.com/remedial.html)
supplant = function(str, obj) {
	return str.replace(/{([^{}]*)}/g, function (a, b) {
		var r = obj[b];
		r = typeof r === "string" || typeof r === "number" ? r : a;
		return $.inArray(b, ["host", "query"]) !== -1 ? r : encodeURIComponent(r); // XXX: special-casing
	});
};

return tw;

}(jQuery));
//}}}
<<binaryUpload edit:title bag:tiddlydocs_public>>
config.macros.ActivityTable = {
  handler: function(place) {
    var collection = {};
    var tiddlers = store.sortTiddlers(store.getTiddlers(),"modified");
    for(var i=0; i < tiddlers.length; i++){
    if(!tiddlers[i].tags.contains("excludeLists")) {
        var modified = tiddlers[i].modified;
        var id = modified.formatString("0DD/0MM");
        collection[id] = collection[id] ? collection[id] + 1 : 1;
      } 
    }
    var line1 = [];
    var line2 = []; 
    for(var i in collection){
      line1.push(i);
      line2.push(collection[i]);
    }
// only show last 10 days
    line1 = line1.slice(0, 10);
    line2 = line2.slice(0,10);
    var wikiText = "|Modified|%0|\n|Number Tiddlers|%1|".format([line1.join("|"),line2.join("|")]);
    wikify(wikiText, place);
  }
}
(function() {
var getCSRFToken = function(window) {
	// XXX: should not use RegEx - cf.
	// http://www.quirksmode.org/js/cookies.html
	// https://github.com/TiddlySpace/tiddlyspace/commit/5f4adbe009ed4bda3ce39058a3fb07de1420358d
	var regex = /^(?:.*; )?csrf_token=([^(;|$)]*)(?:;|$)/;
	var match = regex.exec(document.cookie);
	var csrf_token = null;
	if (match && (match.length === 2)) {
		csrf_token = match[1];
	}

	return csrf_token;
};

if (typeof config !== 'undefined' && config.extensions &&
		config.extensions.tiddlyspace &&
		config.extensions.tiddlyspace.getCSRFToken === null) {
	config.extensions.tiddlyspace.getCSRFToken = getCSRFToken;
} else {
	window.getCSRFToken = getCSRFToken;
}
})(window);
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="434 218 68 68"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 478.39694 232.53705 L 478.39694 232.53705 
		C 477.1145 231.85132 475.77875 231.30147 474.41058 230.88734 L 474.41058 218.24994 L 461.58942 218.24994 
		L 461.58942 230.88734 C 460.22125 231.30147 458.8855 231.85132 457.60306 232.53705 L 448.66824 223.60214 
		L 439.6022 232.66814 L 448.53717 241.60304 C 447.8515 242.8854 447.30157 244.22116 446.88745 245.58936 
		L 434.25 245.58936 L 434.25 258.41052 L 446.88745 258.41052 
		C 447.30157 259.77869 447.8515 261.11447 448.53717 262.39688 L 439.6022 271.33173 L 448.66824 280.3978 
		L 457.60306 271.46283 C 458.8855 272.14862 460.22125 272.69846 461.58942 273.11252 L 461.58942 285.74988 
		L 474.41058 285.74988 L 474.41058 273.11252 C 475.77875 272.69846 477.1145 272.14862 478.39694 271.46283 
		L 487.33176 280.3978 L 496.39767 271.33173 L 487.46286 262.39688 
		C 488.14853 261.11447 488.69836 259.77869 489.11255 258.41052 L 501.74988 258.41052 L 501.74988 245.58936 
		L 489.11255 245.58936 C 488.69836 244.22116 488.14853 242.8854 487.46286 241.60304 L 496.39767 232.66814 
		L 487.33176 223.60214 Z M 475.3328 244.66714 C 479.3825 248.71698 479.3825 255.2829 475.3328 259.33273 
		C 471.28296 263.3826 464.71704 263.3826 460.66724 259.33273 
		C 456.61737 255.2829 456.61737 248.71698 460.66724 244.66714 
		C 464.71704 240.61734 471.28296 240.61734 475.3328 244.66714" fill="#111"
		class="glyph"/>
	</g>
</g>
</svg>
github.com/simonmcmanus
It is possible to create a version of TiddlyDocs on any web server running Python.

For developers the latest version is [[here|http://pypi.python.org/packages/source/t/tiddlywebplugins.tiddlydocs/tiddlywebplugins.tiddlydocs-0.11.tar.gz]]
/***
|''Name''|TiddlyChartsPlugin|
|''Description''|Translates tables to bar charts, pie charts and line charts|
|''Author''|Jon Robson|
|''Version''|0.6.10|
|''Source''||
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Requires''|g.pie.js|
!Usage
{{{
<<PieChart TiddlerTitle>>
<<BarChart TiddlerTitle>>
<<LineChart TiddlerTitle>>
Where TiddlerTitle is a tiddler with an html table in it (which can be produced by wiki markup)
Note x values can now be date strings recognised by JavaScript's date formatter "MM/DD/YYYY HH:MM:SS" for example or in the format "YYYYMMDDHHMM"
}}}
!Parameters
dataView:col
read vertically - headings are the first column
dataView:row
read horizontally - headings are the first row
width:400 height:400
set width and height
!Code
***/
//{{{
(function($) {
	
var macro = config.macros.Chart = {
	handler: function() {
		//not yet
	},
	getData: function(title,options){
		if(options && options.dataView && options.dataView == "col") {
			return macro.getDataColumns(title);
		} else {
			return macro.getDataRows(title);		
		}
	},
	getDataRows: function(title) {
		var data = store.getTiddlerText(title);
		if(!data) {
			throw "There is no tiddler called %0 so unable to access rows.".format([title]);
		}
		var temp =$("<div />")[0];
		wikify(data, temp);
		var rows = $("tr", temp);
		return rows;
	},
	getDataColumns: function(title) {
		var data = store.getTiddlerText(title);
		if(!data) {
			throw "There is no tiddler called %0 so unable to access columns.".format([title]);
		}
		var temp =$("<div />")[0];
		wikify(data, temp);
		var rows = $("tr", temp);
		var columns = [];
		$(rows).each(function(i, rowEl) {
			var columnEls = $("td", rowEl);
			$(columnEls).each(function(j, colEl) {
				if(!columns[j]) {
					var parent = document.createElement("tr");
					columns.push(parent);
				}
				columns[j].appendChild(colEl)
			});
		});
		return $(columns);
	},
	getOptions: function(paramString) {
		var userParams = paramString.parseParams("anon",null,true,false,false)[0];
		var defaults = {
			axis: "0 0 1 1",
			legendpos: "east",
			nostroke: false,
			smooth: true,
			symbol: "x",
			width: 320,
			height: 240,
			barEdges: "smooth",
			dataView: "row",
			dateString: "0DD/0MM/YYYY"
		};
		var options = merge({}, defaults);
		for(var i in userParams) {
			var val = userParams[i][0];
			if(val == "no") {
				val = false;
			}
			options[i] = val;
		}
		if(userParams.smooth && userParams.smooth[0]) {
			barEdges = "smooth";
		}
		options.params = userParams.anon;
		return options;
	},
	createCanvas: function(place, options) {
		var container = $('<div class="chart" />').appendTo(place)[0];
		var r = Raphael(container, options.width, options.height);
		return r;
	}
};
var pieMacro = config.macros.PieChart = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var options = macro.getOptions(paramString);
		var data = pieMacro.getData(params[0], options);
		var r = macro.createCanvas(place, options);
		var halfWidth = options.width/2;
		var halfHeight = options.height/2;
		var radius = halfWidth > halfHeight ? halfHeight : halfWidth;
		radius -= 50;
		var pie = r.g.piechart(halfWidth - 50, halfHeight -50, radius, data.values, {legend: data.legend, legendpos: options.legendpos});
		pie.hover(function () {
			this.sector.stop();
			this.sector.scale(1.1, 1.1, this.cx, this.cy);
			if (this.label) {
			 this.label[0].stop();
			 this.label[0].scale(1.5);
			 this.label[1].attr({"font-weight": 800});
			}
		}, function () {
			this.sector.animate({scale: [1, 1, this.cx, this.cy]}, 500, "bounce");
			if (this.label) {
				this.label[0].animate({scale: 1}, 500, "bounce");
				this.label[1].attr({"font-weight": 400});
			}
		});
	},
	getData: function(title, options) {
		var rows = macro.getData(title, options);
		if(rows.length > 2) {
			throw "Unknown table of data: Looking for 2 rows/columns. Try dataView:col parameter";
		}
		var headingRow = rows[0]; 
		var dataRow = rows[1];
		var values = [], headings = [];
		$("td", $(headingRow)).each(function(i, el) {
			headings.push($(el).text());
		});

		$("td", dataRow).each(function(i, el) {
				values.push(parseFloat($(el).text()));
		});
		if(isNaN(values[0])) {
			headings = headings.splice(1, headings.length);
			values = values.splice(1, values.length);
		}
		return {values: values, legend: headings};
	}
};

var lineMacro = config.macros.LineChart = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var container = $("<div />").attr("macroName", macroName).attr("refresh", "macro").
			attr("paramString", paramString).appendTo(place);
		lineMacro.refresh(container);
	},
	refresh: function(place) {
		$(place).empty();
		var paramString = $(place).attr("paramString");
		var options = macro.getOptions(paramString);
		var params = options.params;
		var r = macro.createCanvas(place, options);
		var data = lineMacro.getData(params[0], options);
		var chart = r.g.linechart(50, 50, options.width - 50, options.height - 100, 
			data.xValues, data.yValues, {nostroke: options.nostroke, axis: options.axis, symbol: options.symbol, smooth: options.smooth});
		var newItems = [];
		if(data.mapX) {
			$.each(chart.axis[0].text.items, function(i, label) {
				var old = label.attr("text");
				if(old) {
					var newLabel = data.mapX(old);
					if(newLabel) {
						label.attr({ text: newLabel });
					}
				}
			});
		}
		
		if(options.symbol) {
			chart.hoverColumn(
				function () {
					this.tags = r.set();
					for (var i = 0, ii = this.y.length; i < ii; i++) {
						this.tags.push(r.g.tag(this.x, this.y[i], this.values[i], 160, 10).insertBefore(this).attr([{fill: "#fff"}, {fill: this.symbols[i].attr("fill")}]));
					}
				}, 
				function () {
					this.tags && this.tags.remove();
				}
			);
		}
	},
	getData: function(title, options) {
		var rows = macro.getData(title, options);
		var rowsData = [];
		var headings = [];
		var xValues = [];
		var xOrigin;
		var mapX = function(x) {
			if(options.mode === "date") {
				var d = new Date(xOrigin.getTime() + x);
				d = d.formatString(options.dateString);
				return d;
			}
			return x;
		};
		$(rows).each(function(i, el) {
			$("td", el).each(function(j, col) {
				var val = $(col).text();
				if(i == 0) { // first row contains headings
					headings.push(val);
				} else if(j == 0) { // x value
					val = val.trim();
					var isNumber = val.match("[0-9\.]*")[0].length == val.length;
					var x = parseFloat(val, 10);
					var asDate = new Date.convertFromYYYYMMDDHHMM(val);
					if(val.indexOf("/") == 2) { // assume its a date in YYYY/MM/DD HH:MM:SS format
						if(i == 1) { // first date encountered
							// turn it into a date.
							xOrigin = new Date(val);
							x = 0;
						} else {
							// turn it into a date
							thisdate = new Date(val);
							var timePassed = thisdate - xOrigin;
							x = timePassed;
						}
					} else if(!isNaN(asDate)) {
						options.mode = "date";
						if(i == 1) {
							xOrigin = asDate;
							x = 0;
						} else {
							x = asDate - xOrigin;
						}
					} else if(isNaN(x) || !isNumber) { // make it an iterable
						x = i -1;
					} else {
						x = x;
					}
					xValues.push(x);
				} else { // have a y value
					if(!rowsData[j-1]) {
						rowsData.push([]);
					}
					var y = parseFloat(val);
					if(isNaN(y)) {
						throw "invalid y value %0 in table".format(val);
					}
					rowsData[j-1].push(y);
				}
			});
		});
		var data =[[], []];
		for(var i=0; i < rowsData.length; i++){
			data[0].push(xValues);
			data[1].push(rowsData[i]);
		}
		return {legend: headings, xValues: data[0], yValues: data[1], mapX: mapX };
	}
};

var barMacro = config.macros.BarChart = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var options = macro.getOptions(paramString);
		var data = pieMacro.getData(params[0], options);
		var r = macro.createCanvas(place, options);
		var chart = r.g.barchart(50, 50, options.width - 50, options.height - 50, [data.values], {stacked: true, type: options.barEdges});
		chart.label(data.legend);
		chart.hover(function() {
				// Create a popup element on top of the bar
				this.flag = r.g.popup(this.bar.x, this.bar.y, (this.bar.value	|| "0")).insertBefore(this);
		}, function() {
				// hide the popup element with an animation and remove the popup element at the end
				this.flag.animate({opacity: 0}, 300, function () {this.remove();});
		});
		
	}
};


})(jQuery);
//}}}
/***
|''Name''|g.dot|
|''Requires''|raphaeljs g.raphael|
!Usage
!Code
***/
/*
 * g.Raphael 0.4.1 - Charting library, based on Raphaël
 *
 * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com)
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
 */
Raphael.fn.g.dotchart=function(K,J,a,f,w,v,r,F){function Q(b){+b[0]&&(b[0]=c.g.axis(K+q,J+q,a-2*q,B,n,F.axisxstep||Math.floor((a-2*q)/20),2,F.axisxlabels||null,F.axisxtype||"t"));+b[1]&&(b[1]=c.g.axis(K+a-q,J+f-q,f-2*q,A,m,F.axisystep||Math.floor((f-2*q)/20),3,F.axisylabels||null,F.axisytype||"t"));+b[2]&&(b[2]=c.g.axis(K+q,J+f-q+E,a-2*q,B,n,F.axisxstep||Math.floor((a-2*q)/20),0,F.axisxlabels||null,F.axisxtype||"t"));+b[3]&&(b[3]=c.g.axis(K+q-E,J+f-q,f-2*q,A,m,F.axisystep||Math.floor((f-2*q)/20),1,F.axisylabels||null,F.axisytype||"t"));}F=F||{};var u=this.g.snapEnds(Math.min.apply(Math,w),Math.max.apply(Math,w),w.length-1),B=u.from,n=u.to,q=F.gutter||10,I=this.g.snapEnds(Math.min.apply(Math,v),Math.max.apply(Math,v),v.length-1),A=I.from,m=I.to,z=Math.max(w.length,v.length,r.length),t=this.g.markers[F.symbol]||"disc",G=this.set(),s=this.set(),D=F.max||100,p=Math.max.apply(Math,r),o=[],c=this,N=Math.sqrt(p/Math.PI)*2/D;for(var O=0;O<z;O++){o[O]=Math.min(Math.sqrt(r[O]/Math.PI)*2/N,D);}q=Math.max.apply(Math,o.concat(q));var C=this.set(),E=Math.max.apply(Math,o);if(F.axis){var l=(F.axis+"").split(/[,\s]+/);Q(l);var P=[],S=[];for(var O=0,H=l.length;O<H;O++){var T=l[O].all?l[O].all.getBBox()[["height","width"][O%2]]:0;P[O]=T+q;S[O]=T;}q=Math.max.apply(Math,P.concat(q));for(var O=0,H=l.length;O<H;O++){if(l[O].all){l[O].remove();l[O]=1;}}Q(l);for(var O=0,H=l.length;O<H;O++){if(l[O].all){C.push(l[O].all);}}G.axis=C;}var M=(a-q*2)/((n-B)||1),L=(f-q*2)/((m-A)||1);for(var O=0,H=v.length;O<H;O++){var e=this.raphael.is(t,"array")?t[O]:t,j=K+q+(w[O]-B)*M,h=J+f-q-(v[O]-A)*L;e&&o[O]&&s.push(this.g[e](j,h,o[O]).attr({fill:F.heat?this.g.colorValue(o[O],E):Raphael.fn.g.colors[0],"fill-opacity":F.opacity?o[O]/D:1,stroke:"none"}));}var d=this.set();for(var O=0,H=v.length;O<H;O++){var j=K+q+(w[O]-B)*M,h=J+f-q-(v[O]-A)*L;d.push(this.circle(j,h,E).attr(this.g.shim));F.href&&F.href[O]&&d[O].attr({href:F.href[O]});d[O].r=+o[O].toFixed(3);d[O].x=+j.toFixed(3);d[O].y=+h.toFixed(3);d[O].X=w[O];d[O].Y=v[O];d[O].value=r[O]||0;d[O].dot=s[O];}G.covers=d;G.series=s;G.push(s,C,d);G.hover=function(g,b){d.mouseover(g).mouseout(b);return this;};G.click=function(b){d.click(b);return this;};G.each=function(g){if(!Raphael.is(g,"function")){return this;}for(var b=d.length;b--;){g.call(d[b]);}return this;};G.href=function(k){var g;for(var b=d.length;b--;){g=d[b];if(g.X==k.x&&g.Y==k.y&&g.value==k.value){g.attr({href:k.href});}}};return G;};
<<TagTable>>
/*!
 * jQuery UI 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI
 */
;jQuery.ui || (function($) {

//Helper functions and ui object
$.ui = {
	version: "1.8.1",

	// $.ui.plugin is deprecated.  Use the proxy pattern instead.
	plugin: {
		add: function(module, option, set) {
			var proto = $.ui[module].prototype;
			for(var i in set) {
				proto.plugins[i] = proto.plugins[i] || [];
				proto.plugins[i].push([option, set[i]]);
			}
		},
		call: function(instance, name, args) {
			var set = instance.plugins[name];
			if(!set || !instance.element[0].parentNode) { return; }

			for (var i = 0; i < set.length; i++) {
				if (instance.options[set[i][0]]) {
					set[i][1].apply(instance.element, args);
				}
			}
		}
	},

	contains: function(a, b) {
		return document.compareDocumentPosition
			? a.compareDocumentPosition(b) & 16
			: a !== b && a.contains(b);
	},

	hasScroll: function(el, a) {

		//If overflow is hidden, the element might have extra content, but the user wants to hide it
		if ($(el).css('overflow') == 'hidden') { return false; }

		var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop',
			has = false;

		if (el[scroll] > 0) { return true; }

		// TODO: determine which cases actually cause this to happen
		// if the element doesn't have the scroll set, see if it's possible to
		// set the scroll
		el[scroll] = 1;
		has = (el[scroll] > 0);
		el[scroll] = 0;
		return has;
	},

	isOverAxis: function(x, reference, size) {
		//Determines when x coordinate is over "b" element axis
		return (x > reference) && (x < (reference + size));
	},

	isOver: function(y, x, top, left, height, width) {
		//Determines when x, y coordinates is over "b" element
		return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width);
	},

	keyCode: {
		ALT: 18,
		BACKSPACE: 8,
		CAPS_LOCK: 20,
		COMMA: 188,
		CONTROL: 17,
		DELETE: 46,
		DOWN: 40,
		END: 35,
		ENTER: 13,
		ESCAPE: 27,
		HOME: 36,
		INSERT: 45,
		LEFT: 37,
		NUMPAD_ADD: 107,
		NUMPAD_DECIMAL: 110,
		NUMPAD_DIVIDE: 111,
		NUMPAD_ENTER: 108,
		NUMPAD_MULTIPLY: 106,
		NUMPAD_SUBTRACT: 109,
		PAGE_DOWN: 34,
		PAGE_UP: 33,
		PERIOD: 190,
		RIGHT: 39,
		SHIFT: 16,
		SPACE: 32,
		TAB: 9,
		UP: 38
	}
};

//jQuery plugins
$.fn.extend({
	_focus: $.fn.focus,
	focus: function(delay, fn) {
		return typeof delay === 'number'
			? this.each(function() {
				var elem = this;
				setTimeout(function() {
					$(elem).focus();
					(fn && fn.call(elem));
				}, delay);
			})
			: this._focus.apply(this, arguments);
	},
	
	enableSelection: function() {
		return this
			.attr('unselectable', 'off')
			.css('MozUserSelect', '');
	},

	disableSelection: function() {
		return this
			.attr('unselectable', 'on')
			.css('MozUserSelect', 'none');
	},

	scrollParent: function() {
		var scrollParent;
		if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
			scrollParent = this.parents().filter(function() {
				return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
			}).eq(0);
		} else {
			scrollParent = this.parents().filter(function() {
				return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
			}).eq(0);
		}

		return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
	},

	zIndex: function(zIndex) {
		if (zIndex !== undefined) {
			return this.css('zIndex', zIndex);
		}
		
		if (this.length) {
			var elem = $(this[0]), position, value;
			while (elem.length && elem[0] !== document) {
				// Ignore z-index if position is set to a value where z-index is ignored by the browser
				// This makes behavior of this function consistent across browsers
				// WebKit always returns auto if the element is positioned
				position = elem.css('position');
				if (position == 'absolute' || position == 'relative' || position == 'fixed')
				{
					// IE returns 0 when zIndex is not specified
					// other browsers return a string
					// we ignore the case of nested elements with an explicit value of 0
					// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
					value = parseInt(elem.css('zIndex'));
					if (!isNaN(value) && value != 0) {
						return value;
					}
				}
				elem = elem.parent();
			}
		}

		return 0;
	}
});


//Additional selectors
$.extend($.expr[':'], {
	data: function(elem, i, match) {
		return !!$.data(elem, match[3]);
	},

	focusable: function(element) {
		var nodeName = element.nodeName.toLowerCase(),
			tabIndex = $.attr(element, 'tabindex');
		return (/input|select|textarea|button|object/.test(nodeName)
			? !element.disabled
			: 'a' == nodeName || 'area' == nodeName
				? element.href || !isNaN(tabIndex)
				: !isNaN(tabIndex))
			// the element and all of its ancestors must be visible
			// the browser may report that the area is hidden
			&& !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length;
	},

	tabbable: function(element) {
		var tabIndex = $.attr(element, 'tabindex');
		return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(':focusable');
	}
});

})(jQuery);
/*!
 * jQuery UI Widget 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Widget
 */
(function( $ ) {

var _remove = $.fn.remove;

$.fn.remove = function( selector, keepData ) {
	return this.each(function() {
		if ( !keepData ) {
			if ( !selector || $.filter( selector, [ this ] ).length ) {
				$( "*", this ).add( this ).each(function() {
					$( this ).triggerHandler( "remove" );
				});
			}
		}
		return _remove.call( $(this), selector, keepData );
	});
};

$.widget = function( name, base, prototype ) {
	var namespace = name.split( "." )[ 0 ],
		fullName;
	name = name.split( "." )[ 1 ];
	fullName = namespace + "-" + name;

	if ( !prototype ) {
		prototype = base;
		base = $.Widget;
	}

	// create selector for plugin
	$.expr[ ":" ][ fullName ] = function( elem ) {
		return !!$.data( elem, name );
	};

	$[ namespace ] = $[ namespace ] || {};
	$[ namespace ][ name ] = function( options, element ) {
		// allow instantiation without initializing for simple inheritance
		if ( arguments.length ) {
			this._createWidget( options, element );
		}
	};

	var basePrototype = new base();
	// we need to make the options hash a property directly on the new instance
	// otherwise we'll modify the options hash on the prototype that we're
	// inheriting from
//	$.each( basePrototype, function( key, val ) {
//		if ( $.isPlainObject(val) ) {
//			basePrototype[ key ] = $.extend( {}, val );
//		}
//	});
	basePrototype.options = $.extend( {}, basePrototype.options );
	$[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
		namespace: namespace,
		widgetName: name,
		widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
		widgetBaseClass: fullName
	}, prototype );

	$.widget.bridge( name, $[ namespace ][ name ] );
};

$.widget.bridge = function( name, object ) {
	$.fn[ name ] = function( options ) {
		var isMethodCall = typeof options === "string",
			args = Array.prototype.slice.call( arguments, 1 ),
			returnValue = this;

		// allow multiple hashes to be passed on init
		options = !isMethodCall && args.length ?
			$.extend.apply( null, [ true, options ].concat(args) ) :
			options;

		// prevent calls to internal methods
		if ( isMethodCall && options.substring( 0, 1 ) === "_" ) {
			return returnValue;
		}

		if ( isMethodCall ) {
			this.each(function() {
				var instance = $.data( this, name ),
					methodValue = instance && $.isFunction( instance[options] ) ?
						instance[ options ].apply( instance, args ) :
						instance;
				if ( methodValue !== instance && methodValue !== undefined ) {
					returnValue = methodValue;
					return false;
				}
			});
		} else {
			this.each(function() {
				var instance = $.data( this, name );
				if ( instance ) {
					if ( options ) {
						instance.option( options );
					}
					instance._init();
				} else {
					$.data( this, name, new object( options, this ) );
				}
			});
		}

		return returnValue;
	};
};

$.Widget = function( options, element ) {
	// allow instantiation without initializing for simple inheritance
	if ( arguments.length ) {
		this._createWidget( options, element );
	}
};

$.Widget.prototype = {
	widgetName: "widget",
	widgetEventPrefix: "",
	options: {
		disabled: false
	},
	_createWidget: function( options, element ) {
		// $.widget.bridge stores the plugin instance, but we do it anyway
		// so that it's stored even before the _create function runs
		this.element = $( element ).data( this.widgetName, this );
		this.options = $.extend( true, {},
			this.options,
			$.metadata && $.metadata.get( element )[ this.widgetName ],
			options );

		var self = this;
		this.element.bind( "remove." + this.widgetName, function() {
			self.destroy();
		});

		this._create();
		this._init();
	},
	_create: function() {},
	_init: function() {},

	destroy: function() {
		this.element
			.unbind( "." + this.widgetName )
			.removeData( this.widgetName );
		this.widget()
			.unbind( "." + this.widgetName )
			.removeAttr( "aria-disabled" )
			.removeClass(
				this.widgetBaseClass + "-disabled " +
				"ui-state-disabled" );
	},

	widget: function() {
		return this.element;
	},

	option: function( key, value ) {
		var options = key,
			self = this;

		if ( arguments.length === 0 ) {
			// don't return a reference to the internal hash
			return $.extend( {}, self.options );
		}

		if  (typeof key === "string" ) {
			if ( value === undefined ) {
				return this.options[ key ];
			}
			options = {};
			options[ key ] = value;
		}

		$.each( options, function( key, value ) {
			self._setOption( key, value );
		});

		return self;
	},
	_setOption: function( key, value ) {
		this.options[ key ] = value;

		if ( key === "disabled" ) {
			this.widget()
				[ value ? "addClass" : "removeClass"](
					this.widgetBaseClass + "-disabled" + " " +
					"ui-state-disabled" )
				.attr( "aria-disabled", value );
		}

		return this;
	},

	enable: function() {
		return this._setOption( "disabled", false );
	},
	disable: function() {
		return this._setOption( "disabled", true );
	},

	_trigger: function( type, event, data ) {
		var callback = this.options[ type ];

		event = $.Event( event );
		event.type = ( type === this.widgetEventPrefix ?
			type :
			this.widgetEventPrefix + type ).toLowerCase();
		data = data || {};

		// copy original event properties over to the new event
		// this would happen if we could call $.event.fix instead of $.Event
		// but we don't have a way to force an event to be fixed multiple times
		if ( event.originalEvent ) {
			for ( var i = $.event.props.length, prop; i; ) {
				prop = $.event.props[ --i ];
				event[ prop ] = event.originalEvent[ prop ];
			}
		}

		this.element.trigger( event, data );

		return !( $.isFunction(callback) &&
			callback.call( this.element[0], event, data ) === false ||
			event.isDefaultPrevented() );
	}
};

})( jQuery );
/*!
 * jQuery UI Mouse 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Mouse
 *
 * Depends:
 *	jquery.ui.widget.js
 */
(function($) {

$.widget("ui.mouse", {
	options: {
		cancel: ':input,option',
		distance: 1,
		delay: 0
	},
	_mouseInit: function() {
		var self = this;

		this.element
			.bind('mousedown.'+this.widgetName, function(event) {
				return self._mouseDown(event);
			})
			.bind('click.'+this.widgetName, function(event) {
				if(self._preventClickEvent) {
					self._preventClickEvent = false;
					event.stopImmediatePropagation();
					return false;
				}
			});

		this.started = false;
	},

	// TODO: make sure destroying one instance of mouse doesn't mess with
	// other instances of mouse
	_mouseDestroy: function() {
		this.element.unbind('.'+this.widgetName);
	},

	_mouseDown: function(event) {
		// don't let more than one widget handle mouseStart
		// TODO: figure out why we have to use originalEvent
		event.originalEvent = event.originalEvent || {};
		if (event.originalEvent.mouseHandled) { return; }

		// we may have missed mouseup (out of window)
		(this._mouseStarted && this._mouseUp(event));

		this._mouseDownEvent = event;

		var self = this,
			btnIsLeft = (event.which == 1),
			elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
			return true;
		}

		this.mouseDelayMet = !this.options.delay;
		if (!this.mouseDelayMet) {
			this._mouseDelayTimer = setTimeout(function() {
				self.mouseDelayMet = true;
			}, this.options.delay);
		}

		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
			this._mouseStarted = (this._mouseStart(event) !== false);
			if (!this._mouseStarted) {
				event.preventDefault();
				return true;
			}
		}

		// these delegates are required to keep context
		this._mouseMoveDelegate = function(event) {
			return self._mouseMove(event);
		};
		this._mouseUpDelegate = function(event) {
			return self._mouseUp(event);
		};
		$(document)
			.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
			.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);

		// preventDefault() is used to prevent the selection of text here -
		// however, in Safari, this causes select boxes not to be selectable
		// anymore, so this fix is needed
		($.browser.safari || event.preventDefault());

		event.originalEvent.mouseHandled = true;
		return true;
	},

	_mouseMove: function(event) {
		// IE mouseup check - mouseup happened when mouse was out of window
		if ($.browser.msie && !event.button) {
			return this._mouseUp(event);
		}

		if (this._mouseStarted) {
			this._mouseDrag(event);
			return event.preventDefault();
		}

		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
			this._mouseStarted =
				(this._mouseStart(this._mouseDownEvent, event) !== false);
			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
		}

		return !this._mouseStarted;
	},

	_mouseUp: function(event) {
		$(document)
			.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
			.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);

		if (this._mouseStarted) {
			this._mouseStarted = false;
			this._preventClickEvent = (event.target == this._mouseDownEvent.target);
			this._mouseStop(event);
		}

		return false;
	},

	_mouseDistanceMet: function(event) {
		return (Math.max(
				Math.abs(this._mouseDownEvent.pageX - event.pageX),
				Math.abs(this._mouseDownEvent.pageY - event.pageY)
			) >= this.options.distance
		);
	},

	_mouseDelayMet: function(event) {
		return this.mouseDelayMet;
	},

	// These are placeholder methods, to be overriden by extending plugin
	_mouseStart: function(event) {},
	_mouseDrag: function(event) {},
	_mouseStop: function(event) {},
	_mouseCapture: function(event) { return true; }
});

})(jQuery);
/*
 * jQuery UI Position 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Position
 */
(function( $ ) {

$.ui = $.ui || {};

var horizontalPositions = /left|center|right/,
	horizontalDefault = "center",
	verticalPositions = /top|center|bottom/,
	verticalDefault = "center",
	_position = $.fn.position,
	_offset = $.fn.offset;

$.fn.position = function( options ) {
	if ( !options || !options.of ) {
		return _position.apply( this, arguments );
	}

	// make a copy, we don't want to modify arguments
	options = $.extend( {}, options );

	var target = $( options.of ),
		collision = ( options.collision || "flip" ).split( " " ),
		offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
		targetWidth,
		targetHeight,
		basePosition;

	if ( options.of.nodeType === 9 ) {
		targetWidth = target.width();
		targetHeight = target.height();
		basePosition = { top: 0, left: 0 };
	} else if ( options.of.scrollTo && options.of.document ) {
		targetWidth = target.width();
		targetHeight = target.height();
		basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
	} else if ( options.of.preventDefault ) {
		// force left top to allow flipping
		options.at = "left top";
		targetWidth = targetHeight = 0;
		basePosition = { top: options.of.pageY, left: options.of.pageX };
	} else {
		targetWidth = target.outerWidth();
		targetHeight = target.outerHeight();
		basePosition = target.offset();
	}

	// force my and at to have valid horizontal and veritcal positions
	// if a value is missing or invalid, it will be converted to center 
	$.each( [ "my", "at" ], function() {
		var pos = ( options[this] || "" ).split( " " );
		if ( pos.length === 1) {
			pos = horizontalPositions.test( pos[0] ) ?
				pos.concat( [verticalDefault] ) :
				verticalPositions.test( pos[0] ) ?
					[ horizontalDefault ].concat( pos ) :
					[ horizontalDefault, verticalDefault ];
		}
		pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : horizontalDefault;
		pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : verticalDefault;
		options[ this ] = pos;
	});

	// normalize collision option
	if ( collision.length === 1 ) {
		collision[ 1 ] = collision[ 0 ];
	}

	// normalize offset option
	offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
	if ( offset.length === 1 ) {
		offset[ 1 ] = offset[ 0 ];
	}
	offset[ 1 ] = parseInt( offset[1], 10 ) || 0;

	if ( options.at[0] === "right" ) {
		basePosition.left += targetWidth;
	} else if (options.at[0] === horizontalDefault ) {
		basePosition.left += targetWidth / 2;
	}

	if ( options.at[1] === "bottom" ) {
		basePosition.top += targetHeight;
	} else if ( options.at[1] === verticalDefault ) {
		basePosition.top += targetHeight / 2;
	}

	basePosition.left += offset[ 0 ];
	basePosition.top += offset[ 1 ];

	return this.each(function() {
		var elem = $( this ),
			elemWidth = elem.outerWidth(),
			elemHeight = elem.outerHeight(),
			position = $.extend( {}, basePosition );

		if ( options.my[0] === "right" ) {
			position.left -= elemWidth;
		} else if ( options.my[0] === horizontalDefault ) {
			position.left -= elemWidth / 2;
		}

		if ( options.my[1] === "bottom" ) {
			position.top -= elemHeight;
		} else if ( options.my[1] === verticalDefault ) {
			position.top -= elemHeight / 2;
		}

		// prevent fractions (see #5280)
		position.left = parseInt( position.left );
		position.top = parseInt( position.top );

		$.each( [ "left", "top" ], function( i, dir ) {
			if ( $.ui.position[ collision[i] ] ) {
				$.ui.position[ collision[i] ][ dir ]( position, {
					targetWidth: targetWidth,
					targetHeight: targetHeight,
					elemWidth: elemWidth,
					elemHeight: elemHeight,
					offset: offset,
					my: options.my,
					at: options.at
				});
			}
		});

		if ( $.fn.bgiframe ) {
			elem.bgiframe();
		}
		elem.offset( $.extend( position, { using: options.using } ) );
	});
};

$.ui.position = {
	fit: {
		left: function( position, data ) {
			var win = $( window ),
				over = position.left + data.elemWidth - win.width() - win.scrollLeft();
			position.left = over > 0 ? position.left - over : Math.max( 0, position.left );
		},
		top: function( position, data ) {
			var win = $( window ),
				over = position.top + data.elemHeight - win.height() - win.scrollTop();
			position.top = over > 0 ? position.top - over : Math.max( 0, position.top );
		}
	},

	flip: {
		left: function( position, data ) {
			if ( data.at[0] === "center" ) {
				return;
			}
			var win = $( window ),
				over = position.left + data.elemWidth - win.width() - win.scrollLeft(),
				myOffset = data.my[ 0 ] === "left" ?
					-data.elemWidth :
					data.my[ 0 ] === "right" ?
						data.elemWidth :
						0,
				offset = -2 * data.offset[ 0 ];
			position.left += position.left < 0 ?
				myOffset + data.targetWidth + offset :
				over > 0 ?
					myOffset - data.targetWidth + offset :
					0;
		},
		top: function( position, data ) {
			if ( data.at[1] === "center" ) {
				return;
			}
			var win = $( window ),
				over = position.top + data.elemHeight - win.height() - win.scrollTop(),
				myOffset = data.my[ 1 ] === "top" ?
					-data.elemHeight :
					data.my[ 1 ] === "bottom" ?
						data.elemHeight :
						0,
				atOffset = data.at[ 1 ] === "top" ?
					data.targetHeight :
					-data.targetHeight,
				offset = -2 * data.offset[ 1 ];
			position.top += position.top < 0 ?
				myOffset + data.targetHeight + offset :
				over > 0 ?
					myOffset + atOffset + offset :
					0;
		}
	}
};

// offset setter from jQuery 1.4
if ( !$.offset.setOffset ) {
	$.offset.setOffset = function( elem, options ) {
		// set position first, in-case top/left are set even on static elem
		if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
			elem.style.position = "relative";
		}
		var curElem   = $( elem ),
			curOffset = curElem.offset(),
			curTop    = parseInt( $.curCSS( elem, "top",  true ), 10 ) || 0,
			curLeft   = parseInt( $.curCSS( elem, "left", true ), 10)  || 0,
			props     = {
				top:  (options.top  - curOffset.top)  + curTop,
				left: (options.left - curOffset.left) + curLeft
			};
		
		if ( 'using' in options ) {
			options.using.call( elem, props );
		} else {
			curElem.css( props );
		}
	};

	$.fn.offset = function( options ) {
		var elem = this[ 0 ];
		if ( !elem || !elem.ownerDocument ) { return null; }
		if ( options ) { 
			return this.each(function() {
				$.offset.setOffset( this, options );
			});
		}
		return _offset.call( this );
	};
}

}( jQuery ));
/*
 * jQuery UI Draggable 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Draggables
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.mouse.js
 *	jquery.ui.widget.js
 */
(function($) {

$.widget("ui.draggable", $.ui.mouse, {
	widgetEventPrefix: "drag",
	options: {
		addClasses: true,
		appendTo: "parent",
		axis: false,
		connectToSortable: false,
		containment: false,
		cursor: "auto",
		cursorAt: false,
		grid: false,
		handle: false,
		helper: "original",
		iframeFix: false,
		opacity: false,
		refreshPositions: false,
		revert: false,
		revertDuration: 500,
		scope: "default",
		scroll: true,
		scrollSensitivity: 20,
		scrollSpeed: 20,
		snap: false,
		snapMode: "both",
		snapTolerance: 20,
		stack: false,
		zIndex: false
	},
	_create: function() {

		if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
			this.element[0].style.position = 'relative';

		(this.options.addClasses && this.element.addClass("ui-draggable"));
		(this.options.disabled && this.element.addClass("ui-draggable-disabled"));

		this._mouseInit();

	},

	destroy: function() {
		if(!this.element.data('draggable')) return;
		this.element
			.removeData("draggable")
			.unbind(".draggable")
			.removeClass("ui-draggable"
				+ " ui-draggable-dragging"
				+ " ui-draggable-disabled");
		this._mouseDestroy();

		return this;
	},

	_mouseCapture: function(event) {

		var o = this.options;

		// among others, prevent a drag on a resizable-handle
		if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
			return false;

		//Quit if we're not on a valid handle
		this.handle = this._getHandle(event);
		if (!this.handle)
			return false;

		return true;

	},

	_mouseStart: function(event) {

		var o = this.options;

		//Create and append the visible helper
		this.helper = this._createHelper(event);

		//Cache the helper size
		this._cacheHelperProportions();

		//If ddmanager is used for droppables, set the global draggable
		if($.ui.ddmanager)
			$.ui.ddmanager.current = this;

		/*
		 * - Position generation -
		 * This block generates everything position related - it's the core of draggables.
		 */

		//Cache the margins of the original element
		this._cacheMargins();

		//Store the helper's css position
		this.cssPosition = this.helper.css("position");
		this.scrollParent = this.helper.scrollParent();

		//The element's absolute position on the page minus margins
		this.offset = this.positionAbs = this.element.offset();
		this.offset = {
			top: this.offset.top - this.margins.top,
			left: this.offset.left - this.margins.left
		};

		$.extend(this.offset, {
			click: { //Where the click happened, relative to the element
				left: event.pageX - this.offset.left,
				top: event.pageY - this.offset.top
			},
			parent: this._getParentOffset(),
			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
		});

		//Generate the original position
		this.originalPosition = this.position = this._generatePosition(event);
		this.originalPageX = event.pageX;
		this.originalPageY = event.pageY;

		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));

		//Set a containment if given in the options
		if(o.containment)
			this._setContainment();

		//Trigger event + callbacks
		if(this._trigger("start", event) === false) {
			this._clear();
			return false;
		}

		//Recache the helper size
		this._cacheHelperProportions();

		//Prepare the droppable offsets
		if ($.ui.ddmanager && !o.dropBehaviour)
			$.ui.ddmanager.prepareOffsets(this, event);

		this.helper.addClass("ui-draggable-dragging");
		this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
		return true;
	},

	_mouseDrag: function(event, noPropagation) {

		//Compute the helpers position
		this.position = this._generatePosition(event);
		this.positionAbs = this._convertPositionTo("absolute");

		//Call plugins and callbacks and use the resulting position if something is returned
		if (!noPropagation) {
			var ui = this._uiHash();
			if(this._trigger('drag', event, ui) === false) {
				this._mouseUp({});
				return false;
			}
			this.position = ui.position;
		}

		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);

		return false;
	},

	_mouseStop: function(event) {

		//If we are using droppables, inform the manager about the drop
		var dropped = false;
		if ($.ui.ddmanager && !this.options.dropBehaviour)
			dropped = $.ui.ddmanager.drop(this, event);

		//if a drop comes from outside (a sortable)
		if(this.dropped) {
			dropped = this.dropped;
			this.dropped = false;
		}
		
		//if the original element is removed, don't bother to continue
		if(!this.element[0] || !this.element[0].parentNode)
			return false;

		if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
			var self = this;
			$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
				if(self._trigger("stop", event) !== false) {
					self._clear();
				}
			});
		} else {
			if(this._trigger("stop", event) !== false) {
				this._clear();
			}
		}

		return false;
	},
	
	cancel: function() {
		
		if(this.helper.is(".ui-draggable-dragging")) {
			this._mouseUp({});
		} else {
			this._clear();
		}
		
		return this;
		
	},

	_getHandle: function(event) {

		var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
		$(this.options.handle, this.element)
			.find("*")
			.andSelf()
			.each(function() {
				if(this == event.target) handle = true;
			});

		return handle;

	},

	_createHelper: function(event) {

		var o = this.options;
		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element);

		if(!helper.parents('body').length)
			helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));

		if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
			helper.css("position", "absolute");

		return helper;

	},

	_adjustOffsetFromHelper: function(obj) {
		if (typeof obj == 'string') {
			obj = obj.split(' ');
		}
		if ($.isArray(obj)) {
			obj = {left: +obj[0], top: +obj[1] || 0};
		}
		if ('left' in obj) {
			this.offset.click.left = obj.left + this.margins.left;
		}
		if ('right' in obj) {
			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
		}
		if ('top' in obj) {
			this.offset.click.top = obj.top + this.margins.top;
		}
		if ('bottom' in obj) {
			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
		}
	},

	_getParentOffset: function() {

		//Get the offsetParent and cache its position
		this.offsetParent = this.helper.offsetParent();
		var po = this.offsetParent.offset();

		// This is a special case where we need to modify a offset calculated on start, since the following happened:
		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
			po.left += this.scrollParent.scrollLeft();
			po.top += this.scrollParent.scrollTop();
		}

		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
			po = { top: 0, left: 0 };

		return {
			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
		};

	},

	_getRelativeOffset: function() {

		if(this.cssPosition == "relative") {
			var p = this.element.position();
			return {
				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
			};
		} else {
			return { top: 0, left: 0 };
		}

	},

	_cacheMargins: function() {
		this.margins = {
			left: (parseInt(this.element.css("marginLeft"),10) || 0),
			top: (parseInt(this.element.css("marginTop"),10) || 0)
		};
	},

	_cacheHelperProportions: function() {
		this.helperProportions = {
			width: this.helper.outerWidth(),
			height: this.helper.outerHeight()
		};
	},

	_setContainment: function() {

		var o = this.options;
		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
		if(o.containment == 'document' || o.containment == 'window') this.containment = [
			0 - this.offset.relative.left - this.offset.parent.left,
			0 - this.offset.relative.top - this.offset.parent.top,
			$(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
			($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
		];

		if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
			var ce = $(o.containment)[0]; if(!ce) return;
			var co = $(o.containment).offset();
			var over = ($(ce).css("overflow") != 'hidden');

			this.containment = [
				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
			];
		} else if(o.containment.constructor == Array) {
			this.containment = o.containment;
		}

	},

	_convertPositionTo: function(d, pos) {

		if(!pos) pos = this.position;
		var mod = d == "absolute" ? 1 : -1;
		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);

		return {
			top: (
				pos.top																	// The absolute mouse position
				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
				- ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
			),
			left: (
				pos.left																// The absolute mouse position
				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
				- ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
			)
		};

	},

	_generatePosition: function(event) {

		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
		var pageX = event.pageX;
		var pageY = event.pageY;

		/*
		 * - Position constraining -
		 * Constrain the position to a mix of grid, containment.
		 */

		if(this.originalPosition) { //If we are not dragging yet, we won't check for options

			if(this.containment) {
				if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
				if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
				if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
				if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
			}

			if(o.grid) {
				var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
				pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;

				var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
				pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
			}

		}

		return {
			top: (
				pageY																// The absolute mouse position
				- this.offset.click.top													// Click offset (relative to the element)
				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
				+ ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
			),
			left: (
				pageX																// The absolute mouse position
				- this.offset.click.left												// Click offset (relative to the element)
				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
				+ ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
			)
		};

	},

	_clear: function() {
		this.helper.removeClass("ui-draggable-dragging");
		if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
		//if($.ui.ddmanager) $.ui.ddmanager.current = null;
		this.helper = null;
		this.cancelHelperRemoval = false;
	},

	// From now on bulk stuff - mainly helpers

	_trigger: function(type, event, ui) {
		ui = ui || this._uiHash();
		$.ui.plugin.call(this, type, [event, ui]);
		if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
		return $.Widget.prototype._trigger.call(this, type, event, ui);
	},

	plugins: {},

	_uiHash: function(event) {
		return {
			helper: this.helper,
			position: this.position,
			originalPosition: this.originalPosition,
			offset: this.positionAbs
		};
	}

});

$.extend($.ui.draggable, {
	version: "1.8.1"
});

$.ui.plugin.add("draggable", "connectToSortable", {
	start: function(event, ui) {

		var inst = $(this).data("draggable"), o = inst.options,
			uiSortable = $.extend({}, ui, { item: inst.element });
		inst.sortables = [];
		$(o.connectToSortable).each(function() {
			var sortable = $.data(this, 'sortable');
			if (sortable && !sortable.options.disabled) {
				inst.sortables.push({
					instance: sortable,
					shouldRevert: sortable.options.revert
				});
				sortable._refreshItems();	//Do a one-time refresh at start to refresh the containerCache
				sortable._trigger("activate", event, uiSortable);
			}
		});

	},
	stop: function(event, ui) {

		//If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
		var inst = $(this).data("draggable"),
			uiSortable = $.extend({}, ui, { item: inst.element });

		$.each(inst.sortables, function() {
			if(this.instance.isOver) {

				this.instance.isOver = 0;

				inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
				this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)

				//The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
				if(this.shouldRevert) this.instance.options.revert = true;

				//Trigger the stop of the sortable
				this.instance._mouseStop(event);

				this.instance.options.helper = this.instance.options._helper;

				//If the helper has been the original item, restore properties in the sortable
				if(inst.options.helper == 'original')
					this.instance.currentItem.css({ top: 'auto', left: 'auto' });

			} else {
				this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
				this.instance._trigger("deactivate", event, uiSortable);
			}

		});

	},
	drag: function(event, ui) {

		var inst = $(this).data("draggable"), self = this;

		var checkPos = function(o) {
			var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
			var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
			var itemHeight = o.height, itemWidth = o.width;
			var itemTop = o.top, itemLeft = o.left;

			return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
		};

		$.each(inst.sortables, function(i) {
			
			//Copy over some variables to allow calling the sortable's native _intersectsWith
			this.instance.positionAbs = inst.positionAbs;
			this.instance.helperProportions = inst.helperProportions;
			this.instance.offset.click = inst.offset.click;
			
			if(this.instance._intersectsWith(this.instance.containerCache)) {

				//If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
				if(!this.instance.isOver) {

					this.instance.isOver = 1;
					//Now we fake the start of dragging for the sortable instance,
					//by cloning the list group item, appending it to the sortable and using it as inst.currentItem
					//We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
					this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true);
					this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
					this.instance.options.helper = function() { return ui.helper[0]; };

					event.target = this.instance.currentItem[0];
					this.instance._mouseCapture(event, true);
					this.instance._mouseStart(event, true, true);

					//Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
					this.instance.offset.click.top = inst.offset.click.top;
					this.instance.offset.click.left = inst.offset.click.left;
					this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
					this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;

					inst._trigger("toSortable", event);
					inst.dropped = this.instance.element; //draggable revert needs that
					//hack so receive/update callbacks work (mostly)
					inst.currentItem = inst.element;
					this.instance.fromOutside = inst;

				}

				//Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
				if(this.instance.currentItem) this.instance._mouseDrag(event);

			} else {

				//If it doesn't intersect with the sortable, and it intersected before,
				//we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
				if(this.instance.isOver) {

					this.instance.isOver = 0;
					this.instance.cancelHelperRemoval = true;
					
					//Prevent reverting on this forced stop
					this.instance.options.revert = false;
					
					// The out event needs to be triggered independently
					this.instance._trigger('out', event, this.instance._uiHash(this.instance));
					
					this.instance._mouseStop(event, true);
					this.instance.options.helper = this.instance.options._helper;

					//Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
					this.instance.currentItem.remove();
					if(this.instance.placeholder) this.instance.placeholder.remove();

					inst._trigger("fromSortable", event);
					inst.dropped = false; //draggable revert needs that
				}

			};

		});

	}
});

$.ui.plugin.add("draggable", "cursor", {
	start: function(event, ui) {
		var t = $('body'), o = $(this).data('draggable').options;
		if (t.css("cursor")) o._cursor = t.css("cursor");
		t.css("cursor", o.cursor);
	},
	stop: function(event, ui) {
		var o = $(this).data('draggable').options;
		if (o._cursor) $('body').css("cursor", o._cursor);
	}
});

$.ui.plugin.add("draggable", "iframeFix", {
	start: function(event, ui) {
		var o = $(this).data('draggable').options;
		$(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
			$('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
			.css({
				width: this.offsetWidth+"px", height: this.offsetHeight+"px",
				position: "absolute", opacity: "0.001", zIndex: 1000
			})
			.css($(this).offset())
			.appendTo("body");
		});
	},
	stop: function(event, ui) {
		$("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers
	}
});

$.ui.plugin.add("draggable", "opacity", {
	start: function(event, ui) {
		var t = $(ui.helper), o = $(this).data('draggable').options;
		if(t.css("opacity")) o._opacity = t.css("opacity");
		t.css('opacity', o.opacity);
	},
	stop: function(event, ui) {
		var o = $(this).data('draggable').options;
		if(o._opacity) $(ui.helper).css('opacity', o._opacity);
	}
});

$.ui.plugin.add("draggable", "scroll", {
	start: function(event, ui) {
		var i = $(this).data("draggable");
		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
	},
	drag: function(event, ui) {

		var i = $(this).data("draggable"), o = i.options, scrolled = false;

		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {

			if(!o.axis || o.axis != 'x') {
				if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
				else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
			}

			if(!o.axis || o.axis != 'y') {
				if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
				else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
			}

		} else {

			if(!o.axis || o.axis != 'x') {
				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
			}

			if(!o.axis || o.axis != 'y') {
				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
			}

		}

		if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
			$.ui.ddmanager.prepareOffsets(i, event);

	}
});

$.ui.plugin.add("draggable", "snap", {
	start: function(event, ui) {

		var i = $(this).data("draggable"), o = i.options;
		i.snapElements = [];

		$(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
			var $t = $(this); var $o = $t.offset();
			if(this != i.element[0]) i.snapElements.push({
				item: this,
				width: $t.outerWidth(), height: $t.outerHeight(),
				top: $o.top, left: $o.left
			});
		});

	},
	drag: function(event, ui) {

		var inst = $(this).data("draggable"), o = inst.options;
		var d = o.snapTolerance;

		var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;

		for (var i = inst.snapElements.length - 1; i >= 0; i--){

			var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
				t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;

			//Yes, I know, this is insane ;)
			if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
				if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
				inst.snapElements[i].snapping = false;
				continue;
			}

			if(o.snapMode != 'inner') {
				var ts = Math.abs(t - y2) <= d;
				var bs = Math.abs(b - y1) <= d;
				var ls = Math.abs(l - x2) <= d;
				var rs = Math.abs(r - x1) <= d;
				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
			}

			var first = (ts || bs || ls || rs);

			if(o.snapMode != 'outer') {
				var ts = Math.abs(t - y1) <= d;
				var bs = Math.abs(b - y2) <= d;
				var ls = Math.abs(l - x1) <= d;
				var rs = Math.abs(r - x2) <= d;
				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
			}

			if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
				(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
			inst.snapElements[i].snapping = (ts || bs || ls || rs || first);

		};

	}
});

$.ui.plugin.add("draggable", "stack", {
	start: function(event, ui) {

		var o = $(this).data("draggable").options;

		var group = $.makeArray($(o.stack)).sort(function(a,b) {
			return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
		});
		if (!group.length) { return; }
		
		var min = parseInt(group[0].style.zIndex) || 0;
		$(group).each(function(i) {
			this.style.zIndex = min + i;
		});

		this[0].style.zIndex = min + group.length;

	}
});

$.ui.plugin.add("draggable", "zIndex", {
	start: function(event, ui) {
		var t = $(ui.helper), o = $(this).data("draggable").options;
		if(t.css("zIndex")) o._zIndex = t.css("zIndex");
		t.css('zIndex', o.zIndex);
	},
	stop: function(event, ui) {
		var o = $(this).data("draggable").options;
		if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
	}
});

})(jQuery);
/*
 * jQuery UI Droppable 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Droppables
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.widget.js
 *	jquery.ui.mouse.js
 *	jquery.ui.draggable.js
 */
(function($) {

$.widget("ui.droppable", {
	widgetEventPrefix: "drop",
	options: {
		accept: '*',
		activeClass: false,
		addClasses: true,
		greedy: false,
		hoverClass: false,
		scope: 'default',
		tolerance: 'intersect'
	},
	_create: function() {

		var o = this.options, accept = o.accept;
		this.isover = 0; this.isout = 1;

		this.accept = $.isFunction(accept) ? accept : function(d) {
			return d.is(accept);
		};

		//Store the droppable's proportions
		this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };

		// Add the reference and positions to the manager
		$.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
		$.ui.ddmanager.droppables[o.scope].push(this);

		(o.addClasses && this.element.addClass("ui-droppable"));

	},

	destroy: function() {
		var drop = $.ui.ddmanager.droppables[this.options.scope];
		for ( var i = 0; i < drop.length; i++ )
			if ( drop[i] == this )
				drop.splice(i, 1);

		this.element
			.removeClass("ui-droppable ui-droppable-disabled")
			.removeData("droppable")
			.unbind(".droppable");

		return this;
	},

	_setOption: function(key, value) {

		if(key == 'accept') {
			this.accept = $.isFunction(value) ? value : function(d) {
				return d.is(value);
			};
		}
		$.Widget.prototype._setOption.apply(this, arguments);
	},

	_activate: function(event) {
		var draggable = $.ui.ddmanager.current;
		if(this.options.activeClass) this.element.addClass(this.options.activeClass);
		(draggable && this._trigger('activate', event, this.ui(draggable)));
	},

	_deactivate: function(event) {
		var draggable = $.ui.ddmanager.current;
		if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
		(draggable && this._trigger('deactivate', event, this.ui(draggable)));
	},

	_over: function(event) {

		var draggable = $.ui.ddmanager.current;
		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element

		if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
			if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
			this._trigger('over', event, this.ui(draggable));
		}

	},

	_out: function(event) {

		var draggable = $.ui.ddmanager.current;
		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element

		if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
			if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
			this._trigger('out', event, this.ui(draggable));
		}

	},

	_drop: function(event,custom) {

		var draggable = custom || $.ui.ddmanager.current;
		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element

		var childrenIntersection = false;
		this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
			var inst = $.data(this, 'droppable');
			if(
				inst.options.greedy
				&& !inst.options.disabled
				&& inst.options.scope == draggable.options.scope
				&& inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
				&& $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
			) { childrenIntersection = true; return false; }
		});
		if(childrenIntersection) return false;

		if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
			if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
			if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
			this._trigger('drop', event, this.ui(draggable));
			return this.element;
		}

		return false;

	},

	ui: function(c) {
		return {
			draggable: (c.currentItem || c.element),
			helper: c.helper,
			position: c.position,
			offset: c.positionAbs
		};
	}

});

$.extend($.ui.droppable, {
	version: "1.8.1"
});

$.ui.intersect = function(draggable, droppable, toleranceMode) {

	if (!droppable.offset) return false;

	var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
		y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
	var l = droppable.offset.left, r = l + droppable.proportions.width,
		t = droppable.offset.top, b = t + droppable.proportions.height;

	switch (toleranceMode) {
		case 'fit':
			return (l < x1 && x2 < r
				&& t < y1 && y2 < b);
			break;
		case 'intersect':
			return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
				&& x2 - (draggable.helperProportions.width / 2) < r // Left Half
				&& t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
				&& y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
			break;
		case 'pointer':
			var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
				draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
				isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
			return isOver;
			break;
		case 'touch':
			return (
					(y1 >= t && y1 <= b) ||	// Top edge touching
					(y2 >= t && y2 <= b) ||	// Bottom edge touching
					(y1 < t && y2 > b)		// Surrounded vertically
				) && (
					(x1 >= l && x1 <= r) ||	// Left edge touching
					(x2 >= l && x2 <= r) ||	// Right edge touching
					(x1 < l && x2 > r)		// Surrounded horizontally
				);
			break;
		default:
			return false;
			break;
		}

};

/*
	This manager tracks offsets of draggables and droppables
*/
$.ui.ddmanager = {
	current: null,
	droppables: { 'default': [] },
	prepareOffsets: function(t, event) {

		var m = $.ui.ddmanager.droppables[t.options.scope] || [];
		var type = event ? event.type : null; // workaround for #2317
		var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();

		droppablesLoop: for (var i = 0; i < m.length; i++) {

			if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue;	//No disabled and non-accepted
			for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
			m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; 									//If the element is not visible, continue

			m[i].offset = m[i].element.offset();
			m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };

			if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables

		}

	},
	drop: function(draggable, event) {

		var dropped = false;
		$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {

			if(!this.options) return;
			if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
				dropped = dropped || this._drop.call(this, event);

			if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
				this.isout = 1; this.isover = 0;
				this._deactivate.call(this, event);
			}

		});
		return dropped;

	},
	drag: function(draggable, event) {

		//If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
		if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);

		//Run through all droppables and check their positions based on specific tolerance options
		$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {

			if(this.options.disabled || this.greedyChild || !this.visible) return;
			var intersects = $.ui.intersect(draggable, this, this.options.tolerance);

			var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
			if(!c) return;

			var parentInstance;
			if (this.options.greedy) {
				var parent = this.element.parents(':data(droppable):eq(0)');
				if (parent.length) {
					parentInstance = $.data(parent[0], 'droppable');
					parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
				}
			}

			// we just moved into a greedy child
			if (parentInstance && c == 'isover') {
				parentInstance['isover'] = 0;
				parentInstance['isout'] = 1;
				parentInstance._out.call(parentInstance, event);
			}

			this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
			this[c == "isover" ? "_over" : "_out"].call(this, event);

			// we just moved out of a greedy child
			if (parentInstance && c == 'isout') {
				parentInstance['isout'] = 0;
				parentInstance['isover'] = 1;
				parentInstance._over.call(parentInstance, event);
			}
		});

	}
};

})(jQuery);
/*
 * jQuery UI Resizable 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Resizables
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.mouse.js
 *	jquery.ui.widget.js
 */
(function($) {

$.widget("ui.resizable", $.ui.mouse, {
	widgetEventPrefix: "resize",
	options: {
		alsoResize: false,
		animate: false,
		animateDuration: "slow",
		animateEasing: "swing",
		aspectRatio: false,
		autoHide: false,
		containment: false,
		ghost: false,
		grid: false,
		handles: "e,s,se",
		helper: false,
		maxHeight: null,
		maxWidth: null,
		minHeight: 10,
		minWidth: 10,
		zIndex: 1000
	},
	_create: function() {

		var self = this, o = this.options;
		this.element.addClass("ui-resizable");

		$.extend(this, {
			_aspectRatio: !!(o.aspectRatio),
			aspectRatio: o.aspectRatio,
			originalElement: this.element,
			_proportionallyResizeElements: [],
			_helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
		});

		//Wrap the element if it cannot hold child nodes
		if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {

			//Opera fix for relative positioning
			if (/relative/.test(this.element.css('position')) && $.browser.opera)
				this.element.css({ position: 'relative', top: 'auto', left: 'auto' });

			//Create a wrapper element and set the wrapper to the new current internal element
			this.element.wrap(
				$('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
					position: this.element.css('position'),
					width: this.element.outerWidth(),
					height: this.element.outerHeight(),
					top: this.element.css('top'),
					left: this.element.css('left')
				})
			);

			//Overwrite the original this.element
			this.element = this.element.parent().data(
				"resizable", this.element.data('resizable')
			);

			this.elementIsWrapper = true;

			//Move margins to the wrapper
			this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
			this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});

			//Prevent Safari textarea resize
			this.originalResizeStyle = this.originalElement.css('resize');
			this.originalElement.css('resize', 'none');

			//Push the actual element to our proportionallyResize internal array
			this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));

			// avoid IE jump (hard set the margin)
			this.originalElement.css({ margin: this.originalElement.css('margin') });

			// fix handlers offset
			this._proportionallyResize();

		}

		this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
		if(this.handles.constructor == String) {

			if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
			var n = this.handles.split(","); this.handles = {};

			for(var i = 0; i < n.length; i++) {

				var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
				var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');

				// increase zIndex of sw, se, ne, nw axis
				//TODO : this modifies original option
				if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });

				//TODO : What's going on here?
				if ('se' == handle) {
					axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
				};

				//Insert into internal handles object and append to element
				this.handles[handle] = '.ui-resizable-'+handle;
				this.element.append(axis);
			}

		}

		this._renderAxis = function(target) {

			target = target || this.element;

			for(var i in this.handles) {

				if(this.handles[i].constructor == String)
					this.handles[i] = $(this.handles[i], this.element).show();

				//Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
				if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {

					var axis = $(this.handles[i], this.element), padWrapper = 0;

					//Checking the correct pad and border
					padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();

					//The padding type i have to apply...
					var padPos = [ 'padding',
						/ne|nw|n/.test(i) ? 'Top' :
						/se|sw|s/.test(i) ? 'Bottom' :
						/^e$/.test(i) ? 'Right' : 'Left' ].join("");

					target.css(padPos, padWrapper);

					this._proportionallyResize();

				}

				//TODO: What's that good for? There's not anything to be executed left
				if(!$(this.handles[i]).length)
					continue;

			}
		};

		//TODO: make renderAxis a prototype function
		this._renderAxis(this.element);

		this._handles = $('.ui-resizable-handle', this.element)
			.disableSelection();

		//Matching axis name
		this._handles.mouseover(function() {
			if (!self.resizing) {
				if (this.className)
					var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
				//Axis, default = se
				self.axis = axis && axis[1] ? axis[1] : 'se';
			}
		});

		//If we want to auto hide the elements
		if (o.autoHide) {
			this._handles.hide();
			$(this.element)
				.addClass("ui-resizable-autohide")
				.hover(function() {
					$(this).removeClass("ui-resizable-autohide");
					self._handles.show();
				},
				function(){
					if (!self.resizing) {
						$(this).addClass("ui-resizable-autohide");
						self._handles.hide();
					}
				});
		}

		//Initialize the mouse interaction
		this._mouseInit();

	},

	destroy: function() {

		this._mouseDestroy();

		var _destroy = function(exp) {
			$(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
				.removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
		};

		//TODO: Unwrap at same DOM position
		if (this.elementIsWrapper) {
			_destroy(this.element);
			var wrapper = this.element;
			wrapper.after(
				this.originalElement.css({
					position: wrapper.css('position'),
					width: wrapper.outerWidth(),
					height: wrapper.outerHeight(),
					top: wrapper.css('top'),
					left: wrapper.css('left')
				})
			).remove();
		}

		this.originalElement.css('resize', this.originalResizeStyle);
		_destroy(this.originalElement);

		return this;
	},

	_mouseCapture: function(event) {
		var handle = false;
		for (var i in this.handles) {
			if ($(this.handles[i])[0] == event.target) {
				handle = true;
			}
		}

		return !this.options.disabled && handle;
	},

	_mouseStart: function(event) {

		var o = this.options, iniPos = this.element.position(), el = this.element;

		this.resizing = true;
		this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };

		// bugfix for http://dev.jquery.com/ticket/1749
		if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
			el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
		}

		//Opera fixing relative position
		if ($.browser.opera && (/relative/).test(el.css('position')))
			el.css({ position: 'relative', top: 'auto', left: 'auto' });

		this._renderProxy();

		var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));

		if (o.containment) {
			curleft += $(o.containment).scrollLeft() || 0;
			curtop += $(o.containment).scrollTop() || 0;
		}

		//Store needed variables
		this.offset = this.helper.offset();
		this.position = { left: curleft, top: curtop };
		this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
		this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
		this.originalPosition = { left: curleft, top: curtop };
		this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
		this.originalMousePosition = { left: event.pageX, top: event.pageY };

		//Aspect Ratio
		this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);

	    var cursor = $('.ui-resizable-' + this.axis).css('cursor');
	    $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);

		el.addClass("ui-resizable-resizing");
		this._propagate("start", event);
		return true;
	},

	_mouseDrag: function(event) {

		//Increase performance, avoid regex
		var el = this.helper, o = this.options, props = {},
			self = this, smp = this.originalMousePosition, a = this.axis;

		var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
		var trigger = this._change[a];
		if (!trigger) return false;

		// Calculate the attrs that will be change
		var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;

		if (this._aspectRatio || event.shiftKey)
			data = this._updateRatio(data, event);

		data = this._respectSize(data, event);

		// plugins callbacks need to be called first
		this._propagate("resize", event);

		el.css({
			top: this.position.top + "px", left: this.position.left + "px",
			width: this.size.width + "px", height: this.size.height + "px"
		});

		if (!this._helper && this._proportionallyResizeElements.length)
			this._proportionallyResize();

		this._updateCache(data);

		// calling the user callback at the end
		this._trigger('resize', event, this.ui());

		return false;
	},

	_mouseStop: function(event) {

		this.resizing = false;
		var o = this.options, self = this;

		if(this._helper) {
			var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
						soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
							soffsetw = ista ? 0 : self.sizeDiff.width;

			var s = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
				left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
				top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;

			if (!o.animate)
				this.element.css($.extend(s, { top: top, left: left }));

			self.helper.height(self.size.height);
			self.helper.width(self.size.width);

			if (this._helper && !o.animate) this._proportionallyResize();
		}

		$('body').css('cursor', 'auto');

		this.element.removeClass("ui-resizable-resizing");

		this._propagate("stop", event);

		if (this._helper) this.helper.remove();
		return false;

	},

	_updateCache: function(data) {
		var o = this.options;
		this.offset = this.helper.offset();
		if (isNumber(data.left)) this.position.left = data.left;
		if (isNumber(data.top)) this.position.top = data.top;
		if (isNumber(data.height)) this.size.height = data.height;
		if (isNumber(data.width)) this.size.width = data.width;
	},

	_updateRatio: function(data, event) {

		var o = this.options, cpos = this.position, csize = this.size, a = this.axis;

		if (data.height) data.width = (csize.height * this.aspectRatio);
		else if (data.width) data.height = (csize.width / this.aspectRatio);

		if (a == 'sw') {
			data.left = cpos.left + (csize.width - data.width);
			data.top = null;
		}
		if (a == 'nw') {
			data.top = cpos.top + (csize.height - data.height);
			data.left = cpos.left + (csize.width - data.width);
		}

		return data;
	},

	_respectSize: function(data, event) {

		var el = this.helper, o = this.options, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
				ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
					isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);

		if (isminw) data.width = o.minWidth;
		if (isminh) data.height = o.minHeight;
		if (ismaxw) data.width = o.maxWidth;
		if (ismaxh) data.height = o.maxHeight;

		var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
		var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);

		if (isminw && cw) data.left = dw - o.minWidth;
		if (ismaxw && cw) data.left = dw - o.maxWidth;
		if (isminh && ch)	data.top = dh - o.minHeight;
		if (ismaxh && ch)	data.top = dh - o.maxHeight;

		// fixing jump error on top/left - bug #2330
		var isNotwh = !data.width && !data.height;
		if (isNotwh && !data.left && data.top) data.top = null;
		else if (isNotwh && !data.top && data.left) data.left = null;

		return data;
	},

	_proportionallyResize: function() {

		var o = this.options;
		if (!this._proportionallyResizeElements.length) return;
		var element = this.helper || this.element;

		for (var i=0; i < this._proportionallyResizeElements.length; i++) {

			var prel = this._proportionallyResizeElements[i];

			if (!this.borderDif) {
				var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
					p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];

				this.borderDif = $.map(b, function(v, i) {
					var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
					return border + padding;
				});
			}

			if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
				continue;

			prel.css({
				height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
				width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
			});

		};

	},

	_renderProxy: function() {

		var el = this.element, o = this.options;
		this.elementOffset = el.offset();

		if(this._helper) {

			this.helper = this.helper || $('<div style="overflow:hidden;"></div>');

			// fix ie6 offset TODO: This seems broken
			var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
			pxyoffset = ( ie6 ? 2 : -1 );

			this.helper.addClass(this._helper).css({
				width: this.element.outerWidth() + pxyoffset,
				height: this.element.outerHeight() + pxyoffset,
				position: 'absolute',
				left: this.elementOffset.left - ie6offset +'px',
				top: this.elementOffset.top - ie6offset +'px',
				zIndex: ++o.zIndex //TODO: Don't modify option
			});

			this.helper
				.appendTo("body")
				.disableSelection();

		} else {
			this.helper = this.element;
		}

	},

	_change: {
		e: function(event, dx, dy) {
			return { width: this.originalSize.width + dx };
		},
		w: function(event, dx, dy) {
			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
			return { left: sp.left + dx, width: cs.width - dx };
		},
		n: function(event, dx, dy) {
			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
			return { top: sp.top + dy, height: cs.height - dy };
		},
		s: function(event, dx, dy) {
			return { height: this.originalSize.height + dy };
		},
		se: function(event, dx, dy) {
			return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
		},
		sw: function(event, dx, dy) {
			return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
		},
		ne: function(event, dx, dy) {
			return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
		},
		nw: function(event, dx, dy) {
			return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
		}
	},

	_propagate: function(n, event) {
		$.ui.plugin.call(this, n, [event, this.ui()]);
		(n != "resize" && this._trigger(n, event, this.ui()));
	},

	plugins: {},

	ui: function() {
		return {
			originalElement: this.originalElement,
			element: this.element,
			helper: this.helper,
			position: this.position,
			size: this.size,
			originalSize: this.originalSize,
			originalPosition: this.originalPosition
		};
	}

});

$.extend($.ui.resizable, {
	version: "1.8.1"
});

/*
 * Resizable Extensions
 */

$.ui.plugin.add("resizable", "alsoResize", {

	start: function(event, ui) {

		var self = $(this).data("resizable"), o = self.options;

		var _store = function(exp) {
			$(exp).each(function() {
				$(this).data("resizable-alsoresize", {
					width: parseInt($(this).width(), 10), height: parseInt($(this).height(), 10),
					left: parseInt($(this).css('left'), 10), top: parseInt($(this).css('top'), 10)
				});
			});
		};

		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
			if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0];	_store(o.alsoResize); }
			else { $.each(o.alsoResize, function(exp, c) { _store(exp); }); }
		}else{
			_store(o.alsoResize);
		}
	},

	resize: function(event, ui){
		var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;

		var delta = {
			height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
			top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
		},

		_alsoResize = function(exp, c) {
			$(exp).each(function() {
				var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, css = c && c.length ? c : ['width', 'height', 'top', 'left'];

				$.each(css || ['width', 'height', 'top', 'left'], function(i, prop) {
					var sum = (start[prop]||0) + (delta[prop]||0);
					if (sum && sum >= 0)
						style[prop] = sum || null;
				});

				//Opera fixing relative position
				if (/relative/.test(el.css('position')) && $.browser.opera) {
					self._revertToRelativePosition = true;
					el.css({ position: 'absolute', top: 'auto', left: 'auto' });
				}

				el.css(style);
			});
		};

		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
			$.each(o.alsoResize, function(exp, c) { _alsoResize(exp, c); });
		}else{
			_alsoResize(o.alsoResize);
		}
	},

	stop: function(event, ui){
		var self = $(this).data("resizable");

		//Opera fixing relative position
		if (self._revertToRelativePosition && $.browser.opera) {
			self._revertToRelativePosition = false;
			el.css({ position: 'relative' });
		}

		$(this).removeData("resizable-alsoresize-start");
	}
});

$.ui.plugin.add("resizable", "animate", {

	stop: function(event, ui) {
		var self = $(this).data("resizable"), o = self.options;

		var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
					soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
						soffsetw = ista ? 0 : self.sizeDiff.width;

		var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
					left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
						top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;

		self.element.animate(
			$.extend(style, top && left ? { top: top, left: left } : {}), {
				duration: o.animateDuration,
				easing: o.animateEasing,
				step: function() {

					var data = {
						width: parseInt(self.element.css('width'), 10),
						height: parseInt(self.element.css('height'), 10),
						top: parseInt(self.element.css('top'), 10),
						left: parseInt(self.element.css('left'), 10)
					};

					if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });

					// propagating resize, and updating values for each animation step
					self._updateCache(data);
					self._propagate("resize", event);

				}
			}
		);
	}

});

$.ui.plugin.add("resizable", "containment", {

	start: function(event, ui) {
		var self = $(this).data("resizable"), o = self.options, el = self.element;
		var oc = o.containment,	ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
		if (!ce) return;

		self.containerElement = $(ce);

		if (/document/.test(oc) || oc == document) {
			self.containerOffset = { left: 0, top: 0 };
			self.containerPosition = { left: 0, top: 0 };

			self.parentData = {
				element: $(document), left: 0, top: 0,
				width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
			};
		}

		// i'm a node, so compute top, left, right, bottom
		else {
			var element = $(ce), p = [];
			$([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });

			self.containerOffset = element.offset();
			self.containerPosition = element.position();
			self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };

			var co = self.containerOffset, ch = self.containerSize.height,	cw = self.containerSize.width,
						width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);

			self.parentData = {
				element: ce, left: co.left, top: co.top, width: width, height: height
			};
		}
	},

	resize: function(event, ui) {
		var self = $(this).data("resizable"), o = self.options,
				ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
				pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;

		if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;

		if (cp.left < (self._helper ? co.left : 0)) {
			self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
			if (pRatio) self.size.height = self.size.width / o.aspectRatio;
			self.position.left = o.helper ? co.left : 0;
		}

		if (cp.top < (self._helper ? co.top : 0)) {
			self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
			if (pRatio) self.size.width = self.size.height * o.aspectRatio;
			self.position.top = self._helper ? co.top : 0;
		}

		self.offset.left = self.parentData.left+self.position.left;
		self.offset.top = self.parentData.top+self.position.top;

		var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
					hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );

		var isParent = self.containerElement.get(0) == self.element.parent().get(0),
		    isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));

		if(isParent && isOffsetRelative) woset -= self.parentData.left;

		if (woset + self.size.width >= self.parentData.width) {
			self.size.width = self.parentData.width - woset;
			if (pRatio) self.size.height = self.size.width / self.aspectRatio;
		}

		if (hoset + self.size.height >= self.parentData.height) {
			self.size.height = self.parentData.height - hoset;
			if (pRatio) self.size.width = self.size.height * self.aspectRatio;
		}
	},

	stop: function(event, ui){
		var self = $(this).data("resizable"), o = self.options, cp = self.position,
				co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;

		var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;

		if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });

		if (self._helper && !o.animate && (/static/).test(ce.css('position')))
			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });

	}
});

$.ui.plugin.add("resizable", "ghost", {

	start: function(event, ui) {

		var self = $(this).data("resizable"), o = self.options, cs = self.size;

		self.ghost = self.originalElement.clone();
		self.ghost
			.css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
			.addClass('ui-resizable-ghost')
			.addClass(typeof o.ghost == 'string' ? o.ghost : '');

		self.ghost.appendTo(self.helper);

	},

	resize: function(event, ui){
		var self = $(this).data("resizable"), o = self.options;
		if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
	},

	stop: function(event, ui){
		var self = $(this).data("resizable"), o = self.options;
		if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
	}

});

$.ui.plugin.add("resizable", "grid", {

	resize: function(event, ui) {
		var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
		o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
		var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);

		if (/^(se|s|e)$/.test(a)) {
			self.size.width = os.width + ox;
			self.size.height = os.height + oy;
		}
		else if (/^(ne)$/.test(a)) {
			self.size.width = os.width + ox;
			self.size.height = os.height + oy;
			self.position.top = op.top - oy;
		}
		else if (/^(sw)$/.test(a)) {
			self.size.width = os.width + ox;
			self.size.height = os.height + oy;
			self.position.left = op.left - ox;
		}
		else {
			self.size.width = os.width + ox;
			self.size.height = os.height + oy;
			self.position.top = op.top - oy;
			self.position.left = op.left - ox;
		}
	}

});

var num = function(v) {
	return parseInt(v, 10) || 0;
};

var isNumber = function(value) {
	return !isNaN(parseInt(value, 10));
};

})(jQuery);
/*
 * jQuery UI Selectable 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Selectables
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.mouse.js
 *	jquery.ui.widget.js
 */
(function($) {

$.widget("ui.selectable", $.ui.mouse, {
	options: {
		appendTo: 'body',
		autoRefresh: true,
		distance: 0,
		filter: '*',
		tolerance: 'touch'
	},
	_create: function() {
		var self = this;

		this.element.addClass("ui-selectable");

		this.dragged = false;

		// cache selectee children based on filter
		var selectees;
		this.refresh = function() {
			selectees = $(self.options.filter, self.element[0]);
			selectees.each(function() {
				var $this = $(this);
				var pos = $this.offset();
				$.data(this, "selectable-item", {
					element: this,
					$element: $this,
					left: pos.left,
					top: pos.top,
					right: pos.left + $this.outerWidth(),
					bottom: pos.top + $this.outerHeight(),
					startselected: false,
					selected: $this.hasClass('ui-selected'),
					selecting: $this.hasClass('ui-selecting'),
					unselecting: $this.hasClass('ui-unselecting')
				});
			});
		};
		this.refresh();

		this.selectees = selectees.addClass("ui-selectee");

		this._mouseInit();

		this.helper = $(document.createElement('div'))
			.css({border:'1px dotted black'})
			.addClass("ui-selectable-helper");
	},

	destroy: function() {
		this.selectees
			.removeClass("ui-selectee")
			.removeData("selectable-item");
		this.element
			.removeClass("ui-selectable ui-selectable-disabled")
			.removeData("selectable")
			.unbind(".selectable");
		this._mouseDestroy();

		return this;
	},

	_mouseStart: function(event) {
		var self = this;

		this.opos = [event.pageX, event.pageY];

		if (this.options.disabled)
			return;

		var options = this.options;

		this.selectees = $(options.filter, this.element[0]);

		this._trigger("start", event);

		$(options.appendTo).append(this.helper);
		// position helper (lasso)
		this.helper.css({
			"z-index": 100,
			"position": "absolute",
			"left": event.clientX,
			"top": event.clientY,
			"width": 0,
			"height": 0
		});

		if (options.autoRefresh) {
			this.refresh();
		}

		this.selectees.filter('.ui-selected').each(function() {
			var selectee = $.data(this, "selectable-item");
			selectee.startselected = true;
			if (!event.metaKey) {
				selectee.$element.removeClass('ui-selected');
				selectee.selected = false;
				selectee.$element.addClass('ui-unselecting');
				selectee.unselecting = true;
				// selectable UNSELECTING callback
				self._trigger("unselecting", event, {
					unselecting: selectee.element
				});
			}
		});

		$(event.target).parents().andSelf().each(function() {
			var selectee = $.data(this, "selectable-item");
			if (selectee) {
				selectee.$element.removeClass("ui-unselecting").addClass('ui-selecting');
				selectee.unselecting = false;
				selectee.selecting = true;
				selectee.selected = true;
				// selectable SELECTING callback
				self._trigger("selecting", event, {
					selecting: selectee.element
				});
				return false;
			}
		});

	},

	_mouseDrag: function(event) {
		var self = this;
		this.dragged = true;

		if (this.options.disabled)
			return;

		var options = this.options;

		var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
		if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
		if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
		this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});

		this.selectees.each(function() {
			var selectee = $.data(this, "selectable-item");
			//prevent helper from being selected if appendTo: selectable
			if (!selectee || selectee.element == self.element[0])
				return;
			var hit = false;
			if (options.tolerance == 'touch') {
				hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
			} else if (options.tolerance == 'fit') {
				hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
			}

			if (hit) {
				// SELECT
				if (selectee.selected) {
					selectee.$element.removeClass('ui-selected');
					selectee.selected = false;
				}
				if (selectee.unselecting) {
					selectee.$element.removeClass('ui-unselecting');
					selectee.unselecting = false;
				}
				if (!selectee.selecting) {
					selectee.$element.addClass('ui-selecting');
					selectee.selecting = true;
					// selectable SELECTING callback
					self._trigger("selecting", event, {
						selecting: selectee.element
					});
				}
			} else {
				// UNSELECT
				if (selectee.selecting) {
					if (event.metaKey && selectee.startselected) {
						selectee.$element.removeClass('ui-selecting');
						selectee.selecting = false;
						selectee.$element.addClass('ui-selected');
						selectee.selected = true;
					} else {
						selectee.$element.removeClass('ui-selecting');
						selectee.selecting = false;
						if (selectee.startselected) {
							selectee.$element.addClass('ui-unselecting');
							selectee.unselecting = true;
						}
						// selectable UNSELECTING callback
						self._trigger("unselecting", event, {
							unselecting: selectee.element
						});
					}
				}
				if (selectee.selected) {
					if (!event.metaKey && !selectee.startselected) {
						selectee.$element.removeClass('ui-selected');
						selectee.selected = false;

						selectee.$element.addClass('ui-unselecting');
						selectee.unselecting = true;
						// selectable UNSELECTING callback
						self._trigger("unselecting", event, {
							unselecting: selectee.element
						});
					}
				}
			}
		});

		return false;
	},

	_mouseStop: function(event) {
		var self = this;

		this.dragged = false;

		var options = this.options;

		$('.ui-unselecting', this.element[0]).each(function() {
			var selectee = $.data(this, "selectable-item");
			selectee.$element.removeClass('ui-unselecting');
			selectee.unselecting = false;
			selectee.startselected = false;
			self._trigger("unselected", event, {
				unselected: selectee.element
			});
		});
		$('.ui-selecting', this.element[0]).each(function() {
			var selectee = $.data(this, "selectable-item");
			selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
			selectee.selecting = false;
			selectee.selected = true;
			selectee.startselected = true;
			self._trigger("selected", event, {
				selected: selectee.element
			});
		});
		this._trigger("stop", event);

		this.helper.remove();

		return false;
	}

});

$.extend($.ui.selectable, {
	version: "1.8.1"
});

})(jQuery);
/*
 * jQuery UI Sortable 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Sortables
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.mouse.js
 *	jquery.ui.widget.js
 */
(function($) {

$.widget("ui.sortable", $.ui.mouse, {
	widgetEventPrefix: "sort",
	options: {
		appendTo: "parent",
		axis: false,
		connectWith: false,
		containment: false,
		cursor: 'auto',
		cursorAt: false,
		dropOnEmpty: true,
		forcePlaceholderSize: false,
		forceHelperSize: false,
		grid: false,
		handle: false,
		helper: "original",
		items: '> *',
		opacity: false,
		placeholder: false,
		revert: false,
		scroll: true,
		scrollSensitivity: 20,
		scrollSpeed: 20,
		scope: "default",
		tolerance: "intersect",
		zIndex: 1000
	},
	_create: function() {

		var o = this.options;
		this.containerCache = {};
		this.element.addClass("ui-sortable");

		//Get the items
		this.refresh();

		//Let's determine if the items are floating
		this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) : false;

		//Let's determine the parent's offset
		this.offset = this.element.offset();

		//Initialize mouse events for interaction
		this._mouseInit();

	},

	destroy: function() {
		this.element
			.removeClass("ui-sortable ui-sortable-disabled")
			.removeData("sortable")
			.unbind(".sortable");
		this._mouseDestroy();

		for ( var i = this.items.length - 1; i >= 0; i-- )
			this.items[i].item.removeData("sortable-item");

		return this;
	},

	_setOption: function(key, value){
		if ( key === "disabled" ) {
			this.options[ key ] = value;
	
			this.widget()
				[ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
		} else {
			// Don't call widget base _setOption for disable as it adds ui-state-disabled class
			$.Widget.prototype._setOption.apply(self, arguments);
		}
	},

	_mouseCapture: function(event, overrideHandle) {

		if (this.reverting) {
			return false;
		}

		if(this.options.disabled || this.options.type == 'static') return false;

		//We have to refresh the items data once first
		this._refreshItems(event);

		//Find out if the clicked node (or one of its parents) is a actual item in this.items
		var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
			if($.data(this, 'sortable-item') == self) {
				currentItem = $(this);
				return false;
			}
		});
		if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target);

		if(!currentItem) return false;
		if(this.options.handle && !overrideHandle) {
			var validHandle = false;

			$(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
			if(!validHandle) return false;
		}

		this.currentItem = currentItem;
		this._removeCurrentsFromItems();
		return true;

	},

	_mouseStart: function(event, overrideHandle, noActivation) {

		var o = this.options, self = this;
		this.currentContainer = this;

		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
		this.refreshPositions();

		//Create and append the visible helper
		this.helper = this._createHelper(event);

		//Cache the helper size
		this._cacheHelperProportions();

		/*
		 * - Position generation -
		 * This block generates everything position related - it's the core of draggables.
		 */

		//Cache the margins of the original element
		this._cacheMargins();

		//Get the next scrolling parent
		this.scrollParent = this.helper.scrollParent();

		//The element's absolute position on the page minus margins
		this.offset = this.currentItem.offset();
		this.offset = {
			top: this.offset.top - this.margins.top,
			left: this.offset.left - this.margins.left
		};

		// Only after we got the offset, we can change the helper's position to absolute
		// TODO: Still need to figure out a way to make relative sorting possible
		this.helper.css("position", "absolute");
		this.cssPosition = this.helper.css("position");

		$.extend(this.offset, {
			click: { //Where the click happened, relative to the element
				left: event.pageX - this.offset.left,
				top: event.pageY - this.offset.top
			},
			parent: this._getParentOffset(),
			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
		});

		//Generate the original position
		this.originalPosition = this._generatePosition(event);
		this.originalPageX = event.pageX;
		this.originalPageY = event.pageY;

		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));

		//Cache the former DOM position
		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };

		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
		if(this.helper[0] != this.currentItem[0]) {
			this.currentItem.hide();
		}

		//Create the placeholder
		this._createPlaceholder();

		//Set a containment if given in the options
		if(o.containment)
			this._setContainment();

		if(o.cursor) { // cursor option
			if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
			$('body').css("cursor", o.cursor);
		}

		if(o.opacity) { // opacity option
			if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
			this.helper.css("opacity", o.opacity);
		}

		if(o.zIndex) { // zIndex option
			if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
			this.helper.css("zIndex", o.zIndex);
		}

		//Prepare scrolling
		if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
			this.overflowOffset = this.scrollParent.offset();

		//Call callbacks
		this._trigger("start", event, this._uiHash());

		//Recache the helper size
		if(!this._preserveHelperProportions)
			this._cacheHelperProportions();


		//Post 'activate' events to possible containers
		if(!noActivation) {
			 for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
		}

		//Prepare possible droppables
		if($.ui.ddmanager)
			$.ui.ddmanager.current = this;

		if ($.ui.ddmanager && !o.dropBehaviour)
			$.ui.ddmanager.prepareOffsets(this, event);

		this.dragging = true;

		this.helper.addClass("ui-sortable-helper");
		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
		return true;

	},

	_mouseDrag: function(event) {

		//Compute the helpers position
		this.position = this._generatePosition(event);
		this.positionAbs = this._convertPositionTo("absolute");

		if (!this.lastPositionAbs) {
			this.lastPositionAbs = this.positionAbs;
		}

		//Do scrolling
		if(this.options.scroll) {
			var o = this.options, scrolled = false;
			if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {

				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
				else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;

				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
				else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;

			} else {

				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);

				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);

			}

			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
				$.ui.ddmanager.prepareOffsets(this, event);
		}

		//Regenerate the absolute position used for position checks
		this.positionAbs = this._convertPositionTo("absolute");

		//Set the helper position
		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';

		//Rearrange
		for (var i = this.items.length - 1; i >= 0; i--) {

			//Cache variables and intersection, continue if no intersection
			var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
			if (!intersection) continue;

			if(itemElement != this.currentItem[0] //cannot intersect with itself
				&&	this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
				&&	!$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
				&& (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
				//&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
			) {

				this.direction = intersection == 1 ? "down" : "up";

				if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
					this._rearrange(event, item);
				} else {
					break;
				}

				this._trigger("change", event, this._uiHash());
				break;
			}
		}

		//Post events to containers
		this._contactContainers(event);

		//Interconnect with droppables
		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);

		//Call callbacks
		this._trigger('sort', event, this._uiHash());

		this.lastPositionAbs = this.positionAbs;
		return false;

	},

	_mouseStop: function(event, noPropagation) {

		if(!event) return;

		//If we are using droppables, inform the manager about the drop
		if ($.ui.ddmanager && !this.options.dropBehaviour)
			$.ui.ddmanager.drop(this, event);

		if(this.options.revert) {
			var self = this;
			var cur = self.placeholder.offset();

			self.reverting = true;

			$(this.helper).animate({
				left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
				top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
			}, parseInt(this.options.revert, 10) || 500, function() {
				self._clear(event);
			});
		} else {
			this._clear(event, noPropagation);
		}

		return false;

	},

	cancel: function() {

		var self = this;

		if(this.dragging) {

			this._mouseUp();

			if(this.options.helper == "original")
				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
			else
				this.currentItem.show();

			//Post deactivating events to containers
			for (var i = this.containers.length - 1; i >= 0; i--){
				this.containers[i]._trigger("deactivate", null, self._uiHash(this));
				if(this.containers[i].containerCache.over) {
					this.containers[i]._trigger("out", null, self._uiHash(this));
					this.containers[i].containerCache.over = 0;
				}
			}

		}

		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
		if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
		if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();

		$.extend(this, {
			helper: null,
			dragging: false,
			reverting: false,
			_noFinalSort: null
		});

		if(this.domPosition.prev) {
			$(this.domPosition.prev).after(this.currentItem);
		} else {
			$(this.domPosition.parent).prepend(this.currentItem);
		}

		return this;

	},

	serialize: function(o) {

		var items = this._getItemsAsjQuery(o && o.connected);
		var str = []; o = o || {};

		$(items).each(function() {
			var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
			if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
		});

		return str.join('&');

	},

	toArray: function(o) {

		var items = this._getItemsAsjQuery(o && o.connected);
		var ret = []; o = o || {};

		items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
		return ret;

	},

	/* Be careful with the following core functions */
	_intersectsWith: function(item) {

		var x1 = this.positionAbs.left,
			x2 = x1 + this.helperProportions.width,
			y1 = this.positionAbs.top,
			y2 = y1 + this.helperProportions.height;

		var l = item.left,
			r = l + item.width,
			t = item.top,
			b = t + item.height;

		var dyClick = this.offset.click.top,
			dxClick = this.offset.click.left;

		var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;

		if(	   this.options.tolerance == "pointer"
			|| this.options.forcePointerForContainers
			|| (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
		) {
			return isOverElement;
		} else {

			return (l < x1 + (this.helperProportions.width / 2) // Right Half
				&& x2 - (this.helperProportions.width / 2) < r // Left Half
				&& t < y1 + (this.helperProportions.height / 2) // Bottom Half
				&& y2 - (this.helperProportions.height / 2) < b ); // Top Half

		}
	},

	_intersectsWithPointer: function(item) {

		var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
			isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
			isOverElement = isOverElementHeight && isOverElementWidth,
			verticalDirection = this._getDragVerticalDirection(),
			horizontalDirection = this._getDragHorizontalDirection();

		if (!isOverElement)
			return false;

		return this.floating ?
			( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
			: ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );

	},

	_intersectsWithSides: function(item) {

		var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
			isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
			verticalDirection = this._getDragVerticalDirection(),
			horizontalDirection = this._getDragHorizontalDirection();

		if (this.floating && horizontalDirection) {
			return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
		} else {
			return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
		}

	},

	_getDragVerticalDirection: function() {
		var delta = this.positionAbs.top - this.lastPositionAbs.top;
		return delta != 0 && (delta > 0 ? "down" : "up");
	},

	_getDragHorizontalDirection: function() {
		var delta = this.positionAbs.left - this.lastPositionAbs.left;
		return delta != 0 && (delta > 0 ? "right" : "left");
	},

	refresh: function(event) {
		this._refreshItems(event);
		this.refreshPositions();
		return this;
	},

	_connectWith: function() {
		var options = this.options;
		return options.connectWith.constructor == String
			? [options.connectWith]
			: options.connectWith;
	},
	
	_getItemsAsjQuery: function(connected) {

		var self = this;
		var items = [];
		var queries = [];
		var connectWith = this._connectWith();

		if(connectWith && connected) {
			for (var i = connectWith.length - 1; i >= 0; i--){
				var cur = $(connectWith[i]);
				for (var j = cur.length - 1; j >= 0; j--){
					var inst = $.data(cur[j], 'sortable');
					if(inst && inst != this && !inst.options.disabled) {
						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
					}
				};
			};
		}

		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);

		for (var i = queries.length - 1; i >= 0; i--){
			queries[i][0].each(function() {
				items.push(this);
			});
		};

		return $(items);

	},

	_removeCurrentsFromItems: function() {

		var list = this.currentItem.find(":data(sortable-item)");

		for (var i=0; i < this.items.length; i++) {

			for (var j=0; j < list.length; j++) {
				if(list[j] == this.items[i].item[0])
					this.items.splice(i,1);
			};

		};

	},

	_refreshItems: function(event) {

		this.items = [];
		this.containers = [this];
		var items = this.items;
		var self = this;
		var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
		var connectWith = this._connectWith();

		if(connectWith) {
			for (var i = connectWith.length - 1; i >= 0; i--){
				var cur = $(connectWith[i]);
				for (var j = cur.length - 1; j >= 0; j--){
					var inst = $.data(cur[j], 'sortable');
					if(inst && inst != this && !inst.options.disabled) {
						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
						this.containers.push(inst);
					}
				};
			};
		}

		for (var i = queries.length - 1; i >= 0; i--) {
			var targetData = queries[i][1];
			var _queries = queries[i][0];

			for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
				var item = $(_queries[j]);

				item.data('sortable-item', targetData); // Data for target checking (mouse manager)

				items.push({
					item: item,
					instance: targetData,
					width: 0, height: 0,
					left: 0, top: 0
				});
			};
		};

	},

	refreshPositions: function(fast) {

		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
		if(this.offsetParent && this.helper) {
			this.offset.parent = this._getParentOffset();
		}

		for (var i = this.items.length - 1; i >= 0; i--){
			var item = this.items[i];

			var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;

			if (!fast) {
				item.width = t.outerWidth();
				item.height = t.outerHeight();
			}

			var p = t.offset();
			item.left = p.left;
			item.top = p.top;
		};

		if(this.options.custom && this.options.custom.refreshContainers) {
			this.options.custom.refreshContainers.call(this);
		} else {
			for (var i = this.containers.length - 1; i >= 0; i--){
				var p = this.containers[i].element.offset();
				this.containers[i].containerCache.left = p.left;
				this.containers[i].containerCache.top = p.top;
				this.containers[i].containerCache.width	= this.containers[i].element.outerWidth();
				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
			};
		}

		return this;
	},

	_createPlaceholder: function(that) {

		var self = that || this, o = self.options;

		if(!o.placeholder || o.placeholder.constructor == String) {
			var className = o.placeholder;
			o.placeholder = {
				element: function() {

					var el = $(document.createElement(self.currentItem[0].nodeName))
						.addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
						.removeClass("ui-sortable-helper")[0];

					if(!className)
						el.style.visibility = "hidden";

					return el;
				},
				update: function(container, p) {

					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
					if(className && !o.forcePlaceholderSize) return;

					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
					if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
					if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
				}
			};
		}

		//Create the placeholder
		self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));

		//Append it after the actual current item
		self.currentItem.after(self.placeholder);

		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
		o.placeholder.update(self, self.placeholder);

	},

	_contactContainers: function(event) {
		
		// get innermost container that intersects with item 
		var innermostContainer = null, innermostIndex = null;		
		
		
		for (var i = this.containers.length - 1; i >= 0; i--){

			// never consider a container that's located within the item itself 
			if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
				continue;

			if(this._intersectsWith(this.containers[i].containerCache)) {

				// if we've already found a container and it's more "inner" than this, then continue 
				if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
					continue;

				innermostContainer = this.containers[i]; 
				innermostIndex = i;
					
			} else {
				// container doesn't intersect. trigger "out" event if necessary 
				if(this.containers[i].containerCache.over) {
					this.containers[i]._trigger("out", event, this._uiHash(this));
					this.containers[i].containerCache.over = 0;
				}
			}

		}
		
		// if no intersecting containers found, return 
		if(!innermostContainer) return; 

		// move the item into the container if it's not there already
		if(this.containers.length === 1) {
			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
			this.containers[innermostIndex].containerCache.over = 1;
		} else if(this.currentContainer != this.containers[innermostIndex]) { 

			//When entering a new container, we will find the item with the least distance and append our item near it 
			var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top']; 
			for (var j = this.items.length - 1; j >= 0; j--) { 
				if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue; 
				var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top']; 
				if(Math.abs(cur - base) < dist) { 
					dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; 
				} 
			} 

			if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled 
				return; 

			this.currentContainer = this.containers[innermostIndex]; 
			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); 
			this._trigger("change", event, this._uiHash()); 
			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); 

			//Update the placeholder 
			this.options.placeholder.update(this.currentContainer, this.placeholder); 
		
			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); 
			this.containers[innermostIndex].containerCache.over = 1;
		} 
	
		
	},

	_createHelper: function(event) {

		var o = this.options;
		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);

		if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
			$(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);

		if(helper[0] == this.currentItem[0])
			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };

		if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
		if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());

		return helper;

	},

	_adjustOffsetFromHelper: function(obj) {
		if (typeof obj == 'string') {
			obj = obj.split(' ');
		}
		if ($.isArray(obj)) {
			obj = {left: +obj[0], top: +obj[1] || 0};
		}
		if ('left' in obj) {
			this.offset.click.left = obj.left + this.margins.left;
		}
		if ('right' in obj) {
			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
		}
		if ('top' in obj) {
			this.offset.click.top = obj.top + this.margins.top;
		}
		if ('bottom' in obj) {
			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
		}
	},

	_getParentOffset: function() {


		//Get the offsetParent and cache its position
		this.offsetParent = this.helper.offsetParent();
		var po = this.offsetParent.offset();

		// This is a special case where we need to modify a offset calculated on start, since the following happened:
		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
			po.left += this.scrollParent.scrollLeft();
			po.top += this.scrollParent.scrollTop();
		}

		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
			po = { top: 0, left: 0 };

		return {
			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
		};

	},

	_getRelativeOffset: function() {

		if(this.cssPosition == "relative") {
			var p = this.currentItem.position();
			return {
				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
			};
		} else {
			return { top: 0, left: 0 };
		}

	},

	_cacheMargins: function() {
		this.margins = {
			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
		};
	},

	_cacheHelperProportions: function() {
		this.helperProportions = {
			width: this.helper.outerWidth(),
			height: this.helper.outerHeight()
		};
	},

	_setContainment: function() {

		var o = this.options;
		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
		if(o.containment == 'document' || o.containment == 'window') this.containment = [
			0 - this.offset.relative.left - this.offset.parent.left,
			0 - this.offset.relative.top - this.offset.parent.top,
			$(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
			($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
		];

		if(!(/^(document|window|parent)$/).test(o.containment)) {
			var ce = $(o.containment)[0];
			var co = $(o.containment).offset();
			var over = ($(ce).css("overflow") != 'hidden');

			this.containment = [
				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
			];
		}

	},

	_convertPositionTo: function(d, pos) {

		if(!pos) pos = this.position;
		var mod = d == "absolute" ? 1 : -1;
		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);

		return {
			top: (
				pos.top																	// The absolute mouse position
				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
			),
			left: (
				pos.left																// The absolute mouse position
				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
			)
		};

	},

	_generatePosition: function(event) {

		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);

		// This is another very weird special case that only happens for relative elements:
		// 1. If the css position is relative
		// 2. and the scroll parent is the document or similar to the offset parent
		// we have to refresh the relative offset during the scroll so there are no jumps
		if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
			this.offset.relative = this._getRelativeOffset();
		}

		var pageX = event.pageX;
		var pageY = event.pageY;

		/*
		 * - Position constraining -
		 * Constrain the position to a mix of grid, containment.
		 */

		if(this.originalPosition) { //If we are not dragging yet, we won't check for options

			if(this.containment) {
				if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
				if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
				if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
				if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
			}

			if(o.grid) {
				var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
				pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;

				var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
				pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
			}

		}

		return {
			top: (
				pageY																// The absolute mouse position
				- this.offset.click.top													// Click offset (relative to the element)
				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
			),
			left: (
				pageX																// The absolute mouse position
				- this.offset.click.left												// Click offset (relative to the element)
				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
			)
		};

	},

	_rearrange: function(event, i, a, hardRefresh) {

		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));

		//Various things done here to improve the performance:
		// 1. we create a setTimeout, that calls refreshPositions
		// 2. on the instance, we have a counter variable, that get's higher after every append
		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
		// 4. this lets only the last addition to the timeout stack through
		this.counter = this.counter ? ++this.counter : 1;
		var self = this, counter = this.counter;

		window.setTimeout(function() {
			if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
		},0);

	},

	_clear: function(event, noPropagation) {

		this.reverting = false;
		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
		// everything else normalized again
		var delayedTriggers = [], self = this;

		// We first have to update the dom position of the actual currentItem
		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
		if(!this._noFinalSort && this.currentItem[0].parentNode) this.placeholder.before(this.currentItem);
		this._noFinalSort = null;

		if(this.helper[0] == this.currentItem[0]) {
			for(var i in this._storedCSS) {
				if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
			}
			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
		} else {
			this.currentItem.show();
		}

		if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
		if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
		if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
			if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
			for (var i = this.containers.length - 1; i >= 0; i--){
				if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
					delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
					delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.containers[i]));
				}
			};
		};

		//Post events to containers
		for (var i = this.containers.length - 1; i >= 0; i--){
			if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
			if(this.containers[i].containerCache.over) {
				delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
				this.containers[i].containerCache.over = 0;
			}
		}

		//Do what was originally in plugins
		if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
		if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
		if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index

		this.dragging = false;
		if(this.cancelHelperRemoval) {
			if(!noPropagation) {
				this._trigger("beforeStop", event, this._uiHash());
				for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
				this._trigger("stop", event, this._uiHash());
			}
			return false;
		}

		if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());

		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);

		if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;

		if(!noPropagation) {
			for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
			this._trigger("stop", event, this._uiHash());
		}

		this.fromOutside = false;
		return true;

	},

	_trigger: function() {
		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
			this.cancel();
		}
	},

	_uiHash: function(inst) {
		var self = inst || this;
		return {
			helper: self.helper,
			placeholder: self.placeholder || $([]),
			position: self.position,
			originalPosition: self.originalPosition,
			offset: self.positionAbs,
			item: self.currentItem,
			sender: inst ? inst.element : null
		};
	}

});

$.extend($.ui.sortable, {
	version: "1.8.1"
});

})(jQuery);
/*
 * jQuery UI Accordion 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Accordion
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.widget.js
 */
(function($) {

$.widget("ui.accordion", {
	options: {
		active: 0,
		animated: 'slide',
		autoHeight: true,
		clearStyle: false,
		collapsible: false,
		event: "click",
		fillSpace: false,
		header: "> li > :first-child,> :not(li):even",
		icons: {
			header: "ui-icon-triangle-1-e",
			headerSelected: "ui-icon-triangle-1-s"
		},
		navigation: false,
		navigationFilter: function() {
			return this.href.toLowerCase() == location.href.toLowerCase();
		}
	},
	_create: function() {

		var o = this.options, self = this;
		this.running = 0;

		this.element.addClass("ui-accordion ui-widget ui-helper-reset");
		
		// in lack of child-selectors in CSS we need to mark top-LIs in a UL-accordion for some IE-fix
		if (this.element[0].nodeName == "UL") {
			this.element.children("li").addClass("ui-accordion-li-fix");
		}

		this.headers = this.element.find(o.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all")
			.bind("mouseenter.accordion", function(){ $(this).addClass('ui-state-hover'); })
			.bind("mouseleave.accordion", function(){ $(this).removeClass('ui-state-hover'); })
			.bind("focus.accordion", function(){ $(this).addClass('ui-state-focus'); })
			.bind("blur.accordion", function(){ $(this).removeClass('ui-state-focus'); });

		this.headers
			.next()
				.addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");

		if ( o.navigation ) {
			var current = this.element.find("a").filter(o.navigationFilter);
			if ( current.length ) {
				var header = current.closest(".ui-accordion-header");
				if ( header.length ) {
					// anchor within header
					this.active = header;
				} else {
					// anchor within content
					this.active = current.closest(".ui-accordion-content").prev();
				}
			}
		}

		this.active = this._findActive(this.active || o.active).toggleClass("ui-state-default").toggleClass("ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");
		this.active.next().addClass('ui-accordion-content-active');

		//Append icon elements
		this._createIcons();

		this.resize();

		//ARIA
		this.element.attr('role','tablist');

		this.headers
			.attr('role','tab')
			.bind('keydown', function(event) { return self._keydown(event); })
			.next()
			.attr('role','tabpanel');

		this.headers
			.not(this.active || "")
			.attr('aria-expanded','false')
			.attr("tabIndex", "-1")
			.next()
			.hide();

		// make sure at least one header is in the tab order
		if (!this.active.length) {
			this.headers.eq(0).attr('tabIndex','0');
		} else {
			this.active
				.attr('aria-expanded','true')
				.attr('tabIndex', '0');
		}

		// only need links in taborder for Safari
		if (!$.browser.safari)
			this.headers.find('a').attr('tabIndex','-1');

		if (o.event) {
			this.headers.bind((o.event) + ".accordion", function(event) {
				self._clickHandler.call(self, event, this);
				event.preventDefault();
			});
		}

	},
	
	_createIcons: function() {
		var o = this.options;
		if (o.icons) {
			$("<span/>").addClass("ui-icon " + o.icons.header).prependTo(this.headers);
			this.active.find(".ui-icon").toggleClass(o.icons.header).toggleClass(o.icons.headerSelected);
			this.element.addClass("ui-accordion-icons");
		}
	},
	
	_destroyIcons: function() {
		this.headers.children(".ui-icon").remove();
		this.element.removeClass("ui-accordion-icons");
	},

	destroy: function() {
		var o = this.options;

		this.element
			.removeClass("ui-accordion ui-widget ui-helper-reset")
			.removeAttr("role")
			.unbind('.accordion')
			.removeData('accordion');

		this.headers
			.unbind(".accordion")
			.removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top")
			.removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex");

		this.headers.find("a").removeAttr("tabIndex");
		this._destroyIcons();
		var contents = this.headers.next().css("display", "").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active");
		if (o.autoHeight || o.fillHeight) {
			contents.css("height", "");
		}

		return this;
	},
	
	_setOption: function(key, value) {
		$.Widget.prototype._setOption.apply(this, arguments);
			
		if (key == "active") {
			this.activate(value);
		}
		if (key == "icons") {
			this._destroyIcons();
			if (value) {
				this._createIcons();
			}
		}
		
	},

	_keydown: function(event) {

		var o = this.options, keyCode = $.ui.keyCode;

		if (o.disabled || event.altKey || event.ctrlKey)
			return;

		var length = this.headers.length;
		var currentIndex = this.headers.index(event.target);
		var toFocus = false;

		switch(event.keyCode) {
			case keyCode.RIGHT:
			case keyCode.DOWN:
				toFocus = this.headers[(currentIndex + 1) % length];
				break;
			case keyCode.LEFT:
			case keyCode.UP:
				toFocus = this.headers[(currentIndex - 1 + length) % length];
				break;
			case keyCode.SPACE:
			case keyCode.ENTER:
				this._clickHandler({ target: event.target }, event.target);
				event.preventDefault();
		}

		if (toFocus) {
			$(event.target).attr('tabIndex','-1');
			$(toFocus).attr('tabIndex','0');
			toFocus.focus();
			return false;
		}

		return true;

	},

	resize: function() {

		var o = this.options, maxHeight;

		if (o.fillSpace) {
			
			if($.browser.msie) { var defOverflow = this.element.parent().css('overflow'); this.element.parent().css('overflow', 'hidden'); }
			maxHeight = this.element.parent().height();
			if($.browser.msie) { this.element.parent().css('overflow', defOverflow); }
	
			this.headers.each(function() {
				maxHeight -= $(this).outerHeight(true);
			});

			this.headers.next().each(function() {
    		   $(this).height(Math.max(0, maxHeight - $(this).innerHeight() + $(this).height()));
			}).css('overflow', 'auto');

		} else if ( o.autoHeight ) {
			maxHeight = 0;
			this.headers.next().each(function() {
				maxHeight = Math.max(maxHeight, $(this).height());
			}).height(maxHeight);
		}

		return this;
	},

	activate: function(index) {
		// TODO this gets called on init, changing the option without an explicit call for that
		this.options.active = index;
		// call clickHandler with custom event
		var active = this._findActive(index)[0];
		this._clickHandler({ target: active }, active);

		return this;
	},

	_findActive: function(selector) {
		return selector
			? typeof selector == "number"
				? this.headers.filter(":eq(" + selector + ")")
				: this.headers.not(this.headers.not(selector))
			: selector === false
				? $([])
				: this.headers.filter(":eq(0)");
	},

	// TODO isn't event.target enough? why the seperate target argument?
	_clickHandler: function(event, target) {

		var o = this.options;
		if (o.disabled)
			return;

		// called only when using activate(false) to close all parts programmatically
		if (!event.target) {
			if (!o.collapsible)
				return;
			this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all")
				.find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header);
			this.active.next().addClass('ui-accordion-content-active');
			var toHide = this.active.next(),
				data = {
					options: o,
					newHeader: $([]),
					oldHeader: o.active,
					newContent: $([]),
					oldContent: toHide
				},
				toShow = (this.active = $([]));
			this._toggle(toShow, toHide, data);
			return;
		}

		// get the click target
		var clicked = $(event.currentTarget || target);
		var clickedIsActive = clicked[0] == this.active[0];
		
		// TODO the option is changed, is that correct?
		// TODO if it is correct, shouldn't that happen after determining that the click is valid?
		o.active = o.collapsible && clickedIsActive ? false : $('.ui-accordion-header', this.element).index(clicked);

		// if animations are still active, or the active header is the target, ignore click
		if (this.running || (!o.collapsible && clickedIsActive)) {
			return;
		}

		// switch classes
		this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all")
			.find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header);
		if (!clickedIsActive) {
			clicked.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top")
				.find(".ui-icon").removeClass(o.icons.header).addClass(o.icons.headerSelected);
			clicked.next().addClass('ui-accordion-content-active');
		}

		// find elements to show and hide
		var toShow = clicked.next(),
			toHide = this.active.next(),
			data = {
				options: o,
				newHeader: clickedIsActive && o.collapsible ? $([]) : clicked,
				oldHeader: this.active,
				newContent: clickedIsActive && o.collapsible ? $([]) : toShow,
				oldContent: toHide
			},
			down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );

		this.active = clickedIsActive ? $([]) : clicked;
		this._toggle(toShow, toHide, data, clickedIsActive, down);

		return;

	},

	_toggle: function(toShow, toHide, data, clickedIsActive, down) {

		var o = this.options, self = this;

		this.toShow = toShow;
		this.toHide = toHide;
		this.data = data;

		var complete = function() { if(!self) return; return self._completed.apply(self, arguments); };

		// trigger changestart event
		this._trigger("changestart", null, this.data);

		// count elements to animate
		this.running = toHide.size() === 0 ? toShow.size() : toHide.size();

		if (o.animated) {

			var animOptions = {};

			if ( o.collapsible && clickedIsActive ) {
				animOptions = {
					toShow: $([]),
					toHide: toHide,
					complete: complete,
					down: down,
					autoHeight: o.autoHeight || o.fillSpace
				};
			} else {
				animOptions = {
					toShow: toShow,
					toHide: toHide,
					complete: complete,
					down: down,
					autoHeight: o.autoHeight || o.fillSpace
				};
			}

			if (!o.proxied) {
				o.proxied = o.animated;
			}

			if (!o.proxiedDuration) {
				o.proxiedDuration = o.duration;
			}

			o.animated = $.isFunction(o.proxied) ?
				o.proxied(animOptions) : o.proxied;

			o.duration = $.isFunction(o.proxiedDuration) ?
				o.proxiedDuration(animOptions) : o.proxiedDuration;

			var animations = $.ui.accordion.animations,
				duration = o.duration,
				easing = o.animated;

			if (easing && !animations[easing] && !$.easing[easing]) {
				easing = 'slide';
			}
			if (!animations[easing]) {
				animations[easing] = function(options) {
					this.slide(options, {
						easing: easing,
						duration: duration || 700
					});
				};
			}

			animations[easing](animOptions);

		} else {

			if (o.collapsible && clickedIsActive) {
				toShow.toggle();
			} else {
				toHide.hide();
				toShow.show();
			}

			complete(true);

		}

		// TODO assert that the blur and focus triggers are really necessary, remove otherwise
		toHide.prev().attr('aria-expanded','false').attr("tabIndex", "-1").blur();
		toShow.prev().attr('aria-expanded','true').attr("tabIndex", "0").focus();

	},

	_completed: function(cancel) {

		var o = this.options;

		this.running = cancel ? 0 : --this.running;
		if (this.running) return;

		if (o.clearStyle) {
			this.toShow.add(this.toHide).css({
				height: "",
				overflow: ""
			});
		}
		
		// other classes are removed before the animation; this one needs to stay until completed
		this.toHide.removeClass("ui-accordion-content-active");

		this._trigger('change', null, this.data);
	}

});


$.extend($.ui.accordion, {
	version: "1.8.1",
	animations: {
		slide: function(options, additions) {
			options = $.extend({
				easing: "swing",
				duration: 300
			}, options, additions);
			if ( !options.toHide.size() ) {
				options.toShow.animate({height: "show"}, options);
				return;
			}
			if ( !options.toShow.size() ) {
				options.toHide.animate({height: "hide"}, options);
				return;
			}
			var overflow = options.toShow.css('overflow'),
				percentDone = 0,
				showProps = {},
				hideProps = {},
				fxAttrs = [ "height", "paddingTop", "paddingBottom" ],
				originalWidth;
			// fix width before calculating height of hidden element
			var s = options.toShow;
			originalWidth = s[0].style.width;
			s.width( parseInt(s.parent().width(),10) - parseInt(s.css("paddingLeft"),10) - parseInt(s.css("paddingRight"),10) - (parseInt(s.css("borderLeftWidth"),10) || 0) - (parseInt(s.css("borderRightWidth"),10) || 0) );
			
			$.each(fxAttrs, function(i, prop) {
				hideProps[prop] = 'hide';
				
				var parts = ('' + $.css(options.toShow[0], prop)).match(/^([\d+-.]+)(.*)$/);
				showProps[prop] = {
					value: parts[1],
					unit: parts[2] || 'px'
				};
			});
			options.toShow.css({ height: 0, overflow: 'hidden' }).show();
			options.toHide.filter(":hidden").each(options.complete).end().filter(":visible").animate(hideProps,{
				step: function(now, settings) {
					// only calculate the percent when animating height
					// IE gets very inconsistent results when animating elements
					// with small values, which is common for padding
					if (settings.prop == 'height') {
						percentDone = ( settings.end - settings.start === 0 ) ? 0 :
							(settings.now - settings.start) / (settings.end - settings.start);
					}
					
					options.toShow[0].style[settings.prop] =
						(percentDone * showProps[settings.prop].value) + showProps[settings.prop].unit;
				},
				duration: options.duration,
				easing: options.easing,
				complete: function() {
					if ( !options.autoHeight ) {
						options.toShow.css("height", "");
					}
					options.toShow.css("width", originalWidth);
					options.toShow.css({overflow: overflow});
					options.complete();
				}
			});
		},
		bounceslide: function(options) {
			this.slide(options, {
				easing: options.down ? "easeOutBounce" : "swing",
				duration: options.down ? 1000 : 200
			});
		}
	}
});

})(jQuery);
/*
 * jQuery UI Autocomplete 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Autocomplete
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.widget.js
 *	jquery.ui.position.js
 */
(function( $ ) {

$.widget( "ui.autocomplete", {
	options: {
		minLength: 1,
		delay: 300
	},
	_create: function() {
		var self = this,
			doc = this.element[ 0 ].ownerDocument;
		this.element
			.addClass( "ui-autocomplete-input" )
			.attr( "autocomplete", "off" )
			// TODO verify these actually work as intended
			.attr({
				role: "textbox",
				"aria-autocomplete": "list",
				"aria-haspopup": "true"
			})
			.bind( "keydown.autocomplete", function( event ) {
				var keyCode = $.ui.keyCode;
				switch( event.keyCode ) {
				case keyCode.PAGE_UP:
					self._move( "previousPage", event );
					break;
				case keyCode.PAGE_DOWN:
					self._move( "nextPage", event );
					break;
				case keyCode.UP:
					self._move( "previous", event );
					// prevent moving cursor to beginning of text field in some browsers
					event.preventDefault();
					break;
				case keyCode.DOWN:
					self._move( "next", event );
					// prevent moving cursor to end of text field in some browsers
					event.preventDefault();
					break;
				case keyCode.ENTER:
					// when menu is open or has focus
					if ( self.menu.active ) {
						event.preventDefault();
					}
					//passthrough - ENTER and TAB both select the current element
				case keyCode.TAB:
					if ( !self.menu.active ) {
						return;
					}
					self.menu.select( event );
					break;
				case keyCode.ESCAPE:
					self.element.val( self.term );
					self.close( event );
					break;
				case keyCode.LEFT:
				case keyCode.RIGHT:
				case keyCode.SHIFT:
				case keyCode.CONTROL:
				case keyCode.ALT:
					// ignore metakeys (shift, ctrl, alt)
					break;
				default:
					// keypress is triggered before the input value is changed
					clearTimeout( self.searching );
					self.searching = setTimeout(function() {
						self.search( null, event );
					}, self.options.delay );
					break;
				}
			})
			.bind( "focus.autocomplete", function() {
				self.selectedItem = null;
				self.previous = self.element.val();
			})
			.bind( "blur.autocomplete", function( event ) {
				clearTimeout( self.searching );
				// clicks on the menu (or a button to trigger a search) will cause a blur event
				// TODO try to implement this without a timeout, see clearTimeout in search()
				self.closing = setTimeout(function() {
					self.close( event );
					self._change( event );
				}, 150 );
			});
		this._initSource();
		this.response = function() {
			return self._response.apply( self, arguments );
		};
		this.menu = $( "<ul></ul>" )
			.addClass( "ui-autocomplete" )
			.appendTo( "body", doc )
			.menu({
				focus: function( event, ui ) {
					var item = ui.item.data( "item.autocomplete" );
					if ( false !== self._trigger( "focus", null, { item: item } ) ) {
						// use value to match what will end up in the input, if it was a key event
						if ( /^key/.test(event.originalEvent.type) ) {
							self.element.val( item.value );
						}
					}
				},
				selected: function( event, ui ) {
					var item = ui.item.data( "item.autocomplete" );
					if ( false !== self._trigger( "select", event, { item: item } ) ) {
						self.element.val( item.value );
					}
					self.close( event );
					// only trigger when focus was lost (click on menu)
					var previous = self.previous;
					if ( self.element[0] !== doc.activeElement ) {
						self.element.focus();
						self.previous = previous;
					}
					self.selectedItem = item;
				},
				blur: function( event, ui ) {
					if ( self.menu.element.is(":visible") ) {
						self.element.val( self.term );
					}
				}
			})
			.zIndex( this.element.zIndex() + 1 )
			// workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
			.css({ top: 0, left: 0 })
			.hide()
			.data( "menu" );
		if ( $.fn.bgiframe ) {
			 this.menu.element.bgiframe();
		}
	},

	destroy: function() {
		this.element
			.removeClass( "ui-autocomplete-input" )
			.removeAttr( "autocomplete" )
			.removeAttr( "role" )
			.removeAttr( "aria-autocomplete" )
			.removeAttr( "aria-haspopup" );
		this.menu.element.remove();
		$.Widget.prototype.destroy.call( this );
	},

	_setOption: function( key ) {
		$.Widget.prototype._setOption.apply( this, arguments );
		if ( key === "source" ) {
			this._initSource();
		}
	},

	_initSource: function() {
		var array,
			url;
		if ( $.isArray(this.options.source) ) {
			array = this.options.source;
			this.source = function( request, response ) {
				response( $.ui.autocomplete.filter(array, request.term) );
			};
		} else if ( typeof this.options.source === "string" ) {
			url = this.options.source;
			this.source = function( request, response ) {
				$.getJSON( url, request, response );
			};
		} else {
			this.source = this.options.source;
		}
	},

	search: function( value, event ) {
		value = value != null ? value : this.element.val();
		if ( value.length < this.options.minLength ) {
			return this.close( event );
		}

		clearTimeout( this.closing );
		if ( this._trigger("search") === false ) {
			return;
		}

		return this._search( value );
	},

	_search: function( value ) {
		this.term = this.element
			.addClass( "ui-autocomplete-loading" )
			// always save the actual value, not the one passed as an argument
			.val();

		this.source( { term: value }, this.response );
	},

	_response: function( content ) {
		if ( content.length ) {
			content = this._normalize( content );
			this._suggest( content );
			this._trigger( "open" );
		} else {
			this.close();
		}
		this.element.removeClass( "ui-autocomplete-loading" );
	},

	close: function( event ) {
		clearTimeout( this.closing );
		if ( this.menu.element.is(":visible") ) {
			this._trigger( "close", event );
			this.menu.element.hide();
			this.menu.deactivate();
		}
	},
	
	_change: function( event ) {
		if ( this.previous !== this.element.val() ) {
			this._trigger( "change", event, { item: this.selectedItem } );
		}
	},

	_normalize: function( items ) {
		// assume all items have the right format when the first item is complete
		if ( items.length && items[0].label && items[0].value ) {
			return items;
		}
		return $.map( items, function(item) {
			if ( typeof item === "string" ) {
				return {
					label: item,
					value: item
				};
			}
			return $.extend({
				label: item.label || item.value,
				value: item.value || item.label
			}, item );
		});
	},

	_suggest: function( items ) {
		var ul = this.menu.element
				.empty()
				.zIndex( this.element.zIndex() + 1 ),
			menuWidth,
			textWidth;
		this._renderMenu( ul, items );
		// TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
		this.menu.deactivate();
		this.menu.refresh();
		this.menu.element.show().position({
			my: "left top",
			at: "left bottom",
			of: this.element,
			collision: "none"
		});

		menuWidth = ul.width( "" ).width();
		textWidth = this.element.width();
		ul.width( Math.max( menuWidth, textWidth ) );
	},
	
	_renderMenu: function( ul, items ) {
		var self = this;
		$.each( items, function( index, item ) {
			self._renderItem( ul, item );
		});
	},

	_renderItem: function( ul, item) {
		return $( "<li></li>" )
			.data( "item.autocomplete", item )
			.append( "<a>" + item.label + "</a>" )
			.appendTo( ul );
	},

	_move: function( direction, event ) {
		if ( !this.menu.element.is(":visible") ) {
			this.search( null, event );
			return;
		}
		if ( this.menu.first() && /^previous/.test(direction) ||
				this.menu.last() && /^next/.test(direction) ) {
			this.element.val( this.term );
			this.menu.deactivate();
			return;
		}
		this.menu[ direction ]( event );
	},

	widget: function() {
		return this.menu.element;
	}
});

$.extend( $.ui.autocomplete, {
	escapeRegex: function( value ) {
		return value.replace( /([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1" );
	},
	filter: function(array, term) {
		var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
		return $.grep( array, function(value) {
			return matcher.test( value.label || value.value || value );
		});
	}
});

}( jQuery ));

/*
 * jQuery UI Menu (not officially released)
 * 
 * This widget isn't yet finished and the API is subject to change. We plan to finish
 * it for the next release. You're welcome to give it a try anyway and give us feedback,
 * as long as you're okay with migrating your code later on. We can help with that, too.
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Menu
 *
 * Depends:
 *	jquery.ui.core.js
 *  jquery.ui.widget.js
 */
(function($) {

$.widget("ui.menu", {
	_create: function() {
		var self = this;
		this.element
			.addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
			.attr({
				role: "listbox",
				"aria-activedescendant": "ui-active-menuitem"
			})
			.click(function( event ) {
				if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
					return;
				}
				// temporary
				event.preventDefault();
				self.select( event );
			});
		this.refresh();
	},
	
	refresh: function() {
		var self = this;

		// don't refresh list items that are already adapted
		var items = this.element.children("li:not(.ui-menu-item):has(a)")
			.addClass("ui-menu-item")
			.attr("role", "menuitem");
		
		items.children("a")
			.addClass("ui-corner-all")
			.attr("tabindex", -1)
			// mouseenter doesn't work with event delegation
			.mouseenter(function( event ) {
				self.activate( event, $(this).parent() );
			})
			.mouseleave(function() {
				self.deactivate();
			});
	},

	activate: function( event, item ) {
		this.deactivate();
		if (this.hasScroll()) {
			var offset = item.offset().top - this.element.offset().top,
				scroll = this.element.attr("scrollTop"),
				elementHeight = this.element.height();
			if (offset < 0) {
				this.element.attr("scrollTop", scroll + offset);
			} else if (offset > elementHeight) {
				this.element.attr("scrollTop", scroll + offset - elementHeight + item.height());
			}
		}
		this.active = item.eq(0)
			.children("a")
				.addClass("ui-state-hover")
				.attr("id", "ui-active-menuitem")
			.end();
		this._trigger("focus", event, { item: item });
	},

	deactivate: function() {
		if (!this.active) { return; }

		this.active.children("a")
			.removeClass("ui-state-hover")
			.removeAttr("id");
		this._trigger("blur");
		this.active = null;
	},

	next: function(event) {
		this.move("next", ".ui-menu-item:first", event);
	},

	previous: function(event) {
		this.move("prev", ".ui-menu-item:last", event);
	},

	first: function() {
		return this.active && !this.active.prev().length;
	},

	last: function() {
		return this.active && !this.active.next().length;
	},

	move: function(direction, edge, event) {
		if (!this.active) {
			this.activate(event, this.element.children(edge));
			return;
		}
		var next = this.active[direction + "All"](".ui-menu-item").eq(0);
		if (next.length) {
			this.activate(event, next);
		} else {
			this.activate(event, this.element.children(edge));
		}
	},

	// TODO merge with previousPage
	nextPage: function(event) {
		if (this.hasScroll()) {
			// TODO merge with no-scroll-else
			if (!this.active || this.last()) {
				this.activate(event, this.element.children(":first"));
				return;
			}
			var base = this.active.offset().top,
				height = this.element.height(),
				result = this.element.children("li").filter(function() {
					var close = $(this).offset().top - base - height + $(this).height();
					// TODO improve approximation
					return close < 10 && close > -10;
				});

			// TODO try to catch this earlier when scrollTop indicates the last page anyway
			if (!result.length) {
				result = this.element.children(":last");
			}
			this.activate(event, result);
		} else {
			this.activate(event, this.element.children(!this.active || this.last() ? ":first" : ":last"));
		}
	},

	// TODO merge with nextPage
	previousPage: function(event) {
		if (this.hasScroll()) {
			// TODO merge with no-scroll-else
			if (!this.active || this.first()) {
				this.activate(event, this.element.children(":last"));
				return;
			}

			var base = this.active.offset().top,
				height = this.element.height();
				result = this.element.children("li").filter(function() {
					var close = $(this).offset().top - base + height - $(this).height();
					// TODO improve approximation
					return close < 10 && close > -10;
				});

			// TODO try to catch this earlier when scrollTop indicates the last page anyway
			if (!result.length) {
				result = this.element.children(":first");
			}
			this.activate(event, result);
		} else {
			this.activate(event, this.element.children(!this.active || this.first() ? ":last" : ":first"));
		}
	},

	hasScroll: function() {
		return this.element.height() < this.element.attr("scrollHeight");
	},

	select: function( event ) {
		this._trigger("selected", event, { item: this.active });
	}
});

}(jQuery));
/*
 * jQuery UI Button 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Button
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.widget.js
 */
(function( $ ) {

var lastActive,
	baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
	otherClasses = "ui-state-hover ui-state-active " +
		"ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon ui-button-text-only",
	formResetHandler = function( event ) {
		$( ":ui-button", event.target.form ).each(function() {
			var inst = $( this ).data( "button" );
			setTimeout(function() {
				inst.refresh();
			}, 1 );
		});
	},
	radioGroup = function( radio ) {
		var name = radio.name,
			form = radio.form,
			radios = $( [] );
		if ( name ) {
			if ( form ) {
				radios = $( form ).find( "[name='" + name + "']" );
			} else {
				radios = $( "[name='" + name + "']", radio.ownerDocument )
					.filter(function() {
						return !this.form;
					});
			}
		}
		return radios;
	};

$.widget( "ui.button", {
	options: {
		text: true,
		label: null,
		icons: {
			primary: null,
			secondary: null
		}
	},
	_create: function() {
		this.element.closest( "form" )
			.unbind( "reset.button" )
			.bind( "reset.button", formResetHandler );

		this._determineButtonType();
		this.hasTitle = !!this.buttonElement.attr( "title" );

		var self = this,
			options = this.options,
			toggleButton = this.type === "checkbox" || this.type === "radio",
			hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
			focusClass = "ui-state-focus";

		if ( options.label === null ) {
			options.label = this.buttonElement.html();
		}

		if ( this.element.is( ":disabled" ) ) {
			options.disabled = true;
		}

		this.buttonElement
			.addClass( baseClasses )
			.attr( "role", "button" )
			.bind( "mouseenter.button", function() {
				if ( options.disabled ) {
					return;
				}
				$( this ).addClass( "ui-state-hover" );
				if ( this === lastActive ) {
					$( this ).addClass( "ui-state-active" );
				}
			})
			.bind( "mouseleave.button", function() {
				if ( options.disabled ) {
					return;
				}
				$( this ).removeClass( hoverClass );
			})
			.bind( "focus.button", function() {
				// no need to check disabled, focus won't be triggered anyway
				$( this ).addClass( focusClass );
			})
			.bind( "blur.button", function() {
				$( this ).removeClass( focusClass );
			});

		if ( toggleButton ) {
			this.element.bind( "change.button", function() {
				self.refresh();
			});
		}

		if ( this.type === "checkbox" ) {
			this.buttonElement.bind( "click.button", function() {
				if ( options.disabled ) {
					return false;
				}
				$( this ).toggleClass( "ui-state-active" );
				self.buttonElement.attr( "aria-pressed", self.element[0].checked );
			});
		} else if ( this.type === "radio" ) {
			this.buttonElement.bind( "click.button", function() {
				if ( options.disabled ) {
					return false;
				}
				$( this ).addClass( "ui-state-active" );
				self.buttonElement.attr( "aria-pressed", true );

				var radio = self.element[ 0 ];
				radioGroup( radio )
					.not( radio )
					.map(function() {
						return $( this ).button( "widget" )[ 0 ];
					})
					.removeClass( "ui-state-active" )
					.attr( "aria-pressed", false );
			});
		} else {
			this.buttonElement
				.bind( "mousedown.button", function() {
					if ( options.disabled ) {
						return false;
					}
					$( this ).addClass( "ui-state-active" );
					lastActive = this;
					$( document ).one( "mouseup", function() {
						lastActive = null;
					});
				})
				.bind( "mouseup.button", function() {
					if ( options.disabled ) {
						return false;
					}
					$( this ).removeClass( "ui-state-active" );
				})
				.bind( "keydown.button", function(event) {
					if ( options.disabled ) {
						return false;
					}
					if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
						$( this ).addClass( "ui-state-active" );
					}
				})
				.bind( "keyup.button", function() {
					$( this ).removeClass( "ui-state-active" );
				});

			if ( this.buttonElement.is("a") ) {
				this.buttonElement.keyup(function(event) {
					if ( event.keyCode === $.ui.keyCode.SPACE ) {
						// TODO pass through original event correctly (just as 2nd argument doesn't work)
						$( this ).click();
					}
				});
			}
		}

		// TODO: pull out $.Widget's handling for the disabled option into
		// $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
		// be overridden by individual plugins
		this._setOption( "disabled", options.disabled );
	},

	_determineButtonType: function() {
		
		if ( this.element.is(":checkbox") ) {
			this.type = "checkbox";
		} else {
			if ( this.element.is(":radio") ) {
				this.type = "radio";
			} else {
				if ( this.element.is("input") ) {
					this.type = "input";
				} else {
					this.type = "button";
				}
			}
		}
		
		if ( this.type === "checkbox" || this.type === "radio" ) {
			// we don't search against the document in case the element
			// is disconnected from the DOM
			this.buttonElement = this.element.parents().last()
				.find( "[for=" + this.element.attr("id") + "]" );
			this.element.addClass( "ui-helper-hidden-accessible" );

			var checked = this.element.is( ":checked" );
			if ( checked ) {
				this.buttonElement.addClass( "ui-state-active" );
			}
			this.buttonElement.attr( "aria-pressed", checked );
		} else {
			this.buttonElement = this.element;
		}
	},

	widget: function() {
		return this.buttonElement;
	},

	destroy: function() {
		this.element
			.removeClass( "ui-helper-hidden-accessible" );
		this.buttonElement
			.removeClass( baseClasses + " " + otherClasses )
			.removeAttr( "role" )
			.removeAttr( "aria-pressed" )
			.html( this.buttonElement.find(".ui-button-text").html() );

		if ( !this.hasTitle ) {
			this.buttonElement.removeAttr( "title" );
		}

		$.Widget.prototype.destroy.call( this );
	},

	_setOption: function( key, value ) {
		$.Widget.prototype._setOption.apply( this, arguments );
		if ( key === "disabled" ) {
			if ( value ) {
				this.element.attr( "disabled", true );
			} else {
				this.element.removeAttr( "disabled" );
			}
		}
		this._resetButton();
	},

	refresh: function() {
		var isDisabled = this.element.is( ":disabled" );
		if ( isDisabled !== this.options.disabled ) {
			this._setOption( "disabled", isDisabled );
		}
		if ( this.type === "radio" ) {
			radioGroup( this.element[0] ).each(function() {
				if ( $( this ).is( ":checked" ) ) {
					$( this ).button( "widget" )
						.addClass( "ui-state-active" )
						.attr( "aria-pressed", true );
				} else {
					$( this ).button( "widget" )
						.removeClass( "ui-state-active" )
						.attr( "aria-pressed", false );
				}
			});
		} else if ( this.type === "checkbox" ) {
			if ( this.element.is( ":checked" ) ) {
				this.buttonElement
					.addClass( "ui-state-active" )
					.attr( "aria-pressed", true );
			} else {
				this.buttonElement
					.removeClass( "ui-state-active" )
					.attr( "aria-pressed", false );
			}
		}
	},

	_resetButton: function() {
		if ( this.type === "input" ) {
			if ( this.options.label ) {
				this.element.val( this.options.label );
			}
			return;
		}
		var buttonElement = this.buttonElement,
			buttonText = $( "<span></span>" )
				.addClass( "ui-button-text" )
				.html( this.options.label )
				.appendTo( buttonElement.empty() )
				.text(),
			icons = this.options.icons,
			multipleIcons = icons.primary && icons.secondary;
		if ( icons.primary || icons.secondary ) {
			buttonElement.addClass( "ui-button-text-icon" +
				( multipleIcons ? "s" : "" ) );
			if ( icons.primary ) {
				buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
			}
			if ( icons.secondary ) {
				buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
			}
			if ( !this.options.text ) {
				buttonElement
					.addClass( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" )
					.removeClass( "ui-button-text-icons ui-button-text-icon" );
				if ( !this.hasTitle ) {
					buttonElement.attr( "title", buttonText );
				}
			}
		} else {
			buttonElement.addClass( "ui-button-text-only" );
		}
	}
});

$.widget( "ui.buttonset", {
	_create: function() {
		this.element.addClass( "ui-buttonset" );
		this._init();
	},
	
	_init: function() {
		this.refresh();
	},

	_setOption: function( key, value ) {
		if ( key === "disabled" ) {
			this.buttons.button( "option", key, value );
		}

		$.Widget.prototype._setOption.apply( this, arguments );
	},
	
	refresh: function() {
		this.buttons = this.element.find( ":button, :submit, :reset, :checkbox, :radio, a, :data(button)" )
			.filter( ":ui-button" )
				.button( "refresh" )
			.end()
			.not( ":ui-button" )
				.button()
			.end()
			.map(function() {
				return $( this ).button( "widget" )[ 0 ];
			})
				.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
				.filter( ":first" )
					.addClass( "ui-corner-left" )
				.end()
				.filter( ":last" )
					.addClass( "ui-corner-right" )
				.end()
			.end();
	},

	destroy: function() {
		this.element.removeClass( "ui-buttonset" );
		this.buttons
			.map(function() {
				return $( this ).button( "widget" )[ 0 ];
			})
				.removeClass( "ui-corner-left ui-corner-right" )
			.end()
			.button( "destroy" )

		$.Widget.prototype.destroy.call( this );
	}
});

}( jQuery ) );
/*
 * jQuery UI Dialog 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Dialog
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.widget.js
 *  jquery.ui.button.js
 *	jquery.ui.draggable.js
 *	jquery.ui.mouse.js
 *	jquery.ui.position.js
 *	jquery.ui.resizable.js
 */
(function($) {

var uiDialogClasses =
	'ui-dialog ' +
	'ui-widget ' +
	'ui-widget-content ' +
	'ui-corner-all ';

$.widget("ui.dialog", {
	options: {
		autoOpen: true,
		buttons: {},
		closeOnEscape: true,
		closeText: 'close',
		dialogClass: '',
		draggable: true,
		hide: null,
		height: 'auto',
		maxHeight: false,
		maxWidth: false,
		minHeight: 150,
		minWidth: 150,
		modal: false,
		position: 'center',
		resizable: true,
		show: null,
		stack: true,
		title: '',
		width: 300,
		zIndex: 1000
	},
	_create: function() {
		this.originalTitle = this.element.attr('title');

		var self = this,
			options = self.options,

			title = options.title || self.originalTitle || '&#160;',
			titleId = $.ui.dialog.getTitleId(self.element),

			uiDialog = (self.uiDialog = $('<div></div>'))
				.appendTo(document.body)
				.hide()
				.addClass(uiDialogClasses + options.dialogClass)
				.css({
					zIndex: options.zIndex
				})
				// setting tabIndex makes the div focusable
				// setting outline to 0 prevents a border on focus in Mozilla
				.attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
					if (options.closeOnEscape && event.keyCode &&
						event.keyCode === $.ui.keyCode.ESCAPE) {
						
						self.close(event);
						event.preventDefault();
					}
				})
				.attr({
					role: 'dialog',
					'aria-labelledby': titleId
				})
				.mousedown(function(event) {
					self.moveToTop(false, event);
				}),

			uiDialogContent = self.element
				.show()
				.removeAttr('title')
				.addClass(
					'ui-dialog-content ' +
					'ui-widget-content')
				.appendTo(uiDialog),

			uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
				.addClass(
					'ui-dialog-titlebar ' +
					'ui-widget-header ' +
					'ui-corner-all ' +
					'ui-helper-clearfix'
				)
				.prependTo(uiDialog),

			uiDialogTitlebarClose = $('<a href="#"></a>')
				.addClass(
					'ui-dialog-titlebar-close ' +
					'ui-corner-all'
				)
				.attr('role', 'button')
				.hover(
					function() {
						uiDialogTitlebarClose.addClass('ui-state-hover');
					},
					function() {
						uiDialogTitlebarClose.removeClass('ui-state-hover');
					}
				)
				.focus(function() {
					uiDialogTitlebarClose.addClass('ui-state-focus');
				})
				.blur(function() {
					uiDialogTitlebarClose.removeClass('ui-state-focus');
				})
				.click(function(event) {
					self.close(event);
					return false;
				})
				.appendTo(uiDialogTitlebar),

			uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
				.addClass(
					'ui-icon ' +
					'ui-icon-closethick'
				)
				.text(options.closeText)
				.appendTo(uiDialogTitlebarClose),

			uiDialogTitle = $('<span></span>')
				.addClass('ui-dialog-title')
				.attr('id', titleId)
				.html(title)
				.prependTo(uiDialogTitlebar);

		//handling of deprecated beforeclose (vs beforeClose) option
		//Ticket #4669 http://dev.jqueryui.com/ticket/4669
		//TODO: remove in 1.9pre
		if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
			options.beforeClose = options.beforeclose;
		}

		uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();

		if (options.draggable && $.fn.draggable) {
			self._makeDraggable();
		}
		if (options.resizable && $.fn.resizable) {
			self._makeResizable();
		}

		self._createButtons(options.buttons);
		self._isOpen = false;

		if ($.fn.bgiframe) {
			uiDialog.bgiframe();
		}
	},
	_init: function() {
		if ( this.options.autoOpen ) {
			this.open();
		}
	},

	destroy: function() {
		var self = this;
		
		if (self.overlay) {
			self.overlay.destroy();
		}
		self.uiDialog.hide();
		self.element
			.unbind('.dialog')
			.removeData('dialog')
			.removeClass('ui-dialog-content ui-widget-content')
			.hide().appendTo('body');
		self.uiDialog.remove();

		if (self.originalTitle) {
			self.element.attr('title', self.originalTitle);
		}

		return self;
	},
	
	widget: function() {
		return this.uiDialog;
	},

	close: function(event) {
		var self = this,
			maxZ;
		
		if (false === self._trigger('beforeClose', event)) {
			return;
		}

		if (self.overlay) {
			self.overlay.destroy();
		}
		self.uiDialog.unbind('keypress.ui-dialog');

		self._isOpen = false;

		if (self.options.hide) {
			self.uiDialog.hide(self.options.hide, function() {
				self._trigger('close', event);
			});
		} else {
			self.uiDialog.hide();
			self._trigger('close', event);
		}

		$.ui.dialog.overlay.resize();

		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
		if (self.options.modal) {
			maxZ = 0;
			$('.ui-dialog').each(function() {
				if (this !== self.uiDialog[0]) {
					maxZ = Math.max(maxZ, $(this).css('z-index'));
				}
			});
			$.ui.dialog.maxZ = maxZ;
		}

		return self;
	},

	isOpen: function() {
		return this._isOpen;
	},

	// the force parameter allows us to move modal dialogs to their correct
	// position on open
	moveToTop: function(force, event) {
		var self = this,
			options = self.options,
			saveScroll;
		
		if ((options.modal && !force) ||
			(!options.stack && !options.modal)) {
			return self._trigger('focus', event);
		}
		
		if (options.zIndex > $.ui.dialog.maxZ) {
			$.ui.dialog.maxZ = options.zIndex;
		}
		if (self.overlay) {
			$.ui.dialog.maxZ += 1;
			self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
		}

		//Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
		//  http://ui.jquery.com/bugs/ticket/3193
		saveScroll = { scrollTop: self.element.attr('scrollTop'), scrollLeft: self.element.attr('scrollLeft') };
		$.ui.dialog.maxZ += 1;
		self.uiDialog.css('z-index', $.ui.dialog.maxZ);
		self.element.attr(saveScroll);
		self._trigger('focus', event);

		return self;
	},

	open: function() {
		if (this._isOpen) { return; }

		var self = this,
			options = self.options,
			uiDialog = self.uiDialog;

		self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
		if (uiDialog.next().length) {
			uiDialog.appendTo('body');
		}
		self._size();
		self._position(options.position);
		uiDialog.show(options.show);
		self.moveToTop(true);

		// prevent tabbing out of modal dialogs
		if (options.modal) {
			uiDialog.bind('keypress.ui-dialog', function(event) {
				if (event.keyCode !== $.ui.keyCode.TAB) {
					return;
				}
	
				var tabbables = $(':tabbable', this),
					first = tabbables.filter(':first'),
					last  = tabbables.filter(':last');
	
				if (event.target === last[0] && !event.shiftKey) {
					first.focus(1);
					return false;
				} else if (event.target === first[0] && event.shiftKey) {
					last.focus(1);
					return false;
				}
			});
		}

		// set focus to the first tabbable element in the content area or the first button
		// if there are no tabbable elements, set focus on the dialog itself
		$([])
			.add(uiDialog.find('.ui-dialog-content :tabbable:first'))
			.add(uiDialog.find('.ui-dialog-buttonpane :tabbable:first'))
			.add(uiDialog)
			.filter(':first')
			.focus();

		self._trigger('open');
		self._isOpen = true;

		return self;
	},

	_createButtons: function(buttons) {
		var self = this,
			hasButtons = false,
			uiDialogButtonPane = $('<div></div>')
				.addClass(
					'ui-dialog-buttonpane ' +
					'ui-widget-content ' +
					'ui-helper-clearfix'
				);

		// if we already have a button pane, remove it
		self.uiDialog.find('.ui-dialog-buttonpane').remove();

		if (typeof buttons === 'object' && buttons !== null) {
			$.each(buttons, function() {
				return !(hasButtons = true);
			});
		}
		if (hasButtons) {
			$.each(buttons, function(name, fn) {
				var button = $('<button type="button"></button>')
					.text(name)
					.click(function() { fn.apply(self.element[0], arguments); })
					.appendTo(uiDialogButtonPane);
				if ($.fn.button) {
					button.button();
				}
			});
			uiDialogButtonPane.appendTo(self.uiDialog);
		}
	},

	_makeDraggable: function() {
		var self = this,
			options = self.options,
			doc = $(document),
			heightBeforeDrag;

		function filteredUi(ui) {
			return {
				position: ui.position,
				offset: ui.offset
			};
		}

		self.uiDialog.draggable({
			cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
			handle: '.ui-dialog-titlebar',
			containment: 'document',
			start: function(event, ui) {
				heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
				$(this).height($(this).height()).addClass("ui-dialog-dragging");
				self._trigger('dragStart', event, filteredUi(ui));
			},
			drag: function(event, ui) {
				self._trigger('drag', event, filteredUi(ui));
			},
			stop: function(event, ui) {
				options.position = [ui.position.left - doc.scrollLeft(),
					ui.position.top - doc.scrollTop()];
				$(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
				self._trigger('dragStop', event, filteredUi(ui));
				$.ui.dialog.overlay.resize();
			}
		});
	},

	_makeResizable: function(handles) {
		handles = (handles === undefined ? this.options.resizable : handles);
		var self = this,
			options = self.options,
			// .ui-resizable has position: relative defined in the stylesheet
			// but dialogs have to use absolute or fixed positioning
			position = self.uiDialog.css('position'),
			resizeHandles = (typeof handles === 'string' ?
				handles	:
				'n,e,s,w,se,sw,ne,nw'
			);

		function filteredUi(ui) {
			return {
				originalPosition: ui.originalPosition,
				originalSize: ui.originalSize,
				position: ui.position,
				size: ui.size
			};
		}

		self.uiDialog.resizable({
			cancel: '.ui-dialog-content',
			containment: 'document',
			alsoResize: self.element,
			maxWidth: options.maxWidth,
			maxHeight: options.maxHeight,
			minWidth: options.minWidth,
			minHeight: self._minHeight(),
			handles: resizeHandles,
			start: function(event, ui) {
				$(this).addClass("ui-dialog-resizing");
				self._trigger('resizeStart', event, filteredUi(ui));
			},
			resize: function(event, ui) {
				self._trigger('resize', event, filteredUi(ui));
			},
			stop: function(event, ui) {
				$(this).removeClass("ui-dialog-resizing");
				options.height = $(this).height();
				options.width = $(this).width();
				self._trigger('resizeStop', event, filteredUi(ui));
				$.ui.dialog.overlay.resize();
			}
		})
		.css('position', position)
		.find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
	},

	_minHeight: function() {
		var options = this.options;

		if (options.height === 'auto') {
			return options.minHeight;
		} else {
			return Math.min(options.minHeight, options.height);
		}
	},

	_position: function(position) {
		var myAt = [],
			offset = [0, 0],
			isVisible;

		position = position || $.ui.dialog.prototype.options.position;

		// deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
//		if (typeof position == 'string' || $.isArray(position)) {
//			myAt = $.isArray(position) ? position : position.split(' ');

		if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
			myAt = position.split ? position.split(' ') : [position[0], position[1]];
			if (myAt.length === 1) {
				myAt[1] = myAt[0];
			}

			$.each(['left', 'top'], function(i, offsetPosition) {
				if (+myAt[i] === myAt[i]) {
					offset[i] = myAt[i];
					myAt[i] = offsetPosition;
				}
			});
		} else if (typeof position === 'object') {
			if ('left' in position) {
				myAt[0] = 'left';
				offset[0] = position.left;
			} else if ('right' in position) {
				myAt[0] = 'right';
				offset[0] = -position.right;
			}

			if ('top' in position) {
				myAt[1] = 'top';
				offset[1] = position.top;
			} else if ('bottom' in position) {
				myAt[1] = 'bottom';
				offset[1] = -position.bottom;
			}
		}

		// need to show the dialog to get the actual offset in the position plugin
		isVisible = this.uiDialog.is(':visible');
		if (!isVisible) {
			this.uiDialog.show();
		}
		this.uiDialog
			// workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
			.css({ top: 0, left: 0 })
			.position({
				my: myAt.join(' '),
				at: myAt.join(' '),
				offset: offset.join(' '),
				of: window,
				collision: 'fit',
				// ensure that the titlebar is never outside the document
				using: function(pos) {
					var topOffset = $(this).css(pos).offset().top;
					if (topOffset < 0) {
						$(this).css('top', pos.top - topOffset);
					}
				}
			});
		if (!isVisible) {
			this.uiDialog.hide();
		}
	},

	_setOption: function(key, value){
		var self = this,
			uiDialog = self.uiDialog,
			isResizable = uiDialog.is(':data(resizable)'),
			resize = false;
		
		switch (key) {
			//handling of deprecated beforeclose (vs beforeClose) option
			//Ticket #4669 http://dev.jqueryui.com/ticket/4669
			//TODO: remove in 1.9pre
			case "beforeclose":
				key = "beforeClose";
				break;
			case "buttons":
				self._createButtons(value);
				break;
			case "closeText":
				// convert whatever was passed in to a string, for text() to not throw up
				self.uiDialogTitlebarCloseText.text("" + value);
				break;
			case "dialogClass":
				uiDialog
					.removeClass(self.options.dialogClass)
					.addClass(uiDialogClasses + value);
				break;
			case "disabled":
				if (value) {
					uiDialog.addClass('ui-dialog-disabled');
				} else {
					uiDialog.removeClass('ui-dialog-disabled');
				}
				break;
			case "draggable":
				if (value) {
					self._makeDraggable();
				} else {
					uiDialog.draggable('destroy');
				}
				break;
			case "height":
				resize = true;
				break;
			case "maxHeight":
				if (isResizable) {
					uiDialog.resizable('option', 'maxHeight', value);
				}
				resize = true;
				break;
			case "maxWidth":
				if (isResizable) {
					uiDialog.resizable('option', 'maxWidth', value);
				}
				resize = true;
				break;
			case "minHeight":
				if (isResizable) {
					uiDialog.resizable('option', 'minHeight', value);
				}
				resize = true;
				break;
			case "minWidth":
				if (isResizable) {
					uiDialog.resizable('option', 'minWidth', value);
				}
				resize = true;
				break;
			case "position":
				self._position(value);
				break;
			case "resizable":
				// currently resizable, becoming non-resizable
				if (isResizable && !value) {
					uiDialog.resizable('destroy');
				}

				// currently resizable, changing handles
				if (isResizable && typeof value === 'string') {
					uiDialog.resizable('option', 'handles', value);
				}

				// currently non-resizable, becoming resizable
				if (!isResizable && value !== false) {
					self._makeResizable(value);
				}
				break;
			case "title":
				// convert whatever was passed in o a string, for html() to not throw up
				$(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;'));
				break;
			case "width":
				resize = true;
				break;
		}

		$.Widget.prototype._setOption.apply(self, arguments);
		if (resize) {
			self._size();
		}
	},

	_size: function() {
		/* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
		 * divs will both have width and height set, so we need to reset them
		 */
		var options = this.options,
			nonContentHeight;

		// reset content sizing
		// hide for non content measurement because height: 0 doesn't work in IE quirks mode (see #4350)
		this.element.css({
			width: 'auto',
			minHeight: 0,
			height: 0
		});

		// reset wrapper sizing
		// determine the height of all the non-content elements
		nonContentHeight = this.uiDialog.css({
				height: 'auto',
				width: options.width
			})
			.height();

		this.element
			.css(options.height === 'auto' ? {
					minHeight: Math.max(options.minHeight - nonContentHeight, 0),
					height: 'auto'
				} : {
					minHeight: 0,
					height: Math.max(options.height - nonContentHeight, 0)				
			})
			.show();

		if (this.uiDialog.is(':data(resizable)')) {
			this.uiDialog.resizable('option', 'minHeight', this._minHeight());
		}
	}
});

$.extend($.ui.dialog, {
	version: "1.8.1",

	uuid: 0,
	maxZ: 0,

	getTitleId: function($el) {
		var id = $el.attr('id');
		if (!id) {
			this.uuid += 1;
			id = this.uuid;
		}
		return 'ui-dialog-title-' + id;
	},

	overlay: function(dialog) {
		this.$el = $.ui.dialog.overlay.create(dialog);
	}
});

$.extend($.ui.dialog.overlay, {
	instances: [],
	// reuse old instances due to IE memory leak with alpha transparency (see #5185)
	oldInstances: [],
	maxZ: 0,
	events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
		function(event) { return event + '.dialog-overlay'; }).join(' '),
	create: function(dialog) {
		if (this.instances.length === 0) {
			// prevent use of anchors and inputs
			// we use a setTimeout in case the overlay is created from an
			// event that we're going to be cancelling (see #2804)
			setTimeout(function() {
				// handle $(el).dialog().dialog('close') (see #4065)
				if ($.ui.dialog.overlay.instances.length) {
					$(document).bind($.ui.dialog.overlay.events, function(event) {
						// stop events if the z-index of the target is < the z-index of the overlay
						return ($(event.target).zIndex() >= $.ui.dialog.overlay.maxZ);
					});
				}
			}, 1);

			// allow closing by pressing the escape key
			$(document).bind('keydown.dialog-overlay', function(event) {
				if (dialog.options.closeOnEscape && event.keyCode &&
					event.keyCode === $.ui.keyCode.ESCAPE) {
					
					dialog.close(event);
					event.preventDefault();
				}
			});

			// handle window resize
			$(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
		}

		var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
			.appendTo(document.body)
			.css({
				width: this.width(),
				height: this.height()
			});

		if ($.fn.bgiframe) {
			$el.bgiframe();
		}

		this.instances.push($el);
		return $el;
	},

	destroy: function($el) {
		this.oldInstances.push(this.instances.splice($.inArray($el, this.instances), 1)[0]);

		if (this.instances.length === 0) {
			$([document, window]).unbind('.dialog-overlay');
		}

		$el.remove();
		
		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
		var maxZ = 0;
		$.each(this.instances, function() {
			maxZ = Math.max(maxZ, this.css('z-index'));
		});
		this.maxZ = maxZ;
	},

	height: function() {
		var scrollHeight,
			offsetHeight;
		// handle IE 6
		if ($.browser.msie && $.browser.version < 7) {
			scrollHeight = Math.max(
				document.documentElement.scrollHeight,
				document.body.scrollHeight
			);
			offsetHeight = Math.max(
				document.documentElement.offsetHeight,
				document.body.offsetHeight
			);

			if (scrollHeight < offsetHeight) {
				return $(window).height() + 'px';
			} else {
				return scrollHeight + 'px';
			}
		// handle "good" browsers
		} else {
			return $(document).height() + 'px';
		}
	},

	width: function() {
		var scrollWidth,
			offsetWidth;
		// handle IE 6
		if ($.browser.msie && $.browser.version < 7) {
			scrollWidth = Math.max(
				document.documentElement.scrollWidth,
				document.body.scrollWidth
			);
			offsetWidth = Math.max(
				document.documentElement.offsetWidth,
				document.body.offsetWidth
			);

			if (scrollWidth < offsetWidth) {
				return $(window).width() + 'px';
			} else {
				return scrollWidth + 'px';
			}
		// handle "good" browsers
		} else {
			return $(document).width() + 'px';
		}
	},

	resize: function() {
		/* If the dialog is draggable and the user drags it past the
		 * right edge of the window, the document becomes wider so we
		 * need to stretch the overlay. If the user then drags the
		 * dialog back to the left, the document will become narrower,
		 * so we need to shrink the overlay to the appropriate size.
		 * This is handled by shrinking the overlay before setting it
		 * to the full document size.
		 */
		var $overlays = $([]);
		$.each($.ui.dialog.overlay.instances, function() {
			$overlays = $overlays.add(this);
		});

		$overlays.css({
			width: 0,
			height: 0
		}).css({
			width: $.ui.dialog.overlay.width(),
			height: $.ui.dialog.overlay.height()
		});
	}
});

$.extend($.ui.dialog.overlay.prototype, {
	destroy: function() {
		$.ui.dialog.overlay.destroy(this.$el);
	}
});

}(jQuery));
/*
 * jQuery UI Slider 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Slider
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.mouse.js
 *	jquery.ui.widget.js
 */

(function( $ ) {

// number of pages in a slider
// (how many times can you page up/down to go through the whole range)
var numPages = 5;

$.widget( "ui.slider", $.ui.mouse, {

	widgetEventPrefix: "slide",

	options: {
		animate: false,
		distance: 0,
		max: 100,
		min: 0,
		orientation: "horizontal",
		range: false,
		step: 1,
		value: 0,
		values: null
	},

	_create: function() {
		var self = this,
			o = this.options;

		this._keySliding = false;
		this._mouseSliding = false;
		this._animateOff = true;
		this._handleIndex = null;
		this._detectOrientation();
		this._mouseInit();

		this.element
			.addClass( "ui-slider" +
				" ui-slider-" + this.orientation +
				" ui-widget" +
				" ui-widget-content" +
				" ui-corner-all" );
		
		if ( o.disabled ) {
			this.element.addClass( "ui-slider-disabled ui-disabled" );
		}

		this.range = $([]);

		if ( o.range ) {
			if ( o.range === true ) {
				this.range = $( "<div></div>" );
				if ( !o.values ) {
					o.values = [ this._valueMin(), this._valueMin() ];
				}
				if ( o.values.length && o.values.length !== 2 ) {
					o.values = [ o.values[0], o.values[0] ];
				}
			} else {
				this.range = $( "<div></div>" );
			}

			this.range
				.appendTo( this.element )
				.addClass( "ui-slider-range" );

			if ( o.range === "min" || o.range === "max" ) {
				this.range.addClass( "ui-slider-range-" + o.range );
			}

			// note: this isn't the most fittingly semantic framework class for this element,
			// but worked best visually with a variety of themes
			this.range.addClass( "ui-widget-header" );
		}

		if ( $( ".ui-slider-handle", this.element ).length === 0 ) {
			$( "<a href='#'></a>" )
				.appendTo( this.element )
				.addClass( "ui-slider-handle" );
		}

		if ( o.values && o.values.length ) {
			while ( $(".ui-slider-handle", this.element).length < o.values.length ) {
				$( "<a href='#'></a>" )
					.appendTo( this.element )
					.addClass( "ui-slider-handle" );
			}
		}

		this.handles = $( ".ui-slider-handle", this.element )
			.addClass( "ui-state-default" +
				" ui-corner-all" );

		this.handle = this.handles.eq( 0 );

		this.handles.add( this.range ).filter( "a" )
			.click(function( event ) {
				event.preventDefault();
			})
			.hover(function() {
				if ( !o.disabled ) {
					$( this ).addClass( "ui-state-hover" );
				}
			}, function() {
				$( this ).removeClass( "ui-state-hover" );
			})
			.focus(function() {
				if ( !o.disabled ) {
					$( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
					$( this ).addClass( "ui-state-focus" );
				} else {
					$( this ).blur();
				}
			})
			.blur(function() {
				$( this ).removeClass( "ui-state-focus" );
			});

		this.handles.each(function( i ) {
			$( this ).data( "index.ui-slider-handle", i );
		});

		this.handles
			.keydown(function( event ) {
				var ret = true,
					index = $( this ).data( "index.ui-slider-handle" ),
					allowed,
					curVal,
					newVal,
					step;
	
				if ( self.options.disabled ) {
					return;
				}
	
				switch ( event.keyCode ) {
					case $.ui.keyCode.HOME:
					case $.ui.keyCode.END:
					case $.ui.keyCode.PAGE_UP:
					case $.ui.keyCode.PAGE_DOWN:
					case $.ui.keyCode.UP:
					case $.ui.keyCode.RIGHT:
					case $.ui.keyCode.DOWN:
					case $.ui.keyCode.LEFT:
						ret = false;
						if ( !self._keySliding ) {
							self._keySliding = true;
							$( this ).addClass( "ui-state-active" );
							allowed = self._start( event, index );
							if ( allowed === false ) {
								return;
							}
						}
						break;
				}
	
				step = self.options.step;
				if ( self.options.values && self.options.values.length ) {
					curVal = newVal = self.values( index );
				} else {
					curVal = newVal = self.value();
				}
	
				switch ( event.keyCode ) {
					case $.ui.keyCode.HOME:
						newVal = self._valueMin();
						break;
					case $.ui.keyCode.END:
						newVal = self._valueMax();
						break;
					case $.ui.keyCode.PAGE_UP:
						newVal = curVal + ( (self._valueMax() - self._valueMin()) / numPages );
						break;
					case $.ui.keyCode.PAGE_DOWN:
						newVal = curVal - ( (self._valueMax() - self._valueMin()) / numPages );
						break;
					case $.ui.keyCode.UP:
					case $.ui.keyCode.RIGHT:
						if ( curVal === self._valueMax() ) {
							return;
						}
						newVal = curVal + step;
						break;
					case $.ui.keyCode.DOWN:
					case $.ui.keyCode.LEFT:
						if ( curVal === self._valueMin() ) {
							return;
						}
						newVal = curVal - step;
						break;
				}
	
				self._slide( event, index, newVal );
	
				return ret;
	
			})
			.keyup(function( event ) {
				var index = $( this ).data( "index.ui-slider-handle" );
	
				if ( self._keySliding ) {
					self._keySliding = false;
					self._stop( event, index );
					self._change( event, index );
					$( this ).removeClass( "ui-state-active" );
				}
	
			});

		this._refreshValue();

		this._animateOff = false;
	},

	destroy: function() {
		this.handles.remove();
		this.range.remove();

		this.element
			.removeClass( "ui-slider" +
				" ui-slider-horizontal" +
				" ui-slider-vertical" +
				" ui-slider-disabled" +
				" ui-widget" +
				" ui-widget-content" +
				" ui-corner-all" )
			.removeData( "slider" )
			.unbind( ".slider" );

		this._mouseDestroy();

		return this;
	},

	_mouseCapture: function( event ) {
		var o = this.options,
			position,
			normValue,
			distance,
			closestHandle,
			self,
			index,
			allowed,
			offset,
			mouseOverHandle;

		if ( o.disabled ) {
			return false;
		}

		this.elementSize = {
			width: this.element.outerWidth(),
			height: this.element.outerHeight()
		};
		this.elementOffset = this.element.offset();

		position = { x: event.pageX, y: event.pageY };
		normValue = this._normValueFromMouse( position );
		distance = this._valueMax() - this._valueMin() + 1;
		self = this;
		this.handles.each(function( i ) {
			var thisDistance = Math.abs( normValue - self.values(i) );
			if ( distance > thisDistance ) {
				distance = thisDistance;
				closestHandle = $( this );
				index = i;
			}
		});

		// workaround for bug #3736 (if both handles of a range are at 0,
		// the first is always used as the one with least distance,
		// and moving it is obviously prevented by preventing negative ranges)
		if( o.range === true && this.values(1) === o.min ) {
			index += 1;
			closestHandle = $( this.handles[index] );
		}

		allowed = this._start( event, index );
		if ( allowed === false ) {
			return false;
		}
		this._mouseSliding = true;

		self._handleIndex = index;

		closestHandle
			.addClass( "ui-state-active" )
			.focus();
		
		offset = closestHandle.offset();
		mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
			top: event.pageY - offset.top -
				( closestHandle.height() / 2 ) -
				( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
				( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
				( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
		};

		normValue = this._normValueFromMouse( position );
		this._slide( event, index, normValue );
		this._animateOff = true;
		return true;
	},

	_mouseStart: function( event ) {
		return true;
	},

	_mouseDrag: function( event ) {
		var position = { x: event.pageX, y: event.pageY },
			normValue = this._normValueFromMouse( position );
		
		this._slide( event, this._handleIndex, normValue );

		return false;
	},

	_mouseStop: function( event ) {
		this.handles.removeClass( "ui-state-active" );
		this._mouseSliding = false;

		this._stop( event, this._handleIndex );
		this._change( event, this._handleIndex );

		this._handleIndex = null;
		this._clickOffset = null;
		this._animateOff = false;

		return false;
	},
	
	_detectOrientation: function() {
		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
	},

	_normValueFromMouse: function( position ) {
		var pixelTotal,
			pixelMouse,
			percentMouse,
			valueTotal,
			valueMouse;

		if ( this.orientation === "horizontal" ) {
			pixelTotal = this.elementSize.width;
			pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
		} else {
			pixelTotal = this.elementSize.height;
			pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
		}

		percentMouse = ( pixelMouse / pixelTotal );
		if ( percentMouse > 1 ) {
			percentMouse = 1;
		}
		if ( percentMouse < 0 ) {
			percentMouse = 0;
		}
		if ( this.orientation === "vertical" ) {
			percentMouse = 1 - percentMouse;
		}

		valueTotal = this._valueMax() - this._valueMin();
		valueMouse = this._valueMin() + percentMouse * valueTotal;

		return this._trimAlignValue( valueMouse );
	},

	_start: function( event, index ) {
		var uiHash = {
			handle: this.handles[ index ],
			value: this.value()
		};
		if ( this.options.values && this.options.values.length ) {
			uiHash.value = this.values( index );
			uiHash.values = this.values();
		}
		return this._trigger( "start", event, uiHash );
	},

	_slide: function( event, index, newVal ) {
		var otherVal,
			newValues,
			allowed;

		if ( this.options.values && this.options.values.length ) {
			otherVal = this.values( index ? 0 : 1 );

			if ( ( this.options.values.length === 2 && this.options.range === true ) && 
					( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
				) {
				newVal = otherVal;
			}

			if ( newVal !== this.values( index ) ) {
				newValues = this.values();
				newValues[ index ] = newVal;
				// A slide can be canceled by returning false from the slide callback
				allowed = this._trigger( "slide", event, {
					handle: this.handles[ index ],
					value: newVal,
					values: newValues
				} );
				otherVal = this.values( index ? 0 : 1 );
				if ( allowed !== false ) {
					this.values( index, newVal, true );
				}
			}
		} else {
			if ( newVal !== this.value() ) {
				// A slide can be canceled by returning false from the slide callback
				allowed = this._trigger( "slide", event, {
					handle: this.handles[ index ],
					value: newVal
				} );
				if ( allowed !== false ) {
					this.value( newVal );
				}
			}
		}
	},

	_stop: function( event, index ) {
		var uiHash = {
			handle: this.handles[ index ],
			value: this.value()
		};
		if ( this.options.values && this.options.values.length ) {
			uiHash.value = this.values( index );
			uiHash.values = this.values();
		}

		this._trigger( "stop", event, uiHash );
	},

	_change: function( event, index ) {
		if ( !this._keySliding && !this._mouseSliding ) {
			var uiHash = {
				handle: this.handles[ index ],
				value: this.value()
			};
			if ( this.options.values && this.options.values.length ) {
				uiHash.value = this.values( index );
				uiHash.values = this.values();
			}

			this._trigger( "change", event, uiHash );
		}
	},

	value: function( newValue ) {
		if ( arguments.length ) {
			this.options.value = this._trimAlignValue( newValue );
			this._refreshValue();
			this._change( null, 0 );
		}

		return this._value();
	},

	values: function( index, newValue ) {
		var vals,
			newValues,
			i;

		if ( arguments.length > 1 ) {
			this.options.values[ index ] = this._trimAlignValue( newValue );
			this._refreshValue();
			this._change( null, index );
		}

		if ( arguments.length ) {
			if ( $.isArray( arguments[ 0 ] ) ) {
				vals = this.options.values;
				newValues = arguments[ 0 ];
				for ( i = 0; i < vals.length; i += 1 ) {
					vals[ i ] = this._trimAlignValue( newValues[ i ] );
					this._change( null, i );
				}
				this._refreshValue();
			} else {
				if ( this.options.values && this.options.values.length ) {
					return this._values( index );
				} else {
					return this.value();
				}
			}
		} else {
			return this._values();
		}
	},

	_setOption: function( key, value ) {
		var i,
			valsLength = 0;

		if ( $.isArray( this.options.values ) ) {
			valsLength = this.options.values.length;
		}

		$.Widget.prototype._setOption.apply( this, arguments );

		switch ( key ) {
			case "disabled":
				if ( value ) {
					this.handles.filter( ".ui-state-focus" ).blur();
					this.handles.removeClass( "ui-state-hover" );
					this.handles.attr( "disabled", "disabled" );
					this.element.addClass( "ui-disabled" );
				} else {
					this.handles.removeAttr( "disabled" );
					this.element.removeClass( "ui-disabled" );
				}
				break;
			case "orientation":
				this._detectOrientation();
				this.element
					.removeClass( "ui-slider-horizontal ui-slider-vertical" )
					.addClass( "ui-slider-" + this.orientation );
				this._refreshValue();
				break;
			case "value":
				this._animateOff = true;
				this._refreshValue();
				this._change( null, 0 );
				this._animateOff = false;
				break;
			case "values":
				this._animateOff = true;
				this._refreshValue();
				for ( i = 0; i < valsLength; i += 1 ) {
					this._change( null, i );
				}
				this._animateOff = false;
				break;
		}
	},

	//internal value getter
	// _value() returns value trimmed by min and max, aligned by step
	_value: function() {
		var val = this.options.value;
		val = this._trimAlignValue( val );

		return val;
	},

	//internal values getter
	// _values() returns array of values trimmed by min and max, aligned by step
	// _values( index ) returns single value trimmed by min and max, aligned by step
	_values: function( index ) {
		var val,
			vals,
			i;

		if ( arguments.length ) {
			val = this.options.values[ index ];
			val = this._trimAlignValue( val );

			return val;
		} else {
			// .slice() creates a copy of the array
			// this copy gets trimmed by min and max and then returned
			vals = this.options.values.slice();
			for ( i = 0; i < vals.length; i+= 1) {
				vals[ i ] = this._trimAlignValue( vals[ i ] );
			}

			return vals;
		}
	},
	
	// returns the step-aligned value that val is closest to, between (inclusive) min and max
	_trimAlignValue: function( val ) {
		if ( val < this._valueMin() ) {
			return this._valueMin();
		}
		if ( val > this._valueMax() ) {
			return this._valueMax();
		}
		var step = this.options.step,
			valModStep = val % step,
			alignValue = val - valModStep;

		if ( valModStep >= ( step / 2 ) ) {
			alignValue += step;
		}

		// Since JavaScript has problems with large floats, round
		// the final value to 5 digits after the decimal point (see #4124)
		return parseFloat( alignValue.toFixed(5) );
	},

	_valueMin: function() {
		return this.options.min;
	},

	_valueMax: function() {
		return this.options.max;
	},
	
	_refreshValue: function() {
		var oRange = this.options.range,
			o = this.options,
			self = this,
			animate = ( !this._animateOff ) ? o.animate : false,
			valPercent,
			_set = {},
			lastValPercent,
			value,
			valueMin,
			valueMax;

		if ( this.options.values && this.options.values.length ) {
			this.handles.each(function( i, j ) {
				valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
				_set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
				if ( self.options.range === true ) {
					if ( self.orientation === "horizontal" ) {
						if ( i === 0 ) {
							self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
						}
						if ( i === 1 ) {
							self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
						}
					} else {
						if ( i === 0 ) {
							self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
						}
						if ( i === 1 ) {
							self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
						}
					}
				}
				lastValPercent = valPercent;
			});
		} else {
			value = this.value();
			valueMin = this._valueMin();
			valueMax = this._valueMax();
			valPercent = ( valueMax !== valueMin ) ?
					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
					0;
			_set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );

			if ( oRange === "min" && this.orientation === "horizontal" ) {
				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
			}
			if ( oRange === "max" && this.orientation === "horizontal" ) {
				this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
			}
			if ( oRange === "min" && this.orientation === "vertical" ) {
				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
			}
			if ( oRange === "max" && this.orientation === "vertical" ) {
				this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
			}
		}
	}

});

$.extend( $.ui.slider, {
	version: "1.8.1"
});

}(jQuery));
/*
 * jQuery UI Tabs 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Tabs
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.widget.js
 */
(function($) {

var tabId = 0,
	listId = 0;

$.widget("ui.tabs", {
	options: {
		add: null,
		ajaxOptions: null,
		cache: false,
		cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
		collapsible: false,
		disable: null,
		disabled: [],
		enable: null,
		event: 'click',
		fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
		idPrefix: 'ui-tabs-',
		load: null,
		panelTemplate: '<div></div>',
		remove: null,
		select: null,
		show: null,
		spinner: '<em>Loading&#8230;</em>',
		tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>'
	},
	_create: function() {
		this._tabify(true);
	},

	_setOption: function(key, value) {
		if (key == 'selected') {
			if (this.options.collapsible && value == this.options.selected) {
				return;
			}
			this.select(value);
		}
		else {
			this.options[key] = value;
			this._tabify();
		}
	},

	_tabId: function(a) {
		return a.title && a.title.replace(/\s/g, '_').replace(/[^A-Za-z0-9\-_:\.]/g, '') ||
			this.options.idPrefix + (++tabId);
	},

	_sanitizeSelector: function(hash) {
		return hash.replace(/:/g, '\\:'); // we need this because an id may contain a ":"
	},

	_cookie: function() {
		var cookie = this.cookie || (this.cookie = this.options.cookie.name || 'ui-tabs-' + (++listId));
		return $.cookie.apply(null, [cookie].concat($.makeArray(arguments)));
	},

	_ui: function(tab, panel) {
		return {
			tab: tab,
			panel: panel,
			index: this.anchors.index(tab)
		};
	},

	_cleanup: function() {
		// restore all former loading tabs labels
		this.lis.filter('.ui-state-processing').removeClass('ui-state-processing')
				.find('span:data(label.tabs)')
				.each(function() {
					var el = $(this);
					el.html(el.data('label.tabs')).removeData('label.tabs');
				});
	},

	_tabify: function(init) {

		this.list = this.element.find('ol,ul').eq(0);
		this.lis = $('li:has(a[href])', this.list);
		this.anchors = this.lis.map(function() { return $('a', this)[0]; });
		this.panels = $([]);

		var self = this, o = this.options;

		var fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash
		this.anchors.each(function(i, a) {
			var href = $(a).attr('href');

			// For dynamically created HTML that contains a hash as href IE < 8 expands
			// such href to the full page url with hash and then misinterprets tab as ajax.
			// Same consideration applies for an added tab with a fragment identifier
			// since a[href=#fragment-identifier] does unexpectedly not match.
			// Thus normalize href attribute...
			var hrefBase = href.split('#')[0], baseEl;
			if (hrefBase && (hrefBase === location.toString().split('#')[0] ||
					(baseEl = $('base')[0]) && hrefBase === baseEl.href)) {
				href = a.hash;
				a.href = href;
			}

			// inline tab
			if (fragmentId.test(href)) {
				self.panels = self.panels.add(self._sanitizeSelector(href));
			}

			// remote tab
			else if (href != '#') { // prevent loading the page itself if href is just "#"
				$.data(a, 'href.tabs', href); // required for restore on destroy

				// TODO until #3808 is fixed strip fragment identifier from url
				// (IE fails to load from such url)
				$.data(a, 'load.tabs', href.replace(/#.*$/, '')); // mutable data

				var id = self._tabId(a);
				a.href = '#' + id;
				var $panel = $('#' + id);
				if (!$panel.length) {
					$panel = $(o.panelTemplate).attr('id', id).addClass('ui-tabs-panel ui-widget-content ui-corner-bottom')
						.insertAfter(self.panels[i - 1] || self.list);
					$panel.data('destroy.tabs', true);
				}
				self.panels = self.panels.add($panel);
			}

			// invalid tab href
			else {
				o.disabled.push(i);
			}
		});

		// initialization from scratch
		if (init) {

			// attach necessary classes for styling
			this.element.addClass('ui-tabs ui-widget ui-widget-content ui-corner-all');
			this.list.addClass('ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all');
			this.lis.addClass('ui-state-default ui-corner-top');
			this.panels.addClass('ui-tabs-panel ui-widget-content ui-corner-bottom');

			// Selected tab
			// use "selected" option or try to retrieve:
			// 1. from fragment identifier in url
			// 2. from cookie
			// 3. from selected class attribute on <li>
			if (o.selected === undefined) {
				if (location.hash) {
					this.anchors.each(function(i, a) {
						if (a.hash == location.hash) {
							o.selected = i;
							return false; // break
						}
					});
				}
				if (typeof o.selected != 'number' && o.cookie) {
					o.selected = parseInt(self._cookie(), 10);
				}
				if (typeof o.selected != 'number' && this.lis.filter('.ui-tabs-selected').length) {
					o.selected = this.lis.index(this.lis.filter('.ui-tabs-selected'));
				}
				o.selected = o.selected || (this.lis.length ? 0 : -1);
			}
			else if (o.selected === null) { // usage of null is deprecated, TODO remove in next release
				o.selected = -1;
			}

			// sanity check - default to first tab...
			o.selected = ((o.selected >= 0 && this.anchors[o.selected]) || o.selected < 0) ? o.selected : 0;

			// Take disabling tabs via class attribute from HTML
			// into account and update option properly.
			// A selected tab cannot become disabled.
			o.disabled = $.unique(o.disabled.concat(
				$.map(this.lis.filter('.ui-state-disabled'),
					function(n, i) { return self.lis.index(n); } )
			)).sort();

			if ($.inArray(o.selected, o.disabled) != -1) {
				o.disabled.splice($.inArray(o.selected, o.disabled), 1);
			}

			// highlight selected tab
			this.panels.addClass('ui-tabs-hide');
			this.lis.removeClass('ui-tabs-selected ui-state-active');
			if (o.selected >= 0 && this.anchors.length) { // check for length avoids error when initializing empty list
				this.panels.eq(o.selected).removeClass('ui-tabs-hide');
				this.lis.eq(o.selected).addClass('ui-tabs-selected ui-state-active');

				// seems to be expected behavior that the show callback is fired
				self.element.queue("tabs", function() {
					self._trigger('show', null, self._ui(self.anchors[o.selected], self.panels[o.selected]));
				});
				
				this.load(o.selected);
			}

			// clean up to avoid memory leaks in certain versions of IE 6
			$(window).bind('unload', function() {
				self.lis.add(self.anchors).unbind('.tabs');
				self.lis = self.anchors = self.panels = null;
			});

		}
		// update selected after add/remove
		else {
			o.selected = this.lis.index(this.lis.filter('.ui-tabs-selected'));
		}

		// update collapsible
		this.element[o.collapsible ? 'addClass' : 'removeClass']('ui-tabs-collapsible');

		// set or update cookie after init and add/remove respectively
		if (o.cookie) {
			this._cookie(o.selected, o.cookie);
		}

		// disable tabs
		for (var i = 0, li; (li = this.lis[i]); i++) {
			$(li)[$.inArray(i, o.disabled) != -1 &&
				!$(li).hasClass('ui-tabs-selected') ? 'addClass' : 'removeClass']('ui-state-disabled');
		}

		// reset cache if switching from cached to not cached
		if (o.cache === false) {
			this.anchors.removeData('cache.tabs');
		}

		// remove all handlers before, tabify may run on existing tabs after add or option change
		this.lis.add(this.anchors).unbind('.tabs');

		if (o.event != 'mouseover') {
			var addState = function(state, el) {
				if (el.is(':not(.ui-state-disabled)')) {
					el.addClass('ui-state-' + state);
				}
			};
			var removeState = function(state, el) {
				el.removeClass('ui-state-' + state);
			};
			this.lis.bind('mouseover.tabs', function() {
				addState('hover', $(this));
			});
			this.lis.bind('mouseout.tabs', function() {
				removeState('hover', $(this));
			});
			this.anchors.bind('focus.tabs', function() {
				addState('focus', $(this).closest('li'));
			});
			this.anchors.bind('blur.tabs', function() {
				removeState('focus', $(this).closest('li'));
			});
		}

		// set up animations
		var hideFx, showFx;
		if (o.fx) {
			if ($.isArray(o.fx)) {
				hideFx = o.fx[0];
				showFx = o.fx[1];
			}
			else {
				hideFx = showFx = o.fx;
			}
		}

		// Reset certain styles left over from animation
		// and prevent IE's ClearType bug...
		function resetStyle($el, fx) {
			$el.css({ display: '' });
			if (!$.support.opacity && fx.opacity) {
				$el[0].style.removeAttribute('filter');
			}
		}

		// Show a tab...
		var showTab = showFx ?
			function(clicked, $show) {
				$(clicked).closest('li').addClass('ui-tabs-selected ui-state-active');
				$show.hide().removeClass('ui-tabs-hide') // avoid flicker that way
					.animate(showFx, showFx.duration || 'normal', function() {
						resetStyle($show, showFx);
						self._trigger('show', null, self._ui(clicked, $show[0]));
					});
			} :
			function(clicked, $show) {
				$(clicked).closest('li').addClass('ui-tabs-selected ui-state-active');
				$show.removeClass('ui-tabs-hide');
				self._trigger('show', null, self._ui(clicked, $show[0]));
			};

		// Hide a tab, $show is optional...
		var hideTab = hideFx ?
			function(clicked, $hide) {
				$hide.animate(hideFx, hideFx.duration || 'normal', function() {
					self.lis.removeClass('ui-tabs-selected ui-state-active');
					$hide.addClass('ui-tabs-hide');
					resetStyle($hide, hideFx);
					self.element.dequeue("tabs");
				});
			} :
			function(clicked, $hide, $show) {
				self.lis.removeClass('ui-tabs-selected ui-state-active');
				$hide.addClass('ui-tabs-hide');
				self.element.dequeue("tabs");
			};

		// attach tab event handler, unbind to avoid duplicates from former tabifying...
		this.anchors.bind(o.event + '.tabs', function() {
			var el = this, $li = $(this).closest('li'), $hide = self.panels.filter(':not(.ui-tabs-hide)'),
					$show = $(self._sanitizeSelector(this.hash));

			// If tab is already selected and not collapsible or tab disabled or
			// or is already loading or click callback returns false stop here.
			// Check if click handler returns false last so that it is not executed
			// for a disabled or loading tab!
			if (($li.hasClass('ui-tabs-selected') && !o.collapsible) ||
				$li.hasClass('ui-state-disabled') ||
				$li.hasClass('ui-state-processing') ||
				self._trigger('select', null, self._ui(this, $show[0])) === false) {
				this.blur();
				return false;
			}

			o.selected = self.anchors.index(this);

			self.abort();

			// if tab may be closed
			if (o.collapsible) {
				if ($li.hasClass('ui-tabs-selected')) {
					o.selected = -1;

					if (o.cookie) {
						self._cookie(o.selected, o.cookie);
					}

					self.element.queue("tabs", function() {
						hideTab(el, $hide);
					}).dequeue("tabs");
					
					this.blur();
					return false;
				}
				else if (!$hide.length) {
					if (o.cookie) {
						self._cookie(o.selected, o.cookie);
					}
					
					self.element.queue("tabs", function() {
						showTab(el, $show);
					});

					self.load(self.anchors.index(this)); // TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171
					
					this.blur();
					return false;
				}
			}

			if (o.cookie) {
				self._cookie(o.selected, o.cookie);
			}

			// show new tab
			if ($show.length) {
				if ($hide.length) {
					self.element.queue("tabs", function() {
						hideTab(el, $hide);
					});
				}
				self.element.queue("tabs", function() {
					showTab(el, $show);
				});
				
				self.load(self.anchors.index(this));
			}
			else {
				throw 'jQuery UI Tabs: Mismatching fragment identifier.';
			}

			// Prevent IE from keeping other link focussed when using the back button
			// and remove dotted border from clicked link. This is controlled via CSS
			// in modern browsers; blur() removes focus from address bar in Firefox
			// which can become a usability and annoying problem with tabs('rotate').
			if ($.browser.msie) {
				this.blur();
			}

		});

		// disable click in any case
		this.anchors.bind('click.tabs', function(){return false;});

	},

	destroy: function() {
		var o = this.options;

		this.abort();
		
		this.element.unbind('.tabs')
			.removeClass('ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible')
			.removeData('tabs');

		this.list.removeClass('ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all');

		this.anchors.each(function() {
			var href = $.data(this, 'href.tabs');
			if (href) {
				this.href = href;
			}
			var $this = $(this).unbind('.tabs');
			$.each(['href', 'load', 'cache'], function(i, prefix) {
				$this.removeData(prefix + '.tabs');
			});
		});

		this.lis.unbind('.tabs').add(this.panels).each(function() {
			if ($.data(this, 'destroy.tabs')) {
				$(this).remove();
			}
			else {
				$(this).removeClass([
					'ui-state-default',
					'ui-corner-top',
					'ui-tabs-selected',
					'ui-state-active',
					'ui-state-hover',
					'ui-state-focus',
					'ui-state-disabled',
					'ui-tabs-panel',
					'ui-widget-content',
					'ui-corner-bottom',
					'ui-tabs-hide'
				].join(' '));
			}
		});

		if (o.cookie) {
			this._cookie(null, o.cookie);
		}

		return this;
	},

	add: function(url, label, index) {
		if (index === undefined) {
			index = this.anchors.length; // append by default
		}

		var self = this, o = this.options,
			$li = $(o.tabTemplate.replace(/#\{href\}/g, url).replace(/#\{label\}/g, label)),
			id = !url.indexOf('#') ? url.replace('#', '') : this._tabId($('a', $li)[0]);

		$li.addClass('ui-state-default ui-corner-top').data('destroy.tabs', true);

		// try to find an existing element before creating a new one
		var $panel = $('#' + id);
		if (!$panel.length) {
			$panel = $(o.panelTemplate).attr('id', id).data('destroy.tabs', true);
		}
		$panel.addClass('ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide');

		if (index >= this.lis.length) {
			$li.appendTo(this.list);
			$panel.appendTo(this.list[0].parentNode);
		}
		else {
			$li.insertBefore(this.lis[index]);
			$panel.insertBefore(this.panels[index]);
		}

		o.disabled = $.map(o.disabled,
			function(n, i) { return n >= index ? ++n : n; });

		this._tabify();

		if (this.anchors.length == 1) { // after tabify
			o.selected = 0;
			$li.addClass('ui-tabs-selected ui-state-active');
			$panel.removeClass('ui-tabs-hide');
			this.element.queue("tabs", function() {
				self._trigger('show', null, self._ui(self.anchors[0], self.panels[0]));
			});
				
			this.load(0);
		}

		// callback
		this._trigger('add', null, this._ui(this.anchors[index], this.panels[index]));
		return this;
	},

	remove: function(index) {
		var o = this.options, $li = this.lis.eq(index).remove(),
			$panel = this.panels.eq(index).remove();

		// If selected tab was removed focus tab to the right or
		// in case the last tab was removed the tab to the left.
		if ($li.hasClass('ui-tabs-selected') && this.anchors.length > 1) {
			this.select(index + (index + 1 < this.anchors.length ? 1 : -1));
		}

		o.disabled = $.map($.grep(o.disabled, function(n, i) { return n != index; }),
			function(n, i) { return n >= index ? --n : n; });

		this._tabify();

		// callback
		this._trigger('remove', null, this._ui($li.find('a')[0], $panel[0]));
		return this;
	},

	enable: function(index) {
		var o = this.options;
		if ($.inArray(index, o.disabled) == -1) {
			return;
		}

		this.lis.eq(index).removeClass('ui-state-disabled');
		o.disabled = $.grep(o.disabled, function(n, i) { return n != index; });

		// callback
		this._trigger('enable', null, this._ui(this.anchors[index], this.panels[index]));
		return this;
	},

	disable: function(index) {
		var self = this, o = this.options;
		if (index != o.selected) { // cannot disable already selected tab
			this.lis.eq(index).addClass('ui-state-disabled');

			o.disabled.push(index);
			o.disabled.sort();

			// callback
			this._trigger('disable', null, this._ui(this.anchors[index], this.panels[index]));
		}

		return this;
	},

	select: function(index) {
		if (typeof index == 'string') {
			index = this.anchors.index(this.anchors.filter('[href$=' + index + ']'));
		}
		else if (index === null) { // usage of null is deprecated, TODO remove in next release
			index = -1;
		}
		if (index == -1 && this.options.collapsible) {
			index = this.options.selected;
		}

		this.anchors.eq(index).trigger(this.options.event + '.tabs');
		return this;
	},

	load: function(index) {
		var self = this, o = this.options, a = this.anchors.eq(index)[0], url = $.data(a, 'load.tabs');

		this.abort();

		// not remote or from cache
		if (!url || this.element.queue("tabs").length !== 0 && $.data(a, 'cache.tabs')) {
			this.element.dequeue("tabs");
			return;
		}

		// load remote from here on
		this.lis.eq(index).addClass('ui-state-processing');

		if (o.spinner) {
			var span = $('span', a);
			span.data('label.tabs', span.html()).html(o.spinner);
		}

		this.xhr = $.ajax($.extend({}, o.ajaxOptions, {
			url: url,
			success: function(r, s) {
				$(self._sanitizeSelector(a.hash)).html(r);

				// take care of tab labels
				self._cleanup();

				if (o.cache) {
					$.data(a, 'cache.tabs', true); // if loaded once do not load them again
				}

				// callbacks
				self._trigger('load', null, self._ui(self.anchors[index], self.panels[index]));
				try {
					o.ajaxOptions.success(r, s);
				}
				catch (e) {}
			},
			error: function(xhr, s, e) {
				// take care of tab labels
				self._cleanup();

				// callbacks
				self._trigger('load', null, self._ui(self.anchors[index], self.panels[index]));
				try {
					// Passing index avoid a race condition when this method is
					// called after the user has selected another tab.
					// Pass the anchor that initiated this request allows
					// loadError to manipulate the tab content panel via $(a.hash)
					o.ajaxOptions.error(xhr, s, index, a);
				}
				catch (e) {}
			}
		}));

		// last, so that load event is fired before show...
		self.element.dequeue("tabs");

		return this;
	},

	abort: function() {
		// stop possibly running animations
		this.element.queue([]);
		this.panels.stop(false, true);

		// "tabs" queue must not contain more than two elements,
		// which are the callbacks for the latest clicked tab...
		this.element.queue("tabs", this.element.queue("tabs").splice(-2, 2));

		// terminate pending requests from other tabs
		if (this.xhr) {
			this.xhr.abort();
			delete this.xhr;
		}

		// take care of tab labels
		this._cleanup();
		return this;
	},

	url: function(index, url) {
		this.anchors.eq(index).removeData('cache.tabs').data('load.tabs', url);
		return this;
	},

	length: function() {
		return this.anchors.length;
	}

});

$.extend($.ui.tabs, {
	version: '1.8.1'
});

/*
 * Tabs Extensions
 */

/*
 * Rotate
 */
$.extend($.ui.tabs.prototype, {
	rotation: null,
	rotate: function(ms, continuing) {

		var self = this, o = this.options;
		
		var rotate = self._rotate || (self._rotate = function(e) {
			clearTimeout(self.rotation);
			self.rotation = setTimeout(function() {
				var t = o.selected;
				self.select( ++t < self.anchors.length ? t : 0 );
			}, ms);
			
			if (e) {
				e.stopPropagation();
			}
		});
		
		var stop = self._unrotate || (self._unrotate = !continuing ?
			function(e) {
				if (e.clientX) { // in case of a true click
					self.rotate(null);
				}
			} :
			function(e) {
				t = o.selected;
				rotate();
			});

		// start rotation
		if (ms) {
			this.element.bind('tabsshow', rotate);
			this.anchors.bind(o.event + '.tabs', stop);
			rotate();
		}
		// stop rotation
		else {
			clearTimeout(self.rotation);
			this.element.unbind('tabsshow', rotate);
			this.anchors.unbind(o.event + '.tabs', stop);
			delete this._rotate;
			delete this._unrotate;
		}

		return this;
	}
});

})(jQuery);
/*
 * jQuery UI Datepicker 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Datepicker
 *
 * Depends:
 *	jquery.ui.core.js
 */

(function($) { // hide the namespace

$.extend($.ui, { datepicker: { version: "1.8.1" } });

var PROP_NAME = 'datepicker';
var dpuuid = new Date().getTime();

/* Date picker manager.
   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
   Settings for (groups of) date pickers are maintained in an instance object,
   allowing multiple different settings on the same page. */

function Datepicker() {
	this.debug = false; // Change this to true to start debugging
	this._curInst = null; // The current instance in use
	this._keyEvent = false; // If the last event was a key event
	this._disabledInputs = []; // List of date picker inputs that have been disabled
	this._datepickerShowing = false; // True if the popup picker is showing , false if not
	this._inDialog = false; // True if showing within a "dialog", false if not
	this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
	this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
	this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
	this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
	this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
	this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
	this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
	this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
	this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
	this.regional = []; // Available regional settings, indexed by language code
	this.regional[''] = { // Default regional settings
		closeText: 'Done', // Display text for close link
		prevText: 'Prev', // Display text for previous month link
		nextText: 'Next', // Display text for next month link
		currentText: 'Today', // Display text for current month link
		monthNames: ['January','February','March','April','May','June',
			'July','August','September','October','November','December'], // Names of months for drop-down and formatting
		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
		weekHeader: 'Wk', // Column header for week of the year
		dateFormat: 'mm/dd/yy', // See format options on parseDate
		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
		isRTL: false, // True if right-to-left language, false if left-to-right
		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
		yearSuffix: '' // Additional text to append to the year in the month headers
	};
	this._defaults = { // Global defaults for all the date picker instances
		showOn: 'focus', // 'focus' for popup on focus,
			// 'button' for trigger button, or 'both' for either
		showAnim: 'show', // Name of jQuery animation for popup
		showOptions: {}, // Options for enhanced animations
		defaultDate: null, // Used when field is blank: actual date,
			// +/-number for offset from today, null for today
		appendText: '', // Display text following the input box, e.g. showing the format
		buttonText: '...', // Text for trigger button
		buttonImage: '', // URL for trigger button image
		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
		hideIfNoPrevNext: false, // True to hide next/previous month links
			// if not applicable, false to just disable them
		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
		gotoCurrent: false, // True if today link goes back to current selection instead
		changeMonth: false, // True if month can be selected directly, false if only prev/next
		changeYear: false, // True if year can be selected directly, false if only prev/next
		yearRange: 'c-10:c+10', // Range of years to display in drop-down,
			// either relative to today's year (-nn:+nn), relative to currently displayed year
			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
		showOtherMonths: false, // True to show dates in other months, false to leave blank
		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
		showWeek: false, // True to show week of the year, false to not show it
		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
			// takes a Date and returns the number of the week for it
		shortYearCutoff: '+10', // Short year values < this are in the current century,
			// > this are in the previous century,
			// string value starting with '+' for current year + value
		minDate: null, // The earliest selectable date, or null for no limit
		maxDate: null, // The latest selectable date, or null for no limit
		duration: '_default', // Duration of display/closure
		beforeShowDay: null, // Function that takes a date and returns an array with
			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
		beforeShow: null, // Function that takes an input field and
			// returns a set of custom settings for the date picker
		onSelect: null, // Define a callback function when a date is selected
		onChangeMonthYear: null, // Define a callback function when the month or year is changed
		onClose: null, // Define a callback function when the datepicker is closed
		numberOfMonths: 1, // Number of months to show at a time
		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
		stepMonths: 1, // Number of months to step back/forward
		stepBigMonths: 12, // Number of months to step back/forward for the big links
		altField: '', // Selector for an alternate field to store selected dates into
		altFormat: '', // The date format to use for the alternate field
		constrainInput: true, // The input is constrained by the current date format
		showButtonPanel: false, // True to show button panel, false to not show it
		autoSize: false // True to size the input for the date format, false to leave as is
	};
	$.extend(this._defaults, this.regional['']);
	this.dpDiv = $('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>');
}

$.extend(Datepicker.prototype, {
	/* Class name added to elements to indicate already configured with a date picker. */
	markerClassName: 'hasDatepicker',

	/* Debug logging (if enabled). */
	log: function () {
		if (this.debug)
			console.log.apply('', arguments);
	},
	
	// TODO rename to "widget" when switching to widget factory
	_widgetDatepicker: function() {
		return this.dpDiv;
	},

	/* Override the default settings for all instances of the date picker.
	   @param  settings  object - the new settings to use as defaults (anonymous object)
	   @return the manager object */
	setDefaults: function(settings) {
		extendRemove(this._defaults, settings || {});
		return this;
	},

	/* Attach the date picker to a jQuery selection.
	   @param  target    element - the target input field or division or span
	   @param  settings  object - the new settings to use for this date picker instance (anonymous) */
	_attachDatepicker: function(target, settings) {
		// check for settings on the control itself - in namespace 'date:'
		var inlineSettings = null;
		for (var attrName in this._defaults) {
			var attrValue = target.getAttribute('date:' + attrName);
			if (attrValue) {
				inlineSettings = inlineSettings || {};
				try {
					inlineSettings[attrName] = eval(attrValue);
				} catch (err) {
					inlineSettings[attrName] = attrValue;
				}
			}
		}
		var nodeName = target.nodeName.toLowerCase();
		var inline = (nodeName == 'div' || nodeName == 'span');
		if (!target.id)
			target.id = 'dp' + (++this.uuid);
		var inst = this._newInst($(target), inline);
		inst.settings = $.extend({}, settings || {}, inlineSettings || {});
		if (nodeName == 'input') {
			this._connectDatepicker(target, inst);
		} else if (inline) {
			this._inlineDatepicker(target, inst);
		}
	},

	/* Create a new instance object. */
	_newInst: function(target, inline) {
		var id = target[0].id.replace(/([^A-Za-z0-9_])/g, '\\\\$1'); // escape jQuery meta chars
		return {id: id, input: target, // associated target
			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
			drawMonth: 0, drawYear: 0, // month being drawn
			inline: inline, // is datepicker inline or not
			dpDiv: (!inline ? this.dpDiv : // presentation div
			$('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))};
	},

	/* Attach the date picker to an input field. */
	_connectDatepicker: function(target, inst) {
		var input = $(target);
		inst.append = $([]);
		inst.trigger = $([]);
		if (input.hasClass(this.markerClassName))
			return;
		this._attachments(input, inst);
		input.addClass(this.markerClassName).keydown(this._doKeyDown).
			keypress(this._doKeyPress).keyup(this._doKeyUp).
			bind("setData.datepicker", function(event, key, value) {
				inst.settings[key] = value;
			}).bind("getData.datepicker", function(event, key) {
				return this._get(inst, key);
			});
		this._autoSize(inst);
		$.data(target, PROP_NAME, inst);
	},

	/* Make attachments based on settings. */
	_attachments: function(input, inst) {
		var appendText = this._get(inst, 'appendText');
		var isRTL = this._get(inst, 'isRTL');
		if (inst.append)
			inst.append.remove();
		if (appendText) {
			inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
			input[isRTL ? 'before' : 'after'](inst.append);
		}
		input.unbind('focus', this._showDatepicker);
		if (inst.trigger)
			inst.trigger.remove();
		var showOn = this._get(inst, 'showOn');
		if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
			input.focus(this._showDatepicker);
		if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
			var buttonText = this._get(inst, 'buttonText');
			var buttonImage = this._get(inst, 'buttonImage');
			inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
				$('<img/>').addClass(this._triggerClass).
					attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
				$('<button type="button"></button>').addClass(this._triggerClass).
					html(buttonImage == '' ? buttonText : $('<img/>').attr(
					{ src:buttonImage, alt:buttonText, title:buttonText })));
			input[isRTL ? 'before' : 'after'](inst.trigger);
			inst.trigger.click(function() {
				if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
					$.datepicker._hideDatepicker();
				else
					$.datepicker._showDatepicker(input[0]);
				return false;
			});
		}
	},

	/* Apply the maximum length for the date format. */
	_autoSize: function(inst) {
		if (this._get(inst, 'autoSize') && !inst.inline) {
			var date = new Date(2009, 12 - 1, 20); // Ensure double digits
			var dateFormat = this._get(inst, 'dateFormat');
			if (dateFormat.match(/[DM]/)) {
				var findMax = function(names) {
					var max = 0;
					var maxI = 0;
					for (var i = 0; i < names.length; i++) {
						if (names[i].length > max) {
							max = names[i].length;
							maxI = i;
						}
					}
					return maxI;
				};
				date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
					'monthNames' : 'monthNamesShort'))));
				date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
					'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
			}
			inst.input.attr('size', this._formatDate(inst, date).length);
		}
	},

	/* Attach an inline date picker to a div. */
	_inlineDatepicker: function(target, inst) {
		var divSpan = $(target);
		if (divSpan.hasClass(this.markerClassName))
			return;
		divSpan.addClass(this.markerClassName).append(inst.dpDiv).
			bind("setData.datepicker", function(event, key, value){
				inst.settings[key] = value;
			}).bind("getData.datepicker", function(event, key){
				return this._get(inst, key);
			});
		$.data(target, PROP_NAME, inst);
		this._setDate(inst, this._getDefaultDate(inst), true);
		this._updateDatepicker(inst);
		this._updateAlternate(inst);
	},

	/* Pop-up the date picker in a "dialog" box.
	   @param  input     element - ignored
	   @param  date      string or Date - the initial date to display
	   @param  onSelect  function - the function to call when a date is selected
	   @param  settings  object - update the dialog date picker instance's settings (anonymous object)
	   @param  pos       int[2] - coordinates for the dialog's position within the screen or
	                     event - with x/y coordinates or
	                     leave empty for default (screen centre)
	   @return the manager object */
	_dialogDatepicker: function(input, date, onSelect, settings, pos) {
		var inst = this._dialogInst; // internal instance
		if (!inst) {
			var id = 'dp' + (++this.uuid);
			this._dialogInput = $('<input type="text" id="' + id +
				'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');
			this._dialogInput.keydown(this._doKeyDown);
			$('body').append(this._dialogInput);
			inst = this._dialogInst = this._newInst(this._dialogInput, false);
			inst.settings = {};
			$.data(this._dialogInput[0], PROP_NAME, inst);
		}
		extendRemove(inst.settings, settings || {});
		date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
		this._dialogInput.val(date);

		this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
		if (!this._pos) {
			var browserWidth = document.documentElement.clientWidth;
			var browserHeight = document.documentElement.clientHeight;
			var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
			var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
			this._pos = // should use actual width/height below
				[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
		}

		// move input on screen for focus, but hidden behind dialog
		this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
		inst.settings.onSelect = onSelect;
		this._inDialog = true;
		this.dpDiv.addClass(this._dialogClass);
		this._showDatepicker(this._dialogInput[0]);
		if ($.blockUI)
			$.blockUI(this.dpDiv);
		$.data(this._dialogInput[0], PROP_NAME, inst);
		return this;
	},

	/* Detach a datepicker from its control.
	   @param  target    element - the target input field or division or span */
	_destroyDatepicker: function(target) {
		var $target = $(target);
		var inst = $.data(target, PROP_NAME);
		if (!$target.hasClass(this.markerClassName)) {
			return;
		}
		var nodeName = target.nodeName.toLowerCase();
		$.removeData(target, PROP_NAME);
		if (nodeName == 'input') {
			inst.append.remove();
			inst.trigger.remove();
			$target.removeClass(this.markerClassName).
				unbind('focus', this._showDatepicker).
				unbind('keydown', this._doKeyDown).
				unbind('keypress', this._doKeyPress).
				unbind('keyup', this._doKeyUp);
		} else if (nodeName == 'div' || nodeName == 'span')
			$target.removeClass(this.markerClassName).empty();
	},

	/* Enable the date picker to a jQuery selection.
	   @param  target    element - the target input field or division or span */
	_enableDatepicker: function(target) {
		var $target = $(target);
		var inst = $.data(target, PROP_NAME);
		if (!$target.hasClass(this.markerClassName)) {
			return;
		}
		var nodeName = target.nodeName.toLowerCase();
		if (nodeName == 'input') {
			target.disabled = false;
			inst.trigger.filter('button').
				each(function() { this.disabled = false; }).end().
				filter('img').css({opacity: '1.0', cursor: ''});
		}
		else if (nodeName == 'div' || nodeName == 'span') {
			var inline = $target.children('.' + this._inlineClass);
			inline.children().removeClass('ui-state-disabled');
		}
		this._disabledInputs = $.map(this._disabledInputs,
			function(value) { return (value == target ? null : value); }); // delete entry
	},

	/* Disable the date picker to a jQuery selection.
	   @param  target    element - the target input field or division or span */
	_disableDatepicker: function(target) {
		var $target = $(target);
		var inst = $.data(target, PROP_NAME);
		if (!$target.hasClass(this.markerClassName)) {
			return;
		}
		var nodeName = target.nodeName.toLowerCase();
		if (nodeName == 'input') {
			target.disabled = true;
			inst.trigger.filter('button').
				each(function() { this.disabled = true; }).end().
				filter('img').css({opacity: '0.5', cursor: 'default'});
		}
		else if (nodeName == 'div' || nodeName == 'span') {
			var inline = $target.children('.' + this._inlineClass);
			inline.children().addClass('ui-state-disabled');
		}
		this._disabledInputs = $.map(this._disabledInputs,
			function(value) { return (value == target ? null : value); }); // delete entry
		this._disabledInputs[this._disabledInputs.length] = target;
	},

	/* Is the first field in a jQuery collection disabled as a datepicker?
	   @param  target    element - the target input field or division or span
	   @return boolean - true if disabled, false if enabled */
	_isDisabledDatepicker: function(target) {
		if (!target) {
			return false;
		}
		for (var i = 0; i < this._disabledInputs.length; i++) {
			if (this._disabledInputs[i] == target)
				return true;
		}
		return false;
	},

	/* Retrieve the instance data for the target control.
	   @param  target  element - the target input field or division or span
	   @return  object - the associated instance data
	   @throws  error if a jQuery problem getting data */
	_getInst: function(target) {
		try {
			return $.data(target, PROP_NAME);
		}
		catch (err) {
			throw 'Missing instance data for this datepicker';
		}
	},

	/* Update or retrieve the settings for a date picker attached to an input field or division.
	   @param  target  element - the target input field or division or span
	   @param  name    object - the new settings to update or
	                   string - the name of the setting to change or retrieve,
	                   when retrieving also 'all' for all instance settings or
	                   'defaults' for all global defaults
	   @param  value   any - the new value for the setting
	                   (omit if above is an object or to retrieve a value) */
	_optionDatepicker: function(target, name, value) {
		var inst = this._getInst(target);
		if (arguments.length == 2 && typeof name == 'string') {
			return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
				(inst ? (name == 'all' ? $.extend({}, inst.settings) :
				this._get(inst, name)) : null));
		}
		var settings = name || {};
		if (typeof name == 'string') {
			settings = {};
			settings[name] = value;
		}
		if (inst) {
			if (this._curInst == inst) {
				this._hideDatepicker();
			}
			var date = this._getDateDatepicker(target, true);
			extendRemove(inst.settings, settings);
			this._attachments($(target), inst);
			this._autoSize(inst);
			this._setDateDatepicker(target, date);
			this._updateDatepicker(inst);
		}
	},

	// change method deprecated
	_changeDatepicker: function(target, name, value) {
		this._optionDatepicker(target, name, value);
	},

	/* Redraw the date picker attached to an input field or division.
	   @param  target  element - the target input field or division or span */
	_refreshDatepicker: function(target) {
		var inst = this._getInst(target);
		if (inst) {
			this._updateDatepicker(inst);
		}
	},

	/* Set the dates for a jQuery selection.
	   @param  target   element - the target input field or division or span
	   @param  date     Date - the new date */
	_setDateDatepicker: function(target, date) {
		var inst = this._getInst(target);
		if (inst) {
			this._setDate(inst, date);
			this._updateDatepicker(inst);
			this._updateAlternate(inst);
		}
	},

	/* Get the date(s) for the first entry in a jQuery selection.
	   @param  target     element - the target input field or division or span
	   @param  noDefault  boolean - true if no default date is to be used
	   @return Date - the current date */
	_getDateDatepicker: function(target, noDefault) {
		var inst = this._getInst(target);
		if (inst && !inst.inline)
			this._setDateFromField(inst, noDefault);
		return (inst ? this._getDate(inst) : null);
	},

	/* Handle keystrokes. */
	_doKeyDown: function(event) {
		var inst = $.datepicker._getInst(event.target);
		var handled = true;
		var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
		inst._keyEvent = true;
		if ($.datepicker._datepickerShowing)
			switch (event.keyCode) {
				case 9: $.datepicker._hideDatepicker();
						handled = false;
						break; // hide on tab out
				case 13: var sel = $('td.' + $.datepicker._dayOverClass, inst.dpDiv).
							add($('td.' + $.datepicker._currentClass, inst.dpDiv));
						if (sel[0])
							$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
						else
							$.datepicker._hideDatepicker();
						return false; // don't submit the form
						break; // select the value on enter
				case 27: $.datepicker._hideDatepicker();
						break; // hide on escape
				case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
							-$.datepicker._get(inst, 'stepBigMonths') :
							-$.datepicker._get(inst, 'stepMonths')), 'M');
						break; // previous month/year on page up/+ ctrl
				case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
							+$.datepicker._get(inst, 'stepBigMonths') :
							+$.datepicker._get(inst, 'stepMonths')), 'M');
						break; // next month/year on page down/+ ctrl
				case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
						handled = event.ctrlKey || event.metaKey;
						break; // clear on ctrl or command +end
				case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
						handled = event.ctrlKey || event.metaKey;
						break; // current on ctrl or command +home
				case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
						handled = event.ctrlKey || event.metaKey;
						// -1 day on ctrl or command +left
						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
									-$.datepicker._get(inst, 'stepBigMonths') :
									-$.datepicker._get(inst, 'stepMonths')), 'M');
						// next month/year on alt +left on Mac
						break;
				case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
						handled = event.ctrlKey || event.metaKey;
						break; // -1 week on ctrl or command +up
				case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
						handled = event.ctrlKey || event.metaKey;
						// +1 day on ctrl or command +right
						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
									+$.datepicker._get(inst, 'stepBigMonths') :
									+$.datepicker._get(inst, 'stepMonths')), 'M');
						// next month/year on alt +right
						break;
				case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
						handled = event.ctrlKey || event.metaKey;
						break; // +1 week on ctrl or command +down
				default: handled = false;
			}
		else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
			$.datepicker._showDatepicker(this);
		else {
			handled = false;
		}
		if (handled) {
			event.preventDefault();
			event.stopPropagation();
		}
	},

	/* Filter entered characters - based on date format. */
	_doKeyPress: function(event) {
		var inst = $.datepicker._getInst(event.target);
		if ($.datepicker._get(inst, 'constrainInput')) {
			var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
			var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
			return event.ctrlKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
		}
	},

	/* Synchronise manual entry and field/alternate field. */
	_doKeyUp: function(event) {
		var inst = $.datepicker._getInst(event.target);
		if (inst.input.val() != inst.lastVal) {
			try {
				var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
					(inst.input ? inst.input.val() : null),
					$.datepicker._getFormatConfig(inst));
				if (date) { // only if valid
					$.datepicker._setDateFromField(inst);
					$.datepicker._updateAlternate(inst);
					$.datepicker._updateDatepicker(inst);
				}
			}
			catch (event) {
				$.datepicker.log(event);
			}
		}
		return true;
	},

	/* Pop-up the date picker for a given input field.
	   @param  input  element - the input field attached to the date picker or
	                  event - if triggered by focus */
	_showDatepicker: function(input) {
		input = input.target || input;
		if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
			input = $('input', input.parentNode)[0];
		if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
			return;
		var inst = $.datepicker._getInst(input);
		if ($.datepicker._curInst && $.datepicker._curInst != inst) {
			$.datepicker._curInst.dpDiv.stop(true, true);
		}
		var beforeShow = $.datepicker._get(inst, 'beforeShow');
		extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
		inst.lastVal = null;
		$.datepicker._lastInput = input;
		$.datepicker._setDateFromField(inst);
		if ($.datepicker._inDialog) // hide cursor
			input.value = '';
		if (!$.datepicker._pos) { // position below input
			$.datepicker._pos = $.datepicker._findPos(input);
			$.datepicker._pos[1] += input.offsetHeight; // add the height
		}
		var isFixed = false;
		$(input).parents().each(function() {
			isFixed |= $(this).css('position') == 'fixed';
			return !isFixed;
		});
		if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
			$.datepicker._pos[0] -= document.documentElement.scrollLeft;
			$.datepicker._pos[1] -= document.documentElement.scrollTop;
		}
		var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
		$.datepicker._pos = null;
		// determine sizing offscreen
		inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
		$.datepicker._updateDatepicker(inst);
		// fix width for dynamic number of date pickers
		// and adjust position before showing
		offset = $.datepicker._checkOffset(inst, offset, isFixed);
		inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
			'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
			left: offset.left + 'px', top: offset.top + 'px'});
		if (!inst.inline) {
			var showAnim = $.datepicker._get(inst, 'showAnim');
			var duration = $.datepicker._get(inst, 'duration');
			var postProcess = function() {
				$.datepicker._datepickerShowing = true;
				var borders = $.datepicker._getBorders(inst.dpDiv);
				inst.dpDiv.find('iframe.ui-datepicker-cover'). // IE6- only
					css({left: -borders[0], top: -borders[1],
						width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
			};
			inst.dpDiv.zIndex($(input).zIndex()+1);
			if ($.effects && $.effects[showAnim])
				inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
			else
				inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
			if (!showAnim || !duration)
				postProcess();
			if (inst.input.is(':visible') && !inst.input.is(':disabled'))
				inst.input.focus();
			$.datepicker._curInst = inst;
		}
	},

	/* Generate the date picker content. */
	_updateDatepicker: function(inst) {
		var self = this;
		var borders = $.datepicker._getBorders(inst.dpDiv);
		inst.dpDiv.empty().append(this._generateHTML(inst))
			.find('iframe.ui-datepicker-cover') // IE6- only
				.css({left: -borders[0], top: -borders[1],
					width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
			.end()
			.find('button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a')
				.bind('mouseout', function(){
					$(this).removeClass('ui-state-hover');
					if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover');
					if(this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover');
				})
				.bind('mouseover', function(){
					if (!self._isDisabledDatepicker( inst.inline ? inst.dpDiv.parent()[0] : inst.input[0])) {
						$(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
						$(this).addClass('ui-state-hover');
						if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover');
						if(this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover');
					}
				})
			.end()
			.find('.' + this._dayOverClass + ' a')
				.trigger('mouseover')
			.end();
		var numMonths = this._getNumberOfMonths(inst);
		var cols = numMonths[1];
		var width = 17;
		if (cols > 1)
			inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
		else
			inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
		inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
			'Class']('ui-datepicker-multi');
		inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
			'Class']('ui-datepicker-rtl');
		if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
				inst.input.is(':visible') && !inst.input.is(':disabled'))
			inst.input.focus();
	},

	/* Retrieve the size of left and top borders for an element.
	   @param  elem  (jQuery object) the element of interest
	   @return  (number[2]) the left and top borders */
	_getBorders: function(elem) {
		var convert = function(value) {
			return {thin: 1, medium: 2, thick: 3}[value] || value;
		};
		return [parseFloat(convert(elem.css('border-left-width'))),
			parseFloat(convert(elem.css('border-top-width')))];
	},

	/* Check positioning to remain on screen. */
	_checkOffset: function(inst, offset, isFixed) {
		var dpWidth = inst.dpDiv.outerWidth();
		var dpHeight = inst.dpDiv.outerHeight();
		var inputWidth = inst.input ? inst.input.outerWidth() : 0;
		var inputHeight = inst.input ? inst.input.outerHeight() : 0;
		var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft();
		var viewHeight = document.documentElement.clientHeight + $(document).scrollTop();

		offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
		offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
		offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;

		// now check if datepicker is showing outside window viewport - move to a better place if so.
		offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
			Math.abs(offset.left + dpWidth - viewWidth) : 0);
		offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
			Math.abs(dpHeight + inputHeight) : 0);

		return offset;
	},

	/* Find an object's position on the screen. */
	_findPos: function(obj) {
		var inst = this._getInst(obj);
		var isRTL = this._get(inst, 'isRTL');
        while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
            obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
        }
        var position = $(obj).offset();
	    return [position.left, position.top];
	},

	/* Hide the date picker from view.
	   @param  input  element - the input field attached to the date picker */
	_hideDatepicker: function(input) {
		var inst = this._curInst;
		if (!inst || (input && inst != $.data(input, PROP_NAME)))
			return;
		if (this._datepickerShowing) {
			var showAnim = this._get(inst, 'showAnim');
			var duration = this._get(inst, 'duration');
			var postProcess = function() {
				$.datepicker._tidyDialog(inst);
				this._curInst = null;
			};
			if ($.effects && $.effects[showAnim])
				inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
			else
				inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
					(showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
			if (!showAnim)
				postProcess();
			var onClose = this._get(inst, 'onClose');
			if (onClose)
				onClose.apply((inst.input ? inst.input[0] : null),
					[(inst.input ? inst.input.val() : ''), inst]);  // trigger custom callback
			this._datepickerShowing = false;
			this._lastInput = null;
			if (this._inDialog) {
				this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
				if ($.blockUI) {
					$.unblockUI();
					$('body').append(this.dpDiv);
				}
			}
			this._inDialog = false;
		}
	},

	/* Tidy up after a dialog display. */
	_tidyDialog: function(inst) {
		inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
	},

	/* Close date picker if clicked elsewhere. */
	_checkExternalClick: function(event) {
		if (!$.datepicker._curInst)
			return;
		var $target = $(event.target);
		if ($target[0].id != $.datepicker._mainDivId &&
				$target.parents('#' + $.datepicker._mainDivId).length == 0 &&
				!$target.hasClass($.datepicker.markerClassName) &&
				!$target.hasClass($.datepicker._triggerClass) &&
				$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
			$.datepicker._hideDatepicker();
	},

	/* Adjust one of the date sub-fields. */
	_adjustDate: function(id, offset, period) {
		var target = $(id);
		var inst = this._getInst(target[0]);
		if (this._isDisabledDatepicker(target[0])) {
			return;
		}
		this._adjustInstDate(inst, offset +
			(period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
			period);
		this._updateDatepicker(inst);
	},

	/* Action for current link. */
	_gotoToday: function(id) {
		var target = $(id);
		var inst = this._getInst(target[0]);
		if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
			inst.selectedDay = inst.currentDay;
			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
			inst.drawYear = inst.selectedYear = inst.currentYear;
		}
		else {
			var date = new Date();
			inst.selectedDay = date.getDate();
			inst.drawMonth = inst.selectedMonth = date.getMonth();
			inst.drawYear = inst.selectedYear = date.getFullYear();
		}
		this._notifyChange(inst);
		this._adjustDate(target);
	},

	/* Action for selecting a new month/year. */
	_selectMonthYear: function(id, select, period) {
		var target = $(id);
		var inst = this._getInst(target[0]);
		inst._selectingMonthYear = false;
		inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
		inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
			parseInt(select.options[select.selectedIndex].value,10);
		this._notifyChange(inst);
		this._adjustDate(target);
	},

	/* Restore input focus after not changing month/year. */
	_clickMonthYear: function(id) {
		var target = $(id);
		var inst = this._getInst(target[0]);
		if (inst.input && inst._selectingMonthYear && !$.browser.msie)
			inst.input.focus();
		inst._selectingMonthYear = !inst._selectingMonthYear;
	},

	/* Action for selecting a day. */
	_selectDay: function(id, month, year, td) {
		var target = $(id);
		if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
			return;
		}
		var inst = this._getInst(target[0]);
		inst.selectedDay = inst.currentDay = $('a', td).html();
		inst.selectedMonth = inst.currentMonth = month;
		inst.selectedYear = inst.currentYear = year;
		this._selectDate(id, this._formatDate(inst,
			inst.currentDay, inst.currentMonth, inst.currentYear));
	},

	/* Erase the input field and hide the date picker. */
	_clearDate: function(id) {
		var target = $(id);
		var inst = this._getInst(target[0]);
		this._selectDate(target, '');
	},

	/* Update the input field with the selected date. */
	_selectDate: function(id, dateStr) {
		var target = $(id);
		var inst = this._getInst(target[0]);
		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
		if (inst.input)
			inst.input.val(dateStr);
		this._updateAlternate(inst);
		var onSelect = this._get(inst, 'onSelect');
		if (onSelect)
			onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
		else if (inst.input)
			inst.input.trigger('change'); // fire the change event
		if (inst.inline)
			this._updateDatepicker(inst);
		else {
			this._hideDatepicker();
			this._lastInput = inst.input[0];
			if (typeof(inst.input[0]) != 'object')
				inst.input.focus(); // restore focus
			this._lastInput = null;
		}
	},

	/* Update any alternate field to synchronise with the main field. */
	_updateAlternate: function(inst) {
		var altField = this._get(inst, 'altField');
		if (altField) { // update alternate field too
			var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
			var date = this._getDate(inst);
			var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
			$(altField).each(function() { $(this).val(dateStr); });
		}
	},

	/* Set as beforeShowDay function to prevent selection of weekends.
	   @param  date  Date - the date to customise
	   @return [boolean, string] - is this date selectable?, what is its CSS class? */
	noWeekends: function(date) {
		var day = date.getDay();
		return [(day > 0 && day < 6), ''];
	},

	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
	   @param  date  Date - the date to get the week for
	   @return  number - the number of the week within the year that contains this date */
	iso8601Week: function(date) {
		var checkDate = new Date(date.getTime());
		// Find Thursday of this week starting on Monday
		checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
		var time = checkDate.getTime();
		checkDate.setMonth(0); // Compare with Jan 1
		checkDate.setDate(1);
		return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
	},

	/* Parse a string value into a date object.
	   See formatDate below for the possible formats.

	   @param  format    string - the expected format of the date
	   @param  value     string - the date in the above format
	   @param  settings  Object - attributes include:
	                     shortYearCutoff  number - the cutoff year for determining the century (optional)
	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
	                     dayNames         string[7] - names of the days from Sunday (optional)
	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
	                     monthNames       string[12] - names of the months (optional)
	   @return  Date - the extracted date value or null if value is blank */
	parseDate: function (format, value, settings) {
		if (format == null || value == null)
			throw 'Invalid arguments';
		value = (typeof value == 'object' ? value.toString() : value + '');
		if (value == '')
			return null;
		var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
		var year = -1;
		var month = -1;
		var day = -1;
		var doy = -1;
		var literal = false;
		// Check whether a format character is doubled
		var lookAhead = function(match) {
			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
			if (matches)
				iFormat++;
			return matches;
		};
		// Extract a number from the string value
		var getNumber = function(match) {
			lookAhead(match);
			var size = (match == '@' ? 14 : (match == '!' ? 20 :
				(match == 'y' ? 4 : (match == 'o' ? 3 : 2))));
			var digits = new RegExp('^\\d{1,' + size + '}');
			var num = value.substring(iValue).match(digits);
			if (!num)
				throw 'Missing number at position ' + iValue;
			iValue += num[0].length;
			return parseInt(num[0], 10);
		};
		// Extract a name from the string value and convert to an index
		var getName = function(match, shortNames, longNames) {
			var names = (lookAhead(match) ? longNames : shortNames);
			for (var i = 0; i < names.length; i++) {
				if (value.substr(iValue, names[i].length) == names[i]) {
					iValue += names[i].length;
					return i + 1;
				}
			}
			throw 'Unknown name at position ' + iValue;
		};
		// Confirm that a literal character matches the string value
		var checkLiteral = function() {
			if (value.charAt(iValue) != format.charAt(iFormat))
				throw 'Unexpected literal at position ' + iValue;
			iValue++;
		};
		var iValue = 0;
		for (var iFormat = 0; iFormat < format.length; iFormat++) {
			if (literal)
				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
					literal = false;
				else
					checkLiteral();
			else
				switch (format.charAt(iFormat)) {
					case 'd':
						day = getNumber('d');
						break;
					case 'D':
						getName('D', dayNamesShort, dayNames);
						break;
					case 'o':
						doy = getNumber('o');
						break;
					case 'm':
						month = getNumber('m');
						break;
					case 'M':
						month = getName('M', monthNamesShort, monthNames);
						break;
					case 'y':
						year = getNumber('y');
						break;
					case '@':
						var date = new Date(getNumber('@'));
						year = date.getFullYear();
						month = date.getMonth() + 1;
						day = date.getDate();
						break;
					case '!':
						var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
						year = date.getFullYear();
						month = date.getMonth() + 1;
						day = date.getDate();
						break;
					case "'":
						if (lookAhead("'"))
							checkLiteral();
						else
							literal = true;
						break;
					default:
						checkLiteral();
				}
		}
		if (year == -1)
			year = new Date().getFullYear();
		else if (year < 100)
			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
				(year <= shortYearCutoff ? 0 : -100);
		if (doy > -1) {
			month = 1;
			day = doy;
			do {
				var dim = this._getDaysInMonth(year, month - 1);
				if (day <= dim)
					break;
				month++;
				day -= dim;
			} while (true);
		}
		var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
		if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
			throw 'Invalid date'; // E.g. 31/02/*
		return date;
	},

	/* Standard date formats. */
	ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
	COOKIE: 'D, dd M yy',
	ISO_8601: 'yy-mm-dd',
	RFC_822: 'D, d M y',
	RFC_850: 'DD, dd-M-y',
	RFC_1036: 'D, d M y',
	RFC_1123: 'D, d M yy',
	RFC_2822: 'D, d M yy',
	RSS: 'D, d M y', // RFC 822
	TICKS: '!',
	TIMESTAMP: '@',
	W3C: 'yy-mm-dd', // ISO 8601

	_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
		Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),

	/* Format a date object into a string value.
	   The format can be combinations of the following:
	   d  - day of month (no leading zero)
	   dd - day of month (two digit)
	   o  - day of year (no leading zeros)
	   oo - day of year (three digit)
	   D  - day name short
	   DD - day name long
	   m  - month of year (no leading zero)
	   mm - month of year (two digit)
	   M  - month name short
	   MM - month name long
	   y  - year (two digit)
	   yy - year (four digit)
	   @ - Unix timestamp (ms since 01/01/1970)
	   ! - Windows ticks (100ns since 01/01/0001)
	   '...' - literal text
	   '' - single quote

	   @param  format    string - the desired format of the date
	   @param  date      Date - the date value to format
	   @param  settings  Object - attributes include:
	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
	                     dayNames         string[7] - names of the days from Sunday (optional)
	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
	                     monthNames       string[12] - names of the months (optional)
	   @return  string - the date in the above format */
	formatDate: function (format, date, settings) {
		if (!date)
			return '';
		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
		// Check whether a format character is doubled
		var lookAhead = function(match) {
			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
			if (matches)
				iFormat++;
			return matches;
		};
		// Format a number, with leading zero if necessary
		var formatNumber = function(match, value, len) {
			var num = '' + value;
			if (lookAhead(match))
				while (num.length < len)
					num = '0' + num;
			return num;
		};
		// Format a name, short or long as requested
		var formatName = function(match, value, shortNames, longNames) {
			return (lookAhead(match) ? longNames[value] : shortNames[value]);
		};
		var output = '';
		var literal = false;
		if (date)
			for (var iFormat = 0; iFormat < format.length; iFormat++) {
				if (literal)
					if (format.charAt(iFormat) == "'" && !lookAhead("'"))
						literal = false;
					else
						output += format.charAt(iFormat);
				else
					switch (format.charAt(iFormat)) {
						case 'd':
							output += formatNumber('d', date.getDate(), 2);
							break;
						case 'D':
							output += formatName('D', date.getDay(), dayNamesShort, dayNames);
							break;
						case 'o':
							output += formatNumber('o',
								(date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000, 3);
							break;
						case 'm':
							output += formatNumber('m', date.getMonth() + 1, 2);
							break;
						case 'M':
							output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
							break;
						case 'y':
							output += (lookAhead('y') ? date.getFullYear() :
								(date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
							break;
						case '@':
							output += date.getTime();
							break;
						case '!':
							output += date.getTime() * 10000 + this._ticksTo1970;
							break;
						case "'":
							if (lookAhead("'"))
								output += "'";
							else
								literal = true;
							break;
						default:
							output += format.charAt(iFormat);
					}
			}
		return output;
	},

	/* Extract all possible characters from the date format. */
	_possibleChars: function (format) {
		var chars = '';
		var literal = false;
		// Check whether a format character is doubled
		var lookAhead = function(match) {
			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
			if (matches)
				iFormat++;
			return matches;
		};
		for (var iFormat = 0; iFormat < format.length; iFormat++)
			if (literal)
				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
					literal = false;
				else
					chars += format.charAt(iFormat);
			else
				switch (format.charAt(iFormat)) {
					case 'd': case 'm': case 'y': case '@':
						chars += '0123456789';
						break;
					case 'D': case 'M':
						return null; // Accept anything
					case "'":
						if (lookAhead("'"))
							chars += "'";
						else
							literal = true;
						break;
					default:
						chars += format.charAt(iFormat);
				}
		return chars;
	},

	/* Get a setting value, defaulting if necessary. */
	_get: function(inst, name) {
		return inst.settings[name] !== undefined ?
			inst.settings[name] : this._defaults[name];
	},

	/* Parse existing date and initialise date picker. */
	_setDateFromField: function(inst, noDefault) {
		if (inst.input.val() == inst.lastVal) {
			return;
		}
		var dateFormat = this._get(inst, 'dateFormat');
		var dates = inst.lastVal = inst.input ? inst.input.val() : null;
		var date, defaultDate;
		date = defaultDate = this._getDefaultDate(inst);
		var settings = this._getFormatConfig(inst);
		try {
			date = this.parseDate(dateFormat, dates, settings) || defaultDate;
		} catch (event) {
			this.log(event);
			dates = (noDefault ? '' : dates);
		}
		inst.selectedDay = date.getDate();
		inst.drawMonth = inst.selectedMonth = date.getMonth();
		inst.drawYear = inst.selectedYear = date.getFullYear();
		inst.currentDay = (dates ? date.getDate() : 0);
		inst.currentMonth = (dates ? date.getMonth() : 0);
		inst.currentYear = (dates ? date.getFullYear() : 0);
		this._adjustInstDate(inst);
	},

	/* Retrieve the default date shown on opening. */
	_getDefaultDate: function(inst) {
		return this._restrictMinMax(inst,
			this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
	},

	/* A date may be specified as an exact value or a relative one. */
	_determineDate: function(inst, date, defaultDate) {
		var offsetNumeric = function(offset) {
			var date = new Date();
			date.setDate(date.getDate() + offset);
			return date;
		};
		var offsetString = function(offset) {
			try {
				return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
					offset, $.datepicker._getFormatConfig(inst));
			}
			catch (e) {
				// Ignore
			}
			var date = (offset.toLowerCase().match(/^c/) ?
				$.datepicker._getDate(inst) : null) || new Date();
			var year = date.getFullYear();
			var month = date.getMonth();
			var day = date.getDate();
			var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
			var matches = pattern.exec(offset);
			while (matches) {
				switch (matches[2] || 'd') {
					case 'd' : case 'D' :
						day += parseInt(matches[1],10); break;
					case 'w' : case 'W' :
						day += parseInt(matches[1],10) * 7; break;
					case 'm' : case 'M' :
						month += parseInt(matches[1],10);
						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
						break;
					case 'y': case 'Y' :
						year += parseInt(matches[1],10);
						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
						break;
				}
				matches = pattern.exec(offset);
			}
			return new Date(year, month, day);
		};
		date = (date == null ? defaultDate : (typeof date == 'string' ? offsetString(date) :
			(typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : date)));
		date = (date && date.toString() == 'Invalid Date' ? defaultDate : date);
		if (date) {
			date.setHours(0);
			date.setMinutes(0);
			date.setSeconds(0);
			date.setMilliseconds(0);
		}
		return this._daylightSavingAdjust(date);
	},

	/* Handle switch to/from daylight saving.
	   Hours may be non-zero on daylight saving cut-over:
	   > 12 when midnight changeover, but then cannot generate
	   midnight datetime, so jump to 1AM, otherwise reset.
	   @param  date  (Date) the date to check
	   @return  (Date) the corrected date */
	_daylightSavingAdjust: function(date) {
		if (!date) return null;
		date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
		return date;
	},

	/* Set the date(s) directly. */
	_setDate: function(inst, date, noChange) {
		var clear = !(date);
		var origMonth = inst.selectedMonth;
		var origYear = inst.selectedYear;
		date = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
		inst.selectedDay = inst.currentDay = date.getDate();
		inst.drawMonth = inst.selectedMonth = inst.currentMonth = date.getMonth();
		inst.drawYear = inst.selectedYear = inst.currentYear = date.getFullYear();
		if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
			this._notifyChange(inst);
		this._adjustInstDate(inst);
		if (inst.input) {
			inst.input.val(clear ? '' : this._formatDate(inst));
		}
	},

	/* Retrieve the date(s) directly. */
	_getDate: function(inst) {
		var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
			this._daylightSavingAdjust(new Date(
			inst.currentYear, inst.currentMonth, inst.currentDay)));
			return startDate;
	},

	/* Generate the HTML for the current state of the date picker. */
	_generateHTML: function(inst) {
		var today = new Date();
		today = this._daylightSavingAdjust(
			new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
		var isRTL = this._get(inst, 'isRTL');
		var showButtonPanel = this._get(inst, 'showButtonPanel');
		var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
		var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
		var numMonths = this._getNumberOfMonths(inst);
		var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
		var stepMonths = this._get(inst, 'stepMonths');
		var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
		var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
			new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
		var minDate = this._getMinMaxDate(inst, 'min');
		var maxDate = this._getMinMaxDate(inst, 'max');
		var drawMonth = inst.drawMonth - showCurrentAtPos;
		var drawYear = inst.drawYear;
		if (drawMonth < 0) {
			drawMonth += 12;
			drawYear--;
		}
		if (maxDate) {
			var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
				maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
			maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
			while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
				drawMonth--;
				if (drawMonth < 0) {
					drawMonth = 11;
					drawYear--;
				}
			}
		}
		inst.drawMonth = drawMonth;
		inst.drawYear = drawYear;
		var prevText = this._get(inst, 'prevText');
		prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
			this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
			this._getFormatConfig(inst)));
		var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
			'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + dpuuid +
			'.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' +
			' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
		var nextText = this._get(inst, 'nextText');
		nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
			this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
			this._getFormatConfig(inst)));
		var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
			'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + dpuuid +
			'.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' +
			' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
		var currentText = this._get(inst, 'currentText');
		var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
		currentText = (!navigationAsDateFormat ? currentText :
			this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
		var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
			'.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : '');
		var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
			(this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
			'.datepicker._gotoToday(\'#' + inst.id + '\');"' +
			'>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
		var firstDay = parseInt(this._get(inst, 'firstDay'),10);
		firstDay = (isNaN(firstDay) ? 0 : firstDay);
		var showWeek = this._get(inst, 'showWeek');
		var dayNames = this._get(inst, 'dayNames');
		var dayNamesShort = this._get(inst, 'dayNamesShort');
		var dayNamesMin = this._get(inst, 'dayNamesMin');
		var monthNames = this._get(inst, 'monthNames');
		var monthNamesShort = this._get(inst, 'monthNamesShort');
		var beforeShowDay = this._get(inst, 'beforeShowDay');
		var showOtherMonths = this._get(inst, 'showOtherMonths');
		var selectOtherMonths = this._get(inst, 'selectOtherMonths');
		var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
		var defaultDate = this._getDefaultDate(inst);
		var html = '';
		for (var row = 0; row < numMonths[0]; row++) {
			var group = '';
			for (var col = 0; col < numMonths[1]; col++) {
				var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
				var cornerClass = ' ui-corner-all';
				var calender = '';
				if (isMultiMonth) {
					calender += '<div class="ui-datepicker-group';
					if (numMonths[1] > 1)
						switch (col) {
							case 0: calender += ' ui-datepicker-group-first';
								cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
							case numMonths[1]-1: calender += ' ui-datepicker-group-last';
								cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
							default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
						}
					calender += '">';
				}
				calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
					(/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
					(/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
					this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
					row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
					'</div><table class="ui-datepicker-calendar"><thead>' +
					'<tr>';
				var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
				for (var dow = 0; dow < 7; dow++) { // days of the week
					var day = (dow + firstDay) % 7;
					thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
						'<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
				}
				calender += thead + '</tr></thead><tbody>';
				var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
				if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
					inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
				var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
				var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate
				var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
				for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
					calender += '<tr>';
					var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
						this._get(inst, 'calculateWeek')(printDate) + '</td>');
					for (var dow = 0; dow < 7; dow++) { // create date picker days
						var daySettings = (beforeShowDay ?
							beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
						var otherMonth = (printDate.getMonth() != drawMonth);
						var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
							(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
						tbody += '<td class="' +
							((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
							(otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
							((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
							(defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
							// or defaultDate is current printedDate and defaultDate is selectedDate
							' ' + this._dayOverClass : '') + // highlight selected day
							(unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') +  // highlight unselectable days
							(otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
							(printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
							(printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
							((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
							(unselectable ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' +
							inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // actions
							(otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months
							(unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
							(printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
							(printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
							(otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
							'" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
						printDate.setDate(printDate.getDate() + 1);
						printDate = this._daylightSavingAdjust(printDate);
					}
					calender += tbody + '</tr>';
				}
				drawMonth++;
				if (drawMonth > 11) {
					drawMonth = 0;
					drawYear++;
				}
				calender += '</tbody></table>' + (isMultiMonth ? '</div>' + 
							((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
				group += calender;
			}
			html += group;
		}
		html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
			'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
		inst._keyEvent = false;
		return html;
	},

	/* Generate the month and year header. */
	_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
			secondary, monthNames, monthNamesShort) {
		var changeMonth = this._get(inst, 'changeMonth');
		var changeYear = this._get(inst, 'changeYear');
		var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
		var html = '<div class="ui-datepicker-title">';
		var monthHtml = '';
		// month selection
		if (secondary || !changeMonth)
			monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
		else {
			var inMinYear = (minDate && minDate.getFullYear() == drawYear);
			var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
			monthHtml += '<select class="ui-datepicker-month" ' +
				'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' +
				'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
			 	'>';
			for (var month = 0; month < 12; month++) {
				if ((!inMinYear || month >= minDate.getMonth()) &&
						(!inMaxYear || month <= maxDate.getMonth()))
					monthHtml += '<option value="' + month + '"' +
						(month == drawMonth ? ' selected="selected"' : '') +
						'>' + monthNamesShort[month] + '</option>';
			}
			monthHtml += '</select>';
		}
		if (!showMonthAfterYear)
			html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '');
		// year selection
		if (secondary || !changeYear)
			html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
		else {
			// determine range of years to display
			var years = this._get(inst, 'yearRange').split(':');
			var thisYear = new Date().getFullYear();
			var determineYear = function(value) {
				var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
					(value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
					parseInt(value, 10)));
				return (isNaN(year) ? thisYear : year);
			};
			var year = determineYear(years[0]);
			var endYear = Math.max(year, determineYear(years[1] || ''));
			year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
			endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
			html += '<select class="ui-datepicker-year" ' +
				'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' +
				'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
				'>';
			for (; year <= endYear; year++) {
				html += '<option value="' + year + '"' +
					(year == drawYear ? ' selected="selected"' : '') +
					'>' + year + '</option>';
			}
			html += '</select>';
		}
		html += this._get(inst, 'yearSuffix');
		if (showMonthAfterYear)
			html += (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '') + monthHtml;
		html += '</div>'; // Close datepicker_header
		return html;
	},

	/* Adjust one of the date sub-fields. */
	_adjustInstDate: function(inst, offset, period) {
		var year = inst.drawYear + (period == 'Y' ? offset : 0);
		var month = inst.drawMonth + (period == 'M' ? offset : 0);
		var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
			(period == 'D' ? offset : 0);
		var date = this._restrictMinMax(inst,
			this._daylightSavingAdjust(new Date(year, month, day)));
		inst.selectedDay = date.getDate();
		inst.drawMonth = inst.selectedMonth = date.getMonth();
		inst.drawYear = inst.selectedYear = date.getFullYear();
		if (period == 'M' || period == 'Y')
			this._notifyChange(inst);
	},

	/* Ensure a date is within any min/max bounds. */
	_restrictMinMax: function(inst, date) {
		var minDate = this._getMinMaxDate(inst, 'min');
		var maxDate = this._getMinMaxDate(inst, 'max');
		date = (minDate && date < minDate ? minDate : date);
		date = (maxDate && date > maxDate ? maxDate : date);
		return date;
	},

	/* Notify change of month/year. */
	_notifyChange: function(inst) {
		var onChange = this._get(inst, 'onChangeMonthYear');
		if (onChange)
			onChange.apply((inst.input ? inst.input[0] : null),
				[inst.selectedYear, inst.selectedMonth + 1, inst]);
	},

	/* Determine the number of months to show. */
	_getNumberOfMonths: function(inst) {
		var numMonths = this._get(inst, 'numberOfMonths');
		return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
	},

	/* Determine the current maximum date - ensure no time components are set. */
	_getMinMaxDate: function(inst, minMax) {
		return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
	},

	/* Find the number of days in a given month. */
	_getDaysInMonth: function(year, month) {
		return 32 - new Date(year, month, 32).getDate();
	},

	/* Find the day of the week of the first of a month. */
	_getFirstDayOfMonth: function(year, month) {
		return new Date(year, month, 1).getDay();
	},

	/* Determines if we should allow a "next/prev" month display change. */
	_canAdjustMonth: function(inst, offset, curYear, curMonth) {
		var numMonths = this._getNumberOfMonths(inst);
		var date = this._daylightSavingAdjust(new Date(curYear,
			curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
		if (offset < 0)
			date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
		return this._isInRange(inst, date);
	},

	/* Is the given date in the accepted range? */
	_isInRange: function(inst, date) {
		var minDate = this._getMinMaxDate(inst, 'min');
		var maxDate = this._getMinMaxDate(inst, 'max');
		return ((!minDate || date.getTime() >= minDate.getTime()) &&
			(!maxDate || date.getTime() <= maxDate.getTime()));
	},

	/* Provide the configuration settings for formatting/parsing. */
	_getFormatConfig: function(inst) {
		var shortYearCutoff = this._get(inst, 'shortYearCutoff');
		shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
			new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
		return {shortYearCutoff: shortYearCutoff,
			dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
			monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
	},

	/* Format the given date for display. */
	_formatDate: function(inst, day, month, year) {
		if (!day) {
			inst.currentDay = inst.selectedDay;
			inst.currentMonth = inst.selectedMonth;
			inst.currentYear = inst.selectedYear;
		}
		var date = (day ? (typeof day == 'object' ? day :
			this._daylightSavingAdjust(new Date(year, month, day))) :
			this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
		return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
	}
});

/* jQuery extend now ignores nulls! */
function extendRemove(target, props) {
	$.extend(target, props);
	for (var name in props)
		if (props[name] == null || props[name] == undefined)
			target[name] = props[name];
	return target;
};

/* Determine whether an object is an array. */
function isArray(a) {
	return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
		(a.constructor && a.constructor.toString().match(/\Array\(\)/))));
};

/* Invoke the datepicker functionality.
   @param  options  string - a command, optionally followed by additional parameters or
                    Object - settings for attaching new datepicker functionality
   @return  jQuery object */
$.fn.datepicker = function(options){

	/* Initialise the date picker. */
	if (!$.datepicker.initialized) {
		$(document).mousedown($.datepicker._checkExternalClick).
			find('body').append($.datepicker.dpDiv);
		$.datepicker.initialized = true;
	}

	var otherArgs = Array.prototype.slice.call(arguments, 1);
	if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
		return $.datepicker['_' + options + 'Datepicker'].
			apply($.datepicker, [this[0]].concat(otherArgs));
	if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
		return $.datepicker['_' + options + 'Datepicker'].
			apply($.datepicker, [this[0]].concat(otherArgs));
	return this.each(function() {
		typeof options == 'string' ?
			$.datepicker['_' + options + 'Datepicker'].
				apply($.datepicker, [this].concat(otherArgs)) :
			$.datepicker._attachDatepicker(this, options);
	});
};

$.datepicker = new Datepicker(); // singleton instance
$.datepicker.initialized = false;
$.datepicker.uuid = new Date().getTime();
$.datepicker.version = "1.8.1";

// Workaround for #4055
// Add another global to avoid noConflict issues with inline event handlers
window['DP_jQuery_' + dpuuid] = $;

})(jQuery);
/*
 * jQuery UI Progressbar 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Progressbar
 *
 * Depends:
 *   jquery.ui.core.js
 *   jquery.ui.widget.js
 */
(function( $ ) {

$.widget( "ui.progressbar", {
	options: {
		value: 0
	},
	_create: function() {
		this.element
			.addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
			.attr({
				role: "progressbar",
				"aria-valuemin": this._valueMin(),
				"aria-valuemax": this._valueMax(),
				"aria-valuenow": this._value()
			});

		this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
			.appendTo( this.element );

		this._refreshValue();
	},

	destroy: function() {
		this.element
			.removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
			.removeAttr( "role" )
			.removeAttr( "aria-valuemin" )
			.removeAttr( "aria-valuemax" )
			.removeAttr( "aria-valuenow" );

		this.valueDiv.remove();

		$.Widget.prototype.destroy.apply( this, arguments );
	},

	value: function( newValue ) {
		if ( newValue === undefined ) {
			return this._value();
		}

		this._setOption( "value", newValue );
		return this;
	},

	_setOption: function( key, value ) {
		switch ( key ) {
			case "value":
				this.options.value = value;
				this._refreshValue();
				this._trigger( "change" );
				break;
		}

		$.Widget.prototype._setOption.apply( this, arguments );
	},

	_value: function() {
		var val = this.options.value;
		// normalize invalid value
		if ( typeof val !== "number" ) {
			val = 0;
		}
		if ( val < this._valueMin() ) {
			val = this._valueMin();
		}
		if ( val > this._valueMax() ) {
			val = this._valueMax();
		}

		return val;
	},

	_valueMin: function() {
		return 0;
	},

	_valueMax: function() {
		return 100;
	},

	_refreshValue: function() {
		var value = this.value();
		this.valueDiv
			[ value === this._valueMax() ? "addClass" : "removeClass"]( "ui-corner-right" )
			.width( value + "%" );
		this.element.attr( "aria-valuenow", value );
	}
});

$.extend( $.ui.progressbar, {
	version: "1.8.1"
});

})( jQuery );
/*
 * jQuery UI Effects 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/
 */
;jQuery.effects || (function($) {

$.effects = {};



/******************************************************************************/
/****************************** COLOR ANIMATIONS ******************************/
/******************************************************************************/

// override the animation for color styles
$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
	'borderRightColor', 'borderTopColor', 'color', 'outlineColor'],
function(i, attr) {
	$.fx.step[attr] = function(fx) {
		if (!fx.colorInit) {
			fx.start = getColor(fx.elem, attr);
			fx.end = getRGB(fx.end);
			fx.colorInit = true;
		}

		fx.elem.style[attr] = 'rgb(' +
			Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
			Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
			Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
	};
});

// Color Conversion functions from highlightFade
// By Blair Mitchelmore
// http://jquery.offput.ca/highlightFade/

// Parse strings looking for color tuples [255,255,255]
function getRGB(color) {
		var result;

		// Check if we're already dealing with an array of colors
		if ( color && color.constructor == Array && color.length == 3 )
				return color;

		// Look for rgb(num,num,num)
		if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
				return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];

		// Look for rgb(num%,num%,num%)
		if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
				return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];

		// Look for #a0b1c2
		if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
				return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];

		// Look for #fff
		if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
				return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];

		// Look for rgba(0, 0, 0, 0) == transparent in Safari 3
		if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
				return colors['transparent'];

		// Otherwise, we're most likely dealing with a named color
		return colors[$.trim(color).toLowerCase()];
}

function getColor(elem, attr) {
		var color;

		do {
				color = $.curCSS(elem, attr);

				// Keep going until we find an element that has color, or we hit the body
				if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
						break;

				attr = "backgroundColor";
		} while ( elem = elem.parentNode );

		return getRGB(color);
};

// Some named colors to work with
// From Interface by Stefan Petre
// http://interface.eyecon.ro/

var colors = {
	aqua:[0,255,255],
	azure:[240,255,255],
	beige:[245,245,220],
	black:[0,0,0],
	blue:[0,0,255],
	brown:[165,42,42],
	cyan:[0,255,255],
	darkblue:[0,0,139],
	darkcyan:[0,139,139],
	darkgrey:[169,169,169],
	darkgreen:[0,100,0],
	darkkhaki:[189,183,107],
	darkmagenta:[139,0,139],
	darkolivegreen:[85,107,47],
	darkorange:[255,140,0],
	darkorchid:[153,50,204],
	darkred:[139,0,0],
	darksalmon:[233,150,122],
	darkviolet:[148,0,211],
	fuchsia:[255,0,255],
	gold:[255,215,0],
	green:[0,128,0],
	indigo:[75,0,130],
	khaki:[240,230,140],
	lightblue:[173,216,230],
	lightcyan:[224,255,255],
	lightgreen:[144,238,144],
	lightgrey:[211,211,211],
	lightpink:[255,182,193],
	lightyellow:[255,255,224],
	lime:[0,255,0],
	magenta:[255,0,255],
	maroon:[128,0,0],
	navy:[0,0,128],
	olive:[128,128,0],
	orange:[255,165,0],
	pink:[255,192,203],
	purple:[128,0,128],
	violet:[128,0,128],
	red:[255,0,0],
	silver:[192,192,192],
	white:[255,255,255],
	yellow:[255,255,0],
	transparent: [255,255,255]
};



/******************************************************************************/
/****************************** CLASS ANIMATIONS ******************************/
/******************************************************************************/

var classAnimationActions = ['add', 'remove', 'toggle'],
	shorthandStyles = {
		border: 1,
		borderBottom: 1,
		borderColor: 1,
		borderLeft: 1,
		borderRight: 1,
		borderTop: 1,
		borderWidth: 1,
		margin: 1,
		padding: 1
	};

function getElementStyles() {
	var style = document.defaultView
			? document.defaultView.getComputedStyle(this, null)
			: this.currentStyle,
		newStyle = {},
		key,
		camelCase;

	// webkit enumerates style porperties
	if (style && style.length && style[0] && style[style[0]]) {
		var len = style.length;
		while (len--) {
			key = style[len];
			if (typeof style[key] == 'string') {
				camelCase = key.replace(/\-(\w)/g, function(all, letter){
					return letter.toUpperCase();
				});
				newStyle[camelCase] = style[key];
			}
		}
	} else {
		for (key in style) {
			if (typeof style[key] === 'string') {
				newStyle[key] = style[key];
			}
		}
	}
	
	return newStyle;
}

function filterStyles(styles) {
	var name, value;
	for (name in styles) {
		value = styles[name];
		if (
			// ignore null and undefined values
			value == null ||
			// ignore functions (when does this occur?)
			$.isFunction(value) ||
			// shorthand styles that need to be expanded
			name in shorthandStyles ||
			// ignore scrollbars (break in IE)
			(/scrollbar/).test(name) ||

			// only colors or values that can be converted to numbers
			(!(/color/i).test(name) && isNaN(parseFloat(value)))
		) {
			delete styles[name];
		}
	}
	
	return styles;
}

function styleDifference(oldStyle, newStyle) {
	var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
		name;

	for (name in newStyle) {
		if (oldStyle[name] != newStyle[name]) {
			diff[name] = newStyle[name];
		}
	}

	return diff;
}

$.effects.animateClass = function(value, duration, easing, callback) {
	if ($.isFunction(easing)) {
		callback = easing;
		easing = null;
	}

	return this.each(function() {

		var that = $(this),
			originalStyleAttr = that.attr('style') || ' ',
			originalStyle = filterStyles(getElementStyles.call(this)),
			newStyle,
			className = that.attr('className');

		$.each(classAnimationActions, function(i, action) {
			if (value[action]) {
				that[action + 'Class'](value[action]);
			}
		});
		newStyle = filterStyles(getElementStyles.call(this));
		that.attr('className', className);

		that.animate(styleDifference(originalStyle, newStyle), duration, easing, function() {
			$.each(classAnimationActions, function(i, action) {
				if (value[action]) { that[action + 'Class'](value[action]); }
			});
			// work around bug in IE by clearing the cssText before setting it
			if (typeof that.attr('style') == 'object') {
				that.attr('style').cssText = '';
				that.attr('style').cssText = originalStyleAttr;
			} else {
				that.attr('style', originalStyleAttr);
			}
			if (callback) { callback.apply(this, arguments); }
		});
	});
};

$.fn.extend({
	_addClass: $.fn.addClass,
	addClass: function(classNames, speed, easing, callback) {
		return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
	},

	_removeClass: $.fn.removeClass,
	removeClass: function(classNames,speed,easing,callback) {
		return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
	},

	_toggleClass: $.fn.toggleClass,
	toggleClass: function(classNames, force, speed, easing, callback) {
		if ( typeof force == "boolean" || force === undefined ) {
			if ( !speed ) {
				// without speed parameter;
				return this._toggleClass(classNames, force);
			} else {
				return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
			}
		} else {
			// without switch parameter;
			return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
		}
	},

	switchClass: function(remove,add,speed,easing,callback) {
		return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
	}
});



/******************************************************************************/
/*********************************** EFFECTS **********************************/
/******************************************************************************/

$.extend($.effects, {
	version: "1.8.1",

	// Saves a set of properties in a data storage
	save: function(element, set) {
		for(var i=0; i < set.length; i++) {
			if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
		}
	},

	// Restores a set of previously saved properties from a data storage
	restore: function(element, set) {
		for(var i=0; i < set.length; i++) {
			if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
		}
	},

	setMode: function(el, mode) {
		if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
		return mode;
	},

	getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
		// this should be a little more flexible in the future to handle a string & hash
		var y, x;
		switch (origin[0]) {
			case 'top': y = 0; break;
			case 'middle': y = 0.5; break;
			case 'bottom': y = 1; break;
			default: y = origin[0] / original.height;
		};
		switch (origin[1]) {
			case 'left': x = 0; break;
			case 'center': x = 0.5; break;
			case 'right': x = 1; break;
			default: x = origin[1] / original.width;
		};
		return {x: x, y: y};
	},

	// Wraps the element around a wrapper that copies position properties
	createWrapper: function(element) {

		// if the element is already wrapped, return it
		if (element.parent().is('.ui-effects-wrapper')) {
			return element.parent();
		}

		// wrap the element
		var props = {
				width: element.outerWidth(true),
				height: element.outerHeight(true),
				'float': element.css('float')
			},
			wrapper = $('<div></div>')
				.addClass('ui-effects-wrapper')
				.css({
					fontSize: '100%',
					background: 'transparent',
					border: 'none',
					margin: 0,
					padding: 0
				});

		element.wrap(wrapper);
		wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element

		// transfer positioning properties to the wrapper
		if (element.css('position') == 'static') {
			wrapper.css({ position: 'relative' });
			element.css({ position: 'relative' });
		} else {
			$.extend(props, {
				position: element.css('position'),
				zIndex: element.css('z-index')
			});
			$.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
				props[pos] = element.css(pos);
				if (isNaN(parseInt(props[pos], 10))) {
					props[pos] = 'auto';
				}
			});
			element.css({position: 'relative', top: 0, left: 0 });
		}

		return wrapper.css(props).show();
	},

	removeWrapper: function(element) {
		if (element.parent().is('.ui-effects-wrapper'))
			return element.parent().replaceWith(element);
		return element;
	},

	setTransition: function(element, list, factor, value) {
		value = value || {};
		$.each(list, function(i, x){
			unit = element.cssUnit(x);
			if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
		});
		return value;
	}
});


function _normalizeArguments(effect, options, speed, callback) {
	// shift params for method overloading
	if (typeof effect == 'object') {
		callback = options;
		speed = null;
		options = effect;
		effect = options.effect;
	}
	if ($.isFunction(options)) {
		callback = options;
		speed = null;
		options = {};
	}
	if ($.isFunction(speed)) {
		callback = speed;
		speed = null;
	}
	if (typeof options == 'number' || $.fx.speeds[options]) {
		callback = speed;
		speed = options;
		options = {};
	}

	options = options || {};

	speed = speed || options.duration;
	speed = $.fx.off ? 0 : typeof speed == 'number'
		? speed : $.fx.speeds[speed] || $.fx.speeds._default;

	callback = callback || options.complete;

	return [effect, options, speed, callback];
}

$.fn.extend({
	effect: function(effect, options, speed, callback) {
		var args = _normalizeArguments.apply(this, arguments),
			// TODO: make effects takes actual parameters instead of a hash
			args2 = {
				options: args[1],
				duration: args[2],
				callback: args[3]
			},
			effectMethod = $.effects[effect];
		
		return effectMethod && !$.fx.off ? effectMethod.call(this, args2) : this;
	},

	_show: $.fn.show,
	show: function(speed) {
		if (!speed || typeof speed == 'number' || $.fx.speeds[speed]) {
			return this._show.apply(this, arguments);
		} else {
			var args = _normalizeArguments.apply(this, arguments);
			args[1].mode = 'show';
			return this.effect.apply(this, args);
		}
	},

	_hide: $.fn.hide,
	hide: function(speed) {
		if (!speed || typeof speed == 'number' || $.fx.speeds[speed]) {
			return this._hide.apply(this, arguments);
		} else {
			var args = _normalizeArguments.apply(this, arguments);
			args[1].mode = 'hide';
			return this.effect.apply(this, args);
		}
	},

	// jQuery core overloads toggle and create _toggle
	__toggle: $.fn.toggle,
	toggle: function(speed) {
		if (!speed || typeof speed == 'number' || $.fx.speeds[speed] ||
			typeof speed == 'boolean' || $.isFunction(speed)) {
			return this.__toggle.apply(this, arguments);
		} else {
			var args = _normalizeArguments.apply(this, arguments);
			args[1].mode = 'toggle';
			return this.effect.apply(this, args);
		}
	},

	// helper functions
	cssUnit: function(key) {
		var style = this.css(key), val = [];
		$.each( ['em','px','%','pt'], function(i, unit){
			if(style.indexOf(unit) > 0)
				val = [parseFloat(style), unit];
		});
		return val;
	}
});



/******************************************************************************/
/*********************************** EASING ***********************************/
/******************************************************************************/

/*
 * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
 *
 * Uses the built in easing capabilities added In jQuery 1.1
 * to offer multiple easing options
 *
 * TERMS OF USE - jQuery Easing
 *
 * Open source under the BSD License.
 *
 * Copyright 2008 George McGinley Smith
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this list of
 * conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this list
 * of conditions and the following disclaimer in the documentation and/or other materials
 * provided with the distribution.
 *
 * Neither the name of the author nor the names of contributors may be used to endorse
 * or promote products derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *
*/

// t: current time, b: begInnIng value, c: change In value, d: duration
$.easing.jswing = $.easing.swing;

$.extend($.easing,
{
	def: 'easeOutQuad',
	swing: function (x, t, b, c, d) {
		//alert($.easing.default);
		return $.easing[$.easing.def](x, t, b, c, d);
	},
	easeInQuad: function (x, t, b, c, d) {
		return c*(t/=d)*t + b;
	},
	easeOutQuad: function (x, t, b, c, d) {
		return -c *(t/=d)*(t-2) + b;
	},
	easeInOutQuad: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t + b;
		return -c/2 * ((--t)*(t-2) - 1) + b;
	},
	easeInCubic: function (x, t, b, c, d) {
		return c*(t/=d)*t*t + b;
	},
	easeOutCubic: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t + 1) + b;
	},
	easeInOutCubic: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t + b;
		return c/2*((t-=2)*t*t + 2) + b;
	},
	easeInQuart: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t + b;
	},
	easeOutQuart: function (x, t, b, c, d) {
		return -c * ((t=t/d-1)*t*t*t - 1) + b;
	},
	easeInOutQuart: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
		return -c/2 * ((t-=2)*t*t*t - 2) + b;
	},
	easeInQuint: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t*t + b;
	},
	easeOutQuint: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t*t*t + 1) + b;
	},
	easeInOutQuint: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
		return c/2*((t-=2)*t*t*t*t + 2) + b;
	},
	easeInSine: function (x, t, b, c, d) {
		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
	},
	easeOutSine: function (x, t, b, c, d) {
		return c * Math.sin(t/d * (Math.PI/2)) + b;
	},
	easeInOutSine: function (x, t, b, c, d) {
		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
	},
	easeInExpo: function (x, t, b, c, d) {
		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
	},
	easeOutExpo: function (x, t, b, c, d) {
		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
	},
	easeInOutExpo: function (x, t, b, c, d) {
		if (t==0) return b;
		if (t==d) return b+c;
		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
	},
	easeInCirc: function (x, t, b, c, d) {
		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
	},
	easeOutCirc: function (x, t, b, c, d) {
		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
	},
	easeInOutCirc: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
	},
	easeInElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	},
	easeOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
	},
	easeInOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
	},
	easeInBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*(t/=d)*t*((s+1)*t - s) + b;
	},
	easeOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
	},
	easeInOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
	},
	easeInBounce: function (x, t, b, c, d) {
		return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
	},
	easeOutBounce: function (x, t, b, c, d) {
		if ((t/=d) < (1/2.75)) {
			return c*(7.5625*t*t) + b;
		} else if (t < (2/2.75)) {
			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
		} else if (t < (2.5/2.75)) {
			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
		} else {
			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
		}
	},
	easeInOutBounce: function (x, t, b, c, d) {
		if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
		return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
	}
});

/*
 *
 * TERMS OF USE - EASING EQUATIONS
 *
 * Open source under the BSD License.
 *
 * Copyright 2001 Robert Penner
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this list of
 * conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this list
 * of conditions and the following disclaimer in the documentation and/or other materials
 * provided with the distribution.
 *
 * Neither the name of the author nor the names of contributors may be used to endorse
 * or promote products derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

})(jQuery);
/*
 * jQuery UI Effects Blind 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Blind
 *
 * Depends:
 *	jquery.effects.core.js
 */
(function($) {

$.effects.blind = function(o) {

	return this.queue(function() {

		// Create element
		var el = $(this), props = ['position','top','left'];

		// Set options
		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
		var direction = o.options.direction || 'vertical'; // Default direction

		// Adjust
		$.effects.save(el, props); el.show(); // Save & Show
		var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
		var ref = (direction == 'vertical') ? 'height' : 'width';
		var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
		if(mode == 'show') wrapper.css(ref, 0); // Shift

		// Animation
		var animation = {};
		animation[ref] = mode == 'show' ? distance : 0;

		// Animate
		wrapper.animate(animation, o.duration, o.options.easing, function() {
			if(mode == 'hide') el.hide(); // Hide
			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
			if(o.callback) o.callback.apply(el[0], arguments); // Callback
			el.dequeue();
		});

	});

};

})(jQuery);
/*
 * jQuery UI Effects Bounce 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Bounce
 *
 * Depends:
 *	jquery.effects.core.js
 */
(function($) {

$.effects.bounce = function(o) {

	return this.queue(function() {

		// Create element
		var el = $(this), props = ['position','top','left'];

		// Set options
		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
		var direction = o.options.direction || 'up'; // Default direction
		var distance = o.options.distance || 20; // Default distance
		var times = o.options.times || 5; // Default # of times
		var speed = o.duration || 250; // Default speed per bounce
		if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE

		// Adjust
		$.effects.save(el, props); el.show(); // Save & Show
		$.effects.createWrapper(el); // Create Wrapper
		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
		var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3);
		if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
		if (mode == 'hide') distance = distance / (times * 2);
		if (mode != 'hide') times--;

		// Animate
		if (mode == 'show') { // Show Bounce
			var animation = {opacity: 1};
			animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
			el.animate(animation, speed / 2, o.options.easing);
			distance = distance / 2;
			times--;
		};
		for (var i = 0; i < times; i++) { // Bounces
			var animation1 = {}, animation2 = {};
			animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
			animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
			el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
			distance = (mode == 'hide') ? distance * 2 : distance / 2;
		};
		if (mode == 'hide') { // Last Bounce
			var animation = {opacity: 0};
			animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
			el.animate(animation, speed / 2, o.options.easing, function(){
				el.hide(); // Hide
				$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
				if(o.callback) o.callback.apply(this, arguments); // Callback
			});
		} else {
			var animation1 = {}, animation2 = {};
			animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
			animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
			el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
				$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
				if(o.callback) o.callback.apply(this, arguments); // Callback
			});
		};
		el.queue('fx', function() { el.dequeue(); });
		el.dequeue();
	});

};

})(jQuery);
/*
 * jQuery UI Effects Clip 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Clip
 *
 * Depends:
 *	jquery.effects.core.js
 */
(function($) {

$.effects.clip = function(o) {

	return this.queue(function() {

		// Create element
		var el = $(this), props = ['position','top','left','height','width'];

		// Set options
		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
		var direction = o.options.direction || 'vertical'; // Default direction

		// Adjust
		$.effects.save(el, props); el.show(); // Save & Show
		var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
		var animate = el[0].tagName == 'IMG' ? wrapper : el;
		var ref = {
			size: (direction == 'vertical') ? 'height' : 'width',
			position: (direction == 'vertical') ? 'top' : 'left'
		};
		var distance = (direction == 'vertical') ? animate.height() : animate.width();
		if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift

		// Animation
		var animation = {};
		animation[ref.size] = mode == 'show' ? distance : 0;
		animation[ref.position] = mode == 'show' ? 0 : distance / 2;

		// Animate
		animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
			if(mode == 'hide') el.hide(); // Hide
			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
			if(o.callback) o.callback.apply(el[0], arguments); // Callback
			el.dequeue();
		}});

	});

};

})(jQuery);
/*
 * jQuery UI Effects Drop 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Drop
 *
 * Depends:
 *	jquery.effects.core.js
 */
(function($) {

$.effects.drop = function(o) {

	return this.queue(function() {

		// Create element
		var el = $(this), props = ['position','top','left','opacity'];

		// Set options
		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
		var direction = o.options.direction || 'left'; // Default Direction

		// Adjust
		$.effects.save(el, props); el.show(); // Save & Show
		$.effects.createWrapper(el); // Create Wrapper
		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
		var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2);
		if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift

		// Animation
		var animation = {opacity: mode == 'show' ? 1 : 0};
		animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;

		// Animate
		el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
			if(mode == 'hide') el.hide(); // Hide
			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
			if(o.callback) o.callback.apply(this, arguments); // Callback
			el.dequeue();
		}});

	});

};

})(jQuery);
/*
 * jQuery UI Effects Explode 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Explode
 *
 * Depends:
 *	jquery.effects.core.js
 */
(function($) {

$.effects.explode = function(o) {

	return this.queue(function() {

	var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
	var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;

	o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
	var el = $(this).show().css('visibility', 'hidden');
	var offset = el.offset();

	//Substract the margins - not fixing the problem yet.
	offset.top -= parseInt(el.css("marginTop"),10) || 0;
	offset.left -= parseInt(el.css("marginLeft"),10) || 0;

	var width = el.outerWidth(true);
	var height = el.outerHeight(true);

	for(var i=0;i<rows;i++) { // =
		for(var j=0;j<cells;j++) { // ||
			el
				.clone()
				.appendTo('body')
				.wrap('<div></div>')
				.css({
					position: 'absolute',
					visibility: 'visible',
					left: -j*(width/cells),
					top: -i*(height/rows)
				})
				.parent()
				.addClass('ui-effects-explode')
				.css({
					position: 'absolute',
					overflow: 'hidden',
					width: width/cells,
					height: height/rows,
					left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
					top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
					opacity: o.options.mode == 'show' ? 0 : 1
				}).animate({
					left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
					top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
					opacity: o.options.mode == 'show' ? 1 : 0
				}, o.duration || 500);
		}
	}

	// Set a timeout, to call the callback approx. when the other animations have finished
	setTimeout(function() {

		o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
				if(o.callback) o.callback.apply(el[0]); // Callback
				el.dequeue();

				$('div.ui-effects-explode').remove();

	}, o.duration || 500);


	});

};

})(jQuery);
/*
 * jQuery UI Effects Fold 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Fold
 *
 * Depends:
 *	jquery.effects.core.js
 */
(function($) {

$.effects.fold = function(o) {

	return this.queue(function() {

		// Create element
		var el = $(this), props = ['position','top','left'];

		// Set options
		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
		var size = o.options.size || 15; // Default fold size
		var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
		var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2;

		// Adjust
		$.effects.save(el, props); el.show(); // Save & Show
		var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
		var widthFirst = ((mode == 'show') != horizFirst);
		var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
		var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
		var percent = /([0-9]+)%/.exec(size);
		if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1];
		if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift

		// Animation
		var animation1 = {}, animation2 = {};
		animation1[ref[0]] = mode == 'show' ? distance[0] : size;
		animation2[ref[1]] = mode == 'show' ? distance[1] : 0;

		// Animate
		wrapper.animate(animation1, duration, o.options.easing)
		.animate(animation2, duration, o.options.easing, function() {
			if(mode == 'hide') el.hide(); // Hide
			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
			if(o.callback) o.callback.apply(el[0], arguments); // Callback
			el.dequeue();
		});

	});

};

})(jQuery);
/*
 * jQuery UI Effects Highlight 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Highlight
 *
 * Depends:
 *	jquery.effects.core.js
 */
(function($) {

$.effects.highlight = function(o) {
	return this.queue(function() {
		var elem = $(this),
			props = ['backgroundImage', 'backgroundColor', 'opacity'],
			mode = $.effects.setMode(elem, o.options.mode || 'show'),
			animation = {
				backgroundColor: elem.css('backgroundColor')
			};

		if (mode == 'hide') {
			animation.opacity = 0;
		}

		$.effects.save(elem, props);
		elem
			.show()
			.css({
				backgroundImage: 'none',
				backgroundColor: o.options.color || '#ffff99'
			})
			.animate(animation, {
				queue: false,
				duration: o.duration,
				easing: o.options.easing,
				complete: function() {
					(mode == 'hide' && elem.hide());
					$.effects.restore(elem, props);
					(mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
					(o.callback && o.callback.apply(this, arguments));
					elem.dequeue();
				}
			});
	});
};

})(jQuery);
/*
 * jQuery UI Effects Pulsate 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Pulsate
 *
 * Depends:
 *	jquery.effects.core.js
 */
(function($) {

$.effects.pulsate = function(o) {
	return this.queue(function() {
		var elem = $(this),
			mode = $.effects.setMode(elem, o.options.mode || 'show');
			times = ((o.options.times || 5) * 2) - 1;
			duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
			isVisible = elem.is(':visible'),
			animateTo = 0;

		if (!isVisible) {
			elem.css('opacity', 0).show();
			animateTo = 1;
		}

		if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) {
			times--;
		}

		for (var i = 0; i < times; i++) {
			elem.animate({ opacity: animateTo }, duration, o.options.easing);
			animateTo = (animateTo + 1) % 2;
		}

		elem.animate({ opacity: animateTo }, duration, o.options.easing, function() {
			if (animateTo == 0) {
				elem.hide();
			}
			(o.callback && o.callback.apply(this, arguments));
		});

		elem
			.queue('fx', function() { elem.dequeue(); })
			.dequeue();
	});
};

})(jQuery);
/*
 * jQuery UI Effects Scale 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Scale
 *
 * Depends:
 *	jquery.effects.core.js
 */
(function($) {

$.effects.puff = function(o) {
	return this.queue(function() {
		var elem = $(this),
			mode = $.effects.setMode(elem, o.options.mode || 'hide'),
			percent = parseInt(o.options.percent, 10) || 150,
			factor = percent / 100,
			original = { height: elem.height(), width: elem.width() };

		$.extend(o.options, {
			fade: true,
			mode: mode,
			percent: mode == 'hide' ? percent : 100,
			from: mode == 'hide'
				? original
				: {
					height: original.height * factor,
					width: original.width * factor
				}
		});

		elem.effect('scale', o.options, o.duration, o.callback);
		elem.dequeue();
	});
};

$.effects.scale = function(o) {

	return this.queue(function() {

		// Create element
		var el = $(this);

		// Set options
		var options = $.extend(true, {}, o.options);
		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
		var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
		var direction = o.options.direction || 'both'; // Set default axis
		var origin = o.options.origin; // The origin of the scaling
		if (mode != 'effect') { // Set default origin and restore for show/hide
			options.origin = origin || ['middle','center'];
			options.restore = true;
		}
		var original = {height: el.height(), width: el.width()}; // Save original
		el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state

		// Adjust
		var factor = { // Set scaling factor
			y: direction != 'horizontal' ? (percent / 100) : 1,
			x: direction != 'vertical' ? (percent / 100) : 1
		};
		el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state

		if (o.options.fade) { // Fade option to support puff
			if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
			if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
		};

		// Animation
		options.from = el.from; options.to = el.to; options.mode = mode;

		// Animate
		el.effect('size', options, o.duration, o.callback);
		el.dequeue();
	});

};

$.effects.size = function(o) {

	return this.queue(function() {

		// Create element
		var el = $(this), props = ['position','top','left','width','height','overflow','opacity'];
		var props1 = ['position','top','left','overflow','opacity']; // Always restore
		var props2 = ['width','height','overflow']; // Copy for children
		var cProps = ['fontSize'];
		var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
		var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];

		// Set options
		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
		var restore = o.options.restore || false; // Default restore
		var scale = o.options.scale || 'both'; // Default scale mode
		var origin = o.options.origin; // The origin of the sizing
		var original = {height: el.height(), width: el.width()}; // Save original
		el.from = o.options.from || original; // Default from state
		el.to = o.options.to || original; // Default to state
		// Adjust
		if (origin) { // Calculate baseline shifts
			var baseline = $.effects.getBaseline(origin, original);
			el.from.top = (original.height - el.from.height) * baseline.y;
			el.from.left = (original.width - el.from.width) * baseline.x;
			el.to.top = (original.height - el.to.height) * baseline.y;
			el.to.left = (original.width - el.to.width) * baseline.x;
		};
		var factor = { // Set scaling factor
			from: {y: el.from.height / original.height, x: el.from.width / original.width},
			to: {y: el.to.height / original.height, x: el.to.width / original.width}
		};
		if (scale == 'box' || scale == 'both') { // Scale the css box
			if (factor.from.y != factor.to.y) { // Vertical props scaling
				props = props.concat(vProps);
				el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
				el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
			};
			if (factor.from.x != factor.to.x) { // Horizontal props scaling
				props = props.concat(hProps);
				el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
				el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
			};
		};
		if (scale == 'content' || scale == 'both') { // Scale the content
			if (factor.from.y != factor.to.y) { // Vertical props scaling
				props = props.concat(cProps);
				el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
				el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
			};
		};
		$.effects.save(el, restore ? props : props1); el.show(); // Save & Show
		$.effects.createWrapper(el); // Create Wrapper
		el.css('overflow','hidden').css(el.from); // Shift

		// Animate
		if (scale == 'content' || scale == 'both') { // Scale the children
			vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
			hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
			props2 = props.concat(vProps).concat(hProps); // Concat
			el.find("*[width]").each(function(){
				child = $(this);
				if (restore) $.effects.save(child, props2);
				var c_original = {height: child.height(), width: child.width()}; // Save original
				child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
				child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
				if (factor.from.y != factor.to.y) { // Vertical props scaling
					child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
					child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
				};
				if (factor.from.x != factor.to.x) { // Horizontal props scaling
					child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
					child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
				};
				child.css(child.from); // Shift children
				child.animate(child.to, o.duration, o.options.easing, function(){
					if (restore) $.effects.restore(child, props2); // Restore children
				}); // Animate children
			});
		};

		// Animate
		el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
			if (el.to.opacity === 0) {
				el.css('opacity', el.from.opacity);
			}
			if(mode == 'hide') el.hide(); // Hide
			$.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
			if(o.callback) o.callback.apply(this, arguments); // Callback
			el.dequeue();
		}});

	});

};

})(jQuery);
/*
 * jQuery UI Effects Shake 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Shake
 *
 * Depends:
 *	jquery.effects.core.js
 */
(function($) {

$.effects.shake = function(o) {

	return this.queue(function() {

		// Create element
		var el = $(this), props = ['position','top','left'];

		// Set options
		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
		var direction = o.options.direction || 'left'; // Default direction
		var distance = o.options.distance || 20; // Default distance
		var times = o.options.times || 3; // Default # of times
		var speed = o.duration || o.options.duration || 140; // Default speed per shake

		// Adjust
		$.effects.save(el, props); el.show(); // Save & Show
		$.effects.createWrapper(el); // Create Wrapper
		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';

		// Animation
		var animation = {}, animation1 = {}, animation2 = {};
		animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
		animation1[ref] = (motion == 'pos' ? '+=' : '-=')  + distance * 2;
		animation2[ref] = (motion == 'pos' ? '-=' : '+=')  + distance * 2;

		// Animate
		el.animate(animation, speed, o.options.easing);
		for (var i = 1; i < times; i++) { // Shakes
			el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
		};
		el.animate(animation1, speed, o.options.easing).
		animate(animation, speed / 2, o.options.easing, function(){ // Last shake
			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
			if(o.callback) o.callback.apply(this, arguments); // Callback
		});
		el.queue('fx', function() { el.dequeue(); });
		el.dequeue();
	});

};

})(jQuery);
/*
 * jQuery UI Effects Slide 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Slide
 *
 * Depends:
 *	jquery.effects.core.js
 */
(function($) {

$.effects.slide = function(o) {

	return this.queue(function() {

		// Create element
		var el = $(this), props = ['position','top','left'];

		// Set options
		var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
		var direction = o.options.direction || 'left'; // Default Direction

		// Adjust
		$.effects.save(el, props); el.show(); // Save & Show
		$.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
		var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true}));
		if (mode == 'show') el.css(ref, motion == 'pos' ? -distance : distance); // Shift

		// Animation
		var animation = {};
		animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;

		// Animate
		el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
			if(mode == 'hide') el.hide(); // Hide
			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
			if(o.callback) o.callback.apply(this, arguments); // Callback
			el.dequeue();
		}});

	});

};

})(jQuery);
/*
 * jQuery UI Effects Transfer 1.8.1
 *
 * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Transfer
 *
 * Depends:
 *	jquery.effects.core.js
 */
(function($) {

$.effects.transfer = function(o) {
	return this.queue(function() {
		var elem = $(this),
			target = $(o.options.to),
			endPosition = target.offset(),
			animation = {
				top: endPosition.top,
				left: endPosition.left,
				height: target.innerHeight(),
				width: target.innerWidth()
			},
			startPosition = elem.offset(),
			transfer = $('<div class="ui-effects-transfer"></div>')
				.appendTo(document.body)
				.addClass(o.options.className)
				.css({
					top: startPosition.top,
					left: startPosition.left,
					height: elem.innerHeight(),
					width: elem.innerWidth(),
					position: 'absolute'
				})
				.animate(animation, o.duration, o.options.easing, function() {
					transfer.remove();
					(o.callback && o.callback.apply(elem[0], arguments));
					elem.dequeue();
				});
	});
};

})(jQuery);
/*
SmmNestedSortables JSON Serializer

Calling $.fn.smmNestedSortable.jsonSerializer.buildSpec() will return a serialized string of the first ul.sortable on the page.

smmNestedSortables can automatically calls buildSpec when the spec is changed. This is how you would do it: 

$('.sortable').smmNestedSortable({
	'serializer':function() {
		var spec = $.fn.smmNestedSortable.jsonSerializer.buildSpec();
		$("#spec").html("<b>text output</b><br /><br />"+ spec);
	}
});

*/

jQuery.fn.smmNestedSortable.jsonSerializer = {
	'buildSpec': function() {
		var newSpec = this._buildSpec(jQuery("ul.nestedSortable:first").children('li'));
		var spec = { format: { name: 'smmNestedSortablesJSONSpec', majorVersion:'0', minorVersion:'1' }, content: newSpec}; 
		return jQuery.toJSON(spec);
	},
	'_buildSpec': function(liList) {
		var spec = [];
		liList.each(function() {
			var li=this;
			var node = {
				title: li.id
			};
			node.children = jQuery.fn.smmNestedSortable.jsonSerializer._buildSpec(jQuery(li).children("ul").children("li"));
			spec.push(node);
	 	});
	  return spec;
	},
	getSpec: function(tiddler) {
		try{
			return jQuery.parseJSON(store.getTiddlerText(docTiddler)).content;
		} catch(e) {
			return false;
		}
	}
};
This space provides all the plugins used my TiddlyDocs to provide the smmNestedSortable interface.
{{{<<smmNestedSortable>> }}} renders a sortable list of the contents in [[activeDocument]].


[[smmTableOfContentPlugin]]
[[smmNestedSortablePlugin]]
[[activeDocument]]
[[droppableSectionPlugin]]
[[jquery.smmNestedSortable]]
[[jquery-ui-1.8.1.custom]]
[[setActiveDocument]]
/*
 * g.Raphael 0.4.2 - Charting library, based on Raphaël
 *
 * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com)
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
 */
Raphael.fn.g.linechart=function(M,L,b,d,t,s,F){function E(x,ae){var i=x.length/ae,y=0,a=i,Y=0,X=[];while(y<x.length){a--;if(a<0){Y+=x[y]*(1+a);X.push(Y/i);Y=x[y++]*-a;a+=i}else{Y+=x[y++]}}return X}function P(j,i,aj,ah,ae,Y){var y=(aj-j)/2,x=(ae-aj)/2,ak=Math.atan((aj-j)/Math.abs(ah-i)),ai=Math.atan((ae-aj)/Math.abs(ah-Y));ak=i<ah?Math.PI-ak:ak;ai=Y<ah?Math.PI-ai:ai;var X=Math.PI/2-((ak+ai)%(Math.PI*2))/2,am=y*Math.sin(X+ak),ag=y*Math.cos(X+ak),al=x*Math.sin(X+ai),af=x*Math.cos(X+ai);return{x1:aj-am,y1:ah+ag,x2:aj+al,y2:ah+af}}F=F||{};if(!this.raphael.is(t[0],"array")){t=[t]}if(!this.raphael.is(s[0],"array")){s=[s]}var m=F.gutter||10,u=Math.max(t[0].length,s[0].length),o=F.symbol||"",Q=F.colors||Raphael.fn.g.colors,K=this,q=null,l=null,ab=this.set(),R=[];for(var aa=0,H=s.length;aa<H;aa++){u=Math.max(u,s[aa].length)}var ac=this.set();for(aa=0,H=s.length;aa<H;aa++){if(F.shade){ac.push(this.path().attr({stroke:"none",fill:Q[aa],opacity:F.nostroke?1:0.3}))}if(s[aa].length>b-2*m){s[aa]=E(s[aa],b-2*m);u=b-2*m}if(t[aa]&&t[aa].length>b-2*m){t[aa]=E(t[aa],b-2*m)}}var U=Array.prototype.concat.apply([],t),S=Array.prototype.concat.apply([],s),p=this.g.snapEnds(Math.min.apply(Math,U),Math.max.apply(Math,U),t[0].length-1),z=p.from,k=p.to,J=this.g.snapEnds(Math.min.apply(Math,S),Math.max.apply(Math,S),s[0].length-1),v=J.from,h=J.to,V=(b-m*2)/((k-z)||1),T=(d-m*2)/((h-v)||1);var B=this.set();if(F.axis){var g=(F.axis+"").split(/[,\s]+/);+g[0]&&B.push(this.g.axis(M+m,L+m,b-2*m,z,k,F.axisxstep||Math.floor((b-2*m)/20),2));+g[1]&&B.push(this.g.axis(M+b-m,L+d-m,d-2*m,v,h,F.axisystep||Math.floor((d-2*m)/20),3));+g[2]&&B.push(this.g.axis(M+m,L+d-m,b-2*m,z,k,F.axisxstep||Math.floor((b-2*m)/20),0));+g[3]&&B.push(this.g.axis(M+m,L+d-m,d-2*m,v,h,F.axisystep||Math.floor((d-2*m)/20),1))}var I=this.set(),W=this.set(),n;for(aa=0,H=s.length;aa<H;aa++){if(!F.nostroke){I.push(n=this.path().attr({stroke:Q[aa],"stroke-width":F.width||2,"stroke-linejoin":"round","stroke-linecap":"round","stroke-dasharray":F.dash||""}))}var c=this.raphael.is(o,"array")?o[aa]:o,C=this.set();R=[];for(var Z=0,r=s[aa].length;Z<r;Z++){var f=M+m+((t[aa]||t[0])[Z]-z)*V,e=L+d-m-(s[aa][Z]-v)*T;(Raphael.is(c,"array")?c[Z]:c)&&C.push(this.g[Raphael.fn.g.markers[this.raphael.is(c,"array")?c[Z]:c]](f,e,(F.width||2)*3).attr({fill:Q[aa],stroke:"none"}));if(F.smooth){if(Z&&Z!=r-1){var O=M+m+((t[aa]||t[0])[Z-1]-z)*V,A=L+d-m-(s[aa][Z-1]-v)*T,N=M+m+((t[aa]||t[0])[Z+1]-z)*V,w=L+d-m-(s[aa][Z+1]-v)*T;var ad=P(O,A,f,e,N,w);R=R.concat([ad.x1,ad.y1,f,e,ad.x2,ad.y2])}if(!Z){R=["M",f,e,"C",f,e]}}else{R=R.concat([Z?"L":"M",f,e])}}if(F.smooth){R=R.concat([f,e,f,e])}W.push(C);if(F.shade){ac[aa].attr({path:R.concat(["L",f,L+d-m,"L",M+m+((t[aa]||t[0])[0]-z)*V,L+d-m,"z"]).join(",")})}!F.nostroke&&n.attr({path:R.join(",")})}function G(ak){var ah=[];for(var ai=0,am=t.length;ai<am;ai++){ah=ah.concat(t[ai])}ah.sort();var an=[],ae=[];for(ai=0,am=ah.length;ai<am;ai++){ah[ai]!=ah[ai-1]&&an.push(ah[ai])&&ae.push(M+m+(ah[ai]-z)*V)}ah=an;am=ah.length;var Y=ak||K.set();for(ai=0;ai<am;ai++){var y=ae[ai]-(ae[ai]-(ae[ai-1]||M))/2,al=((ae[ai+1]||M+b)-ae[ai])/2+(ae[ai]-(ae[ai-1]||M))/2,a;ak?(a={}):Y.push(a=K.rect(y-1,L,Math.max(al+1,1),d).attr({stroke:"none",fill:"#000",opacity:0}));a.values=[];a.symbols=K.set();a.y=[];a.x=ae[ai];a.axis=ah[ai];for(var ag=0,aj=s.length;ag<aj;ag++){an=t[ag]||t[0];for(var af=0,x=an.length;af<x;af++){if(an[af]==ah[ai]){a.values.push(s[ag][af]);a.y.push(L+d-m-(s[ag][af]-v)*T);a.symbols.push(ab.symbols[ag][af])}}}ak&&ak.call(a)}!ak&&(q=Y)}function D(ai){var ae=ai||K.set(),a;for(var ag=0,ak=s.length;ag<ak;ag++){for(var af=0,ah=s[ag].length;af<ah;af++){var y=M+m+((t[ag]||t[0])[af]-z)*V,aj=M+m+((t[ag]||t[0])[af?af-1:1]-z)*V,x=L+d-m-(s[ag][af]-v)*T;ai?(a={}):ae.push(a=K.circle(y,x,Math.abs(aj-y)/2).attr({stroke:"none",fill:"#000",opacity:0}));a.x=y;a.y=x;a.value=s[ag][af];a.line=ab.lines[ag];a.shade=ab.shades[ag];a.symbol=ab.symbols[ag][af];a.symbols=ab.symbols[ag];a.axis=(t[ag]||t[0])[af];ai&&ai.call(a)}}!ai&&(l=ae)}ab.push(I,ac,W,B,q,l);ab.lines=I;ab.shades=ac;ab.symbols=W;ab.axis=B;ab.hoverColumn=function(i,a){!q&&G();q.mouseover(i).mouseout(a);return this};ab.clickColumn=function(a){!q&&G();q.click(a);return this};ab.hrefColumn=function(X){var Y=K.raphael.is(arguments[0],"array")?arguments[0]:arguments;if(!(arguments.length-1)&&typeof X=="object"){for(var a in X){for(var j=0,y=q.length;j<y;j++){if(q[j].axis==a){q[j].attr("href",X[a])}}}}!q&&G();for(j=0,y=Y.length;j<y;j++){q[j]&&q[j].attr("href",Y[j])}return this};ab.hover=function(i,a){!l&&D();l.mouseover(i).mouseout(a);return this};ab.click=function(a){!l&&D();l.click(a);return this};ab.each=function(a){D(a);return this};ab.eachColumn=function(a){G(a);return this};return ab};
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
This table of data shows people's preferred programming languages. 117 fictional people were asked the question.

|Javascript|Python|PHP|Java|
|1|20|35|32|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="72 648 70 70" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 77.59005 669.34003 C 71.532745 681.90424 73.714462 697.4441 84.135193 707.86475 
		C 97.315445 721.0451 118.684715 721.0451 131.8649 707.86475 
		C 145.04515 694.68457 145.04515 673.31537 131.8649 660.13513 
		C 121.4441 649.7141 105.90419 647.53253 93.339905 653.5899 L 102.047455 662.2976 
		C 109.58637 660.2373 117.987976 662.16803 123.90997 668.08997 
		C 132.69673 676.8767 132.69673 691.12317 123.90997 699.90985 
		C 115.12313 708.6966 100.87699 708.6966 92.09012 699.90985 
		C 86.168266 693.98804 84.23744 685.58643 86.297653 678.04755 Z M 72 648 L 72 668.25 L 78.75 661.49957 
		L 99.00019 681.7502 L 105.750175 675.00006 L 85.50013 654.75012 L 92.249985 648 Z" fill="black"
		class="glyph"/>
	</g>
</g>
</svg>
<<LineChart SharePriceData>>
<<PieChart TagUsage>>
<<LineChart LineData>>
 <<tiddler TiddlyDocControls>>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="301 225 48 52"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 333.00003 234 L 306 258.75003 L 301.5 270 L 312.75 265.50003 L 339.75 240.74998 Z M 337.5 229.50002 
		L 335.24988 231.75008 L 341.99997 238.50003 L 344.24997 236.24995 Z M 342 225.00003 L 339.74988 227.25009 
		L 346.5 234.00005 L 348.75 231.75003 Z M 301.5 273.9719 C 301.5 273.9719 309.59888 277.99927 317.70013 273.97183 
		C 325.80066 269.94437 341.99997 276.65686 341.99997 276.65686 L 341.99997 273.97195 
		C 341.99997 273.97195 325.80014 267.2594 317.70013 271.28687 C 309.6 275.31451 301.5 271.28683 301.5 271.28683 Z" 
		fill="#101010" class="glyph"/>
	</g>
</g>
</svg>
/***
|''Name''|droppableSectionsPlugin|
|''Description''|allows tiddler titles to be dropped into the tiddlydocs table of content. |
|''Authors''|Simon McManus|
|''Version''|0.1|
|''Status''|stable|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Requires''||

!Usage
adding {{{<<droppableSection>>}}} to the tiddler view template will allows you to drag the tiddler into the TiddlyDocs table of content. This should work with any jQuery sortable lists. 


!Code
***/

//{{{
	
config.macros.droppableSection = {};
config.macros.droppableSection.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	config.macros.droppableSection.refresh(place);
};

config.macros.droppableSection.refresh = function(place) {
	var tiddlerElem = story.findContainingTiddler(place);
	var containingTiddlerTitle = tiddlerElem.getAttribute("tiddler"); 
	var strippedTidTitle = config.macros.droppableSection.strip(containingTiddlerTitle);
	var ul = createTiddlyElement(place, "ul", strippedTidTitle+"DroppableSectionList", 'sortable-title');
	var li = createTiddlyElement(ul, "li", containingTiddlerTitle);
	var sectionDiv = createTiddlyElement(li, "div", containingTiddlerTitle+'_div');
	//createTiddlyText(sectionDiv, containingTiddlerTitle);
invokeMacro(sectionDiv, "view", "title text", null, store.getTiddler(containingTiddlerTitle));

	jQuery(ul).sortable({
		items: "li",
		connectWith: ['.nestedSortable'],
		remove: function() {
			story.refreshTiddler(containingTiddlerTitle,1,true);
		},
		stop: function() {
			console.log('pies');
			config.macros.smmNestedSortable.specChanged();
			
		}
	});
}
	

config.macros.droppableSection.strip=function(s) {
	return s.replace(/ /g,'');
}

config.shadowTiddlers["DroppableSectionPluginStyles"] = store.getRecursiveTiddlerText("droppableSectionPlugin##StyleSheet");
store.addNotification("DroppableSectionPluginStyles", refreshStyles);


/***
!StyleSheet

.ul-toc-droppable-heading {border:2px solid transparent;}
.toc-droppable-heading {border:2px solid transparent;cursor:move;}
.toc-droppable-heading:hover {color:[[ColorPalette::PrimaryLight]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];cursor:move;}
html body div.title ul.toc {padding:0;}
div.title  ul.toc {padding:0em;margin:0em;}
html body ul.sortable-title {padding:0em;margin:0em;z-index:5;}

!(end of StyleSheet)

***/

//}}}
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AP8zZgAAAGYA//8zAADMMwD/mTMAAGYzAP8zMwAAADMAzP8AAADMAADMmQAAAGYAAMwzAAAAAADuzAAA3QAAALvMAACqAAAAiMwAAHcAAABVmQAARAAAACKZAAARAADuAJkA3QAAALsAmQCqAAAAiACZAHcAAABVAJkARAAAACIAZgARAADuAABm3QAAALsAAGaqAAAAiAAAZncAAABVAABmRAAAACIAAGYRAAAA7u7uM93d3QC7u7szqqqqAIiIiDN3d3cAVVVVM0RERAAiIiIzERERAAAAADMBAQEBAQEBAQEBpXl5eXl5eXl5eXmlAQEBAQEBAQEBAQEBAQEBAQEBgHl5eXl5eXl5eXl5eXl5gAEBAQEBAQEBAQEBAQEB/Xp5eXlVT04qKioqTk9VeXl5ev0BAQEBAQEBAQEBAaV5eXlPKioqKioqKioqKioqT3l5eaUBAQEBAQEBAQGAeXlVTioqKioqKioqKioqKioqTlV5eYABAQEBAQEBgHl5VSoqKioqKioqKioqKioqKioqKlV5eYABAQEBAaV5eVUqKioqKioqKioqKioqKioqKioqKlV5eaUBAQEBeXlVKioqKioqKioqKioqKioqKioqKioqKlV5eQEBAXl5eU4qKioqKioqKjExMTExMSoqKioqKioqTnl5eQEBeXlPKioqKioqKjEyMjIyMjIyMjEqKioqKioqT3l5AXp5eSoqKioqKioxMjIxBwcHBzEyMjEqKioqKioqeXl6eXlVKioqKioqMTIxBwcHBwcHBwcxMjEqKioqKipVeXl5eU8qKioqKioyMgcHBwcHBwcHBwcyMioqKioqKk95eXl5TioqKioqMTIxBwcHBwcHBwcHBzEyMSoqKioqTnl5eXkqKioqKioxMgcHBwcHBwcHBwcHBzIxKioqKioqeXl5eSoqKioqKjEyBwcHBwcHBwcHBwcHMjEqKioqKip5eXl5KioqKioqMTIHBwcHBwcHBwcHBwcyMSoqKioqKnl5eXkqKioqKioxMgcHBwcHBwcHBwcHBzIxKioqKioqeXl5eU4qKioqKjEyMQcHBwcHBwcHBwcxMjEqKioqKk55eXl5TyoqKioqKjIyBwcHBwcHBwcHBzIyKioqKioqT3l5eXlVKioqKioqMTIxBwcHBwcHBwcxMjEqKioqKipVeXl6eXkqKioqKioqMTIyMQcHBwcxMjIxKioqKioqKnl5egF5eU8qKioqKioqMTIyMjIyMjIyMSoqKioqKipPeXkBAXl5eU4qKioqKioqKjExMTExMSoqKioqKioqTnl5eQEBAXl5VSoqKioqKioqKioqKioqKioqKioqKipVeXkBAQEB+nl5VSoqKioqKioqKioqKioqKioqKioqVXl5+gEBAQEBenl5VSoqKioqKioqKioqKioqKioqKlV5eXoBAQEBAQEBeXl5VU4qKioqKioqKioqKioqKk5VeXl5AQEBAQEBAQEBenl5eU8qKioqKioqKioqKipPeXl5egEBAQEBAQEBAQEB+nl5eXlVT04qKioqTk9VeXl5efoBAQEBAQEBAQEBAQEBAXl5eXl5eXl5eXl5eXl5eXkBAQEBAQEBAQEBAQEBAQEBAQF6eXl5eXl5eXl5eXoBAQEBAQEBAQEB/+AH//+AAf/+AAB//AAAP/gAAB/wAAAP4AAAB8AAAAPAAAADgAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAHAAAADwAAAA+AAAAfwAAAP+AAAH/wAAD/+AAB//4AB///gB/8oAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAACAAAAAwAAAAMAAAADAAAABG1bSA61m3JXuqB4mbuhd8m9o3jqvaF4+b2hePm9o3jqu6F3ybqgeJm1m3JXbVtIDgAAAAQAAAADAAAAAwAAAAMAAAACAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAUAAAAGAAAACI98Wye0nXWavKF4876kev++pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vqR6/76kev+8oXjztJ11mo98WycAAAAIAAAABgAAAAUAAAADAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAQAAAAHAAAAChwcHBKulnGJvaN5+L6kev++pHr/y7GJ/9/Fnv/s1K7/9t25//rivv/64r7/9t25/+zUrv/fxZ7/y7GJ/76kev++pHr/vaN5+K6WcYkcHBwSAAAACgAAAAcAAAAEAAAAAgAAAAEAAAAAAAAAAAAAAAEAAAADAAAABwAAAAtuYkUst552z76kev++pHr+1LuS//Latf/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD/8tq1/9S7kv++pHr+vqR6/7eeds9uYkUsAAAACwAAAAcAAAADAAAAAQAAAAAAAAABAAAAAgAAAAQAAAAIi3hbNbqgd+a+pHr/xayD/+3Vr//85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr//FrIP/vqR6/7qgd+aJdVg0AAAACAAAAAQAAAACAAAAAQAAAAEAAAACAAAABIl8WSW8oXjlvqR6/8yyiv/54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//ngvP/Msor/vqR6/7yheOWJfFklAAAABAAAAAIAAAABAAAAAAAAAAFfXz8Iu6F4zL6kev/Msor/+uK+//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//rivv/Msor/vqR6/7uheMxfXz8IAAAAAQAAAAAAAAAAAAAAAbqid4K+pHr/xayD//ngvP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//fgvP/FrIP/vqR6/7qid4IAAAABAAAAAAAAAAC3l28gvaN5+L6kev7t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+/Twv/Qq8f/u5HK/7OGzP+zhsz/u5HK/9Crx//v08L//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr/++pHr+vaN5+LeXbyAAAAAAAAAAALuheJa+pHr/1LuS//zlwP/85cD//OXA//zlwP/85cD//OXA//riwP/Pq8f/r4HM/6+Bzf+vgc3/r4HN/6+Bzf+vgc3/r4HN/6+BzP/Pq8f/+uLA//zlwP/85cD//OXA//zlwP/85cD//OXA/9S5kv++pHr/u6F4lgAAAACii3MLvKF4876kev/y2rX//OXA//zlwP/85cD//OXA//zlwP/64sD/w5vJ/6+Bzf+vg83/w5vc/9W06v/dwPD/3cDw/9W06v/Dm9z/r4PN/6+Bzf/Dm8n/+uLA//zlwP/85cD//OXA//zlwP/85cD/8tq1/76kev+8oXjzootzC72feFW+pHr/y7GJ//zlwP/85cD//OXA//zlwP/85cD//OXA/8+rx/+vgc3/tIfQ/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/tIfQ/6+Bzf/Pq8f//OXA//zlwP/85cD//OXA//zlwP/85cD/y7GJ/76kev+9n3hVvaF4mL6kev/fxZ7//OXA//zlwP/85cD//OXA//zlwP/v08L/r4HM/6+Dzf/Wtev/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/r4PN/6+BzP/v08L//OXA//zlwP/85cD//OXA//zlwP/fxZ7/vqR6/72heJi8oXfIvqR6/+zUrv/85cD//OXA//zlwP/85cD//OXA/9Crx/+vgc3/w5vc/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Dm9z/r4HN/9Crx//85cD//OXA//zlwP/85cD//OXA/+zUrv++pHr/vKF3yL2jeOq+pHr/9t25//zlwP/85cD//OXA//zlwP/85cD/u5HK/6+Bzf/VtOr/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9W06v+vgc3/u5HK//zlwP/85cD//OXA//zlwP/85cD/9t25/76kev+9o3jqvaF4+b6kev/64r7//OXA//zlwP/85cD//OXA//zlwP+zhsz/r4HN/93A8P/hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/3cDw/6+Bzf+zhsz//OXA//zlwP/85cD//OXA//zlwP/64r7/vqR6/72hePm9oXj5vqR6//rivv/85cD//OXA//zlwP/85cD//OXA/7OGzP+vgc3/3cDw/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//dwPD/r4HN/7OGzP/85cD//OXA//zlwP/85cD//OXA//rivv++pHr/vaF4+b2jeOq+pHr/9t25//zlwP/85cD//OXA//zlwP/85cD/u5HK/6+Bzf/VtOr/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9W06v+vgc3/u5HK//zlwP/85cD//OXA//zlwP/85cD/9t25/76kev+9o3jqvKF3yL6kev/s1K7//OXA//zlwP/85cD//OXA//zlwP/Qq8f/r4HN/8Ob3P/hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/w5vc/6+Bzf/Qq8f//OXA//zlwP/85cD//OXA//zlwP/s1K7/vqR6/7yhd8i9oXiYvqR6/9/Fnv/85cD//OXA//zlwP/85cD//OXA/+/Twv+vgcz/r4PN/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9a16/+vg83/r4HM/+/Twv/85cD//OXA//zlwP/85cD//OXA/9/Fnv++pHr/vaF4mL2feFW+pHr/y7GJ//zlwP/85cD//OXA//zlwP/85cD//OXA/8+rx/+vgc3/tIfQ/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/tIfQ/6+Bzf/Pq8f//OXA//zlwP/85cD//OXA//zlwP/85cD/y7GJ/76kev+9n3hVootzC7yhePO+pHr/8tq1//zlwP/85cD//OXA//zlwP/85cD/+uLA/8Obyf+vgc3/r4PN/8Ob3P/VtOr/3cDw/93A8P/VtOr/w5vc/6+Dzf+vgc3/w5vJ//riwP/85cD//OXA//zlwP/85cD//OXA//Latf++pHr/vKF486KLcwsAAAAAu6N3l76kev/Uu5L//OXA//zlwP/85cD//OXA//zlwP/85cD/+uLA/8+rx/+vgcz/r4HN/6+Bzf+vgc3/r4HN/6+Bzf+vgc3/r4HM/8+rx//64sD//OXA//zlwP/85cD//OXA//zlwP/85cD/1LmS/76kev+7oXiWAAAAAAAAAAC3l28gvaN5+L6kev7t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+/Twv/Qq8f/u5HK/7OGzP+zhsz/u5HK/9Crx//v08L//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr/++pHr+vaN5+LeXbyAAAAAAAAAAAAAAAAC6oneCvqR6/8Wsg//54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/34Lz/xayD/76kev+6oneCAAAAAAAAAAAAAAAAAAAAAH9/VQa8oHjLvqR6/8yyiv/64r7//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD/+uK+/8yyiv++pHr/vKB4y39/VQYAAAAAAAAAAAAAAAAAAAAAAAAAALKhbh67o3nkvqR6/8yyiv/54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//ngvP/Msor/vqR6/7ujeeSyoW4eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALqbdim7o3nkvqR6/8Wsg//t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/t1a//xayD/76kev+7o3nkupt2KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKhbh68oHjLvqR6/76kev7Uu5L/8tq1//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/y2rX/1LmS/76kev6+pHr/vKB4y7Khbh4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/VQa6oneCvaN5+L6kev++pHr/y7GJ/9/Fnv/s1K7/9t25//rivv/64r7/9t25/+zUrv/fxZ7/y7GJ/76kev++pHr/vaN5+Lqid4J/f1UGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3l28gu6F4lryhePO+pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vKF487uheJa3l28gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAootzC72feFW9oXiYvKF3yL2jeOq9oXj5vaF4+b2jeOq8oXfIvaF4mL2feFWii3MLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gB///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAA8AAAAPgAAAH8AAAD/gAAB/8AAA//gAAf/+AAf//4Af/
/***
|''Name''|BinaryUploadPlugin|
|''Version''|0.3.16|
|''Author''|Ben Gillies and Jon Robson|
|''Type''|plugin|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/BinaryUploadPlugin.js|
|''Description''|Upload a binary file to TiddlyWeb|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig TiddlyWebConfig|
!Usage
{{{
<<binaryUpload bag:<name> edit:tags edit:title tags:<default tags> title:<title> >>
}}}
* {{{bag:<name>}}}: optional; if left out, the file will be saved to the current workspace
* {{{edit:tags}}}: specifies that you want to tag the file being uploaded
* {{{edit:title}}}: specifies that you want to set the title to something other than the filename
* {{{tags:<default tags>}}}: specifies a default set of tags to apply to the file (requires {{{edit:tags}}} to be set)
* {{{title:<title>}}}: predefines the title of the binary tiddler
!Requires
TiddlyWeb
tiddlywebplugins.form
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;

var macro = config.macros.binaryUpload = {
	locale: {
		titleDefaultValue: "Please enter a title...",
		tagsDefaultValue: "Please enter some tags...",
		titlePrefix: "title: ",
		tagsPrefix: "tags: ",
		loadSuccess: 'Tiddler %0 successfully uploaded',
		loadError: "An error occurred when uploading the tiddler %0",
		uploadInProgress: "Please wait while the file is uploaded...",
		membersOnly: "Only members can upload."
	},
	renderInputFields: function(container, options) {
		var locale = macro.locale;
		var editableFields = options.edit;
		var includeFields = {
			tags:  editableFields && editableFields.contains("tags") ? true : false,
			title: editableFields && editableFields.contains("title") ? true : false
		};
		var fields = ["title", "tags"];
		for(var i = 0; i < fields.length; i++) {
			var fieldName = fields[i];
			var userDefault = options[fieldName];
			var defaultValue = userDefault ? userDefault[0] : false;
			if(includeFields[fieldName] || defaultValue) {
				var localeDefault = locale["%0DefaultValue".format(fieldName)];
				var className = defaultValue ? "userInput" : "userInput notEdited";
				var inputEl;
				var val = defaultValue || localeDefault || "";
				var iContainer = $("<div />").addClass("binaryUpload%0".format(fieldName)).
					appendTo(container);
				if(defaultValue && !includeFields[fieldName]) {
					var label = locale["%0Prefix".format(fieldName)];
					$("<span />").text(label).appendTo(iContainer);
					$("<span />").addClass("disabledInput").text(val).appendTo(iContainer);
					inputEl = $("<input />").attr("type", "hidden");
				} else {
					inputEl = $("<input />").attr("type", "text");
				}
				inputEl.attr("name", fieldName).
					addClass("%0Edit".format(fieldName)).
					val(val).addClass(className).appendTo(iContainer);
			}
		}
	},
	getTiddlerName: function(fileName) {
		var fStart = fileName.lastIndexOf("\\");
		var fStart2 = fileName.lastIndexOf("/");
		fStart = fStart < fStart2 ? fStart2 : fStart;
		fileName = fileName.substr(fStart+1);
		return fileName;
	},
	errorHandler: function(fileName) {
		displayMessage("upload of file %0 failed".format(fileName));
	},
	uploadFile: function(place, baseURL, workspace, options) {
		var pleaseWait = $(".uploadProgress", place);
		var iframeName = options.target;
		var form = $("form", place);
		var existingVal = $("input[name=title]", form).val();
		var fileName = existingVal || $('input:file', form).val();
		if(!fileName) {
			return false; // the user hasn't selected a file yet
		}
		fileName = macro.getTiddlerName(fileName);
		$("input[name=title]", place).val(fileName);
		// we need to go somewhere afterwards to ensure the onload event triggers
		var redirectTo = "/%0/tiddlers.txt?select=title:%1".
			format(workspace, fileName);
		var token = tiddlyspace ? tiddlyspace.getCSRFToken() : "";
		var action = "%0?csrf_token=%1&redirect=%2"
			.format(baseURL, token, redirectTo);
		form[0].action = action; // dont use jquery to work with ie
		form[0].target = iframeName;
		// do not refactor following line... won't work in IE6 otherwise
		$(place).append($('<iframe name="' + iframeName + '" id="' + iframeName + '"/>').css('display','none'));
		macro.iFrameLoader(iframeName, function() {
			var content = document.getElementById(iframeName).contentWindow.document.documentElement;
			if($(content).text().indexOf(fileName) > -1) {
				options.callback(place, fileName, workspace, baseURL);
			} else {
				macro.errorHandler(fileName);
			}
			form.show(1000);
			pleaseWait.hide(1000);
		});
		form.hide(1000);
		pleaseWait.show(1000);
		return true;
	},
	createUploadForm: function(place, options) {
		var locale = macro.locale;
		if(readOnly) {
			$('<div class="annotation" />').text(locale.membersOnly).
				appendTo(place);
			return;
		}
		var bag = options.bag;
		options.callback = options.callback ? options.callback :
			function(place, fileName, workspace, baseurl) {
				macro.displayFile(place, fileName, workspace);
				displayMessage(locale.loadSuccess.format(fileName));
				$("input[type=text]", place).val("");
			};
		var defaults = config.defaultCustomFields;
		place = $("<div />").addClass("container").appendTo(place)[0];
		var workspace = bag ? "bags/%0".format(bag) : config.defaultCustomFields["server.workspace"];
		var baseURL = defaults["server.host"];
		baseURL += (baseURL[baseURL.length - 1] !== "/") ? "/" : "";
		baseURL = "%0%1/tiddlers".format(baseURL, workspace);
		//create the upload form, complete with invisible iframe
		var iframeName = "binaryUploadiframe%0".format(Math.random());
		// do not refactor following line of code to work in IE6.
		var form = $('<form action="%0" method="POST" enctype="multipart/form-data" />'.
					format(baseURL)).addClass("binaryUploadForm").
			appendTo(place)[0];
		macro.renderInputFields(form, options);
		$(form).
			append('<div class="binaryUploadFile"><input type="file" name="file" /></div>').
			append('<div class="binaryUploadSubmit"><input type="submit" value="Upload" disabled /></div>').
			submit(function(ev) {
				this.target = iframeName;
				options.target = iframeName;
				macro.uploadFile(place, baseURL, workspace, options);
			})
			.find('[type="file"]').bind('change', function() {
				$(form).find('[type="submit"]').prop('disabled', false);
			}).end();
		$('<div />').addClass("uploadProgress").text(locale.uploadInProgress).hide().appendTo(place);
		$("input[name=file]", place).change(function(ev) {
			var target = $(ev.target);
			var fileName = target.val();
			var title = $("input[type=text][name=title]", place);
			if(!title.val()) {
				title.val(fileName);
			}
		});
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		params = paramString.parseParams(null, null, true);
		macro.createUploadForm(place, params[0]);
	},
	iFrameLoader: function(iframeName, callback) {
		var iframe = document.getElementById(iframeName); //jQuery doesn't seem to want to do this!?
		var locale = macro.locale;
		$(".userInput").addClass("notEdited"); // reset editing
		var finishedLoading = function() {
			callback();
		};
		var iFrameLoadHandler = function() {
			finishedLoading.apply();
			return;
		};

		iframe.onload = iFrameLoadHandler;
		//IE
		completeReadyStateChanges = 0;
		iframe.onreadystatechange = function() {
			if (++(completeReadyStateChanges) == 3) {
				iFrameLoadHandler();
			}
		};
	},
	displayFile: function(place, title, workspace) {
		var adaptor = store.getTiddlers()[0].getAdaptor();
		var context = {
			workspace: workspace,
			host: config.defaultCustomFields['server.host']
		};
		adaptor.getTiddler(title, context, null, function(context) {
			if(context.status) {
				store.addTiddler(context.tiddler);
				story.displayTiddler(place, title);
				var image = config.macros.image;
				if(image && image.refreshImage) {
					image.refreshImage("/%0/tiddlers/%1".format(workspace, title));
					image.refreshImage(title);
					image.refreshImage("/%0".format(title));
					image.refreshImage("%0/%1/tiddlers/%2".format(config.extensions.tiddlyweb.host, workspace, title));
				}
			} else {
				displayMessage(macro.locale.loadError.format(title));
			}
		});
	}
};

if(tiddlyspace) {
	config.macros.binaryUploadPublic = {
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			var options = paramString.parseParams(null, null, true)[0];
			var bag = tiddlyspace.getCurrentBag("public");
			options.bag = bag;
			macro.createUploadForm(place, options);
		}
	};
	config.messages.privacySetting = config.options.chkPrivateMode ?
		"private" : "public";
	config.macros.binaryUpload.defaultWorkspace = tiddlyspace.
		getCurrentWorkspace(config.messages.privacySetting);
}

})(jQuery);
//}}}
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8"/>
	<title>TiddlySpace Apps</title>
	<link rel="stylesheet" href="/bags/common/tiddlers/reset.css" />
	<link rel="stylesheet" href="/bags/common/tiddlers/appspage.css" />
	<!--[if lt IE 7 ]>
	<link rel="stylesheet" href="/bags/common/tiddlers/appspageie6.css" />
	<![endif]-->
</head>
<body>
	
	<div id="wrapper">
		<div id="TSbar"></div>
		<div id="main-content">
			<div id="space-details">
				<a href="/_space"><img class="siteicon"></a>
				<div id="title-subtitle">
					<h1 class="spaceaddress">
						<span class="spaceName"></span><span class="hostName"></span>
					</h1>
					<p class="tagline"><span class="subTitle"></span><a class="managespaces" href="/_space">manage space</a></p>
				</div>
			</div>
			<div id="holder">
				<div id="appswitcher-wrapper">
					<div id="appswitcher">
						<h2>Your Apps</h2>
						<ul id="app-list">
							<li class="htmlserialisation">
								<a href="/tiddlers.html?select=tag:!excludeLists;sort=-modified">
									<img src="/bags/common/tiddlers/browse_read_blue.png" alt="Icon for the HTML Serialisation" class="app-img" />
									BROWSE
								</a>
							</li>
							<li class="tiddlywiki">
								<a href="/tiddlers.wiki">
									<img src="/bags/common/tiddlers/tiddlywiki2_blue.png" alt="Icon for TiddlyWiki" class="app-img" />
									TIDDLYWIKI
								</a>
							</li>
						</ul>
						<div id="addapp">
							<button class="inactive">Add More!</button>
						</div>
					</div>
					<div id="app-desc">
						<ul>
							<li class="htmlserialisationdesc"><p>an easy to understand HTML representation of your content.</p></li>
							<li class="tiddlywikidesc"><p>use TiddlyWiki to create, edit and organise your content.</p></li>
						</ul>
					</div>
					<div style="clear: both;"></div>
				</div>
			</div>
		</div>
		<div id="footer"><!-- ie doesn't support footer tag -->
			<div id="footer-content">
				<div class="links">
					<a href="http://blog.tiddlyspace.com">blog</a>
					<a href="http://featured.tiddlyspace.com">featured</a>
					<a href="http://docs.tiddlyspace.com">documentation</a>
					<a href="https://github.com/TiddlySpace/tiddlyspace">source</a>
				</div>
				<p>TiddlySpace 2011, created by <a href="http://osmosoft.com">Osmosoft</a></p>
			</div>
		</div>
	</div>
	
	<script type="text/javascript" src="/bags/common/tiddlers/backstage.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/jquery.js"></script>
	<script type="text/javascript" src="/bags/tiddlyspace/tiddlers/chrjs"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/chrjs-store.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/jquery-json.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/appspage.js"></script>
</body>
</html>
<div class='toolbar' macro='toolbar [[ToolbarCommands::NewSectionToolbar]]'></div>
<div class='editor' macro='edit title'></div>
<div class='editor' macro='edit text'></div>
/***
|''Name''|smmNestedSortable|
|''Description''|Pulls in a list from a store tiddler using the specified adaptor (incorrectly named serializer atm) and generate a nestedSortable list from it. |
|''Authors''|Simon McManus, Jon Robson|
|''Version''|0.1.2|
|''Status''|stable|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Requires''|jQueryUI|

! Usage 

To use this plugin add the following to a tiddler {{{<<smmNestedSortable>>}}}

!Code
***/

//{{{
(function($) {
	var macro = config.macros.smmNestedSortable = {
		autoSavingOff: false,
		serializer:'jsonSerializer',
		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			this.refresh(place,macroName,params,wikifier,paramString,tiddler);
		},
		refresh: function(place,macroName,params,wikifier,paramString,tiddler) {
			docTiddler = window.activeDocument;
			if(store.tiddlerExists(docTiddler)) {
				var spec = jQuery.fn.smmNestedSortable[this.serializer].getSpec(docTiddler);
				if(spec.length == 0){
					this.noSpec(place);
					return false;
				}
				var specView = createTiddlyElement(place, "div", "", "specView");	
				this.renderSpec(specView, spec);
			}else{
				this.noSpec(place);
			}
		},
		renderSpec: function(specView, spec) {
			window.ulCount=0;
			jQuery(specView).empty();
			this._renderSpec(specView, spec, []);	
			jQuery(jQuery(specView).children('ul')).smmNestedSortable({
				placeholder:'placeholder',
				items:"li",
				serializer:function() {
					config.macros.smmNestedSortable.specChanged();
				}
			}); 
		}, 
		_renderSpec: function(specView, spec, label) {
			var ul = createTiddlyElement(specView, "ul", "ul"+(window.ulCount++), "nestedSortable");
			var childCount=1;
			label=label.concat([0]);
			jQuery.each(spec, function() {
				label[label.length-1]++;
				var li = config.macros.smmNestedSortable.renderItem(this, ul, label)
				config.macros.smmNestedSortable._renderSpec(li, this.children, label);
			});
		},
		noSpec: function(place) {
			var ul = createTiddlyElement(place, "ul", null,  "nestedSortable");
			createTiddlyElement(ul, "li", null, "noDocSelected error", config.macros.smmTableOfContent.noDocSelectedText);
			jQuery(ul).smmNestedSortable({
				placeholder:'placeholder',
				items:"li",
				serializer:function() {
					config.macros.smmNestedSortable.specChanged();
				}
			}); 
		
		
		},
		renderItem: function(item, ul, label) {
			return  li = createTiddlyElement(ul, "li", item.title, null, item.title);
		},
		specChanged: function() {
			if(macro.autoSavingOff) {
				return;
			}
			if(this._savingSpec) {
				window.clearTimeout(this._savingSpec);
			}
			var text =  jQuery.fn.smmNestedSortable[this.serializer].buildSpec();
			this._savingSpec = window.setTimeout(function() {
				var fields;
				if(store.tiddlerExists(window.activeDocument)) { 
					var specTiddler = store.getTiddler(window.activeDocument);
					var fields = specTiddler.fields;
				} else { 
					fields = {};
					merge(fields, config.defaultCustomFields); 
				}	 
				var tiddler = store.saveTiddler(window.activeDocument, window.activeDocument, text, null, null, "document", fields, false, null, null); 
				autoSaveChanges(null, [tiddler]);
				refreshAll();
			}, 2000);
		},
		strip: function(s) {
			return s.replace(/ /g,'');
		}
	};
})(jQuery);
//}}}
You can use TiddlyDocs on [[TiddlySpace|http://tiddlyspace.com]] the benefit being you are always up to date with the latest code changes.
Alternatively you can create your own instance of TiddlyDocs on your company intranet or own web server.
/***
|''Name''|TiddlySpaceInitialization|
|''Version''|0.7.3|
|''Description''|Initializes new TiddlySpaces the first time they are created|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/blob/master/src/plugins/TiddlySpaceInit.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig RandomColorPalettePlugin chrjs ImageMacroPlugin|
!TODO
* robust error notification and recovery
!MarkupPreHead
<!--{{{-->
<link href="/bags/%0_public/tiddlers.atom" rel="alternate"
	type="application/atom+xml" title="%0's public feed" />
<link rel="canonical" href="%1/" />
<!--}}}-->
!Code
***/
//{{{
(function($) {

var versionField = "tiddlyspaceinit_version";
var markupPreHead = store.getTiddlerText(tiddler.title + "##MarkupPreHead", "");
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace;
var tweb = config.extensions.tiddlyweb;

var plugin = config.extensions.TiddlySpaceInit = {
	version: "0.6",
	SiteTitle: "%0",
	SiteSubtitle: "a TiddlySpace",
	flagTitle: "%0SetupFlag",
	flagWarning: "Please do not modify this tiddler; it was created " +
		"automatically upon space creation.",

	dispatch: function(ev) {
		var title = plugin.flagTitle.format([currentSpace.name]);
		config.annotations[title] = plugin.flagWarning;
		if(currentSpace.type != "private") {
			return;
		}
		var tiddlers = [];
		var tid = store.getTiddler(title);
		if(tid) {
			curVersion = parseFloat(tid.fields[versionField]);
			reqVersion = parseFloat(plugin.version);
			if(curVersion < reqVersion) {
				plugin.update(curVersion, tid);
				tid.fields[versionField] = plugin.version;
				tid.incChangeCount();
				tid = store.saveTiddler(tid);
				tiddlers.push(tid);
			}
		} else { // first run
			tid = new Tiddler(title);
			tid.tags = ["excludeLists", "excludeSearch", "excludePublisher"];
			tid.fields = $.extend({}, config.defaultCustomFields);
			tid.fields[versionField] = plugin.version;
			tid.text = "@@%0@@".format([plugin.flagWarning]);
			tid = store.saveTiddler(tid);
			tiddlers = tiddlers.concat(plugin.firstRun(), tid);
		}
		autoSaveChanges(null, tiddlers);
	},
	update: function(curVersion, flagTiddler) {
		if(curVersion < 0.2) {
			this.createAvatar();
		}
		if(curVersion < 0.3) {
			flagTiddler.tags.pushUnique("excludePublisher"); // XXX: never persisted
		}
		if(curVersion < 0.5) { // v0.4 was faulty
			this.setupMarkupPreHead();
		}
		if(curVersion < 0.6) {
			this.purgeSystemSettings();
		}
	},
	pubTid: {
		tags: ["excludeLists", "excludeSearch"],
		fields: $.extend({}, config.defaultCustomFields, {
			"server.workspace": tiddlyspace.getCurrentWorkspace("public")
		})
	},
	makeTiddlerIfNot: function(tiddler) {
		if (!store.tiddlerExists(tiddler.title)) {
			$.extend(true, tiddler, plugin.pubTid);
			return [store.saveTiddler(tiddler)];
		} else {
			return [];
		}
	},
	firstRun: function() {
		var tiddlers = [];
		// generate Site*itle
		$.each(["SiteTitle", "SiteSubtitle"], function(i, item) {
			var tid = new Tiddler(item);
			tid.text = plugin[item].format([currentSpace.name]);
			tiddlers.push.apply(tiddlers,
				plugin.makeTiddlerIfNot(tid));
		});
		// generate public ColorPalette
		var tid = new Tiddler("ColorPalette");
		tid.text = config.macros.RandomColorPalette.generatePalette({
			saturation_pale: 0.67, saturation_light: 0.53,
			saturation_mid: 0.43, saturation_dark: 0.06,
			pale: 0.99, light: 0.85, mid: 0.5, dark: 0.31
		},
			false);
		tiddlers.push.apply(tiddlers, plugin.makeTiddlerIfNot(tid));
		this.createAvatar();
		this.setupMarkupPreHead();
		return tiddlers;
	},
	// remove _cookie slices (TiddlyWiki 2.6.2 beta 6 remnants)
	purgeSystemSettings: function() {
		var ss = store.getTiddler("SystemSettings");
		if(ss) {
			var lines = ss.text.split("\n");
			var persistentOptions = $.grep(lines, function(line, i) {
				return line.indexOf("_cookie:") == -1;
			});
			ss.text = persistentOptions.join("\n");
			ss = store.saveTiddler(ss);
			autoSaveChanges(null, [ss]);
		}
	},
	createAvatar: function() {
		var avatar = "SiteIcon";
		var host = tweb.host;
		var notify = function(xhr, error, exc) {
			displayMessage("ERROR: could not create avatar - " + // TODO: i18n
				"%0: %1".format([xhr.statusText, xhr.responseText]));
			// TODO: resolve!?
		};

		var pubBag = tiddlyspace.getCurrentBag("public");
		var tid = new tiddlyweb.Tiddler(avatar);
		tid.bag = new tiddlyweb.Bag(pubBag, host);

		var callback = function(data, status, xhr) {}; // avatar already exists; do nothing
		var errback = function(xhr, error, exc) {
			if(xhr.status != 404) {
				return;
			}
			// copy default avatar
			var _notify = function(tid, status, xhr) {
				displayMessage("created avatar"); // TODO: i18n
				var image = config.macros.image;
				if(image && image.refreshImage) {
					var uri = "/%0/tiddlers/SiteIcon".
						format(tiddlyspace.getCurrentWorkspace("public"));
					image.refreshImage(uri);
					image.refreshImage("SiteIcon");
				}
			};
			var _callback = function(tid, status, xhr) {
				tid.title = avatar;
				tid.bag.name = pubBag;
				delete tid.etag;
				tid.put(_notify, notify); // TODO: add to current session document (via adaptor?)
			};
			tweb.getUserInfo(function(user) {
				var avatarTitle = currentSpace.name == user.name ?
					"defaultUserIcon" : "defaultSiteIcon";
				var tid = new tiddlyweb.Tiddler(avatarTitle);
				tid.bag = new tiddlyweb.Bag("common", host);
				tid.get(_callback, notify);
			});
		};
		tid.get(callback, errback);
	},
	savePublicTiddlerText: function(title, text, pubWorkspace) {
		var tid = new Tiddler(title);
		tid.text = text;
		tid.tags = ["excludeLists"];
		tid.fields = $.extend({}, config.defaultCustomFields);
		tid.fields["server.workspace"] = pubWorkspace;
		tid.fields["server.page.revision"] = "false";
		tid = store.saveTiddler(tid);
		autoSaveChanges(null, [tid]);
	},
	setupMarkupPreHead: function() {
		var pubWorkspace = tiddlyspace.getCurrentWorkspace("public");
		var existing = store.getTiddler("MarkupPreHead");
		if(!existing || existing.fields["server.workspace"] != pubWorkspace) {
			var context = this;
			tweb.getStatus(function(status) {
				var text = markupPreHead.format(currentSpace.name,
					tiddlyspace.getHost(status.server_host, currentSpace.name));
				context.savePublicTiddlerText("MarkupPreHead", text,
					pubWorkspace);
			});
		}
		// also set up DefaultTiddlers
		var title = "DefaultTiddlers";
		existing = store.getTiddler(title) || new Tiddler(title);
		if(existing.fields["server.workspace"] != pubWorkspace) {
			var text = existing.text || store.getShadowTiddlerText(title);
			this.savePublicTiddlerText(title, text, pubWorkspace);
		}
	}
};

$(document).bind("startup", plugin.dispatch);

})(jQuery);
//}}}
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
Pending
InProgress
OnHold
Complete
/***
|''Name:''|TiddlySpaceLinkPlugin|
|''Description:''|Formatter to reference other spaces from wikitext |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceLinkPlugin.js|
|''Version:''|1.4.2|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
This plugin provides wikitext formatters for referencing another [[space|Space]] on the same TiddlySpace server, as in the following examples:
<<<
  {{{@space}}} -- @space 
  {{{~@space}}} -- ~@space 
  {{{Tiddler@space}}} -- Tiddler@space
  {{{[[Tiddler Title]]@space}}} -- [[Tiddler Title]]@space 
  {{{[[Link text|Tiddler Title]]@space}}} -- [[Link text|Tiddler Title]]@space
<<<
Links to tiddlers with a title begining with an "@" remain as tiddlyLinks:
<<<
  {{{[[@tiddler]]}}} -- [[@tiddler]]
<<<
and these may be changed into a space link using {{{@@}}}:
<<<
  {{{[[@@space]]}}} -- [[@@space]]
  {{{[[Link to an another space|@@space]]}}} -- [[Link to another space|@@space]]
  {{{[[@space|@@space]]}}} -- [[@space|@@space]]
<<<
TiddlySpace includes the [[TiddlySpaceLinkPlugin]] which provides WikiText markup for linking to other spaces on the same server. For example @glossary is a link to the {{{glossary}}} space and [[Small Trusted Group]]@glossary a link to an individual tiddler in the @glossary space. Prefixing the link with a tilde escapes the link, for example {{{~@space}}}.
Email addresses, for example joe.bloggs@example.com and mary@had.a.little.lamb.org should be unaffected.
!!Features
The plugin provides external links decorated so that other plugins may be included to add features such as the ability to dynamically pull externally linked tiddlers into the current TiddlyWiki.
Wikitext linking to a space on another server, for example from a tiddler in a space on tiddlyspace.com to a tiddler or a space on example.com, isn't currently supported. 
!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global jQuery config createTiddlyText createExternalLink createTiddlyLink */

function createSpaceLink(place, spaceName, title, alt, isBag) {
	var link, a, currentSpaceName, label;
	try {
		if (spaceName === config.extensions.tiddlyspace.currentSpace.name) {
			title = title || spaceName;
			a = createTiddlyLink(place, title, false);
			jQuery(a).text(alt || title);
			return a;
		}
	} catch (ex1) {
		currentSpaceName = false;
	}

	a = jQuery("<a />").addClass('tiddlySpaceLink externalLink').appendTo(place)[0];
	if(title) {
		jQuery(a).attr('tiddler', title);
	}
	if(isBag) {
		jQuery(a).attr('bag', spaceName);
	} else {
		jQuery(a).attr('tiddlyspace', spaceName);
	}

	config.extensions.tiddlyweb.getStatus(function(status) {
		link = status.server_host.url;
		if (title) {
			label = alt || title;
			link = link + "/" + encodeURIComponent(title);
		} else {
			label = alt || spaceName;
		}
		// assumes a http URI without user:pass@ prefix
		if(!isBag) {
			link = link.replace("http://", "http://" + spaceName.toLowerCase() + ".");
		} else {
			link += "/bags/" + spaceName + "/tiddlers.wiki";
		}
		jQuery(a).attr("href", link).text(label);
	});
	return a;
}

(function ($) {

	config.textPrimitives.spaceName = "[a-zA-Z][a-zA-Z0-9-]*[a-zA-Z0-9]";
	config.textPrimitives.spaceNameStrict = "[a-z][a-z0-9-]*";
	config.textPrimitives.bareTiddlerLetter = config.textPrimitives.anyLetterStrict;

	config.formatters.splice(0, 0, {
		name: "spacenameLink",
		match: config.textPrimitives.unWikiLink + "?" + config.textPrimitives.bareTiddlerLetter + "*@" + config.textPrimitives.spaceName + "\\.?.?",
		lookaheadRegExp: new RegExp(config.textPrimitives.unWikiLink + "?(" + config.textPrimitives.bareTiddlerLetter + "*)@(" + config.textPrimitives.spaceName + ")", "mg"),
		handler: function (w) {
			if (w.matchText.substr(w.matchText.length - 2, 1) === '.' && w.matchText.substr(w.matchText.length - 1, 1).match(/[a-zA-Z]/)) {
				w.outputText(w.output, w.matchStart, w.nextMatch);
				return;
			}
			if (w.matchText.substr(0, 1) === config.textPrimitives.unWikiLink) {
				w.outputText(w.output, w.matchStart + 1, w.nextMatch);
				return;
			}
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				createSpaceLink(w.output, lookaheadMatch[2], lookaheadMatch[1]);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	},
	{
		name: "tiddlySpaceLink",
		match: "\\[\\[[^\\|\\]]*\\|*@@" + config.textPrimitives.spaceName + "\\]",
		lookaheadRegExp: new RegExp("\\[\\[(.*?)(?:\\|@@(.*?))?\\]\\]", "mg"),
		handler: function (w) {
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				var alt = lookaheadMatch[2] ? lookaheadMatch[1] : lookaheadMatch[1].replace(/^@@/, "");
				var space = lookaheadMatch[2] || alt;
				createSpaceLink(w.output, space, "", alt);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	},
	{
		name: "tiddlyLinkSpacenameLink",
		match: "\\[\\[[^\\[]*\\]\\]@",
		lookaheadRegExp: new RegExp("\\[\\[(.*?)(?:\\|(.*?))?\\]\\]@(" + config.textPrimitives.spaceName + ")", "mg"),
		handler: function (w) {
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				var title = lookaheadMatch[2] || lookaheadMatch[1];
				var alt = lookaheadMatch[1] || lookaheadMatch[2];
				createSpaceLink(w.output, lookaheadMatch[3], title, alt);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	});

	// ensure space links don't appear as missing links
	config.textPrimitives.brackettedLink = "\\[\\[([^\\]][^@\\]][^\\]]*)\\]\\](?=[^@])";
	config.textPrimitives.titledBrackettedLink = "\\[\\[([^\\[\\]\\|]+)\\|([^\\[\\]\\|]+)\\]\\](?=[^@])";

	// reevaluate derrived expressions ..
	config.textPrimitives.tiddlerForcedLinkRegExp = new RegExp("(?:" + config.textPrimitives.titledBrackettedLink + ")|(?:" +
		config.textPrimitives.brackettedLink + ")|(?:" +
		config.textPrimitives.urlPattern + ")","mg");
	config.textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ config.textPrimitives.wikiLink + ")|(?:" +
		config.textPrimitives.titledBrackettedLink + ")|(?:" +
		config.textPrimitives.brackettedLink + ")|(?:" +
		config.textPrimitives.urlPattern + ")","mg");

	// treat space links in titledBracketedLink as external links
	var missingTiddlySpaceLink = new RegExp("^@@" + config.textPrimitives.spaceName + "$", "");
	var isExternalLink = config.formatterHelpers.isExternalLink;
	config.formatterHelpers.isExternalLink = function(link) {
		return missingTiddlySpaceLink.test(link) || isExternalLink(link);
	};

}(jQuery));
//}}}
config.macros.TagTable = {
  handler: function(place) {
    var tagsCount = {};
    var tiddlers = store.getTiddlers();
    for(var i=0; i < tiddlers.length; i++){
      var tags = tiddlers[i].tags;
      for(var j=0; j < tags.length; j++){
        var tag = tags[j];
        tagsCount[tag] = tagsCount[tag] ? tagsCount[tag] + 1 : 1;
      }
    }
    var line1 = [];
    var line2 = []; 
    for(var i in tagsCount){
      line1.push(i);
      line2.push(tagsCount[i]);
    }
    var wikiText = "|%0|\n|%1|".format([line1.join("|"),line2.join("|")]);
    wikify(wikiText, place);
  }
}
|~ViewToolbar|closeTiddler  +editTiddler cloneTiddler > fields publishTiddlerRevision pubRev revisions syncing permalink references jump closeOthers|
|~EditToolbar|+saveTiddler -cancelTiddler deleteTiddler|
|~NewSectionToolbar|+saveNewSection -cancelTiddler|
/***
|''Name''|raphaeljs|
!Usage
!Code
***/
/*
 * Raphael 1.4.7 - JavaScript Vector Library
 *
 * Copyright (c) 2010 Dmitry Baranovskiy (http://raphaeljs.com)
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
 */
Raphael=function(){function l(){if(l.is(arguments[0],U)){for(var a=arguments[0],b=Ca[K](l,a.splice(0,3+l.is(a[0],P))),c=b.set(),d=0,f=a[o];d<f;d++){var e=a[d]||{};sb.test(e.type)&&c[F](b[e.type]().attr(e))}return c}return Ca[K](l,arguments)}l.version="1.4.7";var V=/[, ]+/,sb=/^(circle|rect|path|ellipse|text|image)$/,p="prototype",z="hasOwnProperty",C=document,aa=window,Qa={was:Object[p][z].call(aa,"Raphael"),is:aa.Raphael};function H(){}var x="appendChild",K="apply",M="concat",Da="createTouch"in C,
A="",N=" ",D=String,G="split",Ra="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend"[G](N),Ea={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},R="join",o="length",fa=String[p].toLowerCase,v=Math,Y=v.max,ba=v.min,P="number",ga="string",U="array",O="toString",ca="fill",tb=Object[p][O],E=v.pow,F="push",ja=/^(?=[\da-f]$)/,Sa=/^url\(['"]?([^\)]+?)['"]?\)$/i,ub=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+(?:\s*,\s*[\d\.]+)?)\s*\)|rgba?\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%(?:\s*,\s*[\d\.]+%)?)\s*\)|hsb\(\s*([\d\.]+(?:deg|\xb0)?\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|hsb\(\s*([\d\.]+(?:deg|\xb0|%)\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\)|hsl\(\s*([\d\.]+(?:deg|\xb0)?\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|hsl\(\s*([\d\.]+(?:deg|\xb0|%)\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\))\s*$/i,
Q=v.round,W="setAttribute",y=parseFloat,ha=parseInt,Fa=" progid:DXImageTransform.Microsoft",sa=String[p].toUpperCase,ta={blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rotation:0,rx:0,ry:0,scale:"1 1",src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt",
"stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",translation:"0 0",width:0,x:0,y:0},Ga={along:"along",blur:P,"clip-rect":"csv",cx:P,cy:P,fill:"colour","fill-opacity":P,"font-size":P,height:P,opacity:P,path:"path",r:P,rotation:"csv",rx:P,ry:P,scale:"csv",stroke:"colour","stroke-opacity":P,"stroke-width":P,translation:"csv",width:P,x:P,y:P},I="replace";l.type=aa.SVGAngle||C.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure",
"1.1")?"SVG":"VML";if(l.type=="VML"){var da=C.createElement("div");da.innerHTML='<v:shape adj="1"/>';da=da.firstChild;da.style.behavior="url(#default#VML)";if(!(da&&typeof da.adj=="object"))return l.type=null;da=null}l.svg=!(l.vml=l.type=="VML");H[p]=l[p];l._id=0;l._oid=0;l.fn={};l.is=function(a,b){b=fa.call(b);return b=="object"&&a===Object(a)||b=="undefined"&&typeof a==b||b=="null"&&a==null||b=="array"&&Array.isArray&&Array.isArray(a)||fa.call(tb.call(a).slice(8,-1))==b};l.setWindow=function(a){aa=
a;C=aa.document};function ua(a){if(l.vml){var b=/^\s+|\s+$/g;ua=Z(function(d){var f;d=D(d)[I](b,A);try{var e=new aa.ActiveXObject("htmlfile");e.write("<body>");e.close();f=e.body}catch(g){f=aa.createPopup().document.body}e=f.createTextRange();try{f.style.color=d;var h=e.queryCommandValue("ForeColor");h=(h&255)<<16|h&65280|(h&16711680)>>>16;return"#"+("000000"+h[O](16)).slice(-6)}catch(i){return"none"}})}else{var c=C.createElement("i");c.title="Rapha\u00ebl Colour Picker";c.style.display="none";C.body[x](c);
ua=Z(function(d){c.style.color=d;return C.defaultView.getComputedStyle(c,A).getPropertyValue("color")})}return ua(a)}function Ta(){return"hsb("+[this.h,this.s,this.b]+")"}function vb(){return"hsl("+[this.h,this.s,this.l]+")"}function wb(){return this.hex}l.hsb2rgb=function(a,b,c){if(l.is(a,"object")&&"h"in a&&"s"in a&&"b"in a){c=a.b;b=a.s;a=a.h}return l.hsl2rgb(a,b,c/2)};l.hsl2rgb=function(a,b,c){if(l.is(a,"object")&&"h"in a&&"s"in a&&"l"in a){c=a.l;b=a.s;a=a.h}if(a>1||b>1||c>1){a/=255;b/=255;c/=
255}var d={},f=["r","g","b"],e;if(b){b=c<0.5?c*(1+b):c+b-c*b;c=2*c-b;for(var g=0,h=f.length;g<h;g++){e=a+1/3*-(g-1);e<0&&e++;e>1&&e--;d[f[g]]=e*6<1?c+(b-c)*6*e:e*2<1?b:e*3<2?c+(b-c)*(2/3-e)*6:c}}else d={r:c,g:c,b:c};d.r*=255;d.g*=255;d.b*=255;a=(~~d.r)[O](16);f=(~~d.g)[O](16);b=(~~d.b)[O](16);a=a[I](ja,"0");f=f[I](ja,"0");b=b[I](ja,"0");d.hex="#"+a+f+b;d.toString=wb;return d};l.rgb2hsb=function(a,b,c){if(b==null&&l.is(a,"object")&&"r"in a&&"g"in a&&"b"in a){c=a.b;b=a.g;a=a.r}if(b==null&&l.is(a,ga)){var d=
l.getRGB(a);a=d.r;b=d.g;c=d.b}if(a>1||b>1||c>1){a/=255;b/=255;c/=255}var f=Y(a,b,c),e=ba(a,b,c);d=f;if(e==f)return{h:0,s:0,b:f,toString:Ta};else{var g=f-e;e=g/f;a=a==f?(b-c)/g:b==f?2+(c-a)/g:4+(a-b)/g;a/=6;a<0&&a++;a>1&&a--}return{h:a,s:e,b:d,toString:Ta}};l.rgb2hsl=function(a,b,c){if(b==null&&l.is(a,"object")&&"r"in a&&"g"in a&&"b"in a){c=a.b;b=a.g;a=a.r}if(b==null&&l.is(a,ga)){var d=l.getRGB(a);a=d.r;b=d.g;c=d.b}if(a>1||b>1||c>1){a/=255;b/=255;c/=255}var f=Y(a,b,c),e=ba(a,b,c);d=(f+e)/2;if(e==f)a=
{h:0,s:0,l:d};else{var g=f-e;e=d<0.5?g/(f+e):g/(2-f-e);a=a==f?(b-c)/g:b==f?2+(c-a)/g:4+(a-b)/g;a/=6;a<0&&a++;a>1&&a--;a={h:a,s:e,l:d}}a.toString=vb;return a};var xb=/,?([achlmqrstvxz]),?/gi,ka=/\s*,\s*/,yb={hs:1,rg:1};l._path2string=function(){return this.join(",")[I](xb,"$1")};function Z(a,b,c){function d(){var f=Array[p].slice.call(arguments,0),e=f[R]("\u25ba"),g=d.cache=d.cache||{},h=d.count=d.count||[];if(g[z](e))return c?c(g[e]):g[e];h[o]>=1000&&delete g[h.shift()];h[F](e);g[e]=a[K](b,f);return c?
c(g[e]):g[e]}return d}l.getRGB=Z(function(a){if(!a||(a=D(a)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1};if(a=="none")return{r:-1,g:-1,b:-1,hex:"none"};!(yb[z](a.substring(0,2))||a.charAt()=="#")&&(a=ua(a));var b,c,d,f,e;if(a=a.match(ub)){if(a[2]){d=ha(a[2].substring(5),16);c=ha(a[2].substring(3,5),16);b=ha(a[2].substring(1,3),16)}if(a[3]){d=ha((e=a[3].charAt(3))+e,16);c=ha((e=a[3].charAt(2))+e,16);b=ha((e=a[3].charAt(1))+e,16)}if(a[4]){a=a[4][G](ka);b=y(a[0]);c=y(a[1]);d=y(a[2]);f=y(a[3])}if(a[5]){a=
a[5][G](ka);b=y(a[0])*2.55;c=y(a[1])*2.55;d=y(a[2])*2.55;f=y(a[3])}if(a[6]){a=a[6][G](ka);b=y(a[0]);c=y(a[1]);d=y(a[2]);(a[0].slice(-3)=="deg"||a[0].slice(-1)=="\u00b0")&&(b/=360);return l.hsb2rgb(b,c,d)}if(a[7]){a=a[7][G](ka);b=y(a[0])*2.55;c=y(a[1])*2.55;d=y(a[2])*2.55;(a[0].slice(-3)=="deg"||a[0].slice(-1)=="\u00b0")&&(b/=360*2.55);return l.hsb2rgb(b,c,d)}if(a[8]){a=a[8][G](ka);b=y(a[0]);c=y(a[1]);d=y(a[2]);(a[0].slice(-3)=="deg"||a[0].slice(-1)=="\u00b0")&&(b/=360);return l.hsl2rgb(b,c,d)}if(a[9]){a=
a[9][G](ka);b=y(a[0])*2.55;c=y(a[1])*2.55;d=y(a[2])*2.55;(a[0].slice(-3)=="deg"||a[0].slice(-1)=="\u00b0")&&(b/=360*2.55);return l.hsl2rgb(b,c,d)}a={r:b,g:c,b:d};b=(~~b)[O](16);c=(~~c)[O](16);d=(~~d)[O](16);b=b[I](ja,"0");c=c[I](ja,"0");d=d[I](ja,"0");a.hex="#"+b+c+d;isFinite(y(f))&&(a.o=f);return a}return{r:-1,g:-1,b:-1,hex:"none",error:1}},l);l.getColor=function(a){a=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||0.75};var b=this.hsb2rgb(a.h,a.s,a.b);a.h+=0.075;if(a.h>1){a.h=0;a.s-=0.2;
a.s<=0&&(this.getColor.start={h:0,s:1,b:a.b})}return b.hex};l.getColor.reset=function(){delete this.start};var zb=/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,Ab=/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig;l.parsePathString=Z(function(a){if(!a)return null;var b={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},c=[];if(l.is(a,U)&&l.is(a[0],U))c=va(a);c[o]||D(a)[I](zb,function(d,f,e){var g=[];d=fa.call(f);e[I](Ab,function(h,i){i&&g[F](+i)});if(d=="m"&&g[o]>2){c[F]([f][M](g.splice(0,2)));d="l";
f=f=="m"?"l":"L"}for(;g[o]>=b[d];){c[F]([f][M](g.splice(0,b[d])));if(!b[d])break}});c[O]=l._path2string;return c});l.findDotsAtSegment=function(a,b,c,d,f,e,g,h,i){var j=1-i,m=E(j,3)*a+E(j,2)*3*i*c+j*3*i*i*f+E(i,3)*g;j=E(j,3)*b+E(j,2)*3*i*d+j*3*i*i*e+E(i,3)*h;var n=a+2*i*(c-a)+i*i*(f-2*c+a),r=b+2*i*(d-b)+i*i*(e-2*d+b),q=c+2*i*(f-c)+i*i*(g-2*f+c),k=d+2*i*(e-d)+i*i*(h-2*e+d);a=(1-i)*a+i*c;b=(1-i)*b+i*d;f=(1-i)*f+i*g;e=(1-i)*e+i*h;h=90-v.atan((n-q)/(r-k))*180/v.PI;(n>q||r<k)&&(h+=180);return{x:m,y:j,
m:{x:n,y:r},n:{x:q,y:k},start:{x:a,y:b},end:{x:f,y:e},alpha:h}};var xa=Z(function(a){if(!a)return{x:0,y:0,width:0,height:0};a=wa(a);for(var b=0,c=0,d=[],f=[],e,g=0,h=a[o];g<h;g++){e=a[g];if(e[0]=="M"){b=e[1];c=e[2];d[F](b);f[F](c)}else{b=Bb(b,c,e[1],e[2],e[3],e[4],e[5],e[6]);d=d[M](b.min.x,b.max.x);f=f[M](b.min.y,b.max.y);b=e[5];c=e[6]}}a=ba[K](0,d);e=ba[K](0,f);return{x:a,y:e,width:Y[K](0,d)-a,height:Y[K](0,f)-e}});function va(a){var b=[];if(!l.is(a,U)||!l.is(a&&a[0],U))a=l.parsePathString(a);for(var c=
0,d=a[o];c<d;c++){b[c]=[];for(var f=0,e=a[c][o];f<e;f++)b[c][f]=a[c][f]}b[O]=l._path2string;return b}var Ha=Z(function(a){if(!l.is(a,U)||!l.is(a&&a[0],U))a=l.parsePathString(a);var b=[],c=0,d=0,f=0,e=0,g=0;if(a[0][0]=="M"){c=a[0][1];d=a[0][2];f=c;e=d;g++;b[F](["M",c,d])}g=g;for(var h=a[o];g<h;g++){var i=b[g]=[],j=a[g];if(j[0]!=fa.call(j[0])){i[0]=fa.call(j[0]);switch(i[0]){case "a":i[1]=j[1];i[2]=j[2];i[3]=j[3];i[4]=j[4];i[5]=j[5];i[6]=+(j[6]-c).toFixed(3);i[7]=+(j[7]-d).toFixed(3);break;case "v":i[1]=
+(j[1]-d).toFixed(3);break;case "m":f=j[1];e=j[2];default:for(var m=1,n=j[o];m<n;m++)i[m]=+(j[m]-(m%2?c:d)).toFixed(3)}}else{b[g]=[];if(j[0]=="m"){f=j[1]+c;e=j[2]+d}i=0;for(m=j[o];i<m;i++)b[g][i]=j[i]}j=b[g][o];switch(b[g][0]){case "z":c=f;d=e;break;case "h":c+=+b[g][j-1];break;case "v":d+=+b[g][j-1];break;default:c+=+b[g][j-2];d+=+b[g][j-1]}}b[O]=l._path2string;return b},0,va),oa=Z(function(a){if(!l.is(a,U)||!l.is(a&&a[0],U))a=l.parsePathString(a);var b=[],c=0,d=0,f=0,e=0,g=0;if(a[0][0]=="M"){c=
+a[0][1];d=+a[0][2];f=c;e=d;g++;b[0]=["M",c,d]}g=g;for(var h=a[o];g<h;g++){var i=b[g]=[],j=a[g];if(j[0]!=sa.call(j[0])){i[0]=sa.call(j[0]);switch(i[0]){case "A":i[1]=j[1];i[2]=j[2];i[3]=j[3];i[4]=j[4];i[5]=j[5];i[6]=+(j[6]+c);i[7]=+(j[7]+d);break;case "V":i[1]=+j[1]+d;break;case "H":i[1]=+j[1]+c;break;case "M":f=+j[1]+c;e=+j[2]+d;default:for(var m=1,n=j[o];m<n;m++)i[m]=+j[m]+(m%2?c:d)}}else{m=0;for(n=j[o];m<n;m++)b[g][m]=j[m]}switch(i[0]){case "Z":c=f;d=e;break;case "H":c=i[1];break;case "V":d=i[1];
break;case "M":f=b[g][b[g][o]-2];e=b[g][b[g][o]-1];default:c=b[g][b[g][o]-2];d=b[g][b[g][o]-1]}}b[O]=l._path2string;return b},null,va);function ya(a,b,c,d){return[a,b,c,d,c,d]}function Ua(a,b,c,d,f,e){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*f+h*c,g*e+h*d,f,e]}function Va(a,b,c,d,f,e,g,h,i,j){var m=v.PI,n=m*120/180,r=m/180*(+f||0),q=[],k,t=Z(function(J,ia,za){var Cb=J*v.cos(za)-ia*v.sin(za);J=J*v.sin(za)+ia*v.cos(za);return{x:Cb,y:J}});if(j){w=j[0];k=j[1];e=j[2];B=j[3]}else{k=t(a,b,-r);a=k.x;b=k.y;
k=t(h,i,-r);h=k.x;i=k.y;v.cos(m/180*f);v.sin(m/180*f);k=(a-h)/2;w=(b-i)/2;B=k*k/(c*c)+w*w/(d*d);if(B>1){B=v.sqrt(B);c=B*c;d=B*d}B=c*c;var L=d*d;B=(e==g?-1:1)*v.sqrt(v.abs((B*L-B*w*w-L*k*k)/(B*w*w+L*k*k)));e=B*c*w/d+(a+h)/2;var B=B*-d*k/c+(b+i)/2,w=v.asin(((b-B)/d).toFixed(7));k=v.asin(((i-B)/d).toFixed(7));w=a<e?m-w:w;k=h<e?m-k:k;w<0&&(w=m*2+w);k<0&&(k=m*2+k);if(g&&w>k)w-=m*2;if(!g&&k>w)k-=m*2}m=k-w;if(v.abs(m)>n){q=k;m=h;L=i;k=w+n*(g&&k>w?1:-1);h=e+c*v.cos(k);i=B+d*v.sin(k);q=Va(h,i,c,d,f,0,g,m,
L,[k,q,e,B])}m=k-w;f=v.cos(w);e=v.sin(w);g=v.cos(k);k=v.sin(k);m=v.tan(m/4);c=4/3*c*m;m=4/3*d*m;d=[a,b];a=[a+c*e,b-m*f];b=[h+c*k,i-m*g];h=[h,i];a[0]=2*d[0]-a[0];a[1]=2*d[1]-a[1];if(j)return[a,b,h][M](q);else{q=[a,b,h][M](q)[R]()[G](",");j=[];h=0;for(i=q[o];h<i;h++)j[h]=h%2?t(q[h-1],q[h],r).y:t(q[h],q[h+1],r).x;return j}}function la(a,b,c,d,f,e,g,h,i){var j=1-i;return{x:E(j,3)*a+E(j,2)*3*i*c+j*3*i*i*f+E(i,3)*g,y:E(j,3)*b+E(j,2)*3*i*d+j*3*i*i*e+E(i,3)*h}}var Bb=Z(function(a,b,c,d,f,e,g,h){var i=f-2*
c+a-(g-2*f+c),j=2*(c-a)-2*(f-c),m=a-c,n=(-j+v.sqrt(j*j-4*i*m))/2/i;i=(-j-v.sqrt(j*j-4*i*m))/2/i;var r=[b,h],q=[a,g];v.abs(n)>1000000000000&&(n=0.5);v.abs(i)>1000000000000&&(i=0.5);if(n>0&&n<1){n=la(a,b,c,d,f,e,g,h,n);q[F](n.x);r[F](n.y)}if(i>0&&i<1){n=la(a,b,c,d,f,e,g,h,i);q[F](n.x);r[F](n.y)}i=e-2*d+b-(h-2*e+d);j=2*(d-b)-2*(e-d);m=b-d;n=(-j+v.sqrt(j*j-4*i*m))/2/i;i=(-j-v.sqrt(j*j-4*i*m))/2/i;v.abs(n)>1000000000000&&(n=0.5);v.abs(i)>1000000000000&&(i=0.5);if(n>0&&n<1){n=la(a,b,c,d,f,e,g,h,n);q[F](n.x);
r[F](n.y)}if(i>0&&i<1){n=la(a,b,c,d,f,e,g,h,i);q[F](n.x);r[F](n.y)}return{min:{x:ba[K](0,q),y:ba[K](0,r)},max:{x:Y[K](0,q),y:Y[K](0,r)}}}),wa=Z(function(a,b){var c=oa(a),d=b&&oa(b);a={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null};b={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null};function f(q,k){var t;if(!q)return["C",k.x,k.y,k.x,k.y,k.x,k.y];!(q[0]in{T:1,Q:1})&&(k.qx=k.qy=null);switch(q[0]){case "M":k.X=q[1];k.Y=q[2];break;case "A":q=["C"][M](Va[K](0,[k.x,k.y][M](q.slice(1))));break;case "S":t=k.x+(k.x-
(k.bx||k.x));k=k.y+(k.y-(k.by||k.y));q=["C",t,k][M](q.slice(1));break;case "T":k.qx=k.x+(k.x-(k.qx||k.x));k.qy=k.y+(k.y-(k.qy||k.y));q=["C"][M](Ua(k.x,k.y,k.qx,k.qy,q[1],q[2]));break;case "Q":k.qx=q[1];k.qy=q[2];q=["C"][M](Ua(k.x,k.y,q[1],q[2],q[3],q[4]));break;case "L":q=["C"][M](ya(k.x,k.y,q[1],q[2]));break;case "H":q=["C"][M](ya(k.x,k.y,q[1],k.y));break;case "V":q=["C"][M](ya(k.x,k.y,k.x,q[1]));break;case "Z":q=["C"][M](ya(k.x,k.y,k.X,k.Y));break}return q}function e(q,k){if(q[k][o]>7){q[k].shift();
for(var t=q[k];t[o];)q.splice(k++,0,["C"][M](t.splice(0,6)));q.splice(k,1);i=Y(c[o],d&&d[o]||0)}}function g(q,k,t,L,B){if(q&&k&&q[B][0]=="M"&&k[B][0]!="M"){k.splice(B,0,["M",L.x,L.y]);t.bx=0;t.by=0;t.x=q[B][1];t.y=q[B][2];i=Y(c[o],d&&d[o]||0)}}for(var h=0,i=Y(c[o],d&&d[o]||0);h<i;h++){c[h]=f(c[h],a);e(c,h);d&&(d[h]=f(d[h],b));d&&e(d,h);g(c,d,a,b,h);g(d,c,b,a,h);var j=c[h],m=d&&d[h],n=j[o],r=d&&m[o];a.x=j[n-2];a.y=j[n-1];a.bx=y(j[n-4])||a.x;a.by=y(j[n-3])||a.y;b.bx=d&&(y(m[r-4])||b.x);b.by=d&&(y(m[r-
3])||b.y);b.x=d&&m[r-2];b.y=d&&m[r-1]}return d?[c,d]:c},null,va),Wa=Z(function(a){for(var b=[],c=0,d=a[o];c<d;c++){var f={},e=a[c].match(/^([^:]*):?([\d\.]*)/);f.color=l.getRGB(e[1]);if(f.color.error)return null;f.color=f.color.hex;e[2]&&(f.offset=e[2]+"%");b[F](f)}c=1;for(d=b[o]-1;c<d;c++)if(!b[c].offset){a=y(b[c-1].offset||0);e=0;for(f=c+1;f<d;f++)if(b[f].offset){e=b[f].offset;break}if(!e){e=100;f=d}e=y(e);for(e=(e-a)/(f-c+1);c<f;c++){a+=e;b[c].offset=a+"%"}}return b});function Xa(a,b,c,d){if(l.is(a,
ga)||l.is(a,"object")){a=l.is(a,ga)?C.getElementById(a):a;if(a.tagName)return b==null?{container:a,width:a.style.pixelWidth||a.offsetWidth,height:a.style.pixelHeight||a.offsetHeight}:{container:a,width:b,height:c}}else return{container:1,x:a,y:b,width:c,height:d}}function Ia(a,b){var c=this;for(var d in b)if(b[z](d)&&!(d in a))switch(typeof b[d]){case "function":(function(f){a[d]=a===c?f:function(){return f[K](c,arguments)}})(b[d]);break;case "object":a[d]=a[d]||{};Ia.call(this,a[d],b[d]);break;default:a[d]=
b[d];break}}function ma(a,b){a==b.top&&(b.top=a.prev);a==b.bottom&&(b.bottom=a.next);a.next&&(a.next.prev=a.prev);a.prev&&(a.prev.next=a.next)}function Ya(a,b){if(b.top!==a){ma(a,b);a.next=null;a.prev=b.top;b.top.next=a;b.top=a}}function Za(a,b){if(b.bottom!==a){ma(a,b);a.next=b.bottom;a.prev=null;b.bottom.prev=a;b.bottom=a}}function $a(a,b,c){ma(a,c);b==c.top&&(c.top=a);b.next&&(b.next.prev=a);a.next=b.next;a.prev=b;b.next=a}function ab(a,b,c){ma(a,c);b==c.bottom&&(c.bottom=a);b.prev&&(b.prev.next=
a);a.prev=b.prev;b.prev=a;a.next=b}function bb(a){return function(){throw new Error("Rapha\u00ebl: you are calling to method \u201c"+a+"\u201d of removed object");}}var cb=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/;l.pathToRelative=Ha;if(l.svg){H[p].svgns="http://www.w3.org/2000/svg";H[p].xlink="http://www.w3.org/1999/xlink";Q=function(a){return+a+(~~a===a)*0.5};var u=function(a,b){if(b)for(var c in b)b[z](c)&&a[W](c,D(b[c]));else{a=C.createElementNS(H[p].svgns,a);a.style.webkitTapHighlightColor="rgba(0,0,0,0)";
return a}};l[O]=function(){return"Your browser supports SVG.\nYou are running Rapha\u00ebl "+this.version};var db=function(a,b){var c=u("path");b.canvas&&b.canvas[x](c);b=new s(c,b);b.type="path";ea(b,{fill:"none",stroke:"#000",path:a});return b},pa=function(a,b,c){var d="linear",f=0.5,e=0.5,g=a.style;b=D(b)[I](cb,function(m,n,r){d="radial";if(n&&r){f=y(n);e=y(r);m=(e>0.5)*2-1;E(f-0.5,2)+E(e-0.5,2)>0.25&&(e=v.sqrt(0.25-E(f-0.5,2))*m+0.5)&&e!=0.5&&(e=e.toFixed(5)-1.0E-5*m)}return A});b=b[G](/\s*\-\s*/);
if(d=="linear"){var h=b.shift();h=-y(h);if(isNaN(h))return null;h=[0,0,v.cos(h*v.PI/180),v.sin(h*v.PI/180)];var i=1/(Y(v.abs(h[2]),v.abs(h[3]))||1);h[2]*=i;h[3]*=i;if(h[2]<0){h[0]=-h[2];h[2]=0}if(h[3]<0){h[1]=-h[3];h[3]=0}}b=Wa(b);if(!b)return null;i=a.getAttribute(ca);(i=i.match(/^url\(#(.*)\)$/))&&c.defs.removeChild(C.getElementById(i[1]));i=u(d+"Gradient");i.id="r"+(l._id++)[O](36);u(i,d=="radial"?{fx:f,fy:e}:{x1:h[0],y1:h[1],x2:h[2],y2:h[3]});c.defs[x](i);c=0;for(h=b[o];c<h;c++){var j=u("stop");
u(j,{offset:b[c].offset?b[c].offset:!c?"0%":"100%","stop-color":b[c].color||"#fff"});i[x](j)}u(a,{fill:"url(#"+i.id+")",opacity:1,"fill-opacity":1});g.fill=A;g.opacity=1;return g.fillOpacity=1},Ja=function(a){var b=a.getBBox();u(a.pattern,{patternTransform:l.format("translate({0},{1})",b.x,b.y)})},ea=function(a,b){var c={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},d=a.node,f=a.attrs,e=
a.rotate();function g(k,t){if(t=c[fa.call(t)]){var L=k.attrs["stroke-width"]||"1";k={round:L,square:L,butt:0}[k.attrs["stroke-linecap"]||b["stroke-linecap"]]||0;for(var B=[],w=t[o];w--;)B[w]=t[w]*L+(w%2?1:-1)*k;u(d,{"stroke-dasharray":B[R](",")})}}b[z]("rotation")&&(e=b.rotation);var h=D(e)[G](V);if(h.length-1){h[1]=+h[1];h[2]=+h[2]}else h=null;y(e)&&a.rotate(0,true);for(var i in b)if(b[z](i))if(ta[z](i)){var j=b[i];f[i]=j;switch(i){case "blur":a.blur(j);break;case "rotation":a.rotate(j,true);break;
case "href":case "title":case "target":var m=d.parentNode;if(fa.call(m.tagName)!="a"){var n=u("a");m.insertBefore(n,d);n[x](d);m=n}m.setAttributeNS(a.paper.xlink,i,j);break;case "cursor":d.style.cursor=j;break;case "clip-rect":m=D(j)[G](V);if(m[o]==4){a.clip&&a.clip.parentNode.parentNode.removeChild(a.clip.parentNode);var r=u("clipPath");n=u("rect");r.id="r"+(l._id++)[O](36);u(n,{x:m[0],y:m[1],width:m[2],height:m[3]});r[x](n);a.paper.defs[x](r);u(d,{"clip-path":"url(#"+r.id+")"});a.clip=n}if(!j){(j=
C.getElementById(d.getAttribute("clip-path")[I](/(^url\(#|\)$)/g,A)))&&j.parentNode.removeChild(j);u(d,{"clip-path":A});delete a.clip}break;case "path":if(a.type=="path")u(d,{d:j?(f.path=oa(j)):"M0,0"});break;case "width":d[W](i,j);if(f.fx){i="x";j=f.x}else break;case "x":if(f.fx)j=-f.x-(f.width||0);case "rx":if(i=="rx"&&a.type=="rect")break;case "cx":h&&(i=="x"||i=="cx")&&(h[1]+=j-f[i]);d[W](i,j);a.pattern&&Ja(a);break;case "height":d[W](i,j);if(f.fy){i="y";j=f.y}else break;case "y":if(f.fy)j=-f.y-
(f.height||0);case "ry":if(i=="ry"&&a.type=="rect")break;case "cy":h&&(i=="y"||i=="cy")&&(h[2]+=j-f[i]);d[W](i,j);a.pattern&&Ja(a);break;case "r":a.type=="rect"?u(d,{rx:j,ry:j}):d[W](i,j);break;case "src":a.type=="image"&&d.setAttributeNS(a.paper.xlink,"href",j);break;case "stroke-width":d.style.strokeWidth=j;d[W](i,j);f["stroke-dasharray"]&&g(a,f["stroke-dasharray"]);break;case "stroke-dasharray":g(a,j);break;case "translation":j=D(j)[G](V);j[0]=+j[0]||0;j[1]=+j[1]||0;if(h){h[1]+=j[0];h[2]+=j[1]}Aa.call(a,
j[0],j[1]);break;case "scale":j=D(j)[G](V);a.scale(+j[0]||1,+j[1]||+j[0]||1,isNaN(y(j[2]))?null:+j[2],isNaN(y(j[3]))?null:+j[3]);break;case ca:if(m=D(j).match(Sa)){r=u("pattern");var q=u("image");r.id="r"+(l._id++)[O](36);u(r,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1});u(q,{x:0,y:0});q.setAttributeNS(a.paper.xlink,"href",m[1]);r[x](q);j=C.createElement("img");j.style.cssText="position:absolute;left:-9999em;top-9999em";j.onload=function(){u(r,{width:this.offsetWidth,height:this.offsetHeight});
u(q,{width:this.offsetWidth,height:this.offsetHeight});C.body.removeChild(this);a.paper.safari()};C.body[x](j);j.src=m[1];a.paper.defs[x](r);d.style.fill="url(#"+r.id+")";u(d,{fill:"url(#"+r.id+")"});a.pattern=r;a.pattern&&Ja(a);break}m=l.getRGB(j);if(m.error){if(({circle:1,ellipse:1}[z](a.type)||D(j).charAt()!="r")&&pa(d,j,a.paper)){f.gradient=j;f.fill="none";break}}else{delete b.gradient;delete f.gradient;!l.is(f.opacity,"undefined")&&l.is(b.opacity,"undefined")&&u(d,{opacity:f.opacity});!l.is(f["fill-opacity"],
"undefined")&&l.is(b["fill-opacity"],"undefined")&&u(d,{"fill-opacity":f["fill-opacity"]})}m[z]("o")&&u(d,{"fill-opacity":m.o>1?m.o/100:m.o});case "stroke":m=l.getRGB(j);d[W](i,m.hex);i=="stroke"&&m[z]("o")&&u(d,{"stroke-opacity":m.o>1?m.o/100:m.o});break;case "gradient":(({circle:1,ellipse:1})[z](a.type)||D(j).charAt()!="r")&&pa(d,j,a.paper);break;case "opacity":case "fill-opacity":if(f.gradient){if(m=C.getElementById(d.getAttribute(ca)[I](/^url\(#|\)$/g,A))){m=m.getElementsByTagName("stop");m[m[o]-
1][W]("stop-opacity",j)}break}default:i=="font-size"&&(j=ha(j,10)+"px");m=i[I](/(\-.)/g,function(k){return sa.call(k.substring(1))});d.style[m]=j;d[W](i,j);break}}Db(a,b);if(h)a.rotate(h.join(N));else y(e)&&a.rotate(e,true)},eb=1.2,Db=function(a,b){if(!(a.type!="text"||!(b[z]("text")||b[z]("font")||b[z]("font-size")||b[z]("x")||b[z]("y")))){var c=a.attrs,d=a.node,f=d.firstChild?ha(C.defaultView.getComputedStyle(d.firstChild,A).getPropertyValue("font-size"),10):10;if(b[z]("text")){for(c.text=b.text;d.firstChild;)d.removeChild(d.firstChild);
b=D(b.text)[G]("\n");for(var e=0,g=b[o];e<g;e++)if(b[e]){var h=u("tspan");e&&u(h,{dy:f*eb,x:c.x});h[x](C.createTextNode(b[e]));d[x](h)}}else{b=d.getElementsByTagName("tspan");e=0;for(g=b[o];e<g;e++)e&&u(b[e],{dy:f*eb,x:c.x})}u(d,{y:c.y});a=a.getBBox();(a=c.y-(a.y+a.height/2))&&isFinite(a)&&u(d,{y:c.y+a})}},s=function(a,b){this[0]=a;this.id=l._oid++;this.node=a;a.raphael=this;this.paper=b;this.attrs=this.attrs||{};this.transformations=[];this._={tx:0,ty:0,rt:{deg:0,cx:0,cy:0},sx:1,sy:1};!b.bottom&&
(b.bottom=this);(this.prev=b.top)&&(b.top.next=this);b.top=this;this.next=null};s[p].rotate=function(a,b,c){if(this.removed)return this;if(a==null){if(this._.rt.cx)return[this._.rt.deg,this._.rt.cx,this._.rt.cy][R](N);return this._.rt.deg}var d=this.getBBox();a=D(a)[G](V);if(a[o]-1){b=y(a[1]);c=y(a[2])}a=y(a[0]);if(b!=null)this._.rt.deg=a;else this._.rt.deg+=a;c==null&&(b=null);this._.rt.cx=b;this._.rt.cy=c;b=b==null?d.x+d.width/2:b;c=c==null?d.y+d.height/2:c;if(this._.rt.deg){this.transformations[0]=
l.format("rotate({0} {1} {2})",this._.rt.deg,b,c);this.clip&&u(this.clip,{transform:l.format("rotate({0} {1} {2})",-this._.rt.deg,b,c)})}else{this.transformations[0]=A;this.clip&&u(this.clip,{transform:A})}u(this.node,{transform:this.transformations[R](N)});return this};s[p].hide=function(){!this.removed&&(this.node.style.display="none");return this};s[p].show=function(){!this.removed&&(this.node.style.display="");return this};s[p].remove=function(){if(!this.removed){ma(this,this.paper);this.node.parentNode.removeChild(this.node);
for(var a in this)delete this[a];this.removed=true}};s[p].getBBox=function(){if(this.removed)return this;if(this.type=="path")return xa(this.attrs.path);if(this.node.style.display=="none"){this.show();var a=true}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}if(this.type=="text"){b={x:b.x,y:Infinity,width:0,height:0};for(var d=0,f=this.node.getNumberOfChars();d<f;d++){var e=this.node.getExtentOfChar(d);e.y<b.y&&(b.y=e.y);e.y+e.height-b.y>b.height&&(b.height=e.y+e.height-b.y);e.x+e.width-
b.x>b.width&&(b.width=e.x+e.width-b.x)}}a&&this.hide();return b};s[p].attr=function(a,b){if(this.removed)return this;if(a==null){a={};for(var c in this.attrs)if(this.attrs[z](c))a[c]=this.attrs[c];this._.rt.deg&&(a.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(a.scale=this.scale());a.gradient&&a.fill=="none"&&(a.fill=a.gradient)&&delete a.gradient;return a}if(b==null&&l.is(a,ga)){if(a=="translation")return Aa.call(this);if(a=="rotation")return this.rotate();if(a=="scale")return this.scale();
if(a==ca&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return this.attrs[a]}if(b==null&&l.is(a,U)){b={};c=0;for(var d=a.length;c<d;c++)b[a[c]]=this.attr(a[c]);return b}if(b!=null){c={};c[a]=b;ea(this,c)}else a!=null&&l.is(a,"object")&&ea(this,a);return this};s[p].toFront=function(){if(this.removed)return this;this.node.parentNode[x](this.node);var a=this.paper;a.top!=this&&Ya(this,a);return this};s[p].toBack=function(){if(this.removed)return this;if(this.node.parentNode.firstChild!=
this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild);Za(this,this.paper)}return this};s[p].insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length].node;b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode[x](this.node);$a(this,a,this.paper);return this};s[p].insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;b.parentNode.insertBefore(this.node,b);ab(this,a,this.paper);return this};s[p].blur=
function(a){var b=this;if(+a!==0){var c=u("filter"),d=u("feGaussianBlur");b.attrs.blur=a;c.id="r"+(l._id++)[O](36);u(d,{stdDeviation:+a||1.5});c.appendChild(d);b.paper.defs.appendChild(c);b._blur=c;u(b.node,{filter:"url(#"+c.id+")"})}else{if(b._blur){b._blur.parentNode.removeChild(b._blur);delete b._blur;delete b.attrs.blur}b.node.removeAttribute("filter")}};var fb=function(a,b,c,d){var f=u("circle");a.canvas&&a.canvas[x](f);a=new s(f,a);a.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"};a.type="circle";
u(f,a.attrs);return a},gb=function(a,b,c,d,f,e){var g=u("rect");a.canvas&&a.canvas[x](g);a=new s(g,a);a.attrs={x:b,y:c,width:d,height:f,r:e||0,rx:e||0,ry:e||0,fill:"none",stroke:"#000"};a.type="rect";u(g,a.attrs);return a},hb=function(a,b,c,d,f){var e=u("ellipse");a.canvas&&a.canvas[x](e);a=new s(e,a);a.attrs={cx:b,cy:c,rx:d,ry:f,fill:"none",stroke:"#000"};a.type="ellipse";u(e,a.attrs);return a},ib=function(a,b,c,d,f,e){var g=u("image");u(g,{x:c,y:d,width:f,height:e,preserveAspectRatio:"none"});g.setAttributeNS(a.xlink,
"href",b);a.canvas&&a.canvas[x](g);a=new s(g,a);a.attrs={x:c,y:d,width:f,height:e,src:b};a.type="image";return a},jb=function(a,b,c,d){var f=u("text");u(f,{x:b,y:c,"text-anchor":"middle"});a.canvas&&a.canvas[x](f);a=new s(f,a);a.attrs={x:b,y:c,"text-anchor":"middle",text:d,font:ta.font,stroke:"none",fill:"#000"};a.type="text";ea(a,a.attrs);return a},kb=function(a,b){this.width=a||this.width;this.height=b||this.height;this.canvas[W]("width",this.width);this.canvas[W]("height",this.height);return this},
Ca=function(){var a=Xa[K](0,arguments),b=a&&a.container,c=a.x,d=a.y,f=a.width;a=a.height;if(!b)throw new Error("SVG container not found.");var e=u("svg");c=c||0;d=d||0;f=f||512;a=a||342;u(e,{xmlns:"http://www.w3.org/2000/svg",version:1.1,width:f,height:a});if(b==1){e.style.cssText="position:absolute;left:"+c+"px;top:"+d+"px";C.body[x](e)}else b.firstChild?b.insertBefore(e,b.firstChild):b[x](e);b=new H;b.width=f;b.height=a;b.canvas=e;Ia.call(b,b,l.fn);b.clear();return b};H[p].clear=function(){for(var a=
this.canvas;a.firstChild;)a.removeChild(a.firstChild);this.bottom=this.top=null;(this.desc=u("desc"))[x](C.createTextNode("Created with Rapha\u00ebl"));a[x](this.desc);a[x](this.defs=u("defs"))};H[p].remove=function(){this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bb(a)}}if(l.vml){var lb={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},Eb=/([clmz]),?([^clmz]*)/gi,Fb=/-?[^,\s-]+/g,qa=1000+N+1000,na=10,ra={path:1,rect:1},Gb=function(a){var b=/[ahqstv]/ig,
c=oa;D(a).match(b)&&(c=wa);b=/[clmz]/g;if(c==oa&&!D(a).match(b))return a=D(a)[I](Eb,function(i,j,m){var n=[],r=fa.call(j)=="m",q=lb[j];m[I](Fb,function(k){if(r&&n[o]==2){q+=n+lb[j=="m"?"l":"L"];n=[]}n[F](Q(k*na))});return q+n});b=c(a);var d;a=[];for(var f=0,e=b[o];f<e;f++){c=b[f];d=fa.call(b[f][0]);d=="z"&&(d="x");for(var g=1,h=c[o];g<h;g++)d+=Q(c[g]*na)+(g!=h-1?",":A);a[F](d)}return a[R](N)};l[O]=function(){return"Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\u00ebl "+
this.version};db=function(a,b){var c=S("group");c.style.cssText="position:absolute;left:0;top:0;width:"+b.width+"px;height:"+b.height+"px";c.coordsize=b.coordsize;c.coordorigin=b.coordorigin;var d=S("shape"),f=d.style;f.width=b.width+"px";f.height=b.height+"px";d.coordsize=qa;d.coordorigin=b.coordorigin;c[x](d);d=new s(d,c,b);f={fill:"none",stroke:"#000"};a&&(f.path=a);d.isAbsolute=true;d.type="path";d.path=[];d.Path=A;ea(d,f);b.canvas[x](c);return d};ea=function(a,b){a.attrs=a.attrs||{};var c=a.node,
d=a.attrs,f=c.style,e;e=(b.x!=d.x||b.y!=d.y||b.width!=d.width||b.height!=d.height||b.r!=d.r)&&a.type=="rect";var g=a;for(var h in b)if(b[z](h))d[h]=b[h];if(e){d.path=mb(d.x,d.y,d.width,d.height,d.r);a.X=d.x;a.Y=d.y;a.W=d.width;a.H=d.height}b.href&&(c.href=b.href);b.title&&(c.title=b.title);b.target&&(c.target=b.target);b.cursor&&(f.cursor=b.cursor);"blur"in b&&a.blur(b.blur);if(b.path&&a.type=="path"||e)c.path=Gb(d.path);b.rotation!=null&&a.rotate(b.rotation,true);if(b.translation){e=D(b.translation)[G](V);
Aa.call(a,e[0],e[1]);if(a._.rt.cx!=null){a._.rt.cx+=+e[0];a._.rt.cy+=+e[1];a.setBox(a.attrs,e[0],e[1])}}if(b.scale){e=D(b.scale)[G](V);a.scale(+e[0]||1,+e[1]||+e[0]||1,+e[2]||null,+e[3]||null)}if("clip-rect"in b){e=D(b["clip-rect"])[G](V);if(e[o]==4){e[2]=+e[2]+ +e[0];e[3]=+e[3]+ +e[1];h=c.clipRect||C.createElement("div");var i=h.style,j=c.parentNode;i.clip=l.format("rect({1}px {2}px {3}px {0}px)",e);if(!c.clipRect){i.position="absolute";i.top=0;i.left=0;i.width=a.paper.width+"px";i.height=a.paper.height+
"px";j.parentNode.insertBefore(h,j);h[x](j);c.clipRect=h}}if(!b["clip-rect"])c.clipRect&&(c.clipRect.style.clip=A)}if(a.type=="image"&&b.src)c.src=b.src;if(a.type=="image"&&b.opacity){c.filterOpacity=Fa+".Alpha(opacity="+b.opacity*100+")";f.filter=(c.filterMatrix||A)+(c.filterOpacity||A)}b.font&&(f.font=b.font);b["font-family"]&&(f.fontFamily='"'+b["font-family"][G](",")[0][I](/^['"]+|['"]+$/g,A)+'"');b["font-size"]&&(f.fontSize=b["font-size"]);b["font-weight"]&&(f.fontWeight=b["font-weight"]);b["font-style"]&&
(f.fontStyle=b["font-style"]);if(b.opacity!=null||b["stroke-width"]!=null||b.fill!=null||b.stroke!=null||b["stroke-width"]!=null||b["stroke-opacity"]!=null||b["fill-opacity"]!=null||b["stroke-dasharray"]!=null||b["stroke-miterlimit"]!=null||b["stroke-linejoin"]!=null||b["stroke-linecap"]!=null){c=a.shape||c;f=c.getElementsByTagName(ca)&&c.getElementsByTagName(ca)[0];e=false;!f&&(e=f=S(ca));if("fill-opacity"in b||"opacity"in b){a=((+d["fill-opacity"]+1||2)-1)*((+d.opacity+1||2)-1)*((+l.getRGB(b.fill).o+
1||2)-1);a<0&&(a=0);a>1&&(a=1);f.opacity=a}b.fill&&(f.on=true);if(f.on==null||b.fill=="none")f.on=false;if(f.on&&b.fill)if(a=b.fill.match(Sa)){f.src=a[1];f.type="tile"}else{f.color=l.getRGB(b.fill).hex;f.src=A;f.type="solid";if(l.getRGB(b.fill).error&&(g.type in{circle:1,ellipse:1}||D(b.fill).charAt()!="r")&&pa(g,b.fill)){d.fill="none";d.gradient=b.fill}}e&&c[x](f);f=c.getElementsByTagName("stroke")&&c.getElementsByTagName("stroke")[0];e=false;!f&&(e=f=S("stroke"));if(b.stroke&&b.stroke!="none"||
b["stroke-width"]||b["stroke-opacity"]!=null||b["stroke-dasharray"]||b["stroke-miterlimit"]||b["stroke-linejoin"]||b["stroke-linecap"])f.on=true;(b.stroke=="none"||f.on==null||b.stroke==0||b["stroke-width"]==0)&&(f.on=false);a=l.getRGB(b.stroke);f.on&&b.stroke&&(f.color=a.hex);a=((+d["stroke-opacity"]+1||2)-1)*((+d.opacity+1||2)-1)*((+a.o+1||2)-1);h=(y(b["stroke-width"])||1)*0.75;a<0&&(a=0);a>1&&(a=1);b["stroke-width"]==null&&(h=d["stroke-width"]);b["stroke-width"]&&(f.weight=h);h&&h<1&&(a*=h)&&(f.weight=
1);f.opacity=a;b["stroke-linejoin"]&&(f.joinstyle=b["stroke-linejoin"]||"miter");f.miterlimit=b["stroke-miterlimit"]||8;b["stroke-linecap"]&&(f.endcap=b["stroke-linecap"]=="butt"?"flat":b["stroke-linecap"]=="square"?"square":"round");if(b["stroke-dasharray"]){a={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};f.dashstyle=a[z](b["stroke-dasharray"])?a[b["stroke-dasharray"]]:
A}e&&c[x](f)}if(g.type=="text"){f=g.paper.span.style;d.font&&(f.font=d.font);d["font-family"]&&(f.fontFamily=d["font-family"]);d["font-size"]&&(f.fontSize=d["font-size"]);d["font-weight"]&&(f.fontWeight=d["font-weight"]);d["font-style"]&&(f.fontStyle=d["font-style"]);g.node.string&&(g.paper.span.innerHTML=D(g.node.string)[I](/</g,"&#60;")[I](/&/g,"&#38;")[I](/\n/g,"<br>"));g.W=d.w=g.paper.span.offsetWidth;g.H=d.h=g.paper.span.offsetHeight;g.X=d.x;g.Y=d.y+Q(g.H/2);switch(d["text-anchor"]){case "start":g.node.style["v-text-align"]=
"left";g.bbx=Q(g.W/2);break;case "end":g.node.style["v-text-align"]="right";g.bbx=-Q(g.W/2);break;default:g.node.style["v-text-align"]="center";break}}};pa=function(a,b){a.attrs=a.attrs||{};var c="linear",d=".5 .5";a.attrs.gradient=b;b=D(b)[I](cb,function(i,j,m){c="radial";if(j&&m){j=y(j);m=y(m);E(j-0.5,2)+E(m-0.5,2)>0.25&&(m=v.sqrt(0.25-E(j-0.5,2))*((m>0.5)*2-1)+0.5);d=j+N+m}return A});b=b[G](/\s*\-\s*/);if(c=="linear"){var f=b.shift();f=-y(f);if(isNaN(f))return null}var e=Wa(b);if(!e)return null;
a=a.shape||a.node;b=a.getElementsByTagName(ca)[0]||S(ca);!b.parentNode&&a.appendChild(b);if(e[o]){b.on=true;b.method="none";b.color=e[0].color;b.color2=e[e[o]-1].color;a=[];for(var g=0,h=e[o];g<h;g++)e[g].offset&&a[F](e[g].offset+N+e[g].color);b.colors&&(b.colors.value=a[o]?a[R]():"0% "+b.color);if(c=="radial"){b.type="gradientradial";b.focus="100%";b.focussize=d;b.focusposition=d}else{b.type="gradient";b.angle=(270-f)%360}}return 1};s=function(a,b,c){this[0]=a;this.id=l._oid++;this.node=a;a.raphael=
this;this.Y=this.X=0;this.attrs={};this.Group=b;this.paper=c;this._={tx:0,ty:0,rt:{deg:0},sx:1,sy:1};!c.bottom&&(c.bottom=this);(this.prev=c.top)&&(c.top.next=this);c.top=this;this.next=null};s[p].rotate=function(a,b,c){if(this.removed)return this;if(a==null){if(this._.rt.cx)return[this._.rt.deg,this._.rt.cx,this._.rt.cy][R](N);return this._.rt.deg}a=D(a)[G](V);if(a[o]-1){b=y(a[1]);c=y(a[2])}a=y(a[0]);if(b!=null)this._.rt.deg=a;else this._.rt.deg+=a;c==null&&(b=null);this._.rt.cx=b;this._.rt.cy=c;
this.setBox(this.attrs,b,c);this.Group.style.rotation=this._.rt.deg;return this};s[p].setBox=function(a,b,c){if(this.removed)return this;var d=this.Group.style,f=this.shape&&this.shape.style||this.node.style;a=a||{};for(var e in a)if(a[z](e))this.attrs[e]=a[e];b=b||this._.rt.cx;c=c||this._.rt.cy;var g=this.attrs,h;switch(this.type){case "circle":a=g.cx-g.r;e=g.cy-g.r;h=g=g.r*2;break;case "ellipse":a=g.cx-g.rx;e=g.cy-g.ry;h=g.rx*2;g=g.ry*2;break;case "image":a=+g.x;e=+g.y;h=g.width||0;g=g.height||
0;break;case "text":this.textpath.v=["m",Q(g.x),", ",Q(g.y-2),"l",Q(g.x)+1,", ",Q(g.y-2)][R](A);a=g.x-Q(this.W/2);e=g.y-this.H/2;h=this.W;g=this.H;break;case "rect":case "path":if(this.attrs.path){g=xa(this.attrs.path);a=g.x;e=g.y;h=g.width;g=g.height}else{e=a=0;h=this.paper.width;g=this.paper.height}break;default:e=a=0;h=this.paper.width;g=this.paper.height;break}b=b==null?a+h/2:b;c=c==null?e+g/2:c;b=b-this.paper.width/2;c=c-this.paper.height/2;var i;d.left!=(i=b+"px")&&(d.left=i);d.top!=(i=c+"px")&&
(d.top=i);this.X=ra[z](this.type)?-b:a;this.Y=ra[z](this.type)?-c:e;this.W=h;this.H=g;if(ra[z](this.type)){f.left!=(i=-b*na+"px")&&(f.left=i);f.top!=(i=-c*na+"px")&&(f.top=i)}else if(this.type=="text"){f.left!=(i=-b+"px")&&(f.left=i);f.top!=(i=-c+"px")&&(f.top=i)}else{d.width!=(i=this.paper.width+"px")&&(d.width=i);d.height!=(i=this.paper.height+"px")&&(d.height=i);f.left!=(i=a-b+"px")&&(f.left=i);f.top!=(i=e-c+"px")&&(f.top=i);f.width!=(i=h+"px")&&(f.width=i);f.height!=(i=g+"px")&&(f.height=i)}};
s[p].hide=function(){!this.removed&&(this.Group.style.display="none");return this};s[p].show=function(){!this.removed&&(this.Group.style.display="block");return this};s[p].getBBox=function(){if(this.removed)return this;if(ra[z](this.type))return xa(this.attrs.path);return{x:this.X+(this.bbx||0),y:this.Y,width:this.W,height:this.H}};s[p].remove=function(){if(!this.removed){ma(this,this.paper);this.node.parentNode.removeChild(this.node);this.Group.parentNode.removeChild(this.Group);this.shape&&this.shape.parentNode.removeChild(this.shape);
for(var a in this)delete this[a];this.removed=true}};s[p].attr=function(a,b){if(this.removed)return this;if(a==null){a={};for(var c in this.attrs)if(this.attrs[z](c))a[c]=this.attrs[c];this._.rt.deg&&(a.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(a.scale=this.scale());a.gradient&&a.fill=="none"&&(a.fill=a.gradient)&&delete a.gradient;return a}if(b==null&&l.is(a,ga)){if(a=="translation")return Aa.call(this);if(a=="rotation")return this.rotate();if(a=="scale")return this.scale();if(a==ca&&
this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return this.attrs[a]}if(this.attrs&&b==null&&l.is(a,U)){var d={};c=0;for(b=a[o];c<b;c++)d[a[c]]=this.attr(a[c]);return d}if(b!=null){d={};d[a]=b}b==null&&l.is(a,"object")&&(d=a);if(d){if(d.text&&this.type=="text")this.node.string=d.text;ea(this,d);if(d.gradient&&({circle:1,ellipse:1}[z](this.type)||D(d.gradient).charAt()!="r"))pa(this,d.gradient);(!ra[z](this.type)||this._.rt.deg)&&this.setBox(this.attrs)}return this};s[p].toFront=
function(){!this.removed&&this.Group.parentNode[x](this.Group);this.paper.top!=this&&Ya(this,this.paper);return this};s[p].toBack=function(){if(this.removed)return this;if(this.Group.parentNode.firstChild!=this.Group){this.Group.parentNode.insertBefore(this.Group,this.Group.parentNode.firstChild);Za(this,this.paper)}return this};s[p].insertAfter=function(a){if(this.removed)return this;if(a.constructor==X)a=a[a.length];a.Group.nextSibling?a.Group.parentNode.insertBefore(this.Group,a.Group.nextSibling):
a.Group.parentNode[x](this.Group);$a(this,a,this.paper);return this};s[p].insertBefore=function(a){if(this.removed)return this;if(a.constructor==X)a=a[0];a.Group.parentNode.insertBefore(this.Group,a.Group);ab(this,a,this.paper);return this};var Hb=/ progid:\S+Blur\([^\)]+\)/g;s[p].blur=function(a){var b=this.node.runtimeStyle,c=b.filter;c=c.replace(Hb,A);if(+a!==0){this.attrs.blur=a;b.filter=c+N+Fa+".Blur(pixelradius="+(+a||1.5)+")";b.margin=l.format("-{0}px 0 0 -{0}px",Q(+a||1.5))}else{b.filter=
c;b.margin=0;delete this.attrs.blur}};fb=function(a,b,c,d){var f=S("group"),e=S("oval");f.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px";f.coordsize=qa;f.coordorigin=a.coordorigin;f[x](e);e=new s(e,f,a);e.type="circle";ea(e,{stroke:"#000",fill:"none"});e.attrs.cx=b;e.attrs.cy=c;e.attrs.r=d;e.setBox({x:b-d,y:c-d,width:d*2,height:d*2});a.canvas[x](f);return e};function mb(a,b,c,d,f){return f?l.format("M{0},{1}l{2},0a{3},{3},0,0,1,{3},{3}l0,{5}a{3},{3},0,0,1,{4},{3}l{6},0a{3},{3},0,0,1,{4},{4}l0,{7}a{3},{3},0,0,1,{3},{4}z",
a+f,b,c-f*2,f,-f,d-f*2,f*2-c,f*2-d):l.format("M{0},{1}l{2},0,0,{3},{4},0z",a,b,c,d,-c)}gb=function(a,b,c,d,f,e){var g=mb(b,c,d,f,e);a=a.path(g);var h=a.attrs;a.X=h.x=b;a.Y=h.y=c;a.W=h.width=d;a.H=h.height=f;h.r=e;h.path=g;a.type="rect";return a};hb=function(a,b,c,d,f){var e=S("group"),g=S("oval");e.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px";e.coordsize=qa;e.coordorigin=a.coordorigin;e[x](g);g=new s(g,e,a);g.type="ellipse";ea(g,{stroke:"#000"});g.attrs.cx=
b;g.attrs.cy=c;g.attrs.rx=d;g.attrs.ry=f;g.setBox({x:b-d,y:c-f,width:d*2,height:f*2});a.canvas[x](e);return g};ib=function(a,b,c,d,f,e){var g=S("group"),h=S("image");g.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px";g.coordsize=qa;g.coordorigin=a.coordorigin;h.src=b;g[x](h);h=new s(h,g,a);h.type="image";h.attrs.src=b;h.attrs.x=c;h.attrs.y=d;h.attrs.w=f;h.attrs.h=e;h.setBox({x:c,y:d,width:f,height:e});a.canvas[x](g);return h};jb=function(a,b,c,d){var f=S("group"),
e=S("shape"),g=e.style,h=S("path"),i=S("textpath");f.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px";f.coordsize=qa;f.coordorigin=a.coordorigin;h.v=l.format("m{0},{1}l{2},{1}",Q(b*10),Q(c*10),Q(b*10)+1);h.textpathok=true;g.width=a.width;g.height=a.height;i.string=D(d);i.on=true;e[x](i);e[x](h);f[x](e);g=new s(i,f,a);g.shape=e;g.textpath=h;g.type="text";g.attrs.text=d;g.attrs.x=b;g.attrs.y=c;g.attrs.w=1;g.attrs.h=1;ea(g,{font:ta.font,stroke:"none",fill:"#000"});
g.setBox();a.canvas[x](f);return g};kb=function(a,b){var c=this.canvas.style;a==+a&&(a+="px");b==+b&&(b+="px");c.width=a;c.height=b;c.clip="rect(0 "+a+" "+b+" 0)";return this};var S;C.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!C.namespaces.rvml&&C.namespaces.add("rvml","urn:schemas-microsoft-com:vml");S=function(a){return C.createElement("<rvml:"+a+' class="rvml">')}}catch(Pb){S=function(a){return C.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}Ca=
function(){var a=Xa[K](0,arguments),b=a.container,c=a.height,d=a.width,f=a.x;a=a.y;if(!b)throw new Error("VML container not found.");var e=new H,g=e.canvas=C.createElement("div"),h=g.style;f=f||0;a=a||0;d=d||512;c=c||342;d==+d&&(d+="px");c==+c&&(c+="px");e.width=1000;e.height=1000;e.coordsize=na*1000+N+na*1000;e.coordorigin="0 0";e.span=C.createElement("span");e.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";g[x](e.span);h.cssText=
l.format("width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",d,c);if(b==1){C.body[x](g);h.left=f+"px";h.top=a+"px";h.position="absolute"}else b.firstChild?b.insertBefore(g,b.firstChild):b[x](g);Ia.call(e,e,l.fn);return e};H[p].clear=function(){this.canvas.innerHTML=A;this.span=C.createElement("span");this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";this.canvas[x](this.span);this.bottom=
this.top=null};H[p].remove=function(){this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bb(a);return true}}H[p].safari=navigator.vendor=="Apple Computer, Inc."&&(navigator.userAgent.match(/Version\/(.*?)\s/)[1]<4||aa.navigator.platform.slice(0,2)=="iP")?function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});aa.setTimeout(function(){a.remove()})}:function(){};function Ib(){this.returnValue=false}function Jb(){return this.originalEvent.preventDefault()}
function Kb(){this.cancelBubble=true}function Lb(){return this.originalEvent.stopPropagation()}var Mb=function(){if(C.addEventListener)return function(a,b,c,d){var f=Da&&Ea[b]?Ea[b]:b;function e(g){if(Da&&Ea[z](b))for(var h=0,i=g.targetTouches&&g.targetTouches.length;h<i;h++)if(g.targetTouches[h].target==a){i=g;g=g.targetTouches[h];g.originalEvent=i;g.preventDefault=Jb;g.stopPropagation=Lb;break}return c.call(d,g)}a.addEventListener(f,e,false);return function(){a.removeEventListener(f,e,false);return true}};
else if(C.attachEvent)return function(a,b,c,d){function f(g){g=g||aa.event;g.preventDefault=g.preventDefault||Ib;g.stopPropagation=g.stopPropagation||Kb;return c.call(d,g)}a.attachEvent("on"+b,f);function e(){a.detachEvent("on"+b,f);return true}return e}}(),$=[];function Ka(a){for(var b=a.clientX,c=a.clientY,d,f=$.length;f--;){d=$[f];if(Da)for(var e=a.touches.length,g;e--;){g=a.touches[e];if(g.identifier==d.el._drag.id){b=g.clientX;c=g.clientY;(a.originalEvent?a.originalEvent:a).preventDefault();
break}}else a.preventDefault();d.move&&d.move.call(d.el,b-d.el._drag.x,c-d.el._drag.y,b,c)}}function La(){l.unmousemove(Ka).unmouseup(La);for(var a=$.length,b;a--;){b=$[a];b.el._drag={};b.end&&b.end.call(b.el)}$=[]}for(da=Ra[o];da--;)(function(a){l[a]=s[p][a]=function(b){if(l.is(b,"function")){this.events=this.events||[];this.events.push({name:a,f:b,unbind:Mb(this.shape||this.node||C,a,b,this)})}return this};l["un"+a]=s[p]["un"+a]=function(b){for(var c=this.events,d=c[o];d--;)if(c[d].name==a&&c[d].f==
b){c[d].unbind();c.splice(d,1);!c.length&&delete this.events;return this}return this}})(Ra[da]);s[p].hover=function(a,b){return this.mouseover(a).mouseout(b)};s[p].unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};s[p].drag=function(a,b,c){this._drag={};this.mousedown(function(d){(d.originalEvent||d).preventDefault();this._drag.x=d.clientX;this._drag.y=d.clientY;this._drag.id=d.identifier;b&&b.call(this,d.clientX,d.clientY);!$.length&&l.mousemove(Ka).mouseup(La);$.push({el:this,move:a,
end:c})});return this};s[p].undrag=function(a,b,c){for(b=$.length;b--;){$[b].el==this&&$[b].move==a&&$[b].end==c&&$.splice(b,1);!$.length&&l.unmousemove(Ka).unmouseup(La)}};H[p].circle=function(a,b,c){return fb(this,a||0,b||0,c||0)};H[p].rect=function(a,b,c,d,f){return gb(this,a||0,b||0,c||0,d||0,f||0)};H[p].ellipse=function(a,b,c,d){return hb(this,a||0,b||0,c||0,d||0)};H[p].path=function(a){a&&!l.is(a,ga)&&!l.is(a[0],U)&&(a+=A);return db(l.format[K](l,arguments),this)};H[p].image=function(a,b,c,
d,f){return ib(this,a||"about:blank",b||0,c||0,d||0,f||0)};H[p].text=function(a,b,c){return jb(this,a||0,b||0,c||A)};H[p].set=function(a){arguments[o]>1&&(a=Array[p].splice.call(arguments,0,arguments[o]));return new X(a)};H[p].setSize=kb;H[p].top=H[p].bottom=null;H[p].raphael=l;function nb(){return this.x+N+this.y}s[p].resetScale=function(){if(this.removed)return this;this._.sx=1;this._.sy=1;this.attrs.scale="1 1"};s[p].scale=function(a,b,c,d){if(this.removed)return this;if(a==null&&b==null)return{x:this._.sx,
y:this._.sy,toString:nb};b=b||a;!+b&&(b=a);var f,e,g=this.attrs;if(a!=0){var h=this.getBBox(),i=h.x+h.width/2,j=h.y+h.height/2;f=a/this._.sx;e=b/this._.sy;c=+c||c==0?c:i;d=+d||d==0?d:j;h=~~(a/v.abs(a));var m=~~(b/v.abs(b)),n=this.node.style,r=c+(i-c)*f;j=d+(j-d)*e;switch(this.type){case "rect":case "image":var q=g.width*h*f,k=g.height*m*e;this.attr({height:k,r:g.r*ba(h*f,m*e),width:q,x:r-q/2,y:j-k/2});break;case "circle":case "ellipse":this.attr({rx:g.rx*h*f,ry:g.ry*m*e,r:g.r*ba(h*f,m*e),cx:r,cy:j});
break;case "text":this.attr({x:r,y:j});break;case "path":i=Ha(g.path);for(var t=true,L=0,B=i[o];L<B;L++){var w=i[L],J=sa.call(w[0]);if(!(J=="M"&&t)){t=false;if(J=="A"){w[i[L][o]-2]*=f;w[i[L][o]-1]*=e;w[1]*=h*f;w[2]*=m*e;w[5]=+!(h+m?!+w[5]:+w[5])}else if(J=="H"){J=1;for(var ia=w[o];J<ia;J++)w[J]*=f}else if(J=="V"){J=1;for(ia=w[o];J<ia;J++)w[J]*=e}else{J=1;for(ia=w[o];J<ia;J++)w[J]*=J%2?f:e}}}e=xa(i);f=r-e.x-e.width/2;e=j-e.y-e.height/2;i[0][1]+=f;i[0][2]+=e;this.attr({path:i});break}if(this.type in
{text:1,image:1}&&(h!=1||m!=1))if(this.transformations){this.transformations[2]="scale("[M](h,",",m,")");this.node[W]("transform",this.transformations[R](N));f=h==-1?-g.x-(q||0):g.x;e=m==-1?-g.y-(k||0):g.y;this.attr({x:f,y:e});g.fx=h-1;g.fy=m-1}else{this.node.filterMatrix=Fa+".Matrix(M11="[M](h,", M12=0, M21=0, M22=",m,", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')");n.filter=(this.node.filterMatrix||A)+(this.node.filterOpacity||A)}else if(this.transformations){this.transformations[2]=
A;this.node[W]("transform",this.transformations[R](N));g.fx=0;g.fy=0}else{this.node.filterMatrix=A;n.filter=(this.node.filterMatrix||A)+(this.node.filterOpacity||A)}g.scale=[a,b,c,d][R](N);this._.sx=a;this._.sy=b}return this};s[p].clone=function(){if(this.removed)return null;var a=this.attr();delete a.scale;delete a.translation;return this.paper[this.type]().attr(a)};var ob=Z(function(a,b,c,d,f,e,g,h,i){for(var j=0,m,n=0;n<1.01;n+=0.01){var r=la(a,b,c,d,f,e,g,h,n);n&&(j+=E(E(m.x-r.x,2)+E(m.y-r.y,
2),0.5));if(j>=i)return r;m=r}});function Ma(a,b){return function(c,d,f){c=wa(c);for(var e,g,h,i,j="",m={},n=0,r=0,q=c.length;r<q;r++){h=c[r];if(h[0]=="M"){e=+h[1];g=+h[2]}else{i=Nb(e,g,h[1],h[2],h[3],h[4],h[5],h[6]);if(n+i>d){if(b&&!m.start){e=ob(e,g,h[1],h[2],h[3],h[4],h[5],h[6],d-n);j+=["C",e.start.x,e.start.y,e.m.x,e.m.y,e.x,e.y];if(f)return j;m.start=j;j=["M",e.x,e.y+"C",e.n.x,e.n.y,e.end.x,e.end.y,h[5],h[6]][R]();n+=i;e=+h[5];g=+h[6];continue}if(!a&&!b){e=ob(e,g,h[1],h[2],h[3],h[4],h[5],h[6],
d-n);return{x:e.x,y:e.y,alpha:e.alpha}}}n+=i;e=+h[5];g=+h[6]}j+=h}m.end=j;e=a?n:b?m:l.findDotsAtSegment(e,g,h[1],h[2],h[3],h[4],h[5],h[6],1);e.alpha&&(e={x:e.x,y:e.y,alpha:e.alpha});return e}}var Nb=Z(function(a,b,c,d,f,e,g,h){for(var i={x:0,y:0},j=0,m=0;m<1.01;m+=0.01){var n=la(a,b,c,d,f,e,g,h,m);m&&(j+=E(E(i.x-n.x,2)+E(i.y-n.y,2),0.5));i=n}return j}),pb=Ma(1),Ba=Ma(),Na=Ma(0,1);s[p].getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return pb(this.attrs.path)}};
s[p].getPointAtLength=function(a){if(this.type=="path"){if(this.node.getPointAtLength)return this.node.getPointAtLength(a);return Ba(this.attrs.path,a)}};s[p].getSubpath=function(a,b){if(this.type=="path"){if(v.abs(this.getTotalLength()-b)<1.0E-6)return Na(this.attrs.path,a).end;b=Na(this.attrs.path,b,1);return a?Na(b,a).end:b}};l.easing_formulas={linear:function(a){return a},"<":function(a){return E(a,3)},">":function(a){return E(a-1,3)+1},"<>":function(a){a*=2;if(a<1)return E(a,3)/2;a-=2;return(E(a,
3)+2)/2},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==0||a==1)return a;var b=0.3,c=b/4;return E(2,-10*a)*v.sin((a-c)*2*v.PI/b)+1},bounce:function(a){var b=7.5625,c=2.75;if(a<1/c)a=b*a*a;else if(a<2/c){a-=1.5/c;a=b*a*a+0.75}else if(a<2.5/c){a-=2.25/c;a=b*a*a+0.9375}else{a-=2.625/c;a=b*a*a+0.984375}return a}};var T={length:0};function qb(){var a=+new Date;for(var b in T)if(b!="length"&&T[z](b)){var c=
T[b];if(c.stop||c.el.removed){delete T[b];T[o]--}else{var d=a-c.start,f=c.ms,e=c.easing,g=c.from,h=c.diff,i=c.to,j=c.t,m=c.prev||0,n=c.el,r=c.callback,q={},k;if(d<f){r=l.easing_formulas[e]?l.easing_formulas[e](d/f):d/f;for(var t in g)if(g[z](t)){switch(Ga[t]){case "along":k=r*f*h[t];i.back&&(k=i.len-k);e=Ba(i[t],k);n.translate(h.sx-h.x||0,h.sy-h.y||0);h.x=e.x;h.y=e.y;n.translate(e.x-h.sx,e.y-h.sy);i.rot&&n.rotate(h.r+e.alpha,e.x,e.y);break;case P:k=+g[t]+r*f*h[t];break;case "colour":k="rgb("+[Oa(Q(g[t].r+
r*f*h[t].r)),Oa(Q(g[t].g+r*f*h[t].g)),Oa(Q(g[t].b+r*f*h[t].b))][R](",")+")";break;case "path":k=[];e=0;for(var L=g[t][o];e<L;e++){k[e]=[g[t][e][0]];for(var B=1,w=g[t][e][o];B<w;B++)k[e][B]=+g[t][e][B]+r*f*h[t][e][B];k[e]=k[e][R](N)}k=k[R](N);break;case "csv":switch(t){case "translation":k=h[t][0]*(d-m);e=h[t][1]*(d-m);j.x+=k;j.y+=e;k=k+N+e;break;case "rotation":k=+g[t][0]+r*f*h[t][0];g[t][1]&&(k+=","+g[t][1]+","+g[t][2]);break;case "scale":k=[+g[t][0]+r*f*h[t][0],+g[t][1]+r*f*h[t][1],2 in i[t]?i[t][2]:
A,3 in i[t]?i[t][3]:A][R](N);break;case "clip-rect":k=[];for(e=4;e--;)k[e]=+g[t][e]+r*f*h[t][e];break}break}q[t]=k}n.attr(q);n._run&&n._run.call(n)}else{if(i.along){e=Ba(i.along,i.len*!i.back);n.translate(h.sx-(h.x||0)+e.x-h.sx,h.sy-(h.y||0)+e.y-h.sy);i.rot&&n.rotate(h.r+e.alpha,e.x,e.y)}(j.x||j.y)&&n.translate(-j.x,-j.y);i.scale&&(i.scale+=A);n.attr(i);delete T[b];T[o]--;n.in_animation=null;l.is(r,"function")&&r.call(n)}c.prev=d}}l.svg&&n&&n.paper&&n.paper.safari();T[o]&&aa.setTimeout(qb)}function Oa(a){return Y(ba(a,
255),0)}function Aa(a,b){if(a==null)return{x:this._.tx,y:this._.ty,toString:nb};this._.tx+=+a;this._.ty+=+b;switch(this.type){case "circle":case "ellipse":this.attr({cx:+a+this.attrs.cx,cy:+b+this.attrs.cy});break;case "rect":case "image":case "text":this.attr({x:+a+this.attrs.x,y:+b+this.attrs.y});break;case "path":var c=Ha(this.attrs.path);c[0][1]+=+a;c[0][2]+=+b;this.attr({path:c});break}return this}s[p].animateWith=function(a,b,c,d,f){T[a.id]&&(b.start=T[a.id].start);return this.animate(b,c,d,
f)};s[p].animateAlong=rb();s[p].animateAlongBack=rb(1);function rb(a){return function(b,c,d,f){var e={back:a};l.is(d,"function")?(f=d):(e.rot=d);b&&b.constructor==s&&(b=b.attrs.path);b&&(e.along=b);return this.animate(e,c,f)}}s[p].onAnimation=function(a){this._run=a||0;return this};s[p].animate=function(a,b,c,d){if(l.is(c,"function")||!c)d=c||null;var f={},e={},g={};for(var h in a)if(a[z](h))if(Ga[z](h)){f[h]=this.attr(h);f[h]==null&&(f[h]=ta[h]);e[h]=a[h];switch(Ga[h]){case "along":var i=pb(a[h]),
j=Ba(a[h],i*!!a.back),m=this.getBBox();g[h]=i/b;g.tx=m.x;g.ty=m.y;g.sx=j.x;g.sy=j.y;e.rot=a.rot;e.back=a.back;e.len=i;a.rot&&(g.r=y(this.rotate())||0);break;case P:g[h]=(e[h]-f[h])/b;break;case "colour":f[h]=l.getRGB(f[h]);i=l.getRGB(e[h]);g[h]={r:(i.r-f[h].r)/b,g:(i.g-f[h].g)/b,b:(i.b-f[h].b)/b};break;case "path":i=wa(f[h],e[h]);f[h]=i[0];j=i[1];g[h]=[];i=0;for(m=f[h][o];i<m;i++){g[h][i]=[0];for(var n=1,r=f[h][i][o];n<r;n++)g[h][i][n]=(j[i][n]-f[h][i][n])/b}break;case "csv":j=D(a[h])[G](V);i=D(f[h])[G](V);
switch(h){case "translation":f[h]=[0,0];g[h]=[j[0]/b,j[1]/b];break;case "rotation":f[h]=i[1]==j[1]&&i[2]==j[2]?i:[0,j[1],j[2]];g[h]=[(j[0]-f[h][0])/b,0,0];break;case "scale":a[h]=j;f[h]=D(f[h])[G](V);g[h]=[(j[0]-f[h][0])/b,(j[1]-f[h][1])/b,0,0];break;case "clip-rect":f[h]=D(f[h])[G](V);g[h]=[];for(i=4;i--;)g[h][i]=(j[i]-f[h][i])/b;break}e[h]=j}}this.stop();this.in_animation=1;T[this.id]={start:a.start||+new Date,ms:b,easing:c,from:f,diff:g,to:e,el:this,callback:d,t:{x:0,y:0}};++T[o]==1&&qb();return this};
s[p].stop=function(){T[this.id]&&T[o]--;delete T[this.id];return this};s[p].translate=function(a,b){return this.attr({translation:a+" "+b})};s[p][O]=function(){return"Rapha\u00ebl\u2019s object"};l.ae=T;function X(a){this.items=[];this[o]=0;this.type="set";if(a)for(var b=0,c=a[o];b<c;b++)if(a[b]&&(a[b].constructor==s||a[b].constructor==X)){this[this.items[o]]=this.items[this.items[o]]=a[b];this[o]++}}X[p][F]=function(){for(var a,b,c=0,d=arguments[o];c<d;c++)if((a=arguments[c])&&(a.constructor==s||
a.constructor==X)){b=this.items[o];this[b]=this.items[b]=a;this[o]++}return this};X[p].pop=function(){delete this[this[o]--];return this.items.pop()};for(var Pa in s[p])if(s[p][z](Pa))X[p][Pa]=function(a){return function(){for(var b=0,c=this.items[o];b<c;b++)this.items[b][a][K](this.items[b],arguments);return this}}(Pa);X[p].attr=function(a,b){if(a&&l.is(a,U)&&l.is(a[0],"object")){b=0;for(var c=a[o];b<c;b++)this.items[b].attr(a[b])}else{c=0;for(var d=this.items[o];c<d;c++)this.items[c].attr(a,b)}return this};
X[p].animate=function(a,b,c,d){(l.is(c,"function")||!c)&&(d=c||null);var f=this.items[o],e=f,g,h=this,i;d&&(i=function(){!--f&&d.call(h)});c=l.is(c,ga)?c:i;for(g=this.items[--e].animate(a,b,c,i);e--;)this.items[e].animateWith(g,a,b,c,i);return this};X[p].insertAfter=function(a){for(var b=this.items[o];b--;)this.items[b].insertAfter(a);return this};X[p].getBBox=function(){for(var a=[],b=[],c=[],d=[],f=this.items[o];f--;){var e=this.items[f].getBBox();a[F](e.x);b[F](e.y);c[F](e.x+e.width);d[F](e.y+
e.height)}a=ba[K](0,a);b=ba[K](0,b);return{x:a,y:b,width:Y[K](0,c)-a,height:Y[K](0,d)-b}};X[p].clone=function(a){a=new X;for(var b=0,c=this.items[o];b<c;b++)a[F](this.items[b].clone());return a};l.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)if(a.face[z](d))b.face[d]=a.face[d];if(this.fonts[c])this.fonts[c][F](b);else this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=ha(a.face["units-per-em"],10);
for(var f in a.glyphs)if(a.glyphs[z](f)){c=a.glyphs[f];b.glyphs[f]={w:c.w,k:{},d:c.d&&"M"+c.d[I](/[mlcxtrv]/g,function(g){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[g]||"M"})+"z"};if(c.k)for(var e in c.k)if(c[z](e))b.glyphs[f].k[e]=c.k[e]}}return a};H[p].getFont=function(a,b,c,d){d=d||"normal";c=c||"normal";b=+b||{normal:400,bold:700,lighter:300,bolder:800}[b]||400;if(l.fonts){var f=l.fonts[a];if(!f){a=new RegExp("(^|\\s)"+a[I](/[^\w\d\s+!~.:_-]/g,A)+"(\\s|$)","i");for(var e in l.fonts)if(l.fonts[z](e))if(a.test(e)){f=
l.fonts[e];break}}var g;if(f){e=0;for(a=f[o];e<a;e++){g=f[e];if(g.face["font-weight"]==b&&(g.face["font-style"]==c||!g.face["font-style"])&&g.face["font-stretch"]==d)break}}return g}};H[p].print=function(a,b,c,d,f,e){e=e||"middle";var g=this.set(),h=D(c)[G](A),i=0;l.is(d,c)&&(d=this.getFont(d));if(d){c=(f||16)/d.face["units-per-em"];var j=d.face.bbox.split(V);f=+j[0];e=+j[1]+(e=="baseline"?j[3]-j[1]+ +d.face.descent:(j[3]-j[1])/2);j=0;for(var m=h[o];j<m;j++){var n=j&&d.glyphs[h[j-1]]||{},r=d.glyphs[h[j]];
i+=j?(n.w||d.w)+(n.k&&n.k[h[j]]||0):0;r&&r.d&&g[F](this.path(r.d).attr({fill:"#000",stroke:"none",translation:[i,0]}))}g.scale(c,c,f,e).translate(a-f,b-e)}return g};var Ob=/\{(\d+)\}/g;l.format=function(a,b){var c=l.is(b,U)?[0][M](b):arguments;a&&l.is(a,ga)&&c[o]-1&&(a=a[I](Ob,function(d,f){return c[++f]==null?A:c[f]}));return a||A};l.ninja=function(){Qa.was?(Raphael=Qa.is):delete Raphael;return l};l.el=s[p];return l}();
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
/***
|''Name''|g.bar|
|''Requires''|raphaeljs g.raphael|
!Notes
This fixes the issue at http://github.com/DmitryBaranovskiy/g.raphael/issues#issue/11
!Usage
!Code
***/
/*
 * g.Raphael 0.4.1hack - Charting library, based on Raphaël
 *
 * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com)
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
 */
Raphael.fn.g.barchart=function(C,A,a,d,O,u){u=u||{};var P={round:"round",sharp:"sharp",soft:"soft"}[u.type]||"square",n=parseFloat(u.gutter||"20%"),M=this.set(),v=this.set(),e=this.set(),r=this.set(),w=Math.max.apply(Math,O),N=[],c=this,B=0,F=u.colors||this.g.colors,q=O.length;if(this.raphael.is(O[0],"array")){w=[];B=q;q=0;for(var K=O.length;K--;){v.push(this.set());w.push(Math.max.apply(Math,O[K]));q=Math.max(q,O[K].length);}if(u.stacked){for(var K=q;K--;){var l=0;for(var J=O.length;J--;){l+=+O[J][K]||0;}N.push(l);}}for(var K=O.length;K--;){if(O[K].length<q){for(var J=q;J--;){O[K].push(0);}}}w=Math.max.apply(Math,u.stacked?N:w);}w=(u.to)||w;var D=a/(q*(100+n)+n)*100,b=D*n/100,g=u.vgutter==null?20:u.vgutter,t=[],k=C+b,f=(d-2*g)/w;if(!u.stretch){b=Math.round(b);D=Math.floor(D);}!u.stacked&&(D/=B||1);for(var K=0;K<q;K++){t=[];for(var J=0;J<(B||1);J++){var L=Math.round((B?O[J][K]:O[K])*f),m=A+d-g-L,H=this.g.finger(Math.round(k+D/2),m+L,D,L,true,P).attr({stroke:"none",fill:F[B?J:K]});if(B){v[J].push(H);}else{v.push(H);}H.y=m;H.x=Math.round(k+D/2);H.w=D;H.h=L;H.value=B?O[J][K]:O[K];if(!u.stacked){k+=D;}else{t.push(H);}}if(u.stacked){var I;r.push(I=this.rect(t[0].x-t[0].w/2,A,D,d).attr(this.g.shim));I.bars=this.set();var o=0;for(var E=t.length;E--;){t[E].toFront();}for(var E=0,p=t.length;E<p;E++){var H=t[E],z,L=(o+H.value)*f,G=this.g.finger(H.x,A+d-g-!!o*0.5,D,L,true,P,1);I.bars.push(H);o&&H.attr({path:G});H.h=L;H.y=A+d-g-!!o*0.5-L;e.push(z=this.rect(H.x-H.w/2,H.y,D,H.value*f).attr(this.g.shim));z.bar=H;z.value=H.value;o+=H.value;}k+=D;}k+=b;}r.toFront();k=C+b;if(!u.stacked){for(var K=0;K<q;K++){for(var J=0;J<(B||1);J++){var z;e.push(z=this.rect(Math.round(k),A+g,D,d-g).attr(this.g.shim));z.bar=B?v[J][K]:v[K];z.value=z.bar.value;k+=D;}k+=b;}}M.label=function(y,S){y=y||[];this.labels=c.set();var T,h=-Infinity;if(u.stacked){for(var x=0;x<q;x++){var Q=0;for(var s=0;s<(B||1);s++){Q+=B?O[s][x]:O[x];if(s==B-1){var U=c.g.labelise(y[x],Q,w);T=c.g.text(v[s][x].x,A+d-g/2,U).insertBefore(e[x*(B||1)+s]);var R=T.getBBox();if(R.x-7<h){T.remove();}else{this.labels.push(T);h=R.x+R.width;}}}}}else{for(var x=0;x<q;x++){for(var s=0;s<(B||1);s++){var U=c.g.labelise(B?y[s]&&y[s][x]:y[x],B?O[s][x]:O[x],w);T=c.g.text(v[s][x].x,S?A+d-g/2:v[s][x].y-10,U).insertBefore(e[x*(B||1)+s]);var R=T.getBBox();if(R.x-7<h){T.remove();}else{this.labels.push(T);h=R.x+R.width;}}}}return this;};M.hover=function(i,h){r.hide();e.show();e.mouseover(i).mouseout(h);return this;};M.hoverColumn=function(i,h){e.hide();r.show();h=h||function(){};r.mouseover(i).mouseout(h);return this;};M.click=function(h){r.hide();e.show();e.click(h);return this;};M.each=function(j){if(!Raphael.is(j,"function")){return this;}for(var h=e.length;h--;){j.call(e[h]);}return this;};M.eachColumn=function(j){if(!Raphael.is(j,"function")){return this;}for(var h=r.length;h--;){j.call(r[h]);}return this;};M.clickColumn=function(h){e.hide();r.show();r.click(h);return this;};M.push(v,e,r);M.bars=v;M.covers=e;return M;};Raphael.fn.g.hbarchart=function(n,l,B,w,c,r){r=r||{};var e={round:"round",sharp:"sharp",soft:"soft"}[r.type]||"square",f=parseFloat(r.gutter||"20%"),u=this.set(),A=this.set(),h=this.set(),E=this.set(),M=Math.max.apply(Math,c),a=[],o=this,C=0,m=r.colors||this.g.colors,H=c.length;if(this.raphael.is(c[0],"array")){M=[];C=H;H=0;for(var G=c.length;G--;){A.push(this.set());M.push(Math.max.apply(Math,c[G]));H=Math.max(H,c[G].length);}if(r.stacked){for(var G=H;G--;){var p=0;for(var F=c.length;F--;){p+=+c[F][G]||0;}a.push(p);}}for(var G=c.length;G--;){if(c[G].length<H){for(var F=H;F--;){c[G].push(0);}}}M=Math.max.apply(Math,r.stacked?a:M);}M=(r.to)||M;var J=Math.floor(w/(H*(100+f)+f)*100),k=Math.floor(J*f/100),g=[],b=l+k,d=(B-1)/M;!r.stacked&&(J/=C||1);for(var G=0;G<H;G++){g=[];for(var F=0;F<(C||1);F++){var L=C?c[F][G]:c[G],I=this.g.finger(n,b+J/2,Math.round(L*d),J-1,false,e).attr({stroke:"none",fill:m[C?F:G]});if(C){A[F].push(I);}else{A.push(I);}I.x=n+Math.round(L*d);I.y=b+J/2;I.w=Math.round(L*d);I.h=J;I.value=+L;if(!r.stacked){b+=J;}else{g.push(I);}}if(r.stacked){var q=this.rect(n,g[0].y-g[0].h/2,B,J).attr(this.g.shim);E.push(q);q.bars=this.set();var v=0;for(var t=g.length;t--;){g[t].toFront();}for(var t=0,D=g.length;t<D;t++){var I=g[t],K,L=Math.round((v+I.value)*d),z=this.g.finger(n,I.y,L,J-1,false,e,1);q.bars.push(I);v&&I.attr({path:z});I.w=L;I.x=n+L;h.push(K=this.rect(n+v*d,I.y-I.h/2,I.value*d,J).attr(this.g.shim));K.bar=I;v+=I.value;}b+=J;}b+=k;}E.toFront();b=l+k;if(!r.stacked){for(var G=0;G<H;G++){for(var F=0;F<(C||1);F++){var K=this.rect(n,b,B,J).attr(this.g.shim);h.push(K);K.bar=C?A[F][G]:A[G];K.value=K.bar.value;b+=J;}b+=k;}}u.label=function(R,P){R=R||[];this.labels=o.set();for(var O=0;O<H;O++){for(var N=0;N<C;N++){var y=o.g.labelise(C?R[N]&&R[N][O]:R[O],C?c[N][O]:c[O],M);var Q=P?A[O*(C||1)+N].x-J/2+3:n+5,x=P?"end":"start",s;this.labels.push(s=o.g.text(Q,A[O*(C||1)+N].y,y).attr({"text-anchor":x}).insertBefore(h[0]));if(s.getBBox().x<n+5){s.attr({x:n+5,"text-anchor":"start"});}else{A[O*(C||1)+N].label=s;}}}return this;};u.hover=function(j,i){E.hide();h.show();i=i||function(){};h.mouseover(j).mouseout(i);return this;};u.hoverColumn=function(j,i){h.hide();E.show();i=i||function(){};E.mouseover(j).mouseout(i);return this;};u.each=function(s){if(!Raphael.is(s,"function")){return this;}for(var j=h.length;j--;){s.call(h[j]);}return this;};u.eachColumn=function(s){if(!Raphael.is(s,"function")){return this;}for(var j=E.length;j--;){s.call(E[j]);}return this;};u.click=function(i){E.hide();h.show();h.click(i);return this;};u.clickColumn=function(i){h.hide();E.show();E.click(i);return this;};u.push(A,h,E);u.bars=A;u.covers=h;return u;};
a TiddlySpace
a theme
see [[SiteInfo]]@smmliquidtheme
/***
|''Name''|TiddlySpaceRevisionView|
|''Description''|Show tiddler revisions in a stack of cards view|
|''Author''|BenGillies|
|''Version''|0.2.0|
|''Status''|beta|
|''Source''|http://github.com/TiddlySpace/tiddlyspace|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Requires''|TiddlyWebAdaptor|
!Usage
The viewRevisions macro can be attached to any element, which should be passed
in as a parameter.

For example:

&lt;&lt;viewRevisions page:10 link:"<<view modified date>>"&gt;&gt;

would show the revisions "stack of cards" view, 10 at a time, when the modified
date is clicked.
!Code
***/
//{{{
(function($) {

var me = config.macros.viewRevisions = {
	revisionTemplate: "RevisionTemplate",
	revSuffix: " [rev. #%0]", // text to append to each tiddler title
	defaultPageSize: 5, // default number of revisions to show
	defaultLinkText: "View Revisions", // when there's nothing else to use
	offsetTop: 30, // in px
	offsetLeft: 10, // in px
	shiftDownDelay: 50, // in ms
	visibleSlideAmount: 20, // amount of revisions to show on left hand edge after sliding
	zIndex: 100, // default z-index
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		params = paramString.parseParams(null, null, true)[0];
		var tiddlerElem = story.findContainingTiddler(place);

		var revButton;
		var pageSize = parseInt(params.page[0], 10) || me.defaultPageSize;
		var linkObj = params.link ? params.link[0] || me.defaultLinkText : false;
		if(linkObj) {
			revButton = $('<span class="button openRevisions" />')
				.appendTo(place);
			wikify(linkObj, revButton[0], null, tiddler);
		} else {
			revButton = place;
		}

		$(revButton).click(function() {
			if (!$(tiddlerElem).hasClass("revisions")) {
				me.showRevisions(tiddlerElem, tiddler, pageSize);
			} else {
				me.closeRevisions(tiddlerElem);
			}
		});
	},

	// initialisation for revision view
	showRevisions: function(tiddlerElem, tiddler, pageSize) {
		var context = {
			host: tiddler.fields["server.host"],
			workspace: tiddler.fields["server.workspace"]
		};
		$(tiddlerElem).addClass("revisions").attr("revName", tiddler.title);
		// ensure toolbar commands deactivate RevisionsView
		$("a", ".toolbar", tiddlerElem).each(function(index, btn) {
			var _onclick = btn.onclick;
			btn.onclick = function(e) {
				me.closeRevisions(tiddlerElem);
				_onclick.apply(this, arguments);
			};
		});
		// ensure default action deactivates RevisionsView
		var _ondblclick = tiddlerElem.ondblclick;
		tiddlerElem.ondblclick = function(e) {
			me.closeRevisions(tiddlerElem);
			_ondblclick.apply(this, arguments);
		};
		var type = tiddler.fields["server.type"];
		var adaptor = new config.adaptors[type]();
		var userParams = {
			tiddlerElem: tiddlerElem,
			pageSize: pageSize,
			title: tiddler.title
		};
		me.createCloak(tiddlerElem);
		adaptor.getTiddlerRevisionList(tiddler.title, null, context, userParams,
				function(context, userParams) {
					// strip the current revision
					context.revisions.shift();
					me.expandStack(context, userParams);
				});
	},

	// fetch the actual revision and put it in the tiddler div
	showRevision: function(place, revision, callback) {
		var context = {
			host: revision.fields["server.host"],
			workspace: revision.fields["server.workspace"]
		};
		var userParams = {
			revElem: place
		};
		var type = revision.fields["server.type"];
		var adaptor = new config.adaptors[type]();
		var revNo = revision.fields["server.page.revision"];
		adaptor.getTiddlerRevision(revision.title, revNo, context, userParams,
			function(context, userParams) {
				var tiddler = context.tiddler;
				tiddler.title += me.revSuffix
					.format([$(place).attr("revision")]);
				tiddler.fields.doNotSave = true;
				if (store.getTiddler(tiddler.title)) {
					store.deleteTiddler(tiddler.title);
				}
				store.addTiddler(tiddler);

				//now, populate the existing div
				var revElem = userParams.revElem;
				$(revElem).attr("id", story.tiddlerId(tiddler.title));
				$(revElem).attr("refresh", "tiddler");
				var getTemplate = function() {
					var themeName = config.options.txtTheme;
					if (themeName) {
						return store.getTiddlerSlice(themeName,
							me.revisionTemplate) || me.revisionTemplate ||
							"ViewTemplate";
					} else {
						return (store.getTiddler(me.revisionTemplate)) ?
							me.revisionTemplate : "ViewTemplate";
					}
				};
				var template = getTemplate();
				story.refreshTiddler(tiddler.title, template, true);
				callback(tiddler);
			});
	},

	createCloak: function(promoteElem) {
		var el = $(promoteElem);
		// cache styles for resetting later
		el.data({
			top: el.css("top"),
			left: el.css("left"),
			zIndex: el.css("z-index")
		});

		$('<div class="revisionCloak" />').css("z-index", me.zIndex)
			.click(function() {
				me.closeRevisions(promoteElem);
			})
			.appendTo(document.body);

		el.css("z-index", me.zIndex + 1);
	},

	// clean up, removing all evidence of revision view
	closeRevisions: function(promoteElem) {
		var el = $(promoteElem);
		// revert the original tiddler back to its previous state
		el.removeAttr("revName").removeClass("revisions").css({
			top: el.data("top"),
			left: el.data("left"),
			zIndex: el.data("zIndex")
		});

		// remove any revisions still in the store
		var revisions = $(".revisions");
		revisions.each(function(index, revision) {
			var revAttributes = revision.attributes;
			if ((revAttributes.revname) &&
					(revAttributes.revision)) {
				var revName = revAttributes.revname.value;
				var revNo = revAttributes.revision.value;
				var title = revName + me.revSuffix.format([revNo]);

				if (store.getTiddler(title)) {
					store.deleteTiddler(title);
				}
			}
		});

		// delete the previous revisions
		revisions.remove();

		// remove the cloak
		$(".revisionCloak").remove();
	},

	// calback from getting list of revisions
	expandStack: function(context, userParams) {
		var pageSize = userParams.pageSize;

		var from = userParams.from || 0;
		var tiddlerElem = userParams.tiddlerElem;

		userParams.defaultHeight = $(tiddlerElem).height();
		userParams.defaultWidth = $(tiddlerElem).width();
		if (from < context.revisions.length) {
			me.displayNextRevision(tiddlerElem, userParams, context, from,
				from + pageSize - 1);
		}
	},

	// place the next div above and behind the previous one
	displayNextRevision: function(tiddlerElem, userParams, context, from, to) {
		var revision = context.revisions[from];
		var callback = function() {
			var revText = revBtn.getRevisionText(tiddlerElem, revision);
			tiddlerElem = me.createRevisionObject(tiddlerElem, context,
				userParams, revText);
			$(tiddlerElem)
				.attr("revision", (context.revisions.length - from));
			if ((from < to) && ((from + 1) < context.revisions.length)){
				me.displayNextRevision(tiddlerElem, userParams, context,
					from + 1, to);
			} else if ((context.revisions.length - 1) > to) {
				me.showMoreButton(tiddlerElem, context, userParams, to + 1);
			}
		};
		me.shiftVisibleDown(userParams.title, callback);
	},

	createRevisionObject: function(tiddlerElem, context, userParams, text) {
		var newPosition = me.calculatePosition(tiddlerElem, context);
		return $('<div class="revisions tiddler" />')
			.css({
				position: "absolute",
				top: newPosition.top,
				left: newPosition.left,
				"z-index": me.zIndex + 1,
				height: userParams.defaultHeight,
				width: userParams.defaultWidth
			})
			.attr("revName", userParams.title)
			.append(text)
			.insertBefore(tiddlerElem);
	},

	// move the already present revisions down by 1 to fit the next one in
	shiftVisibleDown: function(title, callback) {
		var revisions = $("[revName='%0'].revisions".format([title]));
		var revisionCount = revisions.length;

		$(revisions).animate({top: "+=" + me.offsetTop},
				me.shiftDownDelay, function() {
					revisionCount -= 1;
					if ((callback) && (!revisionCount)) {
						callback();
					}
				});
	},

	// where we put the new revision
	calculatePosition: function(elem, context) {
		var offset = $(elem).offset();
		var currentPosition = $(elem).position();
		var newPosition = {
			top: currentPosition.top - me.offsetTop
		};
		if ((context.restrictLeft) ||
				((offset.left - me.offsetLeft) <
				$("#contentWrapper").offset().left)) {
			newPosition.left = $(elem).position().left;
			context.restrictLeft = true;
		} else {
			newPosition.left = currentPosition.left - me.offsetLeft;
		}
		return newPosition;
	},

	// equivalent of displayNextRevision, but for the more button
	showMoreButton: function(tiddlerElem, context, userParams, moreIndex) {
		userParams.from = moreIndex + 1;
		me.shiftVisibleDown(userParams.title, function() {
			var btn = me.createRevisionObject(tiddlerElem, context, userParams,
				"");

			var more = createTiddlyButton(btn[0], "more...", "show more revisions",
				function() {
					if ($(".viewRevision").length) {
						return;
					}
					userParams.tiddlerElem = btn[0];
					$(btn).text("")
						.append(revBtn
							.getRevisionText(btn[0], context.revisions[moreIndex]))
						.attr("revision", context.revisions.length - moreIndex);
					me.expandStack(context, userParams);
				});
			$(more).css("float", "right");
		});
	},

	stripRevFromTitle: function(revisionTitle) {
		return revisionTitle.split(/ ?\[rev\. #[0-9]+\]$/)[0];
	},

	onClickRevision: function(revElem, revision, callback) {
		// don't do anything if we are still loading
		if ($(".revisions").hasClass("loading")) {
			return null;
		}

		var origTitle = me.stripRevFromTitle(revision.title);
		if ($(revElem).hasClass("viewRevision")) {
			$(".revisions").addClass("loading");
			me.slideIn(revElem, revision, origTitle, function() {
				store.deleteTiddler(revision.title);
				revision.title = origTitle;
				$(revElem).text("").append(revBtn.getRevisionText(revElem,
						revision))
					.removeAttr("tags").removeAttr("tiddler")
					.removeAttr("refresh").removeAttr("template")
					.removeAttr("id");
				$(".revisions").removeClass("loading");
				if (callback) {
					callback();
				}
			});
			$(revElem).removeAttr("prevPos").removeClass("viewRevision");
		} else {
			var viewRevision = function() {
				var prevPos = $(revElem).position().left;
				$(revElem).addClass("viewRevision").attr("prevPos", prevPos);
				$(".revisions").addClass("loading");
				me.showRevision(revElem, revision, function(rev) {
					me.slideOut(revElem, rev, origTitle, function() {
						$(".revisions").removeClass("loading");
					});
				});
			};
			// make sure another revision isn't already out
			if ($(".viewRevision").length) {
				var newRevElem = $(".viewRevision")[0];
				var newRevision = store.getTiddler($(newRevElem)
					.attr("tiddler"));
				me.onClickRevision(newRevElem, newRevision, viewRevision);
			} else {
				viewRevision();
			}
		}
	},

	slideOut: function(revElem, revision, title, callback) {
		var leftMostPos = $("[revName='%0'].revisions".format([title]))
			.offset().left;
		var width = $(revElem).width();
		var originalLeftPos = $(story.getTiddler(title))
			.position().left;

		var slideAmount = leftMostPos + width - me.visibleSlideAmount;
		$("[revName='%0'].revisions:not(.viewRevision)".format([title]))
			.animate({left: "-=" + slideAmount}, 1000);
		$(revElem)
			.attr("baseHeight", $(revElem).css("height"))
			.css("height", "auto")
			.animate({left: originalLeftPos}, 1000, callback);
	},

	slideIn: function(revElem, revision, title, callback) {
		var slideAmount = $(revElem).offset().left -
			$(story.getTiddler(title)).offset().left;
		var origRevPos = $(revElem).attr("prevPos");

		$("[revName='%0'].revisions:not(.viewRevision)".format([title]))
			.animate({left: "+=" + slideAmount}, 1000);
		$(revElem).animate({left: origRevPos}, 1000, function() {
			$(revElem)
				.css("height", $(revElem).attr("baseHeight"))
				.removeAttr("baseHeight");
			callback();
		});
	}
};

var revBtn;
config.macros.slideRevision = revBtn = {
	btnText: "created by %0 at %1 on %2",
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var btn = revBtn.getRevisionText(place, tiddler);
		$(place).append(btn);
	},

	getRevisionText: function(place, revision) {
		var text = revBtn.btnText.format([revision.modifier,
			revision.modified.formatString("0hh:0mm"),
			revision.modified.formatString("0DD MMM YYYY")]);
		var btn = $('<a href="javascript:;" class="button revButton" />')
			.text(text)
			.click(function() {
				var revElem = story.findContainingTiddler(this);
				me.onClickRevision(revElem, revision);
			});
		return btn;
	}
};

})(jQuery);
//}}}
/***
|''Name''|g.raphael|
|''Version''|0.4.1|
|''Requires''|raphaeljs|
|''Source''|http://github.com/DmitryBaranovskiy/g.raphael|
!Usage
!Code
***/
/*
 * g.Raphael 0.4.1 - Charting library, based on Raphaël
 *
 * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com)
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
 */
(function(){var a=Math.max,c=Math.min;Raphael.fn.g=Raphael.fn.g||{};Raphael.fn.g.markers={disc:"disc",o:"disc",flower:"flower",f:"flower",diamond:"diamond",d:"diamond",square:"square",s:"square",triangle:"triangle",t:"triangle",star:"star","*":"star",cross:"cross",x:"cross",plus:"plus","+":"plus",arrow:"arrow","->":"arrow"};Raphael.fn.g.shim={stroke:"none",fill:"#000","fill-opacity":0};Raphael.fn.g.txtattr={font:"12px Arial, sans-serif"};Raphael.fn.g.colors=[];var e=[0.6,0.2,0.05,0.1333,0.75,0];for(var b=0;b<10;b++){if(b<e.length){Raphael.fn.g.colors.push("hsb("+e[b]+", .75, .75)");}else{Raphael.fn.g.colors.push("hsb("+e[b-e.length]+", 1, .5)");}}Raphael.fn.g.text=function(f,h,g){return this.text(f,h,g).attr(this.g.txtattr);};Raphael.fn.g.labelise=function(f,h,g){if(f){return(f+"").replace(/(##+(?:\.#+)?)|(%%+(?:\.%+)?)/g,function(i,k,j){if(k){return(+h).toFixed(k.replace(/^#+\.?/g,"").length);}if(j){return(h*100/g).toFixed(j.replace(/^%+\.?/g,"").length)+"%";}});}else{return(+h).toFixed(0);}};Raphael.fn.g.finger=function(l,k,g,m,h,i,j){if((h&&!m)||(!h&&!g)){return j?"":this.path();}i={square:"square",sharp:"sharp",soft:"soft"}[i]||"round";var o;m=Math.round(m);g=Math.round(g);l=Math.round(l);k=Math.round(k);switch(i){case"round":if(!h){var f=~~(m/2);if(g<f){f=g;o=["M",l+0.5,k+0.5-~~(m/2),"l",0,0,"a",f,~~(m/2),0,0,1,0,m,"l",0,0,"z"];}else{o=["M",l+0.5,k+0.5-f,"l",g-f,0,"a",f,f,0,1,1,0,m,"l",f-g,0,"z"];}}else{f=~~(g/2);if(m<f){f=m;o=["M",l-~~(g/2),k,"l",0,0,"a",~~(g/2),f,0,0,1,g,0,"l",0,0,"z"];}else{o=["M",l-f,k,"l",0,f-m,"a",f,f,0,1,1,g,0,"l",0,m-f,"z"];}}break;case"sharp":if(!h){var n=~~(m/2);o=["M",l,k+n,"l",0,-m,a(g-n,0),0,c(n,g),n,-c(n,g),n+(n*2<m),"z"];}else{n=~~(g/2);o=["M",l+n,k,"l",-g,0,0,-a(m-n,0),n,-c(n,m),n,c(n,m),n,"z"];}break;case"square":if(!h){o=["M",l,k+~~(m/2),"l",0,-m,g,0,0,m,"z"];}else{o=["M",l+~~(g/2),k,"l",1-g,0,0,-m,g-1,0,"z"];}break;case"soft":if(!h){f=c(g,Math.round(m/5));o=["M",l+0.5,k+0.5-~~(m/2),"l",g-f,0,"a",f,f,0,0,1,f,f,"l",0,m-f*2,"a",f,f,0,0,1,-f,f,"l",f-g,0,"z"];}else{f=c(Math.round(g/5),m);o=["M",l-~~(g/2),k,"l",0,f-m,"a",f,f,0,0,1,f,-f,"l",g-2*f,0,"a",f,f,0,0,1,f,f,"l",0,m-f,"z"];}}if(j){return o.join(",");}else{return this.path(o);}};Raphael.fn.g.disc=function(f,h,g){return this.circle(f,h,g);};Raphael.fn.g.line=function(f,h,g){return this.rect(f-g,h-g/5,2*g,2*g/5);};Raphael.fn.g.square=function(f,h,g){g=g*0.7;return this.rect(f-g,h-g,2*g,2*g);};Raphael.fn.g.triangle=function(f,h,g){g*=1.75;return this.path("M".concat(f,",",h,"m0-",g*0.58,"l",g*0.5,",",g*0.87,"-",g,",0z"));};Raphael.fn.g.diamond=function(f,h,g){return this.path(["M",f,h-g,"l",g,g,-g,g,-g,-g,g,-g,"z"]);};Raphael.fn.g.flower=function(j,h,f,g){f=f*1.25;var o=f,m=o*0.5;g=+g<3||!g?5:g;var p=["M",j,h+m,"Q"],l;for(var k=1;k<g*2+1;k++){l=k%2?o:m;p=p.concat([+(j+l*Math.sin(k*Math.PI/g)).toFixed(3),+(h+l*Math.cos(k*Math.PI/g)).toFixed(3)]);}p.push("z");return this.path(p.join(","));};Raphael.fn.g.star=function(f,n,m,h,g){h=h||m*0.382;g=g||5;var l=["M",f,n+h,"L"],k;for(var j=1;j<g*2;j++){k=j%2?m:h;l=l.concat([(f+k*Math.sin(j*Math.PI/g)),(n+k*Math.cos(j*Math.PI/g))]);}l.push("z");return this.path(l.join(","));};Raphael.fn.g.cross=function(f,h,g){g=g/2.5;return this.path("M".concat(f-g,",",h,"l",[-g,-g,g,-g,g,g,g,-g,g,g,-g,g,g,g,-g,g,-g,-g,-g,g,-g,-g,"z"]));};Raphael.fn.g.plus=function(f,h,g){g=g/2;return this.path("M".concat(f-g/2,",",h-g/2,"l",[0,-g,g,0,0,g,g,0,0,g,-g,0,0,g,-g,0,0,-g,-g,0,0,-g,"z"]));};Raphael.fn.g.arrow=function(f,h,g){return this.path("M".concat(f-g*0.7,",",h-g*0.4,"l",[g*0.6,0,0,-g*0.4,g,g*0.8,-g,g*0.8,0,-g*0.4,-g*0.6,0],"z"));};Raphael.fn.g.tag=function(f,m,l,k,i){k=k||0;i=i==null?5:i;l=l==null?"$9.99":l;var h=0.5522*i,g=this.set(),j=3;g.push(this.path().attr({fill:"#000",stroke:"#000"}));g.push(this.text(f,m,l).attr(this.g.txtattr).attr({fill:"#fff","font-family":"Helvetica, Arial"}));g.update=function(){this.rotate(0,f,m);var o=this[1].getBBox();if(o.height>=i*2){this[0].attr({path:["M",f,m+i,"a",i,i,0,1,1,0,-i*2,i,i,0,1,1,0,i*2,"m",0,-i*2-j,"a",i+j,i+j,0,1,0,0,(i+j)*2,"L",f+i+j,m+o.height/2+j,"l",o.width+2*j,0,0,-o.height-2*j,-o.width-2*j,0,"L",f,m-i-j].join(",")});}else{var n=Math.sqrt(Math.pow(i+j,2)-Math.pow(o.height/2+j,2));this[0].attr({path:["M",f,m+i,"c",-h,0,-i,h-i,-i,-i,0,-h,i-h,-i,i,-i,h,0,i,i-h,i,i,0,h,h-i,i,-i,i,"M",f+n,m-o.height/2-j,"a",i+j,i+j,0,1,0,0,o.height+2*j,"l",i+j-n+o.width+2*j,0,0,-o.height-2*j,"L",f+n,m-o.height/2-j].join(",")});}this[1].attr({x:f+i+j+o.width/2,y:m});k=(360-k)%360;this.rotate(k,f,m);k>90&&k<270&&this[1].attr({x:f-i-j-o.width/2,y:m,rotation:[180+k,f,m]});return this;};g.update();return g;};Raphael.fn.g.popupit=function(l,k,m,g,t){g=g==null?2:g;t=t||5;l=Math.round(l);k=Math.round(k);var j=m.getBBox(),n=Math.round(j.width/2),i=Math.round(j.height/2),s=[0,n+t*2,0,-n-t*2],o=[-i*2-t*3,-i-t,0,-i-t],f=["M",l-s[g],k-o[g],"l",-t,(g==2)*-t,-a(n-t,0),0,"a",t,t,0,0,1,-t,-t,"l",0,-a(i-t,0),(g==3)*-t,-t,(g==3)*t,-t,0,-a(i-t,0),"a",t,t,0,0,1,t,-t,"l",a(n-t,0),0,t,!g*-t,t,!g*t,a(n-t,0),0,"a",t,t,0,0,1,t,t,"l",0,a(i-t,0),(g==1)*t,t,(g==1)*-t,t,0,a(i-t,0),"a",t,t,0,0,1,-t,t,"l",-a(n-t,0),0,"z"].join(","),q=[{x:l,y:k+t*2+i},{x:l-t*2-n,y:k},{x:l,y:k-t*2-i},{x:l+t*2+n,y:k}][g];m.translate(q.x-n-j.x,q.y-i-j.y);return this.path(f).attr({fill:"#000",stroke:"none"}).insertBefore(m.node?m:m[0]);};Raphael.fn.g.popup=function(f,l,k,g,i){g=g==null?2:g>3?3:g;i=i||5;k=k||"$9.99";var h=this.set(),j=3;h.push(this.path().attr({fill:"#000",stroke:"#000"}));h.push(this.text(f,l,k).attr(this.g.txtattr).attr({fill:"#fff","font-family":"Helvetica, Arial"}));h.update=function(o,n,q){o=o||f;n=n||l;var t=this[1].getBBox(),u=t.width/2,s=t.height/2,y=[0,u+i*2,0,-u-i*2],v=[-s*2-i*3,-s-i,0,-s-i],m=["M",o-y[g],n-v[g],"l",-i,(g==2)*-i,-a(u-i,0),0,"a",i,i,0,0,1,-i,-i,"l",0,-a(s-i,0),(g==3)*-i,-i,(g==3)*i,-i,0,-a(s-i,0),"a",i,i,0,0,1,i,-i,"l",a(u-i,0),0,i,!g*-i,i,!g*i,a(u-i,0),0,"a",i,i,0,0,1,i,i,"l",0,a(s-i,0),(g==1)*i,i,(g==1)*-i,i,0,a(s-i,0),"a",i,i,0,0,1,-i,i,"l",-a(u-i,0),0,"z"].join(","),x=[{x:o,y:n+i*2+s},{x:o-i*2-u,y:n},{x:o,y:n-i*2-s},{x:o+i*2+u,y:n}][g];x.path=m;if(q){this.animate(x,500,">");}else{this.attr(x);}return this;};return h.update(f,l);};Raphael.fn.g.flag=function(f,k,j,i){i=i||0;j=j||"$9.99";var g=this.set(),h=3;g.push(this.path().attr({fill:"#000",stroke:"#000"}));g.push(this.text(f,k,j).attr(this.g.txtattr).attr({fill:"#fff","font-family":"Helvetica, Arial"}));g.update=function(l,o){this.rotate(0,l,o);var n=this[1].getBBox(),m=n.height/2;this[0].attr({path:["M",l,o,"l",m+h,-m-h,n.width+2*h,0,0,n.height+2*h,-n.width-2*h,0,"z"].join(",")});this[1].attr({x:l+m+h+n.width/2,y:o});i=360-i;this.rotate(i,l,o);i>90&&i<270&&this[1].attr({x:l-r-h-n.width/2,y:o,rotation:[180+i,l,o]});return this;};return g.update(f,k);};Raphael.fn.g.label=function(f,i,h){var g=this.set();g.push(this.rect(f,i,10,10).attr({stroke:"none",fill:"#000"}));g.push(this.text(f,i,h).attr(this.g.txtattr).attr({fill:"#fff"}));g.update=function(){var k=this[1].getBBox(),j=c(k.width+10,k.height+10)/2;this[0].attr({x:k.x-j/2,y:k.y-j/2,width:k.width+j,height:k.height+j,r:j});};g.update();return g;};Raphael.fn.g.labelit=function(h){var g=h.getBBox(),f=c(20,g.width+10,g.height+10)/2;return this.rect(g.x-f/2,g.y-f/2,g.width+f,g.height+f,f).attr({stroke:"none",fill:"#000"}).insertBefore(h.node?h:h[0]);};Raphael.fn.g.drop=function(f,k,j,h,i){h=h||30;i=i||0;var g=this.set();g.push(this.path(["M",f,k,"l",h,0,"A",h*0.4,h*0.4,0,1,0,f+h*0.7,k-h*0.7,"z"]).attr({fill:"#000",stroke:"none",rotation:[22.5-i,f,k]}));i=(i+90)*Math.PI/180;g.push(this.text(f+h*Math.sin(i),k+h*Math.cos(i),j).attr(this.g.txtattr).attr({"font-size":h*12/30,fill:"#fff"}));g.drop=g[0];g.text=g[1];return g;};Raphael.fn.g.blob=function(g,m,l,k,i){k=(+k+1?k:45)+90;i=i||12;var f=Math.PI/180,j=i*12/12;var h=this.set();h.push(this.path().attr({fill:"#000",stroke:"none"}));h.push(this.text(g+i*Math.sin((k)*f),m+i*Math.cos((k)*f)-j/2,l).attr(this.g.txtattr).attr({"font-size":j,fill:"#fff"}));h.update=function(t,s,y){t=t||g;s=s||m;var A=this[1].getBBox(),D=a(A.width+j,i*25/12),z=a(A.height+j,i*25/12),o=t+i*Math.sin((k-22.5)*f),B=s+i*Math.cos((k-22.5)*f),q=t+i*Math.sin((k+22.5)*f),C=s+i*Math.cos((k+22.5)*f),F=(q-o)/2,E=(C-B)/2,p=D/2,n=z/2,x=-Math.sqrt(Math.abs(p*p*n*n-p*p*E*E-n*n*F*F)/(p*p*E*E+n*n*F*F)),v=x*p*E/n+(q+o)/2,u=x*-n*F/p+(C+B)/2;if(y){this.animate({x:v,y:u,path:["M",g,m,"L",q,C,"A",p,n,0,1,1,o,B,"z"].join(",")},500,">");}else{this.attr({x:v,y:u,path:["M",g,m,"L",q,C,"A",p,n,0,1,1,o,B,"z"].join(",")});}return this;};h.update(g,m);return h;};Raphael.fn.g.colorValue=function(i,h,g,f){return"hsb("+[c((1-i/h)*0.4,1),g||0.75,f||0.75]+")";};Raphael.fn.g.snapEnds=function(n,o,m){var k=n,p=o;if(k==p){return{from:k,to:p,power:0};}function q(f){return Math.abs(f-0.5)<0.25?~~(f)+0.5:Math.round(f);}var l=(p-k)/m,g=~~(l),j=g,h=0;if(g){while(j){h--;j=~~(l*Math.pow(10,h))/Math.pow(10,h);}h++;}else{while(!g){h=h||1;g=~~(l*Math.pow(10,h))/Math.pow(10,h);h++;}h&&h--;}p=q(o*Math.pow(10,h))/Math.pow(10,h);if(p<o){p=q((o+0.5)*Math.pow(10,h))/Math.pow(10,h);}k=q((n-(h>0?0:0.5))*Math.pow(10,h))/Math.pow(10,h);return{from:k,to:p,power:h};};Raphael.fn.g.axis=function(v,u,o,G,l,J,m,L,n,g){g=g==null?2:g;n=n||"t";J=J||10;var F=n=="|"||n==" "?["M",v+0.5,u,"l",0,0.001]:m==1||m==3?["M",v+0.5,u,"l",0,-o]:["M",v,u+0.5,"l",o,0],z=this.g.snapEnds(G,l,J),K=z.from,B=z.to,I=z.power,H=0,C=this.set();d=(B-K)/J;var s=K,q=I>0?I:0;w=o/J;if(+m==1||+m==3){var h=u,A=(m-1?1:-1)*(g+3+!!(m-1));while(h>=u-o){n!="-"&&n!=" "&&(F=F.concat(["M",v-(n=="+"||n=="|"?g:!(m-1)*g*2),h+0.5,"l",g*2+1,0]));C.push(this.text(v+A,h,(L&&L[H++])||(Math.round(s)==s?s:+s.toFixed(q))).attr(this.g.txtattr).attr({"text-anchor":m-1?"start":"end"}));s+=d;h-=w;}if(Math.round(h+w-(u-o))){n!="-"&&n!=" "&&(F=F.concat(["M",v-(n=="+"||n=="|"?g:!(m-1)*g*2),u-o+0.5,"l",g*2+1,0]));C.push(this.text(v+A,u-o,(L&&L[H])||(Math.round(s)==s?s:+s.toFixed(q))).attr(this.g.txtattr).attr({"text-anchor":m-1?"start":"end"}));}}else{s=K;q=(I>0)*I;A=(m?-1:1)*(g+9+!m);var k=v,w=o/J,D=0,E=0;while(k<=v+o){n!="-"&&n!=" "&&(F=F.concat(["M",k+0.5,u-(n=="+"?g:!!m*g*2),"l",0,g*2+1]));C.push(D=this.text(k,u+A,(L&&L[H++])||(Math.round(s)==s?s:+s.toFixed(q))).attr(this.g.txtattr));var p=D.getBBox();if(E>=p.x-5){C.pop(C.length-1).remove();}else{E=p.x+p.width;}s+=d;k+=w;}if(Math.round(k-w-v-o)){n!="-"&&n!=" "&&(F=F.concat(["M",v+o+0.5,u-(n=="+"?g:!!m*g*2),"l",0,g*2+1]));C.push(this.text(v+o,u+A,(L&&L[H])||(Math.round(s)==s?s:+s.toFixed(q))).attr(this.g.txtattr));}}var M=this.path(F);M.text=C;M.all=this.set([M,C]);M.remove=function(){this.text.remove();this.constructor.prototype.remove.call(this);};return M;};Raphael.el.lighter=function(g){g=g||2;var f=[this.attrs.fill,this.attrs.stroke];this.fs=this.fs||[f[0],f[1]];f[0]=Raphael.rgb2hsb(Raphael.getRGB(f[0]).hex);f[1]=Raphael.rgb2hsb(Raphael.getRGB(f[1]).hex);f[0].b=c(f[0].b*g,1);f[0].s=f[0].s/g;f[1].b=c(f[1].b*g,1);f[1].s=f[1].s/g;this.attr({fill:"hsb("+[f[0].h,f[0].s,f[0].b]+")",stroke:"hsb("+[f[1].h,f[1].s,f[1].b]+")"});};Raphael.el.darker=function(g){g=g||2;var f=[this.attrs.fill,this.attrs.stroke];this.fs=this.fs||[f[0],f[1]];f[0]=Raphael.rgb2hsb(Raphael.getRGB(f[0]).hex);f[1]=Raphael.rgb2hsb(Raphael.getRGB(f[1]).hex);f[0].s=c(f[0].s*g,1);f[0].b=f[0].b/g;f[1].s=c(f[1].s*g,1);f[1].b=f[1].b/g;this.attr({fill:"hsb("+[f[0].h,f[0].s,f[0].b]+")",stroke:"hsb("+[f[1].h,f[1].s,f[1].b]+")"});};Raphael.el.original=function(){if(this.fs){this.attr({fill:this.fs[0],stroke:this.fs[1]});delete this.fs;}};})();
/***
|''Name''|AuthenticationCssPlugin|
|''Version''|0.1.0|
|''Description''|Adds classes for styling purposes based on membership|
|''Requires''|TiddlySpaceConfig|
***/
//{{{
(function($) {
config.extensions.tiddlyweb.getUserInfo(function(user) {
    if(user.anon) {
        $("body").addClass("anonymousUser");
    } else {
        $("body").addClass("loggedInUser");
    }
});

if(readOnly) {
    $("body").addClass("readOnly");
}
})(jQuery);
//}}}
<<ActivityTable>>
[[StyleSheetTiddlySpace]]
[[StyleSheetShortcuts]]
If you would like any more information please contact @matt
tiddlydocs
/***
|''Name''|jquery.smmNestedSortable|
|''Description''||
|''Authors''|Simon McManus and Jon Robson|
|''Version''|0.2dev|
|''Status''|stable|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Requires''||
!TODO : 
#: Pass in tolerance paramter.
#: Allow all params available in sortables to be passed into smmNestedSortable.
# merge with smmNestedSortablePlugin ?
!Code
***/

//{{{

(function($) {
$.fn.smmNestedSortable = function(options) {
    settings = $.extend({
         sort: function(event, ui) {
             $(ui.placeholder).empty();
             if (ui.position.left - 10 > ui.originalPosition.left)	// make child
             	$(ui.placeholder).append("<ul class='nestedSortable'>" + $(ui.item).html() + "</ul>");
         },
         stop: function(event, ui) {
            $.fn.smmNestedSortable.change(event, ui);
            if (settings.serializer != undefined){
            	settings.serializer();
			}
         }
    }, options);
    this.each(function() {
        $(this).sortable(settings);
    });
    return this;
};
$.fn.smmNestedSortable.change = function(event, ui) {
    if (ui.position.left - 10 > ui.originalPosition.left) {	// make child - could/should add some more check in here.
        if ($(ui.item).prev().is('li')) {
            $(ui.item).prev().append(ui.item);
            $(ui.item).wrap("<ul class='nestedSortable'></ul>");
        }
    } else if (ui.position.left - 10 < ui.originalPosition.left) {	// kill child
        if ($(ui.item).parent().is("ul")) {	// confirm its not the base level element	
            if ($(ui.item).parent().children().length <= 1) {	// if only item in the list
                $(ui.item).parent().replaceWith($(ui.item));	// put outside not inside parent li
            }
        }
    }
    // cleanup unused lists
    $('ul.nestedSortable, ul.nestedSortable li').each(function() {
        if ($(this).text() == "")	// if only item and item is empty.
        	$(this).remove();	// remove the parent li
    });
    $('.nestedSortable').sortable("refresh");
};
})(jQuery);

//}}}
/***
|''Name''|WikiToolbarPlugin|
|''Requires''|ImageMacroPlugin jquery.a-tools|
|''Version''|0.1.5|
!Usage
{{{<<wikitoolbar commands:'bold italic image'>>}}}
gives you a toolbar with just these three commands

{{{<<wikitoolbar>>}}}
gives you all possible commands

!StyleSheet
body .tiddler div.toolbar {
	visibility: visible;
}
.wikiToolbar {
	position: relative;
	height:26px;
	margin-top: 2px;
	margin-bottom: 2px;
	background-color: #eee;
	overflow: hidden;
}

.wikiToolbar .toolbarBtn {
	cursor: pointer;
	font-size: 0.8em;
	float: left;
	position: relative;
	height:24px;
	width:20px;
	text-indent:-999px;
	background-color: white;
	background-image: url(btns.png);
	background-repeat: no-repeat;
	border: none;
	background-position: 200px 200px;
	margin-right: 3px;
}
.wikiToolbar .clear, .messageSpace .clear {
	clear: both;
}
.wikiToolbarHeadings .headingSelect {
	display:inline;
}
.wikiToolbarPalette .choice {
	width: 100px;
	display: block;
	height:20px;
	border: solid 1px black;
	cursor: pointer;
}


.wikiToolbar .boldButton {
	background-position: 0px -4px;
}
.wikiToolbar .colorButton {
	background-position: -20px -4px;
}
.wikiToolbar .italicButton {
	background-position: -40px -4px;
}

.wikiToolbar .listButton {
	background-position: -60px -4px;
}

.wikiToolbar .listNumberedButton {
	background-position: -80px -4px;
}

.wikiToolbar .linkButton {
	background-position: -100px -4px;
}

.wikiToolbar .underlineButton {
	background-position:-120px -4px;
}

.wikiToolbar .highlightButton {
	background-position:-140px -4px;
}

.wikiToolbar .strikethroughButton {
	background-position:-160px -4px;
}
.wikiToolbar .imageButton {
	background-position:-180px -4px;
}

.wikiToolbar .tableButton {
	background-position:-200px -4px;
}

.wikiToolbar .headingButton {
	background-position: -220px -4px;
}

.wikiToolbar .previewButton {
	background-position: -240px -4px;
}

.wikiToolbar .codeButton {
	background-position: -260px -4px;
}

.wikiToolbar .subscriptButton {
	background-position: -280px -4px;
}

.wikiToolbar .superscriptButton {
	background-position: -300px -4px;
}

.messageSpace {
	width: 100%;
}

.messageSpace .hide {
	float: right;
}

!Code
***/
//{{{
(function($){
	
story.onTiddlerMouseOver = function(e) {};
story.onTiddlerMouseOut = function(e) {};
var tiddler = {title: "WikiToolbarPlugin"};
var name = "StyleSheetWikiToolbar";
config.shadowTiddlers[name] = store.getTiddlerText(tiddler.title +
		 "##StyleSheet");
store.addNotification(name, refreshStyles);
	
var imageMacro = config.macros.image;
var macro = config.macros.wikitoolbar = {
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var options = macro.getOptions(params, paramString, tiddler);
		macro.constructToolbar(place, options);
		macro.constructMessageArea(place, options);
		var i = window.setInterval(function() {
			var target = macro.getTargetedElement(place);
			if(!target) {
				window.clearInterval(i);
			}
			macro.saveLog(options.id, $(target).val());
		}, 5000);
	},
	getOptions: function(params, paramString, tiddler) {
		var id = Math.random();
		var options = {id: id, tiddler: tiddler};
		var args = paramString.parseParams("name", null, true, false, true)[0];
		if(args.commands && args.commands[0]) {
			options.commands = args.commands[0].split(" ");
		}
		return options;
	},
	constructToolbar: function(place, options) {
		macro.setupButtons(place, options);
	},
	_log: {},
	logSize: 30,
	saveLog: function(id, text) {
		var log = macro._log[id];
		if(!log) {
			macro._log[id] = [];
		}
		macro._log[id].push(text);
		log = macro._log[id];
		if(log.length > macro.logSize) {
			macro._log[id] = macro._log[id].splice(1, macro.logSize);
		}
	},
	revertLog: function(id) {
		if(macro._log[id]) {
			return macro._log[id].pop();
		} else {
			return false;
		}
	},
	getTargetedElement: function(src) {
		var tidEl = $(".tiddler", $(src).parents());
		return $("[edit=text]", tidEl)[0];
	},
	setupButtons: function(place, options) {
		var toolbar = $('<div class="wikiToolbar" />').appendTo(place);
		var btnHandler = function(ev) {
			var targetEl = ev.target;
			var target = macro.getTargetedElement(targetEl);
			/*ev.stopPropagation();*/
			ev.preventDefault();
			var def = $.data(targetEl, "button");
			$(target).focus();
			if(def.action) {
				if(!def.nologging) {
					macro.saveLog(options.id, $(target).val());
				}
				def.action(ev, target, options);
				return false;
			} else if(def.substitution) {
				return macro.helpers.replaceSelectedText(target, def.substitution, options);
			}
		};

		var commands = options.commands || macro.defaultCommands;
		for(var i = 0; i < commands.length; i++) {
			var name = commands[i];
			var b = macro.commands[name];
			var btn = $("<button class='toolbarBtn' />").attr("title", "use %0 command tool".format([b.label])).
				text(b.label).click(btnHandler).appendTo(toolbar);
			$.data(btn[0], "button", b);
			btn.addClass("%0Button".format([name]));
		}
		$('<div class="clear" />').appendTo(toolbar);
	},
	constructMessageArea: function(place, options) {
		var holder = $("<div />").attr("id", "wikiMessageArea_%0".format([options.id])).
			addClass("messageSpace").appendTo(place);
		$("<div />").addClass("message").appendTo(holder);
		$("<span class='hide button'/>").text("hide").appendTo(holder).click(function(ev) {
			$(ev.target).parent().hide("fast");
		});
		$("<div />").addClass("clear").appendTo(holder);
		holder.hide();
	},
	message: function(id, text) {
		if(!id) {
			alert(text);
		} else {
			var el = $(document.getElementById("wikiMessageArea_%0".format([id])));
			if(el && el.length > 0) {
				$(":first", el).empty().text(text);
				el.show("slow");
			} else {
				alert(text);
			}
		}
	},
	helpers: {
		replaceSelectedText: function(target, str, options) {
			target = $(target);
			var selected = target.getSelection();
			var start, end;
			var offset = str.indexOf("%0");
			if(offset > -1) {
				start = selected.start + offset;
				end = selected.end + (str.length - (offset + 2)); // %0 is 2 characters long
			}
			var selectedText = selected.text;
			if(selectedText) {
				var replaceStr = str.format([selectedText]);
				var x = target.replaceSelection(replaceStr);
				if(!start & !end) {
					start = $(target).val().indexOf(replaceStr)
					end = start + replaceStr.length;
				}
				target.setSelection(start, end);
			} else {
				macro.message(options.id, "please select text!");
			}
		},
		insertAndSelect: function(target, str) {
			target = $(target);
			var select = $(target).getSelection();
			var caretPosition = select.start;
			target.insertAtCaretPos(str);
			target.setSelection(caretPosition, caretPosition + str.length);
		},
		createList: function(target, options) {
			var items = []; // in case focus is at end of a line..
			var answer = true;
			while(answer) {
				answer = prompt("please enter item number %0 or cancel to finish".format([items.length]));
				if(answer) {
					if(items.length === 0) {
						items.push("\n");
					}
					items.push("%0%1\n".format([options.symbol, answer]));
				}
			}
			macro.helpers.insertAndSelect(target, items.join(""));
		},
		makePopup: function(ev, content) {
			ev.stopPropagation();
			var popup = Popup.create(ev.target);
			$(popup).append(content);
			Popup.show();
			$(popup).click(function(ev) { // make it so only clicking on the document outside the popup removes the popup
				if(ev.target.parentNode != document) {
					ev.stopPropagation();
				}
			});
			return false;
		}
	},
	defaultCommands: ["bold", "italic", "underline","strikethrough", "subscript", "superscript", "link", "list", "listNumbered"],
	commands: {
		bold: {
			label: "bold",
			substitution: "''%0''"
		},
		subscript: {
			label: "subscript",
			substitution: "~~%0~~"
		},
		superscript: {
			label: "superscript",
			substitution: "^^%0^^"
		},
		italic: {
			label: "italic",
			substitution: "//%0//"
		},
		strikethrough: {
			label: "strikethrough",
			substitution: "--%0--"
		},
		link: {
			label: "link",
			action: function(ev, target) {
				target = $(target);
				var selected = target.getSelection();
				var selectedText = selected.text;
				if(selectedText) {
					var url = prompt("Please enter the url or tiddler name to link this text to");
					if(url == "") {
						target.replaceSelection("[[%0]]".format([selectedText]));
					} else if(url) {
						target.replaceSelection("[[%0|%1]]".format([selectedText, url]));
					}
				} else {
					var url = prompt("Please enter the url or tiddler name to link to.");
					if(url) {
						var label = prompt("Please enter a label for your link");
						if(label) {
							var replaceStr = "[[%0|%1]]".format([label, url]);
							macro.helpers.insertAndSelect(target, replaceStr);
						} else {
							var replaceStr = "[[%0]]".format([url]);
							macro.helpers.insertAndSelect(target, replaceStr);
						}
					}
				}
			}
		},
		underline: {
			label: "underline",
			substitution: "__%0__"
		},
		code: {
			label: "code",
			substitution: "{{{%0}}}"
		},
		highlight: {
			label: "highlight",
			substitution: "@@%0@@"
		},
		table: {
			label: "table",
			action: function(ev, target) {
				var rows = true, cols = true;
				target = $(target);
				while(cols && typeof(cols) != typeof(1)) {
					cols = prompt("How many columns?");
					cols = parseInt(cols);
					if(isNaN(cols)) {
						cols = false;
					} 
				}
				while(rows && typeof(rows) != typeof(1)) {
					rows = prompt("How many rows?");
					rows = parseInt(rows);
					if(isNaN(rows)) {
					rows = false;
					} 
				}
				var markup = ["\n"];
				for(var i = 0; i < rows; i++) {
					var rowMarkup = [];
					var rowNum = i + 1;
					for(var j = 0; j < cols; j++) {
						var colNum = j + 1;
						rowMarkup.push("col " + colNum + " row " + rowNum);
					}
					if(cols > 0) {
						markup.push("|");
						markup.push(rowMarkup.join("|"));
						markup.push("|\n");
					}
				}
				var table = markup.join("");
				macro.helpers.insertAndSelect(target, table);
			}
		},
		color: {
			label: "color",
			action: function(ev, target, options) {
				target = $(target);
				var oldText = target.getSelection().text;
				if(!oldText) {
					macro.message(options.id, "please select some text!");
					return;
				}
				var choices = macro.commands.color.colors;
				var clickHandler = function(ev) {
					ev.preventDefault();
					var fill = $(ev.target).attr("color");
					if(fill) {
						macro.helpers.replaceSelectedText(macro.getTargetedElement(ev.target), "@@color:" + fill + ";%0@@", options);
						Popup.remove();
					} else {
						alert("no color..");
					}
					return false;
				};
				var container = $("<div class='wikiToolbarPalette' />");
				for(var i = 0; i < choices.length; i++) {
					var color = choices[i];
					var choice = $("<button class='choice' />").css({"background-color": color}).attr("color", color)
						.click(clickHandler).appendTo(container);
				}
				return macro.helpers.makePopup(ev, container);
			},
			colors: ['#ff0000', '#ffff00', "#00ff00", "#00ffff", "#0000ff", "#ff00ff", "#000"]
		},
		heading: {
			label: "heading",
			action: function(ev, target, options) {
				var createHeading = function(ev) {
					ev.preventDefault();
					var level = parseInt($(ev.target).attr("level"));
					var str = [];
					for(var j = 0; j < level; j++) {
						str.push("!");
					}
					str.push("%0");
					macro.helpers.replaceSelectedText(target, str.join(""), options);
				};
				var container = $('<div class="wikiToolbarHeadings"/>')[0];
				for(var i = 1; i < 6; i++) {
					$("<h%0 />".format([i])).text("Heading %0".format([i])).
						attr("level", i).click(createHeading).appendTo(container);
					if(config.browser.isIE) {
						$('<button class="headingSelect"/>').text("apply").attr("level", i).click(createHeading).appendTo(container);
					}
				}
				return macro.helpers.makePopup(ev, container);
				
			}
		},
		list: {
			label: "list",
			action: function(ev, target, options) {
				target = $(target);
				var oldText = target.getSelection().text;
				if(oldText) {
					var lines = oldText.split("\n");
					var newText = [];
					for(var i = 0; i < lines.length; i++) {
						newText.push("*%0\n".format([lines[i]]));
					}
					macro.helpers.replaceSelectedText(target, newText.join(""), options)
				} else {
					macro.helpers.createList(target, {symbol: "*"});
				}
			}
		},
		listNumbered: {
			label: "numbered list",
			action: function(ev, target) {
				target = $(target);
				var oldText = target.getSelection().text;
				if(oldText) {
					var lines = oldText.split("\n");
					var newText = [];
					for(var i = 0; i < lines.length; i++) {
						newText.push("#%0\n".format([lines[i]]));
					}
					macro.helpers.replaceSelectedText(target, newText.join(""), options)
				} else {
					macro.helpers.createList(target, {symbol: "#"});
				}
			}
		},
		preview: {
			label: "preview",
			action: function(ev, target) {
				target = $(target);
				var tiddler = $('<div class="tiddler"/>');
				var viewer = $('<div class="viewer" />').appendTo(tiddler)[0];
				wikify(target.val(), viewer)
				return macro.helpers.makePopup(ev, tiddler);
			}
		},
		undo: { // add support for typing in between commands..
			nologging: true,
			label: "undo",
			action: function(ev, target, options) {
				var newText = macro.revertLog(options.id);
				$(target).val(newText);
				return true;
			}
		}
	}
};

if(imageMacro) {
	macro.commands.image = {
		label: "image",
		action: function(ev, target) {
			var images = [];
			var tiddlers = store.getTiddlers();
			var container = $('<div class="selectImage" />');
			$("<div />").text("please click an existing image you want to use:").appendTo(container);
			var clickHandler = function(ev) {
				ev.preventDefault();
				var container = $(ev.target).parents(".selectableImage")[0];
				var tiddler = $.data(container, "tiddler");
				if(tiddler) {
					macro.helpers.insertAndSelect(target, "<<image %0>>".format([tiddler.title]));
				}
			};
			for(var i = 0; i < tiddlers.length; i++) {
				var tiddler = tiddlers[i];
				if(!tiddler.tags.contains("excludeLists")) {
					if(imageMacro.isBinaryImageTiddler(tiddler)) {
						var imgContainer = $('<div class="selectableImage" />').click(clickHandler).appendTo(container)[0];
						$.data(imgContainer, "tiddler", tiddler);
						imageMacro.renderBinaryImageTiddler(imgContainer, tiddler, {height: 50});
					}
				}
			}
			macro.helpers.makePopup(ev, container);
		}
	};
}
})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceToolbar|
|''Description''|augments tiddler toolbar commands with SVG icons|
|''Author''|Osmosoft|
|''Version''|0.6.6|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceToolbar.js|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5.0|
|''Requires''|ImageMacroPlugin|
|''Keywords''|toolbar icons SVG|
!Description
replaces tiddler toolbar commands with SVG icons if available
!Notes
requires [[ImageMacroPlugin|http://svn.tiddlywiki.org/Trunk/contributors/JonRobson/plugins/ImageMacroPlugin/plugins/ImageMacroPlugin.tid]]

SVG icons are drawn from tiddlers titled {{{<command>.svg}}}
In readonly mode a tiddler called {{{<command>ReadOnly.svg}}} will be used if it exists.
!TODO
* rename (IconToolbarPlugin?)
* support more than one more popup menu in the toolbar.
!Code
***/
//{{{
(function($) {

if(!config.macros.image) {
	throw "Missing dependency: ImageMacroPlugin";
}

var macro = config.macros.toolbar;

macro.icons = {
	cloneTiddler: "editTiddler"
};

var _handler = macro.handler;
macro.handler = function(place, macroName, params, wikifier,
		paramString, tiddler) {
	var toolbar = $(place);
	toolbar.attr({
		refresh: "macro",
		macroName: macroName
	}).data("args", arguments);
	var status = _handler.apply(this, arguments);
	if(tiddler.isReadOnly()) {
		toolbar.addClass("toolbarReadOnly");
	} else {
		toolbar.removeClass("toolbarReadOnly");
	}
	var parsedParams = paramString.parseParams("name")[0];
	if(parsedParams.icons && parsedParams.icons == "yes") {
		this.augmentCommandButtons(place);
	}
	if(parsedParams.more && parsedParams.more == "popup") {
		// note we must override the onclick event like in createTiddlyButton
		// otherwise the click event is the popup AND the slider
		$(".moreCommand", place).each(function(i, el) {
			el.onclick = macro.onClickMorePopUp;
		});
		// buttons that are after a less command should not be in more menu.
		$(".lessCommand ~ .button", place).appendTo(place);
		$(".lessCommand", place).remove();
	}
	return status;
};

macro.refresh = function(place, params) {
	var args = $(place).empty().data("args");
	this.handler.apply(this, args);
};

var imageMacro = config.macros.image;
macro.augmentCommandButtons = function(toolbar) {
	$(".button", toolbar).each(function(i, el) {
		var cmd = $(el).attr("commandname");
		cmd = cmd ? cmd : "moreCommand"; // XXX: special-casing of moreCommand due to ticket #1234
		var icon = store.tiddlerExists(cmd) ? cmd : macro.icons[cmd];
		var text = $(el).text();
		if(readOnly) {
			var readOnlyAlternative = "%0ReadOnly".format([icon]);
			if(store.tiddlerExists(readOnlyAlternative)) {
				icon = readOnlyAlternative;
			}
		}
		if(store.tiddlerExists(icon)) {
			$(el).css({display: "inline-block"}).empty();
			imageMacro.renderImage(el, icon, { alt: text });
		}
	});
};

// provide onClickMore to provide extra commands in a popup
macro.onClickMorePopUp = function(ev) {
	ev = ev || window.event;
	var sibling = this.nextSibling;
	if(sibling) {
		var commands = sibling.childNodes;
		var popup = Popup.create(this);
		$(popup).addClass("taggedTiddlerList");
		for(var i = 0; i < commands.length; i++) {
			var li = createTiddlyElement(popup, "li", null);
			var oldCommand = commands[i];
			var command = oldCommand.cloneNode(true);
			command.onclick = oldCommand.onclick;
			li.appendChild(command);
		}
		Popup.show();
	}
	ev.cancelBubble = true;
	if(ev.stopPropagation) {
		ev.stopPropagation();
	}
	return false;
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceSearcher|
|''Version''|0.2.5|
|''Requires''|TiddlySpaceConfig TiddlySpaceFollowingPlugin|
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
var tsScan = config.macros.tsScan;

config.shadowTiddlers.SearchTemplate = "<<view server.bag SiteIcon label:no width:24 height:24 preserveAspectRatio:yes>> <<view server.bag spaceLink title external:no>> in space <<view server.bag spaceLink>>";
config.shadowTiddlers.StyleSheetSearch = [".resultsArea .siteIcon { display: inline; }",
	".searchForm {text-align: left;}"].join("\n");
store.addNotification("StyleSheetSearch", refreshStyles);

var search = config.macros.tsSearch = {
	locale: {
		advanced: "Advanced Options",
		header: "Search",
		resultsHeader: "Results (%0)",
		find: "find",
		noResults: "No tiddlers matched your search query",
		query: "QUERY: ",
		error: "please provide a search query or a tag, modifier or title!",
		titleAdvanced: "where the title is",
		modifierAdvanced: "where the last modifier is",
		spaceAdvanced: "only in the space: ",
		notspaceAdvanced: "but not in the spaces: ",
		tagsAdvanced: "with the tags: "
	},
	andConstructor: function(container, label, fieldname, negationMode) {
		var tags = $("<div />").appendTo(container);
		$('<span />').text(label).appendTo(tags);
		var id = "area" + Math.random();
		container = $("<span />").attr("id", id).appendTo(tags)[0];
		function add(container) {
			var el = $('<input type="text" />').attr("field", fieldname).appendTo(container);
			if(negationMode) {
				el.attr("negation", "true");
			}
		}
		add(container);
		var el = $("<button />").text("AND").click(function(ev) {
			add($(ev.target).data("container"));
			ev.preventDefault();
		}).appendTo(tags);
		$(el).data("container", container);
	},
	fieldConstructor: function(container, label, field) {
		container = $("<div />").appendTo(container)[0];
		$("<span />").text(label).appendTo(container);
		$("<input />").attr("text", "input").attr("field", field).appendTo(container);
	},
	advancedOptions: function(form) {
		var locale = search.locale;
		var container = $("<div />").addClass("tsAdvancedOptions").appendTo(form)[0];
		$("<h2/ >").text(search.locale.advanced).appendTo(container);
		$("<div />").addClass("separator").appendTo(container);
		search.fieldConstructor(container, locale.titleAdvanced, "title");
		search.fieldConstructor(container, locale.modifierAdvanced, "modifier");
		search.fieldConstructor(container, locale.spaceAdvanced, "space");
		search.andConstructor(container, locale.notspaceAdvanced, "space", true);
		search.andConstructor(container, locale.tagsAdvanced, "tag");
	},
	constructSearchQuery: function(form) {
		var data = [], select = [];
		var query = $("[name=q]", form).val();
		if(query) {
			data.push("q=%0".format(query));
		}

		// add tags, fields etc..
		$("[field]", form).each(function(i, el) {
			var val = $(el).val();
			var name = $(el).attr("field");
			var negate = $(el).attr("negation") == "true";
			if(val && name) {
				val = encodeURIComponent(val);
				val = negate ? "!" + val : val;
				if(name == "space") {
					val += "_public";
					name = "bag";
				}
				if(negate) {
					select.push("select=%0:%1".format(name,val));
				} else {
					var prefix = data.length === 0 ? "q=" : "";
					data.push('%0%1:"%2"'.format(prefix, name, val));
				}
			}
		});
		var dataString = data.join(" ");
		if(dataString.length === 0 && !query) {
			return false;
		}
		var selectStatement = select.join("&");
		if(dataString.length > 0 && selectStatement.length > 0) {
			dataString += "&";
		}
		dataString += selectStatement;
		return "/search?%0".format(dataString);
	},
	constructForm: function(place) {
		var locale = search.locale;
		$("<h1 />").text(locale.header).appendTo(place);
		var form = $("<form />").appendTo(place)[0];
		$('<input type="text" name="q" />').appendTo(form);
		$('<input type="submit" />').val(locale.find).appendTo(form);
		search.advancedOptions(form);
		var query = $('<h2 class="query"/>').appendTo(place)[0];
		var results = $("<div />").appendTo(place).addClass("resultsArea")[0];
		var lookup = function(url) {
			if(!url) {
				results.empty().addClass("error").text(locale.error);
				return;
			}
			config.extensions.tiddlyweb.getStatus(function(status) {
				$(query).text(locale.query);
				var href = status.server_host.url + url;
				$("<a />").attr("href", href).text(href).appendTo(query);
				tsScan.scan(results, { url: url, emptyMessage: search.locale.noResults, cache: true,
					template: "SearchTemplate", sort: "title", callback: function(tiddlers) {
						$("<h2 />").text(locale.resultsHeader.format(tiddlers.length)).prependTo(results);
					}
				});
			});
		};
		$(form).submit(function(ev) {
			ev.preventDefault();
			var url = search.constructSearchQuery(form);
			config.macros.tsSearch.lastSearch = url;
			lookup(url);
		});
		if(search.lastSearch) {
			lookup(search.lastSearch);
		}
		return form;
	},
	handler: function(place) {
		var container = $("<div />").addClass("searchForm").appendTo(place)[0];
		search.constructForm(container);
	}
};

})(jQuery);
//}}}
config.options.txtTheme = 'liquidLayoutTheme';
Click the "new tiddler" button towards the top right of the screen to write something in your space. You'll need to give it a title, some content and, optionally, some tags that will help you identify it later.

!Stuck for ideas?
Not sure what to write about? Not sure what to keep in your space? Other people use ~TiddlySpace for almost anything. How about some of the following:

* [[Save interesting sites|http://bookmarks.tiddlyspace.com]], images or articles from around the web so that you can refer back to them.
* [[Record your family tree|http://familytree.tiddlyspace.com]], store notes on long lost relatives or ancestors and map their relationship to you.
* [[Make up a pocketbook|http://pocketbook.tiddlyspace.com]] to store some useful information in, then print it out, [[fold it up|http://www.pocketmod.com/]], and take it with you.
* [[Plan your holiday|http://the-web-is-your-oyster.tiddlyspace.com/]], record where you're planning to go, note down places of interest and refer back to it later.
* [[Create a mindmap|http://mindmaps.tiddlyspace.com/]] to visualise your inner thoughts and see how they relate to each other.
* [[Set up a questionnaire|http://questionnaire.tiddlyspace.com/]] and get all your friends to answer it.

If you don't like any of those ideas, you can still use this space directly to keep notes and link them together, make a todo list and keep track of everything you're doing, or any one of a hundred million other things.

Still stuck? Check out the @featured space for more suggestions.

You can also [[socialise with others|How to socialise]].
This space provides the DocumentPreviewPlugin
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]] icons:yes'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
	<div macro='wikitoolbar'></div>
<div macro="setPrivacy"></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>
<!--}}}-->
/***
|''Name''|TiddlySpaceFilters|
|''Description''|provide TiddlySpace-specific filter extensions|
|''Author''|Jon Robson|
|''Version''|0.6.1|
|''Status''|@@beta@@|
|''CoreVersion''|2.6.2|
|''Requires''|TiddlySpaceConfig|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{
<<tsList Private>>
<<tsList Public>>