Commits

takanao ENDOH committed bc7cb36

Added jQuery.UI

Comments (0)

Files changed (2)

+diff -r dd6212239d05 setup.py
+--- a/setup.py	Thu Apr 30 00:35:37 2009 +0900
++++ b/setup.py	Thu May 07 06:20:02 2009 +0900
+@@ -16,7 +16,7 @@
+ 
+ setup(
+     name = 'Trac',
+-    version = '0.11',
++    version = '0.11-patched',
+     description = 'Integrated SCM, wiki, issue tracker and project environment',
+     long_description = """
+ Trac is a minimalistic web-based software project management and bug/issue
+@@ -44,6 +44,8 @@
+     package_data = {
+         '': ['templates/*'],
+         'trac': ['htdocs/*.*', 'htdocs/README', 'htdocs/js/*', 'htdocs/css/*',
++                 'htdocs/ext/*.js', 'htdocs/ext/js/*',
++                 'htdocs/ext/css/*.css', 'htdocs/ext/css/smoothness/*.css', 'htdocs/ext/css/smoothness/images/*',
+                  'htdocs/guide/*'],
+         'trac.wiki': ['default-pages/*'],
+         'trac.ticket': ['workflows/*.ini'],
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/222222_11x11_icon_arrows_leftright.gif
+Binary file trac/htdocs/ext/css/smoothness/images/222222_11x11_icon_arrows_leftright.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/222222_11x11_icon_arrows_updown.gif
+Binary file trac/htdocs/ext/css/smoothness/images/222222_11x11_icon_arrows_updown.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/222222_11x11_icon_doc.gif
+Binary file trac/htdocs/ext/css/smoothness/images/222222_11x11_icon_doc.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/222222_11x11_icon_minus.gif
+Binary file trac/htdocs/ext/css/smoothness/images/222222_11x11_icon_minus.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/222222_11x11_icon_plus.gif
+Binary file trac/htdocs/ext/css/smoothness/images/222222_11x11_icon_plus.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/222222_11x11_icon_resize_se.gif
+Binary file trac/htdocs/ext/css/smoothness/images/222222_11x11_icon_resize_se.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/222222_7x7_arrow_down.gif
+Binary file trac/htdocs/ext/css/smoothness/images/222222_7x7_arrow_down.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/222222_7x7_arrow_left.gif
+Binary file trac/htdocs/ext/css/smoothness/images/222222_7x7_arrow_left.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/222222_7x7_arrow_right.gif
+Binary file trac/htdocs/ext/css/smoothness/images/222222_7x7_arrow_right.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/222222_7x7_arrow_up.gif
+Binary file trac/htdocs/ext/css/smoothness/images/222222_7x7_arrow_up.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_arrows_leftright.gif
+Binary file trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_arrows_leftright.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_arrows_updown.gif
+Binary file trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_arrows_updown.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_close.gif
+Binary file trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_close.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_doc.gif
+Binary file trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_doc.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_folder_closed.gif
+Binary file trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_folder_closed.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_folder_open.gif
+Binary file trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_folder_open.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_minus.gif
+Binary file trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_minus.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_plus.gif
+Binary file trac/htdocs/ext/css/smoothness/images/454545_11x11_icon_plus.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/454545_7x7_arrow_down.gif
+Binary file trac/htdocs/ext/css/smoothness/images/454545_7x7_arrow_down.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/454545_7x7_arrow_left.gif
+Binary file trac/htdocs/ext/css/smoothness/images/454545_7x7_arrow_left.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/454545_7x7_arrow_right.gif
+Binary file trac/htdocs/ext/css/smoothness/images/454545_7x7_arrow_right.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/454545_7x7_arrow_up.gif
+Binary file trac/htdocs/ext/css/smoothness/images/454545_7x7_arrow_up.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_arrows_leftright.gif
+Binary file trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_arrows_leftright.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_arrows_updown.gif
+Binary file trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_arrows_updown.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_close.gif
+Binary file trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_close.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_doc.gif
+Binary file trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_doc.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_folder_closed.gif
+Binary file trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_folder_closed.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_folder_open.gif
+Binary file trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_folder_open.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_minus.gif
+Binary file trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_minus.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_plus.gif
+Binary file trac/htdocs/ext/css/smoothness/images/888888_11x11_icon_plus.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/888888_7x7_arrow_down.gif
+Binary file trac/htdocs/ext/css/smoothness/images/888888_7x7_arrow_down.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/888888_7x7_arrow_left.gif
+Binary file trac/htdocs/ext/css/smoothness/images/888888_7x7_arrow_left.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/888888_7x7_arrow_right.gif
+Binary file trac/htdocs/ext/css/smoothness/images/888888_7x7_arrow_right.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/888888_7x7_arrow_up.gif
+Binary file trac/htdocs/ext/css/smoothness/images/888888_7x7_arrow_up.gif has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/dadada_40x100_textures_02_glass_75.png
+Binary file trac/htdocs/ext/css/smoothness/images/dadada_40x100_textures_02_glass_75.png has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/e6e6e6_40x100_textures_02_glass_75.png
+Binary file trac/htdocs/ext/css/smoothness/images/e6e6e6_40x100_textures_02_glass_75.png has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/ffffff_40x100_textures_01_flat_75.png
+Binary file trac/htdocs/ext/css/smoothness/images/ffffff_40x100_textures_01_flat_75.png has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/images/ffffff_40x100_textures_02_glass_65.png
+Binary file trac/htdocs/ext/css/smoothness/images/ffffff_40x100_textures_02_glass_65.png has changed
+diff -r dd6212239d05 trac/htdocs/ext/css/smoothness/ui.all.css
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/trac/htdocs/ext/css/smoothness/ui.all.css	Thu May 07 06:20:02 2009 +0900
+@@ -0,0 +1,610 @@
++/*
++ * jQuery UI screen structure and presentation
++ * This CSS file was generated by ThemeRoller, a Filament Group Project for jQuery UI
++ * Author: Scott Jehl, scott@filamentgroup.com, http://www.filamentgroup.com
++ * Visit ThemeRoller.com
++*/
++
++/*
++ * Note: If your ThemeRoller settings have a font size set in ems, your components will scale according to their parent element's font size.
++ * As a rule of thumb, set your body's font size to 62.5% to make 1em = 10px.
++ * body {font-size: 62.5%;}
++*/
++
++
++
++/*UI accordion*/
++.ui-accordion {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	font-family: Verdana,Arial,sans-serif;
++	font-size: 1.1em;
++	border-bottom: 1px solid #d3d3d3;
++}
++.ui-accordion-group {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	border: 1px solid #d3d3d3;
++	border-bottom: none;
++}
++.ui-accordion-header {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	cursor: pointer;
++	background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++}
++.ui-accordion-header a {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	display: block;
++	font-size: 1em;
++	font-weight: normal;
++	text-decoration: none;
++	padding: .5em .5em .5em 1.7em;
++	color: #555555;
++	background: url(images/888888_7x7_arrow_right.gif) .5em 50% no-repeat;
++}
++.ui-accordion-header a:hover {
++	background: url(images/454545_7x7_arrow_right.gif) .5em 50% no-repeat;
++	color: #212121;
++}
++.ui-accordion-header:hover {
++	background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++	color: #212121;
++}
++.selected .ui-accordion-header, .selected .ui-accordion-header:hover {
++	background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x;
++}
++.selected .ui-accordion-header a, .selected .ui-accordion-header a:hover {
++	color: #212121;
++	background: url(images/454545_7x7_arrow_down.gif) .5em 50% no-repeat;
++}
++.ui-accordion-content {
++	background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x;
++	color: #222222;
++	font-size: 1em;
++}
++.ui-accordion-content p {
++	padding: 1em 1.7em 0.6em;
++}
++
++
++
++
++
++
++/*UI tabs*/
++.ui-tabs-nav {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	font-family: Verdana,Arial,sans-serif;
++	font-size: 1.1em;
++	float: left;
++	position: relative;
++	z-index: 1;
++	border-right: 1px solid #d3d3d3;
++	bottom: -1px;
++}
++.ui-tabs-nav ul {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++}
++.ui-tabs-nav li {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	float: left;
++	border: 1px solid #d3d3d3;
++	border-right: none;
++}
++.ui-tabs-nav li a {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	float: left;
++	font-size: 1em;
++	font-weight: normal;
++	text-decoration: none;
++	padding: .5em 1.7em;
++	color: #555555;
++	background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++}
++.ui-tabs-nav li a:hover {
++	background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++	color: #212121;
++}
++.ui-tabs-nav li.ui-tabs-selected {
++	border-bottom-color: #ffffff;
++}
++.ui-tabs-nav li.ui-tabs-selected a, .ui-tabs-nav li.ui-tabs-selected a:hover {
++	background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x;
++	color: #212121;
++}
++.ui-tabs-panel {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	font-family: Verdana,Arial,sans-serif;
++	clear:left;
++	border: 1px solid #d3d3d3;
++	background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x;
++	color: #222222;
++	padding: 1.5em 1.7em;	
++	font-size: 1.1em;
++}
++.ui-tabs-hide {
++	display: none;/* for accessible hiding: position: absolute; left: -99999999px*/;
++}
++
++
++
++
++
++/*slider*/
++.ui-slider {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	font-family: Verdana,Arial,sans-serif;
++	font-size: 1.1em;
++	background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x;
++	border: 1px solid #aaaaaa;
++	height: .8em;
++	position: relative;
++}
++.ui-slider-handle {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	position: absolute;
++	z-index: 2;
++	top: -3px;
++	width: 1.2em;
++	height: 1.2em;
++	background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++	border: 1px solid #d3d3d3;
++}
++.ui-slider-handle:hover {
++	background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++	border: 1px solid #999999;
++}
++.ui-slider-handle-active, .ui-slider-handle-active:hover {
++	background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x;
++	border: 1px solid #aaaaaa;
++}
++.ui-slider-range {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	height: .8em;
++	background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++	position: absolute;
++	border: 1px solid #d3d3d3;
++	border-left: 0;
++	border-right: 0;
++	top: -1px;
++	z-index: 1;
++	opacity:.7;
++	filter:Alpha(Opacity=70);
++}
++
++
++
++
++
++
++/*dialog*/
++.ui-dialog {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	font-family: Verdana,Arial,sans-serif;
++	font-size: 1.1em;
++	background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x;
++	color: #222222;
++	border: 4px solid #aaaaaa;
++	position: relative;
++}
++.ui-resizable-handle {
++	position: absolute;
++	font-size: 0.1px;
++	z-index: 99999;
++}
++.ui-resizable .ui-resizable-handle {
++	display: block; 
++}
++body .ui-resizable-disabled .ui-resizable-handle { display: none; } /* use 'body' to make it more specific (css order) */
++body .ui-resizable-autohide .ui-resizable-handle { display: none; } /* use 'body' to make it more specific (css order) */
++.ui-resizable-n { 
++	cursor: n-resize; 
++	height: 7px; 
++	width: 100%; 
++	top: -5px; 
++	left: 0px;  
++}
++.ui-resizable-s { 
++	cursor: s-resize; 
++	height: 7px; 
++	width: 100%; 
++	bottom: -5px; 
++	left: 0px; 
++}
++.ui-resizable-e { 
++	cursor: e-resize; 
++	width: 7px; 
++	right: -5px; 
++	top: 0px; 
++	height: 100%; 
++}
++.ui-resizable-w { 
++	cursor: w-resize; 
++	width: 7px; 
++	left: -5px; 
++	top: 0px; 
++	height: 100%;
++}
++.ui-resizable-se { 
++	cursor: se-resize; 
++	width: 13px; 
++	height: 13px; 
++	right: 0px; 
++	bottom: 0px; 
++	background: url(images/222222_11x11_icon_resize_se.gif) no-repeat 0 0;
++}
++.ui-resizable-sw { 
++	cursor: sw-resize; 
++	width: 9px; 
++	height: 9px; 
++	left: 0px; 
++	bottom: 0px;  
++}
++.ui-resizable-nw { 
++	cursor: nw-resize; 
++	width: 9px; 
++	height: 9px; 
++	left: 0px; 
++	top: 0px; 
++}
++.ui-resizable-ne { 
++	cursor: ne-resize; 
++	width: 9px; 
++	height: 9px; 
++	right: 0px; 
++	top: 0px; 
++}
++.ui-dialog-titlebar {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	padding: .5em 1.5em .5em 1em;
++	color: #555555;
++	background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++	border-bottom: 1px solid #d3d3d3;
++	font-size: 1em;
++	font-weight: normal;
++	position: relative;
++}
++.ui-dialog-title {}
++.ui-dialog-titlebar-close {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	background: url(images/888888_11x11_icon_close.gif) 0 0 no-repeat;
++	position: absolute;
++	right: 8px;
++	top: .7em;
++	width: 11px;
++	height: 11px;
++	z-index: 100;
++}
++.ui-dialog-titlebar-close-hover, .ui-dialog-titlebar-close:hover {
++	background: url(images/454545_11x11_icon_close.gif) 0 0 no-repeat;
++}
++.ui-dialog-titlebar-close:active {
++	background: url(images/454545_11x11_icon_close.gif) 0 0 no-repeat;
++}
++.ui-dialog-titlebar-close span {
++	display: none;
++}
++.ui-dialog-content {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	color: #222222;
++	padding: 1.5em 1.7em;	
++}
++.ui-dialog-buttonpane {
++	position: absolute;
++	bottom: 0;
++	width: 100%;
++	text-align: left;
++	border-top: 1px solid #aaaaaa;
++	background: #ffffff;
++}
++.ui-dialog-buttonpane button {
++	margin: .5em 0 .5em 8px;
++	color: #555555;
++	background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++	font-size: 1em;
++	border: 1px solid #d3d3d3;
++	cursor: pointer;
++	padding: .2em .6em .3em .6em;
++	line-height: 1.4em;
++}
++.ui-dialog-buttonpane button:hover {
++	color: #212121;
++	background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++	border: 1px solid #999999;
++}
++.ui-dialog-buttonpane button:active {
++	color: #212121;
++	background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x;
++	border: 1px solid #aaaaaa;
++}
++/* This file skins dialog */
++.ui-dialog.ui-draggable .ui-dialog-titlebar,
++.ui-dialog.ui-draggable .ui-dialog-titlebar {
++	cursor: move;
++}
++
++
++
++
++
++
++
++/*datepicker*/
++/* Main Style Sheet for jQuery UI date picker */
++.ui-datepicker-div, .ui-datepicker-inline, #ui-datepicker-div {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	font-family: Verdana,Arial,sans-serif;
++	background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x;
++	font-size: 1.1em;
++	border: 4px solid #aaaaaa;
++	width: 15.5em;
++	padding: 2.5em .5em .5em .5em;
++	position: relative;
++}
++.ui-datepicker-div, #ui-datepicker-div {
++	z-index: 9999; /*must have*/
++	display: none;
++}
++.ui-datepicker-inline {
++	float: left;
++	display: block;
++}
++.ui-datepicker-control {
++	display: none;
++}
++.ui-datepicker-current {
++	display: none;
++}
++.ui-datepicker-next, .ui-datepicker-prev {
++	position: absolute;
++	left: .5em;
++	top: .5em;
++	background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++}
++.ui-datepicker-next {
++	left: 14.6em;
++}
++.ui-datepicker-next:hover, .ui-datepicker-prev:hover {
++	background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++}
++.ui-datepicker-next a, .ui-datepicker-prev a {
++	text-indent: -999999px;
++	width: 1.3em;
++	height: 1.4em;
++	display: block;
++	font-size: 1em;
++	background: url(images/888888_7x7_arrow_left.gif) 50% 50% no-repeat;
++	border: 1px solid #d3d3d3;
++	cursor: pointer;
++}
++.ui-datepicker-next a {
++	background: url(images/888888_7x7_arrow_right.gif) 50% 50% no-repeat;
++}
++.ui-datepicker-prev a:hover {
++	background: url(images/454545_7x7_arrow_left.gif) 50% 50% no-repeat;
++}
++.ui-datepicker-next a:hover {
++	background: url(images/454545_7x7_arrow_right.gif) 50% 50% no-repeat;
++}
++.ui-datepicker-prev a:active {
++	background: url(images/454545_7x7_arrow_left.gif) 50% 50% no-repeat;
++}
++.ui-datepicker-next a:active {
++	background: url(images/454545_7x7_arrow_right.gif) 50% 50% no-repeat;
++}
++.ui-datepicker-header select {
++	border: 1px solid #d3d3d3;
++	color: #555555;
++	background: #e6e6e6;
++	font-size: 1em;
++	line-height: 1.4em;
++	position: absolute;
++	top: .5em;
++	margin: 0 !important;
++}
++.ui-datepicker-header option:focus, .ui-datepicker-header option:hover {
++	background: #dadada;
++}
++.ui-datepicker-header select.ui-datepicker-new-month {
++	width: 7em;
++	left: 2.2em;
++}
++.ui-datepicker-header select.ui-datepicker-new-year {
++	width: 5em;
++	left: 9.4em;
++}
++table.ui-datepicker {
++	width: 15.5em;
++	text-align: right;
++}
++table.ui-datepicker td a {
++	padding: .1em .3em .1em 0;
++	display: block;
++	color: #555555;
++	background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++	cursor: pointer;
++	border: 1px solid #ffffff;
++}
++table.ui-datepicker td a:hover {
++	border: 1px solid #999999;
++	color: #212121;
++	background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++}
++table.ui-datepicker td a:active {
++	border: 1px solid #aaaaaa;
++	color: #212121;
++	background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x;
++}
++table.ui-datepicker .ui-datepicker-title-row td {
++	padding: .3em 0;
++	text-align: center;
++	font-size: .9em;
++	color: #222222;
++	text-transform: uppercase;
++}
++table.ui-datepicker .ui-datepicker-title-row td a {
++	color: #222222;
++}
++.ui-datepicker-cover {
++	display: none;
++	display/**/: block;
++	position: absolute;
++	z-index: -1;
++	filter: mask();
++	top: -4px;
++	left: -4px;
++	width: 193px;
++	height: 200px;
++}
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++/*
++Generic ThemeRoller Classes
++>> Make your jQuery Components ThemeRoller-Compatible!
++*/
++
++/*component global class*/
++.ui-component {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++	font-family: Verdana,Arial,sans-serif;
++	font-size: 1.1em;
++}
++/*component content styles*/
++.ui-component-content {
++	border: 1px solid #aaaaaa;
++	background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 0 0 repeat-x;
++	color: #222222;
++}
++.ui-component-content a {
++	color: #222222;
++	text-decoration: underline;
++}
++/*component states*/
++.ui-default-state {
++	border: 1px solid #d3d3d3;
++	background: #e6e6e6 url(images/e6e6e6_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++	font-weight: normal;
++	color: #555555 !important;
++}
++.ui-default-state a {
++	color: #555555;
++}
++.ui-default-state:hover, .ui-hover-state {
++	border: 1px solid #999999;
++	background: #dadada url(images/dadada_40x100_textures_02_glass_75.png) 0 50% repeat-x;
++	font-weight: normal;
++	color: #212121 !important;
++}
++.ui-hover-state a {
++	color: #212121;
++}
++.ui-default-state:active, .ui-active-state {
++	border: 1px solid #aaaaaa;
++	background: #ffffff url(images/ffffff_40x100_textures_02_glass_65.png) 0 50% repeat-x;
++	font-weight: normal;
++	color: #212121 !important;
++	outline: none;
++}
++.ui-active-state a {
++	color: #212121;
++	outline: none;
++}
++/*icons*/
++.ui-arrow-right-default {background: url(images/888888_7x7_arrow_right.gif) no-repeat 50% 50%;}
++.ui-arrow-right-default:hover, .ui-arrow-right-hover {background: url(images/454545_7x7_arrow_right.gif) no-repeat 50% 50%;}
++.ui-arrow-right-default:active, .ui-arrow-right-active {background: url(images/454545_7x7_arrow_right.gif) no-repeat 50% 50%;}
++.ui-arrow-right-content {background: url(images/222222_7x7_arrow_right.gif) no-repeat 50% 50%;}
++
++.ui-arrow-left-default {background: url(images/888888_7x7_arrow_left.gif) no-repeat 50% 50%;}
++.ui-arrow-left-default:hover, .ui-arrow-left-hover {background: url(images/454545_7x7_arrow_left.gif) no-repeat 50% 50%;}
++.ui-arrow-left-default:active, .ui-arrow-left-active {background: url(images/454545_7x7_arrow_left.gif) no-repeat 50% 50%;}
++.ui-arrow-left-content {background: url(images/222222_7x7_arrow_left.gif) no-repeat 50% 50%;}
++
++.ui-arrow-down-default {background: url(images/888888_7x7_arrow_down.gif) no-repeat 50% 50%;}
++.ui-arrow-down-default:hover, .ui-arrow-down-hover {background: url(images/454545_7x7_arrow_down.gif) no-repeat 50% 50%;}
++.ui-arrow-down-default:active, .ui-arrow-down-active {background: url(images/454545_7x7_arrow_down.gif) no-repeat 50% 50%;}
++.ui-arrow-down-content {background: url(images/222222_7x7_arrow_down.gif) no-repeat 50% 50%;}
++
++.ui-arrow-up-default {background: url(images/888888_7x7_arrow_up.gif) no-repeat 50% 50%;}
++.ui-arrow-up-default:hover, .ui-arrow-up-hover {background: url(images/454545_7x7_arrow_up.gif) no-repeat 50% 50%;}
++.ui-arrow-up-default:active, .ui-arrow-up-active {background: url(images/454545_7x7_arrow_up.gif) no-repeat 50% 50%;}
++.ui-arrow-up-content {background: url(images/222222_7x7_arrow_up.gif) no-repeat 50% 50%;}
++
++.ui-close-default {background: url(images/888888_11x11_icon_close.gif) no-repeat 50% 50%;}
++.ui-close-default:hover, .ui-close-hover {background: url(images/454545_11x11_icon_close.gif) no-repeat 50% 50%;}
++.ui-close-default:active, .ui-close-active {background: url(images/454545_11x11_icon_close.gif) no-repeat 50% 50%;}
++.ui-close-content {background: url(images/454545_11x11_icon_close.gif) no-repeat 50% 50%;}
++
++.ui-folder-closed-default {background: url(images/888888_11x11_icon_folder_closed.gif) no-repeat 50% 50%;}
++.ui-folder-closed-default:hover, .ui-folder-closed-hover {background: url(images/454545_11x11_icon_folder_closed.gif) no-repeat 50% 50%;}
++.ui-folder-closed-default:active, .ui-folder-closed-active {background: url(images/454545_11x11_icon_folder_closed.gif) no-repeat 50% 50%;}
++.ui-folder-closed-content {background: url(images/888888_11x11_icon_folder_closed.gif) no-repeat 50% 50%;}
++
++.ui-folder-open-default {background: url(images/888888_11x11_icon_folder_open.gif) no-repeat 50% 50%;}
++.ui-folder-open-default:hover, .ui-folder-open-hover {background: url(images/454545_11x11_icon_folder_open.gif) no-repeat 50% 50%;}
++.ui-folder-open-default:active, .ui-folder-open-active {background: url(images/454545_11x11_icon_folder_open.gif) no-repeat 50% 50%;}
++.ui-folder-open-content {background: url(images/454545_11x11_icon_folder_open.gif) no-repeat 50% 50%;}
++
++.ui-doc-default {background: url(images/888888_11x11_icon_doc.gif) no-repeat 50% 50%;}
++.ui-doc-default:hover, .ui-doc-hover {background: url(images/454545_11x11_icon_doc.gif) no-repeat 50% 50%;}
++.ui-doc-default:active, .ui-doc-active {background: url(images/454545_11x11_icon_doc.gif) no-repeat 50% 50%;}
++.ui-doc-content {background: url(images/222222_11x11_icon_doc.gif) no-repeat 50% 50%;}
++
++.ui-arrows-leftright-default {background: url(images/888888_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;}
++.ui-arrows-leftright-default:hover, .ui-arrows-leftright-hover {background: url(images/454545_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;}
++.ui-arrows-leftright-default:active, .ui-arrows-leftright-active {background: url(images/454545_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;}
++.ui-arrows-leftright-content {background: url(images/222222_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;}
++
++.ui-arrows-updown-default {background: url(images/888888_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;}
++.ui-arrows-updown-default:hover, .ui-arrows-updown-hover {background: url(images/454545_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;}
++.ui-arrows-updown-default:active, .ui-arrows-updown-active {background: url(images/454545_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;}
++.ui-arrows-updown-content {background: url(images/222222_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;}
++
++.ui-minus-default {background: url(images/888888_11x11_icon_minus.gif) no-repeat 50% 50%;}
++.ui-minus-default:hover, .ui-minus-hover {background: url(images/454545_11x11_icon_minus.gif) no-repeat 50% 50%;}
++.ui-minus-default:active, .ui-minus-active {background: url(images/454545_11x11_icon_minus.gif) no-repeat 50% 50%;}
++.ui-minus-content {background: url(images/222222_11x11_icon_minus.gif) no-repeat 50% 50%;}
++
++.ui-plus-default {background: url(images/888888_11x11_icon_plus.gif) no-repeat 50% 50%;}
++.ui-plus-default:hover, .ui-plus-hover {background: url(images/454545_11x11_icon_plus.gif) no-repeat 50% 50%;}
++.ui-plus-default:active, .ui-plus-active {background: url(images/454545_11x11_icon_plus.gif) no-repeat 50% 50%;}
++.ui-plus-content {background: url(images/222222_11x11_icon_plus.gif) no-repeat 50% 50%;}
++
++/*hidden elements*/
++.ui-hidden {
++	display: none;/* for accessible hiding: position: absolute; left: -99999999px*/;
++}
++.ui-accessible-hidden {
++	 position: absolute; left: -99999999px;
++}
++/*reset styles*/
++.ui-reset {
++	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
++}
++/*clearfix class*/
++.ui-clearfix:after {
++    content: "."; 
++    display: block; 
++    height: 0; 
++    clear: both; 
++    visibility: hidden;
++}
++.ui-clearfix {display: inline-block;}
++/* Hides from IE-mac \*/
++* html .ui-clearfix {height: 1%;}
++.ui-clearfix {display: block;}
++/* End hide from IE-mac */
++
++/* Note: for resizable styles, use the styles listed above in the dialog section */
++
++
+diff -r dd6212239d05 trac/htdocs/ext/js/jquery-ui-1.6.custom.min.js
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/trac/htdocs/ext/js/jquery-ui-1.6.custom.min.js	Thu May 07 06:20:02 2009 +0900
+@@ -0,0 +1,20 @@
++/*
++ * jQuery UI 1.6
++ *
++ * Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about)
++ * Dual licensed under the MIT (MIT-LICENSE.txt)
++ * and GPL (GPL-LICENSE.txt) licenses.
++ *
++ * http://docs.jquery.com/UI
++ */
++ * jQuery UI Datepicker 1.6
++ *
++ * Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about)
++ * Dual licensed under the MIT (MIT-LICENSE.txt)
++ * and GPL (GPL-LICENSE.txt) licenses.
++ *
++ * http://docs.jquery.com/UI/Datepicker
++ *
++ * Depends:
++ *	ui.core.js
++ */
+\ No newline at end of file
+diff -r dd6212239d05 trac/htdocs/ext/ui/ui.core.js
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/trac/htdocs/ext/ui/ui.core.js	Thu May 07 06:20:02 2009 +0900
+@@ -0,0 +1,527 @@
++/*
++ * jQuery UI @VERSION
++ *
++ * Copyright (c) 2009 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($) {
++
++var _remove = $.fn.remove,
++	isFF2 = $.browser.mozilla && (parseFloat($.browser.version) < 1.9);
++
++//Helper functions and ui object
++$.ui = {
++	version: "@VERSION",
++
++	// $.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: {
++		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
++	}
++};
++
++// WAI-ARIA normalization
++if (isFF2) {
++	var attr = $.attr,
++		removeAttr = $.fn.removeAttr,
++		ariaNS = "http://www.w3.org/2005/07/aaa",
++		ariaState = /^aria-/,
++		ariaRole = /^wairole:/;
++
++	$.attr = function(elem, name, value) {
++		var set = value !== undefined;
++
++		return (name == 'role'
++			? (set
++				? attr.call(this, elem, name, "wairole:" + value)
++				: (attr.apply(this, arguments) || "").replace(ariaRole, ""))
++			: (ariaState.test(name)
++				? (set
++					? elem.setAttributeNS(ariaNS,
++						name.replace(ariaState, "aaa:"), value)
++					: attr.call(this, elem, name.replace(ariaState, "aaa:")))
++				: attr.apply(this, arguments)));
++	};
++
++	$.fn.removeAttr = function(name) {
++		return (ariaState.test(name)
++			? this.each(function() {
++				this.removeAttributeNS(ariaNS, name.replace(ariaState, ""));
++			}) : removeAttr.call(this, name));
++	};
++}
++
++//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);
++	},
++	
++	remove: function() {
++		// Safari has a native remove event which actually removes DOM elements,
++		// so we have to use triggerHandler instead of trigger (#3037).
++		$("*", this).add(this).each(function() {
++			$(this).triggerHandler("remove");
++		});
++		return _remove.apply(this, arguments );
++	},
++
++	enableSelection: function() {
++		return this
++			.attr('unselectable', 'off')
++			.css('MozUserSelect', '')
++			.unbind('selectstart.ui');
++	},
++
++	disableSelection: function() {
++		return this
++			.attr('unselectable', 'on')
++			.css('MozUserSelect', 'none')
++			.bind('selectstart.ui', function() { return false; });
++	},
++
++	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;
++	}
++});
++
++
++//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');
++	}
++});
++
++
++// $.widget is a factory to create jQuery plugins
++// taking some boilerplate code out of the plugin code
++$.widget = function(name, prototype) {
++	var namespace = name.split(".")[0],
++		fullName;
++	name = name.split(".")[1];
++	fullName = namespace + '-' + name;
++
++	// create selector for plugin
++	$.expr[':'][fullName] = function(elem) {
++		return !!$.data(elem, name);
++	};
++	
++	// create plugin method
++	$.fn[name] = function(options) {
++		var isMethodCall = (typeof options == 'string'),
++			args = Array.prototype.slice.call(arguments, 1),
++			returnValue = this;
++
++		// prevent calls to internal methods
++		if (isMethodCall && options.substring(0, 1) == '_') {
++			return returnValue;
++		}
++
++		(isMethodCall
++			? this.each(function() {
++				var instance = $.data(this, name),
++					methodValue = (instance && $.isFunction(instance[options])
++						? instance[options].apply(instance, args)
++						: instance);
++				if (methodValue !== instance) {
++					returnValue = methodValue;
++					return false;
++				}
++			})
++			: this.each(function() {
++				($.data(this, name) ||
++					$.data(this, name, new $[namespace][name](this, options))._init());
++			}));
++
++		return returnValue;
++	};
++
++	// create widget constructor
++	$[namespace] = $[namespace] || {};
++	$[namespace][name] = function(element, options) {
++		var self = this;
++
++		this.namespace = namespace;
++		this.widgetName = name;
++		this.widgetEventPrefix = $[namespace][name].eventPrefix || name;
++		this.widgetBaseClass = fullName;
++
++		this.options = $.extend(true, {},
++			$.widget.defaults,
++			$[namespace][name].defaults,
++			$.metadata && $.metadata.get(element)[name],
++			options);
++
++		this.element = $(element)
++			.bind('setData.' + name, function(event, key, value) {
++				if (event.target == element) {
++					return self._setData(key, value);
++				}
++			})
++			.bind('getData.' + name, function(event, key) {
++				if (event.target == element) {
++					return self._getData(key);
++				}
++			})
++			.bind('remove', function() {
++				return self.destroy();
++			});
++	};
++
++	// add widget prototype
++	$[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype);
++};
++
++$.widget.prototype = {
++	_init: function() {},
++	destroy: function() {
++		this.element.removeData(this.widgetName)
++			.removeClass(this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled')
++			.removeAttr('aria-disabled');
++
++		return this;
++	},
++
++	option: function(key, value) {
++		var options = key,
++			self = this;
++
++		if (typeof key == "string") {
++			if (value === undefined) {
++				return this._getData(key);
++			}
++			options = {};
++			options[key] = value;
++		}
++
++		$.each(options, function(key, value) {
++			self._setData(key, value);
++		});
++
++		return self;
++	},
++	_getData: function(key) {
++		return this.options[key];
++	},
++	_setData: function(key, value) {
++		this.options[key] = value;
++
++		if (key == 'disabled') {
++			this.element
++				[value ? 'addClass' : 'removeClass'](
++					this.widgetBaseClass + '-disabled' + ' ' +
++					this.namespace + '-state-disabled')
++				.attr("aria-disabled", value);
++		}
++	},
++
++	enable: function() {
++		this._setData('disabled', false);
++		return this;
++	},
++	disable: function() {
++		this._setData('disabled', true);
++		return this;
++	},
++
++	_trigger: function(type, event, data) {
++		var callback = this.options[type],
++			eventName = (type == this.widgetEventPrefix
++				? type : this.widgetEventPrefix + type);
++
++		event = $.Event(event);
++		event.type = eventName;
++
++		// 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());
++	}
++};
++
++$.widget.defaults = {
++	disabled: false
++};
++
++
++/** Mouse Interaction Plugin **/
++
++$.ui.mouse = {
++	_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;
++				}
++			});
++
++		// Prevent text selection in IE
++		if ($.browser.msie) {
++			this._mouseUnselectable = this.element.attr('unselectable');
++			this.element.attr('unselectable', 'on');
++		}
++
++		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);
++
++		// Restore text selection in IE
++		($.browser.msie
++			&& this.element.attr('unselectable', this._mouseUnselectable));
++	},
++
++	_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; }
++};
++
++$.ui.mouse.defaults = {
++	cancel: null,
++	distance: 1,
++	delay: 0
++};
++
++})(jQuery);
+diff -r dd6212239d05 trac/htdocs/ext/ui/ui.datepicker.js
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/trac/htdocs/ext/ui/ui.datepicker.js	Thu May 07 06:20:02 2009 +0900
+@@ -0,0 +1,1637 @@
++/*
++ * jQuery UI Datepicker @VERSION
++ *
++ * Copyright (c) 2009 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:
++ *	ui.core.js
++ */
++
++(function($) { // hide the namespace
++
++$.extend($.ui, { datepicker: { version: "@VERSION" } });
++
++var PROP_NAME = 'datepicker';
++
++/* 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
++		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: '-10:+10', // Range of years to display in drop-down,
++			// either relative to current year (-nn:+nn) or absolute (nnnn:nnnn)
++		showOtherMonths: false, // True to show dates in other months, false to leave blank
++		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: 'normal', // 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
++	};
++	$.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);
++	},
++
++	/* 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(/([:\[\]\.])/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;
++		var appendText = this._get(inst, 'appendText');
++		var isRTL = this._get(inst, 'isRTL');
++		if (appendText) {
++			inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
++			input[isRTL ? 'before' : 'after'](inst.append);
++		}
++		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 == target)
++					$.datepicker._hideDatepicker();
++				else
++					$.datepicker._showDatepicker(target);
++				return false;
++			});
++		}
++		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);
++			});
++		$.data(target, PROP_NAME, inst);
++	},
++
++	/* 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));
++		this._updateDatepicker(inst);
++		this._updateAlternate(inst);
++	},
++
++	/* Pop-up the date picker in a "dialog" box.
++	   @param  input     element - ignored
++	   @param  dateText  string - the initial date to display (in the current format)
++	   @param  onSelect  function - the function(dateText) 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, dateText, onSelect, settings, pos) {
++		var inst = this._dialogInst; // internal instance
++		if (!inst) {
++			var id = 'dp' + (++this.uuid);
++			this._dialogInput = $('<input type="text" id="' + id +
++				'" size="1" style="position: absolute; top: -100px;"/>');
++			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 || {});
++		this._dialogInput.val(dateText);
++
++		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] + '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(null);
++			}
++			var date = this._getDateDatepicker(target);
++			extendRemove(inst.settings, settings);
++			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
++	   @return Date - the current date */
++	_getDateDatepicker: function(target) {
++		var inst = this._getInst(target);
++		if (inst && !inst.inline)
++			this._setDateFromField(inst);
++		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(null, '');
++						break; // hide on tab out
++				case 13: var sel = $('td.' + $.datepicker._dayOverClass +
++							', td.' + $.datepicker._currentClass, inst.dpDiv);
++						if (sel[0])
++							$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
++						else
++							$.datepicker._hideDatepicker(null, $.datepicker._get(inst, 'duration'));
++						return false; // don't submit the form
++						break; // select the value on enter
++				case 27: $.datepicker._hideDatepicker(null, $.datepicker._get(inst, 'duration'));
++						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);
++		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);
++		var beforeShow = $.datepicker._get(inst, 'beforeShow');
++		extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
++		$.datepicker._hideDatepicker(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') || 'show';
++			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()});
++			};
++			if ($.effects && $.effects[showAnim])
++				inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
++			else
++				inst.dpDiv[showAnim](duration, postProcess);
++			if (duration == '')
++				postProcess();
++			if (inst.input[0].type != 'hidden')
++				inst.input[0].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.input && inst.input[0].type != 'hidden' && inst == $.datepicker._curInst)
++			$(inst.input[0]).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 -= (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? Math.abs(offset.left + dpWidth - viewWidth) : 0;
++		offset.top -= (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? Math.abs(offset.top + dpHeight + inputHeight*2 - viewHeight) : 0;
++
++		return offset;
++	},
++
++	/* Find an object's position on the screen. */
++	_findPos: function(obj) {
++        while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
++            obj = obj.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
++	   @param  duration  string - the duration over which to close the date picker */
++	_hideDatepicker: function(input, duration) {
++		var inst = this._curInst;
++		if (!inst || (input && inst != $.data(input, PROP_NAME)))
++			return;
++		if (this._datepickerShowing) {
++			duration = (duration != null ? duration : this._get(inst, 'duration'));
++			var showAnim = this._get(inst, 'showAnim');
++			var postProcess = function() {
++				$.datepicker._tidyDialog(inst);
++			};
++			if (duration != '' && $.effects && $.effects[showAnim])
++				inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'),
++					duration, postProcess);
++			else
++				inst.dpDiv[(duration == '' ? 'hide' : (showAnim == 'slideDown' ? 'slideUp' :
++					(showAnim == 'fadeIn' ? 'fadeOut' : 'hide')))](duration, postProcess);
++			if (duration == '')
++				this._tidyDialog(inst);
++			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;
++		}
++		this._curInst = null;
++	},
++
++	/* 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.parents('#' + $.datepicker._mainDivId).length == 0) &&
++				!$target.hasClass($.datepicker.markerClassName) &&
++				!$target.hasClass($.datepicker._triggerClass) &&
++				$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
++			$.datepicker._hideDatepicker(null, '');
++	},
++
++	/* 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[0].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(null, this._get(inst, 'duration'));
++			this._lastInput = inst.input[0];
++			if (typeof(inst.input[0]) != 'object')
++				inst.input[0].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);
++			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;