Added missing dirs
authorLeonidas Poulopoulos <leopoul@noc.grnet.gr>
Sun, 20 Nov 2011 08:26:38 +0000 (10:26 +0200)
committerLeonidas Poulopoulos <leopoul@noc.grnet.gr>
Sun, 20 Nov 2011 08:26:38 +0000 (10:26 +0200)
110 files changed:
static/Flashlight.swf [new file with mode: 0644]
static/Running.png [new file with mode: 0644]
static/Stopped.png [new file with mode: 0644]
static/background_grnet.png [new file with mode: 0644]
static/css/base.css [new file with mode: 0644]
static/css/mobile.css [new file with mode: 0644]
static/css/overcast/images/ui-bg_flat_0_aaaaaa_40x100.png [new file with mode: 0644]
static/css/overcast/images/ui-bg_flat_0_eeeeee_40x100.png [new file with mode: 0644]
static/css/overcast/images/ui-bg_flat_55_c0402a_40x100.png [new file with mode: 0644]
static/css/overcast/images/ui-bg_flat_55_eeeeee_40x100.png [new file with mode: 0644]
static/css/overcast/images/ui-bg_glass_100_f8f8f8_1x400.png [new file with mode: 0644]
static/css/overcast/images/ui-bg_glass_35_dddddd_1x400.png [new file with mode: 0644]
static/css/overcast/images/ui-bg_glass_60_eeeeee_1x400.png [new file with mode: 0644]
static/css/overcast/images/ui-bg_inset-hard_75_999999_1x100.png [new file with mode: 0644]
static/css/overcast/images/ui-bg_inset-soft_50_c9c9c9_1x100.png [new file with mode: 0644]
static/css/overcast/images/ui-icons_3383bb_256x240.png [new file with mode: 0644]
static/css/overcast/images/ui-icons_454545_256x240.png [new file with mode: 0644]
static/css/overcast/images/ui-icons_70b2e1_256x240.png [new file with mode: 0644]
static/css/overcast/images/ui-icons_999999_256x240.png [new file with mode: 0644]
static/css/overcast/images/ui-icons_fbc856_256x240.png [new file with mode: 0644]
static/css/overcast/jquery-ui-1.8.12.custom.css [new file with mode: 0644]
static/css/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png [new file with mode: 0644]
static/css/redmond/images/ui-bg_flat_55_fbec88_40x100.png [new file with mode: 0644]
static/css/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png [new file with mode: 0644]
static/css/redmond/images/ui-bg_glass_85_dfeffc_1x400.png [new file with mode: 0644]
static/css/redmond/images/ui-bg_glass_95_fef1ec_1x400.png [new file with mode: 0644]
static/css/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png [new file with mode: 0644]
static/css/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png [new file with mode: 0644]
static/css/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png [new file with mode: 0644]
static/css/redmond/images/ui-icons_217bc0_256x240.png [new file with mode: 0644]
static/css/redmond/images/ui-icons_2e83ff_256x240.png [new file with mode: 0644]
static/css/redmond/images/ui-icons_469bdd_256x240.png [new file with mode: 0644]
static/css/redmond/images/ui-icons_6da8d5_256x240.png [new file with mode: 0644]
static/css/redmond/images/ui-icons_cd0a0a_256x240.png [new file with mode: 0644]
static/css/redmond/images/ui-icons_d8e7f3_256x240.png [new file with mode: 0644]
static/css/redmond/images/ui-icons_f9bd01_256x240.png [new file with mode: 0644]
static/css/redmond/jquery-ui-1.8.12.custom.css [new file with mode: 0644]
static/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png [new file with mode: 0644]
static/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png [new file with mode: 0644]
static/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png [new file with mode: 0644]
static/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png [new file with mode: 0644]
static/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png [new file with mode: 0644]
static/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png [new file with mode: 0644]
static/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png [new file with mode: 0644]
static/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png [new file with mode: 0644]
static/css/smoothness/images/ui-icons_222222_256x240.png [new file with mode: 0644]
static/css/smoothness/images/ui-icons_2e83ff_256x240.png [new file with mode: 0644]
static/css/smoothness/images/ui-icons_454545_256x240.png [new file with mode: 0644]
static/css/smoothness/images/ui-icons_888888_256x240.png [new file with mode: 0644]
static/css/smoothness/images/ui-icons_cd0a0a_256x240.png [new file with mode: 0644]
static/css/smoothness/jquery-ui-1.8.13.custom.css [new file with mode: 0644]
static/django.gif [new file with mode: 0644]
static/grnet_logo.png [new file with mode: 0644]
static/header.png [new file with mode: 0644]
static/javavnc/VncViewer.jar [new file with mode: 0644]
static/javavnc/hs_err_pid1450.log [new file with mode: 0644]
static/js/jquery-1.5.1.min.js [new file with mode: 0644]
static/js/jquery-ui-1.8.12.custom.min.js [new file with mode: 0644]
static/js/jquery.dataTables.js [new file with mode: 0644]
static/js/jquery.min.js [new file with mode: 0644]
static/lock.png [new file with mode: 0644]
static/m_grnet_logo.png [new file with mode: 0644]
static/rule.png [new file with mode: 0644]
static/vncviewer.jar [new file with mode: 0644]
templates/403.html [new file with mode: 0644]
templates/404.html [new file with mode: 0644]
templates/500.html [new file with mode: 0644]
templates/application_list.html [new file with mode: 0644]
templates/application_rejected_mail.txt [new file with mode: 0644]
templates/apply.html [new file with mode: 0644]
templates/apply_mail.txt [new file with mode: 0644]
templates/base.html [new file with mode: 0644]
templates/cluster.html [new file with mode: 0644]
templates/flatpages/default.html [new file with mode: 0644]
templates/index.html [new file with mode: 0644]
templates/instance.html [new file with mode: 0644]
templates/instance_actions.html [new file with mode: 0644]
templates/instance_created_mail.txt [new file with mode: 0644]
templates/instance_owners.html [new file with mode: 0644]
templates/login.html [new file with mode: 0644]
templates/m_base.html [new file with mode: 0644]
templates/m_cluster.html [new file with mode: 0644]
templates/m_index.html [new file with mode: 0644]
templates/m_instance.html [new file with mode: 0644]
templates/m_login.html [new file with mode: 0644]
templates/mail_change.html [new file with mode: 0644]
templates/name_change.html [new file with mode: 0644]
templates/pass_change.html [new file with mode: 0644]
templates/pass_change_done.html [new file with mode: 0644]
templates/profile.html [new file with mode: 0644]
templates/registration/activate.html [new file with mode: 0644]
templates/registration/activation_complete.html [new file with mode: 0644]
templates/registration/activation_complete.txt [new file with mode: 0644]
templates/registration/activation_complete_subject.txt [new file with mode: 0644]
templates/registration/activation_email.txt [new file with mode: 0644]
templates/registration/activation_email_subject.txt [new file with mode: 0644]
templates/registration/password_change_form.html [new file with mode: 0644]
templates/registration/password_reset_complete.html [new file with mode: 0644]
templates/registration/password_reset_confirm.html [new file with mode: 0644]
templates/registration/password_reset_done.html [new file with mode: 0644]
templates/registration/password_reset_email.html [new file with mode: 0644]
templates/registration/password_reset_form.html [new file with mode: 0644]
templates/registration/registration_complete.html [new file with mode: 0644]
templates/registration/registration_form.html [new file with mode: 0644]
templates/review.html [new file with mode: 0644]
templates/user_keys.html [new file with mode: 0644]
templates/user_routes.html [new file with mode: 0644]
templates/vnc.html [new file with mode: 0644]
utils/__init__.py [new file with mode: 0644]
utils/proxy.py [new file with mode: 0644]

diff --git a/static/Flashlight.swf b/static/Flashlight.swf
new file mode 100644 (file)
index 0000000..0cf6f0c
Binary files /dev/null and b/static/Flashlight.swf differ
diff --git a/static/Running.png b/static/Running.png
new file mode 100644 (file)
index 0000000..0454872
Binary files /dev/null and b/static/Running.png differ
diff --git a/static/Stopped.png b/static/Stopped.png
new file mode 100644 (file)
index 0000000..58a04d5
Binary files /dev/null and b/static/Stopped.png differ
diff --git a/static/background_grnet.png b/static/background_grnet.png
new file mode 100644 (file)
index 0000000..a46e1cf
Binary files /dev/null and b/static/background_grnet.png differ
diff --git a/static/css/base.css b/static/css/base.css
new file mode 100644 (file)
index 0000000..1f9567d
--- /dev/null
@@ -0,0 +1,1020 @@
+* {
+    font-family: arial, freesans, clean, sans-serif;
+    font-size: 12px;
+}
+
+html {
+    height: 100% color: black;
+}
+
+#page_wrapper {
+    margin-left: auto;
+    margin-right: auto;
+    width: 1000px;
+    padding-top: 1em;
+}
+
+.errorlist li {
+    color: red;
+    font-size: 12px !important;
+    margin: 0 0 3px;
+    padding: 4px 5px 4px 25px;
+       list-style: none outside none;
+}
+
+.error{
+       color: red;
+       font-weight: bold;
+}
+
+#password_change_form label{
+       display: block;
+    float: left;
+    padding: 3px 10px 0 0;
+    width: 13em;
+}
+
+a {
+    color: #4183C4;
+    text-decoration: none;
+    font-weight: bold;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+#main {
+    background: url("/static/background_grnet.png") repeat-x scroll 0 0 #FFFFFF;
+    padding: 0;
+    margin: 0;
+}
+
+#header {
+    height: 85px;
+    margin: 0 auto;
+    width: 990px;
+}
+
+.logoimg {
+    border: 0 none;
+    position: absolute;
+    left: 0;
+    top: 0;
+}
+
+#header .grnetlogo {
+    left: 10px;
+    top: 18px;
+    position: relative;
+}
+
+.loginform {
+    border-top: medium none;
+    font-size: 12px;
+    padding: 2px;
+    float: right;
+    -moz-border-radius: 5px 5px 5px 5px;
+    border-radius: 5px;
+    -webkit-border-radius: 5px;
+    -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+       background: url("/static/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png") repeat-x scroll 50% 50% #E6E6E6;
+    border-color: #E9E9E9 #E9E9E9 #F5F5F5;
+    border-style: solid;
+    border-width: 1px;
+       right: 10px;
+    position: relative;
+    top: -20px;
+
+       
+
+       
+}
+
+.topmenuuser{
+       padding: 4px;
+}
+
+.topmenuaction{
+       padding: 4px;
+       background: url("/static/rule.png") no-repeat scroll 0 50% transparent;
+}
+
+body {
+       padding-bottom: 2em;
+       background: white;
+       margin: 0;
+}
+
+#content {
+       width: 990px;
+       margin-left: auto;
+       margin-right: auto;
+       clear: both;
+       background: #fafafa;
+        border: 2px solid #FFFFFF;
+    -moz-border-radius: 10px 10px 10px 10px;
+       border-raduis: 10px;
+       -webkit-border-radius: 10px;
+    -moz-box-shadow: 0 0 3px #AAAAAA;
+       -webkit-box-shadow: 0 0 3px #AAAAAA;
+       box-shadow: 0 0 3px #AAAAAA;
+    background-color: #F9F9F9;
+       overflow: hidden;
+       padding-bottom: 5px;
+       padding-left: 5px;
+       min-height: 200px;
+}
+
+#title, #title a {
+       font-size: 18px;
+       font-weight: bold;
+       color: #656565;
+       top: 25px;
+       left: 50px;
+       position: relative;
+       width: 300px;   
+}
+
+#menu {
+       height: 28px;
+       padding-top: 5px;
+}
+
+#menu ul {
+       padding: 0;
+       margin: 0;
+       list-style-type: none;
+       display: inline;
+}
+
+#menu ul li {
+       padding-left: 20px;
+       display: inline;
+}
+
+#menu ul li a {
+       color: white;
+       text-decoration: none;
+}
+
+#menu ul li a:hover {
+       font-weight: bold;
+}
+
+.conf_table ul {
+       padding: 0;
+       margin: 0;
+       list-style-type: none;
+       display: inline;
+}
+
+#footer, #footer a {
+       clear: both;
+       padding-top: 1em;
+       font-size: 0.9em;
+       text-align: center;
+}
+
+#formcontent {
+       padding: 2px;
+       margin-bottom: 0;
+}
+
+#formcontent a {
+       color: #4183C4;
+}
+
+#formcontent input {
+       width: 6em;
+
+}
+
+
+#pagelist {
+       text-align: center;
+       font-weight: bold;
+       position: fixed;
+       bottom: 0px;
+       right: 0px;
+       background: white;
+       padding-left: 200px;
+       width: 100%;
+       padding-top: 0.5em;
+       border-top: 1px solid #333;
+}
+
+#pagelist a {
+       text-decoration: none;
+       color: gray;
+}
+
+
+h3 {
+       font-size: 1.2em;
+}
+
+td {
+       text-align: left;
+}
+
+tr.even {
+       background: #eaeaea;
+}
+
+span.highlighted {
+       font-weight: bold;
+       color: red;
+}
+
+form.update {
+       text-align: center;
+       display: none;
+}
+form.update textarea {
+       width: 100%;
+}
+
+textarea#id_comments {
+       width: 80%;
+}
+
+.hidden {
+       display: none;
+}
+
+.center_text {
+       text-align: center;
+}
+
+#searchform {
+       width: 300px;
+       margin-left: auto;
+       margin-right: auto;
+       text-align: center;
+}
+
+.info_content_title {
+    background-color: #F0F0F0;
+    border-bottom: 1px solid #FFFFFF;
+    border-top: 1px solid #D9D9D9;
+    color: #666666;
+    font-size: 12px;
+    font-weight: bold;
+    margin: 20px 0;
+    padding: 5px 0 5px 10px;
+    text-align: left;
+    text-shadow: 1px 1px 1px #FFFFFF;
+    width: 100%;
+}
+
+.row_container{
+       background-color: white;
+       clear: both;
+       overflow: auto;
+       width: 988px;
+       border: 1px solid black;
+}
+.row1{
+       float: left;
+       width: 300px;
+}
+.row1_content{
+       -moz-border-radius: 5px 5px 5px 5px;
+       -webkit-border-radius: 5px;
+    border-radius: 5px;
+    -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+       -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+       box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+       background: url("/static/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png") repeat-x scroll 50% 50% #E6E6E6;
+    border-color: #E9E9E9 #E9E9E9 #F5F5F5;
+    border-style: solid;
+    border-width: 1px;
+       padding: 4px;
+       margin: 0 auto;
+       width: 50%;
+       position: relative;
+       top: 20px;
+}
+.row2{
+       float: left;
+       width: 300px;
+}
+.row3{
+       float: left;
+       width: 300px;
+}
+.row1_table_content{
+       -moz-border-radius: 5px 5px 5px 5px;
+       -webkit-border-radius: 5px;
+    border-radius: 5px;
+    -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+       -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+       box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+       background: url("/static/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png") repeat-x scroll 50% 50% #E6E6E6;
+    border-color: #E9E9E9 #E9E9E9 #F5F5F5;
+    border-style: solid;
+    border-width: 1px;
+       padding: 3px;
+       margin: 0 auto;
+       text-align: left;
+
+}
+.actions_table{
+       background-color: #FFF0DF;
+       border-collapse: collapse;
+       border: 1px solid #D9D9D9;
+       float: right;
+       margin: 5px;
+       min-width: 330px;
+       width: 100%;
+}
+.actions_table td{
+       padding: 5px;
+}
+.instances_table{
+       border-collapse: collapse;
+       float: right;
+       /*
+margin: 1px;
+*/
+}
+.instances_table td{
+       border: 1px solid #D9D9D9;
+       padding: 5px;
+}
+.instances_table th{
+       border: 1px solid #D9D9D9;
+       padding: 5px;
+}
+.instance_name{
+       text-align: left;
+}
+#title a:hover{
+       text-decoration: none;
+}
+.table_title{
+       background: url("/static/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png") repeat-x scroll 50% 50% #E6E6E6;
+}
+.inner_table{
+       border-collapse: collapse;
+       width:100%;
+       height:100%;
+}
+.inner_table_holder{
+       padding: 0px !important;
+}
+.table_top_header{
+       background: url("/static/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png") repeat-x scroll 50% 50% #CCCCCC;
+}
+.borderless{
+       border: 0 none !important;
+}
+.inner_category{
+       width: 35%;
+       background: url("/static/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png") repeat-x scroll 50% 50% #E6E6E6;
+       border-left: 0 none !important;
+}
+.no_brd_right{
+       border-right: 0 none !important;
+}
+.no_brd_top{
+       border-top: 0 none !important;
+}
+.no_brd_btm{
+       border-bottom: 0 none !important;
+}
+
+#fl_l{
+       float: left;
+       width: 42%
+}
+#configuration {
+       width: 58%;
+       float: left;
+       text-align: center;
+}
+
+#configuration form  {
+       margin-left: auto;
+       margin-right: auto;
+       max-width: 800px;
+}
+
+#configuration th {
+       text-align: right;
+}
+
+#configuration td {
+       text-align: left;
+}
+
+#configuration input[type="text"] {
+       width: 22em;
+}
+.conf_table th{
+       font-weight: normal;
+       background-color: #ECECEC; /* fallback color if gradients are not supported */
+       background: url("/static/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png") repeat-x scroll 50% 50% #E6E6E6;
+       border-bottom: 1px solid #D9D9D9;
+}
+.conf_table{
+       float: right;
+       margin: 5px;
+       border: 1px solid #D9D9D9;
+       border-collapse: collapse;
+       width: 100%;
+}
+.conf_table td{
+       border-bottom: 1px solid #D9D9D9;
+       
+}
+.conf_table .table_topper_header{
+       font-weight: bold;
+       background: url("/static/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png") repeat-x scroll 50% 50% #CCCCCC;      
+}
+.instance_det_table{
+       border-collapse: collapse;
+       clear: both;
+       width: 400px;
+       margin: 5px;
+}
+.instance_det_table td{
+       border: 1px solid #D9D9D9;
+       padding: 5px;
+}
+.instance_det_table th{
+       border: 1px solid #D9D9D9;
+       padding: 5px;
+}
+
+
+
+#cluster_overview_table_wrapper{
+       width: 100%;
+}
+
+
+.paging_two_button .ui-button {
+       float: left;
+       cursor: pointer;
+       * cursor: hand;
+}
+
+.paging_full_numbers .ui-button {
+       padding: 2px 6px;
+       margin: 0;
+       cursor: pointer;
+       * cursor: hand;
+}
+
+.dataTables_paginate .ui-button {
+       margin-right: -0.1em !important;
+}
+
+.paging_full_numbers {
+       width: 350px !important;
+}
+
+.dataTables_wrapper .ui-toolbar {
+       padding: 5px;
+}
+
+.dataTables_paginate {
+       width: auto;
+}
+
+.dataTables_info {
+       padding-top: 3px;
+}
+
+table.display thead th {
+       padding: 3px 0px 3px 10px;
+       cursor: pointer;
+       * cursor: hand;
+}
+
+div.dataTables_wrapper .ui-widget-header {
+       font-weight: normal;
+}
+
+
+/*
+ * Sort arrow icon positioning
+ */
+table.display thead th div.DataTables_sort_wrapper {
+       position: relative;
+       padding-right: 20px;
+       padding-right: 20px;
+}
+
+table.display thead th div.DataTables_sort_wrapper span {
+       position: absolute;
+       top: 50%;
+       margin-top: -8px;
+       right: 0;
+}
+
+
+.dataTables_wrapper {
+       position: relative;
+       min-height: 302px;
+       float: left;
+       clear: both;
+       _height: 302px;
+       width: 100%;
+       zoom: 1; /* Feeling sorry for IE */
+}
+
+.dataTables_processing {
+       position: absolute;
+       top: 50%;
+       left: 50%;
+       width: 250px;
+       height: 30px;
+       margin-left: -125px;
+       margin-top: -15px;
+       padding: 14px 0 2px 0;
+       border: 1px solid #ddd;
+       text-align: center;
+       color: #999;
+       font-size: 14px;
+       background-color: white;
+}
+
+.dataTables_length {
+       width: 40%;
+       float: left;
+}
+
+.dataTables_filter {
+       width: 50%;
+       float: right;
+       text-align: right;
+}
+
+.dataTables_info {
+       width: 60%;
+       float: left;
+}
+
+.dataTables_paginate {
+       width: 44px;
+       * width: 50px;
+       float: right;
+       text-align: right;
+}
+
+/* Pagination nested */
+.paginate_disabled_previous, .paginate_enabled_previous, .paginate_disabled_next, .paginate_enabled_next {
+       height: 19px;
+       width: 19px;
+       margin-left: 3px;
+       float: left;
+}
+
+.paginate_disabled_previous {
+       background-image: url('../images/back_disabled.jpg');
+}
+
+.paginate_enabled_previous {
+       background-image: url('../images/back_enabled.jpg');
+}
+
+.paginate_disabled_next {
+       background-image: url('../images/forward_disabled.jpg');
+}
+
+.paginate_enabled_next {
+       background-image: url('../images/forward_enabled.jpg');
+}
+
+
+
+
+table.display {
+       margin: 0 auto;
+       clear: both;
+       width: 100%;
+       border-collapse: collapse;
+       
+}
+
+table.display thead th {
+       padding: 3px 18px 3px 10px;
+       font-weight: normal;
+       cursor: pointer;
+       * cursor: hand;
+}
+
+table.display tfoot th {
+       padding: 3px 18px 3px 10px;
+       border-top: 1px solid black;
+       font-weight: bold;
+}
+
+table.display tr.heading2 td {
+       border-bottom: 1px solid #aaa;
+}
+
+table.display td {
+       padding: 3px 10px;
+}
+
+table.display td a {
+       font-weight: normal;
+}
+
+table.display td.center {
+       text-align: center;
+}
+
+table.display tfoot th {
+       padding: 3px 0px 3px 10px;
+       font-weight: bold;
+       font-weight: normal;
+}
+
+table.display tr.heading2 td {
+       border-bottom: 1px solid #aaa;
+}
+
+table.display td {
+       padding: 3px 10px;
+}
+
+table.display td.center {
+       text-align: center;
+}
+
+.sorting_asc {
+       background: url('../images/sort_asc.png') no-repeat center right;
+}
+
+.sorting_desc {
+       background: url('../images/sort_desc.png') no-repeat center right;
+}
+
+.sorting {
+       background: url('../images/sort_both.png') no-repeat center right;
+}
+
+.sorting_asc_disabled {
+       background: url('../images/sort_asc_disabled.png') no-repeat center right;
+}
+
+.sorting_desc_disabled {
+       background: url('../images/sort_desc_disabled.png') no-repeat center right;
+}
+
+table.display tr.odd.gradeA {
+       background-color: #EEEEEE;
+}
+
+table.display tr.even.gradeA {
+       background-color: #F6F6F6;
+}
+
+table.display tr.odd.gradeC {
+       background-color: #ddddff;
+}
+
+table.display tr.even.gradeC {
+       background-color: #eeeeff;
+}
+
+table.display tr.odd.gradeX {
+       background-color: #ffdddd;
+}
+
+table.display tr.even.gradeX {
+       background-color: #ffeeee;
+}
+
+table.display tr.odd.gradeU {
+       background-color: #ddd;
+}
+
+table.display tr.even.gradeU {
+       background-color: #eee;
+}
+
+
+tr.odd {
+       background-color: #E2E4FF;
+}
+
+tr.even {
+       background-color: white;
+}
+
+.dataTables_scroll {
+       clear: both;
+}
+
+.dataTables_scrollBody {
+       *margin-top: -1px;
+}
+
+.top, .bottom {
+       padding: 15px;
+       background-color: #F5F5F5;
+       border: 1px solid #CCCCCC;
+}
+
+.top .dataTables_info {
+       float: none;
+}
+
+.clear {
+       clear: both;
+}
+
+.dataTables_empty {
+       text-align: center;
+}
+
+tfoot input {
+       margin: 0.5em 0;
+       width: 100%;
+       color: #444;
+}
+
+tfoot input.search_init {
+       color: #999;
+}
+
+td.group {
+       background-color: #d1cfd0;
+       border-bottom: 2px solid #A19B9E;
+       border-top: 2px solid #A19B9E;
+}
+
+td.details {
+       background-color: #d1cfd0;
+       border: 2px solid #A19B9E;
+}
+
+
+.example_alt_pagination div.dataTables_info {
+       width: 40%;
+}
+
+.paging_full_numbers {
+       width: 400px;
+       height: 22px;
+       line-height: 22px;
+}
+
+.paging_full_numbers span.paginate_button,
+       .paging_full_numbers span.paginate_active {
+       border: 1px solid #aaa;
+       -webkit-border-radius: 5px;
+       -moz-border-radius: 5px;
+       padding: 2px 5px;
+       margin: 0 3px;
+       cursor: pointer;
+       *cursor: hand;
+}
+
+.paging_full_numbers span.paginate_button {
+       background-color: #ddd;
+}
+
+.paging_full_numbers span.paginate_button:hover {
+       background-color: #ccc;
+}
+
+.paging_full_numbers span.paginate_active {
+       background-color: #99B3FF;
+}
+
+table.display tr.even.row_selected td {
+       background-color: #B0BED9;
+}
+
+table.display tr.odd.row_selected td {
+       background-color: #9FAFD1;
+}
+
+tr.odd td.sorting_1 {
+       background-color: #D3D6FF;
+}
+
+tr.odd td.sorting_2 {
+       background-color: #DADCFF;
+}
+
+tr.odd td.sorting_3 {
+       background-color: #E0E2FF;
+}
+
+tr.even td.sorting_1 {
+       background-color: #EAEBFF;
+}
+
+tr.even td.sorting_2 {
+       background-color: #F2F3FF;
+}
+
+tr.even td.sorting_3 {
+       background-color: #F9F9FF;
+}
+
+tr.odd.gradeA td.sorting_1 {
+       background-color: #E1E1E1;
+}
+
+tr.odd.gradeA td.sorting_2 {
+       background-color: #E8E8E8;
+}
+
+tr.odd.gradeA td.sorting_3 {
+       background-color: #E8E8E8;
+}
+
+tr.even.gradeA td.sorting_1 {
+       background-color: #EAEAEA;
+}
+
+tr.even.gradeA td.sorting_2 {
+       background-color: #F0F0F0;
+}
+
+tr.even.gradeA td.sorting_3 {
+       background-color: #F0F0F0;
+}
+
+tr.odd.gradeC td.sorting_1 {
+       background-color: #c4c4ff;
+}
+
+tr.odd.gradeC td.sorting_2 {
+       background-color: #d1d1ff;
+}
+
+tr.odd.gradeC td.sorting_3 {
+       background-color: #d1d1ff;
+}
+
+tr.even.gradeC td.sorting_1 {
+       background-color: #d5d5ff;
+}
+
+tr.even.gradeC td.sorting_2 {
+       background-color: #e2e2ff;
+}
+
+tr.even.gradeC td.sorting_3 {
+       background-color: #e2e2ff;
+}
+
+tr.odd.gradeX td.sorting_1 {
+       background-color: #ffc4c4;
+}
+
+tr.odd.gradeX td.sorting_2 {
+       background-color: #ffd1d1;
+}
+
+tr.odd.gradeX td.sorting_3 {
+       background-color: #ffd1d1;
+}
+
+tr.even.gradeX td.sorting_1 {
+       background-color: #ffd5d5;
+}
+
+tr.even.gradeX td.sorting_2 {
+       background-color: #ffe2e2;
+}
+
+tr.even.gradeX td.sorting_3 {
+       background-color: #ffe2e2;
+}
+
+tr.odd.gradeU td.sorting_1 {
+       background-color: #c4c4c4;
+}
+
+tr.odd.gradeU td.sorting_2 {
+       background-color: #d1d1d1;
+}
+
+tr.odd.gradeU td.sorting_3 {
+       background-color: #d1d1d1;
+}
+
+tr.even.gradeU td.sorting_1 {
+       background-color: #d5d5d5;
+}
+
+tr.even.gradeU td.sorting_2 {
+       background-color: #e2e2e2;
+}
+
+tr.even.gradeU td.sorting_3 {
+       background-color: #e2e2e2;
+}
+
+.ex_highlight #example tbody tr.even:hover, #example tbody tr.even td.highlighted {
+       background-color: #ECFFB3;
+}
+
+.ex_highlight #example tbody tr.odd:hover, #example tbody tr.odd td.highlighted {
+       background-color: #E6FF99;
+}
+
+.ex_highlight_row #example tr.even:hover {
+       background-color: #ECFFB3;
+}
+
+.ex_highlight_row #example tr.even:hover td.sorting_1 {
+       background-color: #DDFF75;
+}
+
+.ex_highlight_row #example tr.even:hover td.sorting_2 {
+       background-color: #E7FF9E;
+}
+
+.ex_highlight_row #example tr.even:hover td.sorting_3 {
+       background-color: #E2FF89;
+}
+
+.ex_highlight_row #example tr.odd:hover {
+       background-color: #E6FF99;
+}
+
+.ex_highlight_row #example tr.odd:hover td.sorting_1 {
+       background-color: #D6FF5C;
+}
+
+.ex_highlight_row #example tr.odd:hover td.sorting_2 {
+       background-color: #E0FF84;
+}
+
+.ex_highlight_row #example tr.odd:hover td.sorting_3 {
+       background-color: #DBFF70;
+}
+
+table.KeyTable td {
+       border: 3px solid transparent;
+}
+
+table.KeyTable td.focus {
+       border: 3px solid #3366FF;
+}
+
+table.display tr.gradeA {
+       background-color: #eeffee;
+}
+
+table.display tr.gradeC {
+       background-color: #ddddff;
+}
+
+table.display tr.gradeX {
+       background-color: #ffdddd;
+}
+
+table.display tr.gradeU {
+       background-color: #ddd;
+}
+
+div.box {
+       height: 100px;
+       padding: 10px;
+       overflow: auto;
+       border: 1px solid #8080FF;
+       background-color: #E5E5FF;
+}
+
+#messages {
+       position: relative;
+       top: -21px;
+       text-align: center;
+       padding-top: 0.4em;
+       padding-bottom: 0.4em;
+       background-color: #d5ffd5;
+       border-top: 1px solid #a5afa5;
+       border-bottom: 1px solid #a5afa5;
+}
+
+#welcome {
+       float: left;
+       padding: 0.5em;
+       width: 45%;
+}
+
+#loginform {
+       margin-left: 50%;
+       text-align: center;
+       border-left: 1px solid #aaa;
+}
+
+#loginform table {
+       margin-left: auto;
+       margin-right: auto;
+}
diff --git a/static/css/mobile.css b/static/css/mobile.css
new file mode 100644 (file)
index 0000000..eea93b5
--- /dev/null
@@ -0,0 +1,669 @@
+/* main.css (c) 2007-2008 Jannis Leidel, see LICENSE.txt for license */
+
+/* parts from iui.css (c) 2007 by iUI Project Members */
+
+body {
+    margin: 0;
+    font-family: Helvetica;
+    background: #fff;
+    color: #000;
+    overflow-x: hidden;
+    -webkit-user-select: none;
+    -webkit-text-size-adjust: none;
+}
+
+.float-left {
+    float: left;
+}
+
+.float-right {
+    float: right;
+}
+
+.clear {
+    clear: both;
+}
+
+body > *:not(.toolbar) {
+    display: none;
+    position: absolute;
+    margin: 0;
+    padding: 0;
+    left: 0;
+    top: 100px;
+    width: 100%;
+    min-height: 372px;
+}
+
+body[orient="landscape"] > *:not(.toolbar|.breadcrumb) {
+    min-height: 268px;
+}
+
+body > *[selected="true"] {
+    display: block;
+}
+
+body > .toolbar {
+    box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    -webkit-box-sizing: border-box;
+    border-bottom: 1px solid #37657b;
+    padding: 8px 7px 3px 2px;
+    height: 60px;
+    background: #417690 repeat-x;
+    vertical-align: middle;
+}
+
+.toolbar > h1 {
+    float: left;
+    overflow: hidden;
+    padding: 8px 4px 5px 2px;
+    font-size: 20px;
+    font-weight: bold;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.toolbar > h1 a {
+    color: #f4f379;
+    text-decoration: none;
+    padding: 5px 6px;
+}
+
+.toolbar > h1 a:active {
+    background: none;
+    background-color: none;
+}
+
+.toolbar div.greeting {
+    color: #f4f379;
+    font-size: 14px;
+    font-weight: bold;
+    padding: 1px 4px;
+    line-height: 20px;
+}
+
+.toolbar > div.user-tools a,
+.toolbar > div.user-tools a:active,
+.toolbar > div.user-tools a:visited {
+    line-height: 20px;
+    padding: 1px 4px;
+    font-size: 14px;
+    font-weight: bold;
+    text-decoration: none;
+    color: #fff;
+    text-align: right;
+    float: right;
+}
+
+body > ul > li {
+    position: relative;
+    margin: 0;
+    font-size: 20px;
+    font-weight: bold;
+    list-style: none;
+    border-bottom: 1px solid #d9d9d9;
+    padding: 10px 0 10px 10px;
+    color: #444;
+}
+
+body > ul > li.group, ul#filter h3 {
+    position: relative;
+    font-weight: bold;
+    color: #fff;
+    background: url(../img/default-bg.gif) repeat-x;
+    border-top: 1px solid #bdcddf;
+    border-bottom: 1px solid #86a4c2;
+    font-size: 16px;
+    padding: 3px 10px 2px;
+    margin-top: -1px;
+}
+
+body > ul > li.subgroup {
+    background: url(../img/nav-bg.gif) -10px repeat-x;
+    border-bottom: 1px solid #d9d9d9;
+    color: #666;
+}
+
+body > ul > li.group:first-child {
+    top: 0;
+    border-top: none;
+    margin-top: 0px;
+}
+
+body > ul > li > a {
+    margin: -10px 0 -10px -10px;
+    padding: 10px 32px 10px 10px;
+    text-decoration: none;
+    color: #5B80B2;
+    font-size: 20px;
+    display: block;
+    background: url(../img/arrow.png) no-repeat right center;
+}
+
+body > ul > li > a.selected {
+    color: #666;
+    background: none;
+}
+
+ul#filter li.selected a, ul#filter li.selected a:link {
+    color: #666;
+    background: none;
+}
+
+body > ul > li.paginator {
+    color: #666;
+    background: #fff url(../img/nav-bg-reverse.gif) repeat-x top;
+    min-height: 21px;
+    padding: 9px 0;
+    font-size: 18px;
+    font-weight: bold;
+    margin: 0px;
+}
+
+body > ul > li.paginator a:link,
+body > ul > li.paginator a:active,
+body > ul > li.paginator a:visited {
+    text-decoration: none;
+    color: #5B80B2;
+    background: none;
+    margin: -6px 8px 0px -10px;
+}
+
+body > ul > li.paginator a.inactive,
+body > ul > li.paginator a.active {
+    background: none;
+}
+
+body > ul > li.paginator span a.inactive,
+body > ul > li.paginator span a.active {
+    padding: 9px 12px;
+    margin: -9px -1px 0px 0px;
+}
+
+body > ul > li.paginator span a.active {
+    color: #666;
+    margin-left: 0px;
+    margin-right: 0px;
+    padding-left: 13px;
+}
+
+body > ul > li.paginator a.inactive {
+    border: 1px solid #ccc;
+    border-top: none;
+    color: #5B80B2;
+    background: #fff url(../img/nav-bg.gif) repeat-x bottom;
+}
+
+body > ul > li.paginator span.float-right a.inactive {
+    border-right: none;
+}
+
+body > ul > li.paginator span.active {
+    padding-right: 12px;
+}
+
+body > ul > li.paginator span a.showall {
+    margin: 0px;
+}
+
+body > .breadcrumbs {
+    box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    -webkit-box-sizing: border-box;
+    position: absolute;
+    background: url(../img/nav-bg-reverse.gif) repeat-x;
+    color: #666;
+    top: 60px;
+    min-height: 40px;
+    max-height: 40px;
+    padding: 9px 0px 9px 8px;
+    font-size: 18px;
+    border-top: 1px solid #fff;
+    border-bottom: 1px solid #cbcbcb;
+    font-weight: bold;
+}
+
+.breadcrumbs a:link,
+.breadcrumbs a:active,
+.breadcrumbs a:visited {
+    text-decoration: none;
+    color: #5B80B2;
+    background: none;
+    padding: 9px 16px 9px 10px;
+    margin: -9px 4px 0px -6px;
+}
+
+.breadcrumbs a:active {
+    color: #036;
+}
+
+.breadcrumbs a.active,
+.breadcrumbs a.inactive {
+    background: none;
+}
+
+.breadcrumbs span {
+    padding-right: 12px;
+}
+
+.breadcrumbs a.active,
+.breadcrumbs span.active {
+    color: #666;
+}
+
+.breadcrumbs a.inactive,
+.breadcrumbs span.inactive {
+    padding-right: 12px;
+    padding-left: 12px;
+    padding-bottom: 8px;
+    margin-right: 0px;
+    margin-left: -1px;
+    border: 1px solid #ccc;
+    border-top: none;
+    color: #5B80B2;
+    background: #fff url(../img/nav-bg.gif) repeat-x bottom;
+}
+
+.breadcrumbs a.float-left {
+    margin-left: -11px;
+}
+
+.breadcrumbs a.float-right {
+    text-align: right;
+}
+
+.breadcrumbs a.active {
+    margin-left: -8px;
+    padding-right: 21px;
+}
+
+.breadcrumbs a#_recent.inactive {
+    padding-left: 12px;
+}
+
+.breadcrumbs a#_recent.active,
+.breadcrumbs a#_filter.active {
+    padding-left: 22px;
+    margin-left: 0;
+    padding-right: 9px;
+}
+
+.breadcrumbs a#_filter span.searchimg {
+    background: url(../img/search.png) no-repeat center center;
+}
+
+.submit-row {
+    box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    -webkit-box-sizing: border-box;
+    background: #fff url(../img/nav-bg-reverse.gif) repeat-x;
+    color: #666;
+    top: 48px;
+    min-height: 40px;
+    max-height: 40px;
+    padding: 9px 0px 9px 8px;
+    font-size: 18px;
+    border: 1px solid #d9d9d9;
+    border-width: 1px 0;
+    font-weight: bold;
+}
+
+.submit-row a:link,
+.submit-row a:active,
+.submit-row a:visited {
+    text-decoration: none;
+    color: #5B80B2;
+    padding: 6px;
+    margin: -6px 6px 0px 6px;
+    padding: 9px 16px 9px 10px;
+    margin: -9px 4px 0px -6px;
+}
+
+.submit-row a:active {
+    color: #036;
+}
+
+.submit-row a.inactive, .submit-row a.active {
+    background: none;
+}
+
+.submit-row span {
+    padding-right: 12px;
+}
+
+.submit-row a.active, .submit-row span.active {
+    color: #666;
+}
+
+.submit-row a.inactive, .submit-row span.inactive {
+    color: #5B80B2;
+    padding-right: 12px;
+    padding-left: 12px;
+    padding-bottom: 8px;
+    margin-right: 0px;
+    margin-left: -1px;
+    border: 1px solid #ccc;
+    border-top: none;
+    background: #fff url(../img/nav-bg.gif) repeat-x bottom;
+}
+
+.submit-row a.float-left {
+    margin-left: -11px;
+}
+
+.submit-row a.submit {
+    color: #fff;
+    background: #BCD1E8 url(../img/default-bg.gif) repeat-x bottom;
+
+
+/*    text-shadow: #BCD1E8 1px 1px 0;
+*/
+}
+
+.submit-row a.delete {
+    color: #CC3434;
+}
+
+/***/
+
+body > ul > li.searchbar {
+    color: #666;
+    background: #fff url(../img/nav-bg-reverse.gif) repeat-x top;
+    min-height: 21px;
+    padding: 9px 0;
+    font-size: 18px;
+    font-weight: bold;
+}
+
+body > ul > li.searchbar a:link,
+body > ul > li.searchbar a:active,
+body > ul > li.searchbar a:visited {
+    text-decoration: none;
+    color: #5B80B2;
+    background: none;
+    margin: -6px 8px 0px -10px;
+}
+
+body > ul > li.searchbar span a.inactive,
+body > ul > li.searchbar span a.active {
+    padding: 9px 12px;
+    margin: -9px 0px 0px;
+}
+
+body > ul > li.searchbar span.float-left a.inactive {
+    margin-right: 4px;
+}
+
+body > ul > li.searchbar a.inactive {
+    border: 1px solid #ccc;
+    border-top: none;
+    color: #5B80B2;
+    background: #fff url(../img/nav-bg.gif) repeat-x bottom;
+}
+
+body > ul > li.searchbar span.float-right a.inactive {
+    border-right: none;
+}
+
+body > ul > li.searchbar span.active {
+    padding-right: 12px;
+}
+
+/***/
+
+input, textarea, select {
+    box-sizing: border-box;
+    -webkit-box-sizing: border-box;
+    width: 100%;
+    margin: 8px 0 0 0;
+    font-size: 16px;
+    font-weight: normal;
+    background: none;
+}
+
+body > .panel {
+    box-sizing: border-box;
+    -webkit-box-sizing: border-box;
+    background: #fff;
+}
+
+.panel > fieldset {
+    position: relative;
+    margin: 0 0 20px 0;
+    padding: 0;
+    background: #FFFFFF;
+    border: none;
+    text-align: right;
+    font-size: 16px;
+}
+
+.form-row {
+    position: relative;
+    min-height: 42px;
+    text-align: left;
+    padding: 0 8px;
+}
+
+fieldset > .form-row:last-child {
+    border-bottom: none !important;
+}
+
+fieldset > .form-row:first-child {
+    border-top: none;
+}
+
+.form-row input,
+#search > input[type="text"] {
+    display: block;
+    box-sizing: border-box;
+    -webkit-box-sizing: border-box;
+    margin: 0;
+    padding: 12px 10px 0 12px;
+    height: 40px;
+    background: none;
+    -webkit-border-radius: 5px;
+    border: 1px solid #D9D9D9;
+}
+
+#search > input[type="text"] {
+    margin-right: 20px;
+}
+
+#search {
+    margin: 5px 10px 5px 0px;
+    background: none;
+}
+
+.form-row > input.vDateField,
+.form-row > input.vTimeField {
+    width: 100%;
+}
+
+.form-row > input.vTimeField {
+    margin-top: 10px;
+}
+
+.form-row > input[type="checkbox"] {
+    width: 30px;
+    height: 30px;
+    margin: 8px 0px 0px;
+    border: 0;
+    -webkit-border-radius: 8px;
+    background: #fff url(../img/default-bg.gif) repeat-x bottom;
+    float: left;
+    clear: left;
+}
+
+.radiolist input {
+    position:relative;
+    width: 30px;
+    height: 30px;
+    margin: -6px 0;
+    padding: 0;
+    border: 0;
+    -webkit-border-radius: 8px;
+    background: #fff url(../img/default-bg.gif) repeat-x bottom;
+    float: left;
+    clear: left;
+}
+
+.form-row span {
+    float: right;
+    margin-top: -20px;
+}
+
+.form-row > select {
+    -webkit-border-radius: 5px;
+    border: 1px solid #D9D9D9;
+    margin: 10px 0 0 0;
+    padding: 12px 10px 10 12px;
+    height: 40px;
+    clear: left;
+}
+
+.form-row > textarea {
+    box-sizing: border-box;
+    -webkit-box-sizing: border-box;
+    display: block;
+    margin: 0;
+    border: none;
+    padding: 12px 10px 0 12px;
+    height: 126px;
+    background: none;
+    -webkit-border-radius: 5px;
+    border: 1px solid #D9D9D9;
+}
+
+.form-row label,
+.form-row p,
+#search > label {
+    position: relative;
+    top: 9px;
+    padding: 0 3px;
+    margin-left: 10px;
+    font-weight: normal;
+    font-size: 16px;
+    color: #666;
+    text-align: left;
+    background-color: #fff;
+}
+
+.form-row p.datetime {
+    margin: 5px -13px 0 0px;
+    background-color: #fff !important;
+    padding: 5px 0 0 13px;
+}
+
+.form-row p.datetime input {
+    margin: 5px 0px 10px -13px;
+}
+
+.form-row p.datetime br {
+    display: none;
+}
+
+.form-row p.datetime span {
+    display: none;
+}
+
+.form-row label.vCheckboxLabel {
+    float: left;
+    padding: 0.4em 0;
+}
+
+.form-row label.required {
+    font-weight: bold;
+}
+
+.form-row > ul.radiolist li {
+    list-style: none;
+    margin: 10px 10px 20px;
+    padding: 0;
+}
+.form-row > ul.radiolist label {
+    top: 13px;
+}
+
+.form-row > ul.inline {
+    margin-left: 13px;
+    padding: 0;
+}
+
+.form-row > ul.inline li {
+    padding: 2px;
+}
+
+.form-row > ul {
+    color: #333;
+    list-style: none;
+    margin: 0px 2px;
+    padding: 0px;
+    font-weight: normal;
+}
+
+.form-row > ul > li > ul {
+    padding: 10px 20px;
+}
+
+.form-row a.add-another {
+    display: none;
+}
+
+.panel > h2 {
+    margin: 0;
+    padding: 2px 10px;
+    font-size: 14px;
+    font-weight: bold;
+    color: #fff;
+    background: url(../img/default-bg.gif) repeat-x;
+    border-top: 1px solid #bdcddf;
+    border-bottom: 1px solid #86a4c2;
+}
+
+.panel > h3 {
+    margin: 0;
+    padding: 2px 10px;
+    font-size: 14px;
+    font-weight: bold;
+    color: #fff;
+    background: url(../img/nav-bg.gif) -10px repeat-x;
+    border-bottom: 1px solid #d9d9d9;
+    border-top: 1px solid #d9d9d9;
+    color: #666;
+}
+
+.panel > h1 {
+    margin: 0;
+    padding: 10px;
+    font-size: 16px;
+    font-weight: bold;
+    color: #666;
+    background: none;
+}
+
+.panel > h1.error {
+    color: #CC2830;
+}
+
+.panel a.help-link {
+    float: right;
+    color: #ccc;
+    text-decoration: none;
+    font-weight: bold;
+    padding: 2px 4px;
+    font-size: 14px;
+}
+
+ul.errorlist, ul.errorlist li {
+    list-style: none;
+    color: #cc2830;
+    font-size: 12px;
+    padding: 2px 4px;
+    float: right;
+    font-weight: bold;
+}
+
+ul.errorlist > li {
+    list-style: none;
+}
\ No newline at end of file
diff --git a/static/css/overcast/images/ui-bg_flat_0_aaaaaa_40x100.png b/static/css/overcast/images/ui-bg_flat_0_aaaaaa_40x100.png
new file mode 100644 (file)
index 0000000..5b5dab2
Binary files /dev/null and b/static/css/overcast/images/ui-bg_flat_0_aaaaaa_40x100.png differ
diff --git a/static/css/overcast/images/ui-bg_flat_0_eeeeee_40x100.png b/static/css/overcast/images/ui-bg_flat_0_eeeeee_40x100.png
new file mode 100644 (file)
index 0000000..e44f861
Binary files /dev/null and b/static/css/overcast/images/ui-bg_flat_0_eeeeee_40x100.png differ
diff --git a/static/css/overcast/images/ui-bg_flat_55_c0402a_40x100.png b/static/css/overcast/images/ui-bg_flat_55_c0402a_40x100.png
new file mode 100644 (file)
index 0000000..881ea6b
Binary files /dev/null and b/static/css/overcast/images/ui-bg_flat_55_c0402a_40x100.png differ
diff --git a/static/css/overcast/images/ui-bg_flat_55_eeeeee_40x100.png b/static/css/overcast/images/ui-bg_flat_55_eeeeee_40x100.png
new file mode 100644 (file)
index 0000000..e44f861
Binary files /dev/null and b/static/css/overcast/images/ui-bg_flat_55_eeeeee_40x100.png differ
diff --git a/static/css/overcast/images/ui-bg_glass_100_f8f8f8_1x400.png b/static/css/overcast/images/ui-bg_glass_100_f8f8f8_1x400.png
new file mode 100644 (file)
index 0000000..cd79e9f
Binary files /dev/null and b/static/css/overcast/images/ui-bg_glass_100_f8f8f8_1x400.png differ
diff --git a/static/css/overcast/images/ui-bg_glass_35_dddddd_1x400.png b/static/css/overcast/images/ui-bg_glass_35_dddddd_1x400.png
new file mode 100644 (file)
index 0000000..3550f06
Binary files /dev/null and b/static/css/overcast/images/ui-bg_glass_35_dddddd_1x400.png differ
diff --git a/static/css/overcast/images/ui-bg_glass_60_eeeeee_1x400.png b/static/css/overcast/images/ui-bg_glass_60_eeeeee_1x400.png
new file mode 100644 (file)
index 0000000..8ad921a
Binary files /dev/null and b/static/css/overcast/images/ui-bg_glass_60_eeeeee_1x400.png differ
diff --git a/static/css/overcast/images/ui-bg_inset-hard_75_999999_1x100.png b/static/css/overcast/images/ui-bg_inset-hard_75_999999_1x100.png
new file mode 100644 (file)
index 0000000..3f6a273
Binary files /dev/null and b/static/css/overcast/images/ui-bg_inset-hard_75_999999_1x100.png differ
diff --git a/static/css/overcast/images/ui-bg_inset-soft_50_c9c9c9_1x100.png b/static/css/overcast/images/ui-bg_inset-soft_50_c9c9c9_1x100.png
new file mode 100644 (file)
index 0000000..a265c62
Binary files /dev/null and b/static/css/overcast/images/ui-bg_inset-soft_50_c9c9c9_1x100.png differ
diff --git a/static/css/overcast/images/ui-icons_3383bb_256x240.png b/static/css/overcast/images/ui-icons_3383bb_256x240.png
new file mode 100644 (file)
index 0000000..905274f
Binary files /dev/null and b/static/css/overcast/images/ui-icons_3383bb_256x240.png differ
diff --git a/static/css/overcast/images/ui-icons_454545_256x240.png b/static/css/overcast/images/ui-icons_454545_256x240.png
new file mode 100644 (file)
index 0000000..59bd45b
Binary files /dev/null and b/static/css/overcast/images/ui-icons_454545_256x240.png differ
diff --git a/static/css/overcast/images/ui-icons_70b2e1_256x240.png b/static/css/overcast/images/ui-icons_70b2e1_256x240.png
new file mode 100644 (file)
index 0000000..ed8543e
Binary files /dev/null and b/static/css/overcast/images/ui-icons_70b2e1_256x240.png differ
diff --git a/static/css/overcast/images/ui-icons_999999_256x240.png b/static/css/overcast/images/ui-icons_999999_256x240.png
new file mode 100644 (file)
index 0000000..50ff803
Binary files /dev/null and b/static/css/overcast/images/ui-icons_999999_256x240.png differ
diff --git a/static/css/overcast/images/ui-icons_fbc856_256x240.png b/static/css/overcast/images/ui-icons_fbc856_256x240.png
new file mode 100644 (file)
index 0000000..18e65a1
Binary files /dev/null and b/static/css/overcast/images/ui-icons_fbc856_256x240.png differ
diff --git a/static/css/overcast/jquery-ui-1.8.12.custom.css b/static/css/overcast/jquery-ui-1.8.12.custom.css
new file mode 100644 (file)
index 0000000..0c34380
--- /dev/null
@@ -0,0 +1,578 @@
+/*
+ * jQuery UI CSS Framework 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+ * jQuery UI CSS Framework 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Helvetica,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=dddddd&bgTextureHeader=02_glass.png&bgImgOpacityHeader=35&borderColorHeader=bbbbbb&fcHeader=444444&iconColorHeader=999999&bgColorContent=c9c9c9&bgTextureContent=05_inset_soft.png&bgImgOpacityContent=50&borderColorContent=aaaaaa&fcContent=333333&iconColorContent=999999&bgColorDefault=eeeeee&bgTextureDefault=02_glass.png&bgImgOpacityDefault=60&borderColorDefault=cccccc&fcDefault=3383bb&iconColorDefault=70b2e1&bgColorHover=f8f8f8&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=bbbbbb&fcHover=599fcf&iconColorHover=3383bb&bgColorActive=999999&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=75&borderColorActive=999999&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=eeeeee&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=ffffff&fcHighlight=444444&iconColorHighlight=3383bb&bgColorError=c0402a&bgTextureError=01_flat.png&bgImgOpacityError=55&borderColorError=c0402a&fcError=ffffff&iconColorError=fbc856&bgColorOverlay=eeeeee&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0pxdow=0px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Trebuchet MS, Helvetica, Arial, sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Helvetica, Arial, sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa; background: #c9c9c9 url(images/ui-bg_inset-soft_50_c9c9c9_1x100.png) 50% bottom repeat-x; color: #333333; }
+.ui-widget-content a { color: #333333; }
+.ui-widget-header { border: 1px solid #bbbbbb; background: #dddddd url(images/ui-bg_glass_35_dddddd_1x400.png) 50% 50% repeat-x; color: #444444; font-weight: bold; }
+.ui-widget-header a { color: #444444; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #eeeeee url(images/ui-bg_glass_60_eeeeee_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #3383bb; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #3383bb; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #bbbbbb; background: #f8f8f8 url(images/ui-bg_glass_100_f8f8f8_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #599fcf; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #599fcf; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #999999; background: #999999 url(images/ui-bg_inset-hard_75_999999_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #ffffff; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #ffffff; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #ffffff; background: #eeeeee url(images/ui-bg_flat_55_eeeeee_40x100.png) 50% 50% repeat-x; color: #444444; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #444444; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #c0402a; background: #c0402a url(images/ui-bg_flat_55_c0402a_40x100.png) 50% 50% repeat-x; color: #ffffff; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_999999_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_999999_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_999999_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_70b2e1_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_3383bb_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_3383bb_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_fbc856_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; }
+.ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; }
+.ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
+.ui-corner-top { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
+.ui-corner-right {  -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
+.ui-corner-left { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; }
+.ui-corner-all { -moz-border-radius: 6px; -webkit-border-radius: 6px; border-radius: 6px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #eeeeee url(images/ui-bg_flat_0_eeeeee_40x100.png) 50% 50% repeat-x; opacity: .80;filter:Alpha(Opacity=80); }
+.ui-widget-shadow { margin: -4px 0 0 -4px; padding: 4px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); -moz-border-radius: 0pxdow=0px; -webkit-border-radius: 0pxdow=0px; border-radius: 0pxdow=0px; }/*
+ * jQuery UI Resizable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;
+       /* http://bugs.jqueryui.com/ticket/7233
+        - Resizable: resizable handles fail to work in IE if transparent and content overlaps
+       */
+       background-image:url(data:);
+}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Accordion 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
+/*
+ * jQuery UI Autocomplete 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }      
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.12
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+       list-style:none;
+       padding: 2px;
+       margin: 0;
+       display:block;
+       float: left;
+}
+.ui-menu .ui-menu {
+       margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+       margin:0;
+       padding: 0;
+       zoom: 1;
+       float: left;
+       clear: left;
+       width: 100%;
+}
+.ui-menu .ui-menu-item a {
+       text-decoration:none;
+       display:block;
+       padding:.2em .4em;
+       line-height:1.5;
+       zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+       font-weight: normal;
+       margin: -1px;
+}
+/*
+ * jQuery UI Button 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Dialog 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Slider 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI Datepicker 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/*
+ * jQuery UI Progressbar 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
diff --git a/static/css/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png b/static/css/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png
new file mode 100644 (file)
index 0000000..5b5dab2
Binary files /dev/null and b/static/css/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png differ
diff --git a/static/css/redmond/images/ui-bg_flat_55_fbec88_40x100.png b/static/css/redmond/images/ui-bg_flat_55_fbec88_40x100.png
new file mode 100644 (file)
index 0000000..47acaad
Binary files /dev/null and b/static/css/redmond/images/ui-bg_flat_55_fbec88_40x100.png differ
diff --git a/static/css/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png b/static/css/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png
new file mode 100644 (file)
index 0000000..9d149b1
Binary files /dev/null and b/static/css/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png differ
diff --git a/static/css/redmond/images/ui-bg_glass_85_dfeffc_1x400.png b/static/css/redmond/images/ui-bg_glass_85_dfeffc_1x400.png
new file mode 100644 (file)
index 0000000..0149515
Binary files /dev/null and b/static/css/redmond/images/ui-bg_glass_85_dfeffc_1x400.png differ
diff --git a/static/css/redmond/images/ui-bg_glass_95_fef1ec_1x400.png b/static/css/redmond/images/ui-bg_glass_95_fef1ec_1x400.png
new file mode 100644 (file)
index 0000000..4443fdc
Binary files /dev/null and b/static/css/redmond/images/ui-bg_glass_95_fef1ec_1x400.png differ
diff --git a/static/css/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png b/static/css/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png
new file mode 100644 (file)
index 0000000..81ecc36
Binary files /dev/null and b/static/css/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png differ
diff --git a/static/css/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png b/static/css/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png
new file mode 100644 (file)
index 0000000..4f3faf8
Binary files /dev/null and b/static/css/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png differ
diff --git a/static/css/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png b/static/css/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png
new file mode 100644 (file)
index 0000000..38c3833
Binary files /dev/null and b/static/css/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png differ
diff --git a/static/css/redmond/images/ui-icons_217bc0_256x240.png b/static/css/redmond/images/ui-icons_217bc0_256x240.png
new file mode 100644 (file)
index 0000000..6f4bd87
Binary files /dev/null and b/static/css/redmond/images/ui-icons_217bc0_256x240.png differ
diff --git a/static/css/redmond/images/ui-icons_2e83ff_256x240.png b/static/css/redmond/images/ui-icons_2e83ff_256x240.png
new file mode 100644 (file)
index 0000000..09d1cdc
Binary files /dev/null and b/static/css/redmond/images/ui-icons_2e83ff_256x240.png differ
diff --git a/static/css/redmond/images/ui-icons_469bdd_256x240.png b/static/css/redmond/images/ui-icons_469bdd_256x240.png
new file mode 100644 (file)
index 0000000..bd2cf07
Binary files /dev/null and b/static/css/redmond/images/ui-icons_469bdd_256x240.png differ
diff --git a/static/css/redmond/images/ui-icons_6da8d5_256x240.png b/static/css/redmond/images/ui-icons_6da8d5_256x240.png
new file mode 100644 (file)
index 0000000..9f3eafa
Binary files /dev/null and b/static/css/redmond/images/ui-icons_6da8d5_256x240.png differ
diff --git a/static/css/redmond/images/ui-icons_cd0a0a_256x240.png b/static/css/redmond/images/ui-icons_cd0a0a_256x240.png
new file mode 100644 (file)
index 0000000..2ab019b
Binary files /dev/null and b/static/css/redmond/images/ui-icons_cd0a0a_256x240.png differ
diff --git a/static/css/redmond/images/ui-icons_d8e7f3_256x240.png b/static/css/redmond/images/ui-icons_d8e7f3_256x240.png
new file mode 100644 (file)
index 0000000..ad2dc6f
Binary files /dev/null and b/static/css/redmond/images/ui-icons_d8e7f3_256x240.png differ
diff --git a/static/css/redmond/images/ui-icons_f9bd01_256x240.png b/static/css/redmond/images/ui-icons_f9bd01_256x240.png
new file mode 100644 (file)
index 0000000..7862502
Binary files /dev/null and b/static/css/redmond/images/ui-icons_f9bd01_256x240.png differ
diff --git a/static/css/redmond/jquery-ui-1.8.12.custom.css b/static/css/redmond/jquery-ui-1.8.12.custom.css
new file mode 100644 (file)
index 0000000..247d4b9
--- /dev/null
@@ -0,0 +1,578 @@
+/*
+ * jQuery UI CSS Framework 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+ * jQuery UI CSS Framework 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande,%20Lucida%20Sans,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=06_inset_hard.png&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=02_glass.png&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #a6c9e2; background: #fcfdfd url(images/ui-bg_inset-hard_100_fcfdfd_1x100.png) 50% bottom repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #4297d7; background: #5c9ccc url(images/ui-bg_gloss-wave_55_5c9ccc_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
+.ui-widget-header a { color: #ffffff; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #c5dbec; background: #dfeffc url(images/ui-bg_glass_85_dfeffc_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #2e6e9e; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2e6e9e; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #79b7e7; background: #d0e5f5 url(images/ui-bg_glass_75_d0e5f5_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1d5987; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #1d5987; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #79b7e7; background: #f5f8f9 url(images/ui-bg_inset-hard_100_f5f8f9_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #e17009; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #e17009; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fad42e; background: #fbec88 url(images/ui-bg_flat_55_fbec88_40x100.png) 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_469bdd_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_469bdd_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_d8e7f3_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_6da8d5_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_217bc0_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_f9bd01_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; }
+.ui-corner-tr { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; }
+.ui-corner-br { -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }
+.ui-corner-top { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }
+.ui-corner-right {  -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }
+.ui-corner-left { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; }
+.ui-corner-all { -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
+ * jQuery UI Resizable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;
+       /* http://bugs.jqueryui.com/ticket/7233
+        - Resizable: resizable handles fail to work in IE if transparent and content overlaps
+       */
+       background-image:url(data:);
+}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Accordion 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
+/*
+ * jQuery UI Autocomplete 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }      
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.12
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+       list-style:none;
+       padding: 2px;
+       margin: 0;
+       display:block;
+       float: left;
+}
+.ui-menu .ui-menu {
+       margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+       margin:0;
+       padding: 0;
+       zoom: 1;
+       float: left;
+       clear: left;
+       width: 100%;
+}
+.ui-menu .ui-menu-item a {
+       text-decoration:none;
+       display:block;
+       padding:.2em .4em;
+       line-height:1.5;
+       zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+       font-weight: normal;
+       margin: -1px;
+}
+/*
+ * jQuery UI Button 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Dialog 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Slider 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI Datepicker 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/*
+ * jQuery UI Progressbar 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
diff --git a/static/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/static/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
new file mode 100644 (file)
index 0000000..5b5dab2
Binary files /dev/null and b/static/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png differ
diff --git a/static/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/static/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
new file mode 100644 (file)
index 0000000..ac8b229
Binary files /dev/null and b/static/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png differ
diff --git a/static/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/static/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
new file mode 100644 (file)
index 0000000..ad3d634
Binary files /dev/null and b/static/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png differ
diff --git a/static/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/static/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
new file mode 100644 (file)
index 0000000..42ccba2
Binary files /dev/null and b/static/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png differ
diff --git a/static/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/static/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png
new file mode 100644 (file)
index 0000000..5a46b47
Binary files /dev/null and b/static/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png differ
diff --git a/static/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png b/static/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
new file mode 100644 (file)
index 0000000..86c2baa
Binary files /dev/null and b/static/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png differ
diff --git a/static/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png b/static/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
new file mode 100644 (file)
index 0000000..4443fdc
Binary files /dev/null and b/static/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png differ
diff --git a/static/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/static/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
new file mode 100644 (file)
index 0000000..7c9fa6c
Binary files /dev/null and b/static/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ
diff --git a/static/css/smoothness/images/ui-icons_222222_256x240.png b/static/css/smoothness/images/ui-icons_222222_256x240.png
new file mode 100644 (file)
index 0000000..b273ff1
Binary files /dev/null and b/static/css/smoothness/images/ui-icons_222222_256x240.png differ
diff --git a/static/css/smoothness/images/ui-icons_2e83ff_256x240.png b/static/css/smoothness/images/ui-icons_2e83ff_256x240.png
new file mode 100644 (file)
index 0000000..09d1cdc
Binary files /dev/null and b/static/css/smoothness/images/ui-icons_2e83ff_256x240.png differ
diff --git a/static/css/smoothness/images/ui-icons_454545_256x240.png b/static/css/smoothness/images/ui-icons_454545_256x240.png
new file mode 100644 (file)
index 0000000..59bd45b
Binary files /dev/null and b/static/css/smoothness/images/ui-icons_454545_256x240.png differ
diff --git a/static/css/smoothness/images/ui-icons_888888_256x240.png b/static/css/smoothness/images/ui-icons_888888_256x240.png
new file mode 100644 (file)
index 0000000..6d02426
Binary files /dev/null and b/static/css/smoothness/images/ui-icons_888888_256x240.png differ
diff --git a/static/css/smoothness/images/ui-icons_cd0a0a_256x240.png b/static/css/smoothness/images/ui-icons_cd0a0a_256x240.png
new file mode 100644 (file)
index 0000000..2ab019b
Binary files /dev/null and b/static/css/smoothness/images/ui-icons_cd0a0a_256x240.png differ
diff --git a/static/css/smoothness/jquery-ui-1.8.13.custom.css b/static/css/smoothness/jquery-ui-1.8.13.custom.css
new file mode 100644 (file)
index 0000000..d3fb1c7
--- /dev/null
@@ -0,0 +1,578 @@
+/*
+ * jQuery UI CSS Framework 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+ * jQuery UI CSS Framework 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
+.ui-widget-header a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-right {  -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
+ * jQuery UI Resizable 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;
+       /* http://bugs.jqueryui.com/ticket/7233
+        - Resizable: resizable handles fail to work in IE if transparent and content overlaps
+       */
+       background-image:url(data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=);
+}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Accordion 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
+/*
+ * jQuery UI Autocomplete 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }      
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.13
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+       list-style:none;
+       padding: 2px;
+       margin: 0;
+       display:block;
+       float: left;
+}
+.ui-menu .ui-menu {
+       margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+       margin:0;
+       padding: 0;
+       zoom: 1;
+       float: left;
+       clear: left;
+       width: 100%;
+}
+.ui-menu .ui-menu-item a {
+       text-decoration:none;
+       display:block;
+       padding:.2em .4em;
+       line-height:1.5;
+       zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+       font-weight: normal;
+       margin: -1px;
+}
+/*
+ * jQuery UI Button 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Dialog 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Slider 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI Datepicker 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}/*
+ * jQuery UI Progressbar 1.8.13
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/static/django.gif b/static/django.gif
new file mode 100644 (file)
index 0000000..d3ff6e2
Binary files /dev/null and b/static/django.gif differ
diff --git a/static/grnet_logo.png b/static/grnet_logo.png
new file mode 100644 (file)
index 0000000..b1f097d
Binary files /dev/null and b/static/grnet_logo.png differ
diff --git a/static/header.png b/static/header.png
new file mode 100644 (file)
index 0000000..ce35745
Binary files /dev/null and b/static/header.png differ
diff --git a/static/javavnc/VncViewer.jar b/static/javavnc/VncViewer.jar
new file mode 100644 (file)
index 0000000..a387bfc
Binary files /dev/null and b/static/javavnc/VncViewer.jar differ
diff --git a/static/javavnc/hs_err_pid1450.log b/static/javavnc/hs_err_pid1450.log
new file mode 100644 (file)
index 0000000..2dc039e
--- /dev/null
@@ -0,0 +1,382 @@
+#
+# An unexpected error has been detected by Java Runtime Environment:
+#
+#  SIGSEGV (0xb) at pc=0x00007f64b6eab5b8, pid=1450, tid=140070529919248
+#
+# Java VM: Java HotSpot(TM) 64-Bit Server VM (11.2-b01 mixed mode linux-amd64)
+# Problematic frame:
+# C  [libc.so.6+0x305b8]  catgets+0x18
+#
+# If you would like to submit a bug report, please visit:
+#   http://java.sun.com/webapps/bugreport/crash.jsp
+# The crash happened outside the Java Virtual Machine in native code.
+# See problematic frame for where to report the bug.
+#
+
+---------------  T H R E A D  ---------------
+
+Current thread (0x0000000040a86c00):  JavaThread "main" [_thread_in_native, id=1451, stack(0x00007f64b61de000,0x00007f64b62df000)]
+
+siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0x0000000000000008
+
+Registers:
+RAX=0x0000000000000001, RBX=0x00007f646c1a09c0, RCX=0x00007f646baba78d, RDX=0x0000000000000001
+RSP=0x00007f64b62dd1e8, RBP=0x00007f64b62dd220, RSI=0x0000000000000013, RDI=0x0000000000000000
+R8 =0x0000000000000001, R9 =0x0000000000000000, R10=0x0000000000000000, R11=0x00007f64b6eab5a0
+R12=0x0000000000000105, R13=0x00007f646c0e9380, R14=0x000000000000000f, R15=0x00007f64b62dd6f8
+RIP=0x00007f64b6eab5b8, EFL=0x0000000000010202, CSGSFS=0x0000000000000033, ERR=0x0000000000000004
+  TRAPNO=0x000000000000000e
+
+Top of Stack: (sp=0x00007f64b62dd1e8)
+0x00007f64b62dd1e8:   00007f646c1a09c0 00007f64b62dd220
+0x00007f64b62dd1f8:   00007f646ba17cc6 00007f646c0e9380
+0x00007f64b62dd208:   00007f646c153df0 00007f646c153df0
+0x00007f64b62dd218:   00007f646c204b20 00007f64b62dd270
+0x00007f64b62dd228:   00007f646ba188e5 0000000000ca0001
+0x00007f64b62dd238:   0000000000000107 0000000000000000
+0x00007f64b62dd248:   00007f646c0e9380 00007f646b8d35e0
+0x00007f64b62dd258:   0000000000000105 0000000000000107
+0x00007f64b62dd268:   00007f646c204b20 0000000040a86dc0
+0x00007f64b62dd278:   00007f646b8d36ee 00007f646bbd81f0
+0x00007f64b62dd288:   00007f64b62dd310 00007f646c1a09c0
+0x00007f64b62dd298:   00007f646b8d43b3 00007f64b62dd2c0
+0x00007f64b62dd2a8:   00007f64b6705c37 0000000000000000
+0x00007f64b62dd2b8:   00007f646c170350 00007f646c170350
+0x00007f64b62dd2c8:   00050019b686e266 00007f646c0e9380
+0x00007f64b62dd2d8:   0101000000000000 00007f646c0dfe70
+0x00007f64b62dd2e8:   00007f646c1ea060 00007f646b43ab40
+0x00007f64b62dd2f8:   0000000000000000 00007f64b62dd6e8
+0x00007f64b62dd308:   0000000000000000 00007f646b22fa92
+0x00007f64b62dd318:   0000000000000000 00007f646b22fb18
+0x00007f64b62dd328:   0000000000000001 00007f646b22fa68
+0x00007f64b62dd338:   00007f646c154940 00007f646b22f03a
+0x00007f64b62dd348:   0000000000000020 00007f646b22f043
+0x00007f64b62dd358:   0000000000000018 00007f646b22f165
+0x00007f64b62dd368:   0000000000000000 00007f646b22f315
+0x00007f64b62dd378:   0000000000000005 00007f646b22f317
+0x00007f64b62dd388:   0000000000000019 00007f646b22f308
+0x00007f64b62dd398:   000000000000fff6 00007f646b22f08a
+0x00007f64b62dd3a8:   000000000000ffe2 00007f646baa6bab
+0x00007f64b62dd3b8:   00007f646c19e170 00007f646baa6bc7
+0x00007f64b62dd3c8:   00007f646c19e240 00007f646baa6bd5
+0x00007f64b62dd3d8:   00007f646c1b88f0 00007f646baa82df 
+
+Instructions: (pc=0x00007f64b6eab5b8)
+0x00007f64b6eab5a8:   53 74 6d 83 c6 01 85 f6 7e 66 85 d2 78 62 89 d0
+0x00007f64b6eab5b8:   4c 8b 4f 08 31 d2 0f af c6 48 8b 6f 18 4b 8d 1c 
+
+Stack: [0x00007f64b61de000,0x00007f64b62df000],  sp=0x00007f64b62dd1e8,  free space=1020k
+Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
+C  [libc.so.6+0x305b8]  catgets+0x18
+C  [libmawt.so+0x1a88e5]
+
+Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
+j  sun.awt.motif.MWindowPeer.pCreate(Lsun/awt/motif/MComponentPeer;Ljava/lang/String;)V+0
+j  sun.awt.motif.MWindowPeer.create(Lsun/awt/motif/MComponentPeer;)V+12
+j  sun.awt.motif.MComponentPeer.init(Ljava/awt/Component;)V+31
+j  sun.awt.motif.MWindowPeer.init(Ljava/awt/Window;)V+102
+j  sun.awt.motif.MFramePeer.<init>(Ljava/awt/Frame;)V+159
+j  sun.awt.motif.MToolkit.createFrame(Ljava/awt/Frame;)Ljava/awt/peer/FramePeer;+5
+j  java.awt.Frame.addNotify()V+20
+j  java.awt.Window.pack()V+28
+j  OptionsFrame.<init>(LVncViewer;)V+319
+j  VncViewer.init()V+79
+j  VncViewer.main([Ljava/lang/String;)V+24
+v  ~StubRoutines::call_stub
+
+---------------  P R O C E S S  ---------------
+
+Java Threads: ( => current thread )
+  0x00007f646c1f8000 JavaThread "AWT-Motif" daemon [_thread_blocked, id=1465, stack(0x00007f64696a4000,0x00007f64697a5000)]
+  0x00007f646c1f7000 JavaThread "AWT-Shutdown" [_thread_blocked, id=1464, stack(0x00007f64697a5000,0x00007f64698a6000)]
+  0x00007f646c185c00 JavaThread "Java2D Disposer" daemon [_thread_blocked, id=1463, stack(0x00007f6469dd9000,0x00007f6469eda000)]
+  0x00007f646c106800 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=1460, stack(0x00007f646beff000,0x00007f646c000000)]
+  0x00007f646c103800 JavaThread "CompilerThread1" daemon [_thread_blocked, id=1459, stack(0x00007f6470005000,0x00007f6470106000)]
+  0x00007f646c101800 JavaThread "CompilerThread0" daemon [_thread_blocked, id=1458, stack(0x00007f6470106000,0x00007f6470207000)]
+  0x00007f646c0ffc00 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=1457, stack(0x00007f6470207000,0x00007f6470308000)]
+  0x00007f646c0e1c00 JavaThread "Finalizer" daemon [_thread_blocked, id=1456, stack(0x00007f6470502000,0x00007f6470603000)]
+  0x00007f646c0e0400 JavaThread "Reference Handler" daemon [_thread_blocked, id=1455, stack(0x00007f6470603000,0x00007f6470704000)]
+=>0x0000000040a86c00 JavaThread "main" [_thread_in_native, id=1451, stack(0x00007f64b61de000,0x00007f64b62df000)]
+
+Other Threads:
+  0x00007f646c0dac00 VMThread [stack: 0x00007f6470704000,0x00007f6470805000] [id=1454]
+  0x00007f646c108c00 WatcherThread [stack: 0x00007f646bdfe000,0x00007f646beff000] [id=1462]
+
+VM state:not at safepoint (normal execution)
+
+VM Mutex/Monitor currently owned by a thread: None
+
+Heap
+ PSYoungGen      total 17920K, used 4312K [0x00007f649e340000, 0x00007f649f740000, 0x00007f64b2340000)
+  eden space 15360K, 28% used [0x00007f649e340000,0x00007f649e776240,0x00007f649f240000)
+  from space 2560K, 0% used [0x00007f649f4c0000,0x00007f649f4c0000,0x00007f649f740000)
+  to   space 2560K, 0% used [0x00007f649f240000,0x00007f649f240000,0x00007f649f4c0000)
+ PSOldGen        total 40960K, used 0K [0x00007f6476340000, 0x00007f6478b40000, 0x00007f649e340000)
+  object space 40960K, 0% used [0x00007f6476340000,0x00007f6476340000,0x00007f6478b40000)
+ PSPermGen       total 21248K, used 6239K [0x00007f6470f40000, 0x00007f6472400000, 0x00007f6476340000)
+  object space 21248K, 29% used [0x00007f6470f40000,0x00007f6471557da8,0x00007f6472400000)
+
+Dynamic libraries:
+40000000-40009000 r-xp 00000000 fe:00 139453                             /usr/lib/jvm/java-6-sun-1.6.0.12/jre/bin/java
+40108000-4010a000 rwxp 00008000 fe:00 139453                             /usr/lib/jvm/java-6-sun-1.6.0.12/jre/bin/java
+40a7f000-40eef000 rwxp 00000000 00:00 0                                  [heap]
+7f6469470000-7f6469479000 r-xs 00000000 fe:00 868862                     /var/cache/fontconfig/945677eb7aeaf62f1d50efc3fb3ec7d8-le64.cache-3
+7f6469479000-7f646947b000 r-xs 00000000 fe:00 868963                     /var/cache/fontconfig/fd9505950c048a77dc4b710eb6a628ed-le64.cache-3
+7f646947b000-7f646947f000 r-xs 00000000 fe:00 868962                     /var/cache/fontconfig/ddc79d3ea06a7c6ffa86ede85f3bb5df-le64.cache-3
+7f646947f000-7f6469481000 r-xs 00000000 fe:00 868961                     /var/cache/fontconfig/e3fa16a14183b06aa45b3e009278fd14-le64.cache-3
+7f6469481000-7f6469482000 r-xs 00000000 fe:00 868960                     /var/cache/fontconfig/e7071f4a29fa870f4323321c154eba04-le64.cache-3
+7f6469482000-7f6469484000 r-xs 00000000 fe:00 868959                     /var/cache/fontconfig/a2ab74764b07279e7c36ddb1d302cf26-le64.cache-3
+7f6469484000-7f6469487000 r-xs 00000000 fe:00 868958                     /var/cache/fontconfig/c69f04ab05004e31a6d5e715764f16d8-le64.cache-3
+7f6469487000-7f646948b000 r-xs 00000000 fe:00 868957                     /var/cache/fontconfig/6eb3985aa4124903f6ff08ba781cd364-le64.cache-3
+7f646948b000-7f646948e000 r-xs 00000000 fe:00 868956                     /var/cache/fontconfig/646addb8444faa74ee138aa00ab0b6a0-le64.cache-3
+7f646948e000-7f6469491000 r-xs 00000000 fe:00 868955                     /var/cache/fontconfig/20bd79ad97094406f7d1b9654bfbd926-le64.cache-3
+7f6469491000-7f6469492000 r-xs 00000000 fe:00 868954                     /var/cache/fontconfig/79517df041c92e3f2b4a9700e7dbe3c7-le64.cache-3
+7f6469492000-7f6469493000 r-xs 00000000 fe:00 868953                     /var/cache/fontconfig/4abdb2dd99886b2b2d3168a6b22d0473-le64.cache-3
+7f6469493000-7f6469495000 r-xs 00000000 fe:00 868952                     /var/cache/fontconfig/90e84e89a4382a8db77728561d41356d-le64.cache-3
+7f6469495000-7f6469496000 r-xs 00000000 fe:00 868951                     /var/cache/fontconfig/b73ae53b2eee308c3d7feb99ac2d34cd-le64.cache-3
+7f6469496000-7f6469497000 r-xs 00000000 fe:00 868950                     /var/cache/fontconfig/407fd690308a0b04640307de6deab6da-le64.cache-3
+7f6469497000-7f6469498000 r-xs 00000000 fe:00 868949                     /var/cache/fontconfig/8effb20bdbb106bdfb14f95f9ec7e12d-le64.cache-3
+7f6469498000-7f6469499000 r-xs 00000000 fe:00 868948                     /var/cache/fontconfig/27f6fa40476fb33ad65cb210c133a216-le64.cache-3
+7f6469499000-7f646949a000 r-xs 00000000 fe:00 868947                     /var/cache/fontconfig/98d684ad3abba16030bd60992dc9c5d7-le64.cache-3
+7f646949a000-7f646949c000 r-xs 00000000 fe:00 868946                     /var/cache/fontconfig/9123b38b1c36356a690c2f0bc4cbf728-le64.cache-3
+7f646949c000-7f64694a0000 r-xs 00000000 fe:00 868945                     /var/cache/fontconfig/9c0624108b9a2ae8552f664125be8356-le64.cache-3
+7f64694a0000-7f64694a9000 r-xs 00000000 fe:00 868944                     /var/cache/fontconfig/6d41288fd70b0be22e8c3a91e032eec0-le64.cache-3
+7f64694a9000-7f64694ac000 r-xs 00000000 fe:00 868943                     /var/cache/fontconfig/de156ccd2eddbdc19d37a45b8b2aac9c-le64.cache-3
+7f64694ac000-7f64694da000 r-xs 00000000 fe:00 868939                     /var/cache/fontconfig/365b55f210c0a22e9a19e35191240f32-le64.cache-3
+7f64694da000-7f64694e0000 r-xs 00000000 fe:00 868937                     /var/cache/fontconfig/105b9c7e6f0a4f82d8c9b6e39c52c6f9-le64.cache-3
+7f64696a4000-7f64696a7000 ---p 00000000 00:00 0 
+7f64696a7000-7f64697a5000 rwxp 00000000 00:00 0 
+7f64697a5000-7f64697a8000 ---p 00000000 00:00 0 
+7f64697a8000-7f64698a6000 rwxp 00000000 00:00 0 
+7f64698a6000-7f64698ab000 r-xp 00000000 fe:00 204802                     /usr/lib/libXfixes.so.3.1.0
+7f64698ab000-7f64699aa000 ---p 00005000 fe:00 204802                     /usr/lib/libXfixes.so.3.1.0
+7f64699aa000-7f64699ab000 rwxp 00004000 fe:00 204802                     /usr/lib/libXfixes.so.3.1.0
+7f64699ab000-7f64699b4000 r-xp 00000000 fe:00 55987                      /usr/lib/libXrender.so.1.3.0
+7f64699b4000-7f6469bb3000 ---p 00009000 fe:00 55987                      /usr/lib/libXrender.so.1.3.0
+7f6469bb3000-7f6469bb4000 rwxp 00008000 fe:00 55987                      /usr/lib/libXrender.so.1.3.0
+7f6469bb4000-7f6469bbd000 r-xp 00000000 fe:00 204812                     /usr/lib/libXcursor.so.1.0.2
+7f6469bbd000-7f6469dbd000 ---p 00009000 fe:00 204812                     /usr/lib/libXcursor.so.1.0.2
+7f6469dbd000-7f6469dbe000 rwxp 00009000 fe:00 204812                     /usr/lib/libXcursor.so.1.0.2
+7f6469dd9000-7f6469ddc000 ---p 00000000 00:00 0 
+7f6469ddc000-7f6469eda000 rwxp 00000000 00:00 0 
+7f6469eda000-7f6469f58000 r-xp 00000000 fe:00 139293                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libfontmanager.so
+7f6469f58000-7f646a05a000 ---p 0007e000 fe:00 139293                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libfontmanager.so
+7f646a05a000-7f646a070000 rwxp 00080000 fe:00 139293                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libfontmanager.so
+7f646a070000-7f646a081000 rwxp 00000000 00:00 0 
+7f646a081000-7f646a086000 r-xp 00000000 fe:00 55927                      /usr/lib/libXdmcp.so.6.0.0
+7f646a086000-7f646a285000 ---p 00005000 fe:00 55927                      /usr/lib/libXdmcp.so.6.0.0
+7f646a285000-7f646a286000 rwxp 00004000 fe:00 55927                      /usr/lib/libXdmcp.so.6.0.0
+7f646a286000-7f646a2a1000 r-xp 00000000 fe:00 55929                      /usr/lib/libxcb.so.1.0.0
+7f646a2a1000-7f646a4a1000 ---p 0001b000 fe:00 55929                      /usr/lib/libxcb.so.1.0.0
+7f646a4a1000-7f646a4a2000 rwxp 0001b000 fe:00 55929                      /usr/lib/libxcb.so.1.0.0
+7f646a4a2000-7f646a4a3000 r-xp 00000000 fe:00 55931                      /usr/lib/libxcb-xlib.so.0.0.0
+7f646a4a3000-7f646a6a2000 ---p 00001000 fe:00 55931                      /usr/lib/libxcb-xlib.so.0.0.0
+7f646a6a2000-7f646a6a3000 rwxp 00000000 fe:00 55931                      /usr/lib/libxcb-xlib.so.0.0.0
+7f646a6a3000-7f646a6b9000 r-xp 00000000 fe:00 52981                      /usr/lib/libICE.so.6.3.0
+7f646a6b9000-7f646a8b9000 ---p 00016000 fe:00 52981                      /usr/lib/libICE.so.6.3.0
+7f646a8b9000-7f646a8ba000 rwxp 00016000 fe:00 52981                      /usr/lib/libICE.so.6.3.0
+7f646a8ba000-7f646a8be000 rwxp 00000000 00:00 0 
+7f646a8be000-7f646a8c6000 r-xp 00000000 fe:00 52983                      /usr/lib/libSM.so.6.0.0
+7f646a8c6000-7f646aac5000 ---p 00008000 fe:00 52983                      /usr/lib/libSM.so.6.0.0
+7f646aac5000-7f646aac6000 rwxp 00007000 fe:00 52983                      /usr/lib/libSM.so.6.0.0
+7f646aac6000-7f646aac8000 r-xp 00000000 fe:00 55925                      /usr/lib/libXau.so.6.0.0
+7f646aac8000-7f646acc7000 ---p 00002000 fe:00 55925                      /usr/lib/libXau.so.6.0.0
+7f646acc7000-7f646acc8000 rwxp 00001000 fe:00 55925                      /usr/lib/libXau.so.6.0.0
+7f646acc8000-7f646acd1000 r-xp 00000000 fe:00 55985                      /usr/lib/libXi.so.6.0.0
+7f646acd1000-7f646aed0000 ---p 00009000 fe:00 55985                      /usr/lib/libXi.so.6.0.0
+7f646aed0000-7f646aed1000 rwxp 00008000 fe:00 55985                      /usr/lib/libXi.so.6.0.0
+7f646aed1000-7f646afd7000 r-xp 00000000 fe:00 55933                      /usr/lib/libX11.so.6.2.0
+7f646afd7000-7f646b1d7000 ---p 00106000 fe:00 55933                      /usr/lib/libX11.so.6.2.0
+7f646b1d7000-7f646b1dd000 rwxp 00106000 fe:00 55933                      /usr/lib/libX11.so.6.2.0
+7f646b1dd000-7f646b238000 r-xp 00000000 fe:00 52985                      /usr/lib/libXt.so.6.0.0
+7f646b238000-7f646b437000 ---p 0005b000 fe:00 52985                      /usr/lib/libXt.so.6.0.0
+7f646b437000-7f646b43d000 rwxp 0005a000 fe:00 52985                      /usr/lib/libXt.so.6.0.0
+7f646b43d000-7f646b43e000 rwxp 00000000 00:00 0 
+7f646b43e000-7f646b44e000 r-xp 00000000 fe:00 55935                      /usr/lib/libXext.so.6.4.0
+7f646b44e000-7f646b64e000 ---p 00010000 fe:00 55935                      /usr/lib/libXext.so.6.4.0
+7f646b64e000-7f646b64f000 rwxp 00010000 fe:00 55935                      /usr/lib/libXext.so.6.4.0
+7f646b64f000-7f646b654000 r-xp 00000000 fe:00 204935                     /usr/lib/libXtst.so.6.1.0
+7f646b654000-7f646b854000 ---p 00005000 fe:00 204935                     /usr/lib/libXtst.so.6.1.0
+7f646b854000-7f646b855000 rwxp 00005000 fe:00 204935                     /usr/lib/libXtst.so.6.1.0
+7f646b856000-7f646b85d000 r-xs 00000000 fe:00 868935                     /var/cache/fontconfig/089dead882dea3570ffc31a9898cfb69-le64.cache-3
+7f646b85d000-7f646b870000 r-xs 00000000 fe:00 868859                     /var/cache/fontconfig/e13b20fdb08344e0e664864cc2ede53d-le64.cache-3
+7f646b870000-7f646bad7000 r-xp 00000000 fe:00 139273                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/motif21/libmawt.so
+7f646bad7000-7f646bbd8000 ---p 00267000 fe:00 139273                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/motif21/libmawt.so
+7f646bbd8000-7f646bc2c000 rwxp 00268000 fe:00 139273                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/motif21/libmawt.so
+7f646bc2c000-7f646bc2f000 rwxp 00000000 00:00 0 
+7f646bc2f000-7f646bcc1000 r-xp 00000000 fe:00 139300                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libawt.so
+7f646bcc1000-7f646bdc0000 ---p 00092000 fe:00 139300                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libawt.so
+7f646bdc0000-7f646bdd9000 rwxp 00091000 fe:00 139300                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libawt.so
+7f646bdd9000-7f646bdfe000 rwxp 00000000 00:00 0 
+7f646bdfe000-7f646bdff000 ---p 00000000 00:00 0 
+7f646bdff000-7f646beff000 rwxp 00000000 00:00 0 
+7f646beff000-7f646bf02000 ---p 00000000 00:00 0 
+7f646bf02000-7f646c000000 rwxp 00000000 00:00 0 
+7f646c000000-7f646c21c000 rwxp 00000000 00:00 0 
+7f646c21c000-7f6470000000 ---p 00000000 00:00 0 
+7f6470002000-7f6470005000 r-xs 00000000 fe:00 868942                     /var/cache/fontconfig/da1bd5ca8443ffe22927a23ce431d198-le64.cache-3
+7f6470005000-7f6470008000 ---p 00000000 00:00 0 
+7f6470008000-7f6470106000 rwxp 00000000 00:00 0 
+7f6470106000-7f6470109000 ---p 00000000 00:00 0 
+7f6470109000-7f6470207000 rwxp 00000000 00:00 0 
+7f6470207000-7f647020a000 ---p 00000000 00:00 0 
+7f647020a000-7f6470308000 rwxp 00000000 00:00 0 
+7f6470308000-7f6470502000 r-xp 00000000 fe:00 67296                      /usr/lib/locale/locale-archive
+7f6470502000-7f6470505000 ---p 00000000 00:00 0 
+7f6470505000-7f6470603000 rwxp 00000000 00:00 0 
+7f6470603000-7f6470606000 ---p 00000000 00:00 0 
+7f6470606000-7f6470704000 rwxp 00000000 00:00 0 
+7f6470704000-7f6470705000 ---p 00000000 00:00 0 
+7f6470705000-7f6470838000 rwxp 00000000 00:00 0 
+7f6470838000-7f64709c9000 r-xs 02f2d000 fe:00 132439                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/rt.jar
+7f64709c9000-7f64709ca000 ---p 00000000 00:00 0 
+7f64709ca000-7f6470aca000 rwxp 00000000 00:00 0 
+7f6470aca000-7f6470acb000 ---p 00000000 00:00 0 
+7f6470acb000-7f6470bd6000 rwxp 00000000 00:00 0 
+7f6470bd6000-7f6470bf5000 rwxp 00000000 00:00 0 
+7f6470bf5000-7f6470c09000 rwxp 00000000 00:00 0 
+7f6470c09000-7f6470d35000 rwxp 00000000 00:00 0 
+7f6470d35000-7f6470d40000 rwxp 00000000 00:00 0 
+7f6470d40000-7f6470d5f000 rwxp 00000000 00:00 0 
+7f6470d5f000-7f6470d73000 rwxp 00000000 00:00 0 
+7f6470d73000-7f6470e9f000 rwxp 00000000 00:00 0 
+7f6470e9f000-7f6470ea9000 rwxp 00000000 00:00 0 
+7f6470ea9000-7f6470f3f000 rwxp 00000000 00:00 0 
+7f6470f3f000-7f6472400000 rwxp 00000000 00:00 0 
+7f6472400000-7f6476340000 rwxp 00000000 00:00 0 
+7f6476340000-7f6478b40000 rwxp 00000000 00:00 0 
+7f6478b40000-7f649e340000 rwxp 00000000 00:00 0 
+7f649e340000-7f649f740000 rwxp 00000000 00:00 0 
+7f649f740000-7f64b2340000 rwxp 00000000 00:00 0 
+7f64b2340000-7f64b2342000 r-xs 00000000 fe:00 868941                     /var/cache/fontconfig/ddd4086aec35a5275babba44bb759c3c-le64.cache-3
+7f64b2342000-7f64b25b2000 rwxp 00000000 00:00 0 
+7f64b25b2000-7f64b5342000 rwxp 00000000 00:00 0 
+7f64b5342000-7f64b5350000 r-xp 00000000 fe:00 139289                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libzip.so
+7f64b5350000-7f64b5452000 ---p 0000e000 fe:00 139289                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libzip.so
+7f64b5452000-7f64b5455000 rwxp 00010000 fe:00 139289                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libzip.so
+7f64b5455000-7f64b5456000 rwxp 00000000 00:00 0 
+7f64b5456000-7f64b547f000 r-xp 00000000 fe:00 139294                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libjava.so
+7f64b547f000-7f64b557e000 ---p 00029000 fe:00 139294                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libjava.so
+7f64b557e000-7f64b5585000 rwxp 00028000 fe:00 139294                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libjava.so
+7f64b5585000-7f64b5592000 r-xp 00000000 fe:00 139276                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libverify.so
+7f64b5592000-7f64b5691000 ---p 0000d000 fe:00 139276                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libverify.so
+7f64b5691000-7f64b5694000 rwxp 0000c000 fe:00 139276                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/libverify.so
+7f64b5694000-7f64b569f000 r-xp 00000000 fe:00 1081816                    /lib/libnss_files-2.10.2.so
+7f64b569f000-7f64b589e000 ---p 0000b000 fe:00 1081816                    /lib/libnss_files-2.10.2.so
+7f64b589e000-7f64b589f000 r-xp 0000a000 fe:00 1081816                    /lib/libnss_files-2.10.2.so
+7f64b589f000-7f64b58a0000 rwxp 0000b000 fe:00 1081816                    /lib/libnss_files-2.10.2.so
+7f64b58a0000-7f64b58aa000 r-xp 00000000 fe:00 1081798                    /lib/libnss_nis-2.10.2.so
+7f64b58aa000-7f64b5aa9000 ---p 0000a000 fe:00 1081798                    /lib/libnss_nis-2.10.2.so
+7f64b5aa9000-7f64b5aaa000 r-xp 00009000 fe:00 1081798                    /lib/libnss_nis-2.10.2.so
+7f64b5aaa000-7f64b5aab000 rwxp 0000a000 fe:00 1081798                    /lib/libnss_nis-2.10.2.so
+7f64b5aab000-7f64b5ab2000 r-xp 00000000 fe:00 1081787                    /lib/libnss_compat-2.10.2.so
+7f64b5ab2000-7f64b5cb1000 ---p 00007000 fe:00 1081787                    /lib/libnss_compat-2.10.2.so
+7f64b5cb1000-7f64b5cb2000 r-xp 00006000 fe:00 1081787                    /lib/libnss_compat-2.10.2.so
+7f64b5cb2000-7f64b5cb3000 rwxp 00007000 fe:00 1081787                    /lib/libnss_compat-2.10.2.so
+7f64b5cb3000-7f64b5cc8000 r-xp 00000000 fe:00 1081813                    /lib/libnsl-2.10.2.so
+7f64b5cc8000-7f64b5ec7000 ---p 00015000 fe:00 1081813                    /lib/libnsl-2.10.2.so
+7f64b5ec7000-7f64b5ec8000 r-xp 00014000 fe:00 1081813                    /lib/libnsl-2.10.2.so
+7f64b5ec8000-7f64b5ec9000 rwxp 00015000 fe:00 1081813                    /lib/libnsl-2.10.2.so
+7f64b5ec9000-7f64b5ecb000 rwxp 00000000 00:00 0 
+7f64b5ecb000-7f64b5ed2000 r-xp 00000000 fe:00 139313                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/native_threads/libhpi.so
+7f64b5ed2000-7f64b5fd3000 ---p 00007000 fe:00 139313                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/native_threads/libhpi.so
+7f64b5fd3000-7f64b5fd5000 rwxp 00008000 fe:00 139313                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/native_threads/libhpi.so
+7f64b5fd5000-7f64b5fd6000 rwxp 00000000 00:00 0 
+7f64b5fd6000-7f64b5fdd000 r-xp 00000000 fe:00 1081806                    /lib/librt-2.10.2.so
+7f64b5fdd000-7f64b61dc000 ---p 00007000 fe:00 1081806                    /lib/librt-2.10.2.so
+7f64b61dc000-7f64b61dd000 r-xp 00006000 fe:00 1081806                    /lib/librt-2.10.2.so
+7f64b61dd000-7f64b61de000 rwxp 00007000 fe:00 1081806                    /lib/librt-2.10.2.so
+7f64b61de000-7f64b61e1000 ---p 00000000 00:00 0 
+7f64b61e1000-7f64b62df000 rwxp 00000000 00:00 0                          [threadstack:000fd210]
+7f64b62df000-7f64b6360000 r-xp 00000000 fe:00 1081808                    /lib/libm-2.10.2.so
+7f64b6360000-7f64b655f000 ---p 00081000 fe:00 1081808                    /lib/libm-2.10.2.so
+7f64b655f000-7f64b6560000 r-xp 00080000 fe:00 1081808                    /lib/libm-2.10.2.so
+7f64b6560000-7f64b6561000 rwxp 00081000 fe:00 1081808                    /lib/libm-2.10.2.so
+7f64b6561000-7f64b6bee000 r-xp 00000000 fe:00 139284                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/server/libjvm.so
+7f64b6bee000-7f64b6ced000 ---p 0068d000 fe:00 139284                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/server/libjvm.so
+7f64b6ced000-7f64b6e3e000 rwxp 0068c000 fe:00 139284                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/server/libjvm.so
+7f64b6e3e000-7f64b6e7b000 rwxp 00000000 00:00 0 
+7f64b6e7b000-7f64b6fc5000 r-xp 00000000 fe:00 1081815                    /lib/libc-2.10.2.so
+7f64b6fc5000-7f64b71c5000 ---p 0014a000 fe:00 1081815                    /lib/libc-2.10.2.so
+7f64b71c5000-7f64b71c9000 r-xp 0014a000 fe:00 1081815                    /lib/libc-2.10.2.so
+7f64b71c9000-7f64b71ca000 rwxp 0014e000 fe:00 1081815                    /lib/libc-2.10.2.so
+7f64b71ca000-7f64b71cf000 rwxp 00000000 00:00 0 
+7f64b71cf000-7f64b71d1000 r-xp 00000000 fe:00 1081818                    /lib/libdl-2.10.2.so
+7f64b71d1000-7f64b73d1000 ---p 00002000 fe:00 1081818                    /lib/libdl-2.10.2.so
+7f64b73d1000-7f64b73d2000 r-xp 00002000 fe:00 1081818                    /lib/libdl-2.10.2.so
+7f64b73d2000-7f64b73d3000 rwxp 00003000 fe:00 1081818                    /lib/libdl-2.10.2.so
+7f64b73d3000-7f64b73e9000 r-xp 00000000 fe:00 1081817                    /lib/libpthread-2.10.2.so
+7f64b73e9000-7f64b75e9000 ---p 00016000 fe:00 1081817                    /lib/libpthread-2.10.2.so
+7f64b75e9000-7f64b75ea000 r-xp 00016000 fe:00 1081817                    /lib/libpthread-2.10.2.so
+7f64b75ea000-7f64b75eb000 rwxp 00017000 fe:00 1081817                    /lib/libpthread-2.10.2.so
+7f64b75eb000-7f64b75ef000 rwxp 00000000 00:00 0 
+7f64b75ef000-7f64b760c000 r-xp 00000000 fe:00 1081812                    /lib/ld-2.10.2.so
+7f64b760c000-7f64b7620000 r-xs 00000000 fe:00 868745                     /var/cache/fontconfig/865f88548240fee46819705c6468c165-le64.cache-3
+7f64b7620000-7f64b762a000 rwxp 00000000 00:00 0 
+7f64b762a000-7f64b76e0000 rwxp 00000000 00:00 0 
+7f64b76e0000-7f64b76e2000 rwxp 00000000 00:00 0 
+7f64b76e2000-7f64b76e9000 r-xp 00000000 fe:00 139282                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/jli/libjli.so
+7f64b76e9000-7f64b77ea000 ---p 00007000 fe:00 139282                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/jli/libjli.so
+7f64b77ea000-7f64b77ec000 rwxp 00008000 fe:00 139282                     /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/jli/libjli.so
+7f64b77ec000-7f64b77ed000 rwxp 00000000 00:00 0 
+7f64b77ed000-7f64b77ee000 r-xs 00000000 fe:00 868940                     /var/cache/fontconfig/4794a0821666d79190d59a36cb4f44b5-le64.cache-3
+7f64b77ee000-7f64b77f0000 r-xs 00000000 fe:00 868938                     /var/cache/fontconfig/de9486f0b47a4d768a594cb4198cb1c6-le64.cache-3
+7f64b77f0000-7f64b77f4000 r-xs 00000000 fe:00 868936                     /var/cache/fontconfig/6386b86020ecc1ef9690bb720a13964f-le64.cache-3
+7f64b77f4000-7f64b77f7000 r-xs 00000000 fe:00 868883                     /var/cache/fontconfig/7ef2298fde41cc6eeb7af42e48b7d293-le64.cache-3
+7f64b77f7000-7f64b77fa000 r-xs 00000000 fe:02 8841462                    /home/apoikos/.fontconfig/2584a6f7bcc9e47f9ed9a4a84c8c76e5-le64.cache-3
+7f64b77fa000-7f64b77fc000 r-xs 0000e000 fe:02 3034507                    /home/apoikos/hg/grnet/static/javavnc/VncViewer.jar
+7f64b77fc000-7f64b77fe000 r-xs 0000e000 fe:02 3034507                    /home/apoikos/hg/grnet/static/javavnc/VncViewer.jar
+7f64b77fe000-7f64b7806000 rwxs 00000000 fe:00 770054                     /tmp/hsperfdata_apoikos/1450
+7f64b7806000-7f64b7807000 rwxp 00000000 00:00 0 
+7f64b7807000-7f64b7808000 r-xp 00000000 00:00 0 
+7f64b7808000-7f64b780b000 rwxp 00000000 00:00 0 
+7f64b780b000-7f64b780c000 r-xp 0001c000 fe:00 1081812                    /lib/ld-2.10.2.so
+7f64b780c000-7f64b780d000 rwxp 0001d000 fe:00 1081812                    /lib/ld-2.10.2.so
+7fffd5581000-7fffd5596000 rwxp 00000000 00:00 0                          [stack]
+7fffd55ff000-7fffd5600000 r-xp 00000000 00:00 0                          [vdso]
+ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
+
+VM Arguments:
+java_command: VncViewer.jar HOST hn-03.be1.grnet.gr PORT 11038
+Launcher Type: SUN_STANDARD
+
+Environment Variables:
+PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/home/apoikos/scripts:/opt/openoffice.org3/program:/home/apoikos/scripts:/home/apoikos/workspaces:/opt/openoffice.org3/program
+USERNAME=apoikos
+LD_LIBRARY_PATH=/usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64/server:/usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/amd64:/usr/lib/jvm/java-6-sun-1.6.0.12/jre/../lib/amd64
+SHELL=/bin/zsh
+DISPLAY=:0.0
+
+Signal Handlers:
+SIGSEGV: [libjvm.so+0x5fcd20], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
+SIGBUS: [libjvm.so+0x5fcd20], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
+SIGFPE: [libjvm.so+0x4e0eb0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
+SIGPIPE: [libjvm.so+0x4e0eb0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
+SIGXFSZ: [libjvm.so+0x4e0eb0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
+SIGILL: [libjvm.so+0x4e0eb0], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
+SIGUSR1: SIG_DFL, sa_mask[0]=0x00000000, sa_flags=0x00000000
+SIGUSR2: [libjvm.so+0x4e35d0], sa_mask[0]=0x00000000, sa_flags=0x10000004
+SIGHUP: [libjvm.so+0x4e3320], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
+SIGINT: [libjvm.so+0x4e3320], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
+SIGTERM: [libjvm.so+0x4e3320], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
+SIGQUIT: [libjvm.so+0x4e3320], sa_mask[0]=0x7ffbfeff, sa_flags=0x10000004
+
+
+---------------  S Y S T E M  ---------------
+
+OS:5.0.4
+
+uname:Linux 2.6.32-trunk-amd64 #1 SMP Sun Jan 10 22:40:40 UTC 2010 x86_64
+libc:glibc 2.10.2 NPTL 2.10.2 
+rlimit: STACK 8192k, CORE 0k, NPROC 30634, NOFILE 1024, AS infinity
+load average:0.04 0.04 0.01
+
+CPU:total 2 (2 cores per cpu, 1 threads per core) family 6 model 7 stepping 10, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3
+
+Memory: 4k page, physical 3930156k(32944k free), swap 3903480k(3895184k free)
+
+vm_info: Java HotSpot(TM) 64-Bit Server VM (11.2-b01) for linux-amd64 JRE (1.6.0_12-b04), built on Jan 17 2009 01:04:06 by "java_re" with gcc 3.2.2 (SuSE Linux)
+
+time: Mon Mar  8 14:20:21 2010
+elapsed time: 0 seconds
+
diff --git a/static/js/jquery-1.5.1.min.js b/static/js/jquery-1.5.1.min.js
new file mode 100644 (file)
index 0000000..6437874
--- /dev/null
@@ -0,0 +1,16 @@
+/*!
+ * jQuery JavaScript Library v1.5.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Wed Feb 23 13:55:29 2011 -0500
+ */
+(function(a,b){function cg(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cd(a){if(!bZ[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";bZ[a]=c}return bZ[a]}function cc(a,b){var c={};d.each(cb.concat.apply([],cb.slice(0,b)),function(){c[this]=a});return c}function bY(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bX(){try{return new a.XMLHttpRequest}catch(b){}}function bW(){d(a).unload(function(){for(var a in bU)bU[a](0,1)})}function bQ(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bP(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bO(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bq.test(a)?e(a,f):bO(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bO(a+"["+f+"]",b[f],c,e)}function bN(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bH,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bN(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bN(a,c,d,e,"*",g));return l}function bM(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bB),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bo(a,b,c){var e=b==="width"?bi:bj,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function ba(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function _(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function $(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function Z(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function Y(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function O(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(J.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function N(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function F(a,b){return(a&&a!=="*"?a+".":"")+b.replace(r,"`").replace(s,"&")}function E(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,q=[],r=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(p,"")===a.type?r.push(g.selector):t.splice(i--,1);f=d(a.target).closest(r,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&q.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=q.length;j<k;j++){f=q[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function C(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function w(){return!0}function v(){return!1}function g(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function f(a,c,f){if(f===b&&a.nodeType===1){f=a.getAttribute("data-"+c);if(typeof f==="string"){try{f=f==="true"?!0:f==="false"?!1:f==="null"?null:d.isNaN(f)?e.test(f)?d.parseJSON(f):f:parseFloat(f)}catch(g){}d.data(a,c,f)}else f=b}return f}var c=a.document,d=function(){function I(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(I,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x=!1,y,z="then done fail isResolved isRejected promise".split(" "),A,B=Object.prototype.toString,C=Object.prototype.hasOwnProperty,D=Array.prototype.push,E=Array.prototype.slice,F=String.prototype.trim,G=Array.prototype.indexOf,H={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.1",length:0,size:function(){return this.length},toArray:function(){return E.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?D.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),y.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(E.apply(this,arguments),"slice",E.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:D,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;y.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=!0;if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",A,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",A),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&I()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):H[B.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!C.call(a,"constructor")&&!C.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||C.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:F?function(a){return a==null?"":F.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?D.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){c=1;try{while(a[0])a.shift().apply(d,f)}catch(g){throw g}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(d.isFunction(this.promise)?this.promise():this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),e;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(e)return e;e=a={}}var c=z.length;while(c--)a[z[c]]=b[z[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){var b=arguments.length,c=b<=1&&a&&d.isFunction(a.promise)?a:d.Deferred(),e=c.promise();if(b>1){var f=E.call(arguments,0),g=b,h=function(a){return function(b){f[a]=arguments.length>1?E.call(arguments,0):b,--g||c.resolveWith(e,f)}};while(b--)a=f[b],a&&d.isFunction(a.promise)?a.promise().then(h(b),c.reject):--g;g||c.resolveWith(e,f)}else c!==a&&c.resolve(a);return e},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),y=d._Deferred(),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){H["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),G&&(d.inArray=function(a,b){return G.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?A=function(){c.removeEventListener("DOMContentLoaded",A,!1),d.ready()}:c.attachEvent&&(A=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",A),d.ready())});return d}();(function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e),b=e=f=null}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function"),b=null;return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}})();var e=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!g(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,h=b.nodeType,i=h?d.cache:b,j=h?b[d.expando]:d.expando;if(!i[j])return;if(c){var k=e?i[j][f]:i[j];if(k){delete k[c];if(!g(k))return}}if(e){delete i[j][f];if(!g(i[j]))return}var l=i[j][f];d.support.deleteExpando||i!=a?delete i[j]:i[j]=null,l?(i[j]={},h||(i[j].toJSON=d.noop),i[j][f]=l):h&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var g=this[0].attributes,h;for(var i=0,j=g.length;i<j;i++)h=g[i].name,h.indexOf("data-")===0&&(h=h.substr(5),f(this[0],h,e[h]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=f(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var h=/[\n\t\r]/g,i=/\s+/,j=/\r/g,k=/^(?:href|src|style)$/,l=/^(?:button|input)$/i,m=/^(?:button|input|object|select|textarea)$/i,n=/^a(?:rea)?$/i,o=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(i);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var j=0,k=b.length;j<k;j++)g.indexOf(" "+b[j]+" ")<0&&(h+=" "+b[j]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(i);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var j=(" "+g.className+" ").replace(h," ");for(var k=0,l=c.length;k<l;k++)j=j.replace(" "+c[k]+" "," ");g.className=d.trim(j)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),j=b,k=a.split(i);while(f=k[g++])j=e?j:!h.hasClass(f),h[j?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(h," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var k=i?f:0,l=i?f+1:h.length;k<l;k++){var m=h[k];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(o.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(j,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&o.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=k.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&l.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var o=a.getAttributeNode("tabIndex");return o&&o.specified?o.value:m.test(a.nodeName)||n.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var p=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return p===null?b:p}h&&(a[c]=e);return a[c]}});var p=/\.(.*)$/,q=/^(?:textarea|input|select)$/i,r=/\./g,s=/ /g,t=/[^\w\s.|`]/g,u=function(a){return a.replace(t,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=v;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(){return typeof d!=="undefined"&&!d.event.triggered?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=v);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),u).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var w=s.handle;w&&(w.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(p,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=!0,l[m]())}catch(q){}k&&(l["on"+m]=k),d.event.triggered=!1}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,F(a.origType,a.selector),d.extend({},a,{handler:E,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,F(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?w:v):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=w;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=w;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=w,this.stopPropagation()},isDefaultPrevented:v,isPropagationStopped:v,isImmediatePropagationStopped:v};var x=function(a){var b=a.relatedTarget;try{if(b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},y=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?y:x,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?y:x)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&C("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&C("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var z,A=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},B=function B(a){var c=a.target,e,f;if(q.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=A(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:B,beforedeactivate:B,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&B.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&B.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",A(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in z)d.event.add(this,c+".specialChange",z[c]);return q.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return q.test(this.nodeName)}},z=d.event.special.change.filters,z.focus=z.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function c(a){a=d.event.fix(a),a.type=b;return d.event.handle.call(this,a)}d.event.special[b]={setup:function(){this.addEventListener(a,c,!0)},teardown:function(){this.removeEventListener(a,c,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var D={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=p.exec(h),k="",j&&(k=j[0],h=h.replace(p,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(D[h]+k),h=h+k):h=(D[h]||h)+k;if(c==="live")for(var q=0,r=n.length;q<r;q++)d.event.add(n[q],"live."+F(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+F(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){return"text"===a.getAttribute("type")},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector,d=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(e){d=!0}b&&(k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(d||!l.match.PSEUDO.test(c)&&!/!=/.test(c))return b.call(a,c)}catch(e){}return k(c,null,null,[a]).length>0})}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var G=/Until$/,H=/^(?:parents|prevUntil|prevAll)/,I=/,/,J=/^.[^:#\[\.,]*$/,K=Array.prototype.slice,L=d.expr.match.POS,M={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(O(this,a,!1),"not",a)},filter:function(a){return this.pushStack(O(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=L.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(N(c[0])||N(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=K.call(arguments);G.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!M[a]?d.unique(f):f,(this.length>1||I.test(e))&&H.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var P=/ jQuery\d+="(?:\d+|null)"/g,Q=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,S=/<([\w:]+)/,T=/<tbody/i,U=/<|&#?\w+;/,V=/<(?:script|object|embed|option|style)/i,W=/checked\s*(?:[^=]|=\s*.checked.)/i,X={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};X.optgroup=X.option,X.tbody=X.tfoot=X.colgroup=X.caption=X.thead,X.th=X.td,d.support.htmlSerialize||(X._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(P,""):null;if(typeof a!=="string"||V.test(a)||!d.support.leadingWhitespace&&Q.test(a)||X[(S.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(R,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&W.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?Y(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,ba)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!V.test(a[0])&&(d.support.checkClone||!W.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){$(a,e),f=_(a),g=_(e);for(h=0;f[h];++h)$(f[h],g[h])}if(b){Z(a,e);if(c){f=_(a),g=_(e);for(h=0;f[h];++h)Z(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||U.test(i)){if(typeof i==="string"){i=i.replace(R,"<$1></$2>");var j=(S.exec(i)||["",""])[1].toLowerCase(),k=X[j]||X._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=T.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&Q.test(i)&&m.insertBefore(b.createTextNode(Q.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bb=/alpha\([^)]*\)/i,bc=/opacity=([^)]*)/,bd=/-([a-z])/ig,be=/([A-Z])/g,bf=/^-?\d+(?:px)?$/i,bg=/^-?\d/,bh={position:"absolute",visibility:"hidden",display:"block"},bi=["Left","Right"],bj=["Top","Bottom"],bk,bl,bm,bn=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bk(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bk)return bk(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bd,bn)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bo(a,b,e):d.swap(a,bh,function(){f=bo(a,b,e)});if(f<=0){f=bk(a,b,b),f==="0px"&&bm&&(f=bm(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bf.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return bc.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bb.test(f)?f.replace(bb,e):c.filter+" "+e}}),c.defaultView&&c.defaultView.getComputedStyle&&(bl=function(a,c,e){var f,g,h;e=e.replace(be,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bm=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bf.test(d)&&bg.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bk=bl||bm,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var bp=/%20/g,bq=/\[\]$/,br=/\r?\n/g,bs=/#.*$/,bt=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bu=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bv=/(?:^file|^widget|\-extension):$/,bw=/^(?:GET|HEAD)$/,bx=/^\/\//,by=/\?/,bz=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bA=/^(?:select|textarea)/i,bB=/\s+/,bC=/([?&])_=[^&]*/,bD=/(^|\-)([a-z])/g,bE=function(a,b,c){return b+c.toUpperCase()},bF=/^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/,bG=d.fn.load,bH={},bI={},bJ,bK;try{bJ=c.location.href}catch(bL){bJ=c.createElement("a"),bJ.href="",bJ=bJ.href}bK=bF.exec(bJ.toLowerCase()),d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bG)return bG.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("<div>").append(c.replace(bz,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bA.test(this.nodeName)||bu.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(br,"\r\n")}}):{name:b.name,value:c.replace(br,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bJ,isLocal:bv.test(bK[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bM(bH),ajaxTransport:bM(bI),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bP(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bQ(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bD,bE)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bt.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bs,"").replace(bx,bK[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bB),e.crossDomain||(q=bF.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bK[1]||q[2]!=bK[2]||(q[3]||(q[1]==="http:"?80:443))!=(bK[3]||(bK[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bN(bH,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!bw.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(by.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bC,"$1_="+w);e.url=x+(x===e.url?(by.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bN(bI,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bO(g,a[g],c,f);return e.join("&").replace(bp,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bR=d.now(),bS=/(\=)\?(&|$)|()\?\?()/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bR++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bS.test(b.url)||f&&bS.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bS,l),b.url===j&&(f&&(k=k.replace(bS,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bT=d.now(),bU,bV;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bX()||bY()}:bX,bV=d.ajaxSettings.xhr(),d.support.ajax=!!bV,d.support.cors=bV&&"withCredentials"in bV,bV=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),(!a.crossDomain||a.hasContent)&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bU[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bU||(bU={},bW()),h=bT++,g.onreadystatechange=bU[h]=c):c()},abort:function(){c&&c(0,1)}}}});var bZ={},b$=/^(?:toggle|show|hide)$/,b_=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,ca,cb=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(cc("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cd(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cc("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(cc("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cd(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(b$.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=b_.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:cc("show",1),slideUp:cc("hide",1),slideToggle:cc("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!ca&&(ca=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(ca),ca=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var ce=/^t(?:able|d|h)$/i,cf=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=cg(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!ce.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),a=b=e=f=g=h=null,d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=e==="absolute"&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=cf.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!cf.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=cg(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=cg(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window);
\ No newline at end of file
diff --git a/static/js/jquery-ui-1.8.12.custom.min.js b/static/js/jquery-ui-1.8.12.custom.min.js
new file mode 100644 (file)
index 0000000..1b1c88f
--- /dev/null
@@ -0,0 +1,783 @@
+/*!
+ * jQuery UI 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.12",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,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,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
+"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
+if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
+"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,
+d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
+c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
+b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
+;/*!
+ * jQuery UI Widget 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
+a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
+e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
+this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_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(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
+enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
+;/*!
+ * jQuery UI Mouse 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *     jquery.ui.widget.js
+ */
+(function(b){b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(c){return a._mouseDown(c)}).bind("click."+this.widgetName,function(c){if(true===b.data(c.target,a.widgetName+".preventClickEvent")){b.removeData(c.target,a.widgetName+".preventClickEvent");c.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=
+a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&this._mouseUp(a);this._mouseDownEvent=a;var c=this,e=a.which==1,f=typeof this.options.cancel=="string"?b(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){c.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=
+this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();return true}}true===b.data(a.target,this.widgetName+".preventClickEvent")&&b.removeData(a.target,this.widgetName+".preventClickEvent");this._mouseMoveDelegate=function(d){return c._mouseMove(d)};this._mouseUpDelegate=function(d){return c._mouseUp(d)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);a.preventDefault();return a.originalEvent.mouseHandled=
+true}},_mouseMove:function(a){if(b.browser.msie&&!(document.documentMode>=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);
+if(this._mouseStarted){this._mouseStarted=false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
+;/*
+ * jQuery UI Position 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY,
+left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+=
+k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-=
+m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left=
+d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+=
+a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
+g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
+;/*
+ * jQuery UI Draggable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.draggable",d.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")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b=
+this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-
+this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();
+d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.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";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&
+this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==
+a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||
+0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],
+this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-
+(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.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,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),
+height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[(a.containment=="document"?0:d(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(a.containment=="document"?0:d(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?
+document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),
+10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0),a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),
+10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom]}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&
+d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],
+this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])e=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=
+this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;e=this.originalPageX+Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=this.containment?!(e-this.offset.click.left<this.containment[0]||e-this.offset.click.left>this.containment[2])?
+e:!(e-this.offset.click.left<this.containment[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():
+f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,
+offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.12"});d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var g=d.data(this,"sortable");if(g&&!g.options.disabled){c.sortables.push({instance:g,shouldRevert:g.options.revert});g.refreshPositions();g._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},
+b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=
+d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=d(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};
+a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&
+this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",
+{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","iframeFix",{start:function(){var a=d(this).data("draggable").options;d(a.iframeFix===true?"iframe":a.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+
+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",
+a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+
+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX-b.overflowOffset.left<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<
+c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()-c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+
+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable","snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this,width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),
+f=c.options,e=f.snapTolerance,g=b.offset.left,n=g+c.helperProportions.width,m=b.offset.top,o=m+c.helperProportions.height,h=c.snapElements.length-1;h>=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e<g&&g<k+e&&j-e<m&&m<l+e||i-e<g&&g<k+e&&j-e<o&&o<l+e||i-e<n&&n<k+e&&j-e<m&&m<l+e||i-e<n&&n<k+e&&j-e<o&&o<l+e){if(f.snapMode!="inner"){var p=Math.abs(j-o)<=e,q=Math.abs(l-m)<=e,r=Math.abs(i-n)<=e,s=Math.abs(k-g)<=e;if(p)b.position.top=
+c._convertPositionTo("relative",{top:j-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k}).left-c.margins.left}var t=p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(j-m)<=e;q=Math.abs(l-o)<=e;r=Math.abs(i-g)<=e;s=Math.abs(k-n)<=e;if(p)b.position.top=
+c._convertPositionTo("relative",{top:j,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l-c.helperProportions.height,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[h].snapping&&(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),
+{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=p||q||r||s||t}else{c.snapElements[h].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=
+parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
+;/*
+ * jQuery UI Droppable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.draggable.js
+ */
+(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this);
+a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&
+this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
+this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=
+d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
+a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.12"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
+switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=
+i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!=
+"none";if(c[f].visible){e=="mousedown"&&c[f]._activate.call(c[f],b);c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight}}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem||
+a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e=
+d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})}}})(jQuery);
+;/*
+ * jQuery UI Resizable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.resizable",e.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:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
+_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('<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")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;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});this.originalResizeStyle=
+this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".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 c=this.handles.split(",");this.handles={};for(var d=0;d<c.length;d++){var f=e.trim(c[d]),g=e('<div class="ui-resizable-handle '+("ui-resizable-"+f)+'"></div>');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor==
+String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection();
+this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};
+if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),
+d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=
+this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:
+this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",
+b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;
+f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");
+this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=
+null}if(d=="nw"){b.top=a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=l(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=l(b.width)&&a.minWidth&&a.minWidth>b.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+
+this.size.height,k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=
+[c.css("borderTopWidth"),c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=
+this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,
+a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,
+c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,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}}});e.extend(e.ui.resizable,{version:"1.8.12"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=
+b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width",
+"height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};
+if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-
+g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,
+height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=
+e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,
+d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?
+d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=
+a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&
+/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");
+b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/
+(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
+;/*
+ * jQuery UI Selectable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
+selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},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(c){var f=this;this.opos=[c.pageX,
+c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting",
+c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d=
+this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");
+a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&
+!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=
+e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.12"})})(jQuery);
+;/*
+ * jQuery UI Sortable 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.sortable",d.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:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable");
+this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=
+b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;
+d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-
+this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};
+this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=
+document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);
+return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<
+b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-
+b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,
+a)}this.positionAbs=this._convertPositionTo("absolute");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";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],
+e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();
+c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):
+this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,
+dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},
+toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||
+this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?j:g<b+this.helperProportions.width/2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();
+var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?c&&c=="right"||a=="down"?2:1:a&&(a=="down"?2:1)},_intersectsWithSides:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},
+_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();
+if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),
+this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),
+this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&
+this.helper)this.offset.parent=this._getParentOffset();for(var b=this.items.length-1;b>=0;b--){var c=this.items[b];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=
+this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=
+d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||
+0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",
+a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-
+f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a,null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change",a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=
+this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length||d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[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(a[0].style.width==
+""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=
+this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a=
+{top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.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 a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?
+document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b=d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),
+10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=
+this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&
+this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();
+var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])f=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-
+this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f-this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-
+this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],
+this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g==f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&&this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]=
+"";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",f,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])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",
+f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,
+this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",
+a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},
+_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.12"})})(jQuery);
+;/*
+ * jQuery UI Accordion 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ */
+(function(c){c.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 a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");
+a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
+if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion",
+function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a=
+this.options;if(a.icons){c("<span></span>").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.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 a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex");
+this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons();
+b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target);
+a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+
+c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options;
+if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);
+if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(),
+e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight||
+e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",
+"aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.12",
+animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);
+f[i]={value:j[1],unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",
+paddingTop:"hide",paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery);
+;/*
+ * jQuery UI Autocomplete 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ *     jquery.ui.position.js
+ */
+(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){g=
+false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=
+a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};
+this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&&
+a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");
+d.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();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&&
+b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source=
+this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)},_search:function(a){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(!this.options.disabled&&a&&a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();
+this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",a)}},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return d.map(a,function(b){if(typeof b==="string")return{label:b,value:b};return d.extend({label:b.label||
+b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();b.show();this._resizeMenu();b.position(d.extend({of:this.element},this.options.position));this.options.autoFocus&&this.menu.next(new d.Event("mouseover"))},_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(a,b){var g=this;
+d.each(b,function(c,f){g._renderItem(a,f)})},_renderItem:function(a,b){return d("<li></li>").data("item.autocomplete",b).append(d("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,
+"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery);
+(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
+-1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.attr("scrollTop"),c=this.element.height();if(b<0)this.element.attr("scrollTop",g+b);else b>=c&&this.element.attr("scrollTop",g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},
+deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);
+e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b,this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,
+g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));
+this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(e){this._trigger("selected",e,{item:this.active})}})})(jQuery);
+;/*
+ * jQuery UI Button 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ */
+(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,f=a([]);if(c)f=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return f};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",
+i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",f="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",
+function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(f)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");
+b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var e=b.element[0];h(e).not(e).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");
+g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(e){if(c.disabled)return false;if(e.keyCode==a.ui.keyCode.SPACE||e.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(e){e.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",
+c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){var b=this.element.parents().filter(":last"),c="label[for="+this.element.attr("id")+"]";this.buttonElement=b.find(c);if(!this.buttonElement.length){b=b.length?b.siblings():this.element.siblings();this.buttonElement=b.filter(c);if(!this.buttonElement.length)this.buttonElement=b.find(c)}this.element.addClass("ui-helper-hidden-accessible");
+(b=this.element.is(":checked"))&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active  ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());
+this.hasTitle||this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
+true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
+c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,f=d.primary&&d.secondary,e=[];if(d.primary||d.secondary){if(this.options.text)e.push("ui-button-text-icon"+(f?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){e.push(f?"ui-button-icons-only":
+"ui-button-icon-only");this.hasTitle||b.attr("title",c)}}else e.push("ui-button-text-only");b.addClass(e.join(" "))}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(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 a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery);
+;/*
+ * jQuery UI Dialog 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * 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(c,l){var m={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},n={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true},o=c.attrFn||{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true,click:true};c.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:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||"&#160;",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+
+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),
+h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",
+e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");
+a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==
+b.uiDialog[0]){e=c(this).css("z-index");isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=
+1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===
+f[0]&&e.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,
+function(){return!(d=true)});if(d){c.each(a,function(f,h){h=c.isFunction(h)?{click:h,text:f}:h;var i=c('<button type="button"></button>').click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.each(h,function(j,k){if(j!=="click")j in o?i[j](k):i.attr(j,k)});c.fn.button&&i.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",
+handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,
+originalSize:f.originalSize,position:f.position,size:f.size}}a=a===l?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",
+f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):
+[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);
+if(g in m)e=true;if(g in n)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):
+e.removeClass("ui-dialog-disabled");break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||"&#160;"));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=
+this.options,b,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-
+b,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.12",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),
+create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),
+height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
+b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,
+function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
+;/*
+ * jQuery UI Slider 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.mouse.js
+ *     jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.slider",d.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 b=this,a=this.options;this._mouseSliding=this._keySliding=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");a.disabled&&this.element.addClass("ui-slider-disabled ui-disabled");
+this.range=d([]);if(a.range){if(a.range===true){this.range=d("<div></div>");if(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}else this.range=d("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(a.range==="min"||a.range==="max")this.range.addClass("ui-slider-range-"+a.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");
+if(a.values&&a.values.length)for(;d(".ui-slider-handle",this.element).length<a.values.length;)d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".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(c){c.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur();
+else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!b.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e=
+false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");h=b._start(c,f);if(h===false)return}break}i=b.options.step;h=b.options.values&&b.options.values.length?(g=b.values(f)):(g=b.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=b._valueMin();break;case d.ui.keyCode.END:g=b._valueMax();break;case d.ui.keyCode.PAGE_UP:g=b._trimAlignValue(h+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=b._trimAlignValue(h-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h===
+b._valueMax())return;g=b._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===b._valueMin())return;g=b._trimAlignValue(h-i);break}b._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(c,e);b._change(c,e);d(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(b){var a=this.options,c,e,f,h,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(a.range===true&&this.values(1)===a.min){g+=1;f=d(this.handles[g])}if(this._start(b,
+g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();a=f.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-f.width()/2,top:b.pageY-a.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true},
+_mouseDrag:function(b){var a=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a;
+if(this.orientation==="horizontal"){a=this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=
+this.values(a);c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var e;if(this.options.values&&this.options.values.length){e=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>e||a===1&&c<e))c=e;if(c!==this.values(a)){e=this.values();e[a]=c;b=this._trigger("slide",b,{handle:this.handles[a],value:c,values:e});this.values(a?0:1);b!==false&&this.values(a,c,true)}}else if(c!==this.value()){b=this._trigger("slide",b,{handle:this.handles[a],
+value:c});b!==false&&this.value(c)}},_stop:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("stop",b,c)},_change:function(b,a){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("change",b,c)}},value:function(b){if(arguments.length){this.options.value=
+this._trimAlignValue(b);this._refreshValue();this._change(null,0)}else return this._value()},values:function(b,a){var c,e,f;if(arguments.length>1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f<c.length;f+=1){c[f]=this._trimAlignValue(e[f]);this._change(null,f)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(b):
+this.value();else return this._values()},_setOption:function(b,a){var c,e=0;if(d.isArray(this.options.values))e=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(b){case "disabled":if(a){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(c=0;c<e;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var b=this.options.value;return b=this._trimAlignValue(b)},_values:function(b){var a,c;if(arguments.length){a=this.options.values[b];
+return a=this._trimAlignValue(a)}else{a=this.options.values.slice();for(c=0;c<a.length;c+=1)a[c]=this._trimAlignValue(a[c]);return a}},_trimAlignValue:function(b){if(b<=this._valueMin())return this._valueMin();if(b>=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},
+_refreshValue:function(){var b=this.options.range,a=this.options,c=this,e=!this._animateOff?a.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate);
+if(k===1)c.range[e?"animate":"css"]({width:f-g+"%"},{queue:false,duration:a.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:a.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1,
+1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.12"})})(jQuery);
+;/*
+ * jQuery UI Tabs 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ */
+(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,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(b,e){if(b=="selected")this.options.collapsible&&
+e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=
+d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]||
+(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){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");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));
+this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+
+g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",
+function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};
+this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=
+-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=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 e=
+d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(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")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b,
+e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);
+j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove();
+if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=b}),function(h){return h>=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null,
+this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this},
+load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c,
+"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},
+url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.12"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&
+a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
+;/*
+ * jQuery UI Datepicker 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ */
+(function(d,A){function K(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
+"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
+"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
+minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}function F(a,b){d.extend(a,b);for(var c in b)if(b[c]==
+null||b[c]==A)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.12"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){F(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();
+f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},
+_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&
+b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==
+""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,
+c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),
+true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}F(a.settings,e||{});
+b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);
+this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",
+this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,
+function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:
+f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},
+e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&&this._hideDatepicker();var h=this._getDateDatepicker(a,true),i=this._getMinMaxDate(e,"min"),g=this._getMinMaxDate(e,"max");F(e.settings,f);if(i!==null&&f.dateFormat!==A&&f.minDate===A)e.settings.minDate=this._formatDate(e,i);if(g!==null&&f.dateFormat!==A&&f.maxDate===A)e.settings.maxDate=this._formatDate(e,g);this._attachments(d(a),e);this._autoSize(e);this._setDateDatepicker(a,h);this._updateDatepicker(e)}},
+_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");
+b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass+":not(."+d.datepicker._currentClass+")",b.dpDiv);c[0]?d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker();return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),
+"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?
+-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,
++7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));var c=String.fromCharCode(a.charCode==A?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);
+if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);
+d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");F(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=
+document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");
+var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=
+b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var e=a.dpDiv.find("iframe.ui-datepicker-cover");e.length&&e.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");
+this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+
+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&
+a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():
+0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),
+"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?
+"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=
+d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=
+d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c==
+"M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=
+b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();
+this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);
+a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?
+c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=z+1<a.length&&a.charAt(z+1)==p)&&z++;return p},m=function(p){var v=o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"&&v?4:p=="o"?3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,v,H){p=o(p)?H:v;for(v=0;v<p.length;v++)if(b.substr(s,p[v].length).toLowerCase()==p[v].toLowerCase()){s+=p[v].length;return v+1}throw"Unknown name at position "+
+s;},r=function(){if(b.charAt(s)!=a.charAt(z))throw"Unexpected literal at position "+s;s++},s=0,z=0;z<a.length;z++)if(k)if(a.charAt(z)=="'"&&!o("'"))k=false;else r();else switch(a.charAt(z)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":j=m("m");break;case "M":j=n("M",i,g);break;case "y":c=m("y");break;case "@":var w=new Date(m("@"));c=w.getFullYear();j=w.getMonth()+1;l=w.getDate();break;case "!":w=new Date((m("!")-this._ticksTo1970)/1E4);c=w.getFullYear();j=w.getMonth()+
+1;l=w.getDate();break;case "'":if(o("'"))r();else k=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}w=this._daylightSavingAdjust(new Date(c,j-1,l));if(w.getFullYear()!=c||w.getMonth()+1!=j||w.getDate()!=l)throw"Invalid date";return w},ATOM:"yy-mm-dd",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",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+1<a.length&&
+a.charAt(k+1)==o)&&k++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},j=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var k=0;k<a.length;k++)if(u)if(a.charAt(k)=="'"&&!i("'"))u=false;else l+=a.charAt(k);else switch(a.charAt(k)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=j("D",b.getDay(),e,f);break;case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=j("M",
+b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(k)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+=
+"0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==A?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=
+f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=
+(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,j=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,k=u.exec(h);k;){switch(k[2]||"d"){case "d":case "D":g+=parseInt(k[1],10);break;case "w":case "W":g+=parseInt(k[1],10)*7;break;case "m":case "M":l+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break;case "y":case "Y":j+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break}k=u.exec(h)}return new Date(j,
+l,g)};if(b=(b=b==null||b===""?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):new Date(b.getTime()))&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=
+a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),
+b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=
+this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&n<k?k:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', -"+j+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', +"+j+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;j=!h?j:this.formatDate(j,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+y+'.datepicker._hideDatepicker();">'+this._get(a,
+"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._gotoToday('#"+a.id+"');\">"+j+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=
+this._get(a,"monthNames"),w=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),v=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var L=this._getDefaultDate(a),I="",D=0;D<i[0];D++){for(var M="",E=0;E<i[1];E++){var N=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",x="";if(l){x+='<div class="ui-datepicker-group';if(i[1]>1)switch(E){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-
+1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&D==0?c?f:n:"")+(/all|right/.test(t)&&D==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,D>0||E>0,z,w)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var B=j?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=
+(t+h)%7;B+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}x+=B+"</tr></thead><tbody>";B=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,B);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;B=l?6:Math.ceil((t+B)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O<B;O++){x+="<tr>";var P=!j?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var G=
+p?p.apply(a.input?a.input[0]:null,[q]):[true,""],C=q.getMonth()!=g,J=C&&!H||!G[0]||k&&q<k||o&&q>o;P+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(C?" ui-datepicker-other-month":"")+(q.getTime()==N.getTime()&&g==a.selectedMonth&&a._keyEvent||L.getTime()==q.getTime()&&L.getTime()==N.getTime()?" "+this._dayOverClass:"")+(J?" "+this._unselectableClass+" ui-state-disabled":"")+(C&&!v?"":" "+G[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":
+""))+'"'+((!C||v)&&G[2]?' title="'+G[2]+'"':"")+(J?"":' onclick="DP_jQuery_'+y+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(C&&!v?"&#xa0;":J?'<span class="ui-state-default">'+q.getDate()+"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==u.getTime()?" ui-state-active":"")+(C?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=
+P+"</tr>"}g++;if(g>11){g=0;m++}x+="</tbody></table>"+(l?"</div>"+(i[0]>0&&E==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");M+=x}I+=M}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='<div class="ui-datepicker-title">',
+o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(k+=o+(h||!(j&&
+l)?"&#xa0;":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+
+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";if(d.browser.mozilla)k+='<select class="ui-datepicker-year"><option value="'+c+'" selected="selected">'+c+"</option></select>";else{k+=a.yearshtml;a.yearshtml=null}}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?"&#xa0;":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e=
+a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,
+"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);
+c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,
+"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=
+function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,
+[this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.12";window["DP_jQuery_"+y]=d})(jQuery);
+;/*
+ * jQuery UI Progressbar 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ */
+(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this.oldValue=this._value();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();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*
+this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.12"})})(jQuery);
+;/*
+ * jQuery UI Effects 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+jQuery.effects||function(f,j){function n(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
+16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return o.transparent;return o[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return n(b)}function p(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
+a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function q(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d=
+a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function m(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
+"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=n(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var o={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]},r=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,
+d){if(f.isFunction(b)){d=b;b=null}return this.queue("fx",function(){var e=f(this),g=e.attr("style")||" ",h=q(p.call(this)),l,v=e.attr("className");f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});l=q(p.call(this));e.attr("className",v);e.animate(u(h,l),a,b,function(){f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)});h=f.queue(this);l=h.splice(h.length-1,1)[0];
+h.splice(1,0,l);f.dequeue(this)})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,
+a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.12",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,
+a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",
+border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);
+return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(c))return this._show.apply(this,arguments);
+else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(m(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(m(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),
+b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,
+a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,
+a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==
+e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=
+g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/
+h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,
+a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
+;/*
+ * jQuery UI Effects Blind 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,
+g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery);
+;/*
+ * jQuery UI Effects Bounce 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","bottom","left","right"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/
+3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a);
+b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Clip 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,
+c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Drop 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e==
+"show"?1:0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Explode 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f=
+0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+
+e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery);
+;/*
+ * jQuery UI Effects Fade 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Fold 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],
+10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
+;/*
+ * jQuery UI Effects Highlight 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
+this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Pulsate 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration,
+a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Scale 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a,
+b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity=
+1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","bottom","left","right","width","height","overflow","opacity"],g=["position","top","bottom","left","right","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],
+p=c.effects.setMode(a,b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};
+if(m=="box"||m=="both"){if(d.from.y!=d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);
+a.css("overflow","hidden").css(a.from);if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);
+child.to=c.effects.setTransition(child,f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,
+n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Shake 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","bottom","left","right"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=
+(h=="pos"?"-=":"+=")+e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Slide 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right"],f=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var g=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var e=d.options.distance||(g=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(f=="show")a.css(g,b=="pos"?isNaN(e)?"-"+e:-e:e);
+var i={};i[g]=(f=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+e;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Transfer 1.8.12
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ *     jquery.effects.core.js
+ */
+(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments);
+b.dequeue()})})}})(jQuery);
+;
\ No newline at end of file
diff --git a/static/js/jquery.dataTables.js b/static/js/jquery.dataTables.js
new file mode 100644 (file)
index 0000000..620fe51
--- /dev/null
@@ -0,0 +1,6864 @@
+/*
+ * File:        jquery.dataTables.js
+ * Version:     1.7.6
+ * Description: Paginate, search and sort HTML tables
+ * Author:      Allan Jardine (www.sprymedia.co.uk)
+ * Created:     28/3/2008
+ * Language:    Javascript
+ * License:     GPL v2 or BSD 3 point style
+ * Project:     Mtaala
+ * Contact:     allan.jardine@sprymedia.co.uk
+ * 
+ * Copyright 2008-2010 Allan Jardine, all rights reserved.
+ *
+ * This source file is free software, under either the GPL v2 license or a
+ * BSD style license, as supplied with this software.
+ * 
+ * This source file is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
+ * 
+ * For details please refer to: http://www.datatables.net
+ */
+
+/*
+ * When considering jsLint, we need to allow eval() as it it is used for reading cookies and 
+ * building the dynamic multi-column sort functions.
+ */
+/*jslint evil: true, undef: true, browser: true */
+/*globals $, jQuery,_fnExternApiFunc,_fnInitalise,_fnInitComplete,_fnLanguageProcess,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnGatherData,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxUpdateDraw,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnArrayCmp,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap*/
+
+(function($, window, document) {
+       /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+        * Section - DataTables variables
+        * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+       
+       /*
+        * Variable: dataTableSettings
+        * Purpose:  Store the settings for each dataTables instance
+        * Scope:    jQuery.fn
+        */
+       $.fn.dataTableSettings = [];
+       var _aoSettings = $.fn.dataTableSettings; /* Short reference for fast internal lookup */
+       
+       /*
+        * Variable: dataTableExt
+        * Purpose:  Container for customisable parts of DataTables
+        * Scope:    jQuery.fn
+        */
+       $.fn.dataTableExt = {};
+       var _oExt = $.fn.dataTableExt;
+       
+       
+       /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+        * Section - DataTables extensible objects
+        * 
+        * The _oExt object is used to provide an area where user dfined plugins can be 
+        * added to DataTables. The following properties of the object are used:
+        *   oApi - Plug-in API functions
+        *   aTypes - Auto-detection of types
+        *   oSort - Sorting functions used by DataTables (based on the type)
+        *   oPagination - Pagination functions for different input styles
+        * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+       
+       /*
+        * Variable: sVersion
+        * Purpose:  Version string for plug-ins to check compatibility
+        * Scope:    jQuery.fn.dataTableExt
+        * Notes:    Allowed format is a.b.c.d.e where:
+        *   a:int, b:int, c:int, d:string(dev|beta), e:int. d and e are optional
+        */
+       _oExt.sVersion = "1.7.6";
+       
+       /*
+        * Variable: sErrMode
+        * Purpose:  How should DataTables report an error. Can take the value 'alert' or 'throw'
+        * Scope:    jQuery.fn.dataTableExt
+        */
+       _oExt.sErrMode = "alert";
+       
+       /*
+        * Variable: iApiIndex
+        * Purpose:  Index for what 'this' index API functions should use
+        * Scope:    jQuery.fn.dataTableExt
+        */
+       _oExt.iApiIndex = 0;
+       
+       /*
+        * Variable: oApi
+        * Purpose:  Container for plugin API functions
+        * Scope:    jQuery.fn.dataTableExt
+        */
+       _oExt.oApi = { };
+       
+       /*
+        * Variable: aFiltering
+        * Purpose:  Container for plugin filtering functions
+        * Scope:    jQuery.fn.dataTableExt
+        */
+       _oExt.afnFiltering = [ ];
+       
+       /*
+        * Variable: aoFeatures
+        * Purpose:  Container for plugin function functions
+        * Scope:    jQuery.fn.dataTableExt
+        * Notes:    Array of objects with the following parameters:
+        *   fnInit: Function for initialisation of Feature. Takes oSettings and returns node
+        *   cFeature: Character that will be matched in sDom - case sensitive
+        *   sFeature: Feature name - just for completeness :-)
+        */
+       _oExt.aoFeatures = [ ];
+       
+       /*
+        * Variable: ofnSearch
+        * Purpose:  Container for custom filtering functions
+        * Scope:    jQuery.fn.dataTableExt
+        * Notes:    This is an object (the name should match the type) for custom filtering function,
+        *   which can be used for live DOM checking or formatted text filtering
+        */
+       _oExt.ofnSearch = { };
+       
+       /*
+        * Variable: afnSortData
+        * Purpose:  Container for custom sorting data source functions
+        * Scope:    jQuery.fn.dataTableExt
+        * Notes:    Array (associative) of functions which is run prior to a column of this 
+        *   'SortDataType' being sorted upon.
+        *   Function input parameters:
+        *     object:oSettings-  DataTables settings object
+        *     int:iColumn - Target column number
+        *   Return value: Array of data which exactly matched the full data set size for the column to
+        *     be sorted upon
+        */
+       _oExt.afnSortData = [ ];
+       
+       /*
+        * Variable: oStdClasses
+        * Purpose:  Storage for the various classes that DataTables uses
+        * Scope:    jQuery.fn.dataTableExt
+        */
+       _oExt.oStdClasses = {
+               /* Two buttons buttons */
+               "sPagePrevEnabled": "paginate_enabled_previous",
+               "sPagePrevDisabled": "paginate_disabled_previous",
+               "sPageNextEnabled": "paginate_enabled_next",
+               "sPageNextDisabled": "paginate_disabled_next",
+               "sPageJUINext": "",
+               "sPageJUIPrev": "",
+               
+               /* Full numbers paging buttons */
+               "sPageButton": "paginate_button",
+               "sPageButtonActive": "paginate_active",
+               "sPageButtonStaticDisabled": "paginate_button",
+               "sPageFirst": "first",
+               "sPagePrevious": "previous",
+               "sPageNext": "next",
+               "sPageLast": "last",
+               
+               /* Stripping classes */
+               "sStripOdd": "odd",
+               "sStripEven": "even",
+               
+               /* Empty row */
+               "sRowEmpty": "dataTables_empty",
+               
+               /* Features */
+               "sWrapper": "dataTables_wrapper",
+               "sFilter": "dataTables_filter",
+               "sInfo": "dataTables_info",
+               "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
+               "sLength": "dataTables_length",
+               "sProcessing": "dataTables_processing",
+               
+               /* Sorting */
+               "sSortAsc": "sorting_asc",
+               "sSortDesc": "sorting_desc",
+               "sSortable": "sorting", /* Sortable in both directions */
+               "sSortableAsc": "sorting_asc_disabled",
+               "sSortableDesc": "sorting_desc_disabled",
+               "sSortableNone": "sorting_disabled",
+               "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
+               "sSortJUIAsc": "",
+               "sSortJUIDesc": "",
+               "sSortJUI": "",
+               "sSortJUIAscAllowed": "",
+               "sSortJUIDescAllowed": "",
+               "sSortJUIWrapper": "",
+               
+               /* Scrolling */
+               "sScrollWrapper": "dataTables_scroll",
+               "sScrollHead": "dataTables_scrollHead",
+               "sScrollHeadInner": "dataTables_scrollHeadInner",
+               "sScrollBody": "dataTables_scrollBody",
+               "sScrollFoot": "dataTables_scrollFoot",
+               "sScrollFootInner": "dataTables_scrollFootInner",
+               
+               /* Misc */
+               "sFooterTH": ""
+       };
+       
+       /*
+        * Variable: oJUIClasses
+        * Purpose:  Storage for the various classes that DataTables uses - jQuery UI suitable
+        * Scope:    jQuery.fn.dataTableExt
+        */
+       _oExt.oJUIClasses = {
+               /* Two buttons buttons */
+               "sPagePrevEnabled": "fg-button ui-button ui-state-default ui-corner-left",
+               "sPagePrevDisabled": "fg-button ui-button ui-state-default ui-corner-left ui-state-disabled",
+               "sPageNextEnabled": "fg-button ui-button ui-state-default ui-corner-right",
+               "sPageNextDisabled": "fg-button ui-button ui-state-default ui-corner-right ui-state-disabled",
+               "sPageJUINext": "ui-icon ui-icon-circle-arrow-e",
+               "sPageJUIPrev": "ui-icon ui-icon-circle-arrow-w",
+               
+               /* Full numbers paging buttons */
+               "sPageButton": "fg-button ui-button ui-state-default",
+               "sPageButtonActive": "fg-button ui-button ui-state-default ui-state-disabled",
+               "sPageButtonStaticDisabled": "fg-button ui-button ui-state-default ui-state-disabled",
+               "sPageFirst": "first ui-corner-tl ui-corner-bl",
+               "sPagePrevious": "previous",
+               "sPageNext": "next",
+               "sPageLast": "last ui-corner-tr ui-corner-br",
+               
+               /* Stripping classes */
+               "sStripOdd": "odd",
+               "sStripEven": "even",
+               
+               /* Empty row */
+               "sRowEmpty": "dataTables_empty",
+               
+               /* Features */
+               "sWrapper": "dataTables_wrapper",
+               "sFilter": "dataTables_filter",
+               "sInfo": "dataTables_info",
+               "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+
+                       "ui-buttonset-multi paging_", /* Note that the type is postfixed */
+               "sLength": "dataTables_length",
+               "sProcessing": "dataTables_processing",
+               
+               /* Sorting */
+               "sSortAsc": "ui-state-default",
+               "sSortDesc": "ui-state-default",
+               "sSortable": "ui-state-default",
+               "sSortableAsc": "ui-state-default",
+               "sSortableDesc": "ui-state-default",
+               "sSortableNone": "ui-state-default",
+               "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
+               "sSortJUIAsc": "css_right ui-icon ui-icon-triangle-1-n",
+               "sSortJUIDesc": "css_right ui-icon ui-icon-triangle-1-s",
+               "sSortJUI": "css_right ui-icon ui-icon-carat-2-n-s",
+               "sSortJUIAscAllowed": "css_right ui-icon ui-icon-carat-1-n",
+               "sSortJUIDescAllowed": "css_right ui-icon ui-icon-carat-1-s",
+               "sSortJUIWrapper": "DataTables_sort_wrapper",
+               
+               /* Scrolling */
+               "sScrollWrapper": "dataTables_scroll",
+               "sScrollHead": "dataTables_scrollHead ui-state-default",
+               "sScrollHeadInner": "dataTables_scrollHeadInner",
+               "sScrollBody": "dataTables_scrollBody",
+               "sScrollFoot": "dataTables_scrollFoot ui-state-default",
+               "sScrollFootInner": "dataTables_scrollFootInner",
+               
+               /* Misc */
+               "sFooterTH": "ui-state-default"
+       };
+       
+       /*
+        * Variable: oPagination
+        * Purpose:  Container for the various type of pagination that dataTables supports
+        * Scope:    jQuery.fn.dataTableExt
+        */
+       _oExt.oPagination = {
+               /*
+                * Variable: two_button
+                * Purpose:  Standard two button (forward/back) pagination
+                * Scope:    jQuery.fn.dataTableExt.oPagination
+                */
+               "two_button": {
+                       /*
+                        * Function: oPagination.two_button.fnInit
+                        * Purpose:  Initalise dom elements required for pagination with forward/back buttons only
+                        * Returns:  -
+                        * Inputs:   object:oSettings - dataTables settings object
+            *           node:nPaging - the DIV which contains this pagination control
+                        *           function:fnCallbackDraw - draw function which must be called on update
+                        */
+                       "fnInit": function ( oSettings, nPaging, fnCallbackDraw )
+                       {
+                               var nPrevious, nNext, nPreviousInner, nNextInner;
+                               
+                               /* Store the next and previous elements in the oSettings object as they can be very
+                                * usful for automation - particularly testing
+                                */
+                               if ( !oSettings.bJUI )
+                               {
+                                       nPrevious = document.createElement( 'div' );
+                                       nNext = document.createElement( 'div' );
+                               }
+                               else
+                               {
+                                       nPrevious = document.createElement( 'a' );
+                                       nNext = document.createElement( 'a' );
+                                       
+                                       nNextInner = document.createElement('span');
+                                       nNextInner.className = oSettings.oClasses.sPageJUINext;
+                                       nNext.appendChild( nNextInner );
+                                       
+                                       nPreviousInner = document.createElement('span');
+                                       nPreviousInner.className = oSettings.oClasses.sPageJUIPrev;
+                                       nPrevious.appendChild( nPreviousInner );
+                               }
+                               
+                               nPrevious.className = oSettings.oClasses.sPagePrevDisabled;
+                               nNext.className = oSettings.oClasses.sPageNextDisabled;
+                               
+                               nPrevious.title = oSettings.oLanguage.oPaginate.sPrevious;
+                               nNext.title = oSettings.oLanguage.oPaginate.sNext;
+                               
+                               nPaging.appendChild( nPrevious );
+                               nPaging.appendChild( nNext );
+                               
+                               $(nPrevious).bind( 'click.DT', function() {
+                                       if ( oSettings.oApi._fnPageChange( oSettings, "previous" ) )
+                                       {
+                                               /* Only draw when the page has actually changed */
+                                               fnCallbackDraw( oSettings );
+                                       }
+                               } );
+                               
+                               $(nNext).bind( 'click.DT', function() {
+                                       if ( oSettings.oApi._fnPageChange( oSettings, "next" ) )
+                                       {
+                                               fnCallbackDraw( oSettings );
+                                       }
+                               } );
+                               
+                               /* Take the brutal approach to cancelling text selection */
+                               $(nPrevious).bind( 'selectstart.DT', function () { return false; } );
+                               $(nNext).bind( 'selectstart.DT', function () { return false; } );
+                               
+                               /* ID the first elements only */
+                               if ( oSettings.sTableId !== '' && typeof oSettings.aanFeatures.p == "undefined" )
+                               {
+                                       nPaging.setAttribute( 'id', oSettings.sTableId+'_paginate' );
+                                       nPrevious.setAttribute( 'id', oSettings.sTableId+'_previous' );
+                                       nNext.setAttribute( 'id', oSettings.sTableId+'_next' );
+                               }
+                       },
+                       
+                       /*
+                        * Function: oPagination.two_button.fnUpdate
+                        * Purpose:  Update the two button pagination at the end of the draw
+                        * Returns:  -
+                        * Inputs:   object:oSettings - dataTables settings object
+                        *           function:fnCallbackDraw - draw function to call on page change
+                        */
+                       "fnUpdate": function ( oSettings, fnCallbackDraw )
+                       {
+                               if ( !oSettings.aanFeatures.p )
+                               {
+                                       return;
+                               }
+                               
+                               /* Loop over each instance of the pager */
+                               var an = oSettings.aanFeatures.p;
+                               for ( var i=0, iLen=an.length ; i<iLen ; i++ )
+                               {
+                                       if ( an[i].childNodes.length !== 0 )
+                                       {
+                                               an[i].childNodes[0].className = 
+                                                       ( oSettings._iDisplayStart === 0 ) ? 
+                                                       oSettings.oClasses.sPagePrevDisabled : oSettings.oClasses.sPagePrevEnabled;
+                                               
+                                               an[i].childNodes[1].className = 
+                                                       ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ? 
+                                                       oSettings.oClasses.sPageNextDisabled : oSettings.oClasses.sPageNextEnabled;
+                                       }
+                               }
+                       }
+               },
+               
+               
+               /*
+                * Variable: iFullNumbersShowPages
+                * Purpose:  Change the number of pages which can be seen
+                * Scope:    jQuery.fn.dataTableExt.oPagination
+                */
+               "iFullNumbersShowPages": 5,
+               
+               /*
+                * Variable: full_numbers
+                * Purpose:  Full numbers pagination
+                * Scope:    jQuery.fn.dataTableExt.oPagination
+                */
+               "full_numbers": {
+                       /*
+                        * Function: oPagination.full_numbers.fnInit
+                        * Purpose:  Initalise dom elements required for pagination with a list of the pages
+                        * Returns:  -
+                        * Inputs:   object:oSettings - dataTables settings object
+            *           node:nPaging - the DIV which contains this pagination control
+                        *           function:fnCallbackDraw - draw function which must be called on update
+                        */
+                       "fnInit": function ( oSettings, nPaging, fnCallbackDraw )
+                       {
+                               var nFirst = document.createElement( 'span' );
+                               var nPrevious = document.createElement( 'span' );
+                               var nList = document.createElement( 'span' );
+                               var nNext = document.createElement( 'span' );
+                               var nLast = document.createElement( 'span' );
+                               
+                               nFirst.innerHTML = oSettings.oLanguage.oPaginate.sFirst;
+                               nPrevious.innerHTML = oSettings.oLanguage.oPaginate.sPrevious;
+                               nNext.innerHTML = oSettings.oLanguage.oPaginate.sNext;
+                               nLast.innerHTML = oSettings.oLanguage.oPaginate.sLast;
+                               
+                               var oClasses = oSettings.oClasses;
+                               nFirst.className = oClasses.sPageButton+" "+oClasses.sPageFirst;
+                               nPrevious.className = oClasses.sPageButton+" "+oClasses.sPagePrevious;
+                               nNext.className= oClasses.sPageButton+" "+oClasses.sPageNext;
+                               nLast.className = oClasses.sPageButton+" "+oClasses.sPageLast;
+                               
+                               nPaging.appendChild( nFirst );
+                               nPaging.appendChild( nPrevious );
+                               nPaging.appendChild( nList );
+                               nPaging.appendChild( nNext );
+                               nPaging.appendChild( nLast );
+                               
+                               $(nFirst).bind( 'click.DT', function () {
+                                       if ( oSettings.oApi._fnPageChange( oSettings, "first" ) )
+                                       {
+                                               fnCallbackDraw( oSettings );
+                                       }
+                               } );
+                               
+                               $(nPrevious).bind( 'click.DT', function() {
+                                       if ( oSettings.oApi._fnPageChange( oSettings, "previous" ) )
+                                       {
+                                               fnCallbackDraw( oSettings );
+                                       }
+                               } );
+                               
+                               $(nNext).bind( 'click.DT', function() {
+                                       if ( oSettings.oApi._fnPageChange( oSettings, "next" ) )
+                                       {
+                                               fnCallbackDraw( oSettings );
+                                       }
+                               } );
+                               
+                               $(nLast).bind( 'click.DT', function() {
+                                       if ( oSettings.oApi._fnPageChange( oSettings, "last" ) )
+                                       {
+                                               fnCallbackDraw( oSettings );
+                                       }
+                               } );
+                               
+                               /* Take the brutal approach to cancelling text selection */
+                               $('span', nPaging)
+                                       .bind( 'mousedown.DT', function () { return false; } )
+                                       .bind( 'selectstart.DT', function () { return false; } );
+                               
+                               /* ID the first elements only */
+                               if ( oSettings.sTableId !== '' && typeof oSettings.aanFeatures.p == "undefined" )
+                               {
+                                       nPaging.setAttribute( 'id', oSettings.sTableId+'_paginate' );
+                                       nFirst.setAttribute( 'id', oSettings.sTableId+'_first' );
+                                       nPrevious.setAttribute( 'id', oSettings.sTableId+'_previous' );
+                                       nNext.setAttribute( 'id', oSettings.sTableId+'_next' );
+                                       nLast.setAttribute( 'id', oSettings.sTableId+'_last' );
+                               }
+                       },
+                       
+                       /*
+                        * Function: oPagination.full_numbers.fnUpdate
+                        * Purpose:  Update the list of page buttons shows
+                        * Returns:  -
+                        * Inputs:   object:oSettings - dataTables settings object
+                        *           function:fnCallbackDraw - draw function to call on page change
+                        */
+                       "fnUpdate": function ( oSettings, fnCallbackDraw )
+                       {
+                               if ( !oSettings.aanFeatures.p )
+                               {
+                                       return;
+                               }
+                               
+                               var iPageCount = _oExt.oPagination.iFullNumbersShowPages;
+                               var iPageCountHalf = Math.floor(iPageCount / 2);
+                               var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength);
+                               var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
+                               var sList = "";
+                               var iStartButton, iEndButton, i, iLen;
+                               var oClasses = oSettings.oClasses;
+                               
+                               /* Pages calculation */
+                               if (iPages < iPageCount)
+                               {
+                                       iStartButton = 1;
+                                       iEndButton = iPages;
+                               }
+                               else
+                               {
+                                       if (iCurrentPage <= iPageCountHalf)
+                                       {
+                                               iStartButton = 1;
+                                               iEndButton = iPageCount;
+                                       }
+                                       else
+                                       {
+                                               if (iCurrentPage >= (iPages - iPageCountHalf))
+                                               {
+                                                       iStartButton = iPages - iPageCount + 1;
+                                                       iEndButton = iPages;
+                                               }
+                                               else
+                                               {
+                                                       iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1;
+                                                       iEndButton = iStartButton + iPageCount - 1;
+                                               }
+                                       }
+                               }
+                               
+                               /* Build the dynamic list */
+                               for ( i=iStartButton ; i<=iEndButton ; i++ )
+                               {
+                                       if ( iCurrentPage != i )
+                                       {
+                                               sList += '<span class="'+oClasses.sPageButton+'">'+i+'</span>';
+                                       }
+                                       else
+                                       {
+                                               sList += '<span class="'+oClasses.sPageButtonActive+'">'+i+'</span>';
+                                       }
+                               }
+                               
+                               /* Loop over each instance of the pager */
+                               var an = oSettings.aanFeatures.p;
+                               var anButtons, anStatic, nPaginateList;
+                               var fnClick = function() {
+                                       /* Use the information in the element to jump to the required page */
+                                       var iTarget = (this.innerHTML * 1) - 1;
+                                       oSettings._iDisplayStart = iTarget * oSettings._iDisplayLength;
+                                       fnCallbackDraw( oSettings );
+                                       return false;
+                               };
+                               var fnFalse = function () { return false; };
+                               
+                               for ( i=0, iLen=an.length ; i<iLen ; i++ )
+                               {
+                                       if ( an[i].childNodes.length === 0 )
+                                       {
+                                               continue;
+                                       }
+                                       
+                                       /* Build up the dynamic list forst - html and listeners */
+                                       var qjPaginateList = $('span:eq(2)', an[i]);
+                                       qjPaginateList.html( sList );
+                                       $('span', qjPaginateList).bind( 'click.DT', fnClick ).bind( 'mousedown.DT', fnFalse )
+                                               .bind( 'selectstart.DT', fnFalse );
+                                       
+                                       /* Update the 'premanent botton's classes */
+                                       anButtons = an[i].getElementsByTagName('span');
+                                       anStatic = [
+                                               anButtons[0], anButtons[1], 
+                                               anButtons[anButtons.length-2], anButtons[anButtons.length-1]
+                                       ];
+                                       $(anStatic).removeClass( oClasses.sPageButton+" "+oClasses.sPageButtonActive+" "+oClasses.sPageButtonStaticDisabled );
+                                       if ( iCurrentPage == 1 )
+                                       {
+                                               anStatic[0].className += " "+oClasses.sPageButtonStaticDisabled;
+                                               anStatic[1].className += " "+oClasses.sPageButtonStaticDisabled;
+                                       }
+                                       else
+                                       {
+                                               anStatic[0].className += " "+oClasses.sPageButton;
+                                               anStatic[1].className += " "+oClasses.sPageButton;
+                                       }
+                                       
+                                       if ( iPages === 0 || iCurrentPage == iPages || oSettings._iDisplayLength == -1 )
+                                       {
+                                               anStatic[2].className += " "+oClasses.sPageButtonStaticDisabled;
+                                               anStatic[3].className += " "+oClasses.sPageButtonStaticDisabled;
+                                       }
+                                       else
+                                       {
+                                               anStatic[2].className += " "+oClasses.sPageButton;
+                                               anStatic[3].className += " "+oClasses.sPageButton;
+                                       }
+                               }
+                       }
+               }
+       };
+       
+       /*
+        * Variable: oSort
+        * Purpose:  Wrapper for the sorting functions that can be used in DataTables
+        * Scope:    jQuery.fn.dataTableExt
+        * Notes:    The functions provided in this object are basically standard javascript sort
+        *   functions - they expect two inputs which they then compare and then return a priority
+        *   result. For each sort method added, two functions need to be defined, an ascending sort and
+        *   a descending sort.
+        */
+       _oExt.oSort = {
+               /*
+                * text sorting
+                */
+               "string-asc": function ( a, b )
+               {
+                       var x = a.toLowerCase();
+                       var y = b.toLowerCase();
+                       return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+               },
+               
+               "string-desc": function ( a, b )
+               {
+                       var x = a.toLowerCase();
+                       var y = b.toLowerCase();
+                       return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+               },
+               
+               
+               /*
+                * html sorting (ignore html tags)
+                */
+               "html-asc": function ( a, b )
+               {
+                       var x = a.replace( /<.*?>/g, "" ).toLowerCase();
+                       var y = b.replace( /<.*?>/g, "" ).toLowerCase();
+                       return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+               },
+               
+               "html-desc": function ( a, b )
+               {
+                       var x = a.replace( /<.*?>/g, "" ).toLowerCase();
+                       var y = b.replace( /<.*?>/g, "" ).toLowerCase();
+                       return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+               },
+               
+               
+               /*
+                * date sorting
+                */
+               "date-asc": function ( a, b )
+               {
+                       var x = Date.parse( a );
+                       var y = Date.parse( b );
+                       
+                       if ( isNaN(x) || x==="" )
+                       {
+               x = Date.parse( "01/01/1970 00:00:00" );
+                       }
+                       if ( isNaN(y) || y==="" )
+                       {
+                               y =     Date.parse( "01/01/1970 00:00:00" );
+                       }
+                       
+                       return x - y;
+               },
+               
+               "date-desc": function ( a, b )
+               {
+                       var x = Date.parse( a );
+                       var y = Date.parse( b );
+                       
+                       if ( isNaN(x) || x==="" )
+                       {
+               x = Date.parse( "01/01/1970 00:00:00" );
+                       }
+                       if ( isNaN(y) || y==="" )
+                       {
+                               y =     Date.parse( "01/01/1970 00:00:00" );
+                       }
+                       
+                       return y - x;
+               },
+               
+               
+               /*
+                * numerical sorting
+                */
+               "numeric-asc": function ( a, b )
+               {
+                       var x = (a=="-" || a==="") ? 0 : a*1;
+                       var y = (b=="-" || b==="") ? 0 : b*1;
+                       return x - y;
+               },
+               
+               "numeric-desc": function ( a, b )
+               {
+                       var x = (a=="-" || a==="") ? 0 : a*1;
+                       var y = (b=="-" || b==="") ? 0 : b*1;
+                       return y - x;
+               }
+       };
+       
+       
+       /*
+        * Variable: aTypes
+        * Purpose:  Container for the various type of type detection that dataTables supports
+        * Scope:    jQuery.fn.dataTableExt
+        * Notes:    The functions in this array are expected to parse a string to see if it is a data
+        *   type that it recognises. If so then the function should return the name of the type (a
+        *   corresponding sort function should be defined!), if the type is not recognised then the
+        *   function should return null such that the parser and move on to check the next type.
+        *   Note that ordering is important in this array - the functions are processed linearly,
+        *   starting at index 0.
+        *   Note that the input for these functions is always a string! It cannot be any other data
+        *   type
+        */
+       _oExt.aTypes = [
+               /*
+                * Function: -
+                * Purpose:  Check to see if a string is numeric
+                * Returns:  string:'numeric' or null
+                * Inputs:   string:sText - string to check
+                */
+               function ( sData )
+               {
+                       /* Allow zero length strings as a number */
+                       if ( sData.length === 0 )
+                       {
+                               return 'numeric';
+                       }
+                       
+                       var sValidFirstChars = "0123456789-";
+                       var sValidChars = "0123456789.";
+                       var Char;
+                       var bDecimal = false;
+                       
+                       /* Check for a valid first char (no period and allow negatives) */
+                       Char = sData.charAt(0); 
+                       if (sValidFirstChars.indexOf(Char) == -1) 
+                       {
+                               return null;
+                       }
+                       
+                       /* Check all the other characters are valid */
+                       for ( var i=1 ; i<sData.length ; i++ ) 
+                       {
+                               Char = sData.charAt(i); 
+                               if (sValidChars.indexOf(Char) == -1) 
+                               {
+                                       return null;
+                               }
+                               
+                               /* Only allowed one decimal place... */
+                               if ( Char == "." )
+                               {
+                                       if ( bDecimal )
+                                       {
+                                               return null;
+                                       }
+                                       bDecimal = true;
+                               }
+                       }
+                       
+                       return 'numeric';
+               },
+               
+               /*
+                * Function: -
+                * Purpose:  Check to see if a string is actually a formatted date
+                * Returns:  string:'date' or null
+                * Inputs:   string:sText - string to check
+                */
+               function ( sData )
+               {
+                       var iParse = Date.parse(sData);
+                       if ( (iParse !== null && !isNaN(iParse)) || sData.length === 0 )
+                       {
+                               return 'date';
+                       }
+                       return null;
+               },
+               
+               /*
+                * Function: -
+                * Purpose:  Check to see if a string should be treated as an HTML string
+                * Returns:  string:'html' or null
+                * Inputs:   string:sText - string to check
+                */
+               function ( sData )
+               {
+                       if ( sData.indexOf('<') != -1 && sData.indexOf('>') != -1 )
+                       {
+                               return 'html';
+                       }
+                       return null;
+               }
+       ];
+       
+       /*
+        * Function: fnVersionCheck
+        * Purpose:  Check a version string against this version of DataTables. Useful for plug-ins
+        * Returns:  bool:true -this version of DataTables is greater or equal to the required version
+        *                false -this version of DataTales is not suitable
+        * Inputs:   string:sVersion - the version to check against. May be in the following formats:
+        *             "a", "a.b" or "a.b.c"
+        * Notes:    This function will only check the first three parts of a version string. It is
+        *   assumed that beta and dev versions will meet the requirements. This might change in future
+        */
+       _oExt.fnVersionCheck = function( sVersion )
+       {
+               /* This is cheap, but very effective */
+               var fnZPad = function (Zpad, count)
+               {
+                       while(Zpad.length < count) {
+                               Zpad += '0';
+                       }
+                       return Zpad;
+               };
+               var aThis = _oExt.sVersion.split('.');
+               var aThat = sVersion.split('.');
+               var sThis = '', sThat = '';
+               
+               for ( var i=0, iLen=aThat.length ; i<iLen ; i++ )
+               {
+                       sThis += fnZPad( aThis[i], 3 );
+                       sThat += fnZPad( aThat[i], 3 );
+               }
+               
+               return parseInt(sThis, 10) >= parseInt(sThat, 10);
+       };
+       
+       /*
+        * Variable: _oExternConfig
+        * Purpose:  Store information for DataTables to access globally about other instances
+        * Scope:    jQuery.fn.dataTableExt
+        */
+       _oExt._oExternConfig = {
+               /* int:iNextUnique - next unique number for an instance */
+               "iNextUnique": 0
+       };
+       
+       
+       /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+        * Section - DataTables prototype
+        * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+       
+       /*
+        * Function: dataTable
+        * Purpose:  DataTables information
+        * Returns:  -
+        * Inputs:   object:oInit - initalisation options for the table
+        */
+       $.fn.dataTable = function( oInit )
+       {
+               /*
+                * Function: classSettings
+                * Purpose:  Settings container function for all 'class' properties which are required
+                *   by dataTables
+                * Returns:  -
+                * Inputs:   -
+                */
+               function classSettings ()
+               {
+                       this.fnRecordsTotal = function ()
+                       {
+                               if ( this.oFeatures.bServerSide ) {
+                                       return parseInt(this._iRecordsTotal, 10);
+                               } else {
+                                       return this.aiDisplayMaster.length;
+                               }
+                       };
+                       
+                       this.fnRecordsDisplay = function ()
+                       {
+                               if ( this.oFeatures.bServerSide ) {
+                                       return parseInt(this._iRecordsDisplay, 10);
+                               } else {
+                                       return this.aiDisplay.length;
+                               }
+                       };
+                       
+                       this.fnDisplayEnd = function ()
+                       {
+                               if ( this.oFeatures.bServerSide ) {
+                                       if ( this.oFeatures.bPaginate === false || this._iDisplayLength == -1 ) {
+                                               return this._iDisplayStart+this.aiDisplay.length;
+                                       } else {
+                                               return Math.min( this._iDisplayStart+this._iDisplayLength, 
+                                                       this._iRecordsDisplay );
+                                       }
+                               } else {
+                                       return this._iDisplayEnd;
+                               }
+                       };
+                       
+                       /*
+                        * Variable: oInstance
+                        * Purpose:  The DataTables object for this table
+                        * Scope:    jQuery.dataTable.classSettings 
+                        */
+                       this.oInstance = null;
+                       
+                       /*
+                        * Variable: sInstance
+                        * Purpose:  Unique idendifier for each instance of the DataTables object
+                        * Scope:    jQuery.dataTable.classSettings 
+                        */
+                       this.sInstance = null;
+                       
+                       /*
+                        * Variable: oFeatures
+                        * Purpose:  Indicate the enablement of key dataTable features
+                        * Scope:    jQuery.dataTable.classSettings 
+                        */
+                       this.oFeatures = {
+                               "bPaginate": true,
+                               "bLengthChange": true,
+                               "bFilter": true,
+                               "bSort": true,
+                               "bInfo": true,
+                               "bAutoWidth": true,
+                               "bProcessing": false,
+                               "bSortClasses": true,
+                               "bStateSave": false,
+                               "bServerSide": false
+                       };
+                       
+                       /*
+                        * Variable: oScroll
+                        * Purpose:  Container for scrolling options
+                        * Scope:    jQuery.dataTable.classSettings 
+                        */
+                       this.oScroll = {
+                               "sX": "",
+                               "sXInner": "",
+                               "sY": "",
+                               "bCollapse": false,
+                               "bInfinite": false,
+                               "iLoadGap": 100,
+                               "iBarWidth": 0,
+                               "bAutoCss": true
+                       };
+                       
+                       /*
+                        * Variable: aanFeatures
+                        * Purpose:  Array referencing the nodes which are used for the features
+                        * Scope:    jQuery.dataTable.classSettings 
+                        * Notes:    The parameters of this object match what is allowed by sDom - i.e.
+                        *   'l' - Length changing
+                        *   'f' - Filtering input
+                        *   't' - The table!
+                        *   'i' - Information
+                        *   'p' - Pagination
+                        *   'r' - pRocessing
+                        */
+                       this.aanFeatures = [];
+                       
+                       /*
+                        * Variable: oLanguage
+                        * Purpose:  Store the language strings used by dataTables
+                        * Scope:    jQuery.dataTable.classSettings
+                        * Notes:    The words in the format _VAR_ are variables which are dynamically replaced
+                        *   by javascript
+                        */
+                       this.oLanguage = {
+                               "sProcessing": "Processing...",
+                               "sLengthMenu": "Show _MENU_ entries",
+                               "sZeroRecords": "No matching records found",
+                               "sEmptyTable": "No data available in table",
+                               "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
+                               "sInfoEmpty": "Showing 0 to 0 of 0 entries",
+                               "sInfoFiltered": "(filtered from _MAX_ total entries)",
+                               "sInfoPostFix": "",
+                               "sSearch": "Search:",
+                               "sUrl": "",
+                               "oPaginate": {
+                                       "sFirst":    "First",
+                                       "sPrevious": "Previous",
+                                       "sNext":     "Next",
+                                       "sLast":     "Last"
+                               },
+                               "fnInfoCallback": null
+                       };
+                       
+                       /*
+                        * Variable: aoData
+                        * Purpose:  Store data information
+                        * Scope:    jQuery.dataTable.classSettings 
+                        * Notes:    This is an array of objects with the following parameters:
+                        *   int: _iId - internal id for tracking
+                        *   array: _aData - internal data - used for sorting / filtering etc
+                        *   node: nTr - display node
+                        *   array node: _anHidden - hidden TD nodes
+                        *   string: _sRowStripe
+                        */
+                       this.aoData = [];
+                       
+                       /*
+                        * Variable: aiDisplay
+                        * Purpose:  Array of indexes which are in the current display (after filtering etc)
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.aiDisplay = [];
+                       
+                       /*
+                        * Variable: aiDisplayMaster
+                        * Purpose:  Array of indexes for display - no filtering
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.aiDisplayMaster = [];
+                                                       
+                       /*
+                        * Variable: aoColumns
+                        * Purpose:  Store information about each column that is in use
+                        * Scope:    jQuery.dataTable.classSettings 
+                        */
+                       this.aoColumns = [];
+                       
+                       /*
+                        * Variable: iNextId
+                        * Purpose:  Store the next unique id to be used for a new row
+                        * Scope:    jQuery.dataTable.classSettings 
+                        */
+                       this.iNextId = 0;
+                       
+                       /*
+                        * Variable: asDataSearch
+                        * Purpose:  Search data array for regular expression searching
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.asDataSearch = [];
+                       
+                       /*
+                        * Variable: oPreviousSearch
+                        * Purpose:  Store the previous search incase we want to force a re-search
+                        *   or compare the old search to a new one
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.oPreviousSearch = {
+                               "sSearch": "",
+                               "bRegex": false,
+                               "bSmart": true
+                       };
+                       
+                       /*
+                        * Variable: aoPreSearchCols
+                        * Purpose:  Store the previous search for each column
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.aoPreSearchCols = [];
+                       
+                       /*
+                        * Variable: aaSorting
+                        * Purpose:  Sorting information
+                        * Scope:    jQuery.dataTable.classSettings
+                        * Notes:    Index 0 - column number
+                        *           Index 1 - current sorting direction
+                        *           Index 2 - index of asSorting for this column
+                        */
+                       this.aaSorting = [ [0, 'asc', 0] ];
+                       
+                       /*
+                        * Variable: aaSortingFixed
+                        * Purpose:  Sorting information that is always applied
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.aaSortingFixed = null;
+                       
+                       /*
+                        * Variable: asStripClasses
+                        * Purpose:  Classes to use for the striping of a table
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.asStripClasses = [];
+                       
+                       /*
+                        * Variable: asDestoryStrips
+                        * Purpose:  If restoring a table - we should restore it's striping classes as well
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.asDestoryStrips = [];
+                       
+                       /*
+                        * Variable: sDestroyWidth
+                        * Purpose:  If restoring a table - we should restore it's width
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.sDestroyWidth = 0;
+                       
+                       /*
+                        * Variable: fnRowCallback
+                        * Purpose:  Call this function every time a row is inserted (draw)
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.fnRowCallback = null;
+                       
+                       /*
+                        * Variable: fnHeaderCallback
+                        * Purpose:  Callback function for the header on each draw
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.fnHeaderCallback = null;
+                       
+                       /*
+                        * Variable: fnFooterCallback
+                        * Purpose:  Callback function for the footer on each draw
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.fnFooterCallback = null;
+                       
+                       /*
+                        * Variable: aoDrawCallback
+                        * Purpose:  Array of callback functions for draw callback functions
+                        * Scope:    jQuery.dataTable.classSettings
+                        * Notes:    Each array element is an object with the following parameters:
+                        *   function:fn - function to call
+                        *   string:sName - name callback (feature). useful for arranging array
+                        */
+                       this.aoDrawCallback = [];
+                       
+                       /*
+                        * Variable: fnInitComplete
+                        * Purpose:  Callback function for when the table has been initalised
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.fnInitComplete = null;
+                       
+                       /*
+                        * Variable: sTableId
+                        * Purpose:  Cache the table ID for quick access
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.sTableId = "";
+                       
+                       /*
+                        * Variable: nTable
+                        * Purpose:  Cache the table node for quick access
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.nTable = null;
+                       
+                       /*
+                        * Variable: nTHead
+                        * Purpose:  Permanent ref to the thead element
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.nTHead = null;
+                       
+                       /*
+                        * Variable: nTFoot
+                        * Purpose:  Permanent ref to the tfoot element - if it exists
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.nTFoot = null;
+                       
+                       /*
+                        * Variable: nTBody
+                        * Purpose:  Permanent ref to the tbody element
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.nTBody = null;
+                       
+                       /*
+                        * Variable: nTableWrapper
+                        * Purpose:  Cache the wrapper node (contains all DataTables controlled elements)
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.nTableWrapper = null;
+                       
+                       /*
+                        * Variable: bInitialised
+                        * Purpose:  Indicate if all required information has been read in
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.bInitialised = false;
+                       
+                       /*
+                        * Variable: aoOpenRows
+                        * Purpose:  Information about open rows
+                        * Scope:    jQuery.dataTable.classSettings
+                        * Notes:    Has the parameters 'nTr' and 'nParent'
+                        */
+                       this.aoOpenRows = [];
+                       
+                       /*
+                        * Variable: sDom
+                        * Purpose:  Dictate the positioning that the created elements will take
+                        * Scope:    jQuery.dataTable.classSettings
+                        * Notes:    
+                        *   The following options are allowed:
+                        *     'l' - Length changing
+                        *     'f' - Filtering input
+                        *     't' - The table!
+                        *     'i' - Information
+                        *     'p' - Pagination
+                        *     'r' - pRocessing
+                        *   The following constants are allowed:
+                        *     'H' - jQueryUI theme "header" classes
+                        *     'F' - jQueryUI theme "footer" classes
+                        *   The following syntax is expected:
+                        *     '<' and '>' - div elements
+                        *     '<"class" and '>' - div with a class
+                        *   Examples:
+                        *     '<"wrapper"flipt>', '<lf<t>ip>'
+                        */
+                       this.sDom = 'lfrtip';
+                       
+                       /*
+                        * Variable: sPaginationType
+                        * Purpose:  Note which type of sorting should be used
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.sPaginationType = "two_button";
+                       
+                       /*
+                        * Variable: iCookieDuration
+                        * Purpose:  The cookie duration (for bStateSave) in seconds - default 2 hours
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.iCookieDuration = 60 * 60 * 2;
+                       
+                       /*
+                        * Variable: sCookiePrefix
+                        * Purpose:  The cookie name prefix
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.sCookiePrefix = "SpryMedia_DataTables_";
+                       
+                       /*
+                        * Variable: fnCookieCallback
+                        * Purpose:  Callback function for cookie creation
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.fnCookieCallback = null;
+                       
+                       /*
+                        * Variable: aoStateSave
+                        * Purpose:  Array of callback functions for state saving
+                        * Scope:    jQuery.dataTable.classSettings
+                        * Notes:    Each array element is an object with the following parameters:
+                        *   function:fn - function to call. Takes two parameters, oSettings and the JSON string to
+                        *     save that has been thus far created. Returns a JSON string to be inserted into a 
+                        *     json object (i.e. '"param": [ 0, 1, 2]')
+                        *   string:sName - name of callback
+                        */
+                       this.aoStateSave = [];
+                       
+                       /*
+                        * Variable: aoStateLoad
+                        * Purpose:  Array of callback functions for state loading
+                        * Scope:    jQuery.dataTable.classSettings
+                        * Notes:    Each array element is an object with the following parameters:
+                        *   function:fn - function to call. Takes two parameters, oSettings and the object stored.
+                        *     May return false to cancel state loading.
+                        *   string:sName - name of callback
+                        */
+                       this.aoStateLoad = [];
+                       
+                       /*
+                        * Variable: oLoadedState
+                        * Purpose:  State that was loaded from the cookie. Useful for back reference
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.oLoadedState = null;
+                       
+                       /*
+                        * Variable: sAjaxSource
+                        * Purpose:  Source url for AJAX data for the table
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.sAjaxSource = null;
+                       
+                       /*
+                        * Variable: bAjaxDataGet
+                        * Purpose:  Note if draw should be blocked while getting data
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.bAjaxDataGet = true;
+                       
+                       /*
+                        * Variable: fnServerData
+                        * Purpose:  Function to get the server-side data - can be overruled by the developer
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.fnServerData = function ( url, data, callback ) {
+                               $.ajax( {
+                                       "url": url,
+                                       "data": data,
+                                       "success": callback,
+                                       "dataType": "json",
+                                       "cache": false,
+                                       "error": function (xhr, error, thrown) {
+                                               if ( error == "parsererror" ) {
+                                                       alert( "DataTables warning: JSON data from server could not be parsed. "+
+                                                               "This is caused by a JSON formatting error." );
+                                               }
+                                       }
+                               } );
+                       };
+                       
+                       /*
+                        * Variable: fnFormatNumber
+                        * Purpose:  Format numbers for display
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.fnFormatNumber = function ( iIn )
+                       {
+                               if ( iIn < 1000 )
+                               {
+                                       /* A small optimisation for what is likely to be the vast majority of use cases */
+                                       return iIn;
+                               }
+                               else
+                               {
+                                       var s=(iIn+""), a=s.split(""), out="", iLen=s.length;
+                                       
+                                       for ( var i=0 ; i<iLen ; i++ )
+                                       {
+                                               if ( i%3 === 0 && i !== 0 )
+                                               {
+                                                       out = ','+out;
+                                               }
+                                               out = a[iLen-i-1]+out;
+                                       }
+                               }
+                               return out;
+                       };
+                       
+                       /*
+                        * Variable: aLengthMenu
+                        * Purpose:  List of options that can be used for the user selectable length menu
+                        * Scope:    jQuery.dataTable.classSettings
+                        * Note:     This varaible can take for form of a 1D array, in which case the value and the 
+                        *   displayed value in the menu are the same, or a 2D array in which case the value comes
+                        *   from the first array, and the displayed value to the end user comes from the second
+                        *   array. 2D example: [ [ 10, 25, 50, 100, -1 ], [ 10, 25, 50, 100, 'All' ] ];
+                        */
+                       this.aLengthMenu = [ 10, 25, 50, 100 ];
+                       
+                       /*
+                        * Variable: iDraw
+                        * Purpose:  Counter for the draws that the table does. Also used as a tracker for
+                        *   server-side processing
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.iDraw = 0;
+                       
+                       /*
+                        * Variable: bDrawing
+                        * Purpose:  Indicate if a redraw is being done - useful for Ajax
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.bDrawing = 0;
+                       
+                       /*
+                        * Variable: iDrawError
+                        * Purpose:  Last draw error
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.iDrawError = -1;
+                       
+                       /*
+                        * Variable: _iDisplayLength, _iDisplayStart, _iDisplayEnd
+                        * Purpose:  Display length variables
+                        * Scope:    jQuery.dataTable.classSettings
+                        * Notes:    These variable must NOT be used externally to get the data length. Rather, use
+                        *   the fnRecordsTotal() (etc) functions.
+                        */
+                       this._iDisplayLength = 10;
+                       this._iDisplayStart = 0;
+                       this._iDisplayEnd = 10;
+                       
+                       /*
+                        * Variable: _iRecordsTotal, _iRecordsDisplay
+                        * Purpose:  Display length variables used for server side processing
+                        * Scope:    jQuery.dataTable.classSettings
+                        * Notes:    These variable must NOT be used externally to get the data length. Rather, use
+                        *   the fnRecordsTotal() (etc) functions.
+                        */
+                       this._iRecordsTotal = 0;
+                       this._iRecordsDisplay = 0;
+                       
+                       /*
+                        * Variable: bJUI
+                        * Purpose:  Should we add the markup needed for jQuery UI theming?
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.bJUI = false;
+                       
+                       /*
+                        * Variable: bJUI
+                        * Purpose:  Should we add the markup needed for jQuery UI theming?
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.oClasses = _oExt.oStdClasses;
+                       
+                       /*
+                        * Variable: bFiltered and bSorted
+                        * Purpose:  Flags to allow callback functions to see what actions have been performed
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.bFiltered = false;
+                       this.bSorted = false;
+                       
+                       /*
+                        * Variable: oInit
+                        * Purpose:  Initialisation object that is used for the table
+                        * Scope:    jQuery.dataTable.classSettings
+                        */
+                       this.oInit = null;
+               }
+               
+               /*
+                * Variable: oApi
+                * Purpose:  Container for publicly exposed 'private' functions
+                * Scope:    jQuery.dataTable
+                */
+               this.oApi = {};
+               
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - API functions
+                * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+               
+               /*
+                * Function: fnDraw
+                * Purpose:  Redraw the table
+                * Returns:  -
+                * Inputs:   bool:bComplete - Refilter and resort (if enabled) the table before the draw.
+                *             Optional: default - true
+                */
+               this.fnDraw = function( bComplete )
+               {
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       if ( typeof bComplete != 'undefined' && bComplete === false )
+                       {
+                               _fnCalculateEnd( oSettings );
+                               _fnDraw( oSettings );
+                       }
+                       else
+                       {
+                               _fnReDraw( oSettings );
+                       }
+               };
+               
+               /*
+                * Function: fnFilter
+                * Purpose:  Filter the input based on data
+                * Returns:  -
+                * Inputs:   string:sInput - string to filter the table on
+                *           int:iColumn - optional - column to limit filtering to
+                *           bool:bRegex - optional - treat as regular expression or not - default false
+                *           bool:bSmart - optional - perform smart filtering or not - default true
+                *           bool:bShowGlobal - optional - show the input global filter in it's input box(es)
+                *              - default true
+                */
+               this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal )
+               {
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       
+                       if ( !oSettings.oFeatures.bFilter )
+                       {
+                               return;
+                       }
+                       
+                       if ( typeof bRegex == 'undefined' )
+                       {
+                               bRegex = false;
+                       }
+                       
+                       if ( typeof bSmart == 'undefined' )
+                       {
+                               bSmart = true;
+                       }
+                       
+                       if ( typeof bShowGlobal == 'undefined' )
+                       {
+                               bShowGlobal = true;
+                       }
+                       
+                       if ( typeof iColumn == "undefined" || iColumn === null )
+                       {
+                               /* Global filter */
+                               _fnFilterComplete( oSettings, {
+                                       "sSearch":sInput,
+                                       "bRegex": bRegex,
+                                       "bSmart": bSmart
+                               }, 1 );
+                               
+                               if ( bShowGlobal && typeof oSettings.aanFeatures.f != 'undefined' )
+                               {
+                                       var n = oSettings.aanFeatures.f;
+                                       for ( var i=0, iLen=n.length ; i<iLen ; i++ )
+                                       {
+                                               $('input', n[i]).val( sInput );
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               /* Single column filter */
+                               oSettings.aoPreSearchCols[ iColumn ].sSearch = sInput;
+                               oSettings.aoPreSearchCols[ iColumn ].bRegex = bRegex;
+                               oSettings.aoPreSearchCols[ iColumn ].bSmart = bSmart;
+                               _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
+                       }
+               };
+               
+               /*
+                * Function: fnSettings
+                * Purpose:  Get the settings for a particular table for extern. manipulation
+                * Returns:  -
+                * Inputs:   -
+                */
+               this.fnSettings = function( nNode  )
+               {
+                       return _fnSettingsFromNode( this[_oExt.iApiIndex] );
+               };
+               
+               /*
+                * Function: fnVersionCheck
+                * Notes:    The function is the same as the 'static' function provided in the ext variable
+                */
+               this.fnVersionCheck = _oExt.fnVersionCheck;
+               
+               /*
+                * Function: fnSort
+                * Purpose:  Sort the table by a particular row
+                * Returns:  -
+                * Inputs:   int:iCol - the data index to sort on. Note that this will
+                *   not match the 'display index' if you have hidden data entries
+                */
+               this.fnSort = function( aaSort )
+               {
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       oSettings.aaSorting = aaSort;
+                       _fnSort( oSettings );
+               };
+               
+               /*
+                * Function: fnSortListener
+                * Purpose:  Attach a sort listener to an element for a given column
+                * Returns:  -
+                * Inputs:   node:nNode - the element to attach the sort listener to
+                *           int:iColumn - the column that a click on this node will sort on
+                *           function:fnCallback - callback function when sort is run - optional
+                */
+               this.fnSortListener = function( nNode, iColumn, fnCallback )
+               {
+                       _fnSortAttachListener( _fnSettingsFromNode( this[_oExt.iApiIndex] ), nNode, iColumn,
+                               fnCallback );
+               };
+               
+               /*
+                * Function: fnAddData
+                * Purpose:  Add new row(s) into the table
+                * Returns:  array int: array of indexes (aoData) which have been added (zero length on error)
+                * Inputs:   array:mData - the data to be added. The length must match
+                *               the original data from the DOM
+                *             or
+                *             array array:mData - 2D array of data to be added
+                *           bool:bRedraw - redraw the table or not - default true
+                * Notes:    Warning - the refilter here will cause the table to redraw
+                *             starting at zero
+                * Notes:    Thanks to Yekimov Denis for contributing the basis for this function!
+                */
+               this.fnAddData = function( mData, bRedraw )
+               {
+                       if ( mData.length === 0 )
+                       {
+                               return [];
+                       }
+                       
+                       var aiReturn = [];
+                       var iTest;
+                       
+                       /* Find settings from table node */
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       
+                       /* Check if we want to add multiple rows or not */
+                       if ( typeof mData[0] == "object" )
+                       {
+                               for ( var i=0 ; i<mData.length ; i++ )
+                               {
+                                       iTest = _fnAddData( oSettings, mData[i] );
+                                       if ( iTest == -1 )
+                                       {
+                                               return aiReturn;
+                                       }
+                                       aiReturn.push( iTest );
+                               }
+                       }
+                       else
+                       {
+                               iTest = _fnAddData( oSettings, mData );
+                               if ( iTest == -1 )
+                               {
+                                       return aiReturn;
+                               }
+                               aiReturn.push( iTest );
+                       }
+                       
+                       oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+                       
+                       if ( typeof bRedraw == 'undefined' || bRedraw )
+                       {
+                               _fnReDraw( oSettings );
+                       }
+                       return aiReturn;
+               };
+               
+               /*
+                * Function: fnDeleteRow
+                * Purpose:  Remove a row for the table
+                * Returns:  array:aReturn - the row that was deleted
+                * Inputs:   mixed:mTarget - 
+                *             int: - index of aoData to be deleted, or
+                *             node(TR): - TR element you want to delete
+                *           function:fnCallBack - callback function - default null
+                *           bool:bRedraw - redraw the table or not - default true
+                */
+               this.fnDeleteRow = function( mTarget, fnCallBack, bRedraw )
+               {
+                       /* Find settings from table node */
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       var i, iAODataIndex;
+                       
+                       iAODataIndex = (typeof mTarget == 'object') ? 
+                               _fnNodeToDataIndex(oSettings, mTarget) : mTarget;
+                       
+                       /* Return the data array from this row */
+                       var oData = oSettings.aoData.splice( iAODataIndex, 1 );
+                       
+                       /* Remove the target row from the search array */
+                       var iDisplayIndex = $.inArray( iAODataIndex, oSettings.aiDisplay );
+                       oSettings.asDataSearch.splice( iDisplayIndex, 1 );
+                       
+                       /* Delete from the display arrays */
+                       _fnDeleteIndex( oSettings.aiDisplayMaster, iAODataIndex );
+                       _fnDeleteIndex( oSettings.aiDisplay, iAODataIndex );
+                       
+                       /* If there is a user callback function - call it */
+                       if ( typeof fnCallBack == "function" )
+                       {
+                               fnCallBack.call( this, oSettings, oData );
+                       }
+                       
+                       /* Check for an 'overflow' they case for dislaying the table */
+                       if ( oSettings._iDisplayStart >= oSettings.aiDisplay.length )
+                       {
+                               oSettings._iDisplayStart -= oSettings._iDisplayLength;
+                               if ( oSettings._iDisplayStart < 0 )
+                               {
+                                       oSettings._iDisplayStart = 0;
+                               }
+                       }
+                       
+                       if ( typeof bRedraw == 'undefined' || bRedraw )
+                       {
+                               _fnCalculateEnd( oSettings );
+                               _fnDraw( oSettings );
+                       }
+                       
+                       return oData;
+               };
+               
+               /*
+                * Function: fnClearTable
+                * Purpose:  Quickly and simply clear a table
+                * Returns:  -
+                * Inputs:   bool:bRedraw - redraw the table or not - default true
+                * Notes:    Thanks to Yekimov Denis for contributing the basis for this function!
+                */
+               this.fnClearTable = function( bRedraw )
+               {
+                       /* Find settings from table node */
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       _fnClearTable( oSettings );
+                       
+                       if ( typeof bRedraw == 'undefined' || bRedraw )
+                       {
+                               _fnDraw( oSettings );
+                       }
+               };
+               
+               /*
+                * Function: fnOpen
+                * Purpose:  Open a display row (append a row after the row in question)
+                * Returns:  node:nNewRow - the row opened
+                * Inputs:   node:nTr - the table row to 'open'
+                *           string:sHtml - the HTML to put into the row
+                *           string:sClass - class to give the new TD cell
+                */
+               this.fnOpen = function( nTr, sHtml, sClass )
+               {
+                       /* Find settings from table node */
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       
+                       /* the old open one if there is one */
+                       this.fnClose( nTr );
+                       
+                       var nNewRow = document.createElement("tr");
+                       var nNewCell = document.createElement("td");
+                       nNewRow.appendChild( nNewCell );
+                       nNewCell.className = sClass;
+                       nNewCell.colSpan = _fnVisbleColumns( oSettings );
+                       nNewCell.innerHTML = sHtml;
+                       
+                       /* If the nTr isn't on the page at the moment - then we don't insert at the moment */
+                       var nTrs = $('tr', oSettings.nTBody);
+                       if ( $.inArray(nTr, nTrs) != -1 )
+                       {
+                               $(nNewRow).insertAfter(nTr);
+                       }
+                       
+                       oSettings.aoOpenRows.push( {
+                               "nTr": nNewRow,
+                               "nParent": nTr
+                       } );
+                       
+                       return nNewRow;
+               };
+               
+               /*
+                * Function: fnClose
+                * Purpose:  Close a display row
+                * Returns:  int: 0 (success) or 1 (failed)
+                * Inputs:   node:nTr - the table row to 'close'
+                */
+               this.fnClose = function( nTr )
+               {
+                       /* Find settings from table node */
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       
+                       for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ )
+                       {
+                               if ( oSettings.aoOpenRows[i].nParent == nTr )
+                               {
+                                       var nTrParent = oSettings.aoOpenRows[i].nTr.parentNode;
+                                       if ( nTrParent )
+                                       {
+                                               /* Remove it if it is currently on display */
+                                               nTrParent.removeChild( oSettings.aoOpenRows[i].nTr );
+                                       }
+                                       oSettings.aoOpenRows.splice( i, 1 );
+                                       return 0;
+                               }
+                       }
+                       return 1;
+               };
+               
+               /*
+                * Function: fnGetData
+                * Purpose:  Return an array with the data which is used to make up the table
+                * Returns:  array array string: 2d data array ([row][column]) or array string: 1d data array
+                *           or
+                *           array string (if iRow specified)
+                * Inputs:   mixed:mRow - optional - if not present, then the full 2D array for the table 
+                *             if given then:
+                *               int: - return 1D array for aoData entry of this index
+                *               node(TR): - return 1D array for this TR element
+                * Inputs:   int:iRow - optional - if present then the array returned will be the data for
+                *             the row with the index 'iRow'
+                */
+               this.fnGetData = function( mRow )
+               {
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       
+                       if ( typeof mRow != 'undefined' )
+                       {
+                               var iRow = (typeof mRow == 'object') ? 
+                                       _fnNodeToDataIndex(oSettings, mRow) : mRow;
+                               return ( (aRowData = oSettings.aoData[iRow]) ? aRowData._aData : null);
+                       }
+                       return _fnGetDataMaster( oSettings );
+               };
+               
+               /*
+                * Function: fnGetNodes
+                * Purpose:  Return an array with the TR nodes used for drawing the table
+                * Returns:  array node: TR elements
+                *           or
+                *           node (if iRow specified)
+                * Inputs:   int:iRow - optional - if present then the array returned will be the node for
+                *             the row with the index 'iRow'
+                */
+               this.fnGetNodes = function( iRow )
+               {
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       
+                       if ( typeof iRow != 'undefined' )
+                       {
+                               return ( (aRowData = oSettings.aoData[iRow]) ? aRowData.nTr : null );
+                       }
+                       return _fnGetTrNodes( oSettings );
+               };
+               
+               /*
+                * Function: fnGetPosition
+                * Purpose:  Get the array indexes of a particular cell from it's DOM element
+                * Returns:  int: - row index, or array[ int, int, int ]: - row index, column index (visible)
+                *             and column index including hidden columns
+                * Inputs:   node:nNode - this can either be a TR or a TD in the table, the return is
+                *             dependent on this input
+                */
+               this.fnGetPosition = function( nNode )
+               {
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       var i;
+                       
+                       if ( nNode.nodeName.toUpperCase() == "TR" )
+                       {
+                               return _fnNodeToDataIndex(oSettings, nNode);
+                       }
+                       else if ( nNode.nodeName.toUpperCase() == "TD" )
+                       {
+                               var iDataIndex = _fnNodeToDataIndex(oSettings, nNode.parentNode);
+                               var iCorrector = 0;
+                               for ( var j=0 ; j<oSettings.aoColumns.length ; j++ )
+                               {
+                                       if ( oSettings.aoColumns[j].bVisible )
+                                       {
+                                               if ( oSettings.aoData[iDataIndex].nTr.getElementsByTagName('td')[j-iCorrector] == nNode )
+                                               {
+                                                       return [ iDataIndex, j-iCorrector, j ];
+                                               }
+                                       }
+                                       else
+                                       {
+                                               iCorrector++;
+                                       }
+                               }
+                       }
+                       return null;
+               };
+               
+               /*
+                * Function: fnUpdate
+                * Purpose:  Update a table cell or row
+                * Returns:  int: 0 okay, 1 error
+                * Inputs:   array string 'or' string:mData - data to update the cell/row with
+                *           mixed:mRow - 
+                *             int: - index of aoData to be updated, or
+                *             node(TR): - TR element you want to update
+                *           int:iColumn - the column to update - optional (not used of mData is 2D)
+                *           bool:bRedraw - redraw the table or not - default true
+                *           bool:bAction - perform predraw actions or not (you will want this as 'true' if
+                *             you have bRedraw as true) - default true
+                */
+               this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
+               {
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       var iVisibleColumn;
+                       var sDisplay;
+                       var iRow = (typeof mRow == 'object') ? 
+                               _fnNodeToDataIndex(oSettings, mRow) : mRow;
+                       
+                       if ( typeof mData != 'object' )
+                       {
+                               sDisplay = mData;
+                               oSettings.aoData[iRow]._aData[iColumn] = sDisplay;
+                               
+                               if ( oSettings.aoColumns[iColumn].fnRender !== null )
+                               {
+                                       sDisplay = oSettings.aoColumns[iColumn].fnRender( {
+                                               "iDataRow": iRow,
+                                               "iDataColumn": iColumn,
+                                               "aData": oSettings.aoData[iRow]._aData,
+                                               "oSettings": oSettings
+                                       } );
+                                       
+                                       if ( oSettings.aoColumns[iColumn].bUseRendered )
+                                       {
+                                               oSettings.aoData[iRow]._aData[iColumn] = sDisplay;
+                                       }
+                               }
+                               
+                               iVisibleColumn = _fnColumnIndexToVisible( oSettings, iColumn );
+                               if ( iVisibleColumn !== null )
+
+                               {
+                                       oSettings.aoData[iRow].nTr.getElementsByTagName('td')[iVisibleColumn].innerHTML = 
+                                               sDisplay;
+                               }
+                               else
+                               {
+                                       oSettings.aoData[iRow]._anHidden[iColumn].innerHTML = sDisplay;
+                               }
+                       }
+                       else
+                       {
+                               if ( mData.length != oSettings.aoColumns.length )
+                               {
+                                       _fnLog( oSettings, 0, 'An array passed to fnUpdate must have the same number of '+
+                                               'columns as the table in question - in this case '+oSettings.aoColumns.length );
+                                       return 1;
+                               }
+                               
+                               for ( var i=0 ; i<mData.length ; i++ )
+                               {
+                                       sDisplay = mData[i];
+                                       oSettings.aoData[iRow]._aData[i] = sDisplay;
+                                       
+                                       if ( oSettings.aoColumns[i].fnRender !== null )
+                                       {
+                                               sDisplay = oSettings.aoColumns[i].fnRender( {
+                                                       "iDataRow": iRow,
+                                                       "iDataColumn": i,
+                                                       "aData": oSettings.aoData[iRow]._aData,
+                                                       "oSettings": oSettings
+                                               } );
+                                               
+                                               if ( oSettings.aoColumns[i].bUseRendered )
+                                               {
+                                                       oSettings.aoData[iRow]._aData[i] = sDisplay;
+                                               }
+                                       }
+                                       
+                                       iVisibleColumn = _fnColumnIndexToVisible( oSettings, i );
+                                       if ( iVisibleColumn !== null )
+                                       {
+                                               oSettings.aoData[iRow].nTr.getElementsByTagName('td')[iVisibleColumn].innerHTML = 
+                                                       sDisplay;
+                                       }
+                                       else
+                                       {
+                                               oSettings.aoData[iRow]._anHidden[i].innerHTML = sDisplay;
+                                       }
+                               }
+                       }
+                       
+                       /* Modify the search index for this row (strictly this is likely not needed, since fnReDraw
+                        * will rebuild the search array - however, the redraw might be disabled by the user)
+                        */
+                       var iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay );
+                       oSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow( oSettings, 
+                               oSettings.aoData[iRow]._aData );
+                       
+                       /* Perform pre-draw actions */
+                       if ( typeof bAction == 'undefined' || bAction )
+                       {
+                               _fnAjustColumnSizing( oSettings );
+                       }
+                       
+                       /* Redraw the table */
+                       if ( typeof bRedraw == 'undefined' || bRedraw )
+                       {
+                               _fnReDraw( oSettings );
+                       }
+                       return 0;
+               };
+               
+               
+               /*
+                * Function: fnShowColoumn
+                * Purpose:  Show a particular column
+                * Returns:  -
+                * Inputs:   int:iCol - the column whose display should be changed
+                *           bool:bShow - show (true) or hide (false) the column
+                *           bool:bRedraw - redraw the table or not - default true
+                */
+               this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
+               {
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       var i, iLen;
+                       var iColumns = oSettings.aoColumns.length;
+                       var nTd, anTds, nCell, anTrs, jqChildren;
+                       
+                       /* No point in doing anything if we are requesting what is already true */
+                       if ( oSettings.aoColumns[iCol].bVisible == bShow )
+                       {
+                               return;
+                       }
+                       
+                       var nTrHead = $('>tr', oSettings.nTHead)[0];
+                       var nTrFoot = $('>tr', oSettings.nTFoot)[0];
+                       var anTheadTh = [];
+                       var anTfootTh = [];
+                       for ( i=0 ; i<iColumns ; i++ )
+                       {
+                               anTheadTh.push( oSettings.aoColumns[i].nTh );
+                               anTfootTh.push( oSettings.aoColumns[i].nTf );
+                       }
+                       
+                       /* Show the column */
+                       if ( bShow )
+                       {
+                               var iInsert = 0;
+                               for ( i=0 ; i<iCol ; i++ )
+                               {
+                                       if ( oSettings.aoColumns[i].bVisible )
+                                       {
+                                               iInsert++;
+                                       }
+                               }
+                               
+                               /* Need to decide if we should use appendChild or insertBefore */
+                               if ( iInsert >= _fnVisbleColumns( oSettings ) )
+                               {
+                                       nTrHead.appendChild( anTheadTh[iCol] );
+                                       anTrs = $('>tr', oSettings.nTHead);
+                                       for ( i=1, iLen=anTrs.length ; i<iLen ; i++ )
+                                       {
+                                               anTrs[i].appendChild( oSettings.aoColumns[iCol].anThExtra[i-1] );
+                                       }       
+                                       
+                                       if ( nTrFoot )
+                                       {
+                                               nTrFoot.appendChild( anTfootTh[iCol] );
+                                               anTrs = $('>tr', oSettings.nTFoot);
+                                               for ( i=1, iLen=anTrs.length ; i<iLen ; i++ )
+                                               {
+                                                       anTrs[i].appendChild( oSettings.aoColumns[iCol].anTfExtra[i-1] );
+                                               }       
+                                       }
+                                       
+                                       for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
+                                       {
+                                               nTd = oSettings.aoData[i]._anHidden[iCol];
+                                               oSettings.aoData[i].nTr.appendChild( nTd );
+                                       }
+                               }
+                               else
+                               {
+                                       /* Which coloumn should we be inserting before? */
+                                       var iBefore;
+                                       for ( i=iCol ; i<iColumns ; i++ )
+                                       {
+                                               iBefore = _fnColumnIndexToVisible( oSettings, i );
+                                               if ( iBefore !== null )
+                                               {
+                                                       break;
+                                               }
+                                       }
+                                       
+                                       nTrHead.insertBefore( anTheadTh[iCol], nTrHead.getElementsByTagName('th')[iBefore] );
+                                       anTrs = $('>tr', oSettings.nTHead);
+                                       for ( i=1, iLen=anTrs.length ; i<iLen ; i++ )
+                                       {
+                                               jqChildren = $(anTrs[i]).children();
+                                               anTrs[i].insertBefore( oSettings.aoColumns[iCol].anThExtra[i-1], jqChildren[iBefore] );
+                                       }       
+                                       
+                                       if ( nTrFoot )
+                                       {
+                                               nTrFoot.insertBefore( anTfootTh[iCol], nTrFoot.getElementsByTagName('th')[iBefore] );
+                                               anTrs = $('>tr', oSettings.nTFoot);
+                                               for ( i=1, iLen=anTrs.length ; i<iLen ; i++ )
+                                               {
+                                                       jqChildren = $(anTrs[i]).children();
+                                                       anTrs[i].insertBefore( oSettings.aoColumns[iCol].anTfExtra[i-1], jqChildren[iBefore] );
+                                               }       
+                                       }
+                                       
+                                       anTds = _fnGetTdNodes( oSettings );
+                                       for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
+                                       {
+                                               nTd = oSettings.aoData[i]._anHidden[iCol];
+                                               oSettings.aoData[i].nTr.insertBefore( nTd, $('>td:eq('+iBefore+')', 
+                                                       oSettings.aoData[i].nTr)[0] );
+                                       }
+                               }
+                               
+                               oSettings.aoColumns[iCol].bVisible = true;
+                       }
+                       else
+                       {
+                               /* Remove a column from display */
+                               nTrHead.removeChild( anTheadTh[iCol] );
+                               for ( i=0, iLen=oSettings.aoColumns[iCol].anThExtra.length ; i<iLen ; i++ )
+                               {
+                                       nCell = oSettings.aoColumns[iCol].anThExtra[i];
+                                       nCell.parentNode.removeChild( nCell );
+                               }
+                               
+                               if ( nTrFoot )
+                               {
+                                       nTrFoot.removeChild( anTfootTh[iCol] );
+                                       for ( i=0, iLen=oSettings.aoColumns[iCol].anTfExtra.length ; i<iLen ; i++ )
+                                       {
+                                               nCell = oSettings.aoColumns[iCol].anTfExtra[i];
+                                               nCell.parentNode.removeChild( nCell );
+                                       }
+                               }
+                               
+                               anTds = _fnGetTdNodes( oSettings );
+                               for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
+                               {
+                                       nTd = anTds[ ( i*oSettings.aoColumns.length) + (iCol*1) ];
+                                       oSettings.aoData[i]._anHidden[iCol] = nTd;
+                                       nTd.parentNode.removeChild( nTd );
+                               }
+                               
+                               oSettings.aoColumns[iCol].bVisible = false;
+                       }
+                       
+                       /* If there are any 'open' rows, then we need to alter the colspan for this col change */
+                       for ( i=0, iLen=oSettings.aoOpenRows.length ; i<iLen ; i++ )
+                       {
+                               oSettings.aoOpenRows[i].nTr.colSpan = _fnVisbleColumns( oSettings );
+                       }
+                       
+                       /* Do a redraw incase anything depending on the table columns needs it 
+                        * (built-in: scrolling) 
+                        */
+                       if ( typeof bRedraw == 'undefined' || bRedraw )
+                       {
+                               _fnAjustColumnSizing( oSettings );
+                               _fnDraw( oSettings );
+                       }
+                       
+                       _fnSaveState( oSettings );
+               };
+               
+               /*
+                * Function: fnPageChange
+                * Purpose:  Change the pagination
+                * Returns:  -
+                * Inputs:   string:sAction - paging action to take: "first", "previous", "next" or "last"
+                *           bool:bRedraw - redraw the table or not - optional - default true
+                */
+               this.fnPageChange = function ( sAction, bRedraw )
+               {
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       _fnPageChange( oSettings, sAction );
+                       _fnCalculateEnd( oSettings );
+                       
+                       if ( typeof bRedraw == 'undefined' || bRedraw )
+                       {
+                               _fnDraw( oSettings );
+                       }
+               };
+               
+               /*
+                * Function: fnDestroy
+                * Purpose:  Destructor for the DataTable
+                * Returns:  -
+                * Inputs:   -
+                */
+               this.fnDestroy = function ( )
+               {
+                       var oSettings = _fnSettingsFromNode( this[_oExt.iApiIndex] );
+                       var nOrig = oSettings.nTableWrapper.parentNode;
+                       var nBody = oSettings.nTBody;
+                       var i, iLen;
+                       
+                       /* Flag to note that the table is currently being destoryed - no action should be taken */
+                       oSettings.bDestroying = true;
+                       
+                       /* Blitz all DT events */
+                       $(oSettings.nTableWrapper).find('*').andSelf().unbind('.DT');
+                       
+                       /* Restore hidden columns */
+                       for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                       {
+                               if ( oSettings.aoColumns[i].bVisible === false )
+                               {
+                                       this.fnSetColumnVis( i, true );
+                               }
+                       }
+                       
+                       /* If there is an 'empty' indicator row, remove it */
+                       $('tbody>tr>td.'+oSettings.oClasses.sRowEmpty, oSettings.nTable).parent().remove();
+                       
+                       /* When scrolling we had to break the table up - restore it */
+                       if ( oSettings.nTable != oSettings.nTHead.parentNode )
+                       {
+                               $('>thead', oSettings.nTable).remove();
+                               oSettings.nTable.appendChild( oSettings.nTHead );
+                       }
+                       
+                       if ( oSettings.nTFoot && oSettings.nTable != oSettings.nTFoot.parentNode )
+                       {
+                               $('>tfoot', oSettings.nTable).remove();
+                               oSettings.nTable.appendChild( oSettings.nTFoot );
+                       }
+                       
+                       /* Remove the DataTables generated nodes, events and classes */
+                       oSettings.nTable.parentNode.removeChild( oSettings.nTable );
+                       $(oSettings.nTableWrapper).remove();
+                       
+                       oSettings.aaSorting = [];
+                       oSettings.aaSortingFixed = [];
+                       _fnSortingClasses( oSettings );
+                       
+                       $(_fnGetTrNodes( oSettings )).removeClass( oSettings.asStripClasses.join(' ') );
+                       
+                       if ( !oSettings.bJUI )
+                       {
+                               $('th', oSettings.nTHead).removeClass( [ _oExt.oStdClasses.sSortable,
+                                       _oExt.oStdClasses.sSortableAsc,
+                                       _oExt.oStdClasses.sSortableDesc,
+                                       _oExt.oStdClasses.sSortableNone ].join(' ')
+                               );
+                       }
+                       else
+                       {
+                               $('th', oSettings.nTHead).removeClass( [ _oExt.oStdClasses.sSortable,
+                                       _oExt.oJUIClasses.sSortableAsc,
+                                       _oExt.oJUIClasses.sSortableDesc,
+                                       _oExt.oJUIClasses.sSortableNone ].join(' ')
+                               );
+                               $('th span', oSettings.nTHead).remove();
+                       }
+                       
+                       /* Add the TR elements back into the table in their original order */
+                       nOrig.appendChild( oSettings.nTable );
+                       for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
+                       {
+                               nBody.appendChild( oSettings.aoData[i].nTr );
+                       }
+                       
+                       /* Restore the width of the original table */
+                       oSettings.nTable.style.width = _fnStringToCss(oSettings.sDestroyWidth);
+                       
+                       /* If the were originally odd/even type classes - then we add them back here. Note
+                        * this is not fool proof (for example if not all rows as odd/even classes - but 
+                        * it's a good effort without getting carried away
+                        */
+                       $('>tr:even', nBody).addClass( oSettings.asDestoryStrips[0] );
+                       $('>tr:odd', nBody).addClass( oSettings.asDestoryStrips[1] );
+                       
+                       /* Remove the settings object from the settings array */
+                       for ( i=0, iLen=_aoSettings.length ; i<iLen ; i++ )
+                       {
+                               if ( _aoSettings[i] == oSettings )
+                               {
+                                       _aoSettings.splice( i, 1 );
+                               }
+                       }
+                       
+                       /* End it all */
+                       oSettings = null;
+               };
+               
+               /*
+                * Function: fnAjustColumnSizing
+                * Purpose:  Update tale sizing based on content. This would most likely be used for scrolling
+                *   and will typically need a redraw after it.
+                * Returns:  -
+                * Inputs:   bool:bRedraw - redraw the table or not, you will typically want to - default true
+                */
+               this.fnAdjustColumnSizing = function ( bRedraw )
+               {
+                       var oSettings = _fnSettingsFromNode(this[_oExt.iApiIndex]);
+                       _fnAjustColumnSizing( oSettings );
+                       
+                       if ( typeof bRedraw == 'undefined' || bRedraw )
+                       {
+                               this.fnDraw( false );
+                       }
+                       else if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
+                       {
+                               /* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
+                               this.oApi._fnScrollDraw(oSettings);
+                       }
+               };
+               
+               /*
+                * Plugin API functions
+                * 
+                * This call will add the functions which are defined in _oExt.oApi to the
+                * DataTables object, providing a rather nice way to allow plug-in API functions. Note that
+                * this is done here, so that API function can actually override the built in API functions if
+                * required for a particular purpose.
+                */
+               
+               /*
+                * Function: _fnExternApiFunc
+                * Purpose:  Create a wrapper function for exporting an internal func to an external API func
+                * Returns:  function: - wrapped function
+                * Inputs:   string:sFunc - API function name
+                */
+               function _fnExternApiFunc (sFunc)
+               {
+                       return function() {
+                                       var aArgs = [_fnSettingsFromNode(this[_oExt.iApiIndex])].concat( 
+                                               Array.prototype.slice.call(arguments) );
+                                       return _oExt.oApi[sFunc].apply( this, aArgs );
+                               };
+               }
+               
+               for ( var sFunc in _oExt.oApi )
+               {
+                       if ( sFunc )
+                       {
+                               /*
+                                * Function: anon
+                                * Purpose:  Wrap the plug-in API functions in order to provide the settings as 1st arg 
+                                *   and execute in this scope
+                                * Returns:  -
+                                * Inputs:   -
+                                */
+                               this[sFunc] = _fnExternApiFunc(sFunc);
+                       }
+               }
+               
+               
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - Local functions
+                * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - Initalisation
+                */
+               
+               /*
+                * Function: _fnInitalise
+                * Purpose:  Draw the table for the first time, adding all required features
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnInitalise ( oSettings )
+               {
+                       var i, iLen;
+                       
+                       /* Ensure that the table data is fully initialised */
+                       if ( oSettings.bInitialised === false )
+                       {
+                               setTimeout( function(){ _fnInitalise( oSettings ); }, 200 );
+                               return;
+                       }
+                       
+                       /* Show the display HTML options */
+                       _fnAddOptionsHtml( oSettings );
+                       
+                       /* Draw the headers for the table */
+                       _fnDrawHead( oSettings );
+                       
+                       /* Okay to show that something is going on now */
+                       _fnProcessingDisplay( oSettings, true );
+                       
+                       /* Calculate sizes for columns */
+                       if ( oSettings.oFeatures.bAutoWidth )
+                       {
+                               _fnCalculateColumnWidths( oSettings );
+                       }
+                       
+                       for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                       {
+                               if ( oSettings.aoColumns[i].sWidth !== null )
+                               {
+                                       oSettings.aoColumns[i].nTh.style.width = _fnStringToCss( oSettings.aoColumns[i].sWidth );
+                               }
+                       }
+                       
+                       /* If there is default sorting required - let's do it. The sort function will do the
+                        * drawing for us. Otherwise we draw the table regardless of the Ajax source - this allows
+                        * the table to look initialised for Ajax sourcing data (show 'loading' message possibly)
+                        */
+                       if ( oSettings.oFeatures.bSort )
+                       {
+                               _fnSort( oSettings );
+                       }
+                       else
+                       {
+                               oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+                               _fnCalculateEnd( oSettings );
+                               _fnDraw( oSettings );
+                       }
+                       
+                       /* if there is an ajax source load the data */
+                       if ( oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
+                       {
+                               oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, [], function(json) {
+                                       /* Got the data - add it to the table */
+                                       for ( i=0 ; i<json.aaData.length ; i++ )
+                                       {
+                                               _fnAddData( oSettings, json.aaData[i] );
+                                       }
+                                       
+                                       /* Reset the init display for cookie saving. We've already done a filter, and
+                                        * therefore cleared it before. So we need to make it appear 'fresh'
+                                        */
+                                       oSettings.iInitDisplayStart = oSettings._iDisplayStart;
+                                       
+                                       if ( oSettings.oFeatures.bSort )
+                                       {
+                                               _fnSort( oSettings );
+                                       }
+                                       else
+                                       {
+                                               oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+                                               _fnCalculateEnd( oSettings );
+                                               _fnDraw( oSettings );
+                                       }
+                                       
+                                       _fnProcessingDisplay( oSettings, false );
+                                       _fnInitComplete( oSettings, json );
+                               } );
+                               return;
+                       }
+                       
+                       /* Server-side processing initialisation complete is done at the end of _fnDraw */
+                       if ( !oSettings.oFeatures.bServerSide )
+                       {
+                               _fnProcessingDisplay( oSettings, false );
+                               _fnInitComplete( oSettings );
+                       }
+               }
+               
+               /*
+                * Function: _fnInitalise
+                * Purpose:  Draw the table for the first time, adding all required features
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnInitComplete ( oSettings, json )
+               {
+                       oSettings._bInitComplete = true;
+                       if ( typeof oSettings.fnInitComplete == 'function' )
+                       {
+                               if ( typeof json != 'undefined' )
+                               {
+                                       oSettings.fnInitComplete.call( oSettings.oInstance, oSettings, json );
+                               }
+                               else
+                               {
+                                       oSettings.fnInitComplete.call( oSettings.oInstance, oSettings );
+                               }
+                       }
+               }
+               
+               /*
+                * Function: _fnLanguageProcess
+                * Purpose:  Copy language variables from remote object to a local one
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                *           object:oLanguage - Language information
+                *           bool:bInit - init once complete
+                */
+               function _fnLanguageProcess( oSettings, oLanguage, bInit )
+               {
+                       _fnMap( oSettings.oLanguage, oLanguage, 'sProcessing' );
+                       _fnMap( oSettings.oLanguage, oLanguage, 'sLengthMenu' );
+                       _fnMap( oSettings.oLanguage, oLanguage, 'sEmptyTable' );
+                       _fnMap( oSettings.oLanguage, oLanguage, 'sZeroRecords' );
+                       _fnMap( oSettings.oLanguage, oLanguage, 'sInfo' );
+                       _fnMap( oSettings.oLanguage, oLanguage, 'sInfoEmpty' );
+                       _fnMap( oSettings.oLanguage, oLanguage, 'sInfoFiltered' );
+                       _fnMap( oSettings.oLanguage, oLanguage, 'sInfoPostFix' );
+                       _fnMap( oSettings.oLanguage, oLanguage, 'sSearch' );
+                       
+                       if ( typeof oLanguage.oPaginate != 'undefined' )
+                       {
+                               _fnMap( oSettings.oLanguage.oPaginate, oLanguage.oPaginate, 'sFirst' );
+                               _fnMap( oSettings.oLanguage.oPaginate, oLanguage.oPaginate, 'sPrevious' );
+                               _fnMap( oSettings.oLanguage.oPaginate, oLanguage.oPaginate, 'sNext' );
+                               _fnMap( oSettings.oLanguage.oPaginate, oLanguage.oPaginate, 'sLast' );
+                       }
+                       
+                       /* Backwards compatibility - if there is no sEmptyTable given, then use the same as
+                        * sZeroRecords - assuming that is given.
+                        */
+                       if ( typeof oLanguage.sEmptyTable == 'undefined' && 
+                            typeof oLanguage.sZeroRecords != 'undefined' )
+                       {
+                               _fnMap( oSettings.oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' );
+                       }
+                       
+                       if ( bInit )
+                       {
+                               _fnInitalise( oSettings );
+                       }
+               }
+               
+               /*
+                * Function: _fnAddColumn
+                * Purpose:  Add a column to the list used for the table with default values
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                *           node:nTh - the th element for this column
+                */
+               function _fnAddColumn( oSettings, nTh )
+               {
+                       oSettings.aoColumns[ oSettings.aoColumns.length++ ] = {
+                               "sType": null,
+                               "_bAutoType": true,
+                               "bVisible": true,
+                               "bSearchable": true,
+                               "bSortable": true,
+                               "asSorting": [ 'asc', 'desc' ],
+                               "sSortingClass": oSettings.oClasses.sSortable,
+                               "sSortingClassJUI": oSettings.oClasses.sSortJUI,
+                               "sTitle": nTh ? nTh.innerHTML : '',
+                               "sName": '',
+                               "sWidth": null,
+                               "sWidthOrig": null,
+                               "sClass": null,
+                               "fnRender": null,
+                               "bUseRendered": true,
+                               "iDataSort": oSettings.aoColumns.length-1,
+                               "sSortDataType": 'std',
+                               "nTh": nTh ? nTh : document.createElement('th'),
+                               "nTf": null,
+                               "anThExtra": [],
+                               "anTfExtra": []
+                       };
+                       
+                       var iCol = oSettings.aoColumns.length-1;
+                       var oCol = oSettings.aoColumns[ iCol ];
+                       
+                       /* Add a column specific filter */
+                       if ( typeof oSettings.aoPreSearchCols[ iCol ] == 'undefined' ||
+                            oSettings.aoPreSearchCols[ iCol ] === null )
+                       {
+                               oSettings.aoPreSearchCols[ iCol ] = {
+                                       "sSearch": "",
+                                       "bRegex": false,
+                                       "bSmart": true
+                               };
+                       }
+                       else
+                       {
+                               /* Don't require that the user must specify bRegex and / or bSmart */
+                               if ( typeof oSettings.aoPreSearchCols[ iCol ].bRegex == 'undefined' )
+                               {
+                                       oSettings.aoPreSearchCols[ iCol ].bRegex = true;
+                               }
+                               
+                               if ( typeof oSettings.aoPreSearchCols[ iCol ].bSmart == 'undefined' )
+                               {
+                                       oSettings.aoPreSearchCols[ iCol ].bSmart = true;
+                               }
+                       } 
+                       
+                       /* Use the column options function to initialise classes etc */
+                       _fnColumnOptions( oSettings, iCol, null );
+               }
+               
+               /*
+                * Function: _fnColumnOptions
+                * Purpose:  Apply options for a column
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                *           int:iCol - column index to consider
+                *           object:oOptions - object with sType, bVisible and bSearchable
+                */
+               function _fnColumnOptions( oSettings, iCol, oOptions )
+               {
+                       var oCol = oSettings.aoColumns[ iCol ];
+                       
+                       /* User specified column options */
+                       if ( typeof oOptions != 'undefined' && oOptions !== null )
+                       {
+                               if ( typeof oOptions.sType != 'undefined' )
+                               {
+                                       oCol.sType = oOptions.sType;
+                                       oCol._bAutoType = false;
+                               }
+                               
+                               _fnMap( oCol, oOptions, "bVisible" );
+                               _fnMap( oCol, oOptions, "bSearchable" );
+                               _fnMap( oCol, oOptions, "bSortable" );
+                               _fnMap( oCol, oOptions, "sTitle" );
+                               _fnMap( oCol, oOptions, "sName" );
+                               _fnMap( oCol, oOptions, "sWidth" );
+                               _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
+                               _fnMap( oCol, oOptions, "sClass" );
+                               _fnMap( oCol, oOptions, "fnRender" );
+                               _fnMap( oCol, oOptions, "bUseRendered" );
+                               _fnMap( oCol, oOptions, "iDataSort" );
+                               _fnMap( oCol, oOptions, "asSorting" );
+                               _fnMap( oCol, oOptions, "sSortDataType" );
+                       }
+                       
+                       /* Feature sorting overrides column specific when off */
+                       if ( !oSettings.oFeatures.bSort )
+                       {
+                               oCol.bSortable = false;
+                       }
+                       
+                       /* Check that the class assignment is correct for sorting */
+                       if ( !oCol.bSortable ||
+                                        ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) )
+                       {
+                               oCol.sSortingClass = oSettings.oClasses.sSortableNone;
+                               oCol.sSortingClassJUI = "";
+                       }
+                       else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 )
+                       {
+                               oCol.sSortingClass = oSettings.oClasses.sSortableAsc;
+                               oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed;
+                       }
+                       else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 )
+                       {
+                               oCol.sSortingClass = oSettings.oClasses.sSortableDesc;
+                               oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed;
+                       }
+               }
+               
+               /*
+                * Function: _fnAddData
+                * Purpose:  Add a data array to the table, creating DOM node etc
+                * Returns:  int: - >=0 if successful (index of new aoData entry), -1 if failed
+                * Inputs:   object:oSettings - dataTables settings object
+                *           array:aData - data array to be added
+                * Notes:    There are two basic methods for DataTables to get data to display - a JS array
+                *   (which is dealt with by this function), and the DOM, which has it's own optimised
+                *   function (_fnGatherData). Be careful to make the same changes here as there and vice-versa
+                */
+               function _fnAddData ( oSettings, aDataSupplied )
+               {
+                       /* Sanity check the length of the new array */
+                       if ( aDataSupplied.length != oSettings.aoColumns.length &&
+                               oSettings.iDrawError != oSettings.iDraw )
+                       {
+                               _fnLog( oSettings, 0, "Added data (size "+aDataSupplied.length+") does not match known "+
+                                       "number of columns ("+oSettings.aoColumns.length+")" );
+                               oSettings.iDrawError = oSettings.iDraw;
+                               return -1;
+                       }
+                       
+                       
+                       /* Create the object for storing information about this new row */
+                       var aData = aDataSupplied.slice();
+                       var iThisIndex = oSettings.aoData.length;
+                       oSettings.aoData.push( {
+                               "nTr": document.createElement('tr'),
+                               "_iId": oSettings.iNextId++,
+                               "_aData": aData,
+                               "_anHidden": [],
+                               "_sRowStripe": ''
+                       } );
+                       
+                       /* Create the cells */
+                       var nTd, sThisType;
+                       for ( var i=0 ; i<aData.length ; i++ )
+                       {
+                               nTd = document.createElement('td');
+                               
+                               /* Allow null data (from a data array) - simply deal with it as a blank string */
+                               if ( aData[i] === null )
+                               {
+                                       aData[i] = '';
+                               }
+                               
+                               if ( typeof oSettings.aoColumns[i].fnRender == 'function' )
+                               {
+                                       var sRendered = oSettings.aoColumns[i].fnRender( {
+                                                       "iDataRow": iThisIndex,
+                                                       "iDataColumn": i,
+                                                       "aData": aData,
+                                                       "oSettings": oSettings
+                                               } );
+                                       nTd.innerHTML = sRendered;
+                                       if ( oSettings.aoColumns[i].bUseRendered )
+                                       {
+                                               /* Use the rendered data for filtering/sorting */
+                                               oSettings.aoData[iThisIndex]._aData[i] = sRendered;
+                                       }
+                               }
+                               else
+                               {
+                                       nTd.innerHTML = aData[i];
+                               }
+                               
+                               /* Cast everything as a string - so we can treat everything equally when sorting */
+                               if ( typeof aData[i] != 'string' )
+                               {
+                                       aData[i] += "";
+                               }
+                               aData[i] = $.trim(aData[i]);
+                               
+                               /* Add user defined class */
+                               if ( oSettings.aoColumns[i].sClass !== null )
+                               {
+                                       nTd.className = oSettings.aoColumns[i].sClass;
+                               }
+                               
+                               /* See if we should auto-detect the column type */
+                               if ( oSettings.aoColumns[i]._bAutoType && oSettings.aoColumns[i].sType != 'string' )
+                               {
+                                       /* Attempt to auto detect the type - same as _fnGatherData() */
+                                       sThisType = _fnDetectType( oSettings.aoData[iThisIndex]._aData[i] );
+                                       if ( oSettings.aoColumns[i].sType === null )
+                                       {
+                                               oSettings.aoColumns[i].sType = sThisType;
+                                       }
+                                       else if ( oSettings.aoColumns[i].sType != sThisType )
+                                       {
+                                               /* String is always the 'fallback' option */
+                                               oSettings.aoColumns[i].sType = 'string';
+                                       }
+                               }
+                                       
+                               if ( oSettings.aoColumns[i].bVisible )
+                               {
+                                       oSettings.aoData[iThisIndex].nTr.appendChild( nTd );
+                                       oSettings.aoData[iThisIndex]._anHidden[i] = null;
+                               }
+                               else
+                               {
+                                       oSettings.aoData[iThisIndex]._anHidden[i] = nTd;
+                               }
+                       }
+                       
+                       /* Add to the display array */
+                       oSettings.aiDisplayMaster.push( iThisIndex );
+                       return iThisIndex;
+               }
+               
+               /*
+                * Function: _fnGatherData
+                * Purpose:  Read in the data from the target table from the DOM
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                * Notes:    This is a optimised version of _fnAddData (more or less) for reading information
+                *   from the DOM. The basic actions must be identical in the two functions.
+                */
+               function _fnGatherData( oSettings )
+               {
+                       var iLoop, i, iLen, j, jLen, jInner,
+                               nTds, nTrs, nTd, aLocalData, iThisIndex,
+                               iRow, iRows, iColumn, iColumns;
+                       
+                       /*
+                        * Process by row first
+                        * Add the data object for the whole table - storing the tr node. Note - no point in getting
+                        * DOM based data if we are going to go and replace it with Ajax source data.
+                        */
+                       if ( oSettings.sAjaxSource === null )
+                       {
+                               nTrs = oSettings.nTBody.childNodes;
+                               for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+                               {
+                                       if ( nTrs[i].nodeName.toUpperCase() == "TR" )
+                                       {
+                                               iThisIndex = oSettings.aoData.length;
+                                               oSettings.aoData.push( {
+                                                       "nTr": nTrs[i],
+                                                       "_iId": oSettings.iNextId++,
+                                                       "_aData": [],
+                                                       "_anHidden": [],
+                                                       "_sRowStripe": ''
+                                               } );
+                                               
+                                               oSettings.aiDisplayMaster.push( iThisIndex );
+                                               
+                                               aLocalData = oSettings.aoData[iThisIndex]._aData;
+                                               nTds = nTrs[i].childNodes;
+                                               jInner = 0;
+                                               
+                                               for ( j=0, jLen=nTds.length ; j<jLen ; j++ )
+                                               {
+                                                       if ( nTds[j].nodeName.toUpperCase() == "TD" )
+                                                       {
+                                                               aLocalData[jInner] = $.trim(nTds[j].innerHTML);
+                                                               jInner++;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+                       
+                       /* Gather in the TD elements of the Table - note that this is basically the same as
+                        * fnGetTdNodes, but that function takes account of hidden columns, which we haven't yet
+                        * setup!
+                        */
+                       nTrs = _fnGetTrNodes( oSettings );
+                       nTds = [];
+                       for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+                       {
+                               for ( j=0, jLen=nTrs[i].childNodes.length ; j<jLen ; j++ )
+                               {
+                                       nTd = nTrs[i].childNodes[j];
+                                       if ( nTd.nodeName.toUpperCase() == "TD" )
+                                       {
+                                               nTds.push( nTd );
+                                       }
+                               }
+                       }
+                       
+                       /* Sanity check */
+                       if ( nTds.length != nTrs.length * oSettings.aoColumns.length )
+                       {
+                               _fnLog( oSettings, 1, "Unexpected number of TD elements. Expected "+
+                                       (nTrs.length * oSettings.aoColumns.length)+" and got "+nTds.length+". DataTables does "+
+                                       "not support rowspan / colspan in the table body, and there must be one cell for each "+
+                                       "row/column combination." );
+                       }
+                       
+                       /* Now process by column */
+                       for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
+                       {
+                               /* Get the title of the column - unless there is a user set one */
+                               if ( oSettings.aoColumns[iColumn].sTitle === null )
+                               {
+                                       oSettings.aoColumns[iColumn].sTitle = oSettings.aoColumns[iColumn].nTh.innerHTML;
+                               }
+                               
+                               var
+                                       bAutoType = oSettings.aoColumns[iColumn]._bAutoType,
+                                       bRender = typeof oSettings.aoColumns[iColumn].fnRender == 'function',
+                                       bClass = oSettings.aoColumns[iColumn].sClass !== null,
+                                       bVisible = oSettings.aoColumns[iColumn].bVisible,
+                                       nCell, sThisType, sRendered;
+                               
+                               /* A single loop to rule them all (and be more efficient) */
+                               if ( bAutoType || bRender || bClass || !bVisible )
+                               {
+                                       for ( iRow=0, iRows=oSettings.aoData.length ; iRow<iRows ; iRow++ )
+                                       {
+                                               nCell = nTds[ (iRow*iColumns) + iColumn ];
+                                               
+                                               /* Type detection */
+                                               if ( bAutoType )
+                                               {
+                                                       if ( oSettings.aoColumns[iColumn].sType != 'string' )
+                                                       {
+                                                               sThisType = _fnDetectType( oSettings.aoData[iRow]._aData[iColumn] );
+                                                               if ( oSettings.aoColumns[iColumn].sType === null )
+                                                               {
+                                                                       oSettings.aoColumns[iColumn].sType = sThisType;
+                                                               }
+                                                               else if ( oSettings.aoColumns[iColumn].sType != sThisType )
+                                                               {
+                                                                       /* String is always the 'fallback' option */
+                                                                       oSettings.aoColumns[iColumn].sType = 'string';
+                                                               }
+                                                       }
+                                               }
+                                               
+                                               /* Rendering */
+                                               if ( bRender )
+                                               {
+                                                       sRendered = oSettings.aoColumns[iColumn].fnRender( {
+                                                                       "iDataRow": iRow,
+                                                                       "iDataColumn": iColumn,
+                                                                       "aData": oSettings.aoData[iRow]._aData,
+                                                                       "oSettings": oSettings
+                                                               } );
+                                                       nCell.innerHTML = sRendered;
+                                                       if ( oSettings.aoColumns[iColumn].bUseRendered )
+                                                       {
+                                                               /* Use the rendered data for filtering/sorting */
+                                                               oSettings.aoData[iRow]._aData[iColumn] = sRendered;
+                                                       }
+                                               }
+                                               
+                                               /* Classes */
+                                               if ( bClass )
+                                               {
+                                                       nCell.className += ' '+oSettings.aoColumns[iColumn].sClass;
+                                               }
+                                               
+                                               /* Column visability */
+                                               if ( !bVisible )
+                                               {
+                                                       oSettings.aoData[iRow]._anHidden[iColumn] = nCell;
+                                                       nCell.parentNode.removeChild( nCell );
+                                               }
+                                               else
+                                               {
+                                                       oSettings.aoData[iRow]._anHidden[iColumn] = null;
+                                               }
+                                       }
+                               }
+                       }
+               }
+               
+               
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - Drawing functions
+                */
+               
+               /*
+                * Function: _fnDrawHead
+                * Purpose:  Create the HTML header for the table
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnDrawHead( oSettings )
+               {
+                       var i, nTh, iLen, j, jLen;
+                       var anTr = oSettings.nTHead.getElementsByTagName('tr');
+                       var iThs = oSettings.nTHead.getElementsByTagName('th').length;
+                       var iCorrector = 0;
+                       var jqChildren;
+                       
+                       /* If there is a header in place - then use it - otherwise it's going to get nuked... */
+                       if ( iThs !== 0 )
+                       {
+                               /* We've got a thead from the DOM, so remove hidden columns and apply width to vis cols */
+                               for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                               {
+                                       nTh = oSettings.aoColumns[i].nTh;
+                                       
+                                       if ( oSettings.aoColumns[i].sClass !== null )
+                                       {
+                                               $(nTh).addClass( oSettings.aoColumns[i].sClass );
+                                       }
+                                       
+                                       /* Cache and remove (if needed) any extra elements for this column in the header */
+                                       for ( j=1, jLen=anTr.length ; j<jLen ; j++ )
+                                       {
+                                               jqChildren = $(anTr[j]).children();
+                                               oSettings.aoColumns[i].anThExtra.push( jqChildren[i-iCorrector] );
+                                               if ( !oSettings.aoColumns[i].bVisible )
+                                               {
+                                                       anTr[j].removeChild( jqChildren[i-iCorrector] );
+                                               }
+                                       }
+                                       
+                                       if ( oSettings.aoColumns[i].bVisible )
+                                       {
+                                               /* Set the title of the column if it is user defined (not what was auto detected) */
+                                               if ( oSettings.aoColumns[i].sTitle != nTh.innerHTML )
+                                               {
+                                                       nTh.innerHTML = oSettings.aoColumns[i].sTitle;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               nTh.parentNode.removeChild( nTh );
+                                               iCorrector++;
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               /* We don't have a header in the DOM - so we are going to have to create one */
+                               var nTr = document.createElement( "tr" );
+                               
+                               for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                               {
+                                       nTh = oSettings.aoColumns[i].nTh;
+                                       nTh.innerHTML = oSettings.aoColumns[i].sTitle;
+                                       
+                                       if ( oSettings.aoColumns[i].sClass !== null )
+                                       {
+                                               $(nTh).addClass( oSettings.aoColumns[i].sClass );
+                                       }
+                                       
+                                       if ( oSettings.aoColumns[i].bVisible )
+                                       {
+                                               nTr.appendChild( nTh );
+                                       }
+                               }
+                               $(oSettings.nTHead).html( '' )[0].appendChild( nTr );
+                       }
+                       
+                       /* Add the extra markup needed by jQuery UI's themes */
+                       if ( oSettings.bJUI )
+                       {
+                               for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                               {
+                                       nTh = oSettings.aoColumns[i].nTh;
+                                       
+                                       var nDiv = document.createElement('div');
+                                       nDiv.className = oSettings.oClasses.sSortJUIWrapper;
+                                       $(nTh).contents().appendTo(nDiv);
+                                       
+                                       nDiv.appendChild( document.createElement('span') );
+                                       nTh.appendChild( nDiv );
+                               }
+                       }
+                       
+                       /* Add sort listener */
+                       var fnNoSelect = function (e) {
+                               this.onselectstart = function() { return false; };
+                               return false;
+                       };
+                       
+                       if ( oSettings.oFeatures.bSort )
+                       {
+                               for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+                               {
+                                       if ( oSettings.aoColumns[i].bSortable !== false )
+                                       {
+                                               _fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i );
+                                               
+                                               /* Take the brutal approach to cancelling text selection in header */
+                                               $(oSettings.aoColumns[i].nTh).bind( 'mousedown.DT', fnNoSelect );
+                                       }
+                                       else
+                                       {
+                                               $(oSettings.aoColumns[i].nTh).addClass( oSettings.oClasses.sSortableNone );
+                                       }
+                               }
+                       }
+                       
+                       /* Cache the footer elements */
+                       if ( oSettings.nTFoot !== null )
+                       {
+                               iCorrector = 0;
+                               anTr = oSettings.nTFoot.getElementsByTagName('tr');
+                               var nTfs = anTr[0].getElementsByTagName('th');
+                               
+                               for ( i=0, iLen=nTfs.length ; i<iLen ; i++ )
+                               {
+                                       if ( typeof oSettings.aoColumns[i] != 'undefined' )
+                                       {
+                                               oSettings.aoColumns[i].nTf = nTfs[i-iCorrector];
+                                               
+                                               if ( oSettings.oClasses.sFooterTH !== "" )
+                                               {
+                                                       oSettings.aoColumns[i].nTf.className += " "+oSettings.oClasses.sFooterTH;
+                                               }
+                                               
+                                               /* Deal with any extra elements for this column from the footer */
+                                               for ( j=1, jLen=anTr.length ; j<jLen ; j++ )
+                                               {
+                                                       jqChildren = $(anTr[j]).children();
+                                                       oSettings.aoColumns[i].anTfExtra.push( jqChildren[i-iCorrector] );
+                                                       if ( !oSettings.aoColumns[i].bVisible )
+                                                       {
+                                                               anTr[j].removeChild( jqChildren[i-iCorrector] );
+                                                       }
+                                               }
+                                               
+                                               if ( !oSettings.aoColumns[i].bVisible )
+                                               {
+                                                       nTfs[i-iCorrector].parentNode.removeChild( nTfs[i-iCorrector] );
+                                                       iCorrector++;
+                                               }
+                                       }
+                               }
+                       }
+               }
+               
+               /*
+                * Function: _fnDraw
+                * Purpose:  Insert the required TR nodes into the table for display
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnDraw( oSettings )
+               {
+                       var i, iLen;
+                       var anRows = [];
+                       var iRowCount = 0;
+                       var bRowError = false;
+                       var iStrips = oSettings.asStripClasses.length;
+                       var iOpenRows = oSettings.aoOpenRows.length;
+                       
+                       oSettings.bDrawing = true;
+                       
+                       /* Check and see if we have an initial draw position from state saving */
+                       if ( typeof oSettings.iInitDisplayStart != 'undefined' && oSettings.iInitDisplayStart != -1 )
+                       {
+                               if ( oSettings.oFeatures.bServerSide )
+                               {
+                                       oSettings._iDisplayStart = oSettings.iInitDisplayStart;
+                               }
+                               else
+                               {
+                                       oSettings._iDisplayStart = (oSettings.iInitDisplayStart >= oSettings.fnRecordsDisplay()) ?
+                                               0 : oSettings.iInitDisplayStart;
+                               }
+                               oSettings.iInitDisplayStart = -1;
+                               _fnCalculateEnd( oSettings );
+                       }
+                       
+                       /* If we are dealing with Ajax - do it here */
+                       if ( !oSettings.bDestroying && oSettings.oFeatures.bServerSide && 
+                            !_fnAjaxUpdate( oSettings ) )
+                       {
+                               return;
+                       }
+                       else if ( !oSettings.oFeatures.bServerSide )
+                       {
+                               oSettings.iDraw++;
+                       }
+                       
+                       if ( oSettings.aiDisplay.length !== 0 )
+                       {
+                               var iStart = oSettings._iDisplayStart;
+                               var iEnd = oSettings._iDisplayEnd;
+                               
+                               if ( oSettings.oFeatures.bServerSide )
+                               {
+                                       iStart = 0;
+                                       iEnd = oSettings.aoData.length;
+                               }
+                               
+                               for ( var j=iStart ; j<iEnd ; j++ )
+                               {
+                                       var aoData = oSettings.aoData[ oSettings.aiDisplay[j] ];
+                                       var nRow = aoData.nTr;
+                                       
+                                       /* Remove the old stripping classes and then add the new one */
+                                       if ( iStrips !== 0 )
+                                       {
+                                               var sStrip = oSettings.asStripClasses[ iRowCount % iStrips ];
+                                               if ( aoData._sRowStripe != sStrip )
+                                               {
+                                                       $(nRow).removeClass( aoData._sRowStripe ).addClass( sStrip );
+                                                       aoData._sRowStripe = sStrip;
+                                               }
+                                       }
+                                       
+                                       /* Custom row callback function - might want to manipule the row */
+                                       if ( typeof oSettings.fnRowCallback == "function" )
+                                       {
+                                               nRow = oSettings.fnRowCallback.call( oSettings.oInstance, nRow, 
+                                                       oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j );
+                                               if ( !nRow && !bRowError )
+                                               {
+                                                       _fnLog( oSettings, 0, "A node was not returned by fnRowCallback" );
+                                                       bRowError = true;
+                                               }
+                                       }
+                                       
+                                       anRows.push( nRow );
+                                       iRowCount++;
+                                       
+                                       /* If there is an open row - and it is attached to this parent - attach it on redraw */
+                                       if ( iOpenRows !== 0 )
+                                       {
+                                               for ( var k=0 ; k<iOpenRows ; k++ )
+                                               {
+                                                       if ( nRow == oSettings.aoOpenRows[k].nParent )
+                                                       {
+                                                               anRows.push( oSettings.aoOpenRows[k].nTr );
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               /* Table is empty - create a row with an empty message in it */
+                               anRows[ 0 ] = document.createElement( 'tr' );
+                               
+                               if ( typeof oSettings.asStripClasses[0] != 'undefined' )
+                               {
+                                       anRows[ 0 ].className = oSettings.asStripClasses[0];
+                               }
+                               
+                               var nTd = document.createElement( 'td' );
+                               nTd.setAttribute( 'valign', "top" );
+                               nTd.colSpan = _fnVisbleColumns( oSettings );
+                               nTd.className = oSettings.oClasses.sRowEmpty;
+                               if ( typeof oSettings.oLanguage.sEmptyTable != 'undefined' &&
+                                    oSettings.fnRecordsTotal() === 0 )
+                               {
+                                       nTd.innerHTML = oSettings.oLanguage.sEmptyTable;
+                               }
+                               else
+                               {
+                                       nTd.innerHTML = oSettings.oLanguage.sZeroRecords.replace(
+                                               '_MAX_', oSettings.fnFormatNumber(oSettings.fnRecordsTotal()) );
+                               }
+                               
+                               anRows[ iRowCount ].appendChild( nTd );
+                       }
+                       
+                       /* Callback the header and footer custom funcation if there is one */
+                       if ( typeof oSettings.fnHeaderCallback == 'function' )
+                       {
+                               oSettings.fnHeaderCallback.call( oSettings.oInstance, $('>tr', oSettings.nTHead)[0], 
+                                       _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(),
+                                       oSettings.aiDisplay );
+                       }
+                       
+                       if ( typeof oSettings.fnFooterCallback == 'function' )
+                       {
+                               oSettings.fnFooterCallback.call( oSettings.oInstance, $('>tr', oSettings.nTFoot)[0], 
+                                       _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(),
+                                       oSettings.aiDisplay );
+                       }
+                       
+                       /* 
+                        * Need to remove any old row from the display - note we can't just empty the tbody using
+                        * $().html('') since this will unbind the jQuery event handlers (even although the node 
+                        * still exists!) - equally we can't use innerHTML, since IE throws an exception.
+                        */
+                       var
+                               nAddFrag = document.createDocumentFragment(),
+                               nRemoveFrag = document.createDocumentFragment(),
+                               nBodyPar, nTrs;
+                       
+                       if ( oSettings.nTBody )
+                       {
+                               nBodyPar = oSettings.nTBody.parentNode;
+                               nRemoveFrag.appendChild( oSettings.nTBody );
+                               
+                               /* When doing infinite scrolling, only remove child rows when sorting, filtering or start
+                                * up. When not infinite scroll, always do it.
+                                */
+                               if ( !oSettings.oScroll.bInfinite || !oSettings._bInitComplete ||
+                                       oSettings.bSorted || oSettings.bFiltered )
+                               {
+                                       nTrs = oSettings.nTBody.childNodes;
+                                       for ( i=nTrs.length-1 ; i>=0 ; i-- )
+                                       {
+                                               nTrs[i].parentNode.removeChild( nTrs[i] );
+                                       }
+                               }
+                               
+                               /* Put the draw table into the dom */
+                               for ( i=0, iLen=anRows.length ; i<iLen ; i++ )
+                               {
+                                       nAddFrag.appendChild( anRows[i] );
+                               }
+                               
+                               oSettings.nTBody.appendChild( nAddFrag );
+                               if ( nBodyPar !== null )
+                               {
+                                       nBodyPar.appendChild( oSettings.nTBody );
+                               }
+                       }
+                       
+                       /* Call all required callback functions for the end of a draw */
+                       for ( i=oSettings.aoDrawCallback.length-1 ; i>=0 ; i-- )
+                       {
+                               oSettings.aoDrawCallback[i].fn.call( oSettings.oInstance, oSettings );
+                       }
+                       
+                       /* Draw is complete, sorting and filtering must be as well */
+                       oSettings.bSorted = false;
+                       oSettings.bFiltered = false;
+                       oSettings.bDrawing = false;
+                       
+                       if ( oSettings.oFeatures.bServerSide )
+                       {
+                               _fnProcessingDisplay( oSettings, false );
+                               if ( typeof oSettings._bInitComplete == 'undefined' )
+                               {
+                                       _fnInitComplete( oSettings );
+                               }
+                       }
+               }
+               
+               /*
+                * Function: _fnReDraw
+                * Purpose:  Redraw the table - taking account of the various features which are enabled
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnReDraw( oSettings )
+               {
+                       if ( oSettings.oFeatures.bSort )
+                       {
+                               /* Sorting will refilter and draw for us */
+                               _fnSort( oSettings, oSettings.oPreviousSearch );
+                       }
+                       else if ( oSettings.oFeatures.bFilter )
+                       {
+                               /* Filtering will redraw for us */
+                               _fnFilterComplete( oSettings, oSettings.oPreviousSearch );
+                       }
+                       else
+                       {
+                               _fnCalculateEnd( oSettings );
+                               _fnDraw( oSettings );
+                       }
+               }
+               
+               /*
+                * Function: _fnAjaxUpdate
+                * Purpose:  Update the table using an Ajax call
+                * Returns:  bool: block the table drawing or not
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnAjaxUpdate( oSettings )
+               {
+                       if ( oSettings.bAjaxDataGet )
+                       {
+                               _fnProcessingDisplay( oSettings, true );
+                               var iColumns = oSettings.aoColumns.length;
+                               var aoData = [];
+                               var i;
+                               
+                               /* Paging and general */
+                               oSettings.iDraw++;
+                               aoData.push( { "name": "sEcho",          "value": oSettings.iDraw } );
+                               aoData.push( { "name": "iColumns",       "value": iColumns } );
+                               aoData.push( { "name": "sColumns",       "value": _fnColumnOrdering(oSettings) } );
+                               aoData.push( { "name": "iDisplayStart",  "value": oSettings._iDisplayStart } );
+                               aoData.push( { "name": "iDisplayLength", "value": oSettings.oFeatures.bPaginate !== false ?
+                                       oSettings._iDisplayLength : -1 } );
+                               
+                               /* Filtering */
+                               if ( oSettings.oFeatures.bFilter !== false )
+                               {
+                                       aoData.push( { "name": "sSearch", "value": oSettings.oPreviousSearch.sSearch } );
+                                       aoData.push( { "name": "bRegex",  "value": oSettings.oPreviousSearch.bRegex } );
+                                       for ( i=0 ; i<iColumns ; i++ )
+                                       {
+                                               aoData.push( { "name": "sSearch_"+i,     "value": oSettings.aoPreSearchCols[i].sSearch } );
+                                               aoData.push( { "name": "bRegex_"+i,      "value": oSettings.aoPreSearchCols[i].bRegex } );
+                                               aoData.push( { "name": "bSearchable_"+i, "value": oSettings.aoColumns[i].bSearchable } );
+                                       }
+                               }
+                               
+                               /* Sorting */
+                               if ( oSettings.oFeatures.bSort !== false )
+                               {
+                                       var iFixed = oSettings.aaSortingFixed !== null ? oSettings.aaSortingFixed.length : 0;
+                                       var iUser = oSettings.aaSorting.length;
+                                       aoData.push( { "name": "iSortingCols",   "value": iFixed+iUser } );
+                                       for ( i=0 ; i<iFixed ; i++ )
+                                       {
+                                               aoData.push( { "name": "iSortCol_"+i,  "value": oSettings.aaSortingFixed[i][0] } );
+                                               aoData.push( { "name": "sSortDir_"+i,  "value": oSettings.aaSortingFixed[i][1] } );
+                                       }
+                                       
+                                       for ( i=0 ; i<iUser ; i++ )
+                                       {
+                                               aoData.push( { "name": "iSortCol_"+(i+iFixed),  "value": oSettings.aaSorting[i][0] } );
+                                               aoData.push( { "name": "sSortDir_"+(i+iFixed),  "value": oSettings.aaSorting[i][1] } );
+                                       }
+                                       
+                                       for ( i=0 ; i<iColumns ; i++ )
+                                       {
+                                               aoData.push( { "name": "bSortable_"+i,  "value": oSettings.aoColumns[i].bSortable } );
+                                       }
+                               }
+                               
+                               oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData,
+                                       function(json) {
+                                               _fnAjaxUpdateDraw( oSettings, json );
+                                       } );
+                               return false;
+                       }
+                       else
+                       {
+                               return true;
+                       }
+               }
+               
+               /*
+                * Function: _fnAjaxUpdateDraw
+                * Purpose:  Data the data from the server (nuking the old) and redraw the table
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                *           object:json - json data return from the server.
+                *             The following must be defined:
+                *               iTotalRecords, iTotalDisplayRecords, aaData
+                *             The following may be defined:
+                *               sColumns
+                */
+               function _fnAjaxUpdateDraw ( oSettings, json )
+               {
+                       if ( typeof json.sEcho != 'undefined' )
+                       {
+                               /* Protect against old returns over-writing a new one. Possible when you get
+                                * very fast interaction, and later queires are completed much faster
+                                */
+                               if ( json.sEcho*1 < oSettings.iDraw )
+                               {
+                                       return;
+                               }
+                               else
+                               {
+                                       oSettings.iDraw = json.sEcho * 1;
+                               }
+                       }
+                       
+                       if ( !oSettings.oScroll.bInfinite ||
+                                  (oSettings.oScroll.bInfinite && (oSettings.bSorted || oSettings.bFiltered)) )
+                       {
+                               _fnClearTable( oSettings );
+                       }
+                       oSettings._iRecordsTotal = json.iTotalRecords;
+                       oSettings._iRecordsDisplay = json.iTotalDisplayRecords;
+                       
+                       /* Determine if reordering is required */
+                       var sOrdering = _fnColumnOrdering(oSettings);
+                       var bReOrder = (typeof json.sColumns != 'undefined' && sOrdering !== "" && json.sColumns != sOrdering );
+                       if ( bReOrder )
+                       {
+                               var aiIndex = _fnReOrderIndex( oSettings, json.sColumns );
+                       }
+                       
+                       for ( var i=0, iLen=json.aaData.length ; i<iLen ; i++ )
+                       {
+                               if ( bReOrder )
+                               {
+                                       /* If we need to re-order, then create a new array with the correct order and add it */
+                                       var aData = [];
+                                       for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
+                                       {
+                                               aData.push( json.aaData[i][ aiIndex[j] ] );
+                                       }
+                                       _fnAddData( oSettings, aData );
+                               }
+                               else
+                               {
+                                       /* No re-order required, sever got it "right" - just straight add */
+                                       _fnAddData( oSettings, json.aaData[i] );
+                               }
+                       }
+                       oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+                       
+                       oSettings.bAjaxDataGet = false;
+                       _fnDraw( oSettings );
+                       oSettings.bAjaxDataGet = true;
+                       _fnProcessingDisplay( oSettings, false );
+               }
+               
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - Options (features) HTML
+                */
+               
+               /*
+                * Function: _fnAddOptionsHtml
+                * Purpose:  Add the options to the page HTML for the table
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnAddOptionsHtml ( oSettings )
+               {
+                       /*
+                        * Create a temporary, empty, div which we can later on replace with what we have generated
+                        * we do it this way to rendering the 'options' html offline - speed :-)
+                        */
+                       var nHolding = document.createElement( 'div' );
+                       oSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable );
+                       
+                       /* 
+                        * All DataTables are wrapped in a div - this is not currently optional - backwards 
+                        * compatability. It can be removed if you don't want it.
+                        */
+                       oSettings.nTableWrapper = document.createElement( 'div' );
+                       oSettings.nTableWrapper.className = oSettings.oClasses.sWrapper;
+                       if ( oSettings.sTableId !== '' )
+                       {
+                               oSettings.nTableWrapper.setAttribute( 'id', oSettings.sTableId+'_wrapper' );
+                       }
+                       
+                       /* Track where we want to insert the option */
+                       var nInsertNode = oSettings.nTableWrapper;
+                       
+                       /* Loop over the user set positioning and place the elements as needed */
+                       var aDom = oSettings.sDom.split('');
+                       var nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j;
+                       for ( var i=0 ; i<aDom.length ; i++ )
+                       {
+                               iPushFeature = 0;
+                               cOption = aDom[i];
+                               
+                               if ( cOption == '<' )
+                               {
+                                       /* New container div */
+                                       nNewNode = document.createElement( 'div' );
+                                       
+                                       /* Check to see if we should append an id and/or a class name to the container */
+                                       cNext = aDom[i+1];
+                                       if ( cNext == "'" || cNext == '"' )
+                                       {
+                                               sAttr = "";
+                                               j = 2;
+                                               while ( aDom[i+j] != cNext )
+                                               {
+                                                       sAttr += aDom[i+j];
+                                                       j++;
+                                               }
+                                               
+                                               /* Replace jQuery UI constants */
+                                               if ( sAttr == "H" )
+                                               {
+                                                       sAttr = "fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix";
+                                               }
+                                               else if ( sAttr == "F" )
+                                               {
+                                                       sAttr = "fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix";
+                                               }
+                                               
+                                               /* The attribute can be in the format of "#id.class", "#id" or "class" This logic
+                                                * breaks the string into parts and applies them as needed
+                                                */
+                                               if ( sAttr.indexOf('.') != -1 )
+                                               {
+                                                       var aSplit = sAttr.split('.');
+                                                       nNewNode.setAttribute('id', aSplit[0].substr(1, aSplit[0].length-1) );
+                                                       nNewNode.className = aSplit[1];
+                                               }
+                                               else if ( sAttr.charAt(0) == "#" )
+                                               {
+                                                       nNewNode.setAttribute('id', sAttr.substr(1, sAttr.length-1) );
+                                               }
+                                               else
+                                               {
+                                                       nNewNode.className = sAttr;
+                                               }
+                                               
+                                               i += j; /* Move along the position array */
+                                       }
+                                       
+                                       nInsertNode.appendChild( nNewNode );
+                                       nInsertNode = nNewNode;
+                               }
+                               else if ( cOption == '>' )
+                               {
+                                       /* End container div */
+                                       nInsertNode = nInsertNode.parentNode;
+                               }
+                               else if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange )
+                               {
+                                       /* Length */
+                                       nTmp = _fnFeatureHtmlLength( oSettings );
+                                       iPushFeature = 1;
+                               }
+                               else if ( cOption == 'f' && oSettings.oFeatures.bFilter )
+                               {
+                                       /* Filter */
+                                       nTmp = _fnFeatureHtmlFilter( oSettings );
+                                       iPushFeature = 1;
+                               }
+                               else if ( cOption == 'r' && oSettings.oFeatures.bProcessing )
+                               {
+                                       /* pRocessing */
+                                       nTmp = _fnFeatureHtmlProcessing( oSettings );
+                                       iPushFeature = 1;
+                               }
+                               else if ( cOption == 't' )
+                               {
+                                       /* Table */
+                                       nTmp = _fnFeatureHtmlTable( oSettings );
+                                       iPushFeature = 1;
+                               }
+                               else if ( cOption ==  'i' && oSettings.oFeatures.bInfo )
+                               {
+                                       /* Info */
+                                       nTmp = _fnFeatureHtmlInfo( oSettings );
+                                       iPushFeature = 1;
+                               }
+                               else if ( cOption == 'p' && oSettings.oFeatures.bPaginate )
+                               {
+                                       /* Pagination */
+                                       nTmp = _fnFeatureHtmlPaginate( oSettings );
+                                       iPushFeature = 1;
+                               }
+                               else if ( _oExt.aoFeatures.length !== 0 )
+                               {
+                                       /* Plug-in features */
+                                       var aoFeatures = _oExt.aoFeatures;
+                                       for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
+                                       {
+                                               if ( cOption == aoFeatures[k].cFeature )
+                                               {
+                                                       nTmp = aoFeatures[k].fnInit( oSettings );
+                                                       if ( nTmp )
+                                                       {
+                                                               iPushFeature = 1;
+                                                       }
+                                                       break;
+                                               }
+                                       }
+                               }
+                               
+                               /* Add to the 2D features array */
+                               if ( iPushFeature == 1 && nTmp !== null )
+                               {
+                                       if ( typeof oSettings.aanFeatures[cOption] != 'object' )
+                                       {
+                                               oSettings.aanFeatures[cOption] = [];
+                                       }
+                                       oSettings.aanFeatures[cOption].push( nTmp );
+                                       nInsertNode.appendChild( nTmp );
+                               }
+                       }
+                       
+                       /* Built our DOM structure - replace the holding div with what we want */
+                       nHolding.parentNode.replaceChild( oSettings.nTableWrapper, nHolding );
+               }
+               
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - Feature: Filtering
+                */
+               
+               /*
+                * Function: _fnFeatureHtmlTable
+                * Purpose:  Add any control elements for the table - specifically scrolling
+                * Returns:  node: - Node to add to the DOM
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnFeatureHtmlTable ( oSettings )
+               {
+                       /* Chack if scrolling is enabled or not - if not then leave the DOM unaltered */
+                       if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
+                       {
+                               return oSettings.nTable;
+                       }
+                       
+                       /*
+                        * The HTML structure that we want to generate in this function is:
+                        *  div - nScroller
+                        *    div - nScrollHead
+                        *      div - nScrollHeadInner
+                        *        table - nScrollHeadTable
+                        *          thead - nThead
+                        *    div - nScrollBody
+                        *      table - oSettings.nTable
+                        *        thead - nTheadSize
+                        *        tbody - nTbody
+                        *    div - nScrollFoot
+                        *      div - nScrollFootInner
+                        *        table - nScrollFootTable
+                        *          tfoot - nTfoot
+                        */
+                       var
+                               nScroller = document.createElement('div'),
+                               nScrollHead = document.createElement('div'),
+                               nScrollHeadInner = document.createElement('div'),
+                               nScrollBody = document.createElement('div'),
+                               nScrollFoot = document.createElement('div'),
+                               nScrollFootInner = document.createElement('div'),
+                               nScrollHeadTable = oSettings.nTable.cloneNode(false),
+                               nScrollFootTable = oSettings.nTable.cloneNode(false),
+                               nThead = oSettings.nTable.getElementsByTagName('thead')[0],
+                               nTfoot = oSettings.nTable.getElementsByTagName('tfoot').length === 0 ? null : 
+                                       oSettings.nTable.getElementsByTagName('tfoot')[0],
+                               oClasses = (typeof oInit.bJQueryUI != 'undefined' && oInit.bJQueryUI) ?
+                                       _oExt.oJUIClasses : _oExt.oStdClasses;
+                       
+                       nScrollHead.appendChild( nScrollHeadInner );
+                       nScrollFoot.appendChild( nScrollFootInner );
+                       nScrollBody.appendChild( oSettings.nTable );
+                       nScroller.appendChild( nScrollHead );
+                       nScroller.appendChild( nScrollBody );
+                       nScrollHeadInner.appendChild( nScrollHeadTable );
+                       nScrollHeadTable.appendChild( nThead );
+                       if ( nTfoot !== null )
+                       {
+                               nScroller.appendChild( nScrollFoot );
+                               nScrollFootInner.appendChild( nScrollFootTable );
+                               nScrollFootTable.appendChild( nTfoot );
+                       }
+                       
+                       nScroller.className = oClasses.sScrollWrapper;
+                       nScrollHead.className = oClasses.sScrollHead;
+                       nScrollHeadInner.className = oClasses.sScrollHeadInner;
+                       nScrollBody.className = oClasses.sScrollBody;
+                       nScrollFoot.className = oClasses.sScrollFoot;
+                       nScrollFootInner.className = oClasses.sScrollFootInner;
+                       
+                       if ( oSettings.oScroll.bAutoCss )
+                       {
+                               nScrollHead.style.overflow = "hidden";
+                               nScrollHead.style.position = "relative";
+                               nScrollFoot.style.overflow = "hidden";
+                               nScrollBody.style.overflow = "auto";
+                       }
+                       
+                       nScrollHead.style.border = "0";
+                       nScrollHead.style.width = "100%";
+                       nScrollFoot.style.border = "0";
+                       nScrollHeadInner.style.width = "150%"; /* will be overwritten */
+                       
+                       /* Modify attributes to respect the clones */
+                       nScrollHeadTable.removeAttribute('id');
+                       nScrollHeadTable.style.marginLeft = "0";
+                       oSettings.nTable.style.marginLeft = "0";
+                       if ( nTfoot !== null )
+                       {
+                               nScrollFootTable.removeAttribute('id');
+                               nScrollFootTable.style.marginLeft = "0";
+                       }
+                       
+                       /* Move any caption elements from the body to the header */
+                       var nCaptions = $('>caption', oSettings.nTable);
+                       for ( var i=0, iLen=nCaptions.length ; i<iLen ; i++ )
+                       {
+                               nScrollHeadTable.appendChild( nCaptions[i] );
+                       }
+                       
+                       /*
+                        * Sizing
+                        */
+                       /* When xscrolling add the width and a scroller to move the header with the body */
+                       if ( oSettings.oScroll.sX !== "" )
+                       {
+                               nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX );
+                               nScrollBody.style.width = _fnStringToCss( oSettings.oScroll.sX );
+                               
+                               if ( nTfoot !== null )
+                               {
+                                       nScrollFoot.style.width = _fnStringToCss( oSettings.oScroll.sX );       
+                               }
+                               
+                               /* When the body is scrolled, then we also want to scroll the headers */
+                               $(nScrollBody).scroll( function (e) {
+                                       nScrollHead.scrollLeft = this.scrollLeft;
+                                       
+                                       if ( nTfoot !== null )
+                                       {
+                                               nScrollFoot.scrollLeft = this.scrollLeft;
+                                       }
+                               } );
+                       }
+                       
+                       /* When yscrolling, add the height */
+                       if ( oSettings.oScroll.sY !== "" )
+                       {
+                               nScrollBody.style.height = _fnStringToCss( oSettings.oScroll.sY );
+                       }
+                       
+                       /* Redraw - align columns across the tables */
+                       oSettings.aoDrawCallback.push( {
+                               "fn": _fnScrollDraw,
+                               "sName": "scrolling"
+                       } );
+                       
+                       /* Infinite scrolling event handlers */
+                       if ( oSettings.oScroll.bInfinite )
+                       {
+                               $(nScrollBody).scroll( function() {
+                                       /* Use a blocker to stop scrolling from loading more data while other data is still loading */
+                                       if ( !oSettings.bDrawing )
+                                       {
+                                               /* Check if we should load the next data set */
+                                               if ( $(this).scrollTop() + $(this).height() > 
+                                                       $(oSettings.nTable).height() - oSettings.oScroll.iLoadGap )
+                                               {
+                                                       /* Only do the redraw if we have to - we might be at the end of the data */
+                                                       if ( oSettings.fnDisplayEnd() < oSettings.fnRecordsDisplay() )
+                                                       {
+                                                               _fnPageChange( oSettings, 'next' );
+                                                               _fnCalculateEnd( oSettings );
+                                                               _fnDraw( oSettings );
+                                                       }
+                                               }
+                                       }
+                               } );
+                       }
+                       
+                       oSettings.nScrollHead = nScrollHead;
+                       oSettings.nScrollFoot = nScrollFoot;
+                       
+                       return nScroller;
+               }
+               
+               /*
+                * Function: _fnScrollDraw
+                * Purpose:  Update the various tables for resizing
+                * Returns:  node: - Node to add to the DOM
+                * Inputs:   object:o - dataTables settings object
+                * Notes:    It's a bit of a pig this function, but basically the idea to:
+                *   1. Re-create the table inside the scrolling div
+                *   2. Take live measurements from the DOM
+                *   3. Apply the measurements
+                *   4. Clean up
+                */
+               function _fnScrollDraw ( o )
+               {
+                       var
+                               nScrollHeadInner = o.nScrollHead.getElementsByTagName('div')[0],
+                               nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0],
+                               nScrollBody = o.nTable.parentNode,
+                               i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis,
+                               iWidth, aApplied=[], iSanityWidth;
+                       
+                       /*
+                        * 1. Re-create the table inside the scrolling div
+                        */
+                       
+                       /* Remove the old minimised thead and tfoot elements in the inner table */
+                       var nTheadSize = o.nTable.getElementsByTagName('thead');
+                       if ( nTheadSize.length > 0 )
+                       {
+                               o.nTable.removeChild( nTheadSize[0] );
+                       }
+                       
+                       if ( o.nTFoot !== null )
+                       {
+                               /* Remove the old minimised footer element in the cloned header */
+                               var nTfootSize = o.nTable.getElementsByTagName('tfoot');
+                               if ( nTfootSize.length > 0 )
+                               {
+                                       o.nTable.removeChild( nTfootSize[0] );
+                               }
+                       }
+                       
+                       /* Clone the current header and footer elements and then place it into the inner table */
+                       nTheadSize = o.nTHead.cloneNode(true);
+                       o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] );
+                       
+                       if ( o.nTFoot !== null )
+                       {
+                               nTfootSize = o.nTFoot.cloneNode(true);
+                               o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] );
+                       }
+                       
+                       /*
+                        * 2. Take live measurements from the DOM - do not alter the DOM itself!
+                        */
+                       
+                       /* Remove old sizing and apply the calculated column widths
+                        * Get the unique column headers in the newly created (cloned) header. We want to apply the
+                        * calclated sizes to this header
+                        */
+                       var nThs = _fnGetUniqueThs( nTheadSize );
+                       for ( i=0, iLen=nThs.length ; i<iLen ; i++ )
+                       {
+                               iVis = _fnVisibleToColumnIndex( o, i );
+                               nThs[i].style.width = o.aoColumns[iVis].sWidth;
+                       }
+                       
+                       if ( o.nTFoot !== null )
+                       {
+                               _fnApplyToChildren( function(n) {
+                                       n.style.width = "";
+                               }, nTfootSize.getElementsByTagName('tr') );
+                       }
+                       
+                       /* Size the table as a whole */
+                       iSanityWidth = $(o.nTable).outerWidth();
+                       if ( o.oScroll.sX === "" )
+                       {
+                               /* No x scrolling */
+                               o.nTable.style.width = "100%";
+                               
+                               /* I know this is rubbish - but IE7 will make the width of the table when 100% include
+                                * the scrollbar - which is shouldn't. This needs feature detection in future - to do
+                                */
+                               if ( $.browser.msie && $.browser.version <= 7 )
+                               {
+                                       o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth()-o.oScroll.iBarWidth );
+                               }
+                       }
+                       else
+                       {
+                               if ( o.oScroll.sXInner !== "" )
+                               {
+                                       /* x scroll inner has been given - use it */
+                                       o.nTable.style.width = _fnStringToCss(o.oScroll.sXInner);
+                               }
+                               else if ( iSanityWidth == $(nScrollBody).width() &&
+                                  $(nScrollBody).height() < $(o.nTable).height() )
+                               {
+                                       /* There is y-scrolling - try to take account of the y scroll bar */
+                                       o.nTable.style.width = _fnStringToCss( iSanityWidth-o.oScroll.iBarWidth );
+                                       if ( $(o.nTable).outerWidth() > iSanityWidth-o.oScroll.iBarWidth )
+                                       {
+                                               /* Not possible to take account of it */
+                                               o.nTable.style.width = _fnStringToCss( iSanityWidth );
+                                       }
+                               }
+                               else
+                               {
+                                       /* All else fails */
+                                       o.nTable.style.width = _fnStringToCss( iSanityWidth );
+                               }
+                       }
+                       
+                       /* Recalculate the sanity width - now that we've applied the required width, before it was
+                        * a temporary variable. This is required because the column width calculation is done
+                        * before this table DOM is created.
+                        */
+                       iSanityWidth = $(o.nTable).outerWidth();
+                       
+                       /* We want the hidden header to have zero height, so remove padding and borders. Then
+                        * set the width based on the real headers
+                        */
+                       anHeadToSize = o.nTHead.getElementsByTagName('tr');
+                       anHeadSizers = nTheadSize.getElementsByTagName('tr');
+                       
+                       _fnApplyToChildren( function(nSizer, nToSize) {
+                               oStyle = nSizer.style;
+                               oStyle.paddingTop = "0";
+                               oStyle.paddingBottom = "0";
+                               oStyle.borderTopWidth = "0";
+                               oStyle.borderBottomWidth = "0";
+                               oStyle.height = 0;
+                               
+                               iWidth = $(nSizer).width();
+                               nToSize.style.width = _fnStringToCss( iWidth );
+                               aApplied.push( iWidth );
+                       }, anHeadSizers, anHeadToSize );
+                       $(anHeadSizers).height(0);
+                       
+                       if ( o.nTFoot !== null )
+                       {
+                               /* Clone the current footer and then place it into the body table as a "hidden header" */
+                               anFootSizers = nTfootSize.getElementsByTagName('tr');
+                               anFootToSize = o.nTFoot.getElementsByTagName('tr');
+                               
+                               _fnApplyToChildren( function(nSizer, nToSize) {
+                                       oStyle = nSizer.style;
+                                       oStyle.paddingTop = "0";
+                                       oStyle.paddingBottom = "0";
+                                       oStyle.borderTopWidth = "0";
+                                       oStyle.borderBottomWidth = "0";
+                                       oStyle.height = 0;
+                                       
+                                       iWidth = $(nSizer).width();
+                                       nToSize.style.width = _fnStringToCss( iWidth );
+                                       aApplied.push( iWidth );
+                               }, anFootSizers, anFootToSize );
+                               $(anFootSizers).height(0);
+                       }
+                       
+                       /*
+                        * 3. Apply the measurements
+                        */
+                       
+                       /* "Hide" the header and footer that we used for the sizing. We want to also fix their width
+                        * to what they currently are
+                        */
+                       _fnApplyToChildren( function(nSizer) {
+                               nSizer.innerHTML = "";
+                               nSizer.style.width = _fnStringToCss( aApplied.shift() );
+                       }, anHeadSizers );
+                       
+                       if ( o.nTFoot !== null )
+                       {
+                               _fnApplyToChildren( function(nSizer) {
+                                       nSizer.innerHTML = "";
+                                       nSizer.style.width = _fnStringToCss( aApplied.shift() );
+                               }, anFootSizers );
+                       }
+                       
+                       /* Sanity check that the table is of a sensible width. If not then we are going to get
+                        * misalignment
+                        */
+                       if ( $(o.nTable).outerWidth() < iSanityWidth )
+                       {
+                               if ( o.oScroll.sX === "" )
+                               {
+                                       _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
+                                               " misalignment. It is suggested that you enable x-scrolling or increase the width"+
+                                               " the table has in which to be drawn" );
+                               }
+                               else if ( o.oScroll.sXInner !== "" )
+                               {
+                                       _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
+                                               " misalignment. It is suggested that you increase the sScrollXInner property to"+
+                                               " allow it to draw in a larger area, or simply remove that parameter to allow"+
+                                               " automatic calculation" );
+                               }
+                       }
+                       
+                       
+                       /*
+                        * 4. Clean up
+                        */
+                       
+                       if ( o.oScroll.sY === "" )
+                       {
+                               /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
+                                * the scrollbar height from the visible display, rather than adding it on. We need to
+                                * set the height in order to sort this. Don't want to do it in any other browsers.
+                                */
+                               if ( $.browser.msie && $.browser.version <= 7 )
+                               {
+                                       nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+o.oScroll.iBarWidth );
+                               }
+                       }
+                       
+                       if ( o.oScroll.sY !== "" && o.oScroll.bCollapse )
+                       {
+                               nScrollBody.style.height = _fnStringToCss( o.oScroll.sY );
+                               
+                               var iExtra = (o.oScroll.sX !== "" && o.nTable.offsetWidth > nScrollBody.offsetWidth) ?
+                                       o.oScroll.iBarWidth : 0;
+                               if ( o.nTable.offsetHeight < nScrollBody.offsetHeight )
+                               {
+                                       nScrollBody.style.height = _fnStringToCss( $(o.nTable).height()+iExtra );
+                               }
+                       }
+                       
+                       /* Finally set the width's of the header and footer tables */
+                       var iOuterWidth = $(o.nTable).outerWidth();
+                       nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth );
+                       nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth+o.oScroll.iBarWidth );
+                       
+                       if ( o.nTFoot !== null )
+                       {
+                               var
+                                       nScrollFootInner = o.nScrollFoot.getElementsByTagName('div')[0],
+                                       nScrollFootTable = nScrollFootInner.getElementsByTagName('table')[0];
+                               
+                               nScrollFootInner.style.width = _fnStringToCss( o.nTable.offsetWidth+o.oScroll.iBarWidth );
+                               nScrollFootTable.style.width = _fnStringToCss( o.nTable.offsetWidth );
+                       }
+                       
+                       /* If sorting or filtering has occured, jump the scrolling back to the top */
+                       if ( o.bSorted || o.bFiltered )
+                       {
+                               nScrollBody.scrollTop = 0;
+                       }
+               }
+               
+               /*
+                * Function: _fnAjustColumnSizing
+                * Purpose:  Ajust the table column widths for new data
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                * Notes:    You would probably want to do a redraw after calling this function!
+                */
+               function _fnAjustColumnSizing ( oSettings )
+               {
+                       /* Not interested in doing column width calculation if autowidth is disabled */
+                       if ( oSettings.oFeatures.bAutoWidth === false )
+                       {
+                               return false;
+                       }
+                       
+                       _fnCalculateColumnWidths( oSettings );
+                       for ( var i=0 , iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                       {
+                               oSettings.aoColumns[i].nTh.style.width = oSettings.aoColumns[i].sWidth;
+                       }
+               }
+               
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - Feature: Filtering
+                */
+               
+               /*
+                * Function: _fnFeatureHtmlFilter
+                * Purpose:  Generate the node required for filtering text
+                * Returns:  node
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnFeatureHtmlFilter ( oSettings )
+               {
+                       var nFilter = document.createElement( 'div' );
+                       if ( oSettings.sTableId !== '' && typeof oSettings.aanFeatures.f == "undefined" )
+                       {
+                               nFilter.setAttribute( 'id', oSettings.sTableId+'_filter' );
+                       }
+                       nFilter.className = oSettings.oClasses.sFilter;
+                       var sSpace = oSettings.oLanguage.sSearch==="" ? "" : " ";
+                       nFilter.innerHTML = oSettings.oLanguage.sSearch+sSpace+'<input type="text" />';
+                       
+                       var jqFilter = $("input", nFilter);
+                       jqFilter.val( oSettings.oPreviousSearch.sSearch.replace('"','&quot;') );
+                       jqFilter.bind( 'keyup.DT', function(e) {
+                               /* Update all other filter input elements for the new display */
+                               var n = oSettings.aanFeatures.f;
+                               for ( var i=0, iLen=n.length ; i<iLen ; i++ )
+                               {
+                                       if ( n[i] != this.parentNode )
+                                       {
+                                               $('input', n[i]).val( this.value );
+                                       }
+                               }
+                               
+                               /* Now do the filter */
+                               if ( this.value != oSettings.oPreviousSearch.sSearch )
+                               {
+                                       _fnFilterComplete( oSettings, { 
+                                               "sSearch": this.value, 
+                                               "bRegex":  oSettings.oPreviousSearch.bRegex,
+                                               "bSmart":  oSettings.oPreviousSearch.bSmart 
+                                       } );
+                               }
+                       } );
+                       
+                       jqFilter.bind( 'keypress.DT', function(e) {
+                               /* Prevent default */
+                               if ( e.keyCode == 13 )
+                               {
+                                       return false;
+                               }
+                       } );
+                       
+                       return nFilter;
+               }
+               
+               /*
+                * Function: _fnFilterComplete
+                * Purpose:  Filter the table using both the global filter and column based filtering
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                *           object:oSearch: search information
+                *           int:iForce - optional - force a research of the master array (1) or not (undefined or 0)
+                */
+               function _fnFilterComplete ( oSettings, oInput, iForce )
+               {
+                       /* Filter on everything */
+                       _fnFilter( oSettings, oInput.sSearch, iForce, oInput.bRegex, oInput.bSmart );
+                       
+                       /* Now do the individual column filter */
+                       for ( var i=0 ; i<oSettings.aoPreSearchCols.length ; i++ )
+                       {
+                               _fnFilterColumn( oSettings, oSettings.aoPreSearchCols[i].sSearch, i, 
+                                       oSettings.aoPreSearchCols[i].bRegex, oSettings.aoPreSearchCols[i].bSmart );
+                       }
+                       
+                       /* Custom filtering */
+                       if ( _oExt.afnFiltering.length !== 0 )
+                       {
+                               _fnFilterCustom( oSettings );
+                       }
+                       
+                       /* Tell the draw function we have been filtering */
+                       oSettings.bFiltered = true;
+                       
+                       /* Redraw the table */
+                       oSettings._iDisplayStart = 0;
+                       _fnCalculateEnd( oSettings );
+                       _fnDraw( oSettings );
+                       
+                       /* Rebuild search array 'offline' */
+                       _fnBuildSearchArray( oSettings, 0 );
+               }
+               
+               /*
+                * Function: _fnFilterCustom
+                * Purpose:  Apply custom filtering functions
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnFilterCustom( oSettings )
+               {
+                       var afnFilters = _oExt.afnFiltering;
+                       for ( var i=0, iLen=afnFilters.length ; i<iLen ; i++ )
+                       {
+                               var iCorrector = 0;
+                               for ( var j=0, jLen=oSettings.aiDisplay.length ; j<jLen ; j++ )
+                               {
+                                       var iDisIndex = oSettings.aiDisplay[j-iCorrector];
+                                       
+                                       /* Check if we should use this row based on the filtering function */
+                                       if ( !afnFilters[i]( oSettings, oSettings.aoData[iDisIndex]._aData, iDisIndex ) )
+                                       {
+                                               oSettings.aiDisplay.splice( j-iCorrector, 1 );
+                                               iCorrector++;
+                                       }
+                               }
+                       }
+               }
+               
+               /*
+                * Function: _fnFilterColumn
+                * Purpose:  Filter the table on a per-column basis
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                *           string:sInput - string to filter on
+                *           int:iColumn - column to filter
+                *           bool:bRegex - treat search string as a regular expression or not
+                *           bool:bSmart - use smart filtering or not
+                */
+               function _fnFilterColumn ( oSettings, sInput, iColumn, bRegex, bSmart )
+               {
+                       if ( sInput === "" )
+                       {
+                               return;
+                       }
+                       
+                       var iIndexCorrector = 0;
+                       var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart );
+                       
+                       for ( var i=oSettings.aiDisplay.length-1 ; i>=0 ; i-- )
+                       {
+                               var sData = _fnDataToSearch( oSettings.aoData[ oSettings.aiDisplay[i] ]._aData[iColumn],
+                                       oSettings.aoColumns[iColumn].sType );
+                               if ( ! rpSearch.test( sData ) )
+                               {
+                                       oSettings.aiDisplay.splice( i, 1 );
+                                       iIndexCorrector++;
+                               }
+                       }
+               }
+               
+               /*
+                * Function: _fnFilter
+                * Purpose:  Filter the data table based on user input and draw the table
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                *           string:sInput - string to filter on
+                *           int:iForce - optional - force a research of the master array (1) or not (undefined or 0)
+                *           bool:bRegex - treat as a regular expression or not
+                *           bool:bSmart - perform smart filtering or not
+                */
+               function _fnFilter( oSettings, sInput, iForce, bRegex, bSmart )
+               {
+                       var i;
+                       var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart );
+                       
+                       /* Check if we are forcing or not - optional parameter */
+                       if ( typeof iForce == 'undefined' || iForce === null )
+                       {
+                               iForce = 0;
+                       }
+                       
+                       /* Need to take account of custom filtering functions - always filter */
+                       if ( _oExt.afnFiltering.length !== 0 )
+                       {
+                               iForce = 1;
+                       }
+                       
+                       /*
+                        * If the input is blank - we want the full data set
+                        */
+                       if ( sInput.length <= 0 )
+                       {
+                               oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
+                               oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+                       }
+                       else
+                       {
+                               /*
+                                * We are starting a new search or the new search string is smaller 
+                                * then the old one (i.e. delete). Search from the master array
+                                */
+                               if ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length ||
+                                          oSettings.oPreviousSearch.sSearch.length > sInput.length || iForce == 1 ||
+                                          sInput.indexOf(oSettings.oPreviousSearch.sSearch) !== 0 )
+                               {
+                                       /* Nuke the old display array - we are going to rebuild it */
+                                       oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
+                                       
+                                       /* Force a rebuild of the search array */
+                                       _fnBuildSearchArray( oSettings, 1 );
+                                       
+                                       /* Search through all records to populate the search array
+                                        * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1 
+                                        * mapping
+                                        */
+                                       for ( i=0 ; i<oSettings.aiDisplayMaster.length ; i++ )
+                                       {
+                                               if ( rpSearch.test(oSettings.asDataSearch[i]) )
+                                               {
+                                                       oSettings.aiDisplay.push( oSettings.aiDisplayMaster[i] );
+                                               }
+                                       }
+                         }
+                         else
+                               {
+                               /* Using old search array - refine it - do it this way for speed
+                                * Don't have to search the whole master array again
+                                        */
+                               var iIndexCorrector = 0;
+                               
+                               /* Search the current results */
+                               for ( i=0 ; i<oSettings.asDataSearch.length ; i++ )
+                                       {
+                                       if ( ! rpSearch.test(oSettings.asDataSearch[i]) )
+                                               {
+                                               oSettings.aiDisplay.splice( i-iIndexCorrector, 1 );
+                                               iIndexCorrector++;
+                                       }
+                               }
+                         }
+                       }
+                       oSettings.oPreviousSearch.sSearch = sInput;
+                       oSettings.oPreviousSearch.bRegex = bRegex;
+                       oSettings.oPreviousSearch.bSmart = bSmart;
+               }
+               
+               /*
+                * Function: _fnBuildSearchArray
+                * Purpose:  Create an array which can be quickly search through
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                *           int:iMaster - use the master data array - optional
+                */
+               function _fnBuildSearchArray ( oSettings, iMaster )
+               {
+                       /* Clear out the old data */
+                       oSettings.asDataSearch.splice( 0, oSettings.asDataSearch.length );
+                       
+                       var aArray = (typeof iMaster != 'undefined' && iMaster == 1) ?
+                               oSettings.aiDisplayMaster : oSettings.aiDisplay;
+                       
+                       for ( var i=0, iLen=aArray.length ; i<iLen ; i++ )
+                       {
+                               oSettings.asDataSearch[i] = _fnBuildSearchRow( oSettings, 
+                                       oSettings.aoData[ aArray[i] ]._aData );
+                       }
+               }
+               
+               /*
+                * Function: _fnBuildSearchRow
+                * Purpose:  Create a searchable string from a single data row
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                *           array:aData - aoData[]._aData array to use for the data to search
+                */
+               function _fnBuildSearchRow( oSettings, aData )
+               {
+                       var sSearch = '';
+                       var nTmp = document.createElement('div');
+                       
+                       for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
+                       {
+                               if ( oSettings.aoColumns[j].bSearchable )
+                               {
+                                       var sData = aData[j];
+                                       sSearch += _fnDataToSearch( sData, oSettings.aoColumns[j].sType )+'  ';
+                               }
+                       }
+                       
+                       /* If it looks like there is an HTML entity in the string, attempt to decode it */
+                       if ( sSearch.indexOf('&') !== -1 )
+                       {
+                               nTmp.innerHTML = sSearch;
+                               sSearch = nTmp.textContent ? nTmp.textContent : nTmp.innerText;
+                               
+                               /* IE and Opera appear to put an newline where there is a <br> tag - remove it */
+                               sSearch = sSearch.replace(/\n/g," ").replace(/\r/g,"");
+                       }
+                       
+                       return sSearch;
+               }
+               
+               /*
+                * Function: _fnFilterCreateSearch
+                * Purpose:  Build a regular expression object suitable for searching a table
+                * Returns:  RegExp: - constructed object
+                * Inputs:   string:sSearch - string to search for
+                *           bool:bRegex - treat as a regular expression or not
+                *           bool:bSmart - perform smart filtering or not
+                */
+               function _fnFilterCreateSearch( sSearch, bRegex, bSmart )
+               {
+                       var asSearch, sRegExpString;
+                       
+                       if ( bSmart )
+                       {
+                               /* Generate the regular expression to use. Something along the lines of:
+                                * ^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$
+                                */
+                               asSearch = bRegex ? sSearch.split( ' ' ) : _fnEscapeRegex( sSearch ).split( ' ' );
+                               sRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$';
+                               return new RegExp( sRegExpString, "i" );
+                       }
+                       else
+                       {
+                               sSearch = bRegex ? sSearch : _fnEscapeRegex( sSearch );
+                               return new RegExp( sSearch, "i" );
+                       }
+               }
+               
+               /*
+                * Function: _fnDataToSearch
+                * Purpose:  Convert raw data into something that the user can search on
+                * Returns:  string: - search string
+                * Inputs:   string:sData - data to be modified
+                *           string:sType - data type
+                */
+               function _fnDataToSearch ( sData, sType )
+               {
+                       if ( typeof _oExt.ofnSearch[sType] == "function" )
+                       {
+                               return _oExt.ofnSearch[sType]( sData );
+                       }
+                       else if ( sType == "html" )
+                       {
+                               return sData.replace(/\n/g," ").replace( /<.*?>/g, "" );
+                       }
+                       else if ( typeof sData == "string" )
+                       {
+                               return sData.replace(/\n/g," ");
+                       }
+                       return sData;
+               }
+               
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - Feature: Sorting
+                */
+               
+               /*
+                * Function: _fnSort
+                * Purpose:  Change the order of the table
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                *           bool:bApplyClasses - optional - should we apply classes or not
+                * Notes:    We always sort the master array and then apply a filter again
+                *   if it is needed. This probably isn't optimal - but atm I can't think
+                *   of any other way which is (each has disadvantages). we want to sort aiDisplayMaster - 
+                *   but according to aoData[]._aData
+                */
+               function _fnSort ( oSettings, bApplyClasses )
+               {
+                       var
+                               iDataSort, iDataType,
+                               i, iLen, j, jLen,
+                               aaSort = [],
+                               aiOrig = [],
+                               oSort = _oExt.oSort,
+                               aoData = oSettings.aoData,
+                               aoColumns = oSettings.aoColumns;
+                       
+                       /* No sorting required if server-side or no sorting array */
+                       if ( !oSettings.oFeatures.bServerSide && 
+                               (oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) )
+                       {
+                               if ( oSettings.aaSortingFixed !== null )
+                               {
+                                       aaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting );
+                               }
+                               else
+                               {
+                                       aaSort = oSettings.aaSorting.slice();
+                               }
+                               
+                               /* If there is a sorting data type, and a fuction belonging to it, then we need to
+                                * get the data from the developer's function and apply it for this column
+                                */
+                               for ( i=0 ; i<aaSort.length ; i++ )
+                               {
+                                       var iColumn = aaSort[i][0];
+                                       var iVisColumn = _fnColumnIndexToVisible( oSettings, iColumn );
+                                       var sDataType = oSettings.aoColumns[ iColumn ].sSortDataType;
+                                       if ( typeof _oExt.afnSortData[sDataType] != 'undefined' )
+                                       {
+                                               var aData = _oExt.afnSortData[sDataType]( oSettings, iColumn, iVisColumn );
+                                               for ( j=0, jLen=aoData.length ; j<jLen ; j++ )
+                                               {
+                                                       aoData[j]._aData[iColumn] = aData[j];
+                                               }
+                                       }
+                               }
+                               
+                               /* Create a value - key array of the current row positions such that we can use their
+                                * current position during the sort, if values match, in order to perform stable sorting
+                                */
+                               for ( i=0, iLen=oSettings.aiDisplayMaster.length ; i<iLen ; i++ )
+                               {
+                                       aiOrig[ oSettings.aiDisplayMaster[i] ] = i;
+                               }
+                               
+                               /* Do the sort - here we want multi-column sorting based on a given data source (column)
+                                * and sorting function (from oSort) in a certain direction. It's reasonably complex to
+                                * follow on it's own, but this is what we want (example two column sorting):
+                                *  fnLocalSorting = function(a,b){
+                                *      var iTest;
+                                *      iTest = oSort['string-asc']('data11', 'data12');
+                                *      if (iTest !== 0)
+                                *              return iTest;
+                                *    iTest = oSort['numeric-desc']('data21', 'data22');
+                                *    if (iTest !== 0)
+                                *              return iTest;
+                                *      return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
+                                *  }
+                                * Basically we have a test for each sorting column, if the data in that column is equal,
+                                * test the next column. If all columns match, then we use a numeric sort on the row 
+                                * positions in the original data array to provide a stable sort.
+                                */
+                               var iSortLen = aaSort.length;
+                               oSettings.aiDisplayMaster.sort( function ( a, b ) {
+                                       var iTest;
+                                       for ( i=0 ; i<iSortLen ; i++ )
+                                       {
+                                               iDataSort = aoColumns[ aaSort[i][0] ].iDataSort;
+                                               iDataType = aoColumns[ iDataSort ].sType;
+                                               iTest = oSort[ iDataType+"-"+aaSort[i][1] ](
+                                                       aoData[a]._aData[iDataSort],
+                                                       aoData[b]._aData[iDataSort]
+                                               );
+                                               
+                                               if ( iTest !== 0 )
+                                               {
+                                                       return iTest;
+                                               }
+                                       }
+                                       
+                                       return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
+                               } );
+                       }
+                       
+                       /* Alter the sorting classes to take account of the changes */
+                       if ( typeof bApplyClasses == 'undefined' || bApplyClasses )
+                       {
+                               _fnSortingClasses( oSettings );
+                       }
+                       
+                       /* Tell the draw function that we have sorted the data */
+                       oSettings.bSorted = true;
+                       
+                       /* Copy the master data into the draw array and re-draw */
+                       if ( oSettings.oFeatures.bFilter )
+                       {
+                               /* _fnFilter() will redraw the table for us */
+                               _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
+                       }
+                       else
+                       {
+                               oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+                               oSettings._iDisplayStart = 0; /* reset display back to page 0 */
+                               _fnCalculateEnd( oSettings );
+                               _fnDraw( oSettings );
+                       }
+               }
+               
+               /*
+                * Function: _fnSortAttachListener
+                * Purpose:  Attach a sort handler (click) to a node
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                *           node:nNode - node to attach the handler to
+                *           int:iDataIndex - column sorting index
+                *           function:fnCallback - callback function - optional
+                */
+               function _fnSortAttachListener ( oSettings, nNode, iDataIndex, fnCallback )
+               {
+                       $(nNode).bind( 'click.DT', function (e) {
+                               /* If the column is not sortable - don't to anything */
+                               if ( oSettings.aoColumns[iDataIndex].bSortable === false )
+                               {
+                                       return;
+                               }
+                               
+                               /*
+                                * This is a little bit odd I admit... I declare a temporary function inside the scope of
+                                * _fnDrawHead and the click handler in order that the code presented here can be used 
+                                * twice - once for when bProcessing is enabled, and another time for when it is 
+                                * disabled, as we need to perform slightly different actions.
+                                *   Basically the issue here is that the Javascript engine in modern browsers don't 
+                                * appear to allow the rendering engine to update the display while it is still excuting
+                                * it's thread (well - it does but only after long intervals). This means that the 
+                                * 'processing' display doesn't appear for a table sort. To break the js thread up a bit
+                                * I force an execution break by using setTimeout - but this breaks the expected 
+                                * thread continuation for the end-developer's point of view (their code would execute
+                                * too early), so we on;y do it when we absolutely have to.
+                                */
+                               var fnInnerSorting = function () {
+                                       var iColumn, iNextSort;
+                                       
+                                       /* If the shift key is pressed then we are multipe column sorting */
+                                       if ( e.shiftKey )
+                                       {
+                                               /* Are we already doing some kind of sort on this column? */
+                                               var bFound = false;
+                                               for ( var i=0 ; i<oSettings.aaSorting.length ; i++ )
+                                               {
+                                                       if ( oSettings.aaSorting[i][0] == iDataIndex )
+                                                       {
+                                                               bFound = true;
+                                                               iColumn = oSettings.aaSorting[i][0];
+                                                               iNextSort = oSettings.aaSorting[i][2]+1;
+                                                               
+                                                               if ( typeof oSettings.aoColumns[iColumn].asSorting[iNextSort] == 'undefined' )
+                                                               {
+                                                                       /* Reached the end of the sorting options, remove from multi-col sort */
+                                                                       oSettings.aaSorting.splice( i, 1 );
+                                                               }
+                                                               else
+                                                               {
+                                                                       /* Move onto next sorting direction */
+                                                                       oSettings.aaSorting[i][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
+                                                                       oSettings.aaSorting[i][2] = iNextSort;
+                                                               }
+                                                               break;
+                                                       }
+                                               }
+                                               
+                                               /* No sort yet - add it in */
+                                               if ( bFound === false )
+                                               {
+                                                       oSettings.aaSorting.push( [ iDataIndex, 
+                                                               oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
+                                               }
+                                       }
+                                       else
+                                       {
+                                               /* If no shift key then single column sort */
+                                               if ( oSettings.aaSorting.length == 1 && oSettings.aaSorting[0][0] == iDataIndex )
+                                               {
+                                                       iColumn = oSettings.aaSorting[0][0];
+                                                       iNextSort = oSettings.aaSorting[0][2]+1;
+                                                       if ( typeof oSettings.aoColumns[iColumn].asSorting[iNextSort] == 'undefined' )
+                                                       {
+                                                               iNextSort = 0;
+                                                       }
+                                                       oSettings.aaSorting[0][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
+                                                       oSettings.aaSorting[0][2] = iNextSort;
+                                               }
+                                               else
+                                               {
+                                                       oSettings.aaSorting.splice( 0, oSettings.aaSorting.length );
+                                                       oSettings.aaSorting.push( [ iDataIndex, 
+                                                               oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
+                                               }
+                                       }
+                                       
+                                       /* Run the sort */
+                                       _fnSort( oSettings );
+                               }; /* /fnInnerSorting */
+                               
+                               if ( !oSettings.oFeatures.bProcessing )
+                               {
+                                       fnInnerSorting();
+                               }
+                               else
+                               {
+                                       _fnProcessingDisplay( oSettings, true );
+                                       setTimeout( function() {
+                                               fnInnerSorting();
+                                               if ( !oSettings.oFeatures.bServerSide )
+                                               {
+                                                       _fnProcessingDisplay( oSettings, false );
+                                               }
+                                       }, 0 );
+                               }
+                               
+                               /* Call the user specified callback function - used for async user interaction */
+                               if ( typeof fnCallback == 'function' )
+                               {
+                                       fnCallback( oSettings );
+                               }
+                       } );
+               }
+               
+               /*
+                * Function: _fnSortingClasses
+                * Purpose:  Set the sortting classes on the header
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                * Notes:    It is safe to call this function when bSort and bSortClasses are false
+                */
+               function _fnSortingClasses( oSettings )
+               {
+                       var i, iLen, j, jLen, iFound;
+                       var aaSort, sClass;
+                       var iColumns = oSettings.aoColumns.length;
+                       var oClasses = oSettings.oClasses;
+                       
+                       for ( i=0 ; i<iColumns ; i++ )
+                       {
+                               if ( oSettings.aoColumns[i].bSortable )
+                               {
+                                       $(oSettings.aoColumns[i].nTh).removeClass( oClasses.sSortAsc +" "+ oClasses.sSortDesc +
+                                               " "+ oSettings.aoColumns[i].sSortingClass );
+                               }
+                       }
+                       
+                       if ( oSettings.aaSortingFixed !== null )
+                       {
+                               aaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting );
+                       }
+                       else
+                       {
+                               aaSort = oSettings.aaSorting.slice();
+                       }
+                       
+                       /* Apply the required classes to the header */
+                       for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+                       {
+                               if ( oSettings.aoColumns[i].bSortable )
+                               {
+                                       sClass = oSettings.aoColumns[i].sSortingClass;
+                                       iFound = -1;
+                                       for ( j=0 ; j<aaSort.length ; j++ )
+                                       {
+                                               if ( aaSort[j][0] == i )
+                                               {
+                                                       sClass = ( aaSort[j][1] == "asc" ) ?
+                                                               oClasses.sSortAsc : oClasses.sSortDesc;
+                                                       iFound = j;
+                                                       break;
+                                               }
+                                       }
+                                       $(oSettings.aoColumns[i].nTh).addClass( sClass );
+                                       
+                                       if ( oSettings.bJUI )
+                                       {
+                                               /* jQuery UI uses extra markup */
+                                               var jqSpan = $("span", oSettings.aoColumns[i].nTh);
+                                               jqSpan.removeClass(oClasses.sSortJUIAsc +" "+ oClasses.sSortJUIDesc +" "+ 
+                                                       oClasses.sSortJUI +" "+ oClasses.sSortJUIAscAllowed +" "+ oClasses.sSortJUIDescAllowed );
+                                               
+                                               var sSpanClass;
+                                               if ( iFound == -1 )
+                                               {
+                                                       sSpanClass = oSettings.aoColumns[i].sSortingClassJUI;
+                                               }
+                                               else if ( aaSort[iFound][1] == "asc" )
+                                               {
+                                                       sSpanClass = oClasses.sSortJUIAsc;
+                                               }
+                                               else
+                                               {
+                                                       sSpanClass = oClasses.sSortJUIDesc;
+                                               }
+                                               
+                                               jqSpan.addClass( sSpanClass );
+                                       }
+                               }
+                               else
+                               {
+                                       /* No sorting on this column, so add the base class. This will have been assigned by
+                                        * _fnAddColumn
+                                        */
+                                       $(oSettings.aoColumns[i].nTh).addClass( oSettings.aoColumns[i].sSortingClass );
+                               }
+                       }
+                       
+                       /* 
+                        * Apply the required classes to the table body
+                        * Note that this is given as a feature switch since it can significantly slow down a sort
+                        * on large data sets (adding and removing of classes is always slow at the best of times..)
+                        * Further to this, note that this code is admitadly fairly ugly. It could be made a lot 
+                        * simpiler using jQuery selectors and add/removeClass, but that is significantly slower
+                        * (on the order of 5 times slower) - hence the direct DOM manipulation here.
+                        */
+                       sClass = oClasses.sSortColumn;
+                       
+                       if ( oSettings.oFeatures.bSort && oSettings.oFeatures.bSortClasses )
+                       {
+                               var nTds = _fnGetTdNodes( oSettings );
+                               
+                               /* Remove the old classes */
+                               if ( nTds.length >= iColumns )
+                               {
+                                       for ( i=0 ; i<iColumns ; i++ )
+                                       {
+                                               if ( nTds[i].className.indexOf(sClass+"1") != -1 )
+                                               {
+                                                       for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
+                                                       {
+                                                               nTds[(iColumns*j)+i].className = 
+                                                                       $.trim( nTds[(iColumns*j)+i].className.replace( sClass+"1", "" ) );
+                                                       }
+                                               }
+                                               else if ( nTds[i].className.indexOf(sClass+"2") != -1 )
+                                               {
+                                                       for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
+                                                       {
+                                                               nTds[(iColumns*j)+i].className = 
+                                                                       $.trim( nTds[(iColumns*j)+i].className.replace( sClass+"2", "" ) );
+                                                       }
+                                               }
+                                               else if ( nTds[i].className.indexOf(sClass+"3") != -1 )
+                                               {
+                                                       for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
+                                                       {
+                                                               nTds[(iColumns*j)+i].className = 
+                                                                       $.trim( nTds[(iColumns*j)+i].className.replace( " "+sClass+"3", "" ) );
+                                                       }
+                                               }
+                                       }
+                               }
+                               
+                               /* Add the new classes to the table */
+                               var iClass = 1, iTargetCol;
+                               for ( i=0 ; i<aaSort.length ; i++ )
+                               {
+                                       iTargetCol = parseInt( aaSort[i][0], 10 );
+                                       for ( j=0, jLen=(nTds.length/iColumns) ; j<jLen ; j++ )
+                                       {
+                                               nTds[(iColumns*j)+iTargetCol].className += " "+sClass+iClass;
+                                       }
+                                       
+                                       if ( iClass < 3 )
+                                       {
+                                               iClass++;
+                                       }
+                               }
+                       }
+               }
+               
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - Feature: Pagination. Note that most of the paging logic is done in 
+                * _oExt.oPagination
+                */
+               
+               /*
+                * Function: _fnFeatureHtmlPaginate
+                * Purpose:  Generate the node required for default pagination
+                * Returns:  node
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnFeatureHtmlPaginate ( oSettings )
+               {
+                       if ( oSettings.oScroll.bInfinite )
+                       {
+                               return null;
+                       }
+                       
+                       var nPaginate = document.createElement( 'div' );
+                       nPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType;
+                       
+                       _oExt.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, nPaginate, 
+                               function( oSettings ) {
+                                       _fnCalculateEnd( oSettings );
+                                       _fnDraw( oSettings );
+                               }
+                       );
+                       
+                       /* Add a draw callback for the pagination on first instance, to update the paging display */
+                       if ( typeof oSettings.aanFeatures.p == "undefined" )
+                       {
+                               oSettings.aoDrawCallback.push( {
+                                       "fn": function( oSettings ) {
+                                               _oExt.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) {
+                                                       _fnCalculateEnd( oSettings );
+                                                       _fnDraw( oSettings );
+                                               } );
+                                       },
+                                       "sName": "pagination"
+                               } );
+                       }
+                       return nPaginate;
+               }
+               
+               /*
+                * Function: _fnPageChange
+                * Purpose:  Alter the display settings to change the page
+                * Returns:  bool:true - page has changed, false - no change (no effect) eg 'first' on page 1
+                * Inputs:   object:oSettings - dataTables settings object
+                *           string:sAction - paging action to take: "first", "previous", "next" or "last"
+                */
+               function _fnPageChange ( oSettings, sAction )
+               {
+                       var iOldStart = oSettings._iDisplayStart;
+                       
+                       if ( sAction == "first" )
+                       {
+                               oSettings._iDisplayStart = 0;
+                       }
+                       else if ( sAction == "previous" )
+                       {
+                               oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ?
+                                       oSettings._iDisplayStart - oSettings._iDisplayLength :
+                                       0;
+                               
+                               /* Correct for underrun */
+                               if ( oSettings._iDisplayStart < 0 )
+                               {
+                                 oSettings._iDisplayStart = 0;
+                               }
+                       }
+                       else if ( sAction == "next" )
+                       {
+                               if ( oSettings._iDisplayLength >= 0 )
+                               {
+                                       /* Make sure we are not over running the display array */
+                                       if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() )
+                                       {
+                                               oSettings._iDisplayStart += oSettings._iDisplayLength;
+                                       }
+                               }
+                               else
+                               {
+                                       oSettings._iDisplayStart = 0;
+                               }
+                       }
+                       else if ( sAction == "last" )
+                       {
+                               if ( oSettings._iDisplayLength >= 0 )
+                               {
+                                       var iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1;
+                                       oSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength;
+                               }
+                               else
+                               {
+                                       oSettings._iDisplayStart = 0;
+                               }
+                       }
+                       else
+                       {
+                               _fnLog( oSettings, 0, "Unknown paging action: "+sAction );
+                       }
+                       
+                       return iOldStart != oSettings._iDisplayStart;
+               }
+               
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - Feature: HTML info
+                */
+               
+               /*
+                * Function: _fnFeatureHtmlInfo
+                * Purpose:  Generate the node required for the info display
+                * Returns:  node
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnFeatureHtmlInfo ( oSettings )
+               {
+                       var nInfo = document.createElement( 'div' );
+                       nInfo.className = oSettings.oClasses.sInfo;
+                       
+                       /* Actions that are to be taken once only for this feature */
+                       if ( typeof oSettings.aanFeatures.i == "undefined" )
+                       {
+                               /* Add draw callback */
+                               oSettings.aoDrawCallback.push( {
+                                       "fn": _fnUpdateInfo,
+                                       "sName": "information"
+                               } );
+                               
+                               /* Add id */
+                               if ( oSettings.sTableId !== '' )
+                               {
+                                       nInfo.setAttribute( 'id', oSettings.sTableId+'_info' );
+                               }
+                       }
+                       
+                       return nInfo;
+               }
+               
+               /*
+                * Function: _fnUpdateInfo
+                * Purpose:  Update the information elements in the display
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnUpdateInfo ( oSettings )
+               {
+                       /* Show information about the table */
+                       if ( !oSettings.oFeatures.bInfo || oSettings.aanFeatures.i.length === 0 )
+                       {
+                               return;
+                       }
+                       
+                       var
+                               iStart = oSettings._iDisplayStart+1, iEnd = oSettings.fnDisplayEnd(),
+                               iMax = oSettings.fnRecordsTotal(), iTotal = oSettings.fnRecordsDisplay(),
+                               sStart = oSettings.fnFormatNumber( iStart ), sEnd = oSettings.fnFormatNumber( iEnd ),
+                               sMax = oSettings.fnFormatNumber( iMax ), sTotal = oSettings.fnFormatNumber( iTotal ),
+                               sOut;
+                       
+                       /* When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
+                        * internally
+                        */
+                       if ( oSettings.oScroll.bInfinite )
+                       {
+                               sStart = oSettings.fnFormatNumber( 1 );
+                       }
+                       
+                       if ( oSettings.fnRecordsDisplay() === 0 && 
+                                  oSettings.fnRecordsDisplay() == oSettings.fnRecordsTotal() )
+                       {
+                               /* Empty record set */
+                               sOut = oSettings.oLanguage.sInfoEmpty+ oSettings.oLanguage.sInfoPostFix;
+                       }
+                       else if ( oSettings.fnRecordsDisplay() === 0 )
+                       {
+                               /* Rmpty record set after filtering */
+                               sOut = oSettings.oLanguage.sInfoEmpty +' '+ 
+                                       oSettings.oLanguage.sInfoFiltered.replace('_MAX_', sMax)+
+                                               oSettings.oLanguage.sInfoPostFix;
+                       }
+                       else if ( oSettings.fnRecordsDisplay() == oSettings.fnRecordsTotal() )
+                       {
+                               /* Normal record set */
+                               sOut = oSettings.oLanguage.sInfo.
+                                               replace('_START_', sStart).
+                                               replace('_END_',   sEnd).
+                                               replace('_TOTAL_', sTotal)+ 
+                                       oSettings.oLanguage.sInfoPostFix;
+                       }
+                       else
+                       {
+                               /* Record set after filtering */
+                               sOut = oSettings.oLanguage.sInfo.
+                                               replace('_START_', sStart).
+                                               replace('_END_',   sEnd).
+                                               replace('_TOTAL_', sTotal) +' '+ 
+                                       oSettings.oLanguage.sInfoFiltered.replace('_MAX_', 
+                                               oSettings.fnFormatNumber(oSettings.fnRecordsTotal()))+ 
+                                       oSettings.oLanguage.sInfoPostFix;
+                       }
+                       
+                       if ( oSettings.oLanguage.fnInfoCallback !== null )
+                       {
+                               sOut = oSettings.oLanguage.fnInfoCallback( oSettings, iStart, iEnd, iMax, iTotal, sOut );
+                       }
+                       
+                       var n = oSettings.aanFeatures.i;
+                       for ( var i=0, iLen=n.length ; i<iLen ; i++ )
+                       {
+                               $(n[i]).html( sOut );
+                       }
+               }
+               
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - Feature: Length change
+                */
+               
+               /*
+                * Function: _fnFeatureHtmlLength
+                * Purpose:  Generate the node required for user display length changing
+                * Returns:  node
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnFeatureHtmlLength ( oSettings )
+               {
+                       if ( oSettings.oScroll.bInfinite )
+                       {
+                               return null;
+                       }
+                       
+                       /* This can be overruled by not using the _MENU_ var/macro in the language variable */
+                       var sName = (oSettings.sTableId === "") ? "" : 'name="'+oSettings.sTableId+'_length"';
+                       var sStdMenu = '<select size="1" '+sName+'>';
+                       var i, iLen;
+                       
+                       if ( oSettings.aLengthMenu.length == 2 && typeof oSettings.aLengthMenu[0] == 'object' && 
+                                       typeof oSettings.aLengthMenu[1] == 'object' )
+                       {
+                               for ( i=0, iLen=oSettings.aLengthMenu[0].length ; i<iLen ; i++ )
+                               {
+                                       sStdMenu += '<option value="'+oSettings.aLengthMenu[0][i]+'">'+
+                                               oSettings.aLengthMenu[1][i]+'</option>';
+                               }
+                       }
+                       else
+                       {
+                               for ( i=0, iLen=oSettings.aLengthMenu.length ; i<iLen ; i++ )
+                               {
+                                       sStdMenu += '<option value="'+oSettings.aLengthMenu[i]+'">'+
+                                               oSettings.aLengthMenu[i]+'</option>';
+                               }
+                       }
+                       sStdMenu += '</select>';
+                       
+                       var nLength = document.createElement( 'div' );
+                       if ( oSettings.sTableId !== '' && typeof oSettings.aanFeatures.l == "undefined" )
+                       {
+                               nLength.setAttribute( 'id', oSettings.sTableId+'_length' );
+                       }
+                       nLength.className = oSettings.oClasses.sLength;
+                       nLength.innerHTML = oSettings.oLanguage.sLengthMenu.replace( '_MENU_', sStdMenu );
+                       
+                       /*
+                        * Set the length to the current display length - thanks to Andrea Pavlovic for this fix,
+                        * and Stefan Skopnik for fixing the fix!
+                        */
+                       $('select option[value="'+oSettings._iDisplayLength+'"]',nLength).attr("selected",true);
+                       
+                       $('select', nLength).bind( 'change.DT', function(e) {
+                               var iVal = $(this).val();
+                               
+                               /* Update all other length options for the new display */
+                               var n = oSettings.aanFeatures.l;
+                               for ( i=0, iLen=n.length ; i<iLen ; i++ )
+                               {
+                                       if ( n[i] != this.parentNode )
+                                       {
+                                               $('select', n[i]).val( iVal );
+                                       }
+                               }
+                               
+                               /* Redraw the table */
+                               oSettings._iDisplayLength = parseInt(iVal, 10);
+                               _fnCalculateEnd( oSettings );
+                               
+                               /* If we have space to show extra rows (backing up from the end point - then do so */
+                               if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() )
+                               {
+                                       oSettings._iDisplayStart = oSettings.fnDisplayEnd() - oSettings._iDisplayLength;
+                                       if ( oSettings._iDisplayStart < 0 )
+                                       {
+                                               oSettings._iDisplayStart = 0;
+                                       }
+                               }
+                               
+                               if ( oSettings._iDisplayLength == -1 )
+                               {
+                                       oSettings._iDisplayStart = 0;
+                               }
+                               
+                               _fnDraw( oSettings );
+                       } );
+                       
+                       return nLength;
+               }
+               
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - Feature: Processing incidator
+                */
+               
+               /*
+                * Function: _fnFeatureHtmlProcessing
+                * Purpose:  Generate the node required for the processing node
+                * Returns:  node
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnFeatureHtmlProcessing ( oSettings )
+               {
+                       var nProcessing = document.createElement( 'div' );
+                       
+                       if ( oSettings.sTableId !== '' && typeof oSettings.aanFeatures.r == "undefined" )
+                       {
+                               nProcessing.setAttribute( 'id', oSettings.sTableId+'_processing' );
+                       }
+                       nProcessing.innerHTML = oSettings.oLanguage.sProcessing;
+                       nProcessing.className = oSettings.oClasses.sProcessing;
+                       oSettings.nTable.parentNode.insertBefore( nProcessing, oSettings.nTable );
+                       
+                       return nProcessing;
+               }
+               
+               /*
+                * Function: _fnProcessingDisplay
+                * Purpose:  Display or hide the processing indicator
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                *           bool:
+                *   true - show the processing indicator
+                *   false - don't show
+                */
+               function _fnProcessingDisplay ( oSettings, bShow )
+               {
+                       if ( oSettings.oFeatures.bProcessing )
+                       {
+                               var an = oSettings.aanFeatures.r;
+                               for ( var i=0, iLen=an.length ; i<iLen ; i++ )
+                               {
+                                       an[i].style.visibility = bShow ? "visible" : "hidden";
+                               }
+                       }
+               }
+               
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - Support functions
+                */
+               
+               /*
+                * Function: _fnVisibleToColumnIndex
+                * Purpose:  Covert the index of a visible column to the index in the data array (take account
+                *   of hidden columns)
+                * Returns:  int:i - the data index
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnVisibleToColumnIndex( oSettings, iMatch )
+               {
+                       var iColumn = -1;
+                       
+                       for ( var i=0 ; i<oSettings.aoColumns.length ; i++ )
+                       {
+                               if ( oSettings.aoColumns[i].bVisible === true )
+                               {
+                                       iColumn++;
+                               }
+                               
+                               if ( iColumn == iMatch )
+                               {
+                                       return i;
+                               }
+                       }
+                       
+                       return null;
+               }
+               
+               /*
+                * Function: _fnColumnIndexToVisible
+                * Purpose:  Covert the index of an index in the data array and convert it to the visible
+                *   column index (take account of hidden columns)
+                * Returns:  int:i - the data index
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnColumnIndexToVisible( oSettings, iMatch )
+               {
+                       var iVisible = -1;
+                       for ( var i=0 ; i<oSettings.aoColumns.length ; i++ )
+                       {
+                               if ( oSettings.aoColumns[i].bVisible === true )
+                               {
+                                       iVisible++;
+                               }
+                               
+                               if ( i == iMatch )
+                               {
+                                       return oSettings.aoColumns[i].bVisible === true ? iVisible : null;
+                               }
+                       }
+                       
+                       return null;
+               }
+               
+               
+               /*
+                * Function: _fnNodeToDataIndex
+                * Purpose:  Take a TR element and convert it to an index in aoData
+                * Returns:  int:i - index if found, null if not
+                * Inputs:   object:s - dataTables settings object
+                *           node:n - the TR element to find
+                */
+               function _fnNodeToDataIndex( s, n )
+               {
+                       var i, iLen;
+                       
+                       /* Optimisation - see if the nodes which are currently visible match, since that is
+                        * the most likely node to be asked for (a selector or event for example)
+                        */
+                       for ( i=s._iDisplayStart, iLen=s._iDisplayEnd ; i<iLen ; i++ )
+                       {
+                               if ( s.aoData[ s.aiDisplay[i] ].nTr == n )
+                               {
+                                       return s.aiDisplay[i];
+                               }
+                       }
+                       
+                       /* Otherwise we are in for a slog through the whole data cache */
+                       for ( i=0, iLen=s.aoData.length ; i<iLen ; i++ )
+                       {
+                               if ( s.aoData[i].nTr == n )
+                               {
+                                       return i;
+                               }
+                       }
+                       return null;
+               }
+               
+               /*
+                * Function: _fnVisbleColumns
+                * Purpose:  Get the number of visible columns
+                * Returns:  int:i - the number of visible columns
+                * Inputs:   object:oS - dataTables settings object
+                */
+               function _fnVisbleColumns( oS )
+               {
+                       var iVis = 0;
+                       for ( var i=0 ; i<oS.aoColumns.length ; i++ )
+                       {
+                               if ( oS.aoColumns[i].bVisible === true )
+                               {
+                                       iVis++;
+                               }
+                       }
+                       return iVis;
+               }
+               
+               /*
+                * Function: _fnCalculateEnd
+                * Purpose:  Rcalculate the end point based on the start point
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnCalculateEnd( oSettings )
+               {
+                       if ( oSettings.oFeatures.bPaginate === false )
+                       {
+                               oSettings._iDisplayEnd = oSettings.aiDisplay.length;
+                       }
+                       else
+                       {
+                               /* Set the end point of the display - based on how many elements there are
+                                * still to display
+                                */
+                               if ( oSettings._iDisplayStart + oSettings._iDisplayLength > oSettings.aiDisplay.length ||
+                                          oSettings._iDisplayLength == -1 )
+                               {
+                                       oSettings._iDisplayEnd = oSettings.aiDisplay.length;
+                               }
+                               else
+                               {
+                                       oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength;
+                               }
+                       }
+               }
+               
+               /*
+                * Function: _fnConvertToWidth
+                * Purpose:  Convert a CSS unit width to pixels (e.g. 2em)
+                * Returns:  int:iWidth - width in pixels
+                * Inputs:   string:sWidth - width to be converted
+                *           node:nParent - parent to get the with for (required for
+                *             relative widths) - optional
+                */
+               function _fnConvertToWidth ( sWidth, nParent )
+               {
+                       if ( !sWidth || sWidth === null || sWidth === '' )
+                       {
+                               return 0;
+                       }
+                       
+                       if ( typeof nParent == "undefined" )
+                       {
+                               nParent = document.getElementsByTagName('body')[0];
+                       }
+                       
+                       var iWidth;
+                       var nTmp = document.createElement( "div" );
+                       nTmp.style.width = sWidth;
+                       
+                       nParent.appendChild( nTmp );
+                       iWidth = nTmp.offsetWidth;
+                       nParent.removeChild( nTmp );
+                       
+                       return ( iWidth );
+               }
+               
+               /*
+                * Function: _fnCalculateColumnWidths
+                * Purpose:  Calculate the width of columns for the table
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnCalculateColumnWidths ( oSettings )
+               {
+                       var iTableWidth = oSettings.nTable.offsetWidth;
+                       var iUserInputs = 0;
+                       var iTmpWidth;
+                       var iVisibleColumns = 0;
+                       var iColums = oSettings.aoColumns.length;
+                       var i;
+                       var oHeaders = $('th', oSettings.nTHead);
+                       
+                       /* Convert any user input sizes into pixel sizes */
+                       for ( i=0 ; i<iColums ; i++ )
+                       {
+                               if ( oSettings.aoColumns[i].bVisible )
+                               {
+                                       iVisibleColumns++;
+                                       
+                                       if ( oSettings.aoColumns[i].sWidth !== null )
+                                       {
+                                               iTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig, 
+                                                       oSettings.nTable.parentNode );
+                                               if ( iTmpWidth !== null )
+                                               {
+                                                       oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
+                                               }
+                                                       
+                                               iUserInputs++;
+                                       }
+                               }
+                       }
+                       
+                       /* If the number of columns in the DOM equals the number that we have to process in 
+                        * DataTables, then we can use the offsets that are created by the web-browser. No custom 
+                        * sizes can be set in order for this to happen, nor scrolling used
+                        */
+                       if ( iColums == oHeaders.length && iUserInputs === 0 && iVisibleColumns == iColums &&
+                               oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
+                       {
+                               for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+                               {
+                                       iTmpWidth = $(oHeaders[i]).width();
+                                       if ( iTmpWidth !== null )
+                                       {
+                                               oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               /* Otherwise we are going to have to do some calculations to get the width of each column.
+                                * Construct a 1 row table with the widest node in the data, and any user defined widths,
+                                * then insert it into the DOM and allow the browser to do all the hard work of
+                                * calculating table widths.
+                                */
+                               var
+                                       nCalcTmp = oSettings.nTable.cloneNode( false ),
+                                       nBody = document.createElement( 'tbody' ),
+                                       nTr = document.createElement( 'tr' ),
+                                       nDivSizing;
+                               
+                               nCalcTmp.removeAttribute( "id" );
+                               nCalcTmp.appendChild( oSettings.nTHead.cloneNode(true) );
+                               if ( oSettings.nTFoot !== null )
+                               {
+                                       nCalcTmp.appendChild( oSettings.nTFoot.cloneNode(true) );
+                                       _fnApplyToChildren( function(n) {
+                                               n.style.width = "";
+                                       }, nCalcTmp.getElementsByTagName('tr') );
+                               }
+                               
+                               nCalcTmp.appendChild( nBody );
+                               nBody.appendChild( nTr );
+                               
+                               /* Remove any sizing that was previously applied by the styles */
+                               var jqColSizing = $('thead th', nCalcTmp);
+                               if ( jqColSizing.length === 0 )
+                               {
+                                       jqColSizing = $('tbody tr:eq(0)>td', nCalcTmp);
+                               }
+                               jqColSizing.each( function (i) {
+                                       this.style.width = "";
+                                       
+                                       var iIndex = _fnVisibleToColumnIndex( oSettings, i );
+                                       if ( iIndex !== null && oSettings.aoColumns[iIndex].sWidthOrig !== "" )
+                                       {
+                                               this.style.width = oSettings.aoColumns[iIndex].sWidthOrig;
+                                       }
+                               } );
+                               
+                               /* Find the biggest td for each column and put it into the table */
+                               for ( i=0 ; i<iColums ; i++ )
+                               {
+                                       if ( oSettings.aoColumns[i].bVisible )
+                                       {
+                                               var nTd = _fnGetWidestNode( oSettings, i );
+                                               if ( nTd !== null )
+                                               {
+                                                       nTd = nTd.cloneNode(true);
+                                                       nTr.appendChild( nTd );
+                                               }
+                                       }
+                               }
+                               
+                               /* Build the table and 'display' it */
+                               var nWrapper = oSettings.nTable.parentNode;
+                               nWrapper.appendChild( nCalcTmp );
+                               
+                               /* When scrolling (X or Y) we want to set the width of the table as appropriate. However,
+                                * when not scrolling leave the table width as it is. This results in slightly different,
+                                * but I think correct behaviour
+                                */
+                               if ( oSettings.oScroll.sX !== "" && oSettings.oScroll.sXInner !== "" )
+                               {
+                                       nCalcTmp.style.width = _fnStringToCss(oSettings.oScroll.sXInner);
+                               }
+                               else if ( oSettings.oScroll.sX !== "" )
+                               {
+                                       nCalcTmp.style.width = "";
+                                       if ( $(nCalcTmp).width() < nWrapper.offsetWidth )
+                                       {
+                                               nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
+                                       }
+                               }
+                               else if ( oSettings.oScroll.sY !== "" )
+                               {
+                                       nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
+                               }
+                               nCalcTmp.style.visibility = "hidden";
+                               
+                               /* Scrolling considerations */
+                               _fnScrollingWidthAdjust( oSettings, nCalcTmp );
+                               
+                               /* Read the width's calculated by the browser and store them for use by the caller. We
+                                * first of all try to use the elements in the body, but it is possible that there are
+                                * no elements there, under which circumstances we use the header elements
+                                */
+                               var oNodes = $("tbody tr:eq(0)>td", nCalcTmp);
+                               if ( oNodes.length === 0 )
+                               {
+                                       oNodes = $("thead tr:eq(0)>th", nCalcTmp);
+                               }
+                               
+                               var iIndex, iCorrector = 0, iWidth;
+                               for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+                               {
+                                       if ( oSettings.aoColumns[i].bVisible )
+                                       {
+                                               iWidth = $(oNodes[iCorrector]).outerWidth();
+                                               if ( iWidth !== null && iWidth > 0 )
+                                               {
+                                                       oSettings.aoColumns[i].sWidth = _fnStringToCss( iWidth );
+                                               }
+                                               iCorrector++;
+                                       }
+                               }
+                               
+                               oSettings.nTable.style.width = _fnStringToCss( $(nCalcTmp).outerWidth() );
+                               nCalcTmp.parentNode.removeChild( nCalcTmp );
+                       }
+               }
+               
+               /*
+                * Function: _fnScrollingWidthAdjust
+                * Purpose:  Adjust a table's width to take account of scrolling
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                *           node:n - table node
+                */
+               function _fnScrollingWidthAdjust ( oSettings, n )
+               {
+                       if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY !== "" )
+                       {
+                               /* When y-scrolling only, we want to remove the width of the scroll bar so the table
+                                * + scroll bar will fit into the area avaialble.
+                                */
+                               var iOrigWidth = $(n).width();
+                               n.style.width = _fnStringToCss( $(n).outerWidth()-oSettings.oScroll.iBarWidth );
+                       }
+                       else if ( oSettings.oScroll.sX !== "" )
+                       {
+                               /* When x-scrolling both ways, fix the table at it's current size, without adjusting */
+                               n.style.width = _fnStringToCss( $(n).outerWidth() );
+                       }
+               }
+               
+               /*
+                * Function: _fnGetWidestNode
+                * Purpose:  Get the widest node
+                * Returns:  string: - max strlens for each column
+                * Inputs:   object:oSettings - dataTables settings object
+                *           int:iCol - column of interest
+                *           boolean:bFast - Should we use fast (but non-accurate) calculation - optional,
+                *             default true
+                * Notes:    This operation is _expensive_ (!!!). It requires a lot of DOM interaction, but
+                *   this is the only way to reliably get the widest string. For example 'mmm' would be wider
+                *   than 'iiii' so we can't just ocunt characters. If this can be optimised it would be good
+                *   to do so!
+                */
+               function _fnGetWidestNode( oSettings, iCol, bFast )
+               {
+                       /* Use fast not non-accurate calculate based on the strlen */
+                       if ( typeof bFast == 'undefined' || bFast )
+                       {
+                               var iMaxLen = _fnGetMaxLenString( oSettings, iCol );
+                               var iFastVis = _fnColumnIndexToVisible( oSettings, iCol);
+                               if ( iMaxLen < 0 )
+                               {
+                                       return null;
+                               }
+                               return oSettings.aoData[iMaxLen].nTr.getElementsByTagName('td')[iFastVis];
+                       }
+                       
+                       /* Use the slow approach, but get high quality answers - note that this code is not actually
+                        * used by DataTables by default. If you want to use it you can alter the call to 
+                        * _fnGetWidestNode to pass 'false' as the third argument
+                        */
+                       var
+                               iMax = -1, i, iLen,
+                               iMaxIndex = -1,
+                               n = document.createElement('div');
+                       
+                       n.style.visibility = "hidden";
+                       n.style.position = "absolute";
+                       document.body.appendChild( n );
+                       
+                       for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
+                       {
+                               n.innerHTML = oSettings.aoData[i]._aData[iCol];
+                               if ( n.offsetWidth > iMax )
+                               {
+                                       iMax = n.offsetWidth;
+                                       iMaxIndex = i;
+                               }
+                       }
+                       document.body.removeChild( n );
+                       
+                       if ( iMaxIndex >= 0 )
+                       {
+                               var iVis = _fnColumnIndexToVisible( oSettings, iCol);
+                               var nRet = oSettings.aoData[iMaxIndex].nTr.getElementsByTagName('td')[iVis];
+                               if ( nRet )
+                               {
+                                       return nRet;
+                               }
+                       }
+                       return null;
+               }
+               
+               /*
+                * Function: _fnGetMaxLenString
+                * Purpose:  Get the maximum strlen for each data column
+                * Returns:  string: - max strlens for each column
+                * Inputs:   object:oSettings - dataTables settings object
+                *           int:iCol - column of interest
+                */
+               function _fnGetMaxLenString( oSettings, iCol )
+               {
+                       var iMax = -1;
+                       var iMaxIndex = -1;
+                       
+                       for ( var i=0 ; i<oSettings.aoData.length ; i++ )
+                       {
+                               var s = oSettings.aoData[i]._aData[iCol];
+                               if ( s.length > iMax )
+                               {
+                                       iMax = s.length;
+                                       iMaxIndex = i;
+                               }
+                       }
+                       
+                       return iMaxIndex;
+               }
+               
+               /*
+                * Function: _fnStringToCss
+                * Purpose:  Append a CSS unit (only if required) to a string
+                * Returns:  0 if match, 1 if length is different, 2 if no match
+                * Inputs:   array:aArray1 - first array
+                *           array:aArray2 - second array
+                */
+               function _fnStringToCss( s )
+               {
+                       if ( s === null )
+                       {
+                               return "0px";
+                       }
+                       
+                       if ( typeof s == 'number' )
+                       {
+                               if ( s < 0 )
+                               {
+                                       return "0px";
+                               }
+                               return s+"px";
+                       }
+                       
+                       /* Check if the last character is not 0-9 */
+                       var c = s.charCodeAt( s.length-1 );
+                       if (c < 0x30 || c > 0x39)
+                       {
+                               return s;
+                       }
+                       return s+"px";
+               }
+               
+               /*
+                * Function: _fnArrayCmp
+                * Purpose:  Compare two arrays
+                * Returns:  0 if match, 1 if length is different, 2 if no match
+                * Inputs:   array:aArray1 - first array
+                *           array:aArray2 - second array
+                */
+               function _fnArrayCmp( aArray1, aArray2 )
+               {
+                       if ( aArray1.length != aArray2.length )
+                       {
+                               return 1;
+                       }
+                       
+                       for ( var i=0 ; i<aArray1.length ; i++ )
+                       {
+                               if ( aArray1[i] != aArray2[i] )
+                               {
+                                       return 2;
+                               }
+                       }
+                       
+                       return 0;
+               }
+               
+               /*
+                * Function: _fnDetectType
+                * Purpose:  Get the sort type based on an input string
+                * Returns:  string: - type (defaults to 'string' if no type can be detected)
+                * Inputs:   string:sData - data we wish to know the type of
+                * Notes:    This function makes use of the DataTables plugin objct _oExt 
+                *   (.aTypes) such that new types can easily be added.
+                */
+               function _fnDetectType( sData )
+               {
+                       var aTypes = _oExt.aTypes;
+                       var iLen = aTypes.length;
+                       
+                       for ( var i=0 ; i<iLen ; i++ )
+                       {
+                               var sType = aTypes[i]( sData );
+                               if ( sType !== null )
+                               {
+                                       return sType;
+                               }
+                       }
+                       
+                       return 'string';
+               }
+               
+               /*
+                * Function: _fnSettingsFromNode
+                * Purpose:  Return the settings object for a particular table
+                * Returns:  object: Settings object - or null if not found
+                * Inputs:   node:nTable - table we are using as a dataTable
+                */
+               function _fnSettingsFromNode ( nTable )
+               {
+                       for ( var i=0 ; i<_aoSettings.length ; i++ )
+                       {
+                               if ( _aoSettings[i].nTable == nTable )
+                               {
+                                       return _aoSettings[i];
+                               }
+                       }
+                       
+                       return null;
+               }
+               
+               /*
+                * Function: _fnGetDataMaster
+                * Purpose:  Return an array with the full table data
+                * Returns:  array array:aData - Master data array
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnGetDataMaster ( oSettings )
+               {
+                       var aData = [];
+                       var iLen = oSettings.aoData.length;
+                       for ( var i=0 ; i<iLen; i++ )
+                       {
+                               aData.push( oSettings.aoData[i]._aData );
+                       }
+                       return aData;
+               }
+               
+               /*
+                * Function: _fnGetTrNodes
+                * Purpose:  Return an array with the TR nodes for the table
+                * Returns:  array: - TR array
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnGetTrNodes ( oSettings )
+               {
+                       var aNodes = [];
+                       var iLen = oSettings.aoData.length;
+                       for ( var i=0 ; i<iLen ; i++ )
+                       {
+                               aNodes.push( oSettings.aoData[i].nTr );
+                       }
+                       return aNodes;
+               }
+               
+               /*
+                * Function: _fnGetTdNodes
+                * Purpose:  Return an array with the TD nodes for the table
+                * Returns:  array: - TD array
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnGetTdNodes ( oSettings )
+               {
+                       var nTrs = _fnGetTrNodes( oSettings );
+                       var nTds = [], nTd;
+                       var anReturn = [];
+                       var iCorrector;
+                       var iRow, iRows, iColumn, iColumns;
+                       
+                       for ( iRow=0, iRows=nTrs.length ; iRow<iRows ; iRow++ )
+                       {
+                               nTds = [];
+                               for ( iColumn=0, iColumns=nTrs[iRow].childNodes.length ; iColumn<iColumns ; iColumn++ )
+                               {
+                                       nTd = nTrs[iRow].childNodes[iColumn];
+                                       if ( nTd.nodeName.toUpperCase() == "TD" )
+                                       {
+                                               nTds.push( nTd );
+                                       }
+                               }
+                               
+                               iCorrector = 0;
+                               for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
+                               {
+                                       if ( oSettings.aoColumns[iColumn].bVisible )
+                                       {
+                                               anReturn.push( nTds[iColumn-iCorrector] );
+                                       }
+                                       else
+                                       {
+                                               anReturn.push( oSettings.aoData[iRow]._anHidden[iColumn] );
+                                               iCorrector++;
+                                       }
+                               }
+                       }
+                       return anReturn;
+               }
+               
+               /*
+                * Function: _fnEscapeRegex
+                * Purpose:  scape a string stuch that it can be used in a regular expression
+                * Returns:  string: - escaped string
+                * Inputs:   string:sVal - string to escape
+                */
+               function _fnEscapeRegex ( sVal )
+               {
+                       var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^' ];
+                 var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' );
+                 return sVal.replace(reReplace, '\\$1');
+               }
+               
+               /*
+                * Function: _fnDeleteIndex
+                * Purpose:  Take an array of integers (index array) and remove a target integer (value - not 
+                *             the key!)
+                * Returns:  -
+                * Inputs:   a:array int - Index array to target
+                *           int:iTarget - value to find
+                */
+               function _fnDeleteIndex( a, iTarget )
+               {
+                       var iTargetIndex = -1;
+                       
+                       for ( var i=0, iLen=a.length ; i<iLen ; i++ )
+                       {
+                               if ( a[i] == iTarget )
+                               {
+                                       iTargetIndex = i;
+                               }
+                               else if ( a[i] > iTarget )
+                               {
+                                       a[i]--;
+                               }
+                       }
+                       
+                       if ( iTargetIndex != -1 )
+                       {
+                               a.splice( iTargetIndex, 1 );
+                       }
+               }
+               
+               /*
+                * Function: _fnReOrderIndex
+                * Purpose:  Figure out how to reorder a display list
+                * Returns:  array int:aiReturn - index list for reordering
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnReOrderIndex ( oSettings, sColumns )
+               {
+                       var aColumns = sColumns.split(',');
+                       var aiReturn = [];
+                       
+                       for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                       {
+                               for ( var j=0 ; j<iLen ; j++ )
+                               {
+                                       if ( oSettings.aoColumns[i].sName == aColumns[j] )
+                                       {
+                                               aiReturn.push( j );
+                                               break;
+                                       }
+                               }
+                       }
+                       
+                       return aiReturn;
+               }
+               
+               /*
+                * Function: _fnColumnOrdering
+                * Purpose:  Get the column ordering that DataTables expects
+                * Returns:  string: - comma separated list of names
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnColumnOrdering ( oSettings )
+               {
+                       var sNames = '';
+                       for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+                       {
+                               sNames += oSettings.aoColumns[i].sName+',';
+                       }
+                       if ( sNames.length == iLen )
+                       {
+                               return "";
+                       }
+                       return sNames.slice(0, -1);
+               }
+               
+               /*
+                * Function: _fnLog
+                * Purpose:  Log an error message
+                * Returns:  -
+                * Inputs:   int:iLevel - log error messages, or display them to the user
+                *           string:sMesg - error message
+                */
+               function _fnLog( oSettings, iLevel, sMesg )
+               {
+                       var sAlert = oSettings.sTableId === "" ?
+                               "DataTables warning: " +sMesg :
+                               "DataTables warning (table id = '"+oSettings.sTableId+"'): " +sMesg;
+                       
+                       if ( iLevel === 0 )
+                       {
+                               if ( _oExt.sErrMode == 'alert' )
+                               {
+                                       alert( sAlert );
+                               }
+                               else
+                               {
+                                       throw sAlert;
+                               }
+                               return;
+                       }
+                       else if ( typeof console != 'undefined' && typeof console.log != 'undefined' )
+                       {
+                               console.log( sAlert );
+                       }
+               }
+               
+               /*
+                * Function: _fnClearTable
+                * Purpose:  Nuke the table
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnClearTable( oSettings )
+               {
+                       oSettings.aoData.splice( 0, oSettings.aoData.length );
+                       oSettings.aiDisplayMaster.splice( 0, oSettings.aiDisplayMaster.length );
+                       oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length );
+                       _fnCalculateEnd( oSettings );
+               }
+               
+               /*
+                * Function: _fnSaveState
+                * Purpose:  Save the state of a table in a cookie such that the page can be reloaded
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                */
+               function _fnSaveState ( oSettings )
+               {
+                       if ( !oSettings.oFeatures.bStateSave || typeof oSettings.bDestroying != 'undefined' )
+                       {
+                               return;
+                       }
+                       
+                       /* Store the interesting variables */
+                       var i, iLen, sTmp;
+                       var sValue = "{";
+                       sValue += '"iCreate":'+ new Date().getTime()+',';
+                       sValue += '"iStart":'+ oSettings._iDisplayStart+',';
+                       sValue += '"iEnd":'+ oSettings._iDisplayEnd+',';
+                       sValue += '"iLength":'+ oSettings._iDisplayLength+',';
+                       sValue += '"sFilter":"'+ encodeURIComponent(oSettings.oPreviousSearch.sSearch)+'",';
+                       sValue += '"sFilterEsc":'+ !oSettings.oPreviousSearch.bRegex+',';
+                       
+                       sValue += '"aaSorting":[ ';
+                       for ( i=0 ; i<oSettings.aaSorting.length ; i++ )
+                       {
+                               sValue += '['+oSettings.aaSorting[i][0]+',"'+oSettings.aaSorting[i][1]+'"],';
+                       }
+                       sValue = sValue.substring(0, sValue.length-1);
+                       sValue += "],";
+                       
+                       sValue += '"aaSearchCols":[ ';
+                       for ( i=0 ; i<oSettings.aoPreSearchCols.length ; i++ )
+                       {
+                               sValue += '["'+encodeURIComponent(oSettings.aoPreSearchCols[i].sSearch)+
+                                       '",'+!oSettings.aoPreSearchCols[i].bRegex+'],';
+                       }
+                       sValue = sValue.substring(0, sValue.length-1);
+                       sValue += "],";
+                       
+                       sValue += '"abVisCols":[ ';
+                       for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
+                       {
+                               sValue += oSettings.aoColumns[i].bVisible+",";
+                       }
+                       sValue = sValue.substring(0, sValue.length-1);
+                       sValue += "]";
+                       
+                       /* Save state from any plug-ins */
+                       for ( i=0, iLen=oSettings.aoStateSave.length ; i<iLen ; i++ )
+                       {
+                               sTmp = oSettings.aoStateSave[i].fn( oSettings, sValue );
+                               if ( sTmp !== "" )
+                               {
+                                       sValue = sTmp;
+                               }
+                       }
+                       
+                       sValue += "}";
+                       
+                       _fnCreateCookie( oSettings.sCookiePrefix+oSettings.sInstance, sValue, 
+                               oSettings.iCookieDuration, oSettings.sCookiePrefix, oSettings.fnCookieCallback );
+               }
+               
+               /*
+                * Function: _fnLoadState
+                * Purpose:  Attempt to load a saved table state from a cookie
+                * Returns:  -
+                * Inputs:   object:oSettings - dataTables settings object
+                *           object:oInit - DataTables init object so we can override settings
+                */
+               function _fnLoadState ( oSettings, oInit )
+               {
+                       if ( !oSettings.oFeatures.bStateSave )
+                       {
+                               return;
+                       }
+                       
+                       var oData, i, iLen;
+                       var sData = _fnReadCookie( oSettings.sCookiePrefix+oSettings.sInstance );
+                       if ( sData !== null && sData !== '' )
+                       {
+                               /* Try/catch the JSON eval - if it is bad then we ignore it - note that 1.7.0 and before
+                                * incorrectly used single quotes for some strings - hence the replace below
+                                */
+                               try
+                               {
+                                       oData = (typeof $.parseJSON == 'function') ? 
+                                               $.parseJSON( sData.replace(/'/g, '"') ) : eval( '('+sData+')' );
+                               }
+                               catch( e )
+                               {
+                                       return;
+                               }
+                               
+                               /* Allow custom and plug-in manipulation functions to alter the data set which was
+                                * saved, and also reject any saved state by returning false
+                                */
+                               for ( i=0, iLen=oSettings.aoStateLoad.length ; i<iLen ; i++ )
+                               {
+                                       if ( !oSettings.aoStateLoad[i].fn( oSettings, oData ) )
+                                       {
+                                               return;
+                                       }
+                               }
+                               
+                               /* Store the saved state so it might be accessed at any time (particualrly a plug-in */
+                               oSettings.oLoadedState = $.extend( true, {}, oData );
+                               
+                               /* Restore key features */
+                               oSettings._iDisplayStart = oData.iStart;
+                               oSettings.iInitDisplayStart = oData.iStart;
+                               oSettings._iDisplayEnd = oData.iEnd;
+                               oSettings._iDisplayLength = oData.iLength;
+                               oSettings.oPreviousSearch.sSearch = decodeURIComponent(oData.sFilter);
+                               oSettings.aaSorting = oData.aaSorting.slice();
+                               oSettings.saved_aaSorting = oData.aaSorting.slice();
+                               
+                               /*
+                                * Search filtering - global reference added in 1.4.1
+                                * Note that we use a 'not' for the value of the regular expression indicator to maintain
+                                * compatibility with pre 1.7 versions, where this was basically inverted. Added in 1.7.0
+                                */
+                               if ( typeof oData.sFilterEsc != 'undefined' )
+                               {
+                                       oSettings.oPreviousSearch.bRegex = !oData.sFilterEsc;
+                               }
+                               
+                               /* Column filtering - added in 1.5.0 beta 6 */
+                               if ( typeof oData.aaSearchCols != 'undefined' )
+                               {
+                                       for ( i=0 ; i<oData.aaSearchCols.length ; i++ )
+                                       {
+                                               oSettings.aoPreSearchCols[i] = {
+                                                       "sSearch": decodeURIComponent(oData.aaSearchCols[i][0]),
+                                                       "bRegex": !oData.aaSearchCols[i][1]
+                                               };
+                                       }
+                               }
+                               
+                               /* Column visibility state - added in 1.5.0 beta 10 */
+                               if ( typeof oData.abVisCols != 'undefined' )
+                               {
+                                       /* Pass back visibiliy settings to the init handler, but to do not here override
+                                        * the init object that the user might have passed in
+                                        */
+                                       oInit.saved_aoColumns = [];
+                                       for ( i=0 ; i<oData.abVisCols.length ; i++ )
+                                       {
+                                               oInit.saved_aoColumns[i] = {};
+                                               oInit.saved_aoColumns[i].bVisible = oData.abVisCols[i];
+                                       }
+                               }
+                       }
+               }
+               
+               /*
+                * Function: _fnCreateCookie
+                * Purpose:  Create a new cookie with a value to store the state of a table
+                * Returns:  -
+                * Inputs:   string:sName - name of the cookie to create
+                *           string:sValue - the value the cookie should take
+                *           int:iSecs - duration of the cookie
+                *           string:sBaseName - sName is made up of the base + file name - this is the base
+                *           function:fnCallback - User definable function to modify the cookie
+                */
+               function _fnCreateCookie ( sName, sValue, iSecs, sBaseName, fnCallback )
+               {
+                       var date = new Date();
+                       date.setTime( date.getTime()+(iSecs*1000) );
+                       
+                       /* 
+                        * Shocking but true - it would appear IE has major issues with having the path not having
+                        * a trailing slash on it. We need the cookie to be available based on the path, so we
+                        * have to append the file name to the cookie name. Appalling. Thanks to vex for adding the
+                        * patch to use at least some of the path
+                        */
+                       var aParts = window.location.pathname.split('/');
+                       var sNameFile = sName + '_' + aParts.pop().replace(/[\/:]/g,"").toLowerCase();
+                       var sFullCookie, oData;
+                       
+                       if ( fnCallback !== null )
+                       {
+                               oData = (typeof $.parseJSON == 'function') ? 
+                                       $.parseJSON( sValue ) : eval( '('+sValue+')' );
+                               sFullCookie = fnCallback( sNameFile, oData, date.toGMTString(),
+                                       aParts.join('/')+"/" );
+                       }
+                       else
+                       {
+                               sFullCookie = sNameFile + "=" + encodeURIComponent(sValue) +
+                                       "; expires=" + date.toGMTString() +"; path=" + aParts.join('/')+"/";
+                       }
+                       
+                       /* Are we going to go over the cookie limit of 4KiB? If so, try to delete a cookies
+                        * belonging to DataTables. This is FAR from bullet proof
+                        */
+                       var sOldName="", iOldTime=9999999999999;
+                       var iLength = _fnReadCookie( sNameFile )!==null ? document.cookie.length : 
+                               sFullCookie.length + document.cookie.length;
+                       
+                       if ( iLength+10 > 4096 ) /* Magic 10 for padding */
+                       {
+                               var aCookies =document.cookie.split(';');
+                               for ( var i=0, iLen=aCookies.length ; i<iLen ; i++ )
+                               {
+                                       if ( aCookies[i].indexOf( sBaseName ) != -1 )
+                                       {
+                                               /* It's a DataTables cookie, so eval it and check the time stamp */
+                                               var aSplitCookie = aCookies[i].split('=');
+                                               try { oData = eval( '('+decodeURIComponent(aSplitCookie[1])+')' ); }
+                                               catch( e ) { continue; }
+                                               
+                                               if ( typeof oData.iCreate != 'undefined' && oData.iCreate < iOldTime )
+                                               {
+                                                       sOldName = aSplitCookie[0];
+                                                       iOldTime = oData.iCreate;
+                                               }
+                                       }
+                               }
+                               
+                               if ( sOldName !== "" )
+                               {
+                                       document.cookie = sOldName+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+
+                                               aParts.join('/') + "/";
+                               }
+                       }
+                       
+                       document.cookie = sFullCookie;
+               }
+               
+               /*
+                * Function: _fnReadCookie
+                * Purpose:  Read an old cookie to get a cookie with an old table state
+                * Returns:  string: - contents of the cookie - or null if no cookie with that name found
+                * Inputs:   string:sName - name of the cookie to read
+                */
+               function _fnReadCookie ( sName )
+               {
+                       var
+                               aParts = window.location.pathname.split('/'),
+                               sNameEQ = sName + '_' + aParts[aParts.length-1].replace(/[\/:]/g,"").toLowerCase() + '=',
+                               sCookieContents = document.cookie.split(';');
+                       
+                       for( var i=0 ; i<sCookieContents.length ; i++ )
+                       {
+                               var c = sCookieContents[i];
+                               
+                               while (c.charAt(0)==' ')
+                               {
+                                       c = c.substring(1,c.length);
+                               }
+                               
+                               if (c.indexOf(sNameEQ) === 0)
+                               {
+                                       return decodeURIComponent( c.substring(sNameEQ.length,c.length) );
+                               }
+                       }
+                       return null;
+               }
+               
+               /*
+                * Function: _fnGetUniqueThs
+                * Purpose:  Get an array of unique th elements, one for each column
+                * Returns:  array node:aReturn - list of unique ths
+                * Inputs:   node:nThead - The thead element for the table
+                */
+               function _fnGetUniqueThs ( nThead )
+               {
+                       var nTrs = nThead.getElementsByTagName('tr');
+                       
+                       /* Nice simple case */
+                       if ( nTrs.length == 1 )
+                       {
+                               return nTrs[0].getElementsByTagName('th');
+                       }
+                       
+                       /* Otherwise we need to figure out the layout array to get the nodes */
+                       var aLayout = [], aReturn = [];
+                       var ROWSPAN = 2, COLSPAN = 3, TDELEM = 4;
+                       var i, j, k, iLen, jLen, iColumnShifted;
+                       var fnShiftCol = function ( a, i, j ) {
+                               while ( typeof a[i][j] != 'undefined' ) {
+                                       j++;
+                               }
+                               return j;
+                       };
+                       var fnAddRow = function ( i ) {
+                               if ( typeof aLayout[i] == 'undefined' ) {
+                                       aLayout[i] = [];
+                               }
+                       };
+                       
+                       /* Calculate a layout array */
+                       for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+                       {
+                               fnAddRow( i );
+                               var iColumn = 0;
+                               var nTds = [];
+                               
+                               for ( j=0, jLen=nTrs[i].childNodes.length ; j<jLen ; j++ )
+                               {
+                                       if ( nTrs[i].childNodes[j].nodeName.toUpperCase() == "TD" ||
+                                            nTrs[i].childNodes[j].nodeName.toUpperCase() == "TH" )
+                                       {
+                                               nTds.push( nTrs[i].childNodes[j] );
+                                       }
+                               }
+                               
+                               for ( j=0, jLen=nTds.length ; j<jLen ; j++ )
+                               {
+                                       var iColspan = nTds[j].getAttribute('colspan') * 1;
+                                       var iRowspan = nTds[j].getAttribute('rowspan') * 1;
+                                       
+                                       if ( !iColspan || iColspan===0 || iColspan===1 )
+                                       {
+                                               iColumnShifted = fnShiftCol( aLayout, i, iColumn );
+                                               aLayout[i][iColumnShifted] = (nTds[j].nodeName.toUpperCase()=="TD") ? TDELEM : nTds[j];
+                                               if ( iRowspan || iRowspan===0 || iRowspan===1 )
+                                               {
+                                                       for ( k=1 ; k<iRowspan ; k++ )
+                                                       {
+                                                               fnAddRow( i+k );
+                                                               aLayout[i+k][iColumnShifted] = ROWSPAN;
+                                                       }
+                                               }
+                                               iColumn++;
+                                       }
+                                       else
+                                       {
+                                               iColumnShifted = fnShiftCol( aLayout, i, iColumn );
+                                               for ( k=0 ; k<iColspan ; k++ )
+                                               {
+                                                       aLayout[i][iColumnShifted+k] = COLSPAN;
+                                               }
+                                               iColumn += iColspan;
+                                       }
+                               }
+                       }
+                       
+                       /* Convert the layout array into a node array */
+                       for ( i=0, iLen=aLayout.length ; i<iLen ; i++ )
+                       {
+                               for ( j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
+                               {
+                                       if ( typeof aLayout[i][j] == 'object' && typeof aReturn[j] == 'undefined' )
+                                       {
+                                               aReturn[j] = aLayout[i][j];
+                                       }
+                               }
+                       }
+                       
+                       return aReturn;
+               }
+               
+               /*
+                * Function: _fnScrollBarWidth
+                * Purpose:  Get the width of a scroll bar in this browser being used
+                * Returns:  int: - width in pixels
+                * Inputs:   -
+                * Notes:    All credit for this function belongs to Alexandre Gomes. Thanks for sharing!
+                *   http://www.alexandre-gomes.com/?p=115
+                */
+               function _fnScrollBarWidth ()
+               {  
+                       var inner = document.createElement('p');  
+                       var style = inner.style;
+                       style.width = "100%";  
+                       style.height = "200px";  
+                       
+                       var outer = document.createElement('div');  
+                       style = outer.style;
+                       style.position = "absolute";  
+                       style.top = "0px";  
+                       style.left = "0px";  
+                       style.visibility = "hidden";  
+                       style.width = "200px";  
+                       style.height = "150px";  
+                       style.overflow = "hidden";  
+                       outer.appendChild(inner);  
+                       
+                       document.body.appendChild(outer);  
+                       var w1 = inner.offsetWidth;  
+                       outer.style.overflow = 'scroll';  
+                       var w2 = inner.offsetWidth;  
+                       if ( w1 == w2 )
+                       {
+                               w2 = outer.clientWidth;  
+                       }
+                       
+                       document.body.removeChild(outer); 
+                       return (w1 - w2);  
+               }
+               
+               /*
+                * Function: _fnApplyToChildren
+                * Purpose:  Apply a given function to the display child nodes of an element array (typically
+                *   TD children of TR rows
+                * Returns:  - (done by reference)
+                * Inputs:   function:fn - Method to apply to the objects
+                *           array nodes:an1 - List of elements to look through for display children
+                *           array nodes:an2 - Another list (identical structure to the first) - optional
+                */
+               function _fnApplyToChildren( fn, an1, an2 )
+               {
+                       for ( var i=0, iLen=an1.length ; i<iLen ; i++ )
+                       {
+                               for ( var j=0, jLen=an1[i].childNodes.length ; j<jLen ; j++ )
+                               {
+                                       if ( an1[i].childNodes[j].nodeType == 1 )
+                                       {
+                                               if ( typeof an2 != 'undefined' )
+                                               {
+                                                       fn( an1[i].childNodes[j], an2[i].childNodes[j] );
+                                               }
+                                               else
+                                               {
+                                                       fn( an1[i].childNodes[j] );
+                                               }
+                                       }
+                               }
+                       }
+               }
+               
+               /*
+                * Function: _fnMap
+                * Purpose:  See if a property is defined on one object, if so assign it to the other object
+                * Returns:  - (done by reference)
+                * Inputs:   object:oRet - target object
+                *           object:oSrc - source object
+                *           string:sName - property
+                *           string:sMappedName - name to map too - optional, sName used if not given
+                */
+               function _fnMap( oRet, oSrc, sName, sMappedName )
+               {
+                       if ( typeof sMappedName == 'undefined' )
+                       {
+                               sMappedName = sName;
+                       }
+                       if ( typeof oSrc[sName] != 'undefined' )
+                       {
+                               oRet[sMappedName] = oSrc[sName];
+                       }
+               }
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - API
+                * 
+                * I'm not overly happy with this solution - I'd much rather that there was a way of getting
+                * a list of all the private functions and do what we need to dynamically - but that doesn't
+                * appear to be possible. Bonkers. A better solution would be to provide a 'bind' type object
+                * To do - bind type method in DTs 2.x.
+                */
+               this.oApi._fnExternApiFunc = _fnExternApiFunc;
+               this.oApi._fnInitalise = _fnInitalise;
+               this.oApi._fnLanguageProcess = _fnLanguageProcess;
+               this.oApi._fnAddColumn = _fnAddColumn;
+               this.oApi._fnColumnOptions = _fnColumnOptions;
+               this.oApi._fnAddData = _fnAddData;
+               this.oApi._fnGatherData = _fnGatherData;
+               this.oApi._fnDrawHead = _fnDrawHead;
+               this.oApi._fnDraw = _fnDraw;
+               this.oApi._fnReDraw = _fnReDraw;
+               this.oApi._fnAjaxUpdate = _fnAjaxUpdate;
+               this.oApi._fnAjaxUpdateDraw = _fnAjaxUpdateDraw;
+               this.oApi._fnAddOptionsHtml = _fnAddOptionsHtml;
+               this.oApi._fnFeatureHtmlTable = _fnFeatureHtmlTable;
+               this.oApi._fnScrollDraw = _fnScrollDraw;
+               this.oApi._fnAjustColumnSizing = _fnAjustColumnSizing;
+               this.oApi._fnFeatureHtmlFilter = _fnFeatureHtmlFilter;
+               this.oApi._fnFilterComplete = _fnFilterComplete;
+               this.oApi._fnFilterCustom = _fnFilterCustom;
+               this.oApi._fnFilterColumn = _fnFilterColumn;
+               this.oApi._fnFilter = _fnFilter;
+               this.oApi._fnBuildSearchArray = _fnBuildSearchArray;
+               this.oApi._fnBuildSearchRow = _fnBuildSearchRow;
+               this.oApi._fnFilterCreateSearch = _fnFilterCreateSearch;
+               this.oApi._fnDataToSearch = _fnDataToSearch;
+               this.oApi._fnSort = _fnSort;
+               this.oApi._fnSortAttachListener = _fnSortAttachListener;
+               this.oApi._fnSortingClasses = _fnSortingClasses;
+               this.oApi._fnFeatureHtmlPaginate = _fnFeatureHtmlPaginate;
+               this.oApi._fnPageChange = _fnPageChange;
+               this.oApi._fnFeatureHtmlInfo = _fnFeatureHtmlInfo;
+               this.oApi._fnUpdateInfo = _fnUpdateInfo;
+               this.oApi._fnFeatureHtmlLength = _fnFeatureHtmlLength;
+               this.oApi._fnFeatureHtmlProcessing = _fnFeatureHtmlProcessing;
+               this.oApi._fnProcessingDisplay = _fnProcessingDisplay;
+               this.oApi._fnVisibleToColumnIndex = _fnVisibleToColumnIndex;
+               this.oApi._fnColumnIndexToVisible = _fnColumnIndexToVisible;
+               this.oApi._fnNodeToDataIndex = _fnNodeToDataIndex;
+               this.oApi._fnVisbleColumns = _fnVisbleColumns;
+               this.oApi._fnCalculateEnd = _fnCalculateEnd;
+               this.oApi._fnConvertToWidth = _fnConvertToWidth;
+               this.oApi._fnCalculateColumnWidths = _fnCalculateColumnWidths;
+               this.oApi._fnScrollingWidthAdjust = _fnScrollingWidthAdjust;
+               this.oApi._fnGetWidestNode = _fnGetWidestNode;
+               this.oApi._fnGetMaxLenString = _fnGetMaxLenString;
+               this.oApi._fnStringToCss = _fnStringToCss;
+               this.oApi._fnArrayCmp = _fnArrayCmp;
+               this.oApi._fnDetectType = _fnDetectType;
+               this.oApi._fnSettingsFromNode = _fnSettingsFromNode;
+               this.oApi._fnGetDataMaster = _fnGetDataMaster;
+               this.oApi._fnGetTrNodes = _fnGetTrNodes;
+               this.oApi._fnGetTdNodes = _fnGetTdNodes;
+               this.oApi._fnEscapeRegex = _fnEscapeRegex;
+               this.oApi._fnDeleteIndex = _fnDeleteIndex;
+               this.oApi._fnReOrderIndex = _fnReOrderIndex;
+               this.oApi._fnColumnOrdering = _fnColumnOrdering;
+               this.oApi._fnLog = _fnLog;
+               this.oApi._fnClearTable = _fnClearTable;
+               this.oApi._fnSaveState = _fnSaveState;
+               this.oApi._fnLoadState = _fnLoadState;
+               this.oApi._fnCreateCookie = _fnCreateCookie;
+               this.oApi._fnReadCookie = _fnReadCookie;
+               this.oApi._fnGetUniqueThs = _fnGetUniqueThs;
+               this.oApi._fnScrollBarWidth = _fnScrollBarWidth;
+               this.oApi._fnApplyToChildren = _fnApplyToChildren;
+               this.oApi._fnMap = _fnMap;
+               
+               
+               /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+                * Section - Constructor
+                */
+               
+               /* Want to be able to reference "this" inside the this.each function */
+               var _that = this;
+               return this.each(function()
+               {
+                       var i=0, iLen, j, jLen, k, kLen;
+                       
+                       /* Check to see if we are re-initalising a table */
+                       for ( i=0, iLen=_aoSettings.length ; i<iLen ; i++ )
+                       {
+                               /* Base check on table node */
+                               if ( _aoSettings[i].nTable == this )
+                               {
+                                       if ( typeof oInit == 'undefined' || 
+                                          ( typeof oInit.bRetrieve != 'undefined' && oInit.bRetrieve === true ) )
+                                       {
+                                               return _aoSettings[i].oInstance;
+                                       }
+                                       else if ( typeof oInit.bDestroy != 'undefined' && oInit.bDestroy === true )
+                                       {
+                                               _aoSettings[i].oInstance.fnDestroy();
+                                               break;
+                                       }
+                                       else
+                                       {
+                                               _fnLog( _aoSettings[i], 0, "Cannot reinitialise DataTable.\n\n"+
+                                                       "To retrieve the DataTables object for this table, please pass either no arguments "+
+                                                       "to the dataTable() function, or set bRetrieve to true. Alternatively, to destory "+
+                                                       "the old table and create a new one, set bDestroy to true (note that a lot of "+
+                                                       "changes to the configuration can be made through the API which is usually much "+
+                                                       "faster)." );
+                                               return;
+                                       }
+                               }
+                               
+                               /* If the element we are initialising has the same ID as a table which was previously
+                                * initialised, but the table nodes don't match (from before) then we destory the old
+                                * instance by simply deleting it. This is under the assumption that the table has been
+                                * destroyed by other methods. Anyone using non-id selectors will need to do this manually
+                                */
+                               if ( _aoSettings[i].sTableId !== "" && _aoSettings[i].sTableId == this.getAttribute('id') )
+                               {
+                                       _aoSettings.splice( i, 1 );
+                                       break;
+                               }
+                       }
+                       
+                       /* Make a complete and independent copy of the settings object */
+                       var oSettings = new classSettings();
+                       _aoSettings.push( oSettings );
+                       
+                       var bInitHandedOff = false;
+                       var bUsePassedData = false;
+                       
+                       /* Set the id */
+                       var sId = this.getAttribute( 'id' );
+                       if ( sId !== null )
+                       {
+                               oSettings.sTableId = sId;
+                               oSettings.sInstance = sId;
+                       }
+                       else
+                       {
+                               oSettings.sInstance = _oExt._oExternConfig.iNextUnique ++;
+                       }
+                       
+                       /* Sanity check */
+                       if ( this.nodeName.toLowerCase() != 'table' )
+                       {
+                               _fnLog( oSettings, 0, "Attempted to initialise DataTables on a node which is not a "+
+                                       "table: "+this.nodeName );
+                               return;
+                       }
+                       
+                       /* Set the table node */
+                       oSettings.nTable = this;
+                       
+                       /* Keep a reference to the 'this' instance for the table. Note that if this table is being
+                        * created with others, we retrieve a unique instance to ease API access.
+                        */
+                       oSettings.oInstance = _that.length == 1 ? _that : $(this).dataTable();
+                       
+                       /* Bind the API functions to the settings, so we can perform actions whenever oSettings is
+                        * available
+                        */
+                       oSettings.oApi = _that.oApi;
+                       
+                       /* State the table's width for if a destroy is called at a later time */
+                       oSettings.sDestroyWidth = $(this).width();
+                       
+                       /* Store the features that we have available */
+                       if ( typeof oInit != 'undefined' && oInit !== null )
+                       {
+                               oSettings.oInit = oInit;
+                               _fnMap( oSettings.oFeatures, oInit, "bPaginate" );
+                               _fnMap( oSettings.oFeatures, oInit, "bLengthChange" );
+                               _fnMap( oSettings.oFeatures, oInit, "bFilter" );
+                               _fnMap( oSettings.oFeatures, oInit, "bSort" );
+                               _fnMap( oSettings.oFeatures, oInit, "bInfo" );
+                               _fnMap( oSettings.oFeatures, oInit, "bProcessing" );
+                               _fnMap( oSettings.oFeatures, oInit, "bAutoWidth" );
+                               _fnMap( oSettings.oFeatures, oInit, "bSortClasses" );
+                               _fnMap( oSettings.oFeatures, oInit, "bServerSide" );
+                               _fnMap( oSettings.oScroll, oInit, "sScrollX", "sX" );
+                               _fnMap( oSettings.oScroll, oInit, "sScrollXInner", "sXInner" );
+                               _fnMap( oSettings.oScroll, oInit, "sScrollY", "sY" );
+                               _fnMap( oSettings.oScroll, oInit, "bScrollCollapse", "bCollapse" );
+                               _fnMap( oSettings.oScroll, oInit, "bScrollInfinite", "bInfinite" );
+                               _fnMap( oSettings.oScroll, oInit, "iScrollLoadGap", "iLoadGap" );
+                               _fnMap( oSettings.oScroll, oInit, "bScrollAutoCss", "bAutoCss" );
+                               _fnMap( oSettings, oInit, "asStripClasses" );
+                               _fnMap( oSettings, oInit, "fnRowCallback" );
+                               _fnMap( oSettings, oInit, "fnHeaderCallback" );
+                               _fnMap( oSettings, oInit, "fnFooterCallback" );
+                               _fnMap( oSettings, oInit, "fnCookieCallback" );
+                               _fnMap( oSettings, oInit, "fnInitComplete" );
+                               _fnMap( oSettings, oInit, "fnServerData" );
+                               _fnMap( oSettings, oInit, "fnFormatNumber" );
+                               _fnMap( oSettings, oInit, "aaSorting" );
+                               _fnMap( oSettings, oInit, "aaSortingFixed" );
+                               _fnMap( oSettings, oInit, "aLengthMenu" );
+                               _fnMap( oSettings, oInit, "sPaginationType" );
+                               _fnMap( oSettings, oInit, "sAjaxSource" );
+                               _fnMap( oSettings, oInit, "iCookieDuration" );
+                               _fnMap( oSettings, oInit, "sCookiePrefix" );
+                               _fnMap( oSettings, oInit, "sDom" );
+                               _fnMap( oSettings, oInit, "oSearch", "oPreviousSearch" );
+                               _fnMap( oSettings, oInit, "aoSearchCols", "aoPreSearchCols" );
+                               _fnMap( oSettings, oInit, "iDisplayLength", "_iDisplayLength" );
+                               _fnMap( oSettings, oInit, "bJQueryUI", "bJUI" );
+                               _fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
+                               
+                               /* Callback functions which are array driven */
+                               if ( typeof oInit.fnDrawCallback == 'function' )
+                               {
+                                       oSettings.aoDrawCallback.push( {
+                                               "fn": oInit.fnDrawCallback,
+                                               "sName": "user"
+                                       } );
+                               }
+                               
+                               if ( typeof oInit.fnStateSaveCallback == 'function' )
+                               {
+                                       oSettings.aoStateSave.push( {
+                                               "fn": oInit.fnStateSaveCallback,
+                                               "sName": "user"
+                                       } );
+                               }
+                               
+                               if ( typeof oInit.fnStateLoadCallback == 'function' )
+                               {
+                                       oSettings.aoStateLoad.push( {
+                                               "fn": oInit.fnStateLoadCallback,
+                                               "sName": "user"
+                                       } );
+                               }
+                               
+                               if ( oSettings.oFeatures.bServerSide && oSettings.oFeatures.bSort &&
+                                          oSettings.oFeatures.bSortClasses )
+                               {
+                                       /* Enable sort classes for server-side processing. Safe to do it here, since server-side
+                                        * processing must be enabled by the developer
+                                        */
+                                       oSettings.aoDrawCallback.push( {
+                                               "fn": _fnSortingClasses,
+                                               "sName": "server_side_sort_classes"
+                                       } );
+                               }
+                               
+                               if ( typeof oInit.bJQueryUI != 'undefined' && oInit.bJQueryUI )
+                               {
+                                       /* Use the JUI classes object for display. You could clone the oStdClasses object if 
+                                        * you want to have multiple tables with multiple independent classes 
+                                        */
+                                       oSettings.oClasses = _oExt.oJUIClasses;
+                                       
+                                       if ( typeof oInit.sDom == 'undefined' )
+                                       {
+                                               /* Set the DOM to use a layout suitable for jQuery UI's theming */
+                                               oSettings.sDom = '<"H"lfr>t<"F"ip>';
+                                       }
+                               }
+                               
+                               /* Calculate the scroll bar width and cache it for use later on */
+                               if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
+                               {
+                                       oSettings.oScroll.iBarWidth = _fnScrollBarWidth();
+                               }
+                               
+                               if ( typeof oInit.iDisplayStart != 'undefined' && 
+                                    typeof oSettings.iInitDisplayStart == 'undefined' )
+                               {
+                                       /* Display start point, taking into account the save saving */
+                                       oSettings.iInitDisplayStart = oInit.iDisplayStart;
+                                       oSettings._iDisplayStart = oInit.iDisplayStart;
+                               }
+                               
+                               /* Must be done after everything which can be overridden by a cookie! */
+                               if ( typeof oInit.bStateSave != 'undefined' )
+                               {
+                                       oSettings.oFeatures.bStateSave = oInit.bStateSave;
+                                       _fnLoadState( oSettings, oInit );
+                                       oSettings.aoDrawCallback.push( {
+                                               "fn": _fnSaveState,
+                                               "sName": "state_save"
+                                       } );
+                               }
+                               
+                               if ( typeof oInit.aaData != 'undefined' )
+                               {
+                                       bUsePassedData = true;
+                               }
+                               
+                               /* Backwards compatability */
+                               /* aoColumns / aoData - remove at some point... */
+                               if ( typeof oInit != 'undefined' && typeof oInit.aoData != 'undefined' )
+                               {
+                                       oInit.aoColumns = oInit.aoData;
+                               }
+                               
+                               /* Language definitions */
+                               if ( typeof oInit.oLanguage != 'undefined' )
+                               {
+                                       if ( typeof oInit.oLanguage.sUrl != 'undefined' && oInit.oLanguage.sUrl !== "" )
+                                       {
+                                               /* Get the language definitions from a file */
+                                               oSettings.oLanguage.sUrl = oInit.oLanguage.sUrl;
+                                               $.getJSON( oSettings.oLanguage.sUrl, null, function( json ) { 
+                                                       _fnLanguageProcess( oSettings, json, true ); } );
+                                               bInitHandedOff = true;
+                                       }
+                                       else
+                                       {
+                                               _fnLanguageProcess( oSettings, oInit.oLanguage, false );
+                                       }
+                               }
+                               /* Warning: The _fnLanguageProcess function is async to the remainder of this function due
+                                * to the XHR. We use _bInitialised in _fnLanguageProcess() to check this the processing 
+                                * below is complete. The reason for spliting it like this is optimisation - we can fire
+                                * off the XHR (if needed) and then continue processing the data.
+                                */
+                       }
+                       else
+                       {
+                               /* Create a dummy object for quick manipulation later on. */
+                               oInit = {};
+                       }
+                       
+                       /*
+                        * Stripes
+                        * Add the strip classes now that we know which classes to apply - unless overruled
+                        */
+                       if ( typeof oInit.asStripClasses == 'undefined' )
+                       {
+                               oSettings.asStripClasses.push( oSettings.oClasses.sStripOdd );
+                               oSettings.asStripClasses.push( oSettings.oClasses.sStripEven );
+                       }
+                       
+                       /* Remove row stripe classes if they are already on the table row */
+                       var bStripeRemove = false;
+                       var anRows = $('>tbody>tr', this);
+                       for ( i=0, iLen=oSettings.asStripClasses.length ; i<iLen ; i++ )
+                       {
+                               if ( anRows.filter(":lt(2)").hasClass( oSettings.asStripClasses[i]) )
+                               {
+                                       bStripeRemove = true;
+                                       break;
+                               }
+                       }
+                                       
+                       if ( bStripeRemove )
+                       {
+                               /* Store the classes which we are about to remove so they can be readded on destory */
+                               oSettings.asDestoryStrips = [ '', '' ];
+                               if ( $(anRows[0]).hasClass(oSettings.oClasses.sStripOdd) )
+                               {
+                                       oSettings.asDestoryStrips[0] += oSettings.oClasses.sStripOdd+" ";
+                               }
+                               if ( $(anRows[0]).hasClass(oSettings.oClasses.sStripEven) )
+                               {
+                                       oSettings.asDestoryStrips[0] += oSettings.oClasses.sStripEven;
+                               }
+                               if ( $(anRows[1]).hasClass(oSettings.oClasses.sStripOdd) )
+                               {
+                                       oSettings.asDestoryStrips[1] += oSettings.oClasses.sStripOdd+" ";
+                               }
+                               if ( $(anRows[1]).hasClass(oSettings.oClasses.sStripEven) )
+                               {
+                                       oSettings.asDestoryStrips[1] += oSettings.oClasses.sStripEven;
+                               }
+                               
+                               anRows.removeClass( oSettings.asStripClasses.join(' ') );
+                       }
+                       
+                       /*
+                        * Columns
+                        * See if we should load columns automatically or use defined ones
+                        */
+                       var nThead = this.getElementsByTagName('thead');
+                       var anThs = nThead.length===0 ? [] : _fnGetUniqueThs( nThead[0] );
+                       var aoColumnsInit;
+                       
+                       /* If not given a column array, generate one with nulls */
+                       if ( typeof oInit.aoColumns == 'undefined' )
+                       {
+                               aoColumnsInit = [];
+                               for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
+                               {
+                                       aoColumnsInit.push( null );
+                               }
+                       }
+                       else
+                       {
+                               aoColumnsInit = oInit.aoColumns;
+                       }
+                       
+                       /* Add the columns */
+                       for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
+                       {
+                               /* Check if we have column visibilty state to restore */
+                               if ( typeof oInit.saved_aoColumns != 'undefined' && oInit.saved_aoColumns.length == iLen )
+                               {
+                                       if ( aoColumnsInit[i] === null )
+                                       {
+                                               aoColumnsInit[i] = {};
+                                       }
+                                       aoColumnsInit[i].bVisible = oInit.saved_aoColumns[i].bVisible;
+                               }
+                               
+                               _fnAddColumn( oSettings, anThs ? anThs[i] : null );
+                       }
+                       
+                       /* Add options from column definations */
+                       if ( typeof oInit.aoColumnDefs != 'undefined' )
+                       {
+                               /* Loop over the column defs array - loop in reverse so first instace has priority */
+                               for ( i=oInit.aoColumnDefs.length-1 ; i>=0 ; i-- )
+                               {
+                                       /* Each column def can target multiple columns, as it is an array */
+                                       var aTargets = oInit.aoColumnDefs[i].aTargets;
+                                       if ( !$.isArray( aTargets ) )
+                                       {
+                                               _fnLog( oSettings, 1, 'aTargets must be an array of targets, not a '+(typeof aTargets) );
+                                       }
+                                       for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
+                                       {
+                                               if ( typeof aTargets[j] == 'number' && aTargets[j] >= 0 )
+                                               {
+                                                       /* 0+ integer, left to right column counting. We add columns which are unknown
+                                                        * automatically. Is this the right behaviour for this? We should at least
+                                                        * log it in future. We cannot do this for the negative or class targets, only here.
+                                                        */
+                                                       while( oSettings.aoColumns.length <= aTargets[j] )
+                                                       {
+                                                               _fnAddColumn( oSettings );
+                                                       }
+                                                       _fnColumnOptions( oSettings, aTargets[j], oInit.aoColumnDefs[i] );
+                                               }
+                                               else if ( typeof aTargets[j] == 'number' && aTargets[j] < 0 )
+                                               {
+                                                       /* Negative integer, right to left column counting */
+                                                       _fnColumnOptions( oSettings, oSettings.aoColumns.length+aTargets[j], 
+                                                               oInit.aoColumnDefs[i] );
+                                               }
+                                               else if ( typeof aTargets[j] == 'string' )
+                                               {
+                                                       /* Class name matching on TH element */
+                                                       for ( k=0, kLen=oSettings.aoColumns.length ; k<kLen ; k++ )
+                                                       {
+                                                               if ( aTargets[j] == "_all" ||
+                                                                    oSettings.aoColumns[k].nTh.className.indexOf( aTargets[j] ) != -1 )
+                                                               {
+                                                                       _fnColumnOptions( oSettings, k, oInit.aoColumnDefs[i] );
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+                       
+                       /* Add options from column array - after the defs array so this has priority */
+                       if ( typeof aoColumnsInit != 'undefined' )
+                       {
+                               for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
+                               {
+                                       _fnColumnOptions( oSettings, i, aoColumnsInit[i] );
+                               }
+                       }
+                       
+                       /*
+                        * Sorting
+                        * Check the aaSorting array
+                        */
+                       for ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ )
+                       {
+                               if ( oSettings.aaSorting[i][0] >= oSettings.aoColumns.length )
+                               {
+                                       oSettings.aaSorting[i][0] = 0;
+                               }
+                               var oColumn = oSettings.aoColumns[ oSettings.aaSorting[i][0] ];
+                               
+                               /* Add a default sorting index */
+                               if ( typeof oSettings.aaSorting[i][2] == 'undefined' )
+                               {
+                                       oSettings.aaSorting[i][2] = 0;
+                               }
+                               
+                               /* If aaSorting is not defined, then we use the first indicator in asSorting */
+                               if ( typeof oInit.aaSorting == "undefined" && 
+                                                typeof oSettings.saved_aaSorting == "undefined" )
+                               {
+                                       oSettings.aaSorting[i][1] = oColumn.asSorting[0];
+                               }
+                               
+                               /* Set the current sorting index based on aoColumns.asSorting */
+                               for ( j=0, jLen=oColumn.asSorting.length ; j<jLen ; j++ )
+                               {
+                                       if ( oSettings.aaSorting[i][1] == oColumn.asSorting[j] )
+                                       {
+                                               oSettings.aaSorting[i][2] = j;
+                                               break;
+                                       }
+                               }
+                       }
+                               
+                       /* Do a first pass on the sorting classes (allows any size changes to be taken into
+                        * account, and also will apply sorting disabled classes if disabled
+                        */
+                       _fnSortingClasses( oSettings );
+                       
+                       /*
+                        * Final init
+                        * Sanity check that there is a thead and tbody. If not let's just create them
+                        */
+                       if ( this.getElementsByTagName('thead').length === 0 )
+                       {
+                               this.appendChild( document.createElement( 'thead' ) );
+                       }
+                       
+                       if ( this.getElementsByTagName('tbody').length === 0 )
+                       {
+                               this.appendChild( document.createElement( 'tbody' ) );
+                       }
+                       
+                       oSettings.nTHead = this.getElementsByTagName('thead')[0];
+                       oSettings.nTBody = this.getElementsByTagName('tbody')[0];
+                       if ( this.getElementsByTagName('tfoot').length > 0 )
+                       {
+                               oSettings.nTFoot = this.getElementsByTagName('tfoot')[0];
+                       }
+                       
+                       /* Check if there is data passing into the constructor */
+                       if ( bUsePassedData )
+                       {
+                               for ( i=0 ; i<oInit.aaData.length ; i++ )
+                               {
+                                       _fnAddData( oSettings, oInit.aaData[ i ] );
+                               }
+                       }
+                       else
+                       {
+                               /* Grab the data from the page */
+                               _fnGatherData( oSettings );
+                       }
+                       
+                       /* Copy the data index array */
+                       oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+                       
+                       /* Initialisation complete - table can be drawn */
+                       oSettings.bInitialised = true;
+                       
+                       /* Check if we need to initialise the table (it might not have been handed off to the
+                        * language processor)
+                        */
+                       if ( bInitHandedOff === false )
+                       {
+                               _fnInitalise( oSettings );
+                       }
+               });
+       };
+})(jQuery, window, document);
+
diff --git a/static/js/jquery.min.js b/static/js/jquery.min.js
new file mode 100644 (file)
index 0000000..f78f96a
--- /dev/null
@@ -0,0 +1,16 @@
+/*!
+ * jQuery JavaScript Library v1.5.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Mar 31 15:28:23 2011 -0400
+ */
+(function(a,b){function ci(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cf(a){if(!b_[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";b_[a]=c}return b_[a]}function ce(a,b){var c={};d.each(cd.concat.apply([],cd.slice(0,b)),function(){c[this]=a});return c}function b$(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bZ(){try{return new a.XMLHttpRequest}catch(b){}}function bY(){d(a).unload(function(){for(var a in bW)bW[a](0,1)})}function bS(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bR(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bQ(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bs.test(a)?e(a,f):bQ(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bQ(a+"["+f+"]",b[f],c,e)}function bP(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bJ,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bP(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bP(a,c,d,e,"*",g));return l}function bO(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bD),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bq(a,b,c){var e=b==="width"?bk:bl,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function bc(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function bb(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function ba(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function _(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function $(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Q(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(L.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function P(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function H(a,b){return(a&&a!=="*"?a+".":"")+b.replace(t,"`").replace(u,"&")}function G(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p=[],q=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(r,"")===a.type?q.push(g.selector):t.splice(i--,1);f=d(a.target).closest(q,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){f=p[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function E(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function y(){return!0}function x(){return!1}function i(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function h(a,c,e){if(e===b&&a.nodeType===1){e=a.getAttribute("data-"+c);if(typeof e==="string"){try{e=e==="true"?!0:e==="false"?!1:e==="null"?null:d.isNaN(e)?g.test(e)?d.parseJSON(e):e:parseFloat(e)}catch(f){}d.data(a,c,e)}else e=b}return e}var c=a.document,d=function(){function G(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(G,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x,y,z=Object.prototype.toString,A=Object.prototype.hasOwnProperty,B=Array.prototype.push,C=Array.prototype.slice,D=String.prototype.trim,E=Array.prototype.indexOf,F={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.2",length:0,size:function(){return this.length},toArray:function(){return C.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?B.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),x.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(C.apply(this,arguments),"slice",C.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:B,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;x.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=d._Deferred();if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",y,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",y),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&G()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):F[z.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!A.call(a,"constructor")&&!A.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||A.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:D?function(a){return a==null?"":D.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?B.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){F["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),E&&(d.inArray=function(a,b){return E.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?y=function(){c.removeEventListener("DOMContentLoaded",y,!1),d.ready()}:c.attachEvent&&(y=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",y),d.ready())});return d}(),e="then done fail isResolved isRejected promise".split(" "),f=[].slice;d.extend({_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(d,f)}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),f;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(f)return f;f=a={}}var c=e.length;while(c--)a[e[c]]=b[e[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?f.call(arguments,0):c,--g||h.resolveWith(h,f.call(b,0))}}var b=arguments,c=0,e=b.length,g=e,h=e<=1&&a&&d.isFunction(a.promise)?a:d.Deferred();if(e>1){for(;c<e;c++)b[c]&&d.isFunction(b[c].promise)?b[c].promise().then(i(c),h.reject):--g;g||h.resolveWith(h,b)}else h!==a&&h.resolveWith(h,e?[a]:[]);return h.promise()}}),function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0,reliableMarginRight:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e)}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(a.style.width="1px",a.style.marginRight="0",d.support.reliableMarginRight=(parseInt(c.defaultView.getComputedStyle(a,null).marginRight,10)||0)===0),b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function");return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}}();var g=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!i(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,g=b.nodeType,h=g?d.cache:b,j=g?b[d.expando]:d.expando;if(!h[j])return;if(c){var k=e?h[j][f]:h[j];if(k){delete k[c];if(!i(k))return}}if(e){delete h[j][f];if(!i(h[j]))return}var l=h[j][f];d.support.deleteExpando||h!=a?delete h[j]:h[j]=null,l?(h[j]={},g||(h[j].toJSON=d.noop),h[j][f]=l):g&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var f=this[0].attributes,g;for(var i=0,j=f.length;i<j;i++)g=f[i].name,g.indexOf("data-")===0&&(g=g.substr(5),h(this[0],g,e[g]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=h(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var j=/[\n\t\r]/g,k=/\s+/,l=/\r/g,m=/^(?:href|src|style)$/,n=/^(?:button|input)$/i,o=/^(?:button|input|object|select|textarea)$/i,p=/^a(?:rea)?$/i,q=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(k);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var i=0,j=b.length;i<j;i++)g.indexOf(" "+b[i]+" ")<0&&(h+=" "+b[i]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(k);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var h=(" "+g.className+" ").replace(j," ");for(var i=0,l=c.length;i<l;i++)h=h.replace(" "+c[i]+" "," ");g.className=d.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),i=b,j=a.split(k);while(f=j[g++])i=e?i:!h.hasClass(f),h[i?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(j," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var j=i?f:0,k=i?f+1:h.length;j<k;j++){var m=h[j];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(q.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(l,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&q.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=m.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&n.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var k=a.getAttributeNode("tabIndex");return k&&k.specified?k.value:o.test(a.nodeName)||p.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var l=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return l===null?b:l}h&&(a[c]=e);return a[c]}});var r=/\.(.*)$/,s=/^(?:textarea|input|select)$/i,t=/\./g,u=/ /g,v=/[^\w\s.|`]/g,w=function(a){return a.replace(v,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=x;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(a){return typeof d!=="undefined"&&d.event.triggered!==a.type?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=x);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),w).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(r,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=a.type,l[m]())}catch(p){}k&&(l["on"+m]=k),d.event.triggered=b}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,H(a.origType,a.selector),d.extend({},a,{handler:G,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,H(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?y:x):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=y;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=y;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=y,this.stopPropagation()},isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x};var z=function(a){var b=a.relatedTarget;try{if(b&&b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},A=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?A:z,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?A:z)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&E("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&E("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var B,C=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},D=function D(a){var c=a.target,e,f;if(s.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=C(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:D,beforedeactivate:D,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&D.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&D.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",C(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in B)d.event.add(this,c+".specialChange",B[c]);return s.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return s.test(this.nodeName)}},B=d.event.special.change.filters,B.focus=B.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function f(a){var c=d.event.fix(a);c.type=b,c.originalEvent={},d.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var e=0;d.event.special[b]={setup:function(){e++===0&&c.addEventListener(a,f,!0)},teardown:function(){--e===0&&c.removeEventListener(a,f,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var F={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=r.exec(h),k="",j&&(k=j[0],h=h.replace(r,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(F[h]+k),h=h+k):h=(F[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)d.event.add(n[p],"live."+H(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+H(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return"text"===c&&(b===c||b===null)},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var I=/Until$/,J=/^(?:parents|prevUntil|prevAll)/,K=/,/,L=/^.[^:#\[\.,]*$/,M=Array.prototype.slice,N=d.expr.match.POS,O={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(Q(this,a,!1),"not",a)},filter:function(a){return this.pushStack(Q(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=N.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(P(c[0])||P(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=M.call(arguments);I.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!O[a]?d.unique(f):f,(this.length>1||K.test(e))&&J.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var R=/ jQuery\d+="(?:\d+|null)"/g,S=/^\s+/,T=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,U=/<([\w:]+)/,V=/<tbody/i,W=/<|&#?\w+;/,X=/<(?:script|object|embed|option|style)/i,Y=/checked\s*(?:[^=]|=\s*.checked.)/i,Z={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};Z.optgroup=Z.option,Z.tbody=Z.tfoot=Z.colgroup=Z.caption=Z.thead,Z.th=Z.td,d.support.htmlSerialize||(Z._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(R,""):null;if(typeof a!=="string"||X.test(a)||!d.support.leadingWhitespace&&S.test(a)||Z[(U.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(T,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.length?this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&Y.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?$(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,bc)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!X.test(a[0])&&(d.support.checkClone||!Y.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){ba(a,e),f=bb(a),g=bb(e);for(h=0;f[h];++h)ba(f[h],g[h])}if(b){_(a,e);if(c){f=bb(a),g=bb(e);for(h=0;f[h];++h)_(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||W.test(i)){if(typeof i==="string"){i=i.replace(T,"<$1></$2>");var j=(U.exec(i)||["",""])[1].toLowerCase(),k=Z[j]||Z._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=V.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&S.test(i)&&m.insertBefore(b.createTextNode(S.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bd=/alpha\([^)]*\)/i,be=/opacity=([^)]*)/,bf=/-([a-z])/ig,bg=/([A-Z]|^ms)/g,bh=/^-?\d+(?:px)?$/i,bi=/^-?\d/,bj={position:"absolute",visibility:"hidden",display:"block"},bk=["Left","Right"],bl=["Top","Bottom"],bm,bn,bo,bp=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bm(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bm)return bm(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bf,bp)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bq(a,b,e):d.swap(a,bj,function(){f=bq(a,b,e)});if(f<=0){f=bm(a,b,b),f==="0px"&&bo&&(f=bo(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bh.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return be.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bd.test(f)?f.replace(bd,e):c.filter+" "+e}}),d(function(){d.support.reliableMarginRight||(d.cssHooks.marginRight={get:function(a,b){var c;d.swap(a,{display:"inline-block"},function(){b?c=bm(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bn=function(a,c,e){var f,g,h;e=e.replace(bg,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bo=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bh.test(d)&&bi.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bm=bn||bo,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var br=/%20/g,bs=/\[\]$/,bt=/\r?\n/g,bu=/#.*$/,bv=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bw=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bx=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,by=/^(?:GET|HEAD)$/,bz=/^\/\//,bA=/\?/,bB=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bC=/^(?:select|textarea)/i,bD=/\s+/,bE=/([?&])_=[^&]*/,bF=/(^|\-)([a-z])/g,bG=function(a,b,c){return b+c.toUpperCase()},bH=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bI=d.fn.load,bJ={},bK={},bL,bM;try{bL=c.location.href}catch(bN){bL=c.createElement("a"),bL.href="",bL=bL.href}bM=bH.exec(bL.toLowerCase())||[],d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bI)return bI.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("<div>").append(c.replace(bB,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bC.test(this.nodeName)||bw.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(bt,"\r\n")}}):{name:b.name,value:c.replace(bt,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bL,isLocal:bx.test(bM[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bO(bJ),ajaxTransport:bO(bK),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bR(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bS(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bF,bG)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bv.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bu,"").replace(bz,bM[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bD),e.crossDomain==null&&(q=bH.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bM[1]||q[2]!=bM[2]||(q[3]||(q[1]==="http:"?80:443))!=(bM[3]||(bM[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bP(bJ,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!by.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(bA.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bE,"$1_="+w);e.url=x+(x===e.url?(bA.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bP(bK,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bQ(g,a[g],c,f);return e.join("&").replace(br,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bT=d.now(),bU=/(\=)\?(&|$)|\?\?/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bT++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bU.test(b.url)||f&&bU.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bU,l),b.url===j&&(f&&(k=k.replace(bU,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bV=d.now(),bW,bX;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bZ()||b$()}:bZ,bX=d.ajaxSettings.xhr(),d.support.ajax=!!bX,d.support.cors=bX&&"withCredentials"in bX,bX=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),!a.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bW[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bW||(bW={},bY()),h=bV++,g.onreadystatechange=bW[h]=c):c()},abort:function(){c&&c(0,1)}}}});var b_={},ca=/^(?:toggle|show|hide)$/,cb=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cc,cd=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(ce("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cf(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ce("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(ce("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cf(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(ca.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=cb.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:ce("show",1),slideUp:ce("hide",1),slideToggle:ce("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!cc&&(cc=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(cc),cc=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var cg=/^t(?:able|d|h)$/i,ch=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=ci(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!cg.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=(e==="absolute"||e==="fixed")&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=ch.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!ch.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=ci(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=ci(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window);
\ No newline at end of file
diff --git a/static/lock.png b/static/lock.png
new file mode 100644 (file)
index 0000000..7aac977
Binary files /dev/null and b/static/lock.png differ
diff --git a/static/m_grnet_logo.png b/static/m_grnet_logo.png
new file mode 100644 (file)
index 0000000..d7d9c9a
Binary files /dev/null and b/static/m_grnet_logo.png differ
diff --git a/static/rule.png b/static/rule.png
new file mode 100644 (file)
index 0000000..909c5a8
Binary files /dev/null and b/static/rule.png differ
diff --git a/static/vncviewer.jar b/static/vncviewer.jar
new file mode 100644 (file)
index 0000000..9916d39
Binary files /dev/null and b/static/vncviewer.jar differ
diff --git a/templates/403.html b/templates/403.html
new file mode 100644 (file)
index 0000000..5c00412
--- /dev/null
@@ -0,0 +1,7 @@
+{% extends "base.html" %}
+
+{% block title %}Access denied{% endblock %}
+{% block content %}
+<h3 align="center">Access denied</h3>
+<h4 align="center">You do not have sufficient privileges</h4>
+{% endblock %}
diff --git a/templates/404.html b/templates/404.html
new file mode 100644 (file)
index 0000000..6432345
--- /dev/null
@@ -0,0 +1,7 @@
+{% extends "base.html" %}
+
+{% block title %}Page not found{% endblock %}
+{% block content %}
+<h3 align="center">Page not found</h3>
+<h4 align="center">The page that you requested was not found.</h4>
+{% endblock %}
diff --git a/templates/500.html b/templates/500.html
new file mode 100644 (file)
index 0000000..c2ececa
--- /dev/null
@@ -0,0 +1,7 @@
+{% extends "base.html" %}
+
+{% block title %}Access denied{% endblock %}
+{% block content %}
+<h3 align="center">Internal error</h3>
+<h4 align="center">Our administrators have been notified with this problem. We apologize for the inconvenience.</h4>
+{% endblock %}
diff --git a/templates/application_list.html b/templates/application_list.html
new file mode 100644 (file)
index 0000000..845f2da
--- /dev/null
@@ -0,0 +1,24 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{% trans "Application submitted" %}{% endblock %}
+{% block content %}
+<div align="center">
+{% if pending %}
+<h2>{% trans "Pending applications" %}</h2>
+<table>
+<tr><th>{% trans "Hostname" %}</th><th>{% trans "User" %}</th><th>{% trans "Memory" %}</th><th>{% trans "vCPUs" %}</th><th>{% trans "Network" %}</th><th>{% trans "Filed" %}</th></tr>
+{% for app in pending %}
+<tr><td><a href="{% url application-review app.pk %}">{{ app.hostname }}</a></td><td>{{ app.applicant }}</td><td>{{ app.memory }}</td><td>{{ app.vcpus }}</td><td>{{ app.network|default_if_none:"&mdash;" }}</td><td>{{ app.filed|date }}</td></tr>
+{% endfor %}
+</table>
+{% endif %}
+
+<h2>{% trans "Completed applications" %}</h2>
+<table>
+<tr><th>{% trans "Hostname" %}</th><th>{% trans "User" %}</th><th>{% trans "Memory" %}</th><th>{% trans "vCPUs" %}</th><th>{% trans "Network" %}</th><th>{% trans "Filed" %}</th></tr>
+{% for app in completed %}
+<tr><td><a href="{% url application-review app.pk %}">{{ app.hostname }}</a></td><td>{{ app.applicant }}</td><td>{{ app.memory }}</td><td>{{ app.vcpus }}</td><td>{{ app.network|default_if_none:"&mdash;" }}</td><td>{{ app.filed|date }}</td></tr>
+{% endfor %}
+</table>
+</div>
+{% endblock %}
diff --git a/templates/application_rejected_mail.txt b/templates/application_rejected_mail.txt
new file mode 100644 (file)
index 0000000..c8a6798
--- /dev/null
@@ -0,0 +1,6 @@
+Η αίτησή σας #{{ application.pk }} για τη δημιουργία εικονικής μηχανής με όνομα
+{{ application.hostname }} απορρίφθηκε για τους παρακάτω λόγους:
+
+{{ application.admin_comments }}
+
+Για το ΚΕΔ ΕΔΕΤ
diff --git a/templates/apply.html b/templates/apply.html
new file mode 100644 (file)
index 0000000..23b15f1
--- /dev/null
@@ -0,0 +1,96 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{% trans "Create new Virtual Machine" %}{% endblock %}
+{% block breadcrumbs %}:: {% trans "Create Instance" %}{% endblock %}
+{% block content %}
+<style type="text/css">
+th {
+       text-align: right;
+       padding-right: 0.5em;
+       vertical-align: top;
+}
+
+.help {
+       font-style: italic;
+
+}
+</style>
+
+<div align="center">
+<h3>{% trans "Apply for a new instance" %}</h3>
+<form method="POST">
+{% csrf_token %}
+<fieldset>
+<legend>{% trans "Instance information" %}</legend>
+<table>
+<tr><th>{{ form.hostname.label_tag }}</th><td>{{ form.hostname }}<span class="error">{{ form.hostname.errors|join:", " }}</span></td></tr>
+<tr class="help"><td></td><td>{{ form.hostname.help_text }}</td></tr>
+<tr><th>{{ form.memory.label_tag }}</th><td>{{ form.memory }}<span class="error">{{ form.memory.errors|join:", " }}</span></td></tr>
+<tr><th>{{ form.vcpus.label_tag }}</th><td>{{ form.vcpus }}<span class="error">{{ form.vcpus.errors|join:", " }}</span></td></tr>
+<tr><th>{{ form.disk_size.label_tag }}</th><td>{{ form.disk_size }}<span class="error">{{ form.disk_size.errors|join:", " }}</span></td></tr>
+<tr class="help"><td></td><td>{{ form.disk_size.help_text }}</td></tr>
+<tr><th>{{ form.hosts_mail_server.label_tag }}</th><td>{{ form.hosts_mail_server }}<span class="error">{{ form.hosts_mail_server.errors|join:", " }}</span></td></tr>
+<tr class="help"><td></td><td>{{ form.hosts_mail_server.help_text }}</td></tr>
+<tr><th>{{ form.operating_system.label_tag }}</th><td>{{ form.operating_system }}<span class="error">{{ form.operating_system.errors|join:", " }}</span></td></tr>
+{% if form.network %}
+<tr><th>{{ form.network.label_tag }}</th><td>{{ form.network }}<span class="error">{{ form.network.errors|join:", " }}</span></td></tr>
+<tr class="help"><td></td><td>{{ form.network.help_text|linebreaks }}</td></tr>
+{% endif %}
+</table>
+</fieldset>
+
+<fieldset>
+<legend>{% trans "Use/Comments" %}</legend>
+{% blocktrans %}
+<p>Give a short description of the intended use of this virtual machine, that justifies the parameter selection above. Feel free to include any additional comments.</p>
+{% endblocktrans %}
+<p>{{ form.comments }}
+{% if form.errors %}<br /><span class="error">{{ form.comments.errors|join:", " }}</span>{% endif %}
+</p>
+</fieldset>
+
+<fieldset>
+<legend>{% trans "Administrative contact" %}</legend>
+{% blocktrans %}
+<p>If you are applying on behalf of a NOC under GRNET's constituency, please select the appropriate organization. Otherwise, fill-in the admin contact information below.</p>
+{% endblocktrans %}
+
+{% if form.non_field_errors %}
+<p class="error">{{ form.non_field_errors|join:", "}}</p>
+{% endif %}
+
+<table>
+<tr><th>{{ form.organization.label_tag }}</th><td>{{ form.organization }}<span class="error">{{ form.organization.errors|join:", " }}</span></td></tr>
+
+
+<tr><td colspan="3"><div align="center">{% trans "OR" %}</div></td></tr>
+
+
+<tr><th colspan="3"><div align="center">{% trans "Administrative contact" %}</div></th></tr>
+<tr><th>{% trans "Name" %}</th><td>{{ form.admin_contact_name }}<span class="error">{{ form.admin_contact_name.errors|join:", " }}</span></td></tr>
+<tr><th>E-mail</th><td>{{ form.admin_contact_email }}<span class="error">{{ form.admin_contact_email.errors|join:", " }}</span></td></tr>
+<tr><th>{% trans "Phone" %}</th><td>{{ form.admin_contact_phone }}<span class="error">{{ form.admin_contact_phone.errors|join:", " }}</span></td></tr>
+</table>
+</fieldset>
+
+<fieldset>
+<legend>{% trans "Miscellaneous" %}</legend>
+{% blocktrans %}
+<p>We kindly remind you of the following:</p>
+<ul align="left">
+<li>You are solely responsible for the data on your VM. You have to take care of back-ups etc.</li>
+<li>We reserve the right to temporarily suspend the operation of your VM in case it causes malfunctions to our infrastructure</li>
+</ul>
+{% endblocktrans %}
+<p>{{ form.accept_tos }} {% trans "I have read the above and accept them, along with the" %} <a href="/about/terms-of-service/" target="_blank">{% trans "Terms of Service" %}</a></p>
+{% if form.accept_tos.errors %}
+<p class="error">
+{% trans "You must accept the terms of service before continuing." %}
+</p>
+{% endif %}
+</fieldset>
+
+<p><input type="submit" value="{% trans "Apply" %}" /></p>
+</form>
+</div>
+{% endblock %}
diff --git a/templates/apply_mail.txt b/templates/apply_mail.txt
new file mode 100644 (file)
index 0000000..7a69f12
--- /dev/null
@@ -0,0 +1,29 @@
+Ο χρήστης {{user.username}} ({{user.first_name}} {{user.last_name}}) υπέβαλε το
+ακόλουθο αίτημα:
+{% load disksizes %}
+Παράμετροι VM
+-------------
+Όνομα: {{application.hostname}}
+Μνήμη: {{application.memory|memsize}}
+vCPUS: {{application.vcpus}}
+Δίσκος: {{application.disk_size}} GB
+Λειτουργικό σύστημα: {{application.operating_system}}
+Φιλοξενία mail server: {{application.hosts_mail_server|yesno:"Ναι,Όχι"}}
+
+{% if application.network %}Ο χρήστης ζήτησε το VM να συνδεθεί στο δίκτυο «{{ application.network }}»{% endif %}
+
+Στοιχεία επικοινωνίας:
+{% if application.organization %}
+Υπεύθυνος φορέας: {{ application.organization }} {% else %}
+Διαχειριστικός υπεύθυνος
+------------------------
+{{ application.admin_contact_name }}
+{{ application.admin_contact_email }}
+{{ application.admin_contact_phone }}{% endif %}
+
+{% if application.comments %}
+Σχόλια
+------
+{{ application.comments }} {% endif %}
+
+Για να διαχειριστείτε το αίτημα, επισκευθείτε το {{url}}
diff --git a/templates/base.html b/templates/base.html
new file mode 100644 (file)
index 0000000..19973f0
--- /dev/null
@@ -0,0 +1,100 @@
+{% load i18n %}
+<html>
+<head>
+<title>GRNET's FoD :: {% block title %}{% endblock %} </title>
+<script src="/static/js/jquery.min.js" type="text/javascript"></script>
+<link rel="stylesheet" type="text/css" href="/static/css/base.css">
+<link rel="stylesheet" type="text/css" href="/static/css/smoothness/jquery-ui-1.8.13.custom.css">
+<script type="text/javascript" src="/static/js/jquery-ui-1.8.12.custom.min.js"></script>
+<script type="text/javascript">
+
+       function setlang(lang){
+               $("#langsel").val(lang);
+               $("#langform").submit();
+       }
+
+//function highlight(elemId){
+//    var elem = $(elemId);
+//    elem.css("background-color", "#ffffbb");
+//    setTimeout(function() { $(elemId).animate({ backgroundColor: "white" }, 2000)}, 1500);
+//}
+//
+//   
+//$(document).ready( function(){
+//     if (document.location.hash) {
+//         highlight(document.location.hash);
+//     }
+//     $('a[href*=#]').click(function(){
+//         var elemId = '#' + $(this).attr('href').split('#')[1];
+//         highlight(elemId);
+//     });
+//});
+
+</script>
+{% block extrahead %}{% endblock %}
+</head>
+
+
+
+<body>
+       <div id="main">
+                       <div id="header">
+                               <a class="grnetlogo" href="/">
+                                       <img class="logoimg" src="/static/grnet_logo.png">
+                               </a>
+                               <div id="title">
+                                       <a href="/">Firewall on Demand</a>
+                               </div>
+                               <div class="loginform">
+                                       <div id="formcontent">
+                                               {% if user.is_authenticated %}
+                                               <span class="topmenuuser">{% trans "Welcome" %} <strong>{{user}}</strong></span>
+                                               {% endif %}
+                                               <span {% if user.is_authenticated %}class="topmenuaction"{% else %}class="topmenuuser"{% endif %} >
+                                                       <form action="{% url django.views.i18n.set_language %}" method="post" style="display:inline;" id="langform">
+                                                               {% csrf_token %}
+                                                               <input name="next" type="hidden" value="{{ next }}" />
+                                                               <input id="langsel" name="language" type="hidden" value="" />
+                                                               {% for lang in LANGUAGES %}<a class="select_lang" href="#" onclick="setlang('{{ lang.0 }}'); return false;" title="{{lang.1}}">{% ifnotequal LANGUAGE_CODE lang.0 %}<font style="font-weight:normal;">{% endifnotequal %}{% trans lang.1 %}{% ifnotequal LANGUAGE_CODE lang.0 %}</font>{% endifnotequal %}</a>{% if not forloop.last %} -{% endif %}
+                                                               {% endfor %}
+                                                       </form>
+                                               </span>
+                                               {% if user.is_authenticated %}
+                                               <span class="topmenuaction"><a href="">{% trans "My profile" %}</a></span>
+{% if user.is_superuser %}
+                                               <span class="topmenuaction"><a href="{% url admin:index %}">{% trans "Admin" %}</a></span>
+{% endif %}
+                                               <span class="topmenuaction"><a href="{% url logout %}">{% trans "Logout" %}</a></span>
+                                               {% else %}
+                                               <span class="topmenuaction"><a href="{% url login %}">{% trans "Login" %}</a></span>
+                                               {% endif %}
+                                       </div>
+                                       
+                               </div>
+                       </div>
+                       <div id="content">
+                               {% block brcrmb_container %}
+                               <div class="info_content_title">{% if user.is_authenticated %}<a href="/">{% trans "My routes" %}</a>{% endif %}
+                               {% block breadcrumbs %}{% endblock %}
+                               </div>
+                               {% if messages %}
+                               <div id="messages">
+                               {% for message in messages %}
+                                       <span{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</span><br />
+                               {% endfor %}
+                               </div>
+                               {% endif %}
+                               {% endblock %}
+                               {% block content %}
+                               {% endblock %}
+
+                       </div>
+                       <div id="footer">
+                       {% if user.is_authenticated %}
+                       {% trans "If you have any questions or need help, contact GRNET Helpdesk at <a href='mailto:helpdesk@grnet.gr'>helpdesk@grnet.gr</a> or 800-11-47638." %}<br />
+                       {% endif %}
+                       <a href="http://www.grnet.gr">{% trans "GRNET" %} NOC</a> | <a href="/about/info/">{% trans "Info" %}</a> | <a href="/about/terms-of-service">{% trans "Service Terms" %}</a>
+                       </div>
+       </div>
+</body>
+</html>
diff --git a/templates/cluster.html b/templates/cluster.html
new file mode 100644 (file)
index 0000000..10a152c
--- /dev/null
@@ -0,0 +1,57 @@
+{% extends "base.html" %}
+{% block extrahead %}
+<script type="text/javascript" src="/static/js/jquery.dataTables.js"></script>
+<script type="text/javascript">
+       $(document).ready( function(){
+                       $('#vm_instance_table').dataTable( {
+                       "bJQueryUI": true,
+                       "oLanguage": {
+                               "sLengthMenu": 'Display <select><option value="25">25</option><option value="50">50</option><option value="-1">All</option></select> instances'
+                       },
+                       "iDisplayLength": 25,
+       } );
+               });
+</script>
+{% endblock %}
+{% block title %}{{ object.hostname|safe }}{% endblock %}
+{% block content %}
+
+<h3>Cluster {{ object.hostname }}</h3>
+
+<table class="display" width="100%" id="vm_instance_table">
+<thead>
+<tr><th>Name</th><th>Primary node</th>
+<th>Memory</th><th>Current memory</th><th>Status</th></tr>
+</thead>
+<tbody>
+{% for instance in object.get_instances %}
+{% for myuser in instance.users %}
+{% ifequal myuser user %}
+
+<tr {% if instance.admin_state %} class="GradeA" {% else %} class="GradeX" {% endif %}><td><a href="{% url instance-detail object.slug instance.name %}">{{ instance.name }}</a></td>
+<td>{{ instance.pnode }}</td><td>{{ instance.beparams.memory }}</td><td>{{ instance.oper_ram }}</td>
+<td>{% ifequal instance.admin_state instance.oper_state %}
+{{ instance.admin_state|yesno:"Running,Stopped" }}
+{% else %}
+{{ instance.oper_state|yesno:"Running,Stopped" }}, should be {{ instance.admin_state|yesno:"running,stopped" }}
+{% endifequal %}
+</td></tr>
+
+{% endifequal %}
+{% endfor %}
+{% endfor %}
+</tbody>
+</table>
+{% with object.get_cluster_info as info %}
+<table class="instances_table" width="35%">
+<tr><th class="table_top_header" colspan=2>Cluster Details</th></tr>
+<tr><td class="table_title">Architecture</td><td>{{ info.architecture.0 }}</td></tr>
+<tr><td class="table_title">Default hypervisor</td><td>{{ info.default_hypervisor }}</td></tr>
+<tr><td class="table_title">Available hypervisors</td><td>{{ info.enabled_hypervisors|join:", " }}</td></tr>
+<tr><td class="table_title">Master node</td><td>{{ info.master }}</td></tr>
+<tr><td class="table_title">Created</td><td>{% if info.ctime %}{{ info.ctime|date }}{% else %}<em>unknown</em>{% endif %}</td></tr>
+<tr><td class="table_title">Last modified</td><td>{{ info.mtime|date }}</td></tr>
+</table>
+{% endwith %}
+
+{% endblock %}
diff --git a/templates/flatpages/default.html b/templates/flatpages/default.html
new file mode 100644 (file)
index 0000000..839383a
--- /dev/null
@@ -0,0 +1,9 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block title %}{{ flatpage.title }}{% endblock %}
+{% block breadcrumbs %}:: {% trans flatpage.title %}{% endblock %}
+
+{% block content %}
+{{ flatpage.content|linebreaks }}
+{% endblock %}
diff --git a/templates/index.html b/templates/index.html
new file mode 100644 (file)
index 0000000..b85c39c
--- /dev/null
@@ -0,0 +1,60 @@
+{% extends "base.html" %}
+{% block title %}Overview{% endblock %}
+{% block extrahead %}
+<script type="text/javascript" src="/static/js/jquery.dataTables.js"></script>
+<script type="text/javascript">
+       $(document).ready( function(){
+                       $('#cluster_overview_table').dataTable( {
+                       "bJQueryUI": true,
+                       "oLanguage": {
+                                               "sLengthMenu": 'Display <select><option value="25">25</option><option value="50">50</option><option value="-1">All</option></select> clusters'
+                                       },
+                       "iDisplayLength": 25,
+       } );
+               });
+</script>
+{% endblock %}
+{% block content %}
+<h3>Clusters Overview</h3>
+<table class="display" width="100%" id="cluster_overview_table">
+       <thead>
+               <tr>
+                       <th>Cluster</th>
+                       <th>Nodes</th>
+                       <th>Hypervisors</th>
+                       <th>Default hypervisor</th>
+                       <th>Master node</th>
+                       <th>Ganeti version</th> 
+               </tr>
+       </thead>
+       <tbody>
+{% for cluster in object_list %}
+       <tr class="GradeA">
+               <td>
+                       <a href="{% url cluster_detail cluster.slug %}">{{ cluster.hostname }}</a>
+               </td>
+               <td>
+                               {% with cluster.get_cluster_nodes as nodes %}
+                               <!--{{ nodes|length }} node{{ nodes|pluralize }}-->
+                               
+                               {% for node in nodes %}
+                                       <div>{{ node.id }}</div>
+                               {% endfor %}
+                               
+                               {% endwith %}
+               </td>
+
+               {% with cluster.get_cluster_info as info %}
+               <td>{{ info.enabled_hypervisors|join:", " }}</td>
+               <td>{{ info.default_hypervisor }}</td>
+               <td>{{ info.master }}</td>
+               <td>{{ info.software_version }}</td>
+               {% endwith %}
+
+       </tr>
+
+{% endfor %}
+</tbody>
+</table>
+
+{% endblock %}
diff --git a/templates/instance.html b/templates/instance.html
new file mode 100644 (file)
index 0000000..44af881
--- /dev/null
@@ -0,0 +1,86 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{{ instance.name }} on {{ instance.cluster.description }}{% endblock %}
+{% block extrahead %}
+<style type="text/css">
+               #toolbar {
+               padding: 10px 4px;
+       }
+
+</style>
+<script type="text/javascript">
+var polltimer;
+var timer = 2500;
+var load_data = function () {
+        $.ajax({
+            type: 'GET',
+            url: '{% url instance-poll cluster.slug instance.name %}',
+            dataType: 'html',
+            success: function(data) {
+                $('#actions_container').html(data);
+                               if ($('#show_no_actions').size()==1){
+                                       $('#conf_form').hide();
+                               }else if ($('#show_no_actions').size()==0){
+                                       $('#conf_form').show();
+                               }
+                               $("#status").html($("#instance_status").html());
+                polltimer = setTimeout(load_data, timer);
+            }
+        });
+    }
+$(function() {
+    load_data();
+});
+
+</script>
+{% endblock %}
+
+{% block breadcrumbs %}:: {{ instance.name }} {% endblock %}
+
+{% block content %}
+{% load disksizes %}
+
+
+<h3>{{ instance.name }}</h3>
+<div id="fl_l">
+<table class="instance_det_table">
+<tr><th class="table_top_header" colspan=2>{% trans "Details" %}</th></tr>
+<tr><td class="table_title">{% trans "Status" %}</td><td id="status"></td></tr>
+<tr><td class="table_title">{% trans "Cluster" %}</td><td>{{ instance.cluster.description }}</td></tr>
+<tr><td class="table_title">{% trans "Memory" %}</td><td>{{ instance.beparams.memory|memsize }}</td></tr>
+<tr><td class="table_title">{% trans "CPUs" %}</td><td>{{ instance.beparams.vcpus }}</td></tr>
+<tr><td class="table_title">Hard disk{{ instance.disk_sizes|pluralize }}</td><td>{{ instance.disk_sizes|disksizes|join:", " }}</td></tr>
+<tr><td class="table_title">{% trans "Network cards" %}</td><td>{{ instance.nic_macs|length }}</td></tr>
+<tr><td class="table_title">MAC address{{ instance.nic_macs|pluralize:"es" }}</td><td>{{ instance.nic_macs|join:", " }}</td></tr>
+{% if instance.nic_ips %}
+<tr><td class="table_title">IP address{{ instance.nic_ips|pluralize:"es" }}</td><td>{{ instance.nic_ips|join:", " }}</td></tr>
+{% endif %}
+<tr><td class="table_title">{% trans "Created on" %}</td><td>{{ instance.ctime|date }}</td></tr>
+<tr><td class="table_title">{% trans "Last modified" %}</td><td>{{ instance.mtime|date }}</td></tr>
+</table>
+</div>
+
+
+<div id="configuration">
+
+<form method="post" align="center" id="conf_form">
+{% csrf_token %}
+<table class="conf_table">
+       <tr><th colspan="2" style="text-align:center;" class="table_topper_header">{% trans "Configuration" %}</th></tr>
+{{ configform.as_table }}
+<tr><td colspan="2" style="text-align:center; padding: 5px;" ><input style="font-size: 12px;" id="update" type="Submit" value="Update" /></td></tr>
+
+</table>
+
+</form>
+
+<table class="actions_table">
+<tr><th class="table_top_header" colspan=3 style="text-align: center;">{% trans "Actions" %}</th></tr>
+<tr>
+       <td id="actions_container">&nbsp;</td>
+               <!-- Here a setTimeout jquery script populates the instance control every 5 seconds -->
+</tr>
+</table>
+</div>
+
+{% endblock %}
diff --git a/templates/instance_actions.html b/templates/instance_actions.html
new file mode 100644 (file)
index 0000000..c64ba03
--- /dev/null
@@ -0,0 +1,110 @@
+<script type="text/javascript">
+       $(function(){
+               $( "#start" )
+               .button({
+                       icons: {
+                               secondary: "ui-icon-play"
+                       }
+               });
+                       
+               $( "#shutdown" )
+               .button({
+                       icons: {
+                               secondary: "ui-icon-power"
+                       }
+               });
+                       
+               $( "#reboot" )
+               .button({
+                       icons: {
+                               secondary: "ui-icon-arrowrefresh-1-s"
+                       }
+               });
+
+                       
+               $( "#console" )
+               .button({
+                       icons: {
+                               secondary: "ui-icon-image"
+                       }
+               });
+               $( "#update" )
+               .button({
+                       icons: {
+                               secondary: "ui-icon-check"
+                       }
+               });
+               
+       $( "#start" )
+       .click(function() {
+               clearTimeout(polltimer);
+               $.ajax({
+        type: 'POST',
+        url: "{% url instance-startup cluster.slug instance.name %}",
+        dataType: 'json',
+        success: function(data) {
+                       $("#actions_container_inner").empty();
+                       $("#actions_container_inner").html("<td>"+data.action+"<td>");
+                       setTimeout(load_data, 0);
+
+        }
+    });         
+               return false; });
+               
+       $( "#shutdown" )
+       .click(function() {
+               clearTimeout(polltimer);
+               $.ajax({
+        type: 'POST',
+        url: "{% url instance-shutdown cluster.slug instance.name %}",
+        dataType: 'json',
+        success: function(data) {
+                       $("#actions_container_inner").empty();
+                       $("#actions_container_inner").html("<td>"+data.action+"<td>");
+                       setTimeout(load_data, 0);
+                       
+        }
+    });         
+               return false; });
+               
+       $( "#reboot" )
+       .click(function() {
+               clearTimeout(polltimer);
+               $.ajax({
+        type: 'POST',
+        url: "{% url instance-reboot cluster.slug instance.name %}",
+        dataType: 'json',
+        success: function(data) {
+                       $("#actions_container_inner").empty();
+                       $("#actions_container_inner").html("<td>"+data.action+"<td>");
+                       setTimeout(load_data, 0);
+
+        }
+    });         
+               return false; });       
+                       
+});
+</script>
+{% load i18n %}
+<table>
+{% if not instance.is_locked %}
+       {% if instance.oper_state %}
+               <tr id="actions_container_inner">
+                       <td><a id="shutdown" href="#">{% trans "Shutdown" %}</a></td>
+                       <td><a id="reboot" href="#">{% trans "Reboot" %}</a></td>
+                       <td><a id="console" href="{% url instance-vnc cluster.slug instance.name %}">{% trans "Console" %}</a></td>
+               </tr>
+       {% else %}
+               <tr id="actions_container_inner">
+               <td colspan=3><a id="start" href="#">{% trans "Start" %}</a></td>
+               </tr>
+       {% endif %}
+{% else %}
+       <tr id="actions_container_inner">
+               <td id="show_no_actions"><em>{{ instance.is_locked|capfirst }}</em></td>
+       </tr>
+{% endif %}
+
+</table>
+
+<div id="instance_status" style="display:none;">{{ instance.oper_state|yesno:"Running,Stopped" }}</div>
diff --git a/templates/instance_created_mail.txt b/templates/instance_created_mail.txt
new file mode 100644 (file)
index 0000000..56e32f1
--- /dev/null
@@ -0,0 +1,10 @@
+Η εικονική μηχανή με όνομα {{ application.hostname }} δημιουργήθηκε.
+
+Μπορείτε να τη χειριστείτε και να δείτε τα στοιχεία της στην ακόλουθη
+διεύθυνση:
+  {{instance_url}}
+
+{% if application.admin_comments %}Σχόλια διαχειριστή:
+{{ application.admin_comments }}
+{% endif %}
+Για το ΚΕΔ ΕΔΕΤ
diff --git a/templates/instance_owners.html b/templates/instance_owners.html
new file mode 100644 (file)
index 0000000..9452424
--- /dev/null
@@ -0,0 +1,24 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{% trans "Instance owners" %}{% endblock %}
+{% block breadcrumbs %}:: {% trans "Instance owners" %}{% endblock %}
+{% block content %}
+{% regroup instances by users as user_instances %}
+
+{% for user_list in user_instances %}
+<p>
+{% for i in user_list.list %}
+<em><a href="{% url instance-detail i.cluster.slug i.name %}">{{ i.name }}</a></em><br />
+{% endfor %}
+</p>
+
+<table>
+<tr><th>{% trans "Username" %}</th><th>{% trans "Name" %}</th><th>{% trans "E-mail" %}</th></tr>
+{% for u in user_list.grouper %}
+<tr><td>{{ u.username }}</td><td>{{ u.get_full_name }}</td><td>{{ u.email }}</td></tr>
+{% endfor %}
+</table>
+<hr />
+
+{% endfor %}
+{% endblock %}
diff --git a/templates/login.html b/templates/login.html
new file mode 100644 (file)
index 0000000..e42cef0
--- /dev/null
@@ -0,0 +1,39 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{% trans "Login" %}{% endblock %}
+{% block brcrmb_container %}{% endblock %}
+{% block content %}
+<div id="welcome">
+<h3>{% trans "Welcome" %}</h3>
+{% blocktrans %}
+<p>Welcome to GRNET's ViMa service.</p>
+<p>If you are new to the service, take some time to read the service description <a href="/about/info">here</a> and then register for a new account.</p>
+<p>If you already have an account, you can log in using the form on the right.</p>
+<p>For troubleshooting info and remarks do not hesitate to contact GRNET's Helpdesk.</p>
+{% endblocktrans %}</p>
+</div>
+
+<div id="loginform">
+<h3>{% trans "Login" %}</h3>
+{% if form.errors %}
+<p  class="error" style="color:red">{% trans "Your username and password didn't match. Please try again." %}</p>
+{% endif %}
+
+<form method="post" action="{% url login %}">
+{% csrf_token %}
+<table>
+<tr>
+    <td>{{ form.username.label_tag }}</td>
+    <td>{{ form.username }}</td>
+</tr>
+<tr>
+    <td>{{ form.password.label_tag }}</td>
+    <td>{{ form.password }}</td>
+</tr>
+</table>
+
+<input type="submit" value="{% trans "Login" %}" />
+<input type="hidden" name="next" value="/" />
+</form>
+</div>
+{% endblock %}
diff --git a/templates/m_base.html b/templates/m_base.html
new file mode 100644 (file)
index 0000000..5c0de3f
--- /dev/null
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+       <meta charset="utf-8">
+       <meta name="viewport" content="width=device-width, minimum-scale=1, maximum-scale=1">
+       <title>GRNET VM mgmt</title>
+       <link rel="stylesheet"  href="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.css" />
+       <script type="text/javascript" src="http://code.jquery.com/jquery-1.5.min.js"></script>
+
+       <script type="text/javascript" src="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.js"></script>
+</head> 
+<body>
+<div data-role="page" data-theme="b" id="grnet_vm">
+       <!-- start header -->
+<div data-role="header" data-nobackbtn="true" data-backbtn="false">
+       {% block headerextras %}{%endblock%}
+       <h1>GRNET VM mgmt</h1>
+       {% if not user.is_authenticated %}
+       <a href="{% url loginpage %}" data-rel="dialog" class="ui-btn-right">Login</a>
+       {% else %}<a class="ui-btn-right" href="{% url logout %}" rel="external">Logout</a> {% endif %}
+</div>
+<!-- end header -->
+       
+       <div data-role="content">
+               {% block content %}{% endblock %}
+       </div>
+</div>
+</body>
+</html>
diff --git a/templates/m_cluster.html b/templates/m_cluster.html
new file mode 100644 (file)
index 0000000..458cf0d
--- /dev/null
@@ -0,0 +1,29 @@
+{% extends "m_base.html" %}
+
+{% block headerextras %}
+<a href="/" data-icon="arrow-l">Clusters</a>
+{% endblock %}
+{% block content %}
+
+<ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">
+                       <li data-role="list-divider">VMs at {{object.hostname}}</li>
+                       {% for instance in object.get_instances %}
+{% for myuser in instance.users %}
+{% ifequal myuser user %}
+<li><a href="{% url instance-detail object.slug instance.name %}">
+       <h3>{{ instance.name }}</h3>
+       <p><strong>Status</strong>:{% ifequal instance.admin_state instance.oper_state %}
+{{ instance.admin_state|yesno:"Running,Stopped" }}
+{% else %}
+{{ instance.oper_state|yesno:"Running,Stopped" }}, should be {{ instance.admin_state|yesno:"running,stopped" }}
+{% endifequal %}</p>
+<p><strong>Pnode</strong>:{{ instance.pnode }}</p>
+<p><strong>Mem</strong>:{{ instance.beparams.memory }}</p>
+       </a></li>
+{% endifequal %}
+{% endfor %}
+                       
+                       {% endfor %}
+               </ul>
+               
+{% endblock %}
diff --git a/templates/m_index.html b/templates/m_index.html
new file mode 100644 (file)
index 0000000..343a938
--- /dev/null
@@ -0,0 +1,15 @@
+{% extends "m_base.html" %}
+{% block content %}
+<ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">
+                       <li data-role="list-divider">Clusters</li>
+                       {% for cluster in object_list %}
+                       <li><a href="{% url cluster_detail cluster.slug %}">
+                               <h3>{{ cluster.hostname }}</h3>
+                               {% with cluster.get_cluster_info as info %}
+                               <p><strong>Ganeti version</strong>: {{ info.software_version }}</p>
+                               <p><strong>Master node</strong>: {{ info.master }}</p>
+                               {% endwith %}
+                               </a></li>
+                       {% endfor %}
+               </ul>
+{% endblock %}
diff --git a/templates/m_instance.html b/templates/m_instance.html
new file mode 100644 (file)
index 0000000..b1bea22
--- /dev/null
@@ -0,0 +1,51 @@
+{% extends "m_base.html" %}
+{% load truncatedchars %}
+{% block headerextras %}
+<a href="{% url cluster_detail cluster.slug %}" data-icon="arrow-l">{{ cluster.hostname|truncchar:10 }}</a>
+{% endblock %}
+
+{% block content %}
+
+<h3>{{ instance.name }}</h3>
+<div class="ui-grid-a">
+       {% if instance.oper_state %}
+       {% if instance.admin_state %}
+
+<div class="ui-block-a"><a data-role="button" href="{% url instance-reboot cluster.slug instance.name %}">Reboot</a></div>
+       <div class="ui-block-b"><a data-role="button" href="{% url instance-shutdown cluster.slug instance.name %}" data-theme="a">Shutdown</a></div>
+       {% else %} 
+       <em>Instance is shutting down, no actions allowed</em>
+       {% endif %}
+{% else %}
+<a data-role="button" href="{% url instance-startup cluster.slug instance.name %}">Start</a>
+{% endif %}
+
+</div><!-- /grid-a -->
+
+<!--<div id="configuration">
+{% ifnotequal instance.oper_state instance.admin_state %}
+<em>No configuration allowed at this time</em>
+{% else %}
+<form method="post" align="center">
+    {% csrf_token %}
+    {% for field in configform %}
+        <div data-role="fieldcontain">
+           {{ field.label_tag }}: {{ field }}
+        </div>
+    {% endfor %}
+
+               <div class="ui-body ui-body-b">
+               <fieldset class="ui-grid-a">
+                               <div class="ui-block-a"><button type="submit" data-theme="d">Cancel</button></div>
+                               <div class="ui-block-b"><button type="submit" data-theme="a">Submit</button></div>
+
+           </fieldset>
+               </div>
+
+
+</form>
+{% endifnotequal %}
+</div>-->
+
+
+{% endblock %}
diff --git a/templates/m_login.html b/templates/m_login.html
new file mode 100644 (file)
index 0000000..ee14452
--- /dev/null
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+       <meta charset="utf-8">
+       <meta name="viewport" content="width=device-width, minimum-scale=1, maximum-scale=1">
+       <link rel="stylesheet"  href="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.css" />
+       <script type="text/javascript" src="http://code.jquery.com/jquery-1.5.min.js"></script>
+       <script type="text/javascript" src="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.js"></script>
+
+</head> 
+<body>
+       <div data-role="page" data-theme="b" id="jqm-home">
+
+<!-- start header -->
+<div data-role="header">
+       <h1>Login</h1>
+       <a href="/" class="ui-btn-right">Cancel</a>
+</div>
+<div data-role="content" data-inset="true">
+<!-- end header -->
+                                       {% if not user.is_authenticated %}
+                                       <form id="formcontent" method="post" action="{% url login %}">
+                                               {% csrf_token %}
+                                               <label for="username">username </label><input name="username" type="text"></input> 
+                                               <label for="password">password </label><input name="password" type="password"></input>
+                                               <input type="submit" value="login" />
+                                       </form>
+                                       {% endif %}
+                               </div>
+                               </div>
+</body>
diff --git a/templates/mail_change.html b/templates/mail_change.html
new file mode 100644 (file)
index 0000000..1709ead
--- /dev/null
@@ -0,0 +1,70 @@
+<div id="usermailchange_placeholder">
+<script>
+       $(document).ajaxSend(function(event, xhr, settings) {
+    function getCookie(name) {
+        var cookieValue = null;
+        if (document.cookie && document.cookie != '') {
+            var cookies = document.cookie.split(';');
+            for (var i = 0; i < cookies.length; i++) {
+                var cookie = jQuery.trim(cookies[i]);
+                // Does this cookie string begin with the name we want?
+                if (cookie.substring(0, name.length + 1) == (name + '=')) {
+                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
+                    break;
+                }
+            }
+        }
+        return cookieValue;
+    }
+    function sameOrigin(url) {
+        // url could be relative or scheme relative or absolute
+        var host = document.location.host; // host + port
+        var protocol = document.location.protocol;
+        var sr_origin = '//' + host;
+        var origin = protocol + sr_origin;
+        // Allow absolute or scheme relative URLs to same origin
+        return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
+            (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
+            // or any other URL that isn't scheme relative or absolute i.e relative.
+            !(/^(\/\/|http:|https:).*/.test(url));
+    }
+    function safeMethod(method) {
+        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
+    }
+
+    if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
+        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
+    }
+});
+
+       $(function() {
+       $('#change_email_btn').button();
+       $('#change_email_btn').click(function() {
+                       str = $('#change_email_form').serialize();
+            $.ajax({
+                type: "POST",
+                url: "{% url mail-change %}",
+                data: str,
+                success: function(response){
+//                                     console.log(response);
+//                                     var $response=$(response);
+//                                     var resdata =  $response.filter("#sshkeys_placeholder").html();
+                       $("#usermailchange_placeholder").html(response);
+                        }
+        });
+    return false;
+        });
+       });
+       </script>
+       {% load i18n %}
+<div>{{user}} {% trans "enter your new mail address twice so we can verify you typed it in correctly." %}</div> 
+<div>{% trans "Your e-mail" %} {% if changed %} {% trans "has successfully changed to" %} {% endif %}: <strong>{% ifequal mail|length 0 %} {% trans "you have not registered an address yet" %} {% else %}{{mail}}{% endifequal %}</strong></div>
+<form method="POST" id="change_email_form">
+{% csrf_token %}
+        <table>
+            {{ form.as_table }}
+        </table>
+<button id="change_email_btn">{% trans "Change email" %}</button>
+</form>
+
+</div>
diff --git a/templates/name_change.html b/templates/name_change.html
new file mode 100644 (file)
index 0000000..797cad7
--- /dev/null
@@ -0,0 +1,67 @@
+<div id="user_namechange_placeholder">
+<script>
+       $(document).ajaxSend(function(event, xhr, settings) {
+    function getCookie(name) {
+        var cookieValue = null;
+        if (document.cookie && document.cookie != '') {
+            var cookies = document.cookie.split(';');
+            for (var i = 0; i < cookies.length; i++) {
+                var cookie = jQuery.trim(cookies[i]);
+                // Does this cookie string begin with the name we want?
+                if (cookie.substring(0, name.length + 1) == (name + '=')) {
+                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
+                    break;
+                }
+            }
+        }
+        return cookieValue;
+    }
+    function sameOrigin(url) {
+        // url could be relative or scheme relative or absolute
+        var host = document.location.host; // host + port
+        var protocol = document.location.protocol;
+        var sr_origin = '//' + host;
+        var origin = protocol + sr_origin;
+        // Allow absolute or scheme relative URLs to same origin
+        return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
+            (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
+            // or any other URL that isn't scheme relative or absolute i.e relative.
+            !(/^(\/\/|http:|https:).*/.test(url));
+    }
+    function safeMethod(method) {
+        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
+    }
+
+    if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
+        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
+    }
+});
+
+       $(function() {
+       $('#change_name_btn').button();
+       $('#change_name_btn').click(function() {
+                       str = $('#change_name_form').serialize();
+            $.ajax({
+                type: "POST",
+                url: "{% url name-change %}",
+                data: str,
+                success: function(response){
+                       $("#user_namechange_placeholder").html(response);
+                }
+        });
+    return false;
+        });
+       });
+       </script>
+       {% load i18n %}
+<div><strong>{{user}}</strong>, {% trans "enter your first and last name" %}.</div> 
+<div>{% trans "Your name" %}{% if changed %} {% trans "was successfully changed" %}{% endif %}: <strong>{% ifequal name|length 0 %}{% trans "we don't know your name yet" %}{% else %}{{name}}{% endifequal %}</strong></div>
+<form method="POST" id="change_name_form">
+{% csrf_token %}
+        <table>
+            {{ form.as_table }}
+        </table>
+<button id="change_name_btn">{% trans "Change" %}</button>
+</form>
+
+</div>
diff --git a/templates/pass_change.html b/templates/pass_change.html
new file mode 100644 (file)
index 0000000..1c010a4
--- /dev/null
@@ -0,0 +1,62 @@
+<div id="pass_form_placeholder">
+<script>
+       $(document).ajaxSend(function(event, xhr, settings) {
+    function getCookie(name) {
+        var cookieValue = null;
+        if (document.cookie && document.cookie != '') {
+            var cookies = document.cookie.split(';');
+            for (var i = 0; i < cookies.length; i++) {
+                var cookie = jQuery.trim(cookies[i]);
+                // Does this cookie string begin with the name we want?
+                if (cookie.substring(0, name.length + 1) == (name + '=')) {
+                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
+                    break;
+                }
+            }
+        }
+        return cookieValue;
+    }
+    function sameOrigin(url) {
+        // url could be relative or scheme relative or absolute
+        var host = document.location.host; // host + port
+        var protocol = document.location.protocol;
+        var sr_origin = '//' + host;
+        var origin = protocol + sr_origin;
+        // Allow absolute or scheme relative URLs to same origin
+        return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
+            (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
+            // or any other URL that isn't scheme relative or absolute i.e relative.
+            !(/^(\/\/|http:|https:).*/.test(url));
+    }
+    function safeMethod(method) {
+        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
+    }
+
+    if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
+        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
+    }
+});
+
+       $(function() {
+       $('#passformbtn').button();
+       $('#passformbtn').click(function() {
+                       str = $('#password_change_form').serialize();
+            $.ajax({
+                type: "POST",
+                url: "{% url pass_change %}?csrf_token={{csrf_token}}",
+                data: str,
+                success: function(msg){
+                       $("#pass_form_placeholder").html(msg);
+                        }
+        });
+    return false;
+        });
+       });
+       </script>
+{% load i18n %}
+<strong>{{user}}</strong>, {% trans "please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly." %}
+<form method="post" align="left" id="password_change_form">{% csrf_token %}
+{{form.as_p}}
+<button id="passformbtn">{% trans "Change" %}</button>
+</form>
+</div>
\ No newline at end of file
diff --git a/templates/pass_change_done.html b/templates/pass_change_done.html
new file mode 100644 (file)
index 0000000..1033b57
--- /dev/null
@@ -0,0 +1,2 @@
+{% load i18n %}
+<div>{% trans "Password changed" %} <span style="color: green; font-size: 1.1em;">{% trans "successfully" %}</span></div>
diff --git a/templates/profile.html b/templates/profile.html
new file mode 100644 (file)
index 0000000..692d71e
--- /dev/null
@@ -0,0 +1,44 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block extrahead %}
+       <script>
+$(document).ready(function () {
+    $('#accordion').accordion({
+               active: false,
+               collapsible: true,
+        autoHeight: false,
+        create: function () {
+//                     load password change form
+            $('#pass_change_placeholder').load("{% url pass_change %}");
+//                     load ssh keys manager
+                       $('#manage_sshkeys_placeholder').load("{% url user-keys %}");
+//                     change user mail
+                       $('#change_email_placeholder').load("{% url mail-change %}");
+//                     change user full name
+                       $('#change_name_placeholder').load("{% url name-change %}");
+                       
+        }
+    });
+});
+
+       </script>
+
+{% endblock %}
+{% block title %}{% trans "My profile" %}{% endblock %}
+{% block content %}
+<h3>{% trans "My profile" %}</h3>
+
+<div id="accordion">
+       <h3><a href="#" style="color: #4183C4;">{% trans "Change Name" %}</a></h3>
+       <div id="change_name_placeholder"></div>
+       <h3><a href="#" style="color: #4183C4;">{% trans "Change Password" %}</a></h3>
+       <div id="pass_change_placeholder"></div>
+       <h3><a href="#" style="color: #4183C4;">{% trans "Change Email" %}</a></h3>
+       <div id="change_email_placeholder"></div>
+       <h3><a href="#" style="color: #4183C4;">{% trans "Manage SSH Keys" %}</a></h3>
+       <div id="manage_sshkeys_placeholder"></div>
+</div>
+
+
+
+{% endblock %}
diff --git a/templates/registration/activate.html b/templates/registration/activate.html
new file mode 100644 (file)
index 0000000..8ac78a8
--- /dev/null
@@ -0,0 +1,14 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{% trans "Activation Complete" %}{% endblock %}
+{% block brcrmb_container %}{% endblock %}
+{% block content %}
+<div align="center" id="registration">
+    <h3>{% trans "Activation Status" %}</h3>
+{% if account %}
+    <p>{{account}} {% trans "succesfully activated" %}</p>
+{% else %}
+    <p>{% trans "The user has probably been already activated." %}</p>
+{% endif %}
+</div>
+{% endblock %}
diff --git a/templates/registration/activation_complete.html b/templates/registration/activation_complete.html
new file mode 100644 (file)
index 0000000..da5020f
--- /dev/null
@@ -0,0 +1,10 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{% trans "Activation Complete" %}{% endblock %}
+{% block brcrmb_container %}{% endblock %}
+{% block content %}
+<div align="center" id="registration">
+<h3>{% trans "Activation Complete" %}</h3>
+<p>{% trans "The user will be notified about his/her account activation" %}</p>
+</div>
+{% endblock %}
diff --git a/templates/registration/activation_complete.txt b/templates/registration/activation_complete.txt
new file mode 100644 (file)
index 0000000..2fb66a4
--- /dev/null
@@ -0,0 +1,11 @@
+Ο λογαριασμός σας με όνομα χρήστη «{{user.username}}» ενεργοποιήθηκε.
+Μπορείτε να χρησιμοποιήσετε την υπηρεσία ViMa, κάνοντας login στην παρακάτω
+διεύθυνση:
+
+       http://{{ site.domain }}{% url login %}
+
+---------------------------------------------------------------------------
+Your account with username “{{ user.username }}” has been activated.
+You may login to ViMa using the following URL:
+
+       http://{{ site.domain }}{% url login %}
diff --git a/templates/registration/activation_complete_subject.txt b/templates/registration/activation_complete_subject.txt
new file mode 100644 (file)
index 0000000..b8a4d19
--- /dev/null
@@ -0,0 +1 @@
+Activation complete
\ No newline at end of file
diff --git a/templates/registration/activation_email.txt b/templates/registration/activation_email.txt
new file mode 100644 (file)
index 0000000..53bcc5c
--- /dev/null
@@ -0,0 +1,25 @@
+Ο/H {{ user.get_full_name }} έκανε αίτηση για νεό λογαριασμό στην υπηρεσία.
+
+Όνομα χρήστη: {{ user.username }}
+E-mail: {{ user.email }}
+
+Για να ενεργοποιήσετε το λογαριασμό και να επιτρέψετε στο χρήστη να
+χρησιμοποιήσει την υπηρεσία, επισκευθείτε τον ακόλουθο σύνδεσμο:
+
+http://{{ site.domain }}{% url activate_account activation_key %}
+
+Ο χρήστης θα ενημερωθεί για την ενεργοποίηση του λογαριασμού του μέσω e-mail.
+
+-----------------------------------------------------------------------------
+
+{{ user.get_full_name }} has registered for a new account.
+
+Username: {{user.username}}
+E-mail: {{user.email}}
+
+To activate the user's account and allow them to access the service, click on
+the following link:
+
+http://{{ site.domain }}{% url activate_account activation_key %}
+
+The user will be notified via mail about the account activation
diff --git a/templates/registration/activation_email_subject.txt b/templates/registration/activation_email_subject.txt
new file mode 100644 (file)
index 0000000..71befff
--- /dev/null
@@ -0,0 +1 @@
+Account registered at {{ site.name }}
diff --git a/templates/registration/password_change_form.html b/templates/registration/password_change_form.html
new file mode 100644 (file)
index 0000000..fea1fb6
--- /dev/null
@@ -0,0 +1,15 @@
+{% extends "base.html" %}
+
+{% block content %}
+<div id="passwordchange">
+    <h1>{% trans "Change Password" %}</h1>
+    <fieldset>
+        <form method="post">
+               <table>
+            {{ form.as_table }}
+                       </table>
+            <input class="submit" type="submit" value="{% trans "Submit" %}" />
+        </form>
+    </fieldset>
+</div>
+{% endblock %}
diff --git a/templates/registration/password_reset_complete.html b/templates/registration/password_reset_complete.html
new file mode 100644 (file)
index 0000000..0e9ba33
--- /dev/null
@@ -0,0 +1,10 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{% trans "Password Reset Complete" %}{% endblock %}
+{% block brcrmb_container %}{% endblock %}
+{% block content %}
+<div id="passwordreset3">
+    <h3>{% trans "Password Reset Complete" %}</h3>
+    <p>{% trans "Your password was successfully reset. You may login" %} <a href="{% url login %}">{% trans "here" %}</a>.</p>
+</div>
+{% endblock %}
\ No newline at end of file
diff --git a/templates/registration/password_reset_confirm.html b/templates/registration/password_reset_confirm.html
new file mode 100644 (file)
index 0000000..9e126eb
--- /dev/null
@@ -0,0 +1,23 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{% trans "Reset Password" %}{% endblock %}
+{% block brcrmb_container %}{% endblock %}
+{% block content %}
+
+{% if validlink %}
+<div id="passwordreset2" align="center">
+    <h3>{% trans "Reset Password" %}</h3>
+        <form method="post">
+               {% csrf_token %}
+               <table>
+            {{ form.as_table }}
+                       </table>
+            <input class="submit" type="submit" value="{% trans "Submit" %}" />
+        </form>
+</div>
+{% else %}
+<h3>{% trans "Error" %}</h3>
+<p>{% trans "There was an error processing your password change request." %}</p>
+{% endif %}
+
+{% endblock %}
diff --git a/templates/registration/password_reset_done.html b/templates/registration/password_reset_done.html
new file mode 100644 (file)
index 0000000..fb6d93c
--- /dev/null
@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{% trans "Email sent" %}{% endblock %}
+{% block brcrmb_container %}{% endblock %}
+{% block content %}
+<div align="center">
+
+<h3>{% trans "Email Sent" %}</h3>
+<p>{% trans "An email has been sent containing instructions on resetting your password. Please check your inbox." %}</p>
+
+</div>
+{% endblock %}
\ No newline at end of file
diff --git a/templates/registration/password_reset_email.html b/templates/registration/password_reset_email.html
new file mode 100644 (file)
index 0000000..40cf924
--- /dev/null
@@ -0,0 +1,4 @@
+Reset password at {{ site_name }}:
+{% block reset_link %}
+{{ protocol }}://{{ domain }}{% url auth_password_reset_confirm uidb36=uid, token=token %}
+{% endblock %}
diff --git a/templates/registration/password_reset_form.html b/templates/registration/password_reset_form.html
new file mode 100644 (file)
index 0000000..268581e
--- /dev/null
@@ -0,0 +1,19 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{% trans "Password reset" %}{% endblock %}
+{% block brcrmb_container %}{% endblock %}
+{% block content %}
+<div align="center">
+
+<h3>{% trans "Password Reset" %}</h3>
+
+<form method="post">
+{% csrf_token %}
+<table>
+       {{ form.as_table }}
+</table>
+ <input class="submit" type="submit" value="{% trans "Reset" %}" />
+
+</form>
+</div>
+{% endblock %}
\ No newline at end of file
diff --git a/templates/registration/registration_complete.html b/templates/registration/registration_complete.html
new file mode 100644 (file)
index 0000000..8859042
--- /dev/null
@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{% trans "Register" %}{% endblock %}
+{% block brcrmb_container %}{% endblock %}
+{% block content %}
+<div align="center" id="registration">
+
+<h3>{% trans "Registration Email Sent" %}</h3>
+   <p>{% trans "An email has been sent to the system administrator. You will be soon notified about the activation of your account." %}</p>
+   <p>{% trans "Back to" %} <a href="{% url login %}">{% trans "login" %}</a> {% trans "page" %}.</p>
+</div>
+{% endblock %}
\ No newline at end of file
diff --git a/templates/registration/registration_form.html b/templates/registration/registration_form.html
new file mode 100644 (file)
index 0000000..61a4fce
--- /dev/null
@@ -0,0 +1,26 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{% trans "Register" %}{% endblock %}
+{% block brcrmb_container %}{% endblock %}
+{% block content %}
+<!-- change recaptcha theme -->
+<script type="text/javascript">
+var RecaptchaOptions = {
+   theme : 'white'
+};
+</script>
+
+<div align="center" id="registration">
+
+<h3>{% trans "Register new user" %}</h3>
+        <form method="post">
+               {% csrf_token %}
+               <table>
+               {% for field in form %}
+               <tr><th>{% trans field.label|capfirst %}</th><td>{{ field }}{% if field.errors %} <span class="error">{{ field.errors|join:", " }}</span>{% endif %}</td></tr>
+               {% endfor %}
+               </table>
+          <input class="submit"type="submit" value="{% trans "Create" %}" />
+        </form>
+</div>
+{% endblock %}
diff --git a/templates/review.html b/templates/review.html
new file mode 100644 (file)
index 0000000..51a5f9b
--- /dev/null
@@ -0,0 +1,128 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{% trans "Review application" %} #{{ application.pk }}{% endblock %}
+{% block content %}
+<style type="text/css">
+.comments {
+       font-style: italic;
+       max-width: 40em;
+}
+.notice {
+       text-align: center;
+       font-style: italic;
+}
+
+#review {
+       max-width: 50em;
+       margin-left: auto;
+       margin-right: auto;
+}
+</style>
+<script>
+       function set_network(net){
+               $("#id_network").val(net);
+       }
+</script>
+<div align="center" id="review">
+<h2>{% trans "Review application" %} #{{ application.pk }} {% trans "by" %} {{ application.applicant }}</h2>
+<p>{% trans "Submitted" %} {{ application.filed|date }}</p>
+{% if application.is_pending %}
+<form method="POST" id="appform">
+{% csrf_token %}
+<fieldset>
+<legend>{% trans "Instance information" %}</legend>
+<table>
+<tr><th>{{ appform.hostname.label_tag }}</th><td>{{ appform.hostname }}<span class="error">{{ appform.hostname.errors|join:", " }}</span></td></tr>
+<tr><th>{{ appform.memory.label_tag }}</th><td>{{ appform.memory }}<span class="error">{{ appform.memory.errors|join:", " }}</span></td></tr>
+<tr><th>{{ appform.vcpus.label_tag }}</th><td>{{ appform.vcpus }}<span class="error">{{ appform.vcpus.errors|join:", " }}</span></td></tr>
+<tr><th>{{ appform.disk_size.label_tag }}</th><td>{{ appform.disk_size }}<span class="error">{{ appform.disk_size.errors|join:", " }}</span></td></tr>
+<tr><th>{{ appform.organization.label_tag }}</th><td>{{ appform.organization }}<span class="error">{{ appform.organization.errors|join:", " }}</span></td></tr>
+<tr><th>{{ appform.hosts_mail_server.label_tag }}</th><td>{{ appform.hosts_mail_server }}<span class="error">{{ appform.hosts_mail_server.errors|join:", " }}</span></td></tr>
+<tr><th>{{ appform.operating_system.label_tag }}</th><td>{{ appform.operating_system }}<span class="error">{{ appform.operating_system.errors|join:", " }}</span></td></tr>
+</table>
+</fieldset>
+
+{% if application.admin_contact_name %}
+<fieldset>
+<legend>{% trans "Administrative contact" %}</legend>
+<table>
+<tr><th>{% trans "Name" %}</th><td>{{ application.admin_contact_name }}</td></tr>
+<tr><th>{% trans "Email" %}</th><td>{{ application.admin_contact_email }}</td></tr>
+<tr><th>{% trans "Phone" %}</th><td>{{ application.admin_contact_phone }}</td></tr>
+</table>
+</fieldset>
+{% endif %}
+
+<fieldset>
+<legend>{% trans "Comments" %}</legend>
+<div class="comments">
+{{ application.comments }}
+</div>
+</fieldset>
+
+<fieldset>
+<legend>{% trans "Placement" %}</legend>
+{% if application.network %}
+<div class="notice">
+{% trans "The user has requested explicit network placement on" %} {{ application.network }} ({{ application.network.cluster.description }})
+</div>
+{% endif %}
+
+<p>{% trans "Choose either a network, or a cluster from the quick list to use the cluster's default network." %}</p>
+<p>{% trans "Network" %}: {{ appform.network }}</p>
+{% if appform.network.errors %}
+<p class="error">{{ appform.network.errors|join:", " }}</p>
+{% endif %}
+<p>{% for cl in fast_clusters %}<a href="#" onclick="set_network('{{ cl.get_default_network.pk }}');">{{ cl.description }} ({{ cl.slug }})</a> {% if not forloop.last %}| {% endif %}{% endfor %}</p>
+</fieldset>
+
+<fieldset>
+<legend>{% trans "Decision" %}</legend>
+<p>{% trans "Comments to the user" %}:</p>
+{% if appform.admin_comments.errors %}
+<p><span class="error">{{ appform.admin_comments.errors }}</span></p>
+{% endif %}
+<p>{{ appform.admin_comments }}</p>
+<p><input type="submit" value="Accept" name="accept"/> <input type="submit" value="Reject" name="reject" /></p>
+</legend>
+</form>
+{% else %}
+<fieldset>
+<legend>{% trans "Instance information" %}</legend>
+<table>
+<tr><th>{{ appform.hostname.label_tag }}</th><td>{{ application.hostname }}</td></tr>
+<tr><th>{{ appform.memory.label_tag }}</th><td>{{ application.memory }}</td></tr>
+<tr><th>{{ appform.vcpus.label_tag }}</th><td>{{ application.vcpus }}</td></tr>
+<tr><th>{{ appform.disk_size.label_tag }}</th><td>{{ application.disk_size }}</td></tr>
+<tr><th>{{ appform.organization.label_tag }}</th><td>{{ application.organization }}</td></tr>
+<tr><th>{{ appform.hosts_mail_server.label_tag }}</th><td>{{ application.hosts_mail_server }}</td></tr>
+<tr><th>{{ appform.operating_system.label_tag }}</th><td>{{ application.operating_system }}</td></tr>
+</table>
+</fieldset>
+
+{% if application.admin_contact_name %}
+<fieldset>
+<legend>{% trans "Administrative contact" %}</legend>
+<table>
+<tr><th>{% trans "Name" %}</th><td>{{ application.admin_contact_name }}</td></tr>
+<tr><th>{% trans "Email" %}</th><td>{{ application.admin_contact_email }}</td></tr>
+<tr><th>{% trans "Phone" %}</th><td>{{ application.admin_contact_phone }}</td></tr>
+</table>
+</fieldset>
+{% endif %}
+
+<fieldset>
+<legend>{% trans "Comments" %}</legend>
+<div class="comments">
+{{ application.comments }}
+</div>
+</fieldset>
+
+<fieldset>
+<legend>{% trans "Placement" %}</legend>
+<p>{% trans "The instance has been placed on" %} {{ application.network }} ({{ application.cluster.description }})</p>
+</fieldset>
+{% endif %}
+
+</div>
+{% endblock %}
diff --git a/templates/user_keys.html b/templates/user_keys.html
new file mode 100644 (file)
index 0000000..777b2ec
--- /dev/null
@@ -0,0 +1,109 @@
+<div id="sshkeys_placeholder">
+<script>
+       $(document).ajaxSend(function(event, xhr, settings) {
+    function getCookie(name) {
+        var cookieValue = null;
+        if (document.cookie && document.cookie != '') {
+            var cookies = document.cookie.split(';');
+            for (var i = 0; i < cookies.length; i++) {
+                var cookie = jQuery.trim(cookies[i]);
+                // Does this cookie string begin with the name we want?
+                if (cookie.substring(0, name.length + 1) == (name + '=')) {
+                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
+                    break;
+                }
+            }
+        }
+        return cookieValue;
+    }
+    function sameOrigin(url) {
+        // url could be relative or scheme relative or absolute
+        var host = document.location.host; // host + port
+        var protocol = document.location.protocol;
+        var sr_origin = '//' + host;
+        var origin = protocol + sr_origin;
+        // Allow absolute or scheme relative URLs to same origin
+        return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
+            (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
+            // or any other URL that isn't scheme relative or absolute i.e relative.
+            !(/^(\/\/|http:|https:).*/.test(url));
+    }
+    function safeMethod(method) {
+        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
+    }
+
+    if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
+        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
+    }
+});
+
+       $(function() {
+       $('.remove_btn').button({
+            icons: {
+                primary: "ui-icon-circle-close"
+            },
+            text: false
+        })
+       $('#add_ssh_key_btn').button();
+       $('#add_ssh_key_btn').click(function() {
+                       str = $('#sshkeyform').serialize();
+            $.ajax({
+                type: "POST",
+                url: "{% url user-keys %}",
+                data: str,
+                success: function(response){
+//                                     var $response=$(response);
+//                                     var resdata =  $response.filter("#sshkeys_placeholder").html();
+                       $("#sshkeys_placeholder").html(response);
+                        }
+        });
+    return false;
+        });
+               $('a[id^="remove_key_"]').click(function() {
+                       var $this = $(this);
+                       var id = $this.attr("id");
+                       var key_id = id.replace("remove_key_", "")
+            $.ajax({
+                type: "GET",
+                url: "{% url delete-key %}"+key_id,
+                success: function(response){
+//                                     var $response=$(response);
+//                                     var resdata =  $response.filter("#sshkeys_placeholder").html();
+                       $("#sshkeys_placeholder").html(response);
+                        }
+        });
+    return false;
+        });
+       });
+       </script>
+
+<style type="text/css">
+.fingerprint {
+       font-family: monospace;
+}
+</style>
+{% load i18n %}
+<p>{% trans "Upload your SSH public keys and have them automatically installed on all newly-created instances. Keys must be in OpenSSH format, either RSA, or DSA, with or without a trailing comment." %}</p>
+
+{% if keys %}
+<table>
+<tr><th>{% trans "Fingerprint" %}</th><th>{% trans "Comment" %}</th></tr>
+{% for key in keys %}
+<tr><td class="fingerprint">{{ key.fingerprint }}</td><td>{{ key.comment|default:"&mdash;" }}</td><td><a class="remove_btn" id="remove_key_{{key.id}}" href="#">{% trans "Delete" %}</a></tr>
+{% endfor %}
+</table>
+{% endif %}
+<h2>{% trans "Add new key" %}</h2>
+{% if msg %}
+<div class="error">{{msg}}</div>
+{% endif %}
+<form method="POST" id="sshkeyform">
+{% csrf_token %}
+{% if form.ssh_pubkey.errors %}
+<div class="error">{{ form.ssh_pubkey.errors }}</div>
+{% endif %}
+{{ form.ssh_pubkey }}<br />
+<button id="add_ssh_key_btn">{% trans "Add key" %}</button>
+</form>
+</div>
+
diff --git a/templates/user_routes.html b/templates/user_routes.html
new file mode 100644 (file)
index 0000000..6fe303d
--- /dev/null
@@ -0,0 +1,49 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block extrahead %}
+<script type="text/javascript" src="/static/js/jquery.dataTables.js"></script>
+<script type="text/javascript">
+       $(document).ready( function(){
+                       $('#routes_table').dataTable( {
+                       "bJQueryUI": true,
+                       "oLanguage": {
+                               "sLengthMenu": '{% trans "Display" %} <select><option value="25">25</option><option value="50">50</option><option value="-1">{% trans "All" %}</option></select> rules'
+                       },
+                       "iDisplayLength": 25,
+       } );
+               });
+</script>
+{% endblock %}
+{% block title %}{% trans "My routes" %}{% endblock %}
+{% block content %}
+<h3>{% trans "My routes" %}</h3>
+
+<table class="display" width="100%" id="routes_table">
+<thead>
+<tr>
+       <th>{% trans "Name" %}</th>
+       <th>{% trans "Match" %}</th>
+       <th style="text-align: center;">{% trans "Then" %}</th>
+       <th style="text-align: center;">{% trans "Status" %}</th>
+       {% comment %}<th style="text-align: center;">{% trans "Details" %}</th>{% endcomment %}
+       <th style="text-align: center;">{% trans "Expires" %}</th>
+</tr>
+</thead>
+
+<tbody>
+{% for route in routes %}
+
+<tr {% if route.is_online %} class="GradeA" {% else %} class="GradeX" {% endif %}>
+       <td>{{ route.name }}</td>
+       <td>{{ route.get_match|safe|escape }}</td>
+       <td style="text-align: center;">{{route.get_then|safe|escape}}</td>
+       <td style="text-align: center;">{% if route.is_online %}Online{% else %}Offline{% endif %}</td>
+       {% comment %}<td style="text-align: center;">{{ route.response }}</td>{% endcomment %}
+       <td style="text-align: center;">{{ route.expires }}</td>
+</tr>
+
+{% endfor %}
+</tbody>
+</table>
+
+{% endblock %}
diff --git a/templates/vnc.html b/templates/vnc.html
new file mode 100644 (file)
index 0000000..5273c4d
--- /dev/null
@@ -0,0 +1,18 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{{ instance }} - {% trans "Console" %}{% endblock %}
+{% block breadcrumbs %}:: <a href="{% url instance-detail cluster.slug instance %}">{{ instance }}</a> :: VNC</p>{% endblock %}
+
+{% block content %}
+
+<h3>{% trans "VNC session on" %} {{ instance }}</h3>
+<applet archive="/static/javavnc/VncViewer.jar" code="VncViewer.class" width="99%" height="790px" align="middle">
+<param name="PORT" value="{{ port }}">
+<param name="PASSWORD" value="{{ password }}">
+<!--
+<param name="Open new window" value="yes">
+<param name="Scaling factor" value="auto">
+-->
+</applet>
+
+{% endblock %}
diff --git a/utils/__init__.py b/utils/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/utils/proxy.py b/utils/proxy.py
new file mode 100644 (file)
index 0000000..46bc5da
--- /dev/null
@@ -0,0 +1,223 @@
+import nxpy as np
+from ncclient import manager
+from ncclient.transport.errors import AuthenticationError, SSHError
+from lxml import etree as ET
+from django.conf import settings
+import logging
+from django.core.cache import cache
+
+FORMAT = '%(asctime)s %(levelname)s: %(message)s'
+logging.basicConfig(format=FORMAT)
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+class Retriever(object):
+    def __init__(self, device=settings.NETCONF_DEVICE, username=settings.NETCONF_USER, password=settings.NETCONF_PASS, filter=settings.ROUTES_FILTER, route_name=None, xml=None):
+        self.device = device
+        self.username = username
+        self.password = password
+        self.filter = filter
+        self.xml = xml
+        if route_name:
+            self.filter = settings.ROUTE_FILTER%route_name
+    
+    def fetch_xml(self):
+        with manager.connect(host=self.device, port=830, username=self.username, password=self.password) as m:
+            xmlconfig = m.get_config(source='running', filter=('subtree',self.filter)).data_xml
+        return xmlconfig
+    
+    def proccess_xml(self):
+        if self.xml:
+            xmlconfig = self.xml
+        else:
+            xmlconfig = self.fetch_xml()
+        parser = np.Parser()
+        parser.confile = xmlconfig
+        device = parser.export()
+        return device    
+    
+    def fetch_device(self):
+        device = cache.get("device")
+        if device:
+            return device
+        else:
+            device = self.proccess_xml()
+            if device.routing_options:
+                cache.set("device", device, 600)
+                return device
+            else:
+                return False
+
+class Applier(object):
+    def __init__(self, route_objects = [], route_object=None, device=settings.NETCONF_DEVICE, username=settings.NETCONF_USER, password=settings.NETCONF_PASS):
+        self.route_object = route_object
+        self.route_objects = route_objects
+        self.device = device
+        self.username = username
+        self.password = password
+    
+    def to_xml(self):
+        if self.route_object:
+            logger.info("Generating XML config")
+            route_obj = self.route_object
+            device = np.Device()
+            flow = np.Flow()
+            route = np.Route()
+            flow.routes.append(route)
+            device.routing_options.append(flow)
+            route.name = route_obj.name
+            match = route_obj.match
+            if match.matchSource:
+                route.match['source'].append(match.matchSource.address)
+            if match.matchDestination:
+                route.match['destination'].append(match.matchDestination.address)
+            if match.matchprotocol:
+                route.match['protocol'].append(match.matchprotocol.protocol)
+            if match.matchport:
+                for port in match.matchport.all():
+                    route.match['port'].append(port.port)
+            if match.matchDestinationPort:
+                for port in match.matchDestinationPort.all():
+                    route.match['destination-port'].append(port.port)
+            if match.matchSourcePort:
+                for port in match.matchSourcePort.all():
+                    route.match['source-port'].append(port.port)
+            if match.matchicmpcode:
+                route.match['icmp-code'].append(match.matchicmpcode.icmp_code)
+            if match.matchicmptype:
+                route.match['icmp-type'].append(match.matchicmptype.icmp_type)
+            if match.matchTcpFlag:
+                route.match['tcp-flags'].append(match.matchTcpFlag.tcp_flags)
+            if match.matchdscp:
+                for dscp in match.matchdscp.all():
+                    route.match['dscp'].append(dscp.dscp)
+            if match.matchfragmenttype:
+                route.match['fragment'].append(match.matchfragmenttype.fragmenttype)
+            then = route_obj.then
+            for thenaction in then.thenaction.all():
+                if thenaction.action_value:
+                    route.then[thenaction.action] = thenaction.action_value
+                else:
+                    route.then[thenaction.action] = True
+            device = device.export(netconf_config=True)
+            return ET.tostring(device)
+        else:
+            return False
+    
+    def delete_route(self):
+        if self.route_object:
+            logger.info("Generating XML config")
+            route_obj = self.route_object
+            device = np.Device()
+            flow = np.Flow()
+            route = np.Route()
+            flow.routes.append(route)
+            device.routing_options.append(flow)
+            route.name = route_obj.name
+            route.operation = 'delete'
+            device = device.export(netconf_config=True)
+            return ET.tostring(device)
+        else:
+            return False
+
+    def delete_routes(self):
+        if self.route_objects:
+            logger.info("Generating XML config")
+            device = np.Device()
+            flow = np.Flow()
+            for route_object in self.route_objects:
+                route_obj = route_object
+                route = np.Route()
+                flow.routes.append(route)
+                route.name = route_obj.name
+                route.operation = 'delete'
+            device.routing_options.append(flow)
+            device = device.export(netconf_config=True)
+            return ET.tostring(device)
+        else:
+            return False    
+    
+    def apply(self, configuration = None):
+        reason = None
+        if not configuration:
+            configuration = self.to_xml()
+        edit_is_successful = False
+        commit_confirmed_is_successful = False
+        commit_is_successful = False
+        if configuration:
+            with manager.connect(host=self.device, port=830, username=self.username, password=self.password) as m:
+                assert(":candidate" in m.server_capabilities)
+                with m.locked(target='candidate'):
+                    m.discard_changes()
+                    try:
+                        edit_response = m.edit_config(target='candidate', config=configuration, test_option='test-then-set')
+                        edit_is_successful, reason = is_successful(edit_response)
+                        logger.info("Successfully edited @ %s" % self.device)
+                        if not edit_is_successful:
+                            raise Exception()
+                    except Exception as e:
+                        cause="Caught edit exception: %s %s" %(e,reason)
+                        cause=cause.replace('\n', '')
+                        logger.error(cause)
+                        m.discard_changes()
+                        return False, cause
+                    if edit_is_successful:
+                        try:
+                            commit_confirmed_response = m.commit(confirmed=True, timeout=settings.COMMIT_CONFIRMED_TIMEOUT)
+                            commit_confirmed_is_successful, reason = is_successful(commit_confirmed_response)
+                                
+                            if not commit_confirmed_is_successful:
+                                raise Exception()
+                            else:
+                                logger.info("Successfully confirmed committed @ %s" % self.device)
+                                if not settings.COMMIT:
+                                    return True, "Successfully confirmed committed"
+                        except Exception as e:
+                            cause="Caught commit confirmed exception: %s %s" %(e,reason)
+                            cause=cause.replace('\n', '')
+                            logger.error(cause)
+                            return False, cause
+                        if settings.COMMIT:
+                            if edit_is_successful and commit_confirmed_is_successful:
+                                try:
+                                    commit_response = m.commit(confirmed=False)
+                                    commit_is_successful, reason = is_successful(commit_response)
+                                    logger.info("Successfully committed @ %s" % self.device)
+                                    newconfig = m.get_config(source='running', filter=('subtree',settings.ROUTES_FILTER)).data_xml
+                                    retrieve = Retriever(xml=newconfig)
+                                    cache.set("device", retrieve.proccess_xml(), 600)
+                                    
+                                    if not commit_is_successful:
+                                        raise Exception()
+                                    else:
+                                        logger.info("Successfully cached device configuration")
+                                        return True, "Successfully committed"
+                                except Exception as e:
+                                    cause="Caught commit exception: %s %s" %(e,reason)
+                                    cause=cause.replace('\n', '')
+                                    logger.error(cause)
+                                    return False, cause
+        else:
+            return False, "No configuration was supplied"
+            
+def is_successful(response):
+    from StringIO import StringIO
+    doc = parsexml_(StringIO(response))
+    rootNode = doc.getroot()
+    success_list = rootNode.xpath("//*[local-name()='ok']")
+    if len(success_list)>0:
+        return True, None
+    else:
+        reason_return = ''
+        reason_list = rootNode.xpath("//*[local-name()='error-message']")
+        for reason in reason_list:
+            reason_return = "%s %s" %(reason_return, reason.text)  
+        return False, reason_return
+    
+    
+def parsexml_(*args, **kwargs):
+    if 'parser' not in kwargs:
+        kwargs['parser'] = ET.ETCompatXMLParser()
+    doc = ET.parse(*args, **kwargs)
+    return doc
+        
\ No newline at end of file