From 24dcdfe6919303f757af76f86bd2e28b230b57f4 Mon Sep 17 00:00:00 2001 From: Grant He Date: Wed, 29 Feb 2012 21:31:57 -0500 Subject: [PATCH 01/48] minor modification in ProblemSet.pm --- conf/prelocal.conf.dist | 154 --------------------- lib/WeBWorK/ContentGenerator/ProblemSet.pm | 4 +- 2 files changed, 3 insertions(+), 155 deletions(-) delete mode 100755 conf/prelocal.conf.dist diff --git a/conf/prelocal.conf.dist b/conf/prelocal.conf.dist deleted file mode 100755 index 018503f97b..0000000000 --- a/conf/prelocal.conf.dist +++ /dev/null @@ -1,154 +0,0 @@ -#!perl -################################################################################ -# WeBWorK Online Homework Delivery System -# Copyright © 2000-2007 The WeBWorK Project, http://openwebwork.sf.net/ -# $CVSHeader: webwork2/conf/global.conf.dist,v 1.225 2010/05/18 18:03:31 apizer Exp $ -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of either: (a) the GNU General Public License as published by the -# Free Software Foundation; either version 2, or (at your option) any later -# version, or (b) the "Artistic License" which comes with this package. -# -# This program 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 either the GNU General Public License or the -# Artistic License for more details. -################################################################################ - -# This file is used to set up the default WeBWorK course environment for all -# requests. Values may be overwritten by the course.conf for a specific course. -# All package variables set in this file are added to the course environment. -# If you wish to set a variable here but omit it from the course environment, -# use the "my" keyword. The $webwork_dir variable is set in the WeBWorK Apache -# configuration file (webwork.apache-config) and is available for use here. In -# addition, the $courseName variable holds the name of the current course. - -################################################################################ -# prelocal.conf -- this file -################################################################################ - -# prelocal.conf and postlocal.conf contain the local modifications commonly made -# when installing WeBWorK on a new site. The configurations in global.conf.dist -# and in database.conf can usually remain untouched. - -################################################################################ -# Seed variables -################################################################################ - -# Set these variables to correspond to your configuration and preferences. You -# will need to restart the webserver to reset the variables in this section. - -# URL of WeBWorK handler. If WeBWorK is to be on the web server root, use "". Note -# that using "" may not work so we suggest sticking with "/webwork2". -$webwork_url = "/webwork2"; -$server_root_url = ""; -$server_userID = "wwadmin"; -$server_groupID = "wwdata"; - -# In the apache configuration file (often called httpd.conf) you will find -# User wwadmin --- this is the $server_userID -- of course it may be wwhttpd or some other name -# Group wwdata --- this is the $server_groupID -- this will have different names also - - -################################################################################ -# Paths to external programs -################################################################################ - -# These applications are often found in /bin, but sometimes in /usr/bin -# or even in /opt/local/bin. -# You can use "which tar" for example to find out where the "tar" program is located - -#################################################### -# system utilities -#################################################### -$externalPrograms{mv} = "/bin/mv"; -$externalPrograms{cp} = "/bin/cp"; -$externalPrograms{rm} = "/bin/rm"; -$externalPrograms{mkdir} = "/bin/mkdir"; -$externalPrograms{tar} = "/bin/tar"; -$externalPrograms{gzip} = "/bin/gzip"; - -#################################################### -# equation rendering/hardcopy utiltiies -#################################################### -$externalPrograms{latex} ="/usr/bin/latex"; -$externalPrograms{pdflatex} ="/usr/bin/pdflatex --shell-escape"; -$externalPrograms{dvipng} ="/usr/bin//dvipng"; -$externalPrograms{tth} ="/usr/bin/tth"; - -#################################################### -# NetPBM - basic image manipulation utilities -# Most sites only need to configure $netpbm_prefix. -#################################################### -my $netpbm_prefix = "/usr/bin"; -$externalPrograms{giftopnm} = "$netpbm_prefix/giftopnm"; -$externalPrograms{ppmtopgm} = "$netpbm_prefix/ppmtopgm"; -$externalPrograms{pnmtops} = "$netpbm_prefix/pnmtops"; -$externalPrograms{pnmtopng} = "$netpbm_prefix/pnmtopng"; -$externalPrograms{pngtopnm} = "$netpbm_prefix/pngtopnm"; - -#################################################### -# url checker -#################################################### - -$externalPrograms{checkurl} = "/usr/bin/lwp-request -d -mHEAD "; # or "/usr/local/bin/w3c -head " - -#################################################### -# image conversions utiltiies -# the source file is given on stdin, and the output expected on stdout. -#################################################### - -$externalPrograms{gif2eps} = "$externalPrograms{giftopnm} | $externalPrograms{ppmtopgm} | $externalPrograms{pnmtops} -noturn 2>/dev/null"; -$externalPrograms{png2eps} = "$externalPrograms{pngtopnm} | $externalPrograms{ppmtopgm} | $externalPrograms{pnmtops} -noturn 2>/dev/null"; -$externalPrograms{gif2png} = "$externalPrograms{giftopnm} | $externalPrograms{pnmtopng}"; - -#################################################### -# mysql clients -#################################################### - -$externalPrograms{mysql} ="/usr/bin/mysql"; -$externalPrograms{mysqldump} ="/usr/bin/mysqldump"; - - -#################################################### -# End paths to external utilities. -#################################################### - -################################################################################ -# Database options -################################################################################ - - -# Standard permissions command used to initialize the webwork database -# GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, INDEX, LOCK TABLES ON webwork.* TO webworkWrite@localhost IDENTIFIED BY 'passwordRW'; - -################################################################################ -# these variables are used by database.conf. we define them here so that editing -# database.conf isn't necessary. - -# You must initialize the database and set the password for webworkWrite -# The other parameters are set as defaults in global.conf but you can modify them -# here if for example you want to use a mysql database on a remote machine. -################################################################################ -$database_dsn ="dbi:mysql:webwork"; -$database_username ="webworkWrite"; -#$database_password ="passwordRW"; - -################################################################################ -# Directory for temporary files -################################################################################ -# Location of web-accessible temporary files, such as equation images. -Default: -#$webworkDirs{htdocs_temp} = "$webworkDirs{htdocs}/tmp"; -#$webworkURLs{htdocs_temp} = "$webworkURLs{htdocs}/tmp"; - -# Alternate locations -- this allows you to place temporary files -# in a location that is not backed up. -#For example. -#$webworkDirs{htdocs_temp} = "/opt/htdocs/wwtmp"; -#$webworkURLs{htdocs_temp} = "/wwtmp"; - -################################################################################ - -1; #final line of the file to reassure perl that it was read properly. - diff --git a/lib/WeBWorK/ContentGenerator/ProblemSet.pm b/lib/WeBWorK/ContentGenerator/ProblemSet.pm index c2e6e8dfdf..d5eef08b82 100644 --- a/lib/WeBWorK/ContentGenerator/ProblemSet.pm +++ b/lib/WeBWorK/ContentGenerator/ProblemSet.pm @@ -318,7 +318,7 @@ sub body { courseID => $courseID, setID => $setName); my $hardcopyURL = $self->systemLink($hardcopyPage); - print CGI::div({-class=>"problem_set_options"}, CGI::a({href=>$hardcopyURL}, $r->maketext("Download PDF or TeX Hardcopy for Current Set"))); + # print CGI::div({-class=>"problem_set_options"}, CGI::a({href=>$hardcopyURL}, $r->maketext("Download PDF or TeX Hardcopy for Current Set"))); my $enable_reduced_scoring = $set->enable_reduced_scoring; @@ -400,6 +400,8 @@ sub body { ); print CGI::end_div(); + print CGI::div({-class=>"problem_set_options"}, CGI::a({href=>$hardcopyURL}, $r->maketext("Download PDF or TeX Hardcopy for Current Set"))).CGI::br(); + return ""; } From 75039bed0289e8d944d374c301d7c5e95eb86bb1 Mon Sep 17 00:00:00 2001 From: Michael Gage Date: Thu, 1 Mar 2012 08:53:19 -0500 Subject: [PATCH 02/48] Add slide capabilities to left div (problem_set_container div) -- controlled by click and drag. The automatic expansion was too confusing, but this allows one to control the width of the problem sets container on the left manually. --- htdocs/css/library_browser.css | 4 +++- htdocs/js/library_browser.js | 10 +++++++++- lib/WeBWorK/ContentGenerator/Instructor/SetMaker3.pm | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/htdocs/css/library_browser.css b/htdocs/css/library_browser.css index 1ad12760c1..4c2daa296e 100644 --- a/htdocs/css/library_browser.css +++ b/htdocs/css/library_browser.css @@ -116,9 +116,10 @@ body { } #app_box #problems_container{ - width: 100%; + width: outo; height:100%; border: solid 1px black; + overflow: scroll; -webkit-box-flex: 1; -moz-box-flex: 1; @@ -127,6 +128,7 @@ body { #app_box #problem_sets_container{ width:150px; + float: left border: solid 1px black; height:100%; overflow: scroll; diff --git a/htdocs/js/library_browser.js b/htdocs/js/library_browser.js index b2ee37383d..eacc1f073e 100644 --- a/htdocs/js/library_browser.js +++ b/htdocs/js/library_browser.js @@ -166,6 +166,14 @@ $(document).ready(function() { $("#dialog").dialog('open'); } }); +// setup slider for side bar + $("#problem_sets_container").resizable({ + cursor: 'move', + //animate: true, + //ghost: true, + delay: 0, + }); + // some window set up: $tabs = $("#problems_container") @@ -210,7 +218,7 @@ $(document).ready(function() { "ww_selected"); } }); - + $("#problems_container").removeClass("ui-corner-all"); listLibRequest.xml_command = "listLibraries"; diff --git a/lib/WeBWorK/ContentGenerator/Instructor/SetMaker3.pm b/lib/WeBWorK/ContentGenerator/Instructor/SetMaker3.pm index 92d051e54f..1a3d6605c5 100755 --- a/lib/WeBWorK/ContentGenerator/Instructor/SetMaker3.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/SetMaker3.pm @@ -180,7 +180,7 @@ sub body { print '
  • New Problem Set
  • '; print ''; print ''; - print '

    ||

    '; + #print '

    ||

    '; print '
    '; #List of tabs print '
      ', From 0db64193cd4ca8b68db22cab3a2a051a0e8bb34a Mon Sep 17 00:00:00 2001 From: Michael Gage Date: Thu, 1 Mar 2012 09:13:14 -0500 Subject: [PATCH 03/48] Replace prelocal.conf.dist file removed in commit from ghe3 --- conf/prelocal.conf.dist | 154 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100755 conf/prelocal.conf.dist diff --git a/conf/prelocal.conf.dist b/conf/prelocal.conf.dist new file mode 100755 index 0000000000..018503f97b --- /dev/null +++ b/conf/prelocal.conf.dist @@ -0,0 +1,154 @@ +#!perl +################################################################################ +# WeBWorK Online Homework Delivery System +# Copyright © 2000-2007 The WeBWorK Project, http://openwebwork.sf.net/ +# $CVSHeader: webwork2/conf/global.conf.dist,v 1.225 2010/05/18 18:03:31 apizer Exp $ +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of either: (a) the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version, or (b) the "Artistic License" which comes with this package. +# +# This program 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 either the GNU General Public License or the +# Artistic License for more details. +################################################################################ + +# This file is used to set up the default WeBWorK course environment for all +# requests. Values may be overwritten by the course.conf for a specific course. +# All package variables set in this file are added to the course environment. +# If you wish to set a variable here but omit it from the course environment, +# use the "my" keyword. The $webwork_dir variable is set in the WeBWorK Apache +# configuration file (webwork.apache-config) and is available for use here. In +# addition, the $courseName variable holds the name of the current course. + +################################################################################ +# prelocal.conf -- this file +################################################################################ + +# prelocal.conf and postlocal.conf contain the local modifications commonly made +# when installing WeBWorK on a new site. The configurations in global.conf.dist +# and in database.conf can usually remain untouched. + +################################################################################ +# Seed variables +################################################################################ + +# Set these variables to correspond to your configuration and preferences. You +# will need to restart the webserver to reset the variables in this section. + +# URL of WeBWorK handler. If WeBWorK is to be on the web server root, use "". Note +# that using "" may not work so we suggest sticking with "/webwork2". +$webwork_url = "/webwork2"; +$server_root_url = ""; +$server_userID = "wwadmin"; +$server_groupID = "wwdata"; + +# In the apache configuration file (often called httpd.conf) you will find +# User wwadmin --- this is the $server_userID -- of course it may be wwhttpd or some other name +# Group wwdata --- this is the $server_groupID -- this will have different names also + + +################################################################################ +# Paths to external programs +################################################################################ + +# These applications are often found in /bin, but sometimes in /usr/bin +# or even in /opt/local/bin. +# You can use "which tar" for example to find out where the "tar" program is located + +#################################################### +# system utilities +#################################################### +$externalPrograms{mv} = "/bin/mv"; +$externalPrograms{cp} = "/bin/cp"; +$externalPrograms{rm} = "/bin/rm"; +$externalPrograms{mkdir} = "/bin/mkdir"; +$externalPrograms{tar} = "/bin/tar"; +$externalPrograms{gzip} = "/bin/gzip"; + +#################################################### +# equation rendering/hardcopy utiltiies +#################################################### +$externalPrograms{latex} ="/usr/bin/latex"; +$externalPrograms{pdflatex} ="/usr/bin/pdflatex --shell-escape"; +$externalPrograms{dvipng} ="/usr/bin//dvipng"; +$externalPrograms{tth} ="/usr/bin/tth"; + +#################################################### +# NetPBM - basic image manipulation utilities +# Most sites only need to configure $netpbm_prefix. +#################################################### +my $netpbm_prefix = "/usr/bin"; +$externalPrograms{giftopnm} = "$netpbm_prefix/giftopnm"; +$externalPrograms{ppmtopgm} = "$netpbm_prefix/ppmtopgm"; +$externalPrograms{pnmtops} = "$netpbm_prefix/pnmtops"; +$externalPrograms{pnmtopng} = "$netpbm_prefix/pnmtopng"; +$externalPrograms{pngtopnm} = "$netpbm_prefix/pngtopnm"; + +#################################################### +# url checker +#################################################### + +$externalPrograms{checkurl} = "/usr/bin/lwp-request -d -mHEAD "; # or "/usr/local/bin/w3c -head " + +#################################################### +# image conversions utiltiies +# the source file is given on stdin, and the output expected on stdout. +#################################################### + +$externalPrograms{gif2eps} = "$externalPrograms{giftopnm} | $externalPrograms{ppmtopgm} | $externalPrograms{pnmtops} -noturn 2>/dev/null"; +$externalPrograms{png2eps} = "$externalPrograms{pngtopnm} | $externalPrograms{ppmtopgm} | $externalPrograms{pnmtops} -noturn 2>/dev/null"; +$externalPrograms{gif2png} = "$externalPrograms{giftopnm} | $externalPrograms{pnmtopng}"; + +#################################################### +# mysql clients +#################################################### + +$externalPrograms{mysql} ="/usr/bin/mysql"; +$externalPrograms{mysqldump} ="/usr/bin/mysqldump"; + + +#################################################### +# End paths to external utilities. +#################################################### + +################################################################################ +# Database options +################################################################################ + + +# Standard permissions command used to initialize the webwork database +# GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, INDEX, LOCK TABLES ON webwork.* TO webworkWrite@localhost IDENTIFIED BY 'passwordRW'; + +################################################################################ +# these variables are used by database.conf. we define them here so that editing +# database.conf isn't necessary. + +# You must initialize the database and set the password for webworkWrite +# The other parameters are set as defaults in global.conf but you can modify them +# here if for example you want to use a mysql database on a remote machine. +################################################################################ +$database_dsn ="dbi:mysql:webwork"; +$database_username ="webworkWrite"; +#$database_password ="passwordRW"; + +################################################################################ +# Directory for temporary files +################################################################################ +# Location of web-accessible temporary files, such as equation images. +Default: +#$webworkDirs{htdocs_temp} = "$webworkDirs{htdocs}/tmp"; +#$webworkURLs{htdocs_temp} = "$webworkURLs{htdocs}/tmp"; + +# Alternate locations -- this allows you to place temporary files +# in a location that is not backed up. +#For example. +#$webworkDirs{htdocs_temp} = "/opt/htdocs/wwtmp"; +#$webworkURLs{htdocs_temp} = "/wwtmp"; + +################################################################################ + +1; #final line of the file to reassure perl that it was read properly. + From 8f14827a0125ee8e84f71bc6f23f706a7bc60603 Mon Sep 17 00:00:00 2001 From: Michael Gage Date: Thu, 1 Mar 2012 09:16:48 -0500 Subject: [PATCH 04/48] Resize the set_info box on course home page --- conf/templates/math2/math2.css | 11 +++++++++-- conf/templates/math3/math3.css | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/conf/templates/math2/math2.css b/conf/templates/math2/math2.css index 2c7c9445e4..df80f2766f 100644 --- a/conf/templates/math2/math2.css +++ b/conf/templates/math2/math2.css @@ -403,11 +403,12 @@ clear: both; #InfoPanel { font-size:100%; float: right; - max-width: 400px; + max-width: 40%; overflow: auto; margin-right: -1px; background-color: #fff; } + #InfoPanel ol { font-size:100%; } @@ -732,10 +733,16 @@ span.gray_button{ /*These are styles for the tables of problem sets*/ + +/*This is the styling specifically for the tables of problems displayed for each problem set page*/ +table.problem_set_table{ + margin-top: 30px; + #width:30%; + text-align: left; +} table.problem_set_table th{ padding-right: 30px; } - table.problem_set_table td{ padding-right: 30px; } \ No newline at end of file diff --git a/conf/templates/math3/math3.css b/conf/templates/math3/math3.css index a47a1627e5..405c94b3ef 100644 --- a/conf/templates/math3/math3.css +++ b/conf/templates/math3/math3.css @@ -433,7 +433,7 @@ clear: both; #InfoPanel { font-size:100%; float: right; - max-width: 400px; + max-width: 40%; overflow: auto; /*margin-right: -1px;*/ background-color: #fff; @@ -809,7 +809,7 @@ div.problem_sets_options { /*This is the styling specifically for the tables of problems displayed for each problem set page*/ table.problem_set_table{ margin-top: 30px; - width: 640px; + #width: 640px; text-align: left; } From 441a8273903df3cbb82593bc1d36420308f35d2b Mon Sep 17 00:00:00 2001 From: Michael Gage Date: Thu, 8 Mar 2012 21:35:24 -0500 Subject: [PATCH 05/48] Tweak the timing parameters for checking to see if the applet is loaded I increased the time between checks and also increased the number of failed checks required to trigger the alert message that there has been trouble loading the flash applet. --- htdocs/js/ww_applet_support.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/htdocs/js/ww_applet_support.js b/htdocs/js/ww_applet_support.js index 45147e4db3..68e59fedac 100644 --- a/htdocs/js/ww_applet_support.js +++ b/htdocs/js/ww_applet_support.js @@ -23,7 +23,7 @@ var ww_applet_list = new Object; // holds java script version (jsApplet) ww_applet objects - var TIMEOUT = 100; // time delay between successive checks for applet readiness + var TIMEOUT = 800; // time delay between successive checks for applet readiness ////////////////////////////////////////////////////////// @@ -601,6 +601,8 @@ ww_applet.prototype.debug_add = function(str) { ww_applet.prototype.safe_applet_initialize = function(i) { //alert("begin safe_applet_initialize"); var appletName = this.appletName; + var failed_attempts_allowed = 3; + i--; ///////////////////////////////////////////////// @@ -625,8 +627,8 @@ ww_applet.prototype.safe_applet_initialize = function(i) { debugText=""; } setTimeout( "ww_applet_list[\""+ appletName + "\"].safe_applet_initialize(" + i + ")",TIMEOUT); - // warn about loading after two failed attempts or if there is only one attempt left - if (i<=1 || i< (ww_applet_list[appletName].maxInitializationAttempts-2)) { alert("Oops, applet is not ready. " +(i-1) +" tries left")}; + // warn about loading after failed_attempts_allowed failed attempts or if there is only one attempt left + if (i<=1 || i< (ww_applet_list[appletName].maxInitializationAttempts-failed_attempts_allowed)) { alert("Oops, applet is not ready. " +(i-1) +" tries left")}; return ""; } else if (applet_loaded==0 && !(i> 0) ) { // it's possible that the isActive() response of the applet is not working properly From b53d19ea530df2dc42613c8f8fe03acdee8d1dac Mon Sep 17 00:00:00 2001 From: Michael Gage Date: Thu, 8 Mar 2012 21:36:56 -0500 Subject: [PATCH 06/48] Update the chinese language files These files have just started. This upload is to check that the phrases entered so far actually work in practice --- lib/WeBWorK/Localize/zh_hk.mo | Bin 32884 -> 32368 bytes lib/WeBWorK/Localize/zh_hk.po | 266 ++++++++++++++++++++++------------ 2 files changed, 173 insertions(+), 93 deletions(-) diff --git a/lib/WeBWorK/Localize/zh_hk.mo b/lib/WeBWorK/Localize/zh_hk.mo index 46d0fec0122703b5d263a71eb4139eb2e189ed48..bb6dec2155cc57bf88333d9ae8b0535e53ae1e43 100644 GIT binary patch delta 10224 zcmaLc33ye--N*5hutV6v0J2;lVF?hz4gm$(caT+f0=YmmB$xz|MJ~t|Hi;Z$4O?WB zB`lG}gg`4oMYMHkvDI2@&Am6N)uKYt+T#2D-5Gf4`@YY6p6AbJX3jZtX8tqh-1vBV zS@^Agg=Izg+BuH1+~YW2%){1Lx3S|?#r{|Y$6;CYVku0<3OEmI<05q`nlp;pV13bK$!*RHNY&)C0ak&G=g^hd*F>bfV0S6;SPcP!AY_ z%ETnpjGsjfa5XYUXEW;hv#5Rxt#A1#=)pIz9{v$EgS)7XOOq!r)CQ{CgUGa9rtfxZXAa7sn5U~ z=tIq9GwOkduq}R!THA7@r#wD^TX8TdvtQWuZ?G)SckWWq$nIf9tQq4tY*eQqY5=`Z zYdHY5B%@ISnTbm6GSqdeP#M~Q%G_pDre4Ldcp7zGxmIQZRj@YCcN$aB>(d3*@o?10 zpFwqyf$H!@d)~zg)K8%Xl#iO(J6H}sMh)b1tcZTpgKwekyNm5Hj1A?}jU6e3QiYn) zVAKOgU<6J_rFyQdFUN4|FQH!3mr(;hh9mH8)azV_^;Cb&F%?^*29S;F?@$}^KaWB_ z4N=&Nt*sG{M0GF;HIS#V6D~$JymK10L?5FUe?(Ves)y>rT* zztWcc>w*tyPzF9nrLfp~3pL^&Py-8(bDRcP86&Y3YU%o*uA7LJFcH=7Jk;KL!M1P4 zcc||{U7w`yuhu3VJ-Eo$ccEsGgPQ4SR4PA04ebfB6`|tyn!de|nrs|+F z)D)H3?$*B6VaSAh&NvE6?IhFyW}#;OysfW6jd%wt)w!q#UqyX4ZemCL7L}1^RFtVW z)WAET`hN^-;y_f!Cu1eO|1<3csi=+@p$4!X)xl0w>T*yIIEm`;4IGMZp*pV44%J%_ zjUMcc{A@TgQA@A}wRa9<54?(TJl_fL%tr=0U{B1zF8Df*#=qf<*o#ID=n6K+8>k0< zk6OZNUC9o1z{0iHC8f#F$V!esVR0(QHZsQ~PqqSNO@?VdJ<~-Gdy-^p;#5%YL)q#te z`5x?thiv_CsMO!a7%cyod0RT5cK2AEjgv4Hui#|t@VMEmS&x%{vg>T2L8-cd>gXp_ zdo$J}7N?*xwE-W+H<0CXeuo{fQZF_b_QWWB0o6|q>iYMPWI83N^HHRG77p@Jpv^gj z!|_|x%zO1F8#sY~8eldmGx=BxKfwAJKyB7ieaxr0hP5@Sy+20dSgeYRQJZ-^>b3N3 zr=VTE-+By{>a+HOLezKQ8fxu-YwH25OZ_%B!76>tQnf?f-vhN5`l8;d@u>UfU~OE4 zOvvYCQP7MI+Y=X2Gy4#Ab)h&;v>jF*B-#nsE%q;1k#klTkBsQ4e~7o+;$g_ZCKYWKg6OvvZFPeGgEQ|yR$P&dRpY3zdPxUY2#YEven zW}b}ga6Qh$LR6+=N11_lLoLxL)SmL9Cb9%O>iyqBp#u%qQET*X)Bw7V=C>aQqUv9w z*7z3c0slm0rpy@gW6}_{Ih&v|HxPB-2&{>d(S!5s`IoT*&v&-lh8)xluc2mq4kzF> z)B`u?qE#)@;;kcnr1sKf-$WcOM0H zRB@77vs$RsMqwT7Wb4E6*VLz>G7-z4F?w(hjKV&sC76R6U^;51t5Me-M?EJGb$=mh zkN9p-(2PGt&9E4C;m_C_rXWI4UETQ5n2}TADBI z`Mb!b^f?u$nvut#Qq~C{#lENxr(5S*7opz&HMYJ9wY#%z{UT~W*RdgfjvDwq)Sif( zX4+e0SH1s3C}>72QJZc(YUEo`1K5YU@dWC+H!<`8)b*dEW>}26-kEOhuZ&vCx~P=L zpeEQAN8$jC^ikMOp+25Mt>t^D&GH>;3F;-7pWDZ=7xn4b5%=Rzyoo)r=?p$vI1_nc zoV~aj@1iEObf)99z;&nr=b=vzxop&wmoSccG4{i{ zv&_Jz;TY=sP@m*G*c6-3HW?d&%18q0eA;aCuT&nOL7Ok%`T;7H#i$hDLA@^btaay@ zHSCDW*l5)G=TS@LqEdYXHS_a02(Mr{tej-7tDQvtV`+$?AsQ!OdGz5kn2G6l8>i!( zr%eafF`oJds1Hm87ptFMsPk*VOytbn4024d27ZbUwwrUj1+c^$EBwoZk{$N&Sgu&42SY8%i29yn zVLd#K%IvQ&M(_XE6k5_yXR+z9H|o zFiY4Nb-oko`oZYa1&I{28-1uu#-A+f8aSD>GYy7ikMIIBbpOBd|WgWE9y>;Ul4UEzmD^W%9LNjX9>N6 ztYYX*`8!@C8gafM#u1Y!e}_7TQ2qcl(dAly-UcU%My1vz+EI=pbkxS_L@Kd@m`GcF z)G?V**6L7yfp~}VPsCq{PQ*akZlMldf9D5c8S!sIU)9Fyhvz$^DJ&wql(jyGh=-49 z4_7GPBPJ1F6H2$1W;dZDmFT06Irb7C62n#DNF-)+?jY_U+7P}A{G%U>8TKZ9{rXaV z#@0trfB4u&<=3_$+Fp}My{s+Yzm^YU=;%dzH%c9er%Y4m->T+%pR=8+cD>$J9jA%2 z#E--u2)$Z5R&oR1qzA`i)Vr8YoTV6J%T2K>F~MG0iE>NgX(FFCeSBUe%2S`E{EwqD zi;9l#3GM9m)X%Gd;}Ocwo1(K8FWa)V^mCMJ63Z#;jnT26$RK`4j3w?Ldeb^^osNF! zQJLpE7uCYipZG1I&#^wi4YhCqGoD>dd$Gc9d5TY1G3AeTaTZ z+&_Ge)0jo=uS7@6_m4Fc`Vd~)p0n*Oa3pO5i0Thrdy2Y_BBC?xZHQ!hz9Majw#;Y1 z2@rfXoWaB;^Pdy^abYi@Ep+_regV4^>BL52IMZE$j#%py>}ks8PnSq4J-A>oaa~t( zq|mkypT$36T{YTcF8YbC_ZzIO@iAg6F_Qbf#a4ulCx|k%ZNY{3r5Zz92l~^n1fReo zI2cn<$8m#m8-GQNv30SUSZC{XtfCe7>zHFbLwOGoBwEupl*pqzRv%~`-w;)aDa1dC z`^QuE{4U$DjQS>99z;2vc$fNn#6-$bm_Xbi=2EXllp|&m8)(x}i*mdvI=%r^B8dCP zR}`+=N)6f@Q2vzYLAgG@h;LyM5lMVT3?(Me-ks3#Gf~=>e-moqcNRak;*$9^uR& zh7mbLXF^9f_k_M}hjEBn9y&gvJe3PP*c{XFZK4A4GVu~IhW5J{LlhEMh|tl(oz|^w zUZJN?xLcv=_|kI|l9Ju=O`Ex!o6d5RqS7j-rFmy&coI_57kJas-QPz&?M{vEoR=N# zmMNW-l98U*rq$@MyhW||gvWYQGQ4S?g{kw?JoD4NX($@Q!QNTbW*ZxZOQ&O9HtyNzQ3q2yXeBs;43?V1v~ui(W3la<}p3p zuZJeq@Ne20IF}jRa@Kz$tK`MpqJneo$YISR%*6aBR|oekcMlIsj4=5y&vW+;Zy4!6 zf5yKmuVmW^r}*T`;@o^ESa3L4aKim!c>f4H!caQhW+O(lEIxTDcx1hkkrwailjcpx z@P>+gy~$pR{>*(PI}VuKxYtHBt{d2XDR>}1aAd##;wHyb%#7T~kbKALcWZ(XQ%&o=CR*msK71+9lX*l+}^Jlo%pSzQM{XbW`{*fIc0+~kxCvpNN zo6%3Uj|yJgT72nc$6yx1^bvUFRA6InXcF$NX0>{oE7)AYU8c2PVp4`@v^T@kHz6az zcJLp`w`~u0rTf{FeJb_SYv|8D<=?%`Z8vIV>p{-hmOI*Bs}7pU`Lj0u z&$|2XQ8!zeEy&V5m~+Xl)&8u^(8X)=89`{HDL;7;V>X0Uc+j1DU~F`Gb*nXUe-YEf zy*IX8MBu^&e{N22M*&;jtu?N5r2j&$f8A?N$S_G21BC@gH{G)8p$$`B!gbUz%PW!CNC%9Sl+U3U_XPYDInC2y?6Rpv2UQ zF7NiA*q(RnsUG27i%*{SXCGmuc~|t2@E=%d(o|Hq@8NOyH*YXKdE(6ktG8{ISAEi_ z;gx~~ZeUNgY5b&JW4G?qzSYbV9RH?6Jcw_ByKriwHm1>zM@br;@SNA9hlaj(Jf4Z?lv-w5_cCRSek!7a+@OQ=R>)8MMLbF~byY7ILE|1W_S_ca@ znf)=|+gl@WkEd*nGS~j^uFdu4!Fh?P1(hO#ujL1K6qanu<;`^C7SHc!zC%Tq_Xn1r z46V7B_cSSGwkLs~m2_`L`hUFZCMlbjJd*dX#mV6j<{M;g&hst36IPR-5*9DIU0~Ze M|HWneBzT^0rVhH z)Jsv@=@q^1wYX4AEvYD0#HCiOms+%od))!GEsENDrFy@=nKx~GZu{JO=i#5v`@S>t z&O872eJ80seKzIOtsSnq^_Q3UD_%cmyxN+$_t=z{S`d*I{Q|j~#I%o`YNP zJlu(W@D^0Rt=I#PU~fE*!|;6^is?hGq?JoyEH&M*47~?oDfRVuK0bu$cpQh|AFvC4 zjj7lr+rPg%>P7mSdKv1z6{r`fK@DVssqe~8T2?O_Zl+-}{up(`DWq@fFQ`oP&#^2U zXJaPTp&s0V%19E^a3^YD*P{B{W7?0SGW0TP0DnfkaHk}%uLotKIv9uQa4HVK8K!cI~7#|^0Kzk}WICe$0=jSe0}4SXQ^&d0ep0yknO{61=+$$Kbh4j;h5_=vgSWz^ig zfy&TnRAxF2_w9)~ZyO6y11v!ed?}{ldenW*=KQy?GxZygj3ljFDU79|6*Z!FQ62vg zm8!2%sq3BRzwt;^1`2UBF2FEuMs<7=y%gg>>YaG)o|uJtk@2YK&A~A|-)f$Bm4U;k?e!w6!w*mcPGh2Ve+-HIQZ44QntB zOsFpEuJ?~4|)%~;peE-c4R(O?~5HU2eo~NqXtxr z3-MCaHs3#*{Hw#mG(_=9)Bp-uvg&XeHev;`W2`4o1AZU72qu#hG@{#4Bf1~8Z=XPYn4ZBN_yK0(SyYGVy4k4jzzXb$2~?&wqB67{$!yZP*)Lc>F#ZVjMh8(h{0udKU!dOnB~w3v z8t@mWRCgcmKR6fleVB;+vlj6~{q01(`7TtyE_T-bzm0-Ywbz{Z3F-|VMLqBs>c-bl znR*wM;*U`seTik*d4ivbC8*V2i#F~+evMdrQ7L~GwN_5yG@fszP4vG=B{-dW6Bgk? zoP?j_63nNv4Y#2NlzJgs3)4{#oPe6L#ke1va0=$|bz^;7YfzcF4p-qmOfIF+nX4|q zORyNP!D;v$R$!N@{-?GI^#)g=rsN(}<_?+jPn-5L*pv2DI+6WQnHq(fiiy|Zhs7(C|2jG{;G+KS9vjuSh@(k-r%)uk5 ze%?i0pFw&_sx=CAz9vbbhQcnKj-OyTj+^1X`8MRAbu&K(;Tx!ooyFeRYoU^rRUCEy6{t0^6Sb>uLam*Bc%JtEqZIT;FQDG&lz+nd3I|f}%|z?Q0#rvcP#=(` zsQVf)3wPi!yc=`z7^=TBs72akmTzxVyY1DJ%pV24c`@pZ=A%YlqheQ-2PXiMOy5rp@sO+6|S#o|x2#M^aD<$D}zXa2Q#X40VjzZ&&s z8&Pj`HERFgh9mJI9ENY>5Im>MzkUR&!^t=oXQ6h>^{5xzkJ`PT!# zq+tSfUEtS?Q5P;ky-77{|2Cr*kBd2YFKWLZLk+YmdshR@!Lc|Wb=?+JChkNH=%;ut zK9;1=mBO>A5&ag`;oI05?S+2(aN~GmG3r6(sFXILI=mc}nX66xUethFQGebaMLq8X zYHcOYP|zE8s_^HqA8O>=un=2u1ip`5FmsVVpz|@E`Y_bKACEe}95r=oQHyK?_P}e6 zcc9K6@J(7rDQJXmphkWMm5E-9{Tppm>I+eCSdLmVRX85wsO#@Vb^IV|DxO1K_bw_! zU!gM4d5QnO5p%IozyFt0P{&76H@=8AeuUa?>6QMQOn7{QvCty0V(`dq3e62USu$8yX6`SP?@{PSeB$PoQ7360Jmd*ydBli zBdDqQIVz>U!G8FjsegsPqMotZ&%hg~)&3Fc!}BRB_2*ye4=@MyqLWY=Os=M&l+>V7 zxC!;Zt5I`(BkB$Jq2A;P)Ti_qYCs>O2Gn7V|HcC_pZZWd4;P^_S&Pb00@cq|NCuOZ zOF;wpA!<&J;1K)`YUH1yQuZ|}L*3W<9gZ|kGM1p;e37YFq57#Y^_{2zxi}c_!~WX; zM=9vR@1Rcn6)(iT0Y60*s1aA8-o!!8Z4A|63u=JZq1ME0sOt`*?t2QAspnA{eiL>5 zpRj`GTYsaV8_U=EtG)&`cRO%6-iJ#0am>Qca60y__CH7~u#Ea{EW%fCD)tZZal>V} z6ZfMAG{ND|HY~=Z9()-EJ!l&qzBw1J-FGl?>6msqXv2q^@fL0nRwp#y75Ef7uc2a zX;=96l04rULP0l-G#;Wi z9)!K{LezQv@tf2Q0dv7-97_ELR3;8#M|{V40+qrKQE#5M)nA<5QEOs6s^e1Bz*eHR zSr}PL-ovlMiB$fAhcy4QD6Ak@Kh}IgyFtfUf^BVe)twwq5&bDYgiSUfU$g3uQHiWo->RX-YaC56pIJ!Q?;eMI|%ukqgx zP1n~%fcP_^^)QIIgV2#6O4KpO_le&Um8x*?ZL{h)cQ4*T6cAZIno%RRqv(mH-hJWTu- z@fx9zK-!-+=-9ertMuX@LBem-fQ?=@`ZXK%0M|52{u4~Q1xC1MrPb_}F2p3Zd4!Yorh z;x~D}w0}=|KQYCeGpD>?+;>r#L}cjwFKc(fqtsWot5dZ$P;VqAQof3aQ|>@?qx^HC z?I@z{dsIFoCQxoWc2Ss1)X>&!+DG6r+L8@8^w!@PufU4N>89L=Q~fBj z#?AR38$ZKe5-Uwz{2OttsrNUE3%FlL$oL@TGIK#U%%omTd`Yw& zRp$I{rr}EJt|`x>oFJa3{%c|tBF5pgZ8V*{Nm~o$Q#b@)#U=PQUPI_8r~WJa5pg+X9ZlHLlyB1fUrnr_p*L}n zuHfiG3^W(1K8kpYc#N1z`&i;9l!HVn(TREk>Uf!0M|}&CM)?3Sk9d(7O%xK_i8>;= zgdcl}X@rhkA8Q{jGUYaYM_~<}4#hld#y=6~68}zomsm>sUoizA$6pZMVdphOgQ1#` z6C7dXRn~>#c4I8Mu636k>X4R5I1P=7xckY_DtATpp!Cv)Kqzb%2ZJ#u9(NnEBgs0a zx;_-CwFALmC=rTA0%6;U#iB90fhz*FPTZPV7mdapdqXH5S{Dk35-oPL#!l2ZcHBwC z?L^dG=h%Uo8mBtp1luldt_xMy{qqaLfp|O|iYM$+9vF2`We45WIkf|3#+*Qcj^cK6 zT_9m6S{fZahi4SIPvuPN6j&E_T0hU(liKQzT$IxK!KfQMv_72QnCcde@87z1{M)_U z#dFrD7mO|_99=NhE|@fB!dUm$b1rwg&+XD-itU!oUF9B_JAQ(l_ufMXPWvozytgm-lFi1|6&xq4(H^rS;+%1}4Ii@NQ zIr+e@L^u$Gh@Cib%QX#z9gLp5>btQfztc#(*@@XDq}F|U{)VFB#>Q}HeUlUO&&K1S zTJF@EA<>#k|3ThEimVbRLKf_JpoJ&I3AeT^=)O@lY;5W1#%MedU?s7TLUxJ6BSR;z zxrby~C$G6XR1xT z49@nh471FGUSeiO8ycL585rXXMVcJ!QteLm<-PCd;$NY6K;rxR$wpc_`i(4z$<{qCv-6*r=@;w}ZpkXsiVGrF*En z-d`)5a!0onvfQJ&-Q7(K$940%Yhn^K^M@7|Ce@%F=XI`vT^tVEOPF;o3AAhV)`SzZ zmujK?qrHM}3VWhm%m2K0xwlHa8;kyNr?1Xz#joN%<+@BbSo;{F-8deQGDd!2dvjFlbszD?fe$iK}$ z;VpN*HGKbq`qtJ zBJQfni5bNqW=kjLgn~gQ(t2;@pp>bs`!Jh_?P1q9g~Q&qt)_u*u70)z>|ns=taeSl zcXwH!?LjA(4jfnM)W-rbyEYWl7UTLx>*S8xxwYQ(T1AT<>W#x6VBWIrd1@->lTpDJ zw>cW~m$n)jO#{0=u)ztoKC^6E2Y(6uB!5_Ipz75Q-IhcnO((BC>~-sID#&u{E-4wP z4wrC;*Q$bD9Jg0hE~qG5J;r_Xk|AE!z4mWB(ra0@reL+rH_=`ea{S5jngjj}yF&`? z%(m{^KAP_2)sLlmjqVe*z1{AYp7sa1e_UU;@0td8*P5a3lWPWfleHw#M7|TY``()8 z239rIdmqJMpgu&pyw7CYXVE>qwomI@YddwyHlO_q{`Gf1zx8jy4?B2s?=5P(jNeP\n" "Language-Team: Webwork Language Team \n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: \n" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: CHINA\n" @@ -72,42 +72,42 @@ msgstr "[_1]% 正确" #: ContentGenerator/Options.pm:171 #, fuzzy msgid "%1's Current Address" -msgstr "[_1] i莽in Mevcut Adres" +msgstr "[_1] 的当前地址" # #. ($user_name) #: ContentGenerator/Options.pm:126 #, fuzzy msgid "%1's Current Password" -msgstr "[_1] i莽in Mevcut 艦ifre" +msgstr "[_1] 的当前密码" # #. ($e_user_name) #: ContentGenerator/Options.pm:175 #, fuzzy msgid "%1's New Address" -msgstr "[_1] i莽in Yeni Adres" +msgstr "[_1] 的新地址" # #. ($e_user_name) #: ContentGenerator/Options.pm:130 #, fuzzy msgid "%1's New Password" -msgstr "[_1] i莽in Yeni 艦ifre" +msgstr "[_1] 的新密码" # #. ($e_user_name) #: ContentGenerator/Options.pm:101 #, fuzzy msgid "%1's new password cannot be blank." -msgstr "[_1] i莽in yeni 艧ifre bo艧 b谋rak谋lamaz." +msgstr "[_1] 的新密码不能是空白." # #. ($e_user_name) #: ContentGenerator/Options.pm:84 #, fuzzy msgid "%1's password has been changed." -msgstr "[_1] adl谋 kullan谋c谋n谋n 艧ifresi de臒i艧tirildi." +msgstr "[_1] 的密码已更改." # #. ($setID, $problemID) @@ -126,24 +126,24 @@ msgstr "Sorular谋n [_1] tanesi yan谋ts谋z b谋rak谋ld谋." # #: ContentGenerator/Problem.pm:1188 msgid "(This problem will not count towards your grade.)" -msgstr "(Bu soru notunuzu etkilemeyecektir.)" +msgstr "(这道题将不会计算成绩.)" # #: ContentGenerator/Problem.pm:1299 msgid "ANSWERS ONLY CHECKED -- ANSWERS NOT RECORDED" -msgstr "YANITLAR SADECE KONTROL ED陌L陌YOR -- YANITLAR KAYDED陌LMED陌" +msgstr "答案仅为检查 -- 答案没有被记录" # #: ContentGenerator/Instructor/ProblemSetList.pm:1708 #: ContentGenerator/Instructor/UserList.pm:1391 #: ContentGenerator/Instructor/UserList.pm:1463 msgid "Abandon changes" -msgstr "tr: Abandon changes" +msgstr "放弃更改" # #: ContentGenerator/Instructor/ProblemSetList.pm:1647 msgid "Abandon export" -msgstr "tr: Abandon export" +msgstr "放弃输出" # #. ($eUserID) @@ -155,22 +155,22 @@ msgstr "[_1] gibi davran谋l谋yor." # #: ContentGenerator/Instructor/UserList.pm:1927 msgid "Active" -msgstr "tr: Active" +msgstr "活跃的" # #: ContentGenerator/Instructor/UserList.pm:1142 msgid "Add how many students?" -msgstr "tr: Add how many students?" +msgstr "增加多少学生?" # #: ContentGenerator/Instructor/UserList.pm:1220 msgid "Add which new users?" -msgstr "tr: Add which new users?" +msgstr "增加哪种新用户?" # #: ContentGenerator/Problem.pm:311 msgid "All of the answers above are correct." -msgstr "Yan谋tlar谋n t眉m眉 do臒ru" +msgstr "上面的所有答案都是正确的." # #. ($verb) @@ -198,7 +198,7 @@ msgstr "tr: All visible sets [_1] all students" #: ContentGenerator/Instructor/ProblemSetList.pm:832 #: ContentGenerator/Instructor/ProblemSetList.pm:870 msgid "Answer Date" -msgstr "tr: Answer Date" +msgstr "答案日期" # #: ContentGenerator/Problem.pm:242 @@ -213,12 +213,12 @@ msgstr "tr: Any changes made below will be reflected in the set for ALL students # #: ContentGenerator.pm:1481 msgid "Apply Options" -msgstr "Appliquer" +msgstr "使用选项" # #: ContentGenerator/Instructor/ProblemSetList.pm:1545 msgid "Assign this set to which users?" -msgstr "tr: Assign this set to which users?" +msgstr "这次作业留给哪些用户?" # #: ContentGenerator/Instructor/UserList.pm:2064 @@ -235,6 +235,7 @@ msgstr "Yan谋tlar谋n en az bir tanesi [_1]do臒ru de臒il." # #: ContentGenerator/ProblemSet.pm:350 +#, fuzzy msgid "Attempts" msgstr "Deneme say谋s谋" @@ -254,13 +255,14 @@ msgstr "Can't get password record for user '[_1]': [_2]" # #: ContentGenerator/Options.pm:142 +#, fuzzy msgid "Change Email Address" -msgstr "E-posta Adresi De臒i艧tir" +msgstr "更改Email地址" # #: ContentGenerator/Options.pm:61 msgid "Change Password" -msgstr "艦ifre De臒i艧tir" +msgstr "更改密码" # #: ContentGenerator/Instructor/UserList.pm:1409 @@ -273,26 +275,29 @@ msgstr "tr: changes abandoned" #: ContentGenerator/Instructor/UserList.pm:1457 #, fuzzy msgid "Changes saved" -msgstr "tr: changes saved" +msgstr "更改已保存" # #: ContentGenerator/Problem.pm:1118 msgid "Check Answers" -msgstr "Yan谋tlar谋 kontrol et" +msgstr "检查答案" # #: ContentGenerator/Problem.pm:1227 +#, fuzzy msgid "Checking additional error messages" msgstr "tr: Checking additional error messages" # #: ContentGenerator/Instructor/ProblemSetList.pm:1011 +#, fuzzy msgid "Choose visibility of the sets to be affected" msgstr "tr: Choose visibility of the sets to be affected" # #: ContentGenerator/Instructor/ProblemSetList.pm:1084 #: ContentGenerator/Instructor/ProblemSetList.pm:982 +#, fuzzy msgid "Choose which sets to be affected" msgstr "tr: Choose which sets to be affected" @@ -312,7 +317,7 @@ msgstr "tr: Click on the login name to edit individual problem set data, (e.g. d # #: ContentGenerator/ProblemSets.pm:435 msgid "Closed" -msgstr "tr: Closed" +msgstr "已关闭" # #: ContentGenerator/Instructor/UserList.pm:2072 @@ -321,7 +326,7 @@ msgstr "tr: Closed" #: ContentGenerator/Instructor/UserList.pm:861 #: ContentGenerator/Instructor/UserList.pm:904 msgid "Comment" -msgstr "tr: Comment" +msgstr "评论" # #. ($e_user_name) @@ -329,12 +334,12 @@ msgstr "tr: Comment" #: ContentGenerator/Options.pm:95 #, fuzzy msgid "Confirm %1's New Password" -msgstr "[_1] i莽in 艦ifre Onay谋" +msgstr "确认[_1]的新密码 " # #: ContentGenerator/Login.pm:206 msgid "Continue" -msgstr "tr: Continue" +msgstr "继续" # #: ContentGenerator/Problem.pm:243 @@ -346,14 +351,14 @@ msgstr "正确" #: ContentGenerator/Options.pm:80 #, fuzzy msgid "Couldn't change %1's password: %2" -msgstr "[_1] adl谋 kullan谋c谋n谋n 艧ifresi de臒i艧tirilemedi: [_2]" +msgstr "不能改变[_1]的密码: [_2]" # #. ($@) #: ContentGenerator/Options.pm:153 #, fuzzy msgid "Couldn't change your email address: %1" -msgstr "E-posta adresiniz de臒i艧tirilemedi: [_1]" +msgstr "不能改变您的email地址: [_1]" # #: ContentGenerator/ProblemSets.pm:71 @@ -365,10 +370,11 @@ msgstr "课程信息" #: ContentGenerator.pm:657 #: ContentGenerator/Home.pm:94 msgid "Courses" -msgstr "Dersler" +msgstr "课程" # #: ContentGenerator/Instructor/ProblemSetList.pm:1351 +#, fuzzy msgid "Create as what type of set?" msgstr "tr: Create as what type of set?" @@ -376,17 +382,18 @@ msgstr "tr: Create as what type of set?" #: ContentGenerator/Instructor/ProblemSetList.pm:1263 #: ContentGenerator/Instructor/UserList.pm:1082 msgid "Delete how many?" -msgstr "tr: Delete how many?" +msgstr "删除多少?" # #: ContentGenerator/Instructor/ProblemSetList.pm:1119 +#, fuzzy msgid "Disable" msgstr "tr: Disable" # #: ContentGenerator.pm:1442 msgid "Display Options" -msgstr "Options d'affichage" +msgstr "显示选项" # #. ($pl) @@ -398,19 +405,19 @@ msgstr "Télécharger une copie de : [plural,_1,Set,Sets]" # #: ContentGenerator/ProblemSet.pm:321 msgid "Download PDF or TeX Hardcopy for Current Set" -msgstr "tr: Download PDF or TeX Hardcopy for Current Set" +msgstr "下载当前作业的PDF或者TeX文件" # #: ContentGenerator/ProblemSets.pm:289 msgid "Download PDF or TeX Hardcopy for Selected Sets" -msgstr "tr: Download PDF or TeX Hardcopy for Selected Sets" +msgstr "下载已选定的作业的PDF或者TeX文件" # #: ContentGenerator/Instructor/ProblemSetList.pm:445 #: ContentGenerator/Instructor/ProblemSetList.pm:831 #: ContentGenerator/Instructor/ProblemSetList.pm:869 msgid "Due Date" -msgstr "tr: Due Date" +msgstr "截止日期" # #: ContentGenerator/Instructor/ProblemSetList.pm:1812 @@ -422,12 +429,12 @@ msgstr "tr: Duplicate this set and name it" #: ContentGenerator/Instructor/UserList.pm:1785 #: ContentGenerator/Instructor/UserList.pm:1818 msgid "Edit" -msgstr "tr: Edit" +msgstr "编辑" # #: ContentGenerator/Instructor/ProblemSetList.pm:603 msgid "Edit All Set Data" -msgstr "tr: Edit All Set Data" +msgstr "编辑所有作业数据" # #: ContentGenerator/Instructor/ProblemSetList.pm:439 @@ -437,7 +444,7 @@ msgstr "tr: Edit Assigned Users" # #: ContentGenerator/Instructor/ProblemSetList.pm:438 msgid "Edit Problems" -msgstr "tr: Edit Problems" +msgstr "编辑题目" # #: ContentGenerator/Instructor/ProblemSetList.pm:441 @@ -447,12 +454,12 @@ msgstr "tr: Edit Set Data" # #: ContentGenerator/Instructor/UserList.pm:961 msgid "Edit Which Users?" -msgstr "tr: Edit Which Users?" +msgstr "编辑哪些用户?" # #: ContentGenerator/Problem.pm:1011 msgid "Edit this problem" -msgstr "tr: Edit this problem" +msgstr "编辑这道题" # #: ContentGenerator/Instructor/ProblemSetList.pm:923 @@ -466,7 +473,7 @@ msgstr "tr: Edit which sets?" #: ContentGenerator/Instructor/UserList.pm:856 #: ContentGenerator/Instructor/UserList.pm:899 msgid "Email Address" -msgstr "tr: Email Address" +msgstr "Email地址" # #: ContentGenerator.pm:1526 @@ -495,17 +502,17 @@ msgstr "tr: Enable/Disable reduced scoring for selected sets" #: ContentGenerator/Instructor/UserList.pm:858 #: ContentGenerator/Instructor/UserList.pm:901 msgid "Enrollment Status" -msgstr "tr: Enrollment Status" +msgstr "注册状态" # #: ContentGenerator/Instructor/UserList.pm:1321 msgid "Enter filename below" -msgstr "tr: Enter filename below" +msgstr "输入文件名" # #: ContentGenerator/Instructor/ProblemSetList.pm:1502 msgid "Enter filenames below" -msgstr "tr: Enter filenames below" +msgstr "输入文件名" # #: ContentGenerator/Problem.pm:240 @@ -515,12 +522,12 @@ msgstr "Yan谋t" # #: ContentGenerator/Instructor/ProblemSetList.pm:1671 msgid "Export selected sets" -msgstr "tr: Export selected sets" +msgstr "输出已选定的集合" # #: ContentGenerator/Instructor/UserList.pm:1317 msgid "Export to what kind of file?" -msgstr "tr: Export to what kind of file?" +msgstr "输出哪种文件" # #: ContentGenerator/Instructor/ProblemSetList.pm:1604 @@ -572,7 +579,7 @@ msgstr "tr: Failed to duplicate set: set [_1] already exists!" # #: ContentGenerator/Instructor/UserList.pm:1339 msgid "Filename" -msgstr "tr: Filename" +msgstr "文件名" # #: ContentGenerator/Instructor/UserList.pm:678 @@ -586,7 +593,7 @@ msgstr "tr: Filter by what text?" #: ContentGenerator/Instructor/UserList.pm:854 #: ContentGenerator/Instructor/UserList.pm:897 msgid "First Name" -msgstr "tr: First Name" +msgstr "名" # #: ContentGenerator/Instructor/UserList.pm:1020 @@ -596,7 +603,7 @@ msgstr "tr: Give new password to which users?" # #: ContentGenerator/Login.pm:231 msgid "Guest Login" -msgstr "tr: Guest Login" +msgstr "游客登录" # #: ContentGenerator/Instructor/ProblemSetList.pm:443 @@ -608,7 +615,7 @@ msgstr "tr: Hardcopy Header" # #: ContentGenerator/Instructor/ProblemSetList.pm:1017 msgid "Hidden" -msgstr "tr: Hidden" +msgstr "隐藏的" # #: ContentGenerator.pm:667 @@ -650,7 +657,7 @@ msgstr "tr: Inactive" # #: Authen.pm:148 msgid "Invalid user ID or password." -msgstr "Yanl谋艧 kullan谋c谋 ad谋 ya da 艧ifre." +msgstr "无效的用户名或者密码." # #: ContentGenerator/Instructor/UserList.pm:2066 @@ -659,7 +666,7 @@ msgstr "Yanl谋艧 kullan谋c谋 ad谋 ya da 艧ifre." #: ContentGenerator/Instructor/UserList.pm:855 #: ContentGenerator/Instructor/UserList.pm:898 msgid "Last Name" -msgstr "tr: Last Name" +msgstr "姓" # #: ContentGenerator.pm:730 @@ -675,13 +682,13 @@ msgstr "K眉t眉phane Taray谋c谋" # #: ContentGenerator/Logout.pm:124 msgid "Log In Again" -msgstr "Tekrar giri艧 yap" +msgstr "再次登录" # #: ContentGenerator.pm:845 #: ContentGenerator.pm:847 msgid "Log Out" -msgstr "脟谋k谋艧 Yap" +msgstr "登出" # #. ($userID) @@ -696,7 +703,7 @@ msgstr "[_1] olarak giri艧 yapt谋n谋z." #: ContentGenerator/Login.pm:77 #, fuzzy msgid "Login Info" -msgstr "tr: Login Name" +msgstr "登录信息" # #: ContentGenerator/Instructor/UserList.pm:2062 @@ -705,13 +712,13 @@ msgstr "tr: Login Name" #: ContentGenerator/Instructor/UserList.pm:853 #: ContentGenerator/Instructor/UserList.pm:896 msgid "Login Name" -msgstr "tr: Login Name" +msgstr "登录名" # #: ContentGenerator/Instructor/UserList.pm:2063 #, fuzzy msgid "Login Status" -msgstr "Durumu" +msgstr "登录状态" # #: ContentGenerator.pm:654 @@ -744,12 +751,12 @@ msgstr "tr: Name the new set" #: ContentGenerator/Instructor/UserList.pm:1937 #: ContentGenerator/Instructor/UserList.pm:2077 msgid "New Password" -msgstr "tr: New Password" +msgstr "新密码" # #: ContentGenerator/Instructor/UserList.pm:1519 msgid "New passwords saved" -msgstr "tr: New passwords saved" +msgstr "新密码已保存" # #: ContentGenerator/Problem.pm:864 @@ -840,7 +847,6 @@ msgstr "tr: Permission Level" # #. (CGI::b($r->maketext($course) #: ContentGenerator/Login.pm:154 -#, fuzzy msgid "Please enter your username and password for %1 below:" msgstr "请在下面[_1]处输入你的用户名和密码 :" @@ -952,7 +958,7 @@ msgstr "Hataları bildir" # #: ContentGenerator/Problem.pm:244 msgid "Result" -msgstr "Sonu莽" +msgstr "结果" # #. (CGI::i($self->$actionHandler(\%genericParams, \%actionParams, \%tableParams) @@ -971,7 +977,7 @@ msgstr "tr: Results of last action performed" #: ContentGenerator/Instructor/UserList.pm:1415 #: ContentGenerator/Instructor/UserList.pm:1487 msgid "Save changes" -msgstr "tr: Save changes" +msgstr "保存改变" # #: ContentGenerator/Instructor/ProblemSetList.pm:1186 @@ -995,7 +1001,7 @@ msgstr "tr: Select all sets" # #: ContentGenerator/Instructor/UserList.pm:535 msgid "Select all users" -msgstr "tr: Select all users" +msgstr "选择所有用户" # #: ContentGenerator/Instructor/ProblemSetList.pm:534 @@ -1134,7 +1140,7 @@ msgstr "Rol Yapmay谋 b谋rak" #: ContentGenerator/Instructor/UserList.pm:857 #: ContentGenerator/Instructor/UserList.pm:900 msgid "Student ID" -msgstr "tr: Student ID" +msgstr "学生ID" # #: ContentGenerator/Problem.pm:1127 @@ -1198,7 +1204,7 @@ msgstr "Yukar谋daki yan谋t [_1]do臒ru de臒il." # #: ContentGenerator/Problem.pm:305 msgid "The answer above is correct." -msgstr "Yukar谋daki yan谋t do臒ru." +msgstr "上面的答案是正确的." # #. (CGI::b($r->maketext("[_1]'s Current Password",$user_name) @@ -1254,7 +1260,7 @@ msgstr "Bu soru grubu hen眉z a莽谋k de臒il." # #: ContentGenerator/Problem.pm:611 msgid "This problem will not count towards your grade." -msgstr "Bu soru, notunuzu etkilemeyecektir." +msgstr "这道题目不算成绩" # #. (CGI::font({class=>$visiblityStateClass}, $visiblityStateText) @@ -1288,7 +1294,7 @@ msgstr "tr: Filename" # #: ContentGenerator/Instructor/UserList.pm:2087 msgid "Users List" -msgstr "tr: Users List" +msgstr "用户列表" # #. ($names{$primary}, $names{$secondary}, $names{$ternary}) @@ -1329,7 +1335,7 @@ msgstr "tr: Warning: Deletion destroys all user-related data and is not undoable # #: ContentGenerator/Home.pm:87 msgid "Welcome to WeBWorK!" -msgstr "WeBWorK sitemize ho艧geldiniz!" +msgstr "欢迎来到WebWorK!" # #: ContentGenerator/Instructor/UserList.pm:665 @@ -1380,19 +1386,19 @@ msgstr "tr: You are not authorized to perform this action." # #: ContentGenerator/Instructor/UserList.pm:1121 msgid "You cannot delete yourself!" -msgstr "tr: You cannot delete yourself!" +msgstr "你不能删除自己!" # #: ContentGenerator/Options.pm:163 #: ContentGenerator/Options.pm:180 msgid "You do not have permission to change email addresses." -msgstr "Adres de臒i艧tirmek i莽in yetkiniz yok." +msgstr "你没有权限改变电子邮件地址." # #: ContentGenerator/Options.pm:117 #: ContentGenerator/Options.pm:139 msgid "You do not have permission to change your password." -msgstr "艦ifre de臒i艧tirmek i莽in yetkiniz yok." +msgstr "你没有权限改变你的密码." # #. ($attemptsLeft,$attemptsLeftNoun) @@ -1418,7 +1424,7 @@ msgstr "Bu soru i莽in [quant,_1,deneme hakk谋,deneme hakk谋] kulland谋n谋z. # #: ContentGenerator/Logout.pm:119 msgid "You have been logged out of WeBWorK." -msgstr "WeBWorK sisteminden 莽谋k谋艧 yapt谋n谋z." +msgstr "你已经登出WeBWorK." # #: ContentGenerator/Instructor/UserList.pm:1933 @@ -1440,7 +1446,7 @@ msgstr "Bu soru i莽in [_1] puan ald谋n谋z." # #: ContentGenerator/Options.pm:157 msgid "Your email address has been changed." -msgstr "E-posta adresiniz de臒i艧tirildi." +msgstr "你的电子邮件地址已经改变." # #. ($lastScore,$notCountedMessage) @@ -1622,7 +1628,7 @@ msgstr "tr: editing all sets" # #: ContentGenerator/Instructor/UserList.pm:985 msgid "editing all users" -msgstr "tr: editing all users" +msgstr "编辑所有用户" # #: ContentGenerator/Instructor/ProblemSetList.pm:953 @@ -1899,9 +1905,8 @@ msgstr "tr: visible users" #. ($self->formatDateTime($set->open_date) #: ContentGenerator/ProblemSets.pm:420 #: ContentGenerator/ProblemSets.pm:448 -#, fuzzy msgid "will open on %1" -msgstr "将在[_1]时开放 " +msgstr "将在%1时开放 " # msgid "Add to which set?" @@ -1948,9 +1953,8 @@ msgid "Set Header for set [_1]" msgstr "tr: Set Header for set [_1]" # -#, fuzzy msgid "Statistics for [_1]" -msgstr "统计数据" +msgstr " [_1]的统计数据" # msgid "Filter" @@ -1994,7 +1998,7 @@ msgstr "成绩" # msgid "Show in another window" -msgstr "tr: Show in another window" +msgstr "在新的窗口里显示" # msgid "Copied auxiliary files from [_1] to new location at [_2]" @@ -2005,9 +2009,8 @@ msgid "Unpublished" msgstr "Yay谋nlanmad谋" # -#, fuzzy msgid "Login" -msgstr "tr: Login Name" +msgstr "登入" # msgid "Email" @@ -2051,7 +2054,7 @@ msgstr "Sauvegarder les résultats sélectionnés sous" # msgid "Save Password" -msgstr "tr: Save Password" +msgstr "保存密码" # msgid "The file '[_1]' is a blank problem!" @@ -2163,7 +2166,7 @@ msgstr "Inclure l'index" # msgid "Display Mode" -msgstr "tr: Display Mode" +msgstr "显示模式" # msgid "You can earn partial credit on this problem." @@ -2175,7 +2178,7 @@ msgstr "tr: Write permissions have not been enabled in '[_1]'. Changes must be # msgid "blank problem" -msgstr "tr: blank problem" +msgstr "空白问题" # msgid "Save Edit" @@ -2240,7 +2243,7 @@ msgstr "tr: Replace [_1]" # msgid "Help" -msgstr "Aide" +msgstr "帮助" # msgid "Add Users" @@ -2289,7 +2292,7 @@ msgstr "tr: The file '[_1]' is a directory!" # msgid "Save As" -msgstr "tr: Save As [TMPL]/" +msgstr "另存为" # msgid "Documentation from source code for PG modules and macro files. Often the most up-to-date information." @@ -2337,7 +2340,7 @@ msgstr "tr: The hardcopy header for set [_1] has been renamed to '[_2]'." # msgid "Save as" -msgstr "tr: Save as" +msgstr "另存为" # msgid "Select action below" @@ -2353,7 +2356,7 @@ msgstr "tr: Unable to write to '[_1]': [_2]" # msgid "Save" -msgstr "tr: Save" +msgstr "保存" # msgid "File '[_1]' exists. File not saved. No changes have been made. You can change the file path for this problem manually from the 'Hmwk Sets Editor' page" @@ -2486,7 +2489,7 @@ msgstr "课程名单编辑" # msgid "Add" -msgstr "tr: Add" +msgstr "添加" # msgid "the original path to the file is [_1]" @@ -2510,7 +2513,7 @@ msgstr "tr: Unable to change the set header for set [_1]. Unknown error." # msgid "options information" -msgstr "tr: options information" +msgstr "选项信息" # msgid "The selected problem([_1]) is not a valid problem for set [_2]." @@ -2522,7 +2525,7 @@ msgstr "tr: Unknown file type" # msgid "course information" -msgstr "tr: course information" +msgstr "课程信息" # msgid "Change User Options" @@ -2532,6 +2535,83 @@ msgstr "Kullan谋c谋 bilgilerini g眉ncelle" msgid "Drop" msgstr "tr: Drop" -msgid " (modified)" -msgstr " (已经修改过)" +# +msgid "Solutions" +msgstr "答案" + +# +msgid "Show:" +msgstr "" + +# +msgid "WeBWorK Assignment [_1] is due : [_2]." +msgstr "" + +# +#, fuzzy +msgid "Hardcopy Generator" +msgstr "tr: Hardcopy Header" + +# +#, fuzzy +msgid "This set is visible to students." +msgstr "Bu soru grubu 枚臒renciler taraf谋ndan [_1]." + +# +msgid "View equations as" +msgstr "" + +# +msgid "From:" +msgstr "" + +# +msgid "Generate Hardcopy" +msgstr "" + +# +msgid "You may choose to show any of the following data. Correct answers and solutions are only available after the answer date of the homework set." +msgstr "" + +# +#, fuzzy +msgid "E-mail Instructor" +msgstr "发电子邮件给授课人" + +# +msgid "Send E-mail:" +msgstr "" + +# +msgid "Cancel Email" +msgstr "取消电子邮件" + +# +#, fuzzy +msgid "E-mail:" +msgstr "电子邮件" + +# +msgid "Correct answers" +msgstr "正确答案" + +# +msgid "Use this form to report to your professor a problem with the WeBWorK system or an error in a problem you are attempting. Along with your message, additional information about the state of the system will be included." +msgstr "" + +# +#, fuzzy +msgid "Student answers" +msgstr "提交答案" + +# +msgid "Hints" +msgstr "提示" + +# +#, fuzzy +msgid "Hardcopy Format:" +msgstr "tr: Hardcopy Header" +#~ msgid " (modified)" +#~ msgstr " (已经修改过)" From f31fd1fa276ca8f2c93df9c47e96e9589b018245 Mon Sep 17 00:00:00 2001 From: John Hsu Date: Wed, 21 Mar 2012 14:24:04 -0700 Subject: [PATCH 07/48] Add error msg in xmlrpc when course not found. During authentication verification, if the credentials specify a course that does not exist, the DB object throws a TableMissing exception. This exception ends up propagating to the xmlrpc handler as a generic "Server: Application Error". So we just catch the exception and replace it with a more informative "Course not found" error. Also demonstrates how to transmit an error code with the error message that was asked a few lines down in comments. --- lib/WebworkWebservice.pm | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/WebworkWebservice.pm b/lib/WebworkWebservice.pm index 27482c46e6..129d99544c 100644 --- a/lib/WebworkWebservice.pm +++ b/lib/WebworkWebservice.pm @@ -202,7 +202,7 @@ if ($UNIT_TESTS_ON) { # now, here's the problem... WeBWorK::Authen looks at $r->params directly, whereas we # need to look at $user and $sent_pw. this is a perfect opportunity for a mixin, i think. my $authenOK; - { + eval { no warnings 'redefine'; local *WeBWorK::Authen::get_credentials = \&WebworkXMLRPC::get_credentials; local *WeBWorK::Authen::maybe_send_cookie = \&WebworkXMLRPC::noop; @@ -210,7 +210,15 @@ if ($UNIT_TESTS_ON) { local *WeBWorK::Authen::set_params = \&WebworkXMLRPC::noop; local *WeBWorK::Authen::write_log_entry = \&WebworkXMLRPC::noop; # maybe fix this to log interactions FIXME $authenOK = $authen->verify; - } + } or do { + if (Exception::Class->caught('WeBWorK::DB::Ex::TableMissing')) { + # was asked to authenticate into a non-existent course + die SOAP::Fault + ->faultcode('404') + ->faultstring('Course not found.') + } + die "Unknown exception when trying to verify authentication."; + }; $self->{authenOK} = $authenOK; $self->{authzOK} = $authz->hasPermissions($user_id, "access_instructor_tools"); From f5fd929f81a444b228cde85a70382045187c986b Mon Sep 17 00:00:00 2001 From: John Hsu Date: Fri, 23 Mar 2012 14:49:33 -0700 Subject: [PATCH 08/48] Implement xmlrpc createCourse, addUser, dropUser. Same as the other xmlrpc functions, requires the same authentication credentials to initiate a session. Also has the actual actions being carried out by a separate module named CourseActions. Beside the authentication credentials, each call needs these new entries as part of the parameter. createCourse: "name": "course name" "section": 100 addUser: "firstname": "John" "lastname": "Smith" "id": "The Doctor" # username "email": "doctor@tardis" "studentid": 87492466 "userpassword": "password" # defaults to studentid if empty # if studentid also empty then no # password "permission": "professor" # valid values from %userRoles # in global.conf # defaults to student if empty dropUser: "id": "The Doctor" # username Note that dropUser does not delete the user, only marks them as dropped from the course. Because of this, addUser has to deal with two cases: an actual new user or a re-enrolling user. The method return is the same as the other xmlrpc calls, except with a 'status' entry marking the call as 'success' or 'failure'. 'failure' means the action did not go through, there will be an accompanying 'message' entry with the error message. --- lib/WebworkWebservice.pm | 59 ++++++++ lib/WebworkWebservice/CourseActions.pm | 186 +++++++++++++++++++++++++ 2 files changed, 245 insertions(+) create mode 100644 lib/WebworkWebservice/CourseActions.pm diff --git a/lib/WebworkWebservice.pm b/lib/WebworkWebservice.pm index 129d99544c..82391424aa 100644 --- a/lib/WebworkWebservice.pm +++ b/lib/WebworkWebservice.pm @@ -107,6 +107,7 @@ use WebworkWebservice::RenderProblem; use WebworkWebservice::LibraryActions; use WebworkWebservice::MathTranslators; use WebworkWebservice::SetActions; +use WebworkWebservice::CourseActions; ############################################################################### package WebworkXMLRPC; @@ -401,6 +402,64 @@ sub tex2pdf { return $self->do( WebworkWebservice::MathTranslators::tex2pdf($self,$in) ); } +# Expecting a hash $in composed of the usual auth credentials +# plus the params specific to this function +#{ +# 'userID' => 'admin', # these are the usual +# 'password' => 'admin', # auth credentials +# 'courseID' => 'admin', # used to initiate a +# 'session_key' => 'key', # session. +# "name": "KEJI554", +# "section": 264, +#} +# Note that we log into the admin course to create courses. +# The course title will be a concatenation of the name and section number. +sub createCourse { + my $class = shift; + my $in = shift; + my $self = $class->initiate_session($in); + return $self->do(WebworkWebservice::CourseActions::create($self, $in)); +} + +# Expecting a hash $in composed of +#{ +# 'userID' => 'admin', # these are the usual +# 'password' => 'admin', # auth credentials +# 'courseID' => 'Math', # used to initiate a +# 'session_key' => 'key', # session. +# "firstname": "John", +# "lastname": "Smith", +# "id": "The Doctor", # required +# "email": "doctor@tardis", +# "studentid": 87492466, +# "userpassword": "password", # defaults to studentid if empty +# # if studentid also empty, then no password +# "permission": "professor", # valid values from %userRoles in global.conf +# # defaults to student if empty +#} +# This user will be added to courseID +sub addUser { + my $class = shift; + my $in = shift; + my $self = $class->initiate_session($in); + return $self->do(WebworkWebservice::CourseActions::addUser($self, $in)); +} + +# Expecting a hash $in composed of +#{ +# 'userID' => 'admin', # these are the usual +# 'password' => 'admin', # auth credentials +# 'courseID' => 'Math', # used to initiate a +# 'session_key' => 'key', # session. +# "id": "BFYM942", +#} +sub dropUser { + my $class = shift; + my $in = shift; + my $self = $class->initiate_session($in); + return $self->do(WebworkWebservice::CourseActions::dropUser($self, $in)); +} + # -- SOAP::Lite -- guide.soaplite.com -- Copyright (C) 2001 Paul Kulchenko -- # test responses diff --git a/lib/WebworkWebservice/CourseActions.pm b/lib/WebworkWebservice/CourseActions.pm new file mode 100644 index 0000000000..d4581b8776 --- /dev/null +++ b/lib/WebworkWebservice/CourseActions.pm @@ -0,0 +1,186 @@ +#!/usr/local/bin/perl -w +use strict; +use warnings; + +# Course manipulation functions for webwork webservices + +package WebworkWebservice::CourseActions; + +use WebworkWebservice; + +use base qw(WebworkWebservice); +use WeBWorK::Utils qw(runtime_use cryptPassword); +use WeBWorK::Utils::CourseManagement qw(addCourse); +use WeBWorK::Debug; +use Data::Dumper; # TODO remove + + +sub create { + my ($self, $params) = @_; + my $newcourse = $params->{'name'} . '-' . $params->{'section'}; + my $ce = WeBWorK::CourseEnvironment->new({ + webwork_dir => $self->{ce}->{webwork_dir}, + courseName => $newcourse + }); + my $out = {}; + debug("XMLRPC course creation: " . Dumper($params)); + + # declare params + my @professors = (); + my $dbLayout = $ce->{dbLayoutName}; + my %courseOptions = ( dbLayoutName => $dbLayout ); + my %dbOptions; + my @users; + my %optional_arguments; + + my $userClass = $ce->{dbLayouts}->{$dbLayout}->{user}->{record}; + my $passwordClass = $ce->{dbLayouts}->{$dbLayout}->{password}->{record}; + my $permissionClass = $ce->{dbLayouts}->{$dbLayout}->{permission}->{record}; + + runtime_use($userClass); + runtime_use($passwordClass); + runtime_use($permissionClass); + + # configure users, only admin users + # TODO admin user password + my $admin = 'admin'; + my %record = (); + $record{status} = $ce->{statuses}->{Enrolled}->{abbrevs}->[0]; + $record{student_id} = $admin; + $record{password} = cryptPassword($admin); + $record{permission} = $ce->{userRoles}{admin}; + $record{user_id} = $admin; + $record{last_name} = 'Administrator'; + + my $User = $userClass->new(%record); + my $PermissionLevel = $permissionClass->new(user_id => $admin, permission => $record{permission}); + my $Password = $passwordClass->new(user_id => $admin, password => $record{password}); + + push @users, [ $User, $Password, $PermissionLevel ]; + + # call + eval { + addCourse( + courseID => $newcourse, + ce => $ce, + courseOptions => \%courseOptions, + dbOptions => \%dbOptions, + users => \@users, + %optional_arguments, + ); + $out->{status} = "success"; + } or do { + $out->{status} = "failure"; + $out->{message} = $@; + }; + + return $out; +} + +sub addUser { + my ($self, $params) = @_; + my $out = {}; + my $db = $self->{db}; + debug("XMLRPC Add User: " . Dumper($params)); + # Two scenarios + # 1. New user + # 2. Dropped user deciding to re-enrol + + my $olduser = $db->getUser($params->{id}); + if ($olduser) { + # a dropped user decided to re-enrol + my $enrolled = $self->{ce}->{statuses}->{Enrolled}->{abbrevs}->[0]; + $olduser->status($enrolled); + $db->putUser($olduser); + # TODO add log entry + # TODO assign sets + $out->{status} = 'success'; + } + else { + # a new user showed up + my $ce = $self->{ce}; + my $id = $params->{'id'}; + + # student record + my $enrolled = $ce->{statuses}->{Enrolled}->{abbrevs}->[0]; + my $new_student = $db->{user}->{record}->new(); + $new_student->user_id($id); + $new_student->first_name($params->{'firstname'}); + $new_student->last_name($params->{'lastname'}); + $new_student->status($enrolled); + $new_student->student_id($params->{'studentid'}); + $new_student->email_address($params->{'email'}); + + # password record + my $cryptedpassword = ""; + if ($params->{'userpassword'}) { + $cryptedpassword = cryptPassword($params->{'userpassword'}); + } + elsif ($new_student->student_id()) { + $cryptedpassword = cryptPassword($new_student->student_id()); + } + my $password = $db->newPassword(user_id => $id); + $password->password($cryptedpassword); + + # permission record + my $permission = $params->{'permission'}; + debug($params->{'permission'}); + if (defined($ce->{userRoles}{$permission})) { + $permission = $db->newPermissionLevel( + user_id => $id, + permission => $ce->{userRoles}{$permission}); + } + else { + $permission = $db->newPermissionLevel(user_id => $id, + permission => $ce->{userRoles}{student}); + } + + # commit changes to db + $out->{status} = 'success'; + eval{ $db->addUser($new_student); }; + if ($@) { + $out->{status} = 'failure'; + $out->{message} = "Add user for $id failed!\n"; + } + eval { $db->addPassword($password); }; + if ($@) { + $out->{status} = 'failure'; + $out->{message} = "Add password for $id failed!\n"; + } + eval { $db->addPermissionLevel($permission); }; + if ($@) { + $out->{status} = 'failure'; + $out->{message} = "Add permission for $id failed!\n"; + } + # TODO add log entry + # TODO assign sets + } + + return $out; +} + +sub dropUser { + my ($self, $params) = @_; + my $db = $self->{db}; + my $out = {}; + debug("XMLRPC Drop User: " . Dumper($params)); + # Mark user as dropped + my $drop = $self->{ce}->{statuses}->{Drop}->{abbrevs}->[0]; + my $person = $db->getUser($params->{'id'}); + if ($person) + { + $person->status($drop); + $db->putUser($person); + # TODO add log entry + $out->{status} = 'success'; + } + else + { + $out->{status} = 'failure'; + $out->{message} = 'Could not find user'; + } + + return $out; +} + +1; From 66480b2416cdfb83d074fa023a03261b43640bab Mon Sep 17 00:00:00 2001 From: Grant He Date: Fri, 23 Mar 2012 20:39:24 -0400 Subject: [PATCH 09/48] ghe3: implemented Datepicker --- conf/templates/math3/math3.css | 14 +- conf/templates/math3/system.template | 114 +- htdocs/js/hmwksets_handlers.js | 8 +- .../Instructor/ProblemSetList.pm | 1076 ++++++++++------- lib/WeBWorK/Localize/en.po | 14 +- 5 files changed, 741 insertions(+), 485 deletions(-) diff --git a/conf/templates/math3/math3.css b/conf/templates/math3/math3.css index a47a1627e5..992c952741 100644 --- a/conf/templates/math3/math3.css +++ b/conf/templates/math3/math3.css @@ -285,7 +285,6 @@ clear: both; #loginstatus { color: white; - /* position: absolute; */ top: -75px; left: 1170px; width: 200px; @@ -294,7 +293,7 @@ clear: both; padding: 0; margin: 1ex .5em .1ex .1em; font-size: smaller; -} +} /*Relative Positioning -- a alternate style for the loginstatus which uses relative positioning. Tested, but was decided that it didn't work great. Feel free to uncomment if you want to try it out.*/ @@ -432,8 +431,7 @@ clear: both; * it is emitted by WW code in ProblemSet.pl (not in system.template) ! */ #InfoPanel { font-size:100%; - float: right; - max-width: 400px; + max-width: 100%; overflow: auto; /*margin-right: -1px;*/ background-color: #fff; @@ -716,7 +714,7 @@ span.gray_button{ width: 100%; } -/*Styles specifically for the problem viewer*/ +Styles specifically for the problem viewer #problem_viewer_form{ margin-left: 10px; @@ -758,7 +756,7 @@ span.gray_button{ margin-top: 10%; margin-left: 10%; margin-right: 10%; -} +}*/ #editor{ width: 750px; @@ -810,11 +808,11 @@ div.problem_sets_options { table.problem_set_table{ margin-top: 30px; width: 640px; - text-align: left; + text-align: center; } /*BUG FIXES*/ table#grades_table pre{ float: left; -} +} \ No newline at end of file diff --git a/conf/templates/math3/system.template b/conf/templates/math3/system.template index 2bbad2f1f1..91e3d0a424 100644 --- a/conf/templates/math3/system.template +++ b/conf/templates/math3/system.template @@ -32,6 +32,9 @@ /css/tabber.css"/> + + /css/jquery-ui-1.8.18.custom.css"/> + @@ -93,66 +96,67 @@ including the warning messages below.

    - - - -
    - - - - - - - - - - - - - - - -
    - - - - - + + + +
    + + + + + + +
    + + + + + + + + + +
    + + + + + + + + + +
    - - + +

    + + + + + + +

    -
    - - -

    - - + +

    + +
    - - + + -

    - - -
    - -
    - - - - - -
    - - - -
    - + +
    - - + + + +
    + +
    + + diff --git a/htdocs/js/hmwksets_handlers.js b/htdocs/js/hmwksets_handlers.js index 2b9b6b0a6d..647e303880 100644 --- a/htdocs/js/hmwksets_handlers.js +++ b/htdocs/js/hmwksets_handlers.js @@ -13,6 +13,8 @@ function hmwksets_add_filter_elements() { } addOnLoadEvent(function() { - document.getElementById("filter_select").onchange = hmwksets_add_filter_elements; - hmwksets_add_filter_elements(); -}); \ No newline at end of file + if(document.getElementById("filter_select") != null){ + document.getElementById("filter_select").onchange = hmwksets_add_filter_elements; + } +}); + diff --git a/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm b/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm index ed52a2d741..0f05d3da9e 100644 --- a/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm +++ b/lib/WeBWorK/ContentGenerator/Instructor/ProblemSetList.pm @@ -263,7 +263,7 @@ sub pre_header_initialize { my @setsToScore = (); if ($scope eq "none") { - return "No sets selected for scoring."; + return $r->maketext("No sets selected for scoring"."."); } elsif ($scope eq "all") { @setsToScore = @{ $r->param("allSetIDs") }; } elsif ($scope eq "visible") { @@ -303,7 +303,7 @@ sub initialize { # templates for getting field names my $setTemplate = $self->{setTemplate} = $db->newGlobalSet; - return CGI::div({class => "ResultsWithError"}, "You are not authorized to access the Instructor tools.") + return CGI::div({class => "ResultsWithError"}, $r->maketext("You are not authorized to access the instructor tools.")) unless $authz->hasPermissions($user, "access_instructor_tools"); ########## set initial values for state fields @@ -336,12 +336,12 @@ sub initialize { $self->{editMode} = $r->param("editMode") || 0; - return CGI::div({class=>"ResultsWithError"}, CGI::p("You are not authorized to modify homework sets.")) + return CGI::div({class=>"ResultsWithError"}, CGI::p($r->maketext("You are not authorized to modify homework sets."))) if $self->{editMode} and not $authz->hasPermissions($user, "modify_problem_sets"); $self->{exportMode} = $r->param("exportMode") || 0; - return CGI::div({class=>"ResultsWithError"}, CGI::p("You are not authorized to modify set definition files.")) + return CGI::div({class=>"ResultsWithError"}, CGI::p($r->maketext("You are not authorized to modify set definition files."))) if $self->{exportMode} and not $authz->hasPermissions($user, "modify_set_def_files"); $self->{primarySortField} = $r->param("primarySortField") || "due_date"; @@ -372,7 +372,7 @@ sub initialize { $self->{actionID} = $actionID; if ($actionID) { unless (grep { $_ eq $actionID } @{ VIEW_FORMS() }, @{ EDIT_FORMS() }, @{ EXPORT_FORMS() }) { - die "Action $actionID not found"; + die $r->maketext("Action [_1] not found", $actionID); } # Check permissions if (not FORM_PERMS()->{$actionID} or $authz->hasPermissions($user, FORM_PERMS()->{$actionID})) { @@ -383,20 +383,17 @@ sub initialize { } my %actionParams = $self->getActionParams($actionID); my %tableParams = $self->getTableParams(); - $self->addmessage( CGI::div({class=>"Message"}, "Results of last action performed: ")); - $self->addmessage( - $self->$actionHandler(\%genericParams, \%actionParams, \%tableParams), - CGI::hr() - ); + $self->addmessage(CGI::div({class=>"Message"}, $r->maketext("Results of last action performed").": ")); + $self->addmessage($self->$actionHandler(\%genericParams, \%actionParams, \%tableParams)); } else { - return CGI::div({class=>"ResultsWithError"}, CGI::p("You are not authorized to perform this action.")); + return CGI::div({class=>"ResultsWithError"}, CGI::p($r->maketext("You are not authorized to perform this action."))); } } else { - $self->addgoodmessage("Please select action to be performed."); + $self->addgoodmessage($r->maketext("Please select action to be performed.")); } @@ -418,7 +415,7 @@ sub body { # templates for getting field names my $setTemplate = $self->{setTemplate} = $db->newGlobalSet; - return CGI::div({class => "ResultsWithError"}, "You are not authorized to access the Instructor tools.") + return CGI::div({class => "ResultsWithError"}, $r->maketext("You are not authorized to access the instructor tools.")) unless $authz->hasPermissions($user, "access_instructor_tools"); # This table can be consulted when display-ready forms of field names are needed. @@ -426,7 +423,6 @@ sub body { $setTemplate->FIELDS(); @prettyFieldNames{qw( - select problems users filename @@ -439,18 +435,17 @@ sub body { visible enable_reduced_scoring )} = ( - "Select", - "Edit
    Problems", - "Edit
    Assigned Users", - "Set Definition Filename", - "Edit
    Set Data", - "Set Header", - "Hardcopy Header", - "Open Date", - "Due Date", - "Answer Date", - "Visible", - "Reduced Credit
    Enabled" + $r->maketext("Edit Problems"), + $r->maketext("Edit Assigned Users"), + $r->maketext("Set Definition Filename"), + $r->maketext("Edit Set Data"), + $r->maketext("Set Header"), + $r->maketext("Hardcopy Header"), + $r->maketext("Open Date"), + $r->maketext("Due Date"), + $r->maketext("Answer Date"), + $r->maketext("Visible"), + $r->maketext("Reduced Credit Enabled") ); @@ -497,9 +492,14 @@ sub body { @Sets = sort $primarySortSub @Sets; } + ########## print site identifying information + + print WeBWorK::CGI_labeled_input(-type=>"button", -id=>"show_hide", -input_attr=>{-value=>$r->maketext("Show/Hide Site Description"), -class=>"button_input"}); + print CGI::p({-id=>"site_description", -style=>"display:none"}, CGI::em($r->maketext("_HMWKSETS_EDITOR_DESCRIPTION"))); + ########## print beginning of form - print CGI::start_form({method=>"post", action=>$self->systemLink($urlpath,authen=>0), name=>"problemsetlist"}); + print CGI::start_form({method=>"post", action=>$self->systemLink($urlpath,authen=>0), name=>"problemsetlist", -class=>"edit_form", -id=>"edit_form_id"}); print $self->hidden_authen_fields(); ########## print state data @@ -528,10 +528,10 @@ sub body { ########## print action forms - print CGI::p(CGI::b("Any changes made below will be reflected in the set for ALL students.")) if $editMode; + print CGI::p(CGI::b($r->maketext("Any changes made below will be reflected in the set for ALL students."))) if $editMode; - print CGI::start_table({}); - print CGI::Tr({}, CGI::td({-colspan=>2}, "Select an action to perform:")); + # print CGI::start_table({}); + print CGI::p($r->maketext("Select an action to perform").":"); my @formsToShow; if ($editMode) { @@ -545,52 +545,66 @@ sub body { } my $i = 0; + my @divArr = (); + foreach my $actionID (@formsToShow) { # Check permissions next if FORM_PERMS()->{$actionID} and not $authz->hasPermissions($user, FORM_PERMS()->{$actionID}); my $actionForm = "${actionID}_form"; - my $onChange = "document.problemsetlist.action[$i].checked=true"; + #my $onChange = "document.problemsetlist.action[$i].checked=true"; + my $onChange = ""; my %actionParams = $self->getActionParams($actionID); - print CGI::Tr({-valign=>"top"}, - CGI::td({}, CGI::input({-type=>"radio", -name=>"action", -value=>$actionID})), - CGI::td({}, $self->$actionForm($onChange, %actionParams)) - ); + # print CGI::Tr({-valign=>"top"}, + # CGI::td({}, CGI::input({-type=>"radio", -name=>"action", -value=>$actionID})), + # CGI::td({}, $self->$actionForm($onChange, %actionParams)) + # ); + + my $extraspace = (ucfirst(WeBWorK::split_cap($actionID)) eq "Filter") ? "" : CGI::br(); + push @divArr, join("", + CGI::h3($r->maketext(ucfirst(WeBWorK::split_cap($actionID)))), + CGI::span({-class=>"radio_span"}, WeBWorK::CGI_labeled_input(-type=>"radio", -id=>$actionID."_id", -label_text=>$r->maketext(ucfirst(WeBWorK::split_cap($actionID))), -input_attr=>{-name=>"action", -value=>$actionID}, -label_attr=>{-class=>"radio_label"})), + CGI::br(), + $self->$actionForm($onChange, %actionParams), + CGI::br(), + $extraspace, + ); $i++; } - my $selectAll =CGI::input({-type=>'button', -name=>'check_all', -value=>'Select all sets', + my $divArrRef = \@divArr; + + print CGI::div({-class=>"tabber"}, + CGI::div({-class=>"tabbertab"},$divArrRef) + ); + + my $selectAll =WeBWorK::CGI_labeled_input(-type=>'button', -id=>"select_all", -input_attr=>{-name=>'check_all', -value=>$r->maketext('Select all sets'), onClick => "for (i in document.problemsetlist.elements) { if (document.problemsetlist.elements[i].name =='selected_sets') { document.problemsetlist.elements[i].checked = true } }" }); - my $selectNone =CGI::input({-type=>'button', -name=>'check_none', -value=>'Unselect all sets', + my $selectNone =WeBWorK::CGI_labeled_input(-type=>'button', -id=>"select_none", -input_attr=>{-name=>'check_none', -value=>$r->maketext('Unselect all sets'), onClick => "for (i in document.problemsetlist.elements) { if (document.problemsetlist.elements[i].name =='selected_sets') { document.problemsetlist.elements[i].checked = false } }" }); unless ($editMode or $exportMode) { - print CGI::Tr({}, CGI::td({ colspan=>2, -align=>"center"}, - $selectAll." ". $selectNone - ) - ); + print $selectAll." ". $selectNone; } - print CGI::Tr({}, CGI::td({-colspan=>2, -align=>"center"}, - CGI::submit(-value=>"Take Action!")) - ); - print CGI::end_table(); - + print WeBWorK::CGI_labeled_input(-type=>"reset", -id=>"clear_entries", -input_attr=>{-value=>$r->maketext("Clear"), -class=>"button_input"}); + print WeBWorK::CGI_labeled_input(-type=>"submit", -id=>"take_action", -input_attr=>{-value=>$r->maketext("Take Action!"), -class=>"button_input"}).CGI::br().CGI::br(); + ########## print table ########## first adjust heading if in editMode - $prettyFieldNames{set_id} = "Edit All
    Set Data" if $editMode; - $prettyFieldNames{enable_reduced_scoring} = 'Enable Reduced
    Credit' if $editMode; + $prettyFieldNames{set_id} = $r->maketext("Edit All Set Data") if $editMode; + $prettyFieldNames{enable_reduced_scoring} = $r->maketext('Enable Reduced Credit') if $editMode; - print CGI::p({},"Showing ", scalar @visibleSetIDs, " out of ", scalar @allSetIDs, " sets."); + print CGI::p({},$r->maketext("Showing [_1] out of [_2] sets.", scalar @visibleSetIDs, scalar @allSetIDs)); $self->printTableHTML(\@Sets, \%prettyFieldNames, editMode => $editMode, @@ -644,58 +658,43 @@ sub getTableParams { sub filter_form { my ($self, $onChange, %actionParams) = @_; - #return CGI::table({}, CGI::Tr({-valign=>"top"}, - # CGI::td({}, + my $r = $self->r; + return join("", - "Show ", - CGI::popup_menu( - -name => "action.filter.scope", - -values => [qw(all none selected match_ids visible unvisible)], - -default => $actionParams{"action.filter.scope"}->[0] || "match_ids", - -labels => { - all => "all sets", - none => "no sets", - selected => "sets checked below", - visible => "sets visible to students", - unvisible => "sets hidden from students", - match_ids => "sets with matching set IDs:", - }, - -onchange => $onChange, + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"filter_select", + -label_text=>$r->maketext("Show which sets?").": ", + -input_attr=>{ + -name => "action.filter.scope", + -values => [qw(all none selected match_ids visible unvisible)], + -default => $actionParams{"action.filter.scope"}->[0] || "match_ids", + -labels => { + all => $r->maketext("all sets"), + none => $r->maketext("no sets"), + selected => $r->maketext("selected sets"), + visible => $r->maketext("visible sets"), + unvisible => $r->maketext("hidden sets"), + match_ids => $r->maketext("enter matching set IDs below"), + }, + -onchange => $onChange, + } ), + CGI::br(), " ", - CGI::textfield( - -name => "action.filter.set_ids", - -value => $actionParams{"action.filter.set_ids"}->[0] || "",, - -width => "50", - -onchange => $onChange, + CGI::div({-id=>"filter_elements"}, + WeBWorK::CGI_labeled_input( + -type=>"text", + -id=>"filter_text", + -label_text=>$r->maketext("Match on what? (separate multiple IDs with commas)").": ", + -input_attr=>{ + -name => "action.filter.set_ids", + -value => $actionParams{"action.filter.set_ids"}->[0] || "",, + -width => "50", + -onchange => $onChange, + } + ), CGI::span({-id=>"filter_err_msg", -class=>"ResultsWithError"}, $r->maketext("Please enter in a value to match in the filter field.")), ), - " (separate multiple IDs with commas)", - CGI::br(), -# "Open dates: ", -# CGI::popup_menu( -# -name => "action.filter.open_date", -# -values => [ keys %{ $self->{open_dates} } ], -# -default => $actionParams{"action.filter.open_date"}->[0] || "", -# -labels => { $self->menuLabels($self->{open_dates}) }, -# -onchange => $onChange, -# ), -# " Due dates: ", -# CGI::popup_menu( -# -name => "action.filter.due_date", -# -values => [ keys %{ $self->{due_dates} } ], -# -default => $actionParams{"action.filter.due_date"}->[0] || "", -# -labels => { $self->menuLabels($self->{due_dates}) }, -# -onchange => $onChange, -# ), -# " Answer dates: ", -# CGI::popup_menu( -# -name => "action.filter.answer_date", -# -values => [ keys %{ $self->{answer_dates} } ], -# -default => $actionParams{"action.filter.answer_date"}->[0] || "", -# -labels => { $self->menuLabels($self->{answer_dates}) }, -# -onchange => $onChange, -# ), - ); } @@ -710,16 +709,18 @@ sub filter_handler { my $result; my $scope = $actionParams->{"action.filter.scope"}->[0]; + if ($scope eq "all") { - $result = "showing all sets"; + $result = $r->maketext("showing all sets"); $self->{visibleSetIDs} = $self->{allSetIDs}; } elsif ($scope eq "none") { - $result = "showing no sets"; + $result = $r->maketext("showing no sets"); $self->{visibleSetIDs} = []; } elsif ($scope eq "selected") { - $result = "showing selected sets"; + $result = $r->maketext("showing selected sets"); $self->{visibleSetIDs} = $genericParams->{selected_sets}; # an arrayref } elsif ($scope eq "match_ids") { + #my @setIDs = split /\s*,\s*/, $actionParams->{"action.filter.set_ids"}->[0]; my @setIDs = split /\s*,\s*/, $actionParams->{"action.filter.set_ids"}->[0]; $self->{visibleSetIDs} = \@setIDs; } elsif ($scope eq "match_open_date") { @@ -748,45 +749,55 @@ sub filter_handler { sub sort_form { my ($self, $onChange, %actionParams) = @_; + my $r = $self->r; return join ("", - "Primary sort: ", - CGI::popup_menu( - -name => "action.sort.primary", - -values => [qw(set_id set_header hardcopy_header open_date due_date answer_date visible)], - -default => $actionParams{"action.sort.primary"}->[0] || "due_date", - -labels => { - set_id => "Set Name", - set_header => "Set Header", - hardcopy_header => "Hardcopy Header", - open_date => "Open Date", - due_date => "Due Date", - answer_date => "Answer Date", - visible => "Visibility", - }, - -onchange => $onChange, + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"sort_select_1", + -label_text=>$r->maketext("Sort by").": ", + -input_attr=>{ + -name => "action.sort.primary", + -values => [qw(set_id set_header hardcopy_header open_date due_date answer_date visible)], + -default => $actionParams{"action.sort.primary"}->[0] || "due_date", + -labels => { + set_id => $r->maketext("Set Name"), + set_header => $r->maketext("Set Header"), + hardcopy_header => $r->maketext("Hardcopy Header"), + open_date => $r->maketext("Open Date"), + due_date => $r->maketext("Due Date"), + answer_date => $r->maketext("Answer Date"), + visible => $r->maketext("Visibility"), + }, + -onchange => $onChange, + } ), - " Secondary sort: ", - CGI::popup_menu( - -name => "action.sort.secondary", - -values => [qw(set_id set_header hardcopy_header open_date due_date answer_date visible)], - -default => $actionParams{"action.sort.secondary"}->[0] || "open_date", - -labels => { - set_id => "Set Name", - set_header => "Set Header", - hardcopy_header => "Hardcopy Header", - open_date => "Open Date", - due_date => "Due Date", - answer_date => "Answer Date", - visible => "Visibility", - }, - -onchange => $onChange, + CGI::br(), + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"sort_select_2", + -label_text=>$r->maketext("Then by").": ", + -input_attr=>{ + -name => "action.sort.secondary", + -values => [qw(set_id set_header hardcopy_header open_date due_date answer_date visible)], + -default => $actionParams{"action.sort.secondary"}->[0] || "open_date", + -labels => { + set_id => $r->maketext("Set Name"), + set_header => $r->maketext("Set Header"), + hardcopy_header => $r->maketext("Hardcopy Header"), + open_date => $r->maketext("Open Date"), + due_date => $r->maketext("Due Date"), + answer_date => $r->maketext("Answer Date"), + visible => $r->maketext("Visibility"), + }, + -onchange => $onChange, + } ), - ".", ); } sub sort_handler { my ($self, $genericParams, $actionParams, $tableParams) = @_; + my $r = $self->r; my $primary = $actionParams->{"action.sort.primary"}->[0]; my $secondary = $actionParams->{"action.sort.secondary"}->[0]; @@ -795,52 +806,58 @@ sub sort_handler { $self->{secondarySortField} = $secondary; my %names = ( - set_id => "Set Name", - set_header => "Set Header", - hardcopy_header => "Hardcopy Header", - open_date => "Open Date", - due_date => "Due Date", - answer_date => "Answer Date", - visible => "Visibility", + set_id => $r->maketext("Set Name"), + set_header => $r->maketext("Set Header"), + hardcopy_header => $r->maketext("Hardcopy Header"), + open_date => $r->maketext("Open Date"), + due_date => $r->maketext("Due Date"), + answer_date => $r->maketext("Answer Date"), + visible => $r->maketext("Visibility"), ); - return "sort by $names{$primary} and then by $names{$secondary}."; + return $r->maketext("Sort by [_1] and then by [_2]", $names{$primary}, $names{$secondary}); } sub edit_form { my ($self, $onChange, %actionParams) = @_; + my $r = $self->r; return join("", - "Edit ", - CGI::popup_menu( - -name => "action.edit.scope", - -values => [qw(all visible selected)], - -default => $actionParams{"action.edit.scope"}->[0] || "selected", - -labels => { - all => "all sets", - visible => "visible sets", - selected => "selected sets", - }, - -onchange => $onChange, + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"edit_select", + -label_text=>$r->maketext("Edit which sets?").": ", + -input_attr=>{ + -name => "action.edit.scope", + -values => [qw(all visible selected)], + -default => $actionParams{"action.edit.scope"}->[0] || "selected", + -labels => { + all => $r->maketext("all sets"), + visible => $r->maketext("visible sets"), + selected => $r->maketext("selected sets"), + }, + -onchange => $onChange, + } ), ); } sub edit_handler { my ($self, $genericParams, $actionParams, $tableParams) = @_; + my $r = $self->r; my $result; my $scope = $actionParams->{"action.edit.scope"}->[0]; if ($scope eq "all") { - $result = "editing all sets"; + $result = $r->maketext("editing all sets"); $self->{visibleSetIDs} = $self->{allSetIDs}; } elsif ($scope eq "visible") { - $result = "editing visible sets"; + $result = $r->maketext("editing visible sets"); # leave visibleUserIDs alone } elsif ($scope eq "selected") { - $result = "editing selected sets"; + $result = $r->maketext("editing selected sets"); $self->{visibleSetIDs} = $genericParams->{selected_sets}; # an arrayref } $self->{editMode} = 1; @@ -850,32 +867,42 @@ sub edit_handler { sub publish_form { my ($self, $onChange, %actionParams) = @_; + my $r = $self->r; return join ("", - "Make ", - CGI::popup_menu( - -name => "action.publish.scope", - -values => [ qw(none all selected) ], - -default => $actionParams{"action.publish.scope"}->[0] || "selected", - -labels => { - none => "", - all => "all sets", -# visible => "visible sets", - selected => "selected sets", - }, - -onchange => $onChange, + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"publish_filter_select", + -label_text=>$r->maketext("Choose which sets to be affected").": ", + -input_attr=>{ + -name => "action.publish.scope", + -values => [ qw(none all selected) ], + -default => $actionParams{"action.publish.scope"}->[0] || "selected", + -labels => { + none => $r->maketext("no sets"), + all => $r->maketext("all sets"), +# visible => "visible sets", + selected => $r->maketext("selected sets"), + }, + -onchange => $onChange, + } ), - CGI::popup_menu( - -name => "action.publish.value", - -values => [ 0, 1 ], - -default => $actionParams{"action.publish.value"}->[0] || "1", - -labels => { - 0 => "hidden", - 1 => "visible", - }, - -onchange => $onChange, + CGI::br(), + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"publish_visibility_select", + -label_text=>$r->maketext("Choose visibility of the sets to be affected").": ", + -input_attr=>{ + -name => "action.publish.value", + -values => [ 0, 1 ], + -default => $actionParams{"action.publish.value"}->[0] || "1", + -labels => { + 0 => $r->maketext("Hidden"), + 1 => $r->maketext("Visible"), + }, + -onchange => $onChange, + } ), - " for students.", ); } @@ -890,22 +917,22 @@ sub publish_handler { my $scope = $actionParams->{"action.publish.scope"}->[0]; my $value = $actionParams->{"action.publish.value"}->[0]; - my $verb = $value ? "made visible for" : "hidden from"; + my $verb = $value ? $r->maketext("made visible for") : $r->maketext("hidden from"); my @setIDs; if ($scope eq "none") { # FIXME: double negative "Make no sets hidden" might make professor expect all sets to be made visible. @setIDs = (); - $result = CGI::div({class=>"ResultsWithError"},"No change made to any set."); + $result = CGI::div({class=>"ResultsWithError"},$r->maketext("No change made to any set")); } elsif ($scope eq "all") { @setIDs = @{ $self->{allSetIDs} }; - $result = CGI::div({class=>"ResultsWithoutError"},"All sets $verb all students."); + $result = CGI::div({class=>"ResultsWithoutError"},$r->maketext("All sets [_1] all students", $verb)); } elsif ($scope eq "visible") { @setIDs = @{ $self->{visibleSetIDs} }; - $result = CGI::div({class=>"ResultsWithoutError"},"All visible sets $verb all students."); + $result = CGI::div({class=>"ResultsWithoutError"},$r->maketext("All visible sets [_1] all students", $verb)); } elsif ($scope eq "selected") { @setIDs = @{ $genericParams->{selected_sets} }; - $result = CGI::div({class=>"ResultsWithoutError"},"All selected sets $verb all students."); + $result = CGI::div({class=>"ResultsWithoutError"},$r->maketext("All selected sets [_1] all students", $verb)); } # can we use UPDATE here, instead of fetch/change/store? @@ -918,32 +945,42 @@ sub publish_handler { } sub enable_reduced_scoring_form { my ($self, $onChange, %actionParams) = @_; + my $r = $self->r; return join ("", - "Make ", - CGI::popup_menu( - -name => "action.enable_reduced_scoring.scope", - -values => [ qw(none all selected) ], - -default => $actionParams{"action.enable_reduced_scoring.scope"}->[0] || "selected", - -labels => { - none => "", - all => "all sets", -# visible => "visible sets", - selected => "selected sets", - }, - -onchange => $onChange, + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"reduced_scoring_filter_select", + -label_text=>$r->maketext("Choose which sets to be affected").": ", + -input_attr=>{ + -name => "action.enable_reduced_scoring.scope", + -values => [ qw(none all selected) ], + -default => $actionParams{"action.enable_reduced_scoring.scope"}->[0] || "selected", + -labels => { + none => $r->maketext("no sets"), + all => $r->maketext("all sets"), +# visible => "visible sets", + selected => $r->maketext("selected sets"), + }, + -onchange => $onChange, + } ), - CGI::popup_menu( - -name => "action.enable_reduced_scoring.value", - -values => [ 0, 1 ], - -default => $actionParams{"action.enable_reduced_scoring.value"}->[0] || "1", - -labels => { - 0 => "disable", - 1 => "enable", - }, - -onchange => $onChange, + CGI::br(), + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"reduced_scoring_enable_disable_select", + -label_text=>$r->maketext("Enable/Disable reduced scoring for selected sets").": ", + -input_attr=>{ + -name => "action.enable_reduced_scoring.value", + -values => [ 0, 1 ], + -default => $actionParams{"action.enable_reduced_scoring.value"}->[0] || "1", + -labels => { + 0 => $r->maketext("Disable"), + 1 => $r->maketext("Enable"), + }, + -onchange => $onChange, + } ), - " reduced sccoring.", ); } @@ -958,22 +995,22 @@ sub enable_reduced_scoring_handler { my $scope = $actionParams->{"action.enable_reduced_scoring.scope"}->[0]; my $value = $actionParams->{"action.enable_reduced_scoring.value"}->[0]; - my $verb = $value ? "enabled" : "disabled"; + my $verb = $value ? $r->maketext("enabled") : $r->maketext("disabled"); my @setIDs; if ($scope eq "none") { # FIXME: double negative "Make no sets hidden" might make professor expect all sets to be made visible. @setIDs = (); - $result = CGI::div({class=>"ResultsWithError"}, "No change made to any set."); + $result = CGI::div({class=>"ResultsWithError"}, $r->maketext("No change made to any set")); } elsif ($scope eq "all") { @setIDs = @{ $self->{allSetIDs} }; - $result = CGI::div({class=>"ResultsWithoutError"},"Reduced Credit $verb for all sets."); + $result = CGI::div({class=>"ResultsWithoutError"},$r->maketext("Reduced Credit [_1] for all sets", $verb)); } elsif ($scope eq "visible") { @setIDs = @{ $self->{visibleSetIDs} }; - $result = CGI::div({class=>"ResultsWithoutError"},"Reduced Credit $verb for visable sets."); + $result = CGI::div({class=>"ResultsWithoutError"},$r->maketext("Reduced Credit [_1] for visable sets", $verb)); } elsif ($scope eq "selected") { @setIDs = @{ $genericParams->{selected_sets} }; - $result = CGI::div({class=>"ResultsWithoutError"},"Reduced Credit $verb for selected sets."); + $result = CGI::div({class=>"ResultsWithoutError"},$r->maketext("Reduced Credit [_1] for selected sets", $verb)); } # can we use UPDATE here, instead of fetch/change/store? @@ -987,19 +1024,24 @@ sub enable_reduced_scoring_handler { sub score_form { my ($self, $onChange, %actionParams) = @_; + my $r = $self->r; return join ("", - "Score ", - CGI::popup_menu( - -name => "action.score.scope", - -values => [qw(none all selected)], - -default => $actionParams{"action.score.scope"}->[0] || "none", - -labels => { - none => "no sets.", - all => "all sets.", - selected => "selected sets.", - }, - -onchange => $onChange, + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"score_select", + -label_text=>$r->maketext("Score which sets?").": ", + -input_attr=>{ + -name => "action.score.scope", + -values => [qw(none all selected)], + -default => $actionParams{"action.score.scope"}->[0] || "none", + -labels => { + none => $r->maketext("no sets"), + all => $r->maketext("all sets"), + selected => $r->maketext("selected sets"), + }, + -onchange => $onChange, + } ), ); @@ -1019,7 +1061,7 @@ sub score_handler { if ($scope eq "none") { @setsToScore = (); - return "No sets selected for scoring."; + return $r->maketext("No sets selected for scoring"); } elsif ($scope eq "all") { @setsToScore = @{ $self->{allSetIDs} }; } elsif ($scope eq "visible") { @@ -1043,23 +1085,26 @@ sub score_handler { sub delete_form { my ($self, $onChange, %actionParams) = @_; + my $r = $self->r; return join("", - CGI::div({class=>"ResultsWithError"}, - "Delete ", - CGI::popup_menu( + CGI::span({-class=>"ResultsWithError"}, CGI::em($r->maketext("Warning: Deletion destroys all user-related data and is not undoable!"))),CGI::br(), + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"delete_select", + -label_text=>$r->maketext("Delete how many?").": ", + -input_attr=>{ -name => "action.delete.scope", -values => [qw(none selected)], -default => "none", # don't make it easy to delete # $actionParams{"action.delete.scope"}->[0] || "none", -labels => { - none => "no sets.", + none => $r->maketext("no sets"), #visible => "visible sets.", - selected => "selected sets.", + selected => $r->maketext("selected sets"), }, -onchange => $onChange, - ), - CGI::em(" Deletion destroys all set-related data and is not undoable!"), - ) + } + ), ); } @@ -1094,34 +1139,42 @@ sub delete_handler { $self->{selectedSetIDs} = [ keys %selectedSetIDs ]; my $num = @setIDsToDelete; - return CGI::div({class=>"ResultsWithoutError"}, "deleted $num set" . - ($num == 1 ? "" : "s") - ); + return CGI::div({class=>"ResultsWithoutError"}, $r->maketext("deleted [_1] sets", $num) ); } sub create_form { my ($self, $onChange, %actionParams) = @_; - my $r = $self->r; - return "Create a new set named: ", - CGI::textfield( - -name => "action.create.name", - -value => $actionParams{"action.create.name"}->[0] || "", - -width => "50", - -onchange => $onChange, + return join("", + WeBWorK::CGI_labeled_input( + -type=>"text", + -id=>"create_text", + -label_text=>$r->maketext("Name the new set").": ", + -input_attr=>{ + -name => "action.create.name", + -value => $actionParams{"action.create.name"}->[0] || "", + -width => "50", + -onchange => $onChange, + } ), - " as ", - CGI::popup_menu( - -name => "action.create.type", - -values => [qw(empty copy)], - -default => $actionParams{"action.create.type"}->[0] || "empty", - -labels => { - empty => "a new empty set.", - copy => "a duplicate of the first selected set.", - }, - -onchange => $onChange, - ); + CGI::br(), + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"create_select", + -label_text=>$r->maketext("Create as what type of set?").": ", + -input_attr=>{ + -name => "action.create.type", + -values => [qw(empty copy)], + -default => $actionParams{"action.create.type"}->[0] || "empty", + -labels => { + empty => $r->maketext("a new empty set"), + copy => $r->maketext("a duplicate of the first selected set"), + }, + -onchange => $onChange, + } + ), + ); } @@ -1132,8 +1185,8 @@ sub create_handler { my $db = $r->db; my $newSetID = $actionParams->{"action.create.name"}->[0]; - return CGI::div({class => "ResultsWithError"}, "Failed to create new set: no set name specified!") unless $newSetID =~ /\S/; - return CGI::div({class => "ResultsWithError"}, "Set $newSetID exists. No set created") if $db->existsGlobalSet($newSetID); + return CGI::div({class => "ResultsWithError"}, $r->maketext("Failed to create new set: no set name specified!")) unless $newSetID =~ /\S/; + return CGI::div({class => "ResultsWithError"}, $r->maketext("Set [_1] exists. No set created", $newSetID)) if $db->existsGlobalSet($newSetID); my $newSetRecord = $db->newGlobalSet; my $oldSetID = $self->{selectedSetIDs}->[0]; @@ -1154,7 +1207,7 @@ sub create_handler { $newSetRecord->enable_reduced_scoring(DEFAULT_ENABLED_REDUCED_SCORING_STATE()); $db->addGlobalSet($newSetRecord); } elsif ($type eq "copy") { - return CGI::div({class => "ResultsWithError"}, "Failed to duplicate set: no set selected for duplication!") unless $oldSetID =~ /\S/; + return CGI::div({class => "ResultsWithError"}, $r->maketext("Failed to duplicate set: no set selected for duplication!")) unless $oldSetID =~ /\S/; $newSetRecord = $db->getGlobalSet($oldSetID); $newSetRecord->set_id($newSetID); $db->addGlobalSet($newSetRecord); @@ -1193,9 +1246,9 @@ sub create_handler { push @{ $self->{visibleSetIDs} }, $newSetID; push @{ $self->{allSetIds} }, $newSetID; - return CGI::div({class => "ResultsWithError"}, "Failed to create new set: $@") if $@; + return CGI::div({class => "ResultsWithError"}, $r->maketext("Failed to create new set: [_1]", $@)) if $@; - return CGI::div({class=>"ResultsWithoutError"},"Successfully created new set $newSetID" ); + return CGI::div({class=>"ResultsWithoutError"},$r->maketext("Successfully created new set [_1]", $newSetID)); } @@ -1217,45 +1270,65 @@ sub import_form { ); return join(" ", - "Import ", - CGI::popup_menu( - -name => "action.import.number", - -values => [ 1, 8 ], - -default => $actionParams{"action.import.number"}->[0] || "1", - -labels => { - 1 => "a single set", - 8 => "multiple sets", - }, - -onchange => "$onChange;$importScript", + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"import_amt_select", + -label_text=>$r->maketext("Import how many sets?").": ", + -input_attr=>{ + -name => "action.import.number", + -values => [ 1, 8 ], + -default => $actionParams{"action.import.number"}->[0] || "1", + -labels => { + 1 => $r->maketext("a single set"), + 8 => $r->maketext("multiple sets"), + }, + -onchange => "$onChange;$importScript", + } ), - " from ", # set definition file(s) ", - CGI::popup_menu( - -name => "action.import.source", - -values => [ "", $self->getDefList() ], - -labels => { "" => "the following file(s)" }, - -default => $actionParams{"action.import.source"}->[0] || "", - -size => $actionParams{"action.import.number"}->[0] || "1", - -onchange => $onChange, + CGI::br(), + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"import_source_select", + -label_text=>$r->maketext("Import from where?").": ", + -input_attr=>{ + -name => "action.import.source", + -values => [ "", $self->getDefList() ], + -labels => { "" => $r->maketext("Enter filenames below") }, + -default => $actionParams{"action.import.source"}->[0] || "", + -size => $actionParams{"action.import.number"}->[0] || "1", + -onchange => $onChange, + }, + -label_attr=>{-id=>"import_source_select_label"} ), - " with set name(s): ", - CGI::textfield( - -name => "action.import.name", - -value => $actionParams{"action.import.name"}->[0] || "", - -width => "50", - -onchange => $onChange, + CGI::br(), + WeBWorK::CGI_labeled_input( + -type=>"text", + -id=>"import_text", + -label_text=>$r->maketext("Import sets with names").": ", + -input_attr=>{ + -name => "action.import.name", + -value => $actionParams{"action.import.name"}->[0] || "", + -width => "50", + -onchange => $onChange, + } ), + CGI::br(), ($authz->hasPermissions($user, "assign_problem_sets")) ? - "assigning this set to " . - CGI::popup_menu( - -name => "action.import.assign", - -value => [qw(user all)], - -default => $actionParams{"action.import.assign"}->[0] || "user", - -labels => { - all => "all current users.", - user => "only $user.", - }, - -onchange => $onChange, + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"import_users_select", + -label_text=>$r->maketext("Assign this set to which users?").": ", + -input_attr=>{ + -name => "action.import.assign", + -value => [qw(all none)], + -default => $actionParams{"action.import.assign"}->[0] || "none", + -labels => { + all => $r->maketext("all users"), + none => $r->maketext("no users"), + }, + -onchange => $onChange, + } ) : "" #user does not have permissions to assign problem sets @@ -1264,6 +1337,7 @@ sub import_form { sub import_handler { my ($self, $genericParams, $actionParams, $tableParams) = @_; + my $r = $self->r; my @fileNames = @{ $actionParams->{"action.import.source"} }; my $newSetName = $actionParams->{"action.import.name"}->[0]; @@ -1280,28 +1354,29 @@ sub import_handler { my $numSkipped = @$skipped; return CGI::div( - {class=>"ResultsWithoutError"}, - $numAdded . " set" . ($numAdded == 1 ? "" : "s") . " added, " - . $numSkipped . " set" . ($numSkipped == 1 ? "" : "s") . " skipped" - . " (" . join (", ", @$skipped) . ") " - ); + {class=>"ResultsWithoutError"}, $r->maketext("[_1] sets added, [_2] sets skipped. Skipped sets: ([_3])", $numAdded, $numSkipped, join(", ", @$skipped))); } sub export_form { my ($self, $onChange, %actionParams) = @_; + my $r = $self->r; return join("", - "Export ", - CGI::popup_menu( - -name => "action.export.scope", - -values => [qw(all visible selected)], - -default => $actionParams{"action.export.scope"}->[0] || "visible", - -labels => { - all => "all sets", - visible => "visible sets", - selected => "selected sets", - }, - -onchange => $onChange, + WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>"export_select", + -label_text=>$r->maketext("Export which sets?").": ", + -input_attr=>{ + -name => "action.export.scope", + -values => [qw(all visible selected)], + -default => $actionParams{"action.export.scope"}->[0] || "visible", + -labels => { + all => $r->maketext("all sets"), + visible => $r->maketext("visible sets"), + selected => $r->maketext("selected sets"), + }, + -onchange => $onChange, + } ), ); } @@ -1309,19 +1384,20 @@ sub export_form { # this does not actually export any files, rather it sends us to a new page in order to export the files sub export_handler { my ($self, $genericParams, $actionParams, $tableParams) = @_; + my $r = $self->r; my $result; my $scope = $actionParams->{"action.export.scope"}->[0]; if ($scope eq "all") { - $result = "exporting all sets"; + $result = $r->maketext("exporting all sets"); $self->{selectedSetIDs} = $self->{visibleSetIDs} = $self->{allSetIDs}; } elsif ($scope eq "visible") { - $result = "exporting visible sets"; + $result = $r->maketext("exporting visible sets"); $self->{selectedSetIDs} = $self->{visibleSetIDs}; } elsif ($scope eq "selected") { - $result = "exporting selected sets"; + $result = $r->maketext("exporting selected sets"); $self->{selectedSetIDs} = $self->{visibleSetIDs} = $genericParams->{selected_sets}; # an arrayref } $self->{exportMode} = 1; @@ -1331,7 +1407,8 @@ sub export_handler { sub cancelExport_form { my ($self, $onChange, %actionParams) = @_; - return "Abandon export"; + my $r = $self->r; + return CGI::span($r->maketext("Abandon export")); } sub cancelExport_handler { @@ -1349,12 +1426,13 @@ sub cancelExport_handler { } $self->{exportMode} = 0; - return CGI::div({class=>"ResultsWithError"}, "export abandoned"); + return CGI::div({class=>"ResultsWithError"}, $r->maketext("export abandoned")); } sub saveExport_form { my ($self, $onChange, %actionParams) = @_; - return "Export selected sets."; + my $r = $self->r; + return CGI::span($r->maketext("Export selected sets")); } sub saveExport_handler { @@ -1384,17 +1462,14 @@ sub saveExport_handler { my @reasons = map { "set $_ - " . $reason->{$_} } keys %$reason; - return CGI::div( {class=>$resultFont}, - $numExported . " set" . ($numExported == 1 ? "" : "s") . " exported, " - . $numSkipped . " set" . ($numSkipped == 1 ? "" : "s") . " skipped." - . (($numSkipped) ? CGI::ul(CGI::li(\@reasons)) : "") - ); + return CGI::div({class=>$resultFont}, $r->maketext("[_1] sets exported, [_2] sets skipped. Skipped sets: ([_3])", $numExported, $numSkipped, (($numSkipped) ? CGI::ul(CGI::li(\@reasons)) : ""))); } sub cancelEdit_form { my ($self, $onChange, %actionParams) = @_; - return "Abandon changes"; + my $r = $self->r; + return CGI::span($r->maketext("Abandon changes")); } sub cancelEdit_handler { @@ -1412,12 +1487,13 @@ sub cancelEdit_handler { } $self->{editMode} = 0; - return CGI::div({class=>"ResultsWithError"}, "changes abandoned"); + return CGI::div({class=>"ResultsWithError"}, $r->maketext("changes abandoned")); } sub saveEdit_form { my ($self, $onChange, %actionParams) = @_; - return "Save changes"; + my $r = $self->r; + return CGI::span($r->maketext("Save changes")); } sub saveEdit_handler { @@ -1446,20 +1522,20 @@ sub saveEdit_handler { my $curr_time = time; my $seconds_per_year = 31_556_926; my $cutoff = $curr_time + $seconds_per_year*10; - return CGI::div({class=>'ResultsWithError'}, "Error: open date cannot be more than 10 years from now in set $setID") + return CGI::div({class=>'ResultsWithError'}, $r->maketext("Error: open date cannot be more than 10 years from now in set [_1]", $setID)) if $Set->open_date > $cutoff; - return CGI::div({class=>'ResultsWithError'}, "Error: due date cannot be more than 10 years from now in set $setID") + return CGI::div({class=>'ResultsWithError'}, $r->maketext("Error: due date cannot be more than 10 years from now in set [_1]", $setID)) if $Set->due_date > $cutoff; - return CGI::div({class=>'ResultsWithError'}, "Error: answer date cannot be more than 10 years from now in set $setID") + return CGI::div({class=>'ResultsWithError'}, $r->maketext("Error: answer date cannot be more than 10 years from now in set [_1]", $setID)) if $Set->answer_date > $cutoff; # Check that the open, due and answer dates are in increasing order. # Bail if this is not correct. if ($Set->open_date > $Set->due_date) { - return CGI::div({class=>'ResultsWithError'}, "Error: Due date must come after open date in set $setID"); + return CGI::div({class=>'ResultsWithError'}, $r->maketext("Error: Due date must come after open date in set [_1]", $setID)); } if ($Set->due_date > $Set->answer_date) { - return CGI::div({class=>'ResultsWithError'}, "Error: Answer date must come after due date in set $setID"); + return CGI::div({class=>'ResultsWithError'}, $r->maketext("Error: Answer date must come after due date in set [_1]", $setID)); } $db->putGlobalSet($Set); @@ -1475,7 +1551,7 @@ sub saveEdit_handler { $self->{editMode} = 0; - return CGI::div({class=>"ResultsWithError"}, "changes saved" ); + return CGI::div({class=>"ResultsWithError"}, $r->maketext("changes saved") ); } sub duplicate_form { @@ -1487,12 +1563,16 @@ sub duplicate_form { return "" unless @visible_sets == 1; return join ("", - "Duplicate this set and name it: ", - CGI::textfield( - -name => "action.duplicate.name", - -value => $actionParams{"action.duplicate.name"}->[0] || "", - -width => "50", - -onchange => $onChange, + WeBWorK::CGI_labeled_input( + -type=>"text", + -id=>"duplicate_text", + -label_text=>$r->maketext("Duplicate this set and name it").": ", + -input_attr=>{ + -name => "action.duplicate.name", + -value => $actionParams{"action.duplicate.name"}->[0] || "", + -width => "50", + -onchange => $onChange, + } ), ); } @@ -1504,11 +1584,11 @@ sub duplicate_handler { my $db = $r->db; my $oldSetID = $self->{selectedSetIDs}->[0]; - return CGI::div({class => "ResultsWithError"}, "Failed to duplicate set: no set selected for duplication!") unless defined($oldSetID) and $oldSetID =~ /\S/; + return CGI::div({class => "ResultsWithError"}, $r->maketext("Failed to duplicate set: no set selected for duplication!")) unless defined($oldSetID) and $oldSetID =~ /\S/; my $newSetID = $actionParams->{"action.duplicate.name"}->[0]; - return CGI::div({class => "ResultsWithError"}, "Failed to duplicate set: no set name specified!") unless $newSetID =~ /\S/; + return CGI::div({class => "ResultsWithError"}, $r->maketext("Failed to duplicate set: no set name specified!")) unless $newSetID =~ /\S/; # DBFIXME checking for existence -- don't need to fetch - return CGI::div({class => "ResultsWithError"}, "Failed to duplicate set: set $newSetID already exists!") if defined $db->getGlobalSet($newSetID); + return CGI::div({class => "ResultsWithError"}, $r->maketext("Failed to duplicate set: set [_1] already exists!", $newSetID)) if defined $db->getGlobalSet($newSetID); my $newSet = $db->getGlobalSet($oldSetID); $newSet->set_id($newSetID); @@ -1522,9 +1602,9 @@ sub duplicate_handler { push @{ $self->{visibleSetIDs} }, $newSetID; - return CGI::div({class => "ResultsWithError"}, "Failed to duplicate set: $@") if $@; + return CGI::div({class => "ResultsWithError"}, $r->maketext("Failed to duplicate set: [_1]", $@)) if $@; - return "SUCCESS"; + return $r->maketext("Success"); } ################################################################################ @@ -1540,22 +1620,26 @@ sub bySetID { $a->set_id cmp $b->set_id } #FIXME eventually we may be able to remove these checks, if we can trust # that the dates are always defined # dates which are the empty string '' or undefined are treated as 0 -sub byOpenDate { my $result = eval{( $a->open_date || 0 ) <=> ( $b->open_date || 0 ) }; +sub byOpenDate { + my $result = eval{( $a->open_date || 0 ) <=> ( $b->open_date || 0 ) }; return $result unless $@; warn "Open date not correctly defined."; return 0; } -sub byDueDate { my $result = eval{( $a->due_date || 0 ) <=> ( $b->due_date || 0 ) }; +sub byDueDate { + my $result = eval{( $a->due_date || 0 ) <=> ( $b->due_date || 0 ) }; return $result unless $@; warn "Due date not correctly defined."; return 0; } -sub byAnswerDate { my $result = eval{( $a->answer_date || 0) <=> ( $b->answer_date || 0 ) }; +sub byAnswerDate { + my $result = eval{( $a->answer_date || 0) <=> ( $b->answer_date || 0 ) }; return $result unless $@; warn "Answer date not correctly defined."; return 0; } -sub byVisible { my $result = eval{$a->visible cmp $b->visible }; +sub byVisible { + my $result = eval{$a->visible cmp $b->visible }; return $result unless $@; warn "Visibility status not correctly defined."; return 0; @@ -1595,7 +1679,7 @@ sub importSetsFromDef { # FIXME: do we really want everything to fail on one bad file name? foreach my $fileName (@setDefFiles) { - die "won't be able to read from file $dir/$fileName: does it exist? is it readable?" + die $r->maketext("won't be able to read from file [_1]/[_2]: does it exist? is it readable?", $dir, $fileName) unless -r "$dir/$fileName"; } @@ -1661,7 +1745,7 @@ sub importSetsFromDef { #create the set eval {$db->addGlobalSet($newSetRecord)}; - die "addGlobalSet $setName in ProblemSetList: $@" if $@; + die $r->maketext("addGlobalSet [_1] in ProblemSetList: [_2]", $setName, $@) if $@; #do we need to add locations to the set_locations table? if ( $restrictIP ne 'No' && $restrictLoc ) { @@ -1671,18 +1755,13 @@ sub importSetsFromDef { $newSetLocation->set_id( $setName ); $newSetLocation->location_id( $restrictLoc ); eval {$db->addGlobalSetLocation($newSetLocation)}; - warn("error adding set location $restrictLoc " . - "for set $setName: $@") if $@; + warn($r->maketext("error adding set location [_1] for set [_2]: [_3]", $restrictLoc, $setName, $@)) if $@; } else { # this should never happen. - warn("input set location $restrictLoc" . - " already exists for set " . - "$setName.\n"); + warn($r->maketext("input set location [_1] already exists for set [_2].", $restrictLoc, $setName)."\n"); } } else { - warn("restriction location $restrictLoc " . - "does not exist. IP restrictions have " . - "been ignored.\n"); + warn($r->maketext("restriction location [_1] does not exist. IP restrictions have been ignored.", $restrictLoc)."\n"); $newSetRecord->restrict_ip('No'); $newSetRecord->relax_restrict_ip('No'); eval { $db->putGlobalSet($newSetRecord) }; @@ -1725,6 +1804,8 @@ sub readSetDef { my $max_attempts_default = $self->{ce}->{problemDefaults}->{max_attempts}; my $setName = ''; + + my $r = $self->r; if ($fileName =~ m|^set([.\w-]+)\.def$|) { $setName = $1; @@ -1817,7 +1898,7 @@ sub readSetDef { } elsif ($item eq 'problemList') { last; } else { - warn "readSetDef error, can't read the line: ||$line||"; + warn $r->maketext("readSetDef error, can't read the line: ||[_1]||", $line); } } @@ -1827,7 +1908,7 @@ sub readSetDef { my ($time1, $time2, $time3) = map { $self->parseDateTime($_); } ($openDate, $dueDate, $answerDate); unless ($time1 <= $time2 and $time2 <= $time3) { - warn "The open date: $openDate, due date: $dueDate, and answer date: $answerDate must be defined and in chronological order."; + warn $r->maketext("The open date: [_1], due date: [_2], and answer date: [_3] must be defined and in chronological order.", $openDate, $dueDate, $answerDate); } # Check header file names @@ -1844,26 +1925,21 @@ sub readSetDef { # check that the values for hideWork and hideScore are valid if ( $hideScore ne 'N' && $hideScore ne 'Y' && $hideScore ne 'BeforeAnswerDate' ) { - warn("The value $hideScore for the hideScore option " . - "is not valid; it will be replaced with 'N'.\n"); + warn($r->maketext("The value [_1] for the hideScore option is not valid; it will be replaced with 'N'.", $hideScore)."\n"); $hideScore = 'N'; } if ( $hideWork ne 'N' && $hideWork ne 'Y' && $hideWork ne 'BeforeAnswerDate' ) { - warn("The value $hideWork for the hideWork option " . - "is not valid; it will be replaced with 'N'.\n"); + warn($r->maketext("The value [_1] for the hideWork option is not valid; it will be replaced with 'N'.", $hideWork)."\n"); $hideWork = 'N'; } if ( $timeCap ne '0' && $timeCap ne '1' ) { - warn("The value $timeCap for the capTimeLimit option " . - "is not valid; it will be replaced with '0'.\n"); + warn($r->maketext("The value [_1] for the capTimeLimit option is not valid; it will be replaced with '0'.", $timeCap)."\n"); $timeCap = '0'; } if ( $restrictIP ne 'No' && $restrictIP ne 'DenyFrom' && $restrictIP ne 'RestrictTo' ) { - warn("The value $restrictIP for the restrictIP " . - "option is not valid; it will be replaced " . - "with 'No'.\n"); + warn($r->maketext("The value [_1] for the restrictIP option is not valid; it will be replaced with 'No'.", $restrictIP)."\n"); $restrictIP = 'No'; $restrictLoc = ''; $relaxRestrictIP = 'No'; @@ -1871,9 +1947,7 @@ sub readSetDef { if ( $relaxRestrictIP ne 'No' && $relaxRestrictIP ne 'AfterAnswerDate' && $relaxRestrictIP ne 'AfterVersionAnswerDate' ) { - warn("The value $relaxRestrictIP for the " . - "relaxRestrictIP option is not valid; it will " . - "be replaced with 'No'.\n"); + warn($r->maketext("The value [_1] for the relaxRestrictIP option is not valid; it will be replaced with 'No'.", $relaxRestrictIP)."\n"); $relaxRestrictIP = 'No'; } # to verify that restrictLoc is valid requires a database @@ -1943,7 +2017,7 @@ sub readSetDef { $relaxRestrictIP, ); } else { - warn "Can't open file $filePath\n"; + warn $r->maketext("Can't open file [_1]", $filePath)."\n"; } } @@ -1964,14 +2038,14 @@ SET: foreach my $set (keys %filenames) { # files can be exported to sub directories but not parent directories if ($fileName =~ /\.\./) { push @skipped, $set; - $reason{$set} = "Illegal filename contains '..'"; + $reason{$set} = $r->maketext("Illegal filename contains '..'"); next SET; } my $setRecord = $db->getGlobalSet($set); unless (defined $setRecord) { push @skipped, $set; - $reason{$set} = "No record found."; + $reason{$set} = $r->maketext("No record found."); next SET; } my $filePath = $ce->{courseDirs}->{templates} . '/' . $fileName; @@ -1979,7 +2053,7 @@ SET: foreach my $set (keys %filenames) { # back up existing file if(-e $filePath) { rename($filePath, "$filePath.bak") or - $reason{$set} = "Existing file $filePath could not be backed up and was lost."; + $reason{$set} = $r->maketext("Existing file [_1] could not be backed up and was lost.", $filePath); } my $openDate = $self->formatDateTime($setRecord->open_date); @@ -1995,7 +2069,7 @@ SET: foreach my $set (keys %filenames) { my $problemRecord = $db->getGlobalProblem($set, $prob); # checked unless (defined $problemRecord) { push @skipped, $set; - $reason{$set} = "No record found for problem $prob."; + $reason{$set} = $r->maketext("No record found for problem [_1].", $prob); next SET; } my $source_file = $problemRecord->source_file(); @@ -2065,7 +2139,7 @@ EOF $filePath = WeBWorK::Utils::surePathToFile($ce->{courseDirs}->{templates}, $filePath); eval { local *SETDEF; - open SETDEF, ">$filePath" or die "Failed to open $filePath"; + open SETDEF, ">$filePath" or die $r->maketext("Failed to open [_1]", $filePath); print SETDEF $fileContents; close SETDEF; }; @@ -2088,7 +2162,7 @@ EOF ################################################################################ sub fieldEditHTML { - my ($self, $fieldName, $value, $properties) = @_; + my ($self, $fieldName, $value, $properties, $dateTimeScripts) = @_; my $size = $properties->{size}; my $type = $properties->{type}; my $access = $properties->{access}; @@ -2101,16 +2175,130 @@ sub fieldEditHTML { } if ($type eq "number" or $type eq "text") { - return CGI::input({type=>"text", name=>$fieldName, value=>$value, size=>$size}); + my $id = $fieldName."_id"; + my $out = CGI::input({type=>"text", name=>$fieldName, id=>$id, value=>"", size=>$size}); + my $content = ""; + my $bareName = ""; + my $timezone = substr($value, -3); + + if(index($fieldName, ".open_date") != -1){ + my @temp = split(/.open_date/, $fieldName); + $bareName = $temp[0]; + $bareName =~ s/\./\\\\\./g; + $content = <<"CONTENT"; +\$('#$bareName\\\\.open_date_id').datetimepicker({ + ampm: true, + timeFormat: 'hh:mmtt', + timeSuffix: ' $timezone', + separator: ' at ', + onClose: function(dateText, inst) { + var dueDateTextBox = \$('#$bareName\\\\.due_date_id'); + if (dueDateTextBox.val() != '') { + var testopenDate = new Date(dateText); + var testdueDate = new Date(dueDateTextBox.val()); + if (testopenDate > testdueDate) + dueDateTextBox.val(dateText); + } + else { + dueDateTextBox.val(dateText); + } + }, + onSelect: function (selectedDateTime){ + var open = \$(this).datetimepicker('getDate'); + var open_obj = new Date(open.getTime()); + \$('#$bareName\\\\.due_date_id').datetimepicker('option', 'minDate', open_obj); + } +}); +CONTENT + } + elsif(index($fieldName, ".due_date") != -1){ + my @temp = split(/.due_date/, $fieldName); + $bareName = $temp[0]; + $bareName =~ s/\./\\\\\./g; + $content = <<"CONTENT"; +\$('#$bareName\\\\.due_date_id').datetimepicker({ + ampm: true, + timeFormat: 'hh:mmtt', + timeSuffix: ' $timezone', + separator: ' at ', + onClose: function(dateText, inst) { + var openDateTextBox = \$('#$bareName\\\\.open_date_id'); + var answersDateTextBox = \$('#$bareName\\\\.answer_date_id'); + + if (openDateTextBox.val() != '') { + var testopenDate = new Date(openDateTextBox.val()); + var testdueDate = new Date(dateText); + if (testopenDate > testdueDate) + openDateTextBox.val(dateText); + } + else { + openDateTextBox.val(dateText); + } + + if (answersDateTextBox.val() != '') { + var testdueDate = new Date(dateText); + var testanswersDate = new Date(answersDateTextBox.val()); + if(testdueDate > testanswersDate) + answersDateTextBox.val(dateText); + } + else { + answersDateTextBox.val(dateText); + } + }, + onSelect: function (selectedDateTime){ + var due = \$(this).datetimepicker('getDate'); + \$('#$bareName\\\\.open_date_id').datetimepicker('option', 'maxDate', new Date(due.getTime())); + \$('#$bareName\\\\.answer_date_id').datetimepicker('option', 'minDate', new Date(due.getTime())); + } +}); +CONTENT + } + elsif(index($fieldName, ".answer_date") != -1){ + my @temp = split(/.answer_date/, $fieldName); + $bareName = $temp[0]; + $bareName =~ s/\./\\\\\./g; + $content = <<"CONTENT"; +\$('#$bareName\\\\.answer_date_id').datetimepicker({ + ampm: true, + timeFormat: 'hh:mmtt', + timeSuffix: ' $timezone', + separator: ' at ', + onClose: function(dateText, inst) { + var dueDateTextBox = \$('#$bareName\\\\.due_date_id'); + if (dueDateTextBox.val() != '') { + var testdueDate = new Date(dueDateTextBox.val()); + var testanswersDate = new Date(dateText); + if (testdueDate > testanswersDate) + dueDateTextBox.val(dateText); + } + else { + dueDateTextBox.val(dateText); + } + }, + onSelect: function (selectedDateTime){ + var answers = \$(this).datetimepicker('getDate'); + \$('#$bareName\\\\.due_date_id').datetimepicker('option', 'maxDate', new Date(answers.getTime())); + } +}); +CONTENT + } + + push @$dateTimeScripts, $content; + return $out; } if ($type eq "filelist") { - return CGI::popup_menu({ - name => $fieldName, - value => [ sort keys %$headerFiles ], - labels => $headerFiles, - default => $value || 0, - }); + return WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>$fieldName."_id", + -label_text=>ucfirst($fieldName), + -input_attr=>{ + name => $fieldName, + value => [ sort keys %$headerFiles ], + labels => $headerFiles, + default => $value || 0, + } + ), } if ($type eq "enumerable") { @@ -2128,12 +2316,17 @@ sub fieldEditHTML { $value = $synonyms->{"*"}; } - return CGI::popup_menu({ - name => $fieldName, - values => [keys %$items], - default => $value, - labels => $items, - }); + return WeBWorK::CGI_labeled_input( + -type=>"select", + -id=>$fieldName."_id", + -label_text=>ucfirst($fieldName), + -input_attr=>{ + name => $fieldName, + values => [keys %$items], + default => $value, + labels => $items, + } + ), } if ($type eq "checked") { @@ -2141,11 +2334,16 @@ sub fieldEditHTML { # FIXME: kludge (R) # if the checkbox is checked it returns a 1, if it is unchecked it returns nothing # in which case the hidden field overrides the parameter with a 0 - return CGI::checkbox( - -name => $fieldName, - -checked => $value, - -label => "", - -value => 1 + return WeBWorK::CGI_labeled_input( + -type=>"checkbox", + -id=>$fieldName."_id", + -label_text=>ucfirst($fieldName), + -input_attr=>{ + -name => $fieldName, + -checked => $value, + -label => "", + -value => 1 + } ) . CGI::hidden( -name => $fieldName, -value => 0 @@ -2168,8 +2366,8 @@ sub recordEditHTML { my $exportMode = $options{exportMode}; my $setSelected = $options{setSelected}; - my $visibleClass = $Set->visible ? "visible" : "hidden"; - my $enable_reduced_scoringClass = $Set->enable_reduced_scoring ? 'Reduced Credit Enabled' : 'Reduced Credit Disabled'; + my $visibleClass = $Set->visible ? $r->maketext("visible") : $r->maketext("hidden"); + my $enable_reduced_scoringClass = $Set->enable_reduced_scoring ? $r->maketext('Reduced Credit Enabled') : $r->maketext('Reduced Credit Disabled'); my $users = $db->countSetUsers($Set->set_id); my $totalUsers = $self->{totalUsers}; @@ -2199,26 +2397,39 @@ sub recordEditHTML { : CGI::a({href=>$usersAssignedToSetURL}, "$users/$totalUsers"); $fakeRecord{filename} = CGI::input({-name => "set.$set_id", -value=>"set$set_id.def", -size=>60}); - + # Select if ($editMode) { # column not there } else { # selection checkbox - push @tableCells, CGI::checkbox( - -name => "selected_sets", - -value => $set_id, - -checked => $setSelected, - -label => "", + # Set ID + my $label = ""; + if ($editMode) { + $label = CGI::a({href=>$problemListURL}, "$set_id"); + } else { + $label = CGI::font({class=>$visibleClass}, $set_id . $imageLink); + } + + push @tableCells, WeBWorK::CGI_labeled_input( + -type=>"checkbox", + -id=>$set_id."_id", + -label_text=>$label, + -input_attr=>$setSelected ? + { + -name => "selected_sets", + -value => $set_id, + -checked => "checked", + -class => "table_checkbox", + } + : + { + -name => "selected_sets", + -value => $set_id, + -class => "table_checkbox", + } ); } - - # Set ID - if ($editMode) { - push @tableCells, CGI::a({href=>$problemListURL}, "$set_id"); - } else { - push @tableCells, CGI::font({class=>$visibleClass}, $set_id . $imageLink); - } # Problems link if ($editMode) { @@ -2249,6 +2460,10 @@ sub recordEditHTML { # make a hash out of this so we can test membership easily my %nonkeyfields; @nonkeyfields{$Set->NONKEYFIELDS} = (); + my @chooseDateTimeScripts = (); + + push @chooseDateTimeScripts, "addOnLoadEvent(function() {"; + # Set Fields foreach my $field (@fieldsToShow) { next unless exists $nonkeyfields{$field}; @@ -2258,15 +2473,20 @@ sub recordEditHTML { $properties{access} = "readonly" unless $editMode; $fieldValue = $self->formatDateTime($fieldValue) if $field =~ /_date/; $fieldValue =~ s/ / /g unless $editMode; - $fieldValue = ($fieldValue) ? "Yes" : "No" if $field =~ /visible/ and not $editMode; - $fieldValue = ($fieldValue) ? "Yes" : "No" if $field =~ /enable_reduced_scoring/ and not $editMode; - push @tableCells, CGI::font({class=>$visibleClass}, $self->fieldEditHTML($fieldName, $fieldValue, \%properties)); + $fieldValue = ($fieldValue) ? $r->maketext("Yes") : $r->maketext("No") if $field =~ /visible/ and not $editMode; + $fieldValue = ($fieldValue) ? $r->maketext("Yes") : $r->maketext("No") if $field =~ /enable_reduced_scoring/ and not $editMode; + push @tableCells, CGI::font({class=>$visibleClass}, $self->fieldEditHTML($fieldName, $fieldValue, \%properties, \@chooseDateTimeScripts)); #$fakeRecord{$field} = CGI::font({class=>$visibleClass}, $self->fieldEditHTML($fieldName, $fieldValue, \%properties)); } - + + push @chooseDateTimeScripts, "});"; + #@tableCells = map { $fakeRecord{$_} } @fieldsToShow; + + my $out = CGI::Tr({}, CGI::td({}, \@tableCells)); + my $scripts = CGI::start_script({-type=>"text/javascript"}).(join("", @chooseDateTimeScripts)).CGI::end_script(); - return CGI::Tr({}, CGI::td({}, \@tableCells)); + return $out.$scripts; } sub printTableHTML { @@ -2316,22 +2536,25 @@ sub printTableHTML { @headers = sort @headers; my %headers = map { $_ => $_ } @headers; - $headers{""} = "Use System Default"; + $headers{""} = $r->maketext("Use System Default"); $self->{headerFiles} = \%headers; # store these header files so we don't have to look for them later. my @tableHeadings = map { $fieldNames{$_} } @realFieldNames; + shift @tableHeadings; # prepend selection checkbox? only if we're NOT editing! # unshift @tableHeadings, "Select", "Set", "Problems" unless $editMode; # print the table if ($editMode or $exportMode) { - print CGI::start_table({}); + print CGI::start_table({-id=>"set_table_id", -class=>"set_table", -summary=>$r->maketext("_PROBLEM_SET_SUMMARY") });#"This is a table showing the current Homework sets for this class. The fields from left to right are: Edit Set Data, Edit Problems, Edit Assigned Users, Visibility to students, Reduced Credit Enabled, Date it was opened, Date it is due, and the Date during which the answers are posted. The Edit Set Data field contains checkboxes for selection and a link to the set data editing page. The cells in the Edit Problems fields contain links which take you to a page where you can edit the containing problems, and the cells in the edit assigned users field contains links which take you to a page where you can edit what students the set is assigned to."}); } else { - print CGI::start_table({-border=>1}); + print CGI::start_table({-id=>"set_table_id", -border=>1, -class=>"set_table", -summary=>$r->maketext("_PROBLEM_SET_SUMMARY") }); #"This is a table showing the current Homework sets for this class. The fields from left to right are: Edit Set Data, Edit Problems, Edit Assigned Users, Visibility to students, Reduced Credit Enabled, Date it was opened, Date it is due, and the Date during which the answers are posted. The Edit Set Data field contains checkboxes for selection and a link to the set data editing page. The cells in the Edit Problems fields contain links which take you to a page where you can edit the containing problems, and the cells in the edit assigned users field contains links which take you to a page where you can edit what students the set is assigned to."}); } + print CGI::caption($r->maketext("Set List")); + print CGI::Tr({}, CGI::th({}, \@tableHeadings)); @@ -2352,10 +2575,41 @@ sub printTableHTML { ########################################## print CGI::p( - CGI::i("No sets shown. Choose one of the options above to list the sets in the course.") + CGI::i($r->maketext("No sets shown. Choose one of the options above to list the sets in the course.")) ) unless @Sets; } +# output_JS subroutine + +# outputs all of the Javascript required for this page + +sub output_JS{ + my $self = shift; + my $r = $self->r; + my $ce = $r->ce; + + my $site_url = $ce->{webworkURLs}->{htdocs}; + print CGI::start_script({type=>"text/javascript", src=>"$site_url/js/jquery-1.7.1.min.js"}), CGI::end_script(); + print CGI::start_script({type=>"text/javascript", src=>"$site_url/js/jquery-ui-1.8.18.custom.min.js"}), CGI::end_script(); + print CGI::start_script({type=>"text/javascript", src=>"$site_url/js/jquery-ui-timepicker-addon.js"}), CGI::end_script(); + print CGI::start_script({type=>"text/javascript", src=>"$site_url/js/addOnLoadEvent.js"}), CGI::end_script(); + print CGI::start_script({type=>"text/javascript", src=>"$site_url/js/tabber.js"}), CGI::end_script(); + print CGI::start_script({type=>"text/javascript", src=>"$site_url/js/form_checker_hmwksets.js"}), CGI::end_script(); + print CGI::start_script({type=>"text/javascript", src=>"$site_url/js/hmwksets_handlers.js"}), CGI::end_script(); + print CGI::start_script({type=>"text/javascript", src=>"$site_url/js/show_hide.js"}), CGI::end_script(); + return ""; +} + +# Just tells template to output the stylesheet for Tabber +sub output_tabber_CSS{ + return ""; +} + +#Tells template to output stylesheet for Jquery-UI +sub output_jquery_ui_CSS{ + return ""; +} + 1; =head1 AUTHOR diff --git a/lib/WeBWorK/Localize/en.po b/lib/WeBWorK/Localize/en.po index 919041b220..818f0501ce 100644 --- a/lib/WeBWorK/Localize/en.po +++ b/lib/WeBWorK/Localize/en.po @@ -1,8 +1,3 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# msgid "" msgstr "" "Project-Id-Version: WeBWorK Online Homework System\n" @@ -18,7 +13,7 @@ msgstr "" # msgid "_REDUCED_CREDIT_MESSAGE_1" -msgstr "This assignment has a Reduced Credit Period that begins %1 and ends on the due date, %2. During this period all additional work done counts %3 % of the original." +msgstr "tr: This assignment has a Reduced Credit Period that begins %1 and ends on the due date, %2. During this period all additional work done counts %3\% of the original." # msgid "_REQUEST_ERROR" @@ -50,7 +45,7 @@ msgstr "Prev" # msgid "navProbListGrey" -msgstr "Up" +msgstr "tr: Up" # msgid "navNextGrey" @@ -62,7 +57,7 @@ msgstr "This is the classlist editor page, where you can view and edit the recor # msgid "_REDUCED_CREDIT_MESSAGE_2" -msgstr "This assignment had a Reduced Credit Period that began %1 andended on the due date, %2. During that period all additional work done counted %3 % of the original." +msgstr "tr: This assignment had a Reduced Credit Period that began %1 andended on the due date, %2. During that period all additional work done counted %3\% of the original." # msgid "_LOGIN_MESSAGE" @@ -80,3 +75,6 @@ msgstr "Prev" msgid "_GUEST_LOGIN_MESSAGE" msgstr "This course supports guest logins. Click %1 to log into this course as a guest." +# +msgid "_PROBLEM_SET_SUMMARY" +msgstr "This is a table showing the current Homework sets for this class. The fields from left to right are: Edit Set Data, Edit Problems, Edit Assigned Users, Visibility to students, Reduced Credit Enabled, Date it was opened, Date it is due, and the Date during which the answers are posted. The Edit Set Data field contains checkboxes for selection and a link to the set data editing page. The cells in the Edit Problems fields contain links which take you to a page where you can edit the containing problems, and the cells in the edit assigned users field contains links which take you to a page where you can edit what students the set is assigned to." From 91d5c1188929940516d1f5e9319876ea2149c17f Mon Sep 17 00:00:00 2001 From: Grant He Date: Fri, 23 Mar 2012 20:44:14 -0400 Subject: [PATCH 10/48] ghe3: implemented Datepicker (commit2) --- htdocs/css/jquery-ui-1.8.18.custom.css | 573 ++++++++++ htdocs/js/jquery-1.7.1.min.js | 4 + htdocs/js/jquery-ui-1.8.18.custom.min.js | 356 ++++++ htdocs/js/jquery-ui-timepicker-addon.js | 1326 ++++++++++++++++++++++ 4 files changed, 2259 insertions(+) create mode 100644 htdocs/css/jquery-ui-1.8.18.custom.css create mode 100644 htdocs/js/jquery-1.7.1.min.js create mode 100644 htdocs/js/jquery-ui-1.8.18.custom.min.js create mode 100644 htdocs/js/jquery-ui-timepicker-addon.js diff --git a/htdocs/css/jquery-ui-1.8.18.custom.css b/htdocs/css/jquery-ui-1.8.18.custom.css new file mode 100644 index 0000000000..97e1dd84a8 --- /dev/null +++ b/htdocs/css/jquery-ui-1.8.18.custom.css @@ -0,0 +1,573 @@ +/* + * jQuery UI CSS Framework 1.8.18 + * + * 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:before, .ui-helper-clearfix:after { content: ""; display: table; } +.ui-helper-clearfix:after { clear: both; } +.ui-helper-clearfix { zoom: 1; } +.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.18 + * + * 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-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-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; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* + * jQuery UI Resizable 1.8.18 + * + * 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; } +.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.18 + * + * 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.18 + * + * 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.18 + * + * 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.18 + * + * 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.18 + * + * 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: hidden; *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.18 + * + * 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.18 + * + * 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.18 + * + * 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.18 + * + * 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%; font-size:0em; } + +/* 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.18 + * + * 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; overflow: hidden; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } + +/* css for timepicker */ +.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } +.ui-timepicker-div dl { text-align: left; } +.ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; } +.ui-timepicker-div dl dd { margin: 0 10px 10px 85px; } +.ui-timepicker-div td { font-size: 90%; } +.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } \ No newline at end of file diff --git a/htdocs/js/jquery-1.7.1.min.js b/htdocs/js/jquery-1.7.1.min.js new file mode 100644 index 0000000000..ee0233703d --- /dev/null +++ b/htdocs/js/jquery-1.7.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.1 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,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=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.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 d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+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(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,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"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
    a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
    "+""+"
    ",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
    t
    ",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
    ",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.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?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; +f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){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,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.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]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),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]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.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!!m(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 a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},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 bc[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=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&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=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null: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=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=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(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.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:[]}},o.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&&(o.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.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[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}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.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 m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},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 V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(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 f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(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(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(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=f.clean(arguments);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,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() +{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.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 f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.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?f("
    ").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[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","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.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(c||!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 cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.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):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/htdocs/js/jquery-ui-1.8.18.custom.min.js b/htdocs/js/jquery-ui-1.8.18.custom.min.js new file mode 100644 index 0000000000..f00a62f133 --- /dev/null +++ b/htdocs/js/jquery-ui-1.8.18.custom.min.js @@ -0,0 +1,356 @@ +/*! + * jQuery UI 1.8.18 + * + * 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(a,b){function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;if(!b.href||!g||f.nodeName.toLowerCase()!=="map")return!1;h=a("img[usemap=#"+g+"]")[0];return!!h&&d(h)}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}a.ui=a.ui||{};a.ui.version||(a.extend(a.ui,{version:"1.8.18",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}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)});return c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){if(c===b)return g["inner"+d].call(this);return this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){if(typeof b!="number")return g["outer"+d].call(this,b);return this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!!d&&!!a.element[0].parentNode)for(var e=0;e0)return!0;b[d]=1,e=b[d]>0,b[d]=0;return e},isOverAxis:function(a,b,c){return a>b&&a=9)&&!b.button)return this._mouseUp(b);if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b));return!this._mouseStarted},_mouseUp:function(b){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b));return!1},_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(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);/* + * jQuery UI Position 1.8.18 + * + * 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(a,b){a.ui=a.ui||{};var c=/left|center|right/,d=/top|center|bottom/,e="center",f={},g=a.fn.position,h=a.fn.offset;a.fn.position=function(b){if(!b||!b.of)return g.apply(this,arguments);b=a.extend({},b);var h=a(b.of),i=h[0],j=(b.collision||"flip").split(" "),k=b.offset?b.offset.split(" "):[0,0],l,m,n;i.nodeType===9?(l=h.width(),m=h.height(),n={top:0,left:0}):i.setTimeout?(l=h.width(),m=h.height(),n={top:h.scrollTop(),left:h.scrollLeft()}):i.preventDefault?(b.at="left top",l=m=0,n={top:b.of.pageY,left:b.of.pageX}):(l=h.outerWidth(),m=h.outerHeight(),n=h.offset()),a.each(["my","at"],function(){var a=(b[this]||"").split(" ");a.length===1&&(a=c.test(a[0])?a.concat([e]):d.test(a[0])?[e].concat(a):[e,e]),a[0]=c.test(a[0])?a[0]:e,a[1]=d.test(a[1])?a[1]:e,b[this]=a}),j.length===1&&(j[1]=j[0]),k[0]=parseInt(k[0],10)||0,k.length===1&&(k[1]=k[0]),k[1]=parseInt(k[1],10)||0,b.at[0]==="right"?n.left+=l:b.at[0]===e&&(n.left+=l/2),b.at[1]==="bottom"?n.top+=m:b.at[1]===e&&(n.top+=m/2),n.left+=k[0],n.top+=k[1];return this.each(function(){var c=a(this),d=c.outerWidth(),g=c.outerHeight(),h=parseInt(a.curCSS(this,"marginLeft",!0))||0,i=parseInt(a.curCSS(this,"marginTop",!0))||0,o=d+h+(parseInt(a.curCSS(this,"marginRight",!0))||0),p=g+i+(parseInt(a.curCSS(this,"marginBottom",!0))||0),q=a.extend({},n),r;b.my[0]==="right"?q.left-=d:b.my[0]===e&&(q.left-=d/2),b.my[1]==="bottom"?q.top-=g:b.my[1]===e&&(q.top-=g/2),f.fractions||(q.left=Math.round(q.left),q.top=Math.round(q.top)),r={left:q.left-h,top:q.top-i},a.each(["left","top"],function(c,e){a.ui.position[j[c]]&&a.ui.position[j[c]][e](q,{targetWidth:l,targetHeight:m,elemWidth:d,elemHeight:g,collisionPosition:r,collisionWidth:o,collisionHeight:p,offset:k,my:b.my,at:b.at})}),a.fn.bgiframe&&c.bgiframe(),c.offset(a.extend(q,{using:b.using}))})},a.ui.position={fit:{left:function(b,c){var d=a(window),e=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft();b.left=e>0?b.left-e:Math.max(b.left-c.collisionPosition.left,b.left)},top:function(b,c){var d=a(window),e=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop();b.top=e>0?b.top-e:Math.max(b.top-c.collisionPosition.top,b.top)}},flip:{left:function(b,c){if(c.at[0]!==e){var d=a(window),f=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft(),g=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,h=c.at[0]==="left"?c.targetWidth:-c.targetWidth,i=-2*c.offset[0];b.left+=c.collisionPosition.left<0?g+h+i:f>0?g+h+i:0}},top:function(b,c){if(c.at[1]!==e){var d=a(window),f=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop(),g=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,h=c.at[1]==="top"?c.targetHeight:-c.targetHeight,i=-2*c.offset[1];b.top+=c.collisionPosition.top<0?g+h+i:f>0?g+h+i:0}}}},a.offset.setOffset||(a.offset.setOffset=function(b,c){/static/.test(a.curCSS(b,"position"))&&(b.style.position="relative");var d=a(b),e=d.offset(),f=parseInt(a.curCSS(b,"top",!0),10)||0,g=parseInt(a.curCSS(b,"left",!0),10)||0,h={top:c.top-e.top+f,left:c.left-e.left+g};"using"in c?c.using.call(b,h):d.css(h)},a.fn.offset=function(b){var c=this[0];if(!c||!c.ownerDocument)return null;if(b)return this.each(function(){a.offset.setOffset(this,b)});return h.call(this)}),function(){var b=document.getElementsByTagName("body")[0],c=document.createElement("div"),d,e,g,h,i;d=document.createElement(b?"div":"body"),g={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},b&&a.extend(g,{position:"absolute",left:"-1000px",top:"-1000px"});for(var j in g)d.style[j]=g[j];d.appendChild(c),e=b||document.documentElement,e.insertBefore(d,e.firstChild),c.style.cssText="position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;",h=a(c).offset(function(a,b){return b}).offset(),d.innerHTML="",e.removeChild(d),i=h.top+h.left+(b?2e3:0),f.fractions=i>21&&i<22}()})(jQuery);/* + * jQuery UI Draggable 1.8.18 + * + * 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(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){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(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle"))return!1;this.handle=this._getHandle(b);if(!this.handle)return!1;c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('
    ').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")});return!0},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b),this._cacheHelperProportions(),a.ui.ddmanager&&(a.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},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment();if(this._trigger("start",b)===!1){this._clear();return!1}this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.helper.addClass("ui-draggable-dragging"),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b);return!0},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1){this._mouseUp({});return!1}this.position=d.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";a.ui.ddmanager&&a.ui.ddmanager.drag(this,b);return!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var d=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){d._trigger("stop",b)!==!1&&d._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b);return a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?!0:!1;a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)});return c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute");return d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.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()}}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 b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h=[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.lefth[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.toph[3]?j-this.offset.click.toph[2]?k-this.offset.click.left=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f=k&&g<=l||h>=k&&h<=l||gl)&&(e>=i&&e<=j||f>=i&&f<=j||ej);default:return!1}},a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(b,c){var d=a.ui.ddmanager.droppables[b.options.scope]||[],e=c?c.type:null,f=(b.currentItem||b.element).find(":data(droppable)").andSelf();droppablesLoop:for(var g=0;g
    ').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=!0,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=c.handles||(a(".ui-resizable-handle",this.element).length?{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"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e');/sw|se|ne|nw/.test(f)&&h.css({zIndex:++c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){c.disabled||(a(this).removeClass("ui-resizable-autohide"),b._handles.show())},function(){c.disabled||b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).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 c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement);return this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b);return!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);l=this._respectSize(l,b),this._propagate("resize",b),c.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(l),this._trigger("resize",b,this.ui());return!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove();return!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),ea.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null);return a},_proportionallyResize:function(){var b=this.options;if(!!this._proportionallyResizeElements.length){var c=this.helper||this.element;for(var d=0;d');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,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}}}),a.extend(a.ui.resizable,{version:"1.8.18"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!!i){e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/e.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*e.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);/* + * jQuery UI Selectable 1.8.18 + * + * 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(a,b){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable"),this.dragged=!1;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]),c.addClass("ui-selectee"),c.each(function(){var b=a(this),c=b.offset();a.data(this,"selectable-item",{element:this,$element:b,left:c.left,top:c.top,right:c.left+b.outerWidth(),bottom:c.top+b.outerHeight(),startselected:!1,selected:b.hasClass("ui-selected"),selecting:b.hasClass("ui-selecting"),unselecting:b.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=c.addClass("ui-selectee"),this._mouseInit(),this.helper=a("
    ")},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(b){var c=this;this.opos=[b.pageX,b.pageY];if(!this.options.disabled){var d=this.options;this.selectees=a(d.filter,this.element[0]),this._trigger("start",b),a(d.appendTo).append(this.helper),this.helper.css({left:b.clientX,top:b.clientY,width:0,height:0}),d.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var d=a.data(this,"selectable-item");d.startselected=!0,!b.metaKey&&!b.ctrlKey&&(d.$element.removeClass("ui-selected"),d.selected=!1,d.$element.addClass("ui-unselecting"),d.unselecting=!0,c._trigger("unselecting",b,{unselecting:d.element}))}),a(b.target).parents().andSelf().each(function(){var d=a.data(this,"selectable-item");if(d){var e=!b.metaKey&&!b.ctrlKey||!d.$element.hasClass("ui-selected");d.$element.removeClass(e?"ui-unselecting":"ui-selected").addClass(e?"ui-selecting":"ui-unselecting"),d.unselecting=!e,d.selecting=e,d.selected=e,e?c._trigger("selecting",b,{selecting:d.element}):c._trigger("unselecting",b,{unselecting:d.element});return!1}})}},_mouseDrag:function(b){var c=this;this.dragged=!0;if(!this.options.disabled){var d=this.options,e=this.opos[0],f=this.opos[1],g=b.pageX,h=b.pageY;if(e>g){var i=g;g=e,e=i}if(f>h){var i=h;h=f,f=i}this.helper.css({left:e,top:f,width:g-e,height:h-f}),this.selectees.each(function(){var i=a.data(this,"selectable-item");if(!!i&&i.element!=c.element[0]){var j=!1;d.tolerance=="touch"?j=!(i.left>g||i.righth||i.bottome&&i.rightf&&i.bottom *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},destroy:function(){a.Widget.prototype.destroy.call(this),this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--)this.items[b].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f){e=a(this);return!1}});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}this.currentItem=e,this._removeCurrentsFromItems();return!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),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"),a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b);return!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs;return!1},_mouseStop:function(b,c){if(!!b){a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1}},cancel:function(){var b=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 c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}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(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem));return this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"=");return d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")});return d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+jf&&b+ka[this.floating?"width":"height"]?l:f0?"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(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];e||(b.style.visibility="hidden");return b},update:function(a,b){if(!e||!!d.forcePlaceholderSize)b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!!c)if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.items[i][this.containers[d].floating?"left":"top"];Math.abs(j-h)this.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.topthis.containment[3]?h-this.offset.click.topthis.containment[2]?i-this.offset.click.left=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var b=this,c=b.options;b.running=0,b.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"),b.headers=b.element.find(c.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){c.disabled||a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){c.disabled||a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){c.disabled||a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){c.disabled||a(this).removeClass("ui-state-focus")}),b.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(c.navigation){var d=b.element.find("a").filter(c.navigationFilter).eq(0);if(d.length){var e=d.closest(".ui-accordion-header");e.length?b.active=e:b.active=d.closest(".ui-accordion-content").prev()}}b.active=b._findActive(b.active||c.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top"),b.active.next().addClass("ui-accordion-content-active"),b._createIcons(),b.resize(),b.element.attr("role","tablist"),b.headers.attr("role","tab").bind("keydown.accordion",function(a){return b._keydown(a)}).next().attr("role","tabpanel"),b.headers.not(b.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide(),b.active.length?b.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):b.headers.eq(0).attr("tabIndex",0),a.browser.safari||b.headers.find("a").attr("tabIndex",-1),c.event&&b.headers.bind(c.event.split(" ").join(".accordion ")+".accordion",function(a){b._clickHandler.call(b,a,this),a.preventDefault()})},_createIcons:function(){var b=this.options;b.icons&&(a("").addClass("ui-icon "+b.icons.header).prependTo(this.headers),this.active.children(".ui-icon").toggleClass(b.icons.header).toggleClass(b.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 b=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 c=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");(b.autoHeight||b.fillHeight)&&c.css("height","");return a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b=="active"&&this.activate(c),b=="icons"&&(this._destroyIcons(),c&&this._createIcons()),b=="disabled"&&this.headers.add(this.headers.next())[c?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(b){if(!(this.options.disabled||b.altKey||b.ctrlKey)){var c=a.ui.keyCode,d=this.headers.length,e=this.headers.index(b.target),f=!1;switch(b.keyCode){case c.RIGHT:case c.DOWN:f=this.headers[(e+1)%d];break;case c.LEFT:case c.UP:f=this.headers[(e-1+d)%d];break;case c.SPACE:case c.ENTER:this._clickHandler({target:b.target},b.target),b.preventDefault()}if(f){a(b.target).attr("tabIndex",-1),a(f).attr("tabIndex",0),f.focus();return!1}return!0}},resize:function(){var b=this.options,c;if(b.fillSpace){if(a.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height(),a.browser.msie&&this.element.parent().css("overflow",d),this.headers.each(function(){c-=a(this).outerHeight(!0)}),this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else b.autoHeight&&(c=0,this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c));return this},activate:function(a){this.options.active=a;var b=this._findActive(a)[0];this._clickHandler({target:b},b);return this},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===!1?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,c){var d=this.options;if(!d.disabled){if(!b.target){if(!d.collapsible)return;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 e=this.active.next(),f={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:e},g=this.active=a([]);this._toggle(g,e,f);return}var h=a(b.currentTarget||c),i=h[0]===this.active[0];d.active=d.collapsible&&i?!1:this.headers.index(h);if(this.running||!d.collapsible&&i)return;var j=this.active,g=h.next(),e=this.active.next(),f={options:d,newHeader:i&&d.collapsible?a([]):h,oldHeader:this.active,newContent:i&&d.collapsible?a([]):g,oldContent:e},k=this.headers.index(this.active[0])>this.headers.index(h[0]);this.active=i?a([]):h,this._toggle(g,e,f,i,k),j.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),i||(h.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),h.next().addClass("ui-accordion-content-active"));return}},_toggle:function(b,c,d,e,f){var g=this,h=g.options;g.toShow=b,g.toHide=c,g.data=d;var i=function(){if(!!g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data),g.running=c.size()===0?b.size():c.size();if(h.animated){var j={};h.collapsible&&e?j={toShow:a([]),toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace}:j={toShow:b,toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace},h.proxied||(h.proxied=h.animated),h.proxiedDuration||(h.proxiedDuration=h.duration),h.animated=a.isFunction(h.proxied)?h.proxied(j):h.proxied,h.duration=a.isFunction(h.proxiedDuration)?h.proxiedDuration(j):h.proxiedDuration;var k=a.ui.accordion.animations,l=h.duration,m=h.animated;m&&!k[m]&&!a.easing[m]&&(m="slide"),k[m]||(k[m]=function(a){this.slide(a,{easing:m,duration:l||700})}),k[m](j)}else h.collapsible&&e?b.toggle():(c.hide(),b.show()),i(!0);c.prev().attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).blur(),b.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;this.running||(this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""}),this.toHide.removeClass("ui-accordion-content-active"),this.toHide.length&&(this.toHide.parent()[0].className=this.toHide.parent()[0].className),this._trigger("change",null,this.data))}}),a.extend(a.ui.accordion,{version:"1.8.18",animations:{slide:function(b,c){b=a.extend({easing:"swing",duration:300},b,c);if(!b.toHide.size())b.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},b);else{if(!b.toShow.size()){b.toHide.animate({height:"hide",paddingTop:"hide",paddingBottom:"hide"},b);return}var d=b.toShow.css("overflow"),e=0,f={},g={},h=["height","paddingTop","paddingBottom"],i,j=b.toShow;i=j[0].style.width,j.width(j.parent().width()-parseFloat(j.css("paddingLeft"))-parseFloat(j.css("paddingRight"))-(parseFloat(j.css("borderLeftWidth"))||0)-(parseFloat(j.css("borderRightWidth"))||0)),a.each(h,function(c,d){g[d]="hide";var e=(""+a.css(b.toShow[0],d)).match(/^([\d+-.]+)(.*)$/);f[d]={value:e[1],unit:e[2]||"px"}}),b.toShow.css({height:0,overflow:"hidden"}).show(),b.toHide.filter(":hidden").each(b.complete).end().filter(":visible").animate(g,{step:function(a,c){c.prop=="height"&&(e=c.end-c.start===0?0:(c.now-c.start)/(c.end-c.start)),b.toShow[0].style[c.prop]=e*f[c.prop].value+f[c.prop].unit},duration:b.duration,easing:b.easing,complete:function(){b.autoHeight||b.toShow.css("height",""),b.toShow.css({width:i,overflow:d}),b.complete()}})}},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1e3:200})}}})})(jQuery);/* + * jQuery UI Autocomplete 1.8.18 + * + * 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(a,b){var c=0;a.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var b=this,c=this.element[0].ownerDocument,d;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!b.options.disabled&&!b.element.propAttr("readOnly")){d=!1;var e=a.ui.keyCode;switch(c.keyCode){case e.PAGE_UP:b._move("previousPage",c);break;case e.PAGE_DOWN:b._move("nextPage",c);break;case e.UP:b._move("previous",c),c.preventDefault();break;case e.DOWN:b._move("next",c),c.preventDefault();break;case e.ENTER:case e.NUMPAD_ENTER:b.menu.active&&(d=!0,c.preventDefault());case e.TAB:if(!b.menu.active)return;b.menu.select(c);break;case e.ESCAPE:b.element.val(b.term),b.close(c);break;default:clearTimeout(b.searching),b.searching=setTimeout(function(){b.term!=b.element.val()&&(b.selectedItem=null,b.search(null,c))},b.options.delay)}}}).bind("keypress.autocomplete",function(a){d&&(d=!1,a.preventDefault())}).bind("focus.autocomplete",function(){b.options.disabled||(b.selectedItem=null,b.previous=b.element.val())}).bind("blur.autocomplete",function(a){b.options.disabled||(clearTimeout(b.searching),b.closing=setTimeout(function(){b.close(a),b._change(a)},150))}),this._initSource(),this.response=function(){return b._response.apply(b,arguments)},this.menu=a("
      ").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body",c)[0]).mousedown(function(c){var d=b.menu.element[0];a(c.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(c){c.target!==b.element[0]&&c.target!==d&&!a.ui.contains(d,c.target)&&b.close()})},1),setTimeout(function(){clearTimeout(b.closing)},13)}).menu({focus:function(a,c){var d=c.item.data("item.autocomplete");!1!==b._trigger("focus",a,{item:d})&&/^key/.test(a.originalEvent.type)&&b.element.val(d.value)},selected:function(a,d){var e=d.item.data("item.autocomplete"),f=b.previous;b.element[0]!==c.activeElement&&(b.element.focus(),b.previous=f,setTimeout(function(){b.previous=f,b.selectedItem=e},1)),!1!==b._trigger("select",a,{item:e})&&b.element.val(e.value),b.term=b.element.val(),b.close(a),b.selectedItem=e},blur:function(a,c){b.menu.element.is(":visible")&&b.element.val()!==b.term&&b.element.val(b.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"),a.fn.bgiframe&&this.menu.element.bgiframe(),b.beforeunloadHandler=function(){b.element.removeAttr("autocomplete")},a(window).bind("beforeunload",b.beforeunloadHandler)},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"),this.menu.element.remove(),a(window).unbind("beforeunload",this.beforeunloadHandler),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b==="source"&&this._initSource(),b==="appendTo"&&this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]),b==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var b=this,d,e;a.isArray(this.options.source)?(d=this.options.source,this.source=function(b,c){c(a.ui.autocomplete.filter(d,b.term))}):typeof this.options.source=="string"?(e=this.options.source,this.source=function(d,f){b.xhr&&b.xhr.abort(),b.xhr=a.ajax({url:e,data:d,dataType:"json",context:{autocompleteRequest:++c},success:function(a,b){this.autocompleteRequest===c&&f(a)},error:function(){this.autocompleteRequest===c&&f([])}})}):this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val(),this.term=this.element.val();if(a.length").data("item.autocomplete",c).append(a("").text(c.label)).appendTo(b)},_move:function(a,b){if(!this.menu.element.is(":visible"))this.search(null,b);else{if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term),this.menu.deactivate();return}this.menu[a](b)}},widget:function(){return this.menu.element}}),a.extend(a.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(b,c){var d=new RegExp(a.ui.autocomplete.escapeRegex(c),"i");return a.grep(b,function(a){return d.test(a.label||a.value||a)})}})})(jQuery),function(a){a.widget("ui.menu",{_create:function(){var b=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){!a(c.target).closest(".ui-menu-item a").length||(c.preventDefault(),b.select(c))}),this.refresh()},refresh:function(){var b=this,c=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");c.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(c){b.activate(c,a(this).parent())}).mouseleave(function(){b.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.scrollTop(),e=this.element.height();c<0?this.element.scrollTop(d+c):c>=e&&this.element.scrollTop(d+c-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end(),this._trigger("focus",a,{item:b})},deactivate:function(){!this.active||(this.active.children("a").removeClass("ui-state-hover").removeAttr("id"),this._trigger("blur"),this.active=null)},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},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(a,b,c){if(!this.active)this.activate(c,this.element.children(b));else{var d=this.active[a+"All"](".ui-menu-item").eq(0);d.length?this.activate(c,d):this.activate(c,this.element.children(b))}},nextPage:function(b){if(this.hasScroll()){if(!this.active||this.last()){this.activate(b,this.element.children(".ui-menu-item:first"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c-d+a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:last")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(b){if(this.hasScroll()){if(!this.active||this.first()){this.activate(b,this.element.children(".ui-menu-item:last"));return}var c=this.active.offset().top,d=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c+d-a(this).height();return b<10&&b>-10}),result.length||(result=this.element.children(".ui-menu-item:first")),this.activate(b,result)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()",this.element[0].ownerDocument).addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary,f=[];d.primary||d.secondary?(this.options.text&&f.push("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary")),d.primary&&b.prepend(""),d.secondary&&b.append(""),this.options.text||(f.push(e?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||b.attr("title",c))):f.push("ui-button-text-only"),b.addClass(f.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(){var b=this.element.css("direction")==="rtl";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(b?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(b?"ui-corner-left":"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.18 + * + * 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(a,b){var c="ui-dialog ui-widget ui-widget-content ui-corner-all ",d={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},e={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},f=a.attrFn||{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0,click:!0};a.widget("ui.dialog",{options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",collision:"fit",using:function(b){var c=a(this).css(b).offset().top;c<0&&a(this).css("top",b.top-c)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.options.title=this.options.title||this.originalTitle;var b=this,d=b.options,e=d.title||" ",f=a.ui.dialog.getTitleId(b.element),g=(b.uiDialog=a("
      ")).appendTo(document.body).hide().addClass(c+d.dialogClass).css({zIndex:d.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(c){d.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(a){b.moveToTop(!1,a)}),h=b.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g),i=(b.uiDialogTitlebar=a("
      ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),j=a('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){j.addClass("ui-state-hover")},function(){j.removeClass("ui-state-hover")}).focus(function(){j.addClass("ui-state-focus")}).blur(function(){j.removeClass("ui-state-focus")}).click(function(a){b.close(a);return!1}).appendTo(i),k=(b.uiDialogTitlebarCloseText=a("")).addClass("ui-icon ui-icon-closethick").text(d.closeText).appendTo(j),l=a("").addClass("ui-dialog-title").attr("id",f).html(e).prependTo(i);a.isFunction(d.beforeclose)&&!a.isFunction(d.beforeClose)&&(d.beforeClose=d.beforeclose),i.find("*").add(i).disableSelection(),d.draggable&&a.fn.draggable&&b._makeDraggable(),d.resizable&&a.fn.resizable&&b._makeResizable(),b._createButtons(d.buttons),b._isOpen=!1,a.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(b){var c=this,d,e;if(!1!==c._trigger("beforeClose",b)){c.overlay&&c.overlay.destroy(),c.uiDialog.unbind("keypress.ui-dialog"),c._isOpen=!1,c.options.hide?c.uiDialog.hide(c.options.hide,function(){c._trigger("close",b)}):(c.uiDialog.hide(),c._trigger("close",b)),a.ui.dialog.overlay.resize(),c.options.modal&&(d=0,a(".ui-dialog").each(function(){this!==c.uiDialog[0]&&(e=a(this).css("z-index"),isNaN(e)||(d=Math.max(d,e)))}),a.ui.dialog.maxZ=d);return c}},isOpen:function(){return this._isOpen},moveToTop:function(b,c){var d=this,e=d.options,f;if(e.modal&&!b||!e.stack&&!e.modal)return d._trigger("focus",c);e.zIndex>a.ui.dialog.maxZ&&(a.ui.dialog.maxZ=e.zIndex),d.overlay&&(a.ui.dialog.maxZ+=1,d.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ)),f={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()},a.ui.dialog.maxZ+=1,d.uiDialog.css("z-index",a.ui.dialog.maxZ),d.element.attr(f),d._trigger("focus",c);return d},open:function(){if(!this._isOpen){var b=this,c=b.options,d=b.uiDialog;b.overlay=c.modal?new a.ui.dialog.overlay(b):null,b._size(),b._position(c.position),d.show(c.show),b.moveToTop(!0),c.modal&&d.bind("keydown.ui-dialog",function(b){if(b.keyCode===a.ui.keyCode.TAB){var c=a(":tabbable",this),d=c.filter(":first"),e=c.filter(":last");if(b.target===e[0]&&!b.shiftKey){d.focus(1);return!1}if(b.target===d[0]&&b.shiftKey){e.focus(1);return!1}}}),a(b.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus(),b._isOpen=!0,b._trigger("open");return b}},_createButtons:function(b){var c=this,d=!1,e=a("
      ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=a("
      ").addClass("ui-dialog-buttonset").appendTo(e);c.uiDialog.find(".ui-dialog-buttonpane").remove(),typeof b=="object"&&b!==null&&a.each(b,function(){return!(d=!0)}),d&&(a.each(b,function(b,d){d=a.isFunction(d)?{click:d,text:b}:d;var e=a('').click(function(){d.click.apply(c.element[0],arguments)}).appendTo(g);a.each(d,function(a,b){a!=="click"&&(a in f?e[a](b):e.attr(a,b))}),a.fn.button&&e.button()}),e.appendTo(c.uiDialog))},_makeDraggable:function(){function f(a){return{position:a.position,offset:a.offset}}var b=this,c=b.options,d=a(document),e;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(d,g){e=c.height==="auto"?"auto":a(this).height(),a(this).height(a(this).height()).addClass("ui-dialog-dragging"),b._trigger("dragStart",d,f(g))},drag:function(a,c){b._trigger("drag",a,f(c))},stop:function(g,h){c.position=[h.position.left-d.scrollLeft(),h.position.top-d.scrollTop()],a(this).removeClass("ui-dialog-dragging").height(e),b._trigger("dragStop",g,f(h)),a.ui.dialog.overlay.resize()}})},_makeResizable:function(c){function h(a){return{originalPosition:a.originalPosition,originalSize:a.originalSize,position:a.position,size:a.size}}c=c===b?this.options.resizable:c;var d=this,e=d.options,f=d.uiDialog.css("position"),g=typeof c=="string"?c:"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:g,start:function(b,c){a(this).addClass("ui-dialog-resizing"),d._trigger("resizeStart",b,h(c))},resize:function(a,b){d._trigger("resize",a,h(b))},stop:function(b,c){a(this).removeClass("ui-dialog-resizing"),e.height=a(this).height(),e.width=a(this).width(),d._trigger("resizeStop",b,h(c)),a.ui.dialog.overlay.resize()}}).css("position",f).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(b){var c=[],d=[0,0],e;if(b){if(typeof b=="string"||typeof b=="object"&&"0"in b)c=b.split?b.split(" "):[b[0],b[1]],c.length===1&&(c[1]=c[0]),a.each(["left","top"],function(a,b){+c[a]===c[a]&&(d[a]=c[a],c[a]=b)}),b={my:c.join(" "),at:c.join(" "),offset:d.join(" ")};b=a.extend({},a.ui.dialog.prototype.options.position,b)}else b=a.ui.dialog.prototype.options.position;e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.css({top:0,left:0}).position(a.extend({of:window},b)),e||this.uiDialog.hide()},_setOptions:function(b){var c=this,f={},g=!1;a.each(b,function(a,b){c._setOption(a,b),a in d&&(g=!0),a in e&&(f[a]=b)}),g&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",f)},_setOption:function(b,d){var e=this,f=e.uiDialog;switch(b){case"beforeclose":b="beforeClose";break;case"buttons":e._createButtons(d);break;case"closeText":e.uiDialogTitlebarCloseText.text(""+d);break;case"dialogClass":f.removeClass(e.options.dialogClass).addClass(c+d);break;case"disabled":d?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case"draggable":var g=f.is(":data(draggable)");g&&!d&&f.draggable("destroy"),!g&&d&&e._makeDraggable();break;case"position":e._position(d);break;case"resizable":var h=f.is(":data(resizable)");h&&!d&&f.resizable("destroy"),h&&typeof d=="string"&&f.resizable("option","handles",d),!h&&d!==!1&&e._makeResizable(d);break;case"title":a(".ui-dialog-title",e.uiDialogTitlebar).html(""+(d||" "))}a.Widget.prototype._setOption.apply(e,arguments)},_size:function(){var b=this.options,c,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),b.minWidth>b.width&&(b.width=b.minWidth),c=this.uiDialog.css({height:"auto",width:b.width}).height(),d=Math.max(0,b.minHeight-c);if(b.height==="auto")if(a.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();var f=this.element.css("height","auto").height();e||this.uiDialog.hide(),this.element.height(Math.max(f,d))}else this.element.height(Math.max(b.height-c,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),a.extend(a.ui.dialog,{version:"1.8.18",uuid:0,maxZ:0,getTitleId:function(a){var b=a.attr("id");b||(this.uuid+=1,b=this.uuid);return"ui-dialog-title-"+b},overlay:function(b){this.$el=a.ui.dialog.overlay.create(b)}}),a.extend(a.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:a.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(b){this.instances.length===0&&(setTimeout(function(){a.ui.dialog.overlay.instances.length&&a(document).bind(a.ui.dialog.overlay.events,function(b){if(a(b.target).zIndex()").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});a.fn.bgiframe&&c.bgiframe(),this.instances.push(c);return c},destroy:function(b){var c=a.inArray(b,this.instances);c!=-1&&this.oldInstances.push(this.instances.splice(c,1)[0]),this.instances.length===0&&a([document,window]).unbind(".dialog-overlay"),b.remove();var d=0;a.each(this.instances,function(){d=Math.max(d,this.css("z-index"))}),this.maxZ=d},height:function(){var b,c;if(a.browser.msie&&a.browser.version<7){b=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return b").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:"")));for(var i=e.length;ic&&(f=c,g=a(this),i=b)}),c.range===!0&&this.values(1)===c.min&&(i+=1,g=a(this.handles[i])),j=this._start(b,i);if(j===!1)return!1;this._mouseSliding=!0,h._handleIndex=i,g.addClass("ui-state-active").focus(),k=g.offset(),l=!a(b.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:b.pageX-k.left-g.width()/2,top:b.pageY-k.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(b,i,e),this._animateOff=!0;return!0},_mouseStart:function(a){return!0},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},c=this._normValueFromMouse(b);this._slide(a,this._handleIndex,c);return!1},_mouseStop:function(a){this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(a,this._handleIndex),this._change(a,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1;return!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,c,d,e,f;this.orientation==="horizontal"?(b=this.elementSize.width,c=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(b=this.elementSize.height,c=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),d=c/b,d>1&&(d=1),d<0&&(d=0),this.orientation==="vertical"&&(d=1-d),e=this._valueMax()-this._valueMin(),f=this._valueMin()+d*e;return this._trimAlignValue(f)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values());return this._trigger("start",a,c)},_slide:function(a,b,c){var d,e,f;this.options.values&&this.options.values.length?(d=this.values(b?0:1),this.options.values.length===2&&this.options.range===!0&&(b===0&&c>d||b===1&&c1)this.options.values[b]=this._trimAlignValue(c),this._refreshValue(),this._change(null,b);else{if(!arguments.length)return this._values();if(!a.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(b):this.value();d=this.options.values,e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b,d=a-c;Math.abs(c)*2>=b&&(d+=c>0?b:-b);return parseFloat(d.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,c=this.options,d=this,e=this._animateOff?!1:c.animate,f,g={},h,i,j,k;this.options.values&&this.options.values.length?this.handles.each(function(b,i){f=(d.values(b)-d._valueMin())/(d._valueMax()-d._valueMin())*100,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",a(this).stop(1,1)[e?"animate":"css"](g,c.animate),d.options.range===!0&&(d.orientation==="horizontal"?(b===0&&d.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({width:f-h+"%"},{queue:!1,duration:c.animate})):(b===0&&d.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({height:f-h+"%"},{queue:!1,duration:c.animate}))),h=f}):(i=this.value(),j=this._valueMin(),k=this._valueMax(),f=k!==j?(i-j)/(k-j)*100:0,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",this.handle.stop(1,1)[e?"animate":"css"](g,c.animate),b==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},c.animate),b==="max"&&this.orientation==="horizontal"&&this.range[e?"animate":"css"]({width:100-f+"%"},{queue:!1,duration:c.animate}),b==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},c.animate),b==="max"&&this.orientation==="vertical"&&this.range[e?"animate":"css"]({height:100-f+"%"},{queue:!1,duration:c.animate}))}}),a.extend(a.ui.slider,{version:"1.8.18"})})(jQuery);/* + * jQuery UI Tabs 1.8.18 + * + * 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(a,b){function f(){return++d}function e(){return++c}var c=0,d=0;a.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:!1,cookie:null,collapsible:!1,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
      ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
    • #{label}
    • "},_create:function(){this._tabify(!0)},_setOption:function(a,b){if(a=="selected"){if(this.options.collapsible&&b==this.options.selected)return;this.select(b)}else this.options[a]=b,this._tabify()},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+f());return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(a,b){return{tab:a,panel:b,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function m(b,c){b.css("display",""),!a.support.opacity&&c.opacity&&b[0].style.removeAttribute("filter")}var d=this,e=this.options,f=/^#.+/;this.list=this.element.find("ol,ul").eq(0),this.lis=a(" > li:has(a[href])",this.list),this.anchors=this.lis.map(function(){return a("a",this)[0]}),this.panels=a([]),this.anchors.each(function(b,c){var g=a(c).attr("href"),h=g.split("#")[0],i;h&&(h===location.toString().split("#")[0]||(i=a("base")[0])&&h===i.href)&&(g=c.hash,c.href=g);if(f.test(g))d.panels=d.panels.add(d.element.find(d._sanitizeSelector(g)));else if(g&&g!=="#"){a.data(c,"href.tabs",g),a.data(c,"load.tabs",g.replace(/#.*$/,""));var j=d._tabId(c);c.href="#"+j;var k=d.element.find("#"+j);k.length||(k=a(e.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(d.panels[b-1]||d.list),k.data("destroy.tabs",!0)),d.panels=d.panels.add(k)}else e.disabled.push(b)}),c?(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"),e.selected===b?(location.hash&&this.anchors.each(function(a,b){if(b.hash==location.hash){e.selected=a;return!1}}),typeof e.selected!="number"&&e.cookie&&(e.selected=parseInt(d._cookie(),10)),typeof e.selected!="number"&&this.lis.filter(".ui-tabs-selected").length&&(e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))),e.selected=e.selected||(this.lis.length?0:-1)):e.selected===null&&(e.selected=-1),e.selected=e.selected>=0&&this.anchors[e.selected]||e.selected<0?e.selected:0,e.disabled=a.unique(e.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(a,b){return d.lis.index(a)}))).sort(),a.inArray(e.selected,e.disabled)!=-1&&e.disabled.splice(a.inArray(e.selected,e.disabled),1),this.panels.addClass("ui-tabs-hide"),this.lis.removeClass("ui-tabs-selected ui-state-active"),e.selected>=0&&this.anchors.length&&(d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash)).removeClass("ui-tabs-hide"),this.lis.eq(e.selected).addClass("ui-tabs-selected ui-state-active"),d.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[e.selected],d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash))[0]))}),this.load(e.selected)),a(window).bind("unload",function(){d.lis.add(d.anchors).unbind(".tabs"),d.lis=d.anchors=d.panels=null})):e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")),this.element[e.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible"),e.cookie&&this._cookie(e.selected,e.cookie);for(var g=0,h;h=this.lis[g];g++)a(h)[a.inArray(g,e.disabled)!=-1&&!a(h).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");e.cache===!1&&this.anchors.removeData("cache.tabs"),this.lis.add(this.anchors).unbind(".tabs");if(e.event!=="mouseover"){var i=function(a,b){b.is(":not(.ui-state-disabled)")&&b.addClass("ui-state-"+a)},j=function(a,b){b.removeClass("ui-state-"+a)};this.lis.bind("mouseover.tabs",function(){i("hover",a(this))}),this.lis.bind("mouseout.tabs",function(){j("hover",a(this))}),this.anchors.bind("focus.tabs",function(){i("focus",a(this).closest("li"))}),this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var k,l;e.fx&&(a.isArray(e.fx)?(k=e.fx[0],l=e.fx[1]):k=l=e.fx);var n=l?function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.hide().removeClass("ui-tabs-hide").animate(l,l.duration||"normal",function(){m(c,l),d._trigger("show",null,d._ui(b,c[0]))})}:function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.removeClass("ui-tabs-hide"),d._trigger("show",null,d._ui(b,c[0]))},o=k?function(a,b){b.animate(k,k.duration||"normal",function(){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),m(b,k),d.element.dequeue("tabs")})}:function(a,b,c){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),d.element.dequeue("tabs")};this.anchors.bind(e.event+".tabs",function(){var b=this,c=a(b).closest("li"),f=d.panels.filter(":not(.ui-tabs-hide)"),g=d.element.find(d._sanitizeSelector(b.hash));if(c.hasClass("ui-tabs-selected")&&!e.collapsible||c.hasClass("ui-state-disabled")||c.hasClass("ui-state-processing")||d.panels.filter(":animated").length||d._trigger("select",null,d._ui(this,g[0]))===!1){this.blur();return!1}e.selected=d.anchors.index(this),d.abort();if(e.collapsible){if(c.hasClass("ui-tabs-selected")){e.selected=-1,e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){o(b,f)}).dequeue("tabs"),this.blur();return!1}if(!f.length){e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this)),this.blur();return!1}}e.cookie&&d._cookie(e.selected,e.cookie);if(g.length)f.length&&d.element.queue("tabs",function(){o(b,f)}),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this));else throw"jQuery UI Tabs: Mismatching fragment identifier.";a.browser.msie&&this.blur()}),this.anchors.bind("click.tabs",function(){return!1})},_getIndex:function(a){typeof a=="string"&&(a=this.anchors.index(this.anchors.filter("[href$="+a+"]")));return a},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 b=a.data(this,"href.tabs");b&&(this.href=b);var c=a(this).unbind(".tabs");a.each(["href","load","cache"],function(a,b){c.removeData(b+".tabs")})}),this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}),b.cookie&&this._cookie(null,b.cookie);return this},add:function(c,d,e){e===b&&(e=this.anchors.length);var f=this,g=this.options,h=a(g.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,d)),i=c.indexOf("#")?this._tabId(a("a",h)[0]):c.replace("#","");h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",!0);var j=f.element.find("#"+i);j.length||(j=a(g.panelTemplate).attr("id",i).data("destroy.tabs",!0)),j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"),e>=this.lis.length?(h.appendTo(this.list),j.appendTo(this.list[0].parentNode)):(h.insertBefore(this.lis[e]),j.insertBefore(this.panels[e])),g.disabled=a.map(g.disabled,function(a,b){return a>=e?++a:a}),this._tabify(),this.anchors.length==1&&(g.selected=0,h.addClass("ui-tabs-selected ui-state-active"),j.removeClass("ui-tabs-hide"),this.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[0],f.panels[0]))}),this.load(0)),this._trigger("add",null,this._ui(this.anchors[e],this.panels[e]));return this},remove:function(b){b=this._getIndex(b);var c=this.options,d=this.lis.eq(b).remove(),e=this.panels.eq(b).remove();d.hasClass("ui-tabs-selected")&&this.anchors.length>1&&this.select(b+(b+1=b?--a:a}),this._tabify(),this._trigger("remove",null,this._ui(d.find("a")[0],e[0]));return this},enable:function(b){b=this._getIndex(b);var c=this.options;if(a.inArray(b,c.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled"),c.disabled=a.grep(c.disabled,function(a,c){return a!=b}),this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(a){a=this._getIndex(a);var b=this,c=this.options;a!=c.selected&&(this.lis.eq(a).addClass("ui-state-disabled"),c.disabled.push(a),c.disabled.sort(),this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a])));return this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;this.anchors.eq(a).trigger(this.options.event+".tabs");return this},load:function(b){b=this._getIndex(b);var c=this,d=this.options,e=this.anchors.eq(b)[0],f=a.data(e,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&a.data(e,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(d.spinner){var g=a("span",e);g.data("label.tabs",g.html()).html(d.spinner)}this.xhr=a.ajax(a.extend({},d.ajaxOptions,{url:f,success:function(f,g){c.element.find(c._sanitizeSelector(e.hash)).html(f),c._cleanup(),d.cache&&a.data(e,"cache.tabs",!0),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.success(f,g)}catch(h){}},error:function(a,f,g){c._cleanup(),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.error(a,f,b,e)}catch(g){}}})),c.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]),this.panels.stop(!1,!0),this.element.queue("tabs",this.element.queue("tabs").splice(-2,2)),this.xhr&&(this.xhr.abort(),delete this.xhr),this._cleanup();return this},url:function(a,b){this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",b);return this},length:function(){return this.anchors.length}}),a.extend(a.ui.tabs,{version:"1.8.18"}),a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(a,b){var c=this,d=this.options,e=c._rotate||(c._rotate=function(b){clearTimeout(c.rotation),c.rotation=setTimeout(function(){var a=d.selected;c.select(++a'))}$.extend($.ui,{datepicker:{version:"1.8.18"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){extendRemove(this._defaults,a||{});return this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(a,b){var c=a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:c,input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:b?bindHover($('
      ')):this.dpDiv}},_connectDatepicker:function(a,b){var c=$(a);b.append=$([]),b.trigger=$([]);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(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),this._autoSize(b),$.data(a,PROP_NAME,b),b.settings.disabled&&this._disableDatepicker(a))},_attachments:function(a,b){var c=this._get(b,"appendText"),d=this._get(b,"isRTL");b.append&&b.append.remove(),c&&(b.append=$(''+c+""),a[d?"before":"after"](b.append)),a.unbind("focus",this._showDatepicker),b.trigger&&b.trigger.remove();var e=this._get(b,"showOn");(e=="focus"||e=="both")&&a.focus(this._showDatepicker);if(e=="button"||e=="both"){var f=this._get(b,"buttonText"),g=this._get(b,"buttonImage");b.trigger=$(this._get(b,"buttonImageOnly")?$("").addClass(this._triggerClass).attr({src:g,alt:f,title:f}):$('').addClass(this._triggerClass).html(g==""?f:$("").attr({src:g,alt:f,title:f}))),a[d?"before":"after"](b.trigger),b.trigger.click(function(){$.datepicker._datepickerShowing&&$.datepicker._lastInput==a[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=a[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(a[0])):$.datepicker._showDatepicker(a[0]);return!1})}},_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 d=function(a){var b=0,c=0;for(var d=0;db&&(b=a[d].length,c=d);return c};b.setMonth(d(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort"))),b.setDate(d(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=$(a);c.hasClass(this.markerClassName)||(c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),$.data(a,PROP_NAME,b),this._setDate(b,this._getDefaultDate(b),!0),this._updateDatepicker(b),this._updateAlternate(b),b.settings.disabled&&this._disableDatepicker(a),b.dpDiv.css("display","block"))},_dialogDatepicker:function(a,b,c,d,e){var f=this._dialogInst;if(!f){this.uuid+=1;var g="dp"+this.uuid;this._dialogInput=$(''),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),f=this._dialogInst=this._newInst(this._dialogInput,!1),f.settings={},$.data(this._dialogInput[0],PROP_NAME,f)}extendRemove(f.settings,d||{}),b=b&&b.constructor==Date?this._formatDate(f,b):b,this._dialogInput.val(b),this._pos=e?e.length?e:[e.pageX,e.pageY]:null;if(!this._pos){var h=document.documentElement.clientWidth,i=document.documentElement.clientHeight,j=document.documentElement.scrollLeft||document.body.scrollLeft,k=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[h/2-100+j,i/2-150+k]}this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),f.settings.onSelect=c,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,f);return this},_destroyDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();$.removeData(a,PROP_NAME),d=="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)):(d=="div"||d=="span")&&b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!1,c.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().removeClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b})}},_disableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!0,c.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().addClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b}),this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return!1;for(var b=0;b-1}},_doKeyUp:function(a){var b=$.datepicker._getInst(a.target);if(b.input.val()!=b.lastVal)try{var c=$.datepicker.parseDate($.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,$.datepicker._getFormatConfig(b));c&&($.datepicker._setDateFromField(b),$.datepicker._updateAlternate(b),$.datepicker._updateDatepicker(b))}catch(a){$.datepicker.log(a)}return!0},_showDatepicker:function(a){a=a.target||a,a.nodeName.toLowerCase()!="input"&&(a=$("input",a.parentNode)[0]);if(!$.datepicker._isDisabledDatepicker(a)&&$.datepicker._lastInput!=a){var b=$.datepicker._getInst(a);$.datepicker._curInst&&$.datepicker._curInst!=b&&($.datepicker._curInst.dpDiv.stop(!0,!0),b&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var c=$.datepicker._get(b,"beforeShow"),d=c?c.apply(a,[a,b]):{};if(d===!1)return;extendRemove(b.settings,d),b.lastVal=null,$.datepicker._lastInput=a,$.datepicker._setDateFromField(b),$.datepicker._inDialog&&(a.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(a),$.datepicker._pos[1]+=a.offsetHeight);var e=!1;$(a).parents().each(function(){e|=$(this).css("position")=="fixed";return!e}),e&&$.browser.opera&&($.datepicker._pos[0]-=document.documentElement.scrollLeft,$.datepicker._pos[1]-=document.documentElement.scrollTop);var f={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,b.dpDiv.empty(),b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(b),f=$.datepicker._checkOffset(b,f,e),b.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":e?"fixed":"absolute",display:"none",left:f.left+"px",top:f.top+"px"});if(!b.inline){var g=$.datepicker._get(b,"showAnim"),h=$.datepicker._get(b,"duration"),i=function(){var a=b.dpDiv.find("iframe.ui-datepicker-cover");if(!!a.length){var c=$.datepicker._getBorders(b.dpDiv);a.css({left:-c[0],top:-c[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex($(a).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&$.effects[g]?b.dpDiv.show(g,$.datepicker._get(b,"showOptions"),h,i):b.dpDiv[g||"show"](g?h:null,i),(!g||!h)&&i(),b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus(),$.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this;b.maxRows=4;var c=$.datepicker._getBorders(a.dpDiv);instActive=a,a.dpDiv.empty().append(this._generateHTML(a));var d=a.dpDiv.find("iframe.ui-datepicker-cover");!d.length||d.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}),a.dpDiv.find("."+this._dayOverClass+" a").mouseover();var e=this._getNumberOfMonths(a),f=e[1],g=17;a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),f>1&&a.dpDiv.addClass("ui-datepicker-multi-"+f).css("width",g*f+"em"),a.dpDiv[(e[0]!=1||e[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),a==$.datepicker._curInst&&$.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var h=a.yearshtml;setTimeout(function(){h===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml),h=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(a){return{thin:1,medium:2,thick:3}[a]||a};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var d=a.dpDiv.outerWidth(),e=a.dpDiv.outerHeight(),f=a.input?a.input.outerWidth():0,g=a.input?a.input.outerHeight():0,h=document.documentElement.clientWidth+$(document).scrollLeft(),i=document.documentElement.clientHeight+$(document).scrollTop();b.left-=this._get(a,"isRTL")?d-f:0,b.left-=c&&b.left==a.input.offset().left?$(document).scrollLeft():0,b.top-=c&&b.top==a.input.offset().top+g?$(document).scrollTop():0,b.left-=Math.min(b.left,b.left+d>h&&h>d?Math.abs(b.left+d-h):0),b.top-=Math.min(b.top,b.top+e>i&&i>e?Math.abs(e+g):0);return b},_findPos:function(a){var b=this._getInst(a),c=this._get(b,"isRTL");while(a&&(a.type=="hidden"||a.nodeType!=1||$.expr.filters.hidden(a)))a=a[c?"previousSibling":"nextSibling"];var d=$(a).offset();return[d.left,d.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=$.data(a,PROP_NAME))&&this._datepickerShowing){var c=this._get(b,"showAnim"),d=this._get(b,"duration"),e=this,f=function(){$.datepicker._tidyDialog(b),e._curInst=null};$.effects&&$.effects[c]?b.dpDiv.hide(c,$.datepicker._get(b,"showOptions"),d,f):b.dpDiv[c=="slideDown"?"slideUp":c=="fadeIn"?"fadeOut":"hide"](c?d:null,f),c||f(),this._datepickerShowing=!1;var g=this._get(b,"onClose");g&&g.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(!!$.datepicker._curInst){var b=$(a.target),c=$.datepicker._getInst(b[0]);(b[0].id!=$.datepicker._mainDivId&&b.parents("#"+$.datepicker._mainDivId).length==0&&!b.hasClass($.datepicker.markerClassName)&&!b.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||b.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=c)&&$.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){var d=$(a),e=this._getInst(d[0]);this._isDisabledDatepicker(d[0])||(this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c),this._updateDatepicker(e))},_gotoToday:function(a){var b=$(a),c=this._getInst(b[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYear;else{var d=new Date;c.selectedDay=d.getDate(),c.drawMonth=c.selectedMonth=d.getMonth(),c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c),this._adjustDate(b)},_selectMonthYear:function(a,b,c){var d=$(a),e=this._getInst(d[0]);e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10),this._notifyChange(e),this._adjustDate(d)},_selectDay:function(a,b,c,d){var e=$(a);if(!$(d).hasClass(this._unselectableClass)&&!this._isDisabledDatepicker(e[0])){var f=this._getInst(e[0]);f.selectedDay=f.currentDay=$("a",d).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){var b=$(a),c=this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(a,b){var c=$(a),d=this._getInst(c[0]);b=b!=null?b:this._formatDate(d),d.input&&d.input.val(b),this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.apply(d.input?d.input[0]:null,[b,d]):d.input&&d.input.trigger("change"),d.inline?this._updateDatepicker(d):(this._hideDatepicker(),this._lastInput=d.input[0],typeof d.input[0]!="object"&&d.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"),d=this._getDate(a),e=this.formatDate(c,d,this._getFormatConfig(a));$(b).each(function(){$(this).val(e)})}},noWeekends:function(a){var b=a.getDay();return[b>0&&b<6,""]},iso8601Week:function(a){var b=new Date(a.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();b.setMonth(0),b.setDate(1);return Math.floor(Math.round((c-b)/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 d=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;d=typeof d!="string"?d:(new Date).getFullYear()%100+parseInt(d,10);var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,g=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,h=(c?c.monthNames:null)||this._defaults.monthNames,i=-1,j=-1,k=-1,l=-1,m=!1,n=function(b){var c=s+1-1){j=1,k=l;for(;;){var u=this._getDaysInMonth(i,j-1);if(k<=u)break;j++,k-=u}}var t=this._daylightSavingAdjust(new Date(i,j-1,k));if(t.getFullYear()!=i||t.getMonth()+1!=j||t.getDate()!=k)throw"Invalid date";return t},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 d=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,e=(c?c.dayNames:null)||this._defaults.dayNames,f=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,h=function(b){var c=m+112?a.getHours()+2:0);return a},_setDate:function(a,b,c){var d=!b,e=a.selectedMonth,f=a.selectedYear,g=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=g.getDate(),a.drawMonth=a.selectedMonth=a.currentMonth=g.getMonth(),a.drawYear=a.selectedYear=a.currentYear=g.getFullYear(),(e!=a.selectedMonth||f!=a.selectedYear)&&!c&&this._notifyChange(a),this._adjustInstDate(a),a.input&&a.input.val(d?"":this._formatDate(a))},_getDate:function(a){var b=!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return b},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),d=this._get(a,"showButtonPanel"),e=this._get(a,"hideIfNoPrevNext"),f=this._get(a,"navigationAsDateFormat"),g=this._getNumberOfMonths(a),h=this._get(a,"showCurrentAtPos"),i=this._get(a,"stepMonths"),j=g[0]!=1||g[1]!=1,k=this._daylightSavingAdjust(a.currentDay?new Date(a.currentYear,a.currentMonth,a.currentDay):new Date(9999,9,9)),l=this._getMinMaxDate(a,"min"),m=this._getMinMaxDate(a,"max"),n=a.drawMonth-h,o=a.drawYear;n<0&&(n+=12,o--);if(m){var p=this._daylightSavingAdjust(new Date(m.getFullYear(),m.getMonth()-g[0]*g[1]+1,m.getDate()));p=l&&pp)n--,n<0&&(n=11,o--)}a.drawMonth=n,a.drawYear=o;var q=this._get(a,"prevText");q=f?this.formatDate(q,this._daylightSavingAdjust(new Date(o,n-i,1)),this._getFormatConfig(a)):q;var r=this._canAdjustMonth(a,-1,o,n)?''+q+"":e?"":''+q+"",s=this._get(a,"nextText");s=f?this.formatDate(s,this._daylightSavingAdjust(new Date(o,n+i,1)),this._getFormatConfig(a)):s;var t=this._canAdjustMonth(a,1,o,n)?''+s+"":e?"":''+s+"",u=this._get(a,"currentText"),v=this._get(a,"gotoCurrent")&&a.currentDay?k:b;u=f?this.formatDate(u,v,this._getFormatConfig(a)):u;var w=a.inline?"":'",x=d?'
      '+(c?w:"")+(this._isInRange(a,v)?'":"")+(c?"":w)+"
      ":"",y=parseInt(this._get(a,"firstDay"),10);y=isNaN(y)?0:y;var z=this._get(a,"showWeek"),A=this._get(a,"dayNames"),B=this._get(a,"dayNamesShort"),C=this._get(a,"dayNamesMin"),D=this._get(a,"monthNames"),E=this._get(a,"monthNamesShort"),F=this._get(a,"beforeShowDay"),G=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths"),I=this._get(a,"calculateWeek")||this.iso8601Week,J=this._getDefaultDate(a),K="";for(var L=0;L1)switch(N){case 0:Q+=" ui-datepicker-group-first",P=" ui-corner-"+(c?"right":"left");break;case g[1]-1:Q+=" ui-datepicker-group-last",P=" ui-corner-"+(c?"left":"right");break;default:Q+=" ui-datepicker-group-middle",P=""}Q+='">'}Q+='
      '+(/all|left/.test(P)&&L==0?c?t:r:"")+(/all|right/.test(P)&&L==0?c?r:t:"")+this._generateMonthYearHeader(a,n,o,l,m,L>0||N>0,D,E)+'
      '+"";var R=z?'":"";for(var S=0;S<7;S++){var T=(S+y)%7;R+="=5?' class="ui-datepicker-week-end"':"")+">"+''+C[T]+""}Q+=R+"";var U=this._getDaysInMonth(o,n);o==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay,U));var V=(this._getFirstDayOfMonth(o,n)-y+7)%7,W=Math.ceil((V+U)/7),X=j?this.maxRows>W?this.maxRows:W:W;this.maxRows=X;var Y=this._daylightSavingAdjust(new Date(o,n,1-V));for(var Z=0;Z";var _=z?'":"";for(var S=0;S<7;S++){var ba=F?F.apply(a.input?a.input[0]:null,[Y]):[!0,""],bb=Y.getMonth()!=n,bc=bb&&!H||!ba[0]||l&&Ym;_+='",Y.setDate(Y.getDate()+1),Y=this._daylightSavingAdjust(Y)}Q+=_+""}n++,n>11&&(n=0,o++),Q+="
      '+this._get(a,"weekHeader")+"
      '+this._get(a,"calculateWeek")(Y)+""+(bb&&!G?" ":bc?''+Y.getDate()+"":''+Y.getDate()+"")+"
      "+(j?""+(g[0]>0&&N==g[1]-1?'
      ':""):""),M+=Q}K+=M}K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'':""), +a._keyEvent=!1;return K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='
      ',m="";if(f||!i)m+=''+g[b]+"";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='"}k||(l+=m+(f||!i||!j?" ":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+=''+c+"";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='",l+=a.yearshtml,a.yearshtml=null}}l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?" ":"")+m),l+="
      ";return l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&bd?d:e;return e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_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,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth()));return this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.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,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return $.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return $.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b));return this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)})},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.18",window["DP_jQuery_"+dpuuid]=$})(jQuery);/* + * jQuery UI Progressbar 1.8.18 + * + * 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(a,b){a.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=a("
      ").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(),a.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===b)return this._value();this._setOption("value",a);return this},_setOption:function(b,c){b==="value"&&(this.options.value=c,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;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(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change")),this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%"),this.element.attr("aria-valuenow",a)}}),a.extend(a.ui.progressbar,{version:"1.8.18"})})(jQuery);/* + * jQuery UI Effects 1.8.18 + * + * 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(a,b){function l(b){if(!b||typeof b=="number"||a.fx.speeds[b])return!0;if(typeof b=="string"&&!a.effects[b])return!0;return!1}function k(b,c,d,e){typeof b=="object"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c=="number"||a.fx.speeds[c])e=d,d=c,c={};a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d=="number"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete;return[b,c,d,e]}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]=="string"&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]=="string"&&(b[c]=a[c]);return b}function d(b,d){var e;do{e=a.curCSS(b,d);if(e!=""&&e!="transparent"||a.nodeName(b,"body"))break;d="backgroundColor"}while(b=b.parentNode);return c(e)}function c(b){var c;if(b&&b.constructor==Array&&b.length==3)return b;if(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))return[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)];if(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))return[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55];if(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))return[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)];if(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))return[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)];if(c=/rgba\(0, 0, 0, 0\)/.exec(b))return e.transparent;return e[a.trim(b).toLowerCase()]}a.effects={},a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var e={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]},f=["add","remove","toggle"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){a.isFunction(d)&&(e=d,d=null);return this.queue(function(){var g=a(this),k=g.attr("style")||" ",l=i(h.call(this)),m,n=g.attr("class");a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),m=i(h.call(this)),g.attr("class",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),typeof g.attr("style")=="object"?(g.attr("style").cssText="",g.attr("style").cssText=k):g.attr("style",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.extend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d=="boolean"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:"1.8.18",save:function(a,b){for(var c=0;c").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"}));return d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;if(b.parent().is(".ui-effects-wrapper")){c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus();return c}return b},setTransition:function(b,c,d,e){e=e||{},a.each(c,function(a,c){unit=b.cssUnit(c),unit[0]>0&&(e[c]=unit[0]*d+unit[1])});return e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];if(a.fx.off||!i)return h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)});return i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);b[1].mode="show";return this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);b[1].mode="hide";return this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);c[1].mode="toggle";return this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])});return d}}),a.easing.jswing=a.easing.swing,a.extend(a.easing,{def:"easeOutQuad",swing:function(b,c,d,e,f){return a.easing[a.easing.def](b,c,d,e,f)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b+c;return-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b+c;return d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b*b+c;return-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){if((b/=e/2)<1)return d/2*b*b*b*b*b+c;return d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return b==0?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){if(b==0)return c;if(b==e)return c+d;if((b/=e/2)<1)return d/2*Math.pow(2,10*(b-1))+c;return d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){if((b/=e/2)<1)return-d/2*(Math.sqrt(1-b*b)-1)+c;return d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e)==1)return c+d;g||(g=e*.3);if(h").css({position:"absolute",visibility:"visible",left:-j*(g/d),top:-i*(h/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode=="show"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode=="show"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode=="show"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode=="show"?0:(j-Math.floor(d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode=="show"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode=="show"?1:0},b.duration||500);setTimeout(function(){b.options.mode=="show"?e.css({visibility:"visible"}):e.css({visibility:"visible"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);/* + * jQuery UI Effects Fade 1.8.18 + * + * 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(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);/* + * jQuery UI Effects Fold 1.8.18 + * + * 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(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),j=e=="show"!=g,k=j?["width","height"]:["height","width"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e=="hide"?0:1]),e=="show"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e=="show"?l[0]:f,p[k[1]]=e=="show"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);/* + * jQuery UI Effects Highlight 1.8.18 + * + * 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(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=["backgroundImage","backgroundColor","opacity"],e=a.effects.setMode(c,b.options.mode||"show"),f={backgroundColor:c.css("backgroundColor")};e=="hide"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),e=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);/* + * jQuery UI Effects Pulsate 1.8.18 + * + * 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(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"show");times=(b.options.times||5)*2-1,duration=b.duration?b.duration/2:a.fx.speeds._default/2,isVisible=c.is(":visible"),animateTo=0,isVisible||(c.css("opacity",0).show(),animateTo=1),(d=="hide"&&isVisible||d=="show"&&!isVisible)&×--;for(var e=0;e').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery); \ No newline at end of file diff --git a/htdocs/js/jquery-ui-timepicker-addon.js b/htdocs/js/jquery-ui-timepicker-addon.js new file mode 100644 index 0000000000..f83839ee48 --- /dev/null +++ b/htdocs/js/jquery-ui-timepicker-addon.js @@ -0,0 +1,1326 @@ +/* +* jQuery timepicker addon +* By: Trent Richardson [http://trentrichardson.com] +* Version 0.9.9 +* Last Modified: 02/05/2012 +* +* Copyright 2012 Trent Richardson +* Dual licensed under the MIT and GPL licenses. +* http://trentrichardson.com/Impromptu/GPL-LICENSE.txt +* http://trentrichardson.com/Impromptu/MIT-LICENSE.txt +* +* HERES THE CSS: +* .ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } +* .ui-timepicker-div dl { text-align: left; } +* .ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; } +* .ui-timepicker-div dl dd { margin: 0 10px 10px 65px; } +* .ui-timepicker-div td { font-size: 90%; } +* .ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } +*/ + +(function($) { + +$.extend($.ui, { timepicker: { version: "0.9.9" } }); + +/* Time picker manager. + Use the singleton instance of this class, $.timepicker, to interact with the time picker. + Settings for (groups of) time pickers are maintained in an instance object, + allowing multiple different settings on the same page. */ + +function Timepicker() { + this.regional = []; // Available regional settings, indexed by language code + this.regional[''] = { // Default regional settings + currentText: 'Now', + closeText: 'Done', + ampm: false, + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + timeFormat: 'hh:mm tt', + timeSuffix: '', + timeOnlyTitle: 'Choose Time', + timeText: 'Time', + hourText: 'Hour', + minuteText: 'Minute', + secondText: 'Second', + millisecText: 'Millisecond', + timezoneText: 'Time Zone' + }; + this._defaults = { // Global defaults for all the datetime picker instances + showButtonPanel: true, + timeOnly: false, + showHour: true, + showMinute: true, + showSecond: false, + showMillisec: false, + showTimezone: false, + showTime: true, + stepHour: 1, + stepMinute: 1, + stepSecond: 1, + stepMillisec: 1, + hour: 0, + minute: 0, + second: 0, + millisec: 0, + timezone: '+0000', + hourMin: 0, + minuteMin: 0, + secondMin: 0, + millisecMin: 0, + hourMax: 23, + minuteMax: 59, + secondMax: 59, + millisecMax: 999, + minDateTime: null, + maxDateTime: null, + onSelect: null, + hourGrid: 0, + minuteGrid: 0, + secondGrid: 0, + millisecGrid: 0, + alwaysSetTime: true, + separator: ' ', + altFieldTimeOnly: true, + showTimepicker: true, + timezoneIso8609: false, + timezoneList: null, + addSliderAccess: false, + sliderAccessArgs: null + }; + $.extend(this._defaults, this.regional['']); +}; + +$.extend(Timepicker.prototype, { + $input: null, + $altInput: null, + $timeObj: null, + inst: null, + hour_slider: null, + minute_slider: null, + second_slider: null, + millisec_slider: null, + timezone_select: null, + hour: 0, + minute: 0, + second: 0, + millisec: 0, + timezone: '+0000', + hourMinOriginal: null, + minuteMinOriginal: null, + secondMinOriginal: null, + millisecMinOriginal: null, + hourMaxOriginal: null, + minuteMaxOriginal: null, + secondMaxOriginal: null, + millisecMaxOriginal: null, + ampm: '', + formattedDate: '', + formattedTime: '', + formattedDateTime: '', + timezoneList: null, + + /* Override the default settings for all instances of the time picker. + @param settings object - the new settings to use as defaults (anonymous object) + @return the manager object */ + setDefaults: function(settings) { + extendRemove(this._defaults, settings || {}); + return this; + }, + + //######################################################################## + // Create a new Timepicker instance + //######################################################################## + _newInst: function($input, o) { + var tp_inst = new Timepicker(), + inlineSettings = {}; + + for (var attrName in this._defaults) { + var attrValue = $input.attr('time:' + attrName); + if (attrValue) { + try { + inlineSettings[attrName] = eval(attrValue); + } catch (err) { + inlineSettings[attrName] = attrValue; + } + } + } + tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, o, { + beforeShow: function(input, dp_inst) { + if ($.isFunction(o.beforeShow)) + return o.beforeShow(input, dp_inst, tp_inst); + }, + onChangeMonthYear: function(year, month, dp_inst) { + // Update the time as well : this prevents the time from disappearing from the $input field. + tp_inst._updateDateTime(dp_inst); + if ($.isFunction(o.onChangeMonthYear)) + o.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst); + }, + onClose: function(dateText, dp_inst) { + if (tp_inst.timeDefined === true && $input.val() != '') + tp_inst._updateDateTime(dp_inst); + if ($.isFunction(o.onClose)) + o.onClose.call($input[0], dateText, dp_inst, tp_inst); + }, + timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker'); + }); + tp_inst.amNames = $.map(tp_inst._defaults.amNames, function(val) { return val.toUpperCase() }); + tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function(val) { return val.toUpperCase() }); + + if (tp_inst._defaults.timezoneList === null) { + var timezoneList = []; + for (var i = -11; i <= 12; i++) + timezoneList.push((i >= 0 ? '+' : '-') + ('0' + Math.abs(i).toString()).slice(-2) + '00'); + if (tp_inst._defaults.timezoneIso8609) + timezoneList = $.map(timezoneList, function(val) { + return val == '+0000' ? 'Z' : (val.substring(0, 3) + ':' + val.substring(3)); + }); + tp_inst._defaults.timezoneList = timezoneList; + } + + tp_inst.hour = tp_inst._defaults.hour; + tp_inst.minute = tp_inst._defaults.minute; + tp_inst.second = tp_inst._defaults.second; + tp_inst.millisec = tp_inst._defaults.millisec; + tp_inst.ampm = ''; + tp_inst.$input = $input; + + if (o.altField) + tp_inst.$altInput = $(o.altField) + .css({ cursor: 'pointer' }) + .focus(function(){ $input.trigger("focus"); }); + + if(tp_inst._defaults.minDate==0 || tp_inst._defaults.minDateTime==0) + { + tp_inst._defaults.minDate=new Date(); + } + if(tp_inst._defaults.maxDate==0 || tp_inst._defaults.maxDateTime==0) + { + tp_inst._defaults.maxDate=new Date(); + } + + // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime.. + if(tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) + tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime()); + if(tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) + tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime()); + if(tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) + tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime()); + if(tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) + tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime()); + return tp_inst; + }, + + //######################################################################## + // add our sliders to the calendar + //######################################################################## + _addTimePicker: function(dp_inst) { + var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ? + this.$input.val() + ' ' + this.$altInput.val() : + this.$input.val(); + + this.timeDefined = this._parseTime(currDT); + this._limitMinMaxDateTime(dp_inst, false); + this._injectTimePicker(); + }, + + //######################################################################## + // parse the time string from input value or _setTime + //######################################################################## + _parseTime: function(timeString, withDate) { + var regstr = this._defaults.timeFormat.toString() + .replace(/h{1,2}/ig, '(\\d?\\d)') + .replace(/m{1,2}/ig, '(\\d?\\d)') + .replace(/s{1,2}/ig, '(\\d?\\d)') + .replace(/l{1}/ig, '(\\d?\\d?\\d)') + .replace(/t{1,2}/ig, this._getPatternAmpm()) + .replace(/z{1}/ig, '(z|[-+]\\d\\d:?\\d\\d)?') + .replace(/\s/g, '\\s?') + this._defaults.timeSuffix + '$', + order = this._getFormatPositions(), + ampm = '', + treg; + + if (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]); + + if (withDate || !this._defaults.timeOnly) { + // the time should come after x number of characters and a space. + // x = at least the length of text specified by the date format + var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat'); + // escape special regex characters in the seperator + var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); + regstr = '^.{' + dp_dateFormat.length + ',}?' + this._defaults.separator.replace(specials, "\\$&") + regstr; + } + + treg = timeString.match(new RegExp(regstr, 'i')); + + if (treg) { + if (order.t !== -1) { + if (treg[order.t] === undefined || treg[order.t].length === 0) { + ampm = ''; + this.ampm = ''; + } else { + ampm = $.inArray(treg[order.t].toUpperCase(), this.amNames) !== -1 ? 'AM' : 'PM'; + this.ampm = this._defaults[ampm == 'AM' ? 'amNames' : 'pmNames'][0]; + } + } + + if (order.h !== -1) { + if (ampm == 'AM' && treg[order.h] == '12') + this.hour = 0; // 12am = 0 hour + else if (ampm == 'PM' && treg[order.h] != '12') + this.hour = (parseFloat(treg[order.h]) + 12).toFixed(0); // 12pm = 12 hour, any other pm = hour + 12 + else this.hour = Number(treg[order.h]); + } + + if (order.m !== -1) this.minute = Number(treg[order.m]); + if (order.s !== -1) this.second = Number(treg[order.s]); + if (order.l !== -1) this.millisec = Number(treg[order.l]); + if (order.z !== -1 && treg[order.z] !== undefined) { + var tz = treg[order.z].toUpperCase(); + switch (tz.length) { + case 1: // Z + tz = this._defaults.timezoneIso8609 ? 'Z' : '+0000'; + break; + case 5: // +hhmm + if (this._defaults.timezoneIso8609) + tz = tz.substring(1) == '0000' + ? 'Z' + : tz.substring(0, 3) + ':' + tz.substring(3); + break; + case 6: // +hh:mm + if (!this._defaults.timezoneIso8609) + tz = tz == 'Z' || tz.substring(1) == '00:00' + ? '+0000' + : tz.replace(/:/, ''); + else if (tz.substring(1) == '00:00') + tz = 'Z'; + break; + } + this.timezone = tz; + } + + return true; + + } + return false; + }, + + //######################################################################## + // pattern for standard and localized AM/PM markers + //######################################################################## + _getPatternAmpm: function() { + var markers = []; + o = this._defaults; + if (o.amNames) + $.merge(markers, o.amNames); + if (o.pmNames) + $.merge(markers, o.pmNames); + markers = $.map(markers, function(val) { return val.replace(/[.*+?|()\[\]{}\\]/g, '\\$&') }); + return '(' + markers.join('|') + ')?'; + }, + + //######################################################################## + // figure out position of time elements.. cause js cant do named captures + //######################################################################## + _getFormatPositions: function() { + var finds = this._defaults.timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|t{1,2}|z)/g), + orders = { h: -1, m: -1, s: -1, l: -1, t: -1, z: -1 }; + + if (finds) + for (var i = 0; i < finds.length; i++) + if (orders[finds[i].toString().charAt(0)] == -1) + orders[finds[i].toString().charAt(0)] = i + 1; + + return orders; + }, + + //######################################################################## + // generate and inject html for timepicker into ui datepicker + //######################################################################## + _injectTimePicker: function() { + var $dp = this.inst.dpDiv, + o = this._defaults, + tp_inst = this, + // Added by Peter Medeiros: + // - Figure out what the hour/minute/second max should be based on the step values. + // - Example: if stepMinute is 15, then minMax is 45. + hourMax = parseInt((o.hourMax - ((o.hourMax - o.hourMin) % o.stepHour)) ,10), + minMax = parseInt((o.minuteMax - ((o.minuteMax - o.minuteMin) % o.stepMinute)) ,10), + secMax = parseInt((o.secondMax - ((o.secondMax - o.secondMin) % o.stepSecond)) ,10), + millisecMax = parseInt((o.millisecMax - ((o.millisecMax - o.millisecMin) % o.stepMillisec)) ,10), + dp_id = this.inst.id.toString().replace(/([^A-Za-z0-9_])/g, ''); + + // Prevent displaying twice + //if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0) { + if ($dp.find("div#ui-timepicker-div-"+ dp_id).length === 0 && o.showTimepicker) { + var noDisplay = ' style="display:none;"', + html = '
      ' + + '
      ' + o.timeText + '
      ' + + '
      ' + + '
      ' + o.hourText + '
      ', + hourGridSize = 0, + minuteGridSize = 0, + secondGridSize = 0, + millisecGridSize = 0, + size; + + // Hours + html += '
      '; + if (o.showHour && o.hourGrid > 0) { + html += '
      '; + + for (var h = o.hourMin; h <= hourMax; h += parseInt(o.hourGrid,10)) { + hourGridSize++; + var tmph = (o.ampm && h > 12) ? h-12 : h; + if (tmph < 10) tmph = '0' + tmph; + if (o.ampm) { + if (h == 0) tmph = 12 +'a'; + else if (h < 12) tmph += 'a'; + else tmph += 'p'; + } + html += ''; + } + + html += '
      ' + tmph + '
      '; + } + html += '
      '; + + // Minutes + html += '
      ' + o.minuteText + '
      '+ + '
      '; + + if (o.showMinute && o.minuteGrid > 0) { + html += '
      '; + + for (var m = o.minuteMin; m <= minMax; m += parseInt(o.minuteGrid,10)) { + minuteGridSize++; + html += ''; + } + + html += '
      ' + ((m < 10) ? '0' : '') + m + '
      '; + } + html += '
      '; + + // Seconds + html += '
      ' + o.secondText + '
      '+ + '
      '; + + if (o.showSecond && o.secondGrid > 0) { + html += '
      '; + + for (var s = o.secondMin; s <= secMax; s += parseInt(o.secondGrid,10)) { + secondGridSize++; + html += ''; + } + + html += '
      ' + ((s < 10) ? '0' : '') + s + '
      '; + } + html += '
      '; + + // Milliseconds + html += '
      ' + o.millisecText + '
      '+ + '
      '; + + if (o.showMillisec && o.millisecGrid > 0) { + html += '
      '; + + for (var l = o.millisecMin; l <= millisecMax; l += parseInt(o.millisecGrid,10)) { + millisecGridSize++; + html += ''; + } + + html += '
      ' + ((l < 10) ? '0' : '') + l + '
      '; + } + html += '
      '; + + // Timezone + html += '
      ' + o.timezoneText + '
      '; + html += '
      '; + + html += '
      '; + $tp = $(html); + + // if we only want time picker... + if (o.timeOnly === true) { + $tp.prepend( + '
      ' + + '
      ' + o.timeOnlyTitle + '
      ' + + '
      '); + $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide(); + } + + this.hour_slider = $tp.find('#ui_tpicker_hour_'+ dp_id).slider({ + orientation: "horizontal", + value: this.hour, + min: o.hourMin, + max: hourMax, + step: o.stepHour, + slide: function(event, ui) { + tp_inst.hour_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + + // Updated by Peter Medeiros: + // - Pass in Event and UI instance into slide function + this.minute_slider = $tp.find('#ui_tpicker_minute_'+ dp_id).slider({ + orientation: "horizontal", + value: this.minute, + min: o.minuteMin, + max: minMax, + step: o.stepMinute, + slide: function(event, ui) { + tp_inst.minute_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + this.second_slider = $tp.find('#ui_tpicker_second_'+ dp_id).slider({ + orientation: "horizontal", + value: this.second, + min: o.secondMin, + max: secMax, + step: o.stepSecond, + slide: function(event, ui) { + tp_inst.second_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + this.millisec_slider = $tp.find('#ui_tpicker_millisec_'+ dp_id).slider({ + orientation: "horizontal", + value: this.millisec, + min: o.millisecMin, + max: millisecMax, + step: o.stepMillisec, + slide: function(event, ui) { + tp_inst.millisec_slider.slider( "option", "value", ui.value); + tp_inst._onTimeChange(); + } + }); + + this.timezone_select = $tp.find('#ui_tpicker_timezone_'+ dp_id).append('').find("select"); + $.fn.append.apply(this.timezone_select, + $.map(o.timezoneList, function(val, idx) { + return $("